diff options
Diffstat (limited to 'drivers/usb/serial/mos7720.c')
-rw-r--r-- | drivers/usb/serial/mos7720.c | 87 |
1 files changed, 35 insertions, 52 deletions
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c index 50f1fe263338..d47f0814ce2d 100644 --- a/drivers/usb/serial/mos7720.c +++ b/drivers/usb/serial/mos7720.c | |||
@@ -218,7 +218,7 @@ static void mos7720_bulk_in_callback(struct urb *urb) | |||
218 | 218 | ||
219 | data = urb->transfer_buffer; | 219 | data = urb->transfer_buffer; |
220 | 220 | ||
221 | tty = port->tty; | 221 | tty = port->port.tty; |
222 | if (tty && urb->actual_length) { | 222 | if (tty && urb->actual_length) { |
223 | tty_buffer_request_room(tty, urb->actual_length); | 223 | tty_buffer_request_room(tty, urb->actual_length); |
224 | tty_insert_flip_string(tty, data, urb->actual_length); | 224 | tty_insert_flip_string(tty, data, urb->actual_length); |
@@ -264,7 +264,7 @@ static void mos7720_bulk_out_data_callback(struct urb *urb) | |||
264 | 264 | ||
265 | dbg("Entering ........."); | 265 | dbg("Entering ........."); |
266 | 266 | ||
267 | tty = mos7720_port->port->tty; | 267 | tty = mos7720_port->port->port.tty; |
268 | 268 | ||
269 | if (tty && mos7720_port->open) | 269 | if (tty && mos7720_port->open) |
270 | tty_wakeup(tty); | 270 | tty_wakeup(tty); |
@@ -320,7 +320,8 @@ static int send_mos_cmd(struct usb_serial *serial, __u8 request, __u16 value, | |||
320 | return status; | 320 | return status; |
321 | } | 321 | } |
322 | 322 | ||
323 | static int mos7720_open(struct usb_serial_port *port, struct file * filp) | 323 | static int mos7720_open(struct tty_struct *tty, |
324 | struct usb_serial_port *port, struct file * filp) | ||
324 | { | 325 | { |
325 | struct usb_serial *serial; | 326 | struct usb_serial *serial; |
326 | struct usb_serial_port *port0; | 327 | struct usb_serial_port *port0; |
@@ -443,14 +444,12 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp) | |||
443 | data = 0x0c; | 444 | data = 0x0c; |
444 | send_mos_cmd(serial, MOS_WRITE, port_number, 0x01, &data); | 445 | send_mos_cmd(serial, MOS_WRITE, port_number, 0x01, &data); |
445 | 446 | ||
446 | //Matrix | ||
447 | |||
448 | /* force low_latency on so that our tty_push actually forces * | 447 | /* force low_latency on so that our tty_push actually forces * |
449 | * the data through,otherwise it is scheduled, and with * | 448 | * the data through,otherwise it is scheduled, and with * |
450 | * high data rates (like with OHCI) data can get lost. */ | 449 | * high data rates (like with OHCI) data can get lost. */ |
451 | 450 | ||
452 | if (port->tty) | 451 | if (tty) |
453 | port->tty->low_latency = 1; | 452 | tty->low_latency = 1; |
454 | 453 | ||
455 | /* see if we've set up our endpoint info yet * | 454 | /* see if we've set up our endpoint info yet * |
456 | * (can't set it up in mos7720_startup as the * | 455 | * (can't set it up in mos7720_startup as the * |
@@ -515,8 +514,9 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp) | |||
515 | * system, | 514 | * system, |
516 | * Otherwise we return a negative error number. | 515 | * Otherwise we return a negative error number. |
517 | */ | 516 | */ |
518 | static int mos7720_chars_in_buffer(struct usb_serial_port *port) | 517 | static int mos7720_chars_in_buffer(struct tty_struct *tty) |
519 | { | 518 | { |
519 | struct usb_serial_port *port = tty->driver_data; | ||
520 | int i; | 520 | int i; |
521 | int chars = 0; | 521 | int chars = 0; |
522 | struct moschip_port *mos7720_port; | 522 | struct moschip_port *mos7720_port; |
@@ -537,7 +537,8 @@ static int mos7720_chars_in_buffer(struct usb_serial_port *port) | |||
537 | return chars; | 537 | return chars; |
538 | } | 538 | } |
539 | 539 | ||
540 | static void mos7720_close(struct usb_serial_port *port, struct file *filp) | 540 | static void mos7720_close(struct tty_struct *tty, |
541 | struct usb_serial_port *port, struct file *filp) | ||
541 | { | 542 | { |
542 | struct usb_serial *serial; | 543 | struct usb_serial *serial; |
543 | struct moschip_port *mos7720_port; | 544 | struct moschip_port *mos7720_port; |
@@ -588,8 +589,9 @@ static void mos7720_close(struct usb_serial_port *port, struct file *filp) | |||
588 | dbg("Leaving %s", __func__); | 589 | dbg("Leaving %s", __func__); |
589 | } | 590 | } |
590 | 591 | ||
591 | static void mos7720_break(struct usb_serial_port *port, int break_state) | 592 | static void mos7720_break(struct tty_struct *tty, int break_state) |
592 | { | 593 | { |
594 | struct usb_serial_port *port = tty->driver_data; | ||
593 | unsigned char data; | 595 | unsigned char data; |
594 | struct usb_serial *serial; | 596 | struct usb_serial *serial; |
595 | struct moschip_port *mos7720_port; | 597 | struct moschip_port *mos7720_port; |
@@ -621,8 +623,9 @@ static void mos7720_break(struct usb_serial_port *port, int break_state) | |||
621 | * If successful, we return the amount of room that we have for this port | 623 | * If successful, we return the amount of room that we have for this port |
622 | * Otherwise we return a negative error number. | 624 | * Otherwise we return a negative error number. |
623 | */ | 625 | */ |
624 | static int mos7720_write_room(struct usb_serial_port *port) | 626 | static int mos7720_write_room(struct tty_struct *tty) |
625 | { | 627 | { |
628 | struct usb_serial_port *port = tty->driver_data; | ||
626 | struct moschip_port *mos7720_port; | 629 | struct moschip_port *mos7720_port; |
627 | int room = 0; | 630 | int room = 0; |
628 | int i; | 631 | int i; |
@@ -645,8 +648,8 @@ static int mos7720_write_room(struct usb_serial_port *port) | |||
645 | return room; | 648 | return room; |
646 | } | 649 | } |
647 | 650 | ||
648 | static int mos7720_write(struct usb_serial_port *port, | 651 | static int mos7720_write(struct tty_struct *tty, struct usb_serial_port *port, |
649 | const unsigned char *data, int count) | 652 | const unsigned char *data, int count) |
650 | { | 653 | { |
651 | int status; | 654 | int status; |
652 | int i; | 655 | int i; |
@@ -719,10 +722,10 @@ exit: | |||
719 | return bytes_sent; | 722 | return bytes_sent; |
720 | } | 723 | } |
721 | 724 | ||
722 | static void mos7720_throttle(struct usb_serial_port *port) | 725 | static void mos7720_throttle(struct tty_struct *tty) |
723 | { | 726 | { |
727 | struct usb_serial_port *port = tty->driver_data; | ||
724 | struct moschip_port *mos7720_port; | 728 | struct moschip_port *mos7720_port; |
725 | struct tty_struct *tty; | ||
726 | int status; | 729 | int status; |
727 | 730 | ||
728 | dbg("%s- port %d\n", __func__, port->number); | 731 | dbg("%s- port %d\n", __func__, port->number); |
@@ -739,16 +742,10 @@ static void mos7720_throttle(struct usb_serial_port *port) | |||
739 | 742 | ||
740 | dbg("%s: Entering ..........", __func__); | 743 | dbg("%s: Entering ..........", __func__); |
741 | 744 | ||
742 | tty = port->tty; | ||
743 | if (!tty) { | ||
744 | dbg("%s - no tty available", __func__); | ||
745 | return; | ||
746 | } | ||
747 | |||
748 | /* if we are implementing XON/XOFF, send the stop character */ | 745 | /* if we are implementing XON/XOFF, send the stop character */ |
749 | if (I_IXOFF(tty)) { | 746 | if (I_IXOFF(tty)) { |
750 | unsigned char stop_char = STOP_CHAR(tty); | 747 | unsigned char stop_char = STOP_CHAR(tty); |
751 | status = mos7720_write(port, &stop_char, 1); | 748 | status = mos7720_write(tty, port, &stop_char, 1); |
752 | if (status <= 0) | 749 | if (status <= 0) |
753 | return; | 750 | return; |
754 | } | 751 | } |
@@ -764,11 +761,11 @@ static void mos7720_throttle(struct usb_serial_port *port) | |||
764 | } | 761 | } |
765 | } | 762 | } |
766 | 763 | ||
767 | static void mos7720_unthrottle(struct usb_serial_port *port) | 764 | static void mos7720_unthrottle(struct tty_struct *tty) |
768 | { | 765 | { |
769 | struct tty_struct *tty; | 766 | struct usb_serial_port *port = tty->driver_data; |
770 | int status; | ||
771 | struct moschip_port *mos7720_port = usb_get_serial_port_data(port); | 767 | struct moschip_port *mos7720_port = usb_get_serial_port_data(port); |
768 | int status; | ||
772 | 769 | ||
773 | if (mos7720_port == NULL) | 770 | if (mos7720_port == NULL) |
774 | return; | 771 | return; |
@@ -780,16 +777,10 @@ static void mos7720_unthrottle(struct usb_serial_port *port) | |||
780 | 777 | ||
781 | dbg("%s: Entering ..........", __func__); | 778 | dbg("%s: Entering ..........", __func__); |
782 | 779 | ||
783 | tty = port->tty; | ||
784 | if (!tty) { | ||
785 | dbg("%s - no tty available", __func__); | ||
786 | return; | ||
787 | } | ||
788 | |||
789 | /* if we are implementing XON/XOFF, send the start character */ | 780 | /* if we are implementing XON/XOFF, send the start character */ |
790 | if (I_IXOFF(tty)) { | 781 | if (I_IXOFF(tty)) { |
791 | unsigned char start_char = START_CHAR(tty); | 782 | unsigned char start_char = START_CHAR(tty); |
792 | status = mos7720_write(port, &start_char, 1); | 783 | status = mos7720_write(tty, port, &start_char, 1); |
793 | if (status <= 0) | 784 | if (status <= 0) |
794 | return; | 785 | return; |
795 | } | 786 | } |
@@ -1011,12 +1002,12 @@ static int send_cmd_write_baud_rate(struct moschip_port *mos7720_port, | |||
1011 | * This routine is called to set the UART on the device to match | 1002 | * This routine is called to set the UART on the device to match |
1012 | * the specified new settings. | 1003 | * the specified new settings. |
1013 | */ | 1004 | */ |
1014 | static void change_port_settings(struct moschip_port *mos7720_port, | 1005 | static void change_port_settings(struct tty_struct *tty, |
1006 | struct moschip_port *mos7720_port, | ||
1015 | struct ktermios *old_termios) | 1007 | struct ktermios *old_termios) |
1016 | { | 1008 | { |
1017 | struct usb_serial_port *port; | 1009 | struct usb_serial_port *port; |
1018 | struct usb_serial *serial; | 1010 | struct usb_serial *serial; |
1019 | struct tty_struct *tty; | ||
1020 | int baud; | 1011 | int baud; |
1021 | unsigned cflag; | 1012 | unsigned cflag; |
1022 | unsigned iflag; | 1013 | unsigned iflag; |
@@ -1042,8 +1033,6 @@ static void change_port_settings(struct moschip_port *mos7720_port, | |||
1042 | return; | 1033 | return; |
1043 | } | 1034 | } |
1044 | 1035 | ||
1045 | tty = mos7720_port->port->tty; | ||
1046 | |||
1047 | dbg("%s: Entering ..........", __func__); | 1036 | dbg("%s: Entering ..........", __func__); |
1048 | 1037 | ||
1049 | lData = UART_LCR_WLEN8; | 1038 | lData = UART_LCR_WLEN8; |
@@ -1198,14 +1187,13 @@ static void change_port_settings(struct moschip_port *mos7720_port, | |||
1198 | * this function is called by the tty driver when it wants to change the | 1187 | * this function is called by the tty driver when it wants to change the |
1199 | * termios structure. | 1188 | * termios structure. |
1200 | */ | 1189 | */ |
1201 | static void mos7720_set_termios(struct usb_serial_port *port, | 1190 | static void mos7720_set_termios(struct tty_struct *tty, |
1202 | struct ktermios *old_termios) | 1191 | struct usb_serial_port *port, struct ktermios *old_termios) |
1203 | { | 1192 | { |
1204 | int status; | 1193 | int status; |
1205 | unsigned int cflag; | 1194 | unsigned int cflag; |
1206 | struct usb_serial *serial; | 1195 | struct usb_serial *serial; |
1207 | struct moschip_port *mos7720_port; | 1196 | struct moschip_port *mos7720_port; |
1208 | struct tty_struct *tty; | ||
1209 | 1197 | ||
1210 | serial = port->serial; | 1198 | serial = port->serial; |
1211 | 1199 | ||
@@ -1214,9 +1202,6 @@ static void mos7720_set_termios(struct usb_serial_port *port, | |||
1214 | if (mos7720_port == NULL) | 1202 | if (mos7720_port == NULL) |
1215 | return; | 1203 | return; |
1216 | 1204 | ||
1217 | tty = port->tty; | ||
1218 | |||
1219 | |||
1220 | if (!mos7720_port->open) { | 1205 | if (!mos7720_port->open) { |
1221 | dbg("%s - port not opened", __func__); | 1206 | dbg("%s - port not opened", __func__); |
1222 | return; | 1207 | return; |
@@ -1237,7 +1222,7 @@ static void mos7720_set_termios(struct usb_serial_port *port, | |||
1237 | dbg("%s - port %d", __func__, port->number); | 1222 | dbg("%s - port %d", __func__, port->number); |
1238 | 1223 | ||
1239 | /* change the port settings to the new ones specified */ | 1224 | /* change the port settings to the new ones specified */ |
1240 | change_port_settings(mos7720_port, old_termios); | 1225 | change_port_settings(tty, mos7720_port, old_termios); |
1241 | 1226 | ||
1242 | if(!port->read_urb) { | 1227 | if(!port->read_urb) { |
1243 | dbg("%s","URB KILLED !!!!!\n"); | 1228 | dbg("%s","URB KILLED !!!!!\n"); |
@@ -1264,13 +1249,13 @@ static void mos7720_set_termios(struct usb_serial_port *port, | |||
1264 | * transmit holding register is empty. This functionality | 1249 | * transmit holding register is empty. This functionality |
1265 | * allows an RS485 driver to be written in user space. | 1250 | * allows an RS485 driver to be written in user space. |
1266 | */ | 1251 | */ |
1267 | static int get_lsr_info(struct moschip_port *mos7720_port, | 1252 | static int get_lsr_info(struct tty_struct *tty, struct moschip_port *mos7720_port, |
1268 | unsigned int __user *value) | 1253 | unsigned int __user *value) |
1269 | { | 1254 | { |
1270 | int count; | 1255 | int count; |
1271 | unsigned int result = 0; | 1256 | unsigned int result = 0; |
1272 | 1257 | ||
1273 | count = mos7720_chars_in_buffer(mos7720_port->port); | 1258 | count = mos7720_chars_in_buffer(tty); |
1274 | if (count == 0) { | 1259 | if (count == 0) { |
1275 | dbg("%s -- Empty", __func__); | 1260 | dbg("%s -- Empty", __func__); |
1276 | result = TIOCSER_TEMT; | 1261 | result = TIOCSER_TEMT; |
@@ -1290,7 +1275,7 @@ static int get_number_bytes_avail(struct moschip_port *mos7720_port, | |||
1290 | unsigned int __user *value) | 1275 | unsigned int __user *value) |
1291 | { | 1276 | { |
1292 | unsigned int result = 0; | 1277 | unsigned int result = 0; |
1293 | struct tty_struct *tty = mos7720_port->port->tty; | 1278 | struct tty_struct *tty = mos7720_port->port->port.tty; |
1294 | 1279 | ||
1295 | if (!tty) | 1280 | if (!tty) |
1296 | return -ENOIOCTLCMD; | 1281 | return -ENOIOCTLCMD; |
@@ -1407,9 +1392,10 @@ static int get_serial_info(struct moschip_port *mos7720_port, | |||
1407 | return 0; | 1392 | return 0; |
1408 | } | 1393 | } |
1409 | 1394 | ||
1410 | static int mos7720_ioctl(struct usb_serial_port *port, struct file *file, | 1395 | static int mos7720_ioctl(struct tty_struct *tty, struct file *file, |
1411 | unsigned int cmd, unsigned long arg) | 1396 | unsigned int cmd, unsigned long arg) |
1412 | { | 1397 | { |
1398 | struct usb_serial_port *port = tty->driver_data; | ||
1413 | struct moschip_port *mos7720_port; | 1399 | struct moschip_port *mos7720_port; |
1414 | struct async_icount cnow; | 1400 | struct async_icount cnow; |
1415 | struct async_icount cprev; | 1401 | struct async_icount cprev; |
@@ -1431,9 +1417,10 @@ static int mos7720_ioctl(struct usb_serial_port *port, struct file *file, | |||
1431 | 1417 | ||
1432 | case TIOCSERGETLSR: | 1418 | case TIOCSERGETLSR: |
1433 | dbg("%s (%d) TIOCSERGETLSR", __func__, port->number); | 1419 | dbg("%s (%d) TIOCSERGETLSR", __func__, port->number); |
1434 | return get_lsr_info(mos7720_port, (unsigned int __user *)arg); | 1420 | return get_lsr_info(tty, mos7720_port, (unsigned int __user *)arg); |
1435 | return 0; | 1421 | return 0; |
1436 | 1422 | ||
1423 | /* FIXME: These should be using the mode methods */ | ||
1437 | case TIOCMBIS: | 1424 | case TIOCMBIS: |
1438 | case TIOCMBIC: | 1425 | case TIOCMBIC: |
1439 | case TIOCMSET: | 1426 | case TIOCMSET: |
@@ -1452,10 +1439,6 @@ static int mos7720_ioctl(struct usb_serial_port *port, struct file *file, | |||
1452 | return get_serial_info(mos7720_port, | 1439 | return get_serial_info(mos7720_port, |
1453 | (struct serial_struct __user *)arg); | 1440 | (struct serial_struct __user *)arg); |
1454 | 1441 | ||
1455 | case TIOCSSERIAL: | ||
1456 | dbg("%s (%d) TIOCSSERIAL", __func__, port->number); | ||
1457 | break; | ||
1458 | |||
1459 | case TIOCMIWAIT: | 1442 | case TIOCMIWAIT: |
1460 | dbg("%s (%d) TIOCMIWAIT", __func__, port->number); | 1443 | dbg("%s (%d) TIOCMIWAIT", __func__, port->number); |
1461 | cprev = mos7720_port->icount; | 1444 | cprev = mos7720_port->icount; |