diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/usb/serial/ftdi_sio.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'drivers/usb/serial/ftdi_sio.c')
-rw-r--r-- | drivers/usb/serial/ftdi_sio.c | 159 |
1 files changed, 137 insertions, 22 deletions
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 97cc87d654ce..2e06b90aa1f8 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -17,7 +17,7 @@ | |||
17 | * See Documentation/usb/usb-serial.txt for more information on using this | 17 | * See Documentation/usb/usb-serial.txt for more information on using this |
18 | * driver | 18 | * driver |
19 | * | 19 | * |
20 | * See http://ftdi-usb-sio.sourceforge.net for upto date testing info | 20 | * See http://ftdi-usb-sio.sourceforge.net for up to date testing info |
21 | * and extra documentation | 21 | * and extra documentation |
22 | * | 22 | * |
23 | * Change entries from 2004 and earlier can be found in versions of this | 23 | * Change entries from 2004 and earlier can be found in versions of this |
@@ -75,6 +75,7 @@ struct ftdi_private { | |||
75 | unsigned long last_dtr_rts; /* saved modem control outputs */ | 75 | unsigned long last_dtr_rts; /* saved modem control outputs */ |
76 | wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */ | 76 | wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */ |
77 | char prev_status, diff_status; /* Used for TIOCMIWAIT */ | 77 | char prev_status, diff_status; /* Used for TIOCMIWAIT */ |
78 | char transmit_empty; /* If transmitter is empty or not */ | ||
78 | struct usb_serial_port *port; | 79 | struct usb_serial_port *port; |
79 | __u16 interface; /* FT2232C, FT2232H or FT4232H port interface | 80 | __u16 interface; /* FT2232C, FT2232H or FT4232H port interface |
80 | (0 for FT232/245) */ | 81 | (0 for FT232/245) */ |
@@ -99,6 +100,7 @@ struct ftdi_sio_quirk { | |||
99 | static int ftdi_jtag_probe(struct usb_serial *serial); | 100 | static int ftdi_jtag_probe(struct usb_serial *serial); |
100 | static int ftdi_mtxorb_hack_setup(struct usb_serial *serial); | 101 | static int ftdi_mtxorb_hack_setup(struct usb_serial *serial); |
101 | static int ftdi_NDI_device_setup(struct usb_serial *serial); | 102 | static int ftdi_NDI_device_setup(struct usb_serial *serial); |
103 | static int ftdi_stmclite_probe(struct usb_serial *serial); | ||
102 | static void ftdi_USB_UIRT_setup(struct ftdi_private *priv); | 104 | static void ftdi_USB_UIRT_setup(struct ftdi_private *priv); |
103 | static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv); | 105 | static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv); |
104 | 106 | ||
@@ -122,6 +124,10 @@ static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = { | |||
122 | .port_probe = ftdi_HE_TIRA1_setup, | 124 | .port_probe = ftdi_HE_TIRA1_setup, |
123 | }; | 125 | }; |
124 | 126 | ||
127 | static struct ftdi_sio_quirk ftdi_stmclite_quirk = { | ||
128 | .probe = ftdi_stmclite_probe, | ||
129 | }; | ||
130 | |||
125 | /* | 131 | /* |
126 | * The 8U232AM has the same API as the sio except for: | 132 | * The 8U232AM has the same API as the sio except for: |
127 | * - it can support MUCH higher baudrates; up to: | 133 | * - it can support MUCH higher baudrates; up to: |
@@ -145,6 +151,8 @@ static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = { | |||
145 | * /sys/bus/usb/ftdi_sio/new_id, then send patch/report! | 151 | * /sys/bus/usb/ftdi_sio/new_id, then send patch/report! |
146 | */ | 152 | */ |
147 | static struct usb_device_id id_table_combined [] = { | 153 | static struct usb_device_id id_table_combined [] = { |
154 | { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) }, | ||
155 | { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) }, | ||
148 | { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) }, | 156 | { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) }, |
149 | { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) }, | 157 | { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) }, |
150 | { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) }, | 158 | { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) }, |
@@ -171,12 +179,14 @@ static struct usb_device_id id_table_combined [] = { | |||
171 | { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) }, | 179 | { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) }, |
172 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, | 180 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, |
173 | { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) }, | 181 | { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) }, |
182 | { USB_DEVICE(FTDI_VID, FTDI_232H_PID) }, | ||
174 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, | 183 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, |
175 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, | 184 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, |
176 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) }, | 185 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) }, |
177 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_SNIFFER_PID) }, | 186 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_SNIFFER_PID) }, |
178 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) }, | 187 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) }, |
179 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) }, | 188 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) }, |
189 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) }, | ||
180 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, | 190 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, |
181 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, | 191 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, |
182 | { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) }, | 192 | { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) }, |
@@ -200,6 +210,7 @@ static struct usb_device_id id_table_combined [] = { | |||
200 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) }, | 210 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) }, |
201 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) }, | 211 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) }, |
202 | { USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) }, | 212 | { USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) }, |
213 | { USB_DEVICE(FTDI_VID, FTDI_VARDAAN_PID) }, | ||
203 | { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) }, | 214 | { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) }, |
204 | { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) }, | 215 | { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) }, |
205 | { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) }, | 216 | { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) }, |
@@ -517,6 +528,7 @@ static struct usb_device_id id_table_combined [] = { | |||
517 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) }, | 528 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) }, |
518 | { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) }, | 529 | { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) }, |
519 | { USB_DEVICE(OCT_VID, OCT_US101_PID) }, | 530 | { USB_DEVICE(OCT_VID, OCT_US101_PID) }, |
531 | { USB_DEVICE(OCT_VID, OCT_DK201_PID) }, | ||
520 | { USB_DEVICE(FTDI_VID, FTDI_HE_TIRA1_PID), | 532 | { USB_DEVICE(FTDI_VID, FTDI_HE_TIRA1_PID), |
521 | .driver_info = (kernel_ulong_t)&ftdi_HE_TIRA1_quirk }, | 533 | .driver_info = (kernel_ulong_t)&ftdi_HE_TIRA1_quirk }, |
522 | { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID), | 534 | { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID), |
@@ -555,6 +567,7 @@ static struct usb_device_id id_table_combined [] = { | |||
555 | { USB_DEVICE(FTDI_VID, FTDI_IBS_APP70_PID) }, | 567 | { USB_DEVICE(FTDI_VID, FTDI_IBS_APP70_PID) }, |
556 | { USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) }, | 568 | { USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) }, |
557 | { USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) }, | 569 | { USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) }, |
570 | { USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) }, | ||
558 | /* | 571 | /* |
559 | * ELV devices: | 572 | * ELV devices: |
560 | */ | 573 | */ |
@@ -613,6 +626,7 @@ static struct usb_device_id id_table_combined [] = { | |||
613 | { USB_DEVICE(FTDI_VID, FTDI_OCEANIC_PID) }, | 626 | { USB_DEVICE(FTDI_VID, FTDI_OCEANIC_PID) }, |
614 | { USB_DEVICE(TTI_VID, TTI_QL355P_PID) }, | 627 | { USB_DEVICE(TTI_VID, TTI_QL355P_PID) }, |
615 | { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) }, | 628 | { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) }, |
629 | { USB_DEVICE(ACTON_VID, ACTON_SPECTRAPRO_PID) }, | ||
616 | { USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) }, | 630 | { USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) }, |
617 | { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) }, | 631 | { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) }, |
618 | { USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) }, | 632 | { USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) }, |
@@ -634,6 +648,7 @@ static struct usb_device_id id_table_combined [] = { | |||
634 | { USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) }, | 648 | { USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) }, |
635 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) }, | 649 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) }, |
636 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) }, | 650 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) }, |
651 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_3_PID) }, | ||
637 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) }, | 652 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) }, |
638 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) }, | 653 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) }, |
639 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) }, | 654 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) }, |
@@ -673,8 +688,17 @@ static struct usb_device_id id_table_combined [] = { | |||
673 | { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) }, | 688 | { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) }, |
674 | { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) }, | 689 | { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) }, |
675 | { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) }, | 690 | { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) }, |
676 | { USB_DEVICE(ICOM_ID1_VID, ICOM_ID1_PID) }, | 691 | { USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) }, |
677 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) }, | 692 | { USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) }, |
693 | { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) }, | ||
694 | { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C2_PID) }, | ||
695 | { USB_DEVICE(ICOM_VID, ICOM_ID_RP2D_PID) }, | ||
696 | { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VT_PID) }, | ||
697 | { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VR_PID) }, | ||
698 | { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVT_PID) }, | ||
699 | { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVR_PID) }, | ||
700 | { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVT_PID) }, | ||
701 | { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVR_PID) }, | ||
678 | { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) }, | 702 | { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) }, |
679 | { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) }, | 703 | { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) }, |
680 | { USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) }, | 704 | { USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) }, |
@@ -696,6 +720,7 @@ static struct usb_device_id id_table_combined [] = { | |||
696 | .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk }, | 720 | .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk }, |
697 | { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, | 721 | { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, |
698 | { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_SERIAL_VX7_PID) }, | 722 | { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_SERIAL_VX7_PID) }, |
723 | { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_CT29B_PID) }, | ||
699 | { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) }, | 724 | { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) }, |
700 | { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) }, | 725 | { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) }, |
701 | { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) }, | 726 | { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) }, |
@@ -703,6 +728,8 @@ static struct usb_device_id id_table_combined [] = { | |||
703 | { USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) }, | 728 | { USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) }, |
704 | { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID), | 729 | { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID), |
705 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 730 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
731 | { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID), | ||
732 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
706 | { USB_DEVICE(FIC_VID, FIC_NEO1973_DEBUG_PID), | 733 | { USB_DEVICE(FIC_VID, FIC_NEO1973_DEBUG_PID), |
707 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 734 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
708 | { USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID), | 735 | { USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID), |
@@ -715,8 +742,37 @@ static struct usb_device_id id_table_combined [] = { | |||
715 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 742 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
716 | { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) }, | 743 | { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) }, |
717 | { USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) }, | 744 | { USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) }, |
745 | |||
746 | /* Papouch devices based on FTDI chip */ | ||
747 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_PID) }, | ||
748 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_PID) }, | ||
749 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_PID) }, | ||
750 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_2_PID) }, | ||
751 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_2_PID) }, | ||
752 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_2_PID) }, | ||
753 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485S_PID) }, | ||
754 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485C_PID) }, | ||
755 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_LEC_PID) }, | ||
756 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB232_PID) }, | ||
757 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) }, | ||
758 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_IRAMP_PID) }, | ||
759 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK5_PID) }, | ||
760 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO8x8_PID) }, | ||
718 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) }, | 761 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) }, |
762 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x2_PID) }, | ||
763 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO10x1_PID) }, | ||
764 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO30x3_PID) }, | ||
765 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO60x3_PID) }, | ||
766 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x16_PID) }, | ||
767 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO3x32_PID) }, | ||
768 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK6_PID) }, | ||
769 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_UPSUSB_PID) }, | ||
770 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_MU_PID) }, | ||
771 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SIMUKEY_PID) }, | ||
719 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AD4USB_PID) }, | 772 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AD4USB_PID) }, |
773 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMUX_PID) }, | ||
774 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMSR_PID) }, | ||
775 | |||
720 | { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) }, | 776 | { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) }, |
721 | { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) }, | 777 | { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) }, |
722 | { USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) }, | 778 | { USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) }, |
@@ -737,6 +793,8 @@ static struct usb_device_id id_table_combined [] = { | |||
737 | { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), | 793 | { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), |
738 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 794 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
739 | { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) }, | 795 | { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) }, |
796 | { USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) }, | ||
797 | { USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) }, | ||
740 | { USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) }, | 798 | { USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) }, |
741 | { USB_DEVICE(FTDI_VID, MJSG_GENERIC_PID) }, | 799 | { USB_DEVICE(FTDI_VID, MJSG_GENERIC_PID) }, |
742 | { USB_DEVICE(FTDI_VID, MJSG_SR_RADIO_PID) }, | 800 | { USB_DEVICE(FTDI_VID, MJSG_SR_RADIO_PID) }, |
@@ -751,6 +809,7 @@ static struct usb_device_id id_table_combined [] = { | |||
751 | { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID), | 809 | { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID), |
752 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 810 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
753 | { USB_DEVICE(FTDI_VID, SEGWAY_RMP200_PID) }, | 811 | { USB_DEVICE(FTDI_VID, SEGWAY_RMP200_PID) }, |
812 | { USB_DEVICE(FTDI_VID, ACCESIO_COM4SM_PID) }, | ||
754 | { USB_DEVICE(IONICS_VID, IONICS_PLUGCOMPUTER_PID), | 813 | { USB_DEVICE(IONICS_VID, IONICS_PLUGCOMPUTER_PID), |
755 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 814 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
756 | { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_24_MASTER_WING_PID) }, | 815 | { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_24_MASTER_WING_PID) }, |
@@ -761,6 +820,14 @@ static struct usb_device_id id_table_combined [] = { | |||
761 | { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MAXI_WING_PID) }, | 820 | { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MAXI_WING_PID) }, |
762 | { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MEDIA_WING_PID) }, | 821 | { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MEDIA_WING_PID) }, |
763 | { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_WING_PID) }, | 822 | { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_WING_PID) }, |
823 | { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LOGBOOKML_PID) }, | ||
824 | { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LS_LOGBOOK_PID) }, | ||
825 | { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_HS_LOGBOOK_PID) }, | ||
826 | { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) }, | ||
827 | { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID), | ||
828 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
829 | { USB_DEVICE(ST_VID, ST_STMCLT1030_PID), | ||
830 | .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk }, | ||
764 | { }, /* Optional parameter entry */ | 831 | { }, /* Optional parameter entry */ |
765 | { } /* Terminating entry */ | 832 | { } /* Terminating entry */ |
766 | }; | 833 | }; |
@@ -782,7 +849,8 @@ static const char *ftdi_chip_name[] = { | |||
782 | [FT2232C] = "FT2232C", | 849 | [FT2232C] = "FT2232C", |
783 | [FT232RL] = "FT232RL", | 850 | [FT232RL] = "FT232RL", |
784 | [FT2232H] = "FT2232H", | 851 | [FT2232H] = "FT2232H", |
785 | [FT4232H] = "FT4232H" | 852 | [FT4232H] = "FT4232H", |
853 | [FT232H] = "FT232H" | ||
786 | }; | 854 | }; |
787 | 855 | ||
788 | 856 | ||
@@ -807,10 +875,10 @@ static int ftdi_prepare_write_buffer(struct usb_serial_port *port, | |||
807 | void *dest, size_t size); | 875 | void *dest, size_t size); |
808 | static void ftdi_set_termios(struct tty_struct *tty, | 876 | static void ftdi_set_termios(struct tty_struct *tty, |
809 | struct usb_serial_port *port, struct ktermios *old); | 877 | struct usb_serial_port *port, struct ktermios *old); |
810 | static int ftdi_tiocmget(struct tty_struct *tty, struct file *file); | 878 | static int ftdi_tiocmget(struct tty_struct *tty); |
811 | static int ftdi_tiocmset(struct tty_struct *tty, struct file *file, | 879 | static int ftdi_tiocmset(struct tty_struct *tty, |
812 | unsigned int set, unsigned int clear); | 880 | unsigned int set, unsigned int clear); |
813 | static int ftdi_ioctl(struct tty_struct *tty, struct file *file, | 881 | static int ftdi_ioctl(struct tty_struct *tty, |
814 | unsigned int cmd, unsigned long arg); | 882 | unsigned int cmd, unsigned long arg); |
815 | static void ftdi_break_ctl(struct tty_struct *tty, int break_state); | 883 | static void ftdi_break_ctl(struct tty_struct *tty, int break_state); |
816 | 884 | ||
@@ -916,7 +984,7 @@ static __u32 ftdi_2232h_baud_base_to_divisor(int baud, int base) | |||
916 | int divisor3; | 984 | int divisor3; |
917 | 985 | ||
918 | /* hi-speed baud rate is 10-bit sampling instead of 16-bit */ | 986 | /* hi-speed baud rate is 10-bit sampling instead of 16-bit */ |
919 | divisor3 = (base / 10 / baud) * 8; | 987 | divisor3 = base * 8 / (baud * 10); |
920 | 988 | ||
921 | divisor = divisor3 >> 3; | 989 | divisor = divisor3 >> 3; |
922 | divisor |= (__u32)divfrac[divisor3 & 0x7] << 14; | 990 | divisor |= (__u32)divfrac[divisor3 & 0x7] << 14; |
@@ -1102,6 +1170,7 @@ static __u32 get_ftdi_divisor(struct tty_struct *tty, | |||
1102 | break; | 1170 | break; |
1103 | case FT2232H: /* FT2232H chip */ | 1171 | case FT2232H: /* FT2232H chip */ |
1104 | case FT4232H: /* FT4232H chip */ | 1172 | case FT4232H: /* FT4232H chip */ |
1173 | case FT232H: /* FT232H chip */ | ||
1105 | if ((baud <= 12000000) & (baud >= 1200)) { | 1174 | if ((baud <= 12000000) & (baud >= 1200)) { |
1106 | div_value = ftdi_2232h_baud_to_divisor(baud); | 1175 | div_value = ftdi_2232h_baud_to_divisor(baud); |
1107 | } else if (baud < 1200) { | 1176 | } else if (baud < 1200) { |
@@ -1285,6 +1354,23 @@ check_and_exit: | |||
1285 | return 0; | 1354 | return 0; |
1286 | } | 1355 | } |
1287 | 1356 | ||
1357 | static int get_lsr_info(struct usb_serial_port *port, | ||
1358 | struct serial_struct __user *retinfo) | ||
1359 | { | ||
1360 | struct ftdi_private *priv = usb_get_serial_port_data(port); | ||
1361 | unsigned int result = 0; | ||
1362 | |||
1363 | if (!retinfo) | ||
1364 | return -EFAULT; | ||
1365 | |||
1366 | if (priv->transmit_empty) | ||
1367 | result = TIOCSER_TEMT; | ||
1368 | |||
1369 | if (copy_to_user(retinfo, &result, sizeof(unsigned int))) | ||
1370 | return -EFAULT; | ||
1371 | return 0; | ||
1372 | } | ||
1373 | |||
1288 | 1374 | ||
1289 | /* Determine type of FTDI chip based on USB config and descriptor. */ | 1375 | /* Determine type of FTDI chip based on USB config and descriptor. */ |
1290 | static void ftdi_determine_type(struct usb_serial_port *port) | 1376 | static void ftdi_determine_type(struct usb_serial_port *port) |
@@ -1346,9 +1432,12 @@ static void ftdi_determine_type(struct usb_serial_port *port) | |||
1346 | } else if (version < 0x600) { | 1432 | } else if (version < 0x600) { |
1347 | /* Assume it's an FT232BM (or FT245BM) */ | 1433 | /* Assume it's an FT232BM (or FT245BM) */ |
1348 | priv->chip_type = FT232BM; | 1434 | priv->chip_type = FT232BM; |
1349 | } else { | 1435 | } else if (version < 0x900) { |
1350 | /* Assume it's an FT232R */ | 1436 | /* Assume it's an FT232RL */ |
1351 | priv->chip_type = FT232RL; | 1437 | priv->chip_type = FT232RL; |
1438 | } else { | ||
1439 | /* Assume it's an FT232H */ | ||
1440 | priv->chip_type = FT232H; | ||
1352 | } | 1441 | } |
1353 | dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]); | 1442 | dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]); |
1354 | } | 1443 | } |
@@ -1476,7 +1565,8 @@ static int create_sysfs_attrs(struct usb_serial_port *port) | |||
1476 | priv->chip_type == FT2232C || | 1565 | priv->chip_type == FT2232C || |
1477 | priv->chip_type == FT232RL || | 1566 | priv->chip_type == FT232RL || |
1478 | priv->chip_type == FT2232H || | 1567 | priv->chip_type == FT2232H || |
1479 | priv->chip_type == FT4232H)) { | 1568 | priv->chip_type == FT4232H || |
1569 | priv->chip_type == FT232H)) { | ||
1480 | retval = device_create_file(&port->dev, | 1570 | retval = device_create_file(&port->dev, |
1481 | &dev_attr_latency_timer); | 1571 | &dev_attr_latency_timer); |
1482 | } | 1572 | } |
@@ -1497,7 +1587,8 @@ static void remove_sysfs_attrs(struct usb_serial_port *port) | |||
1497 | priv->chip_type == FT2232C || | 1587 | priv->chip_type == FT2232C || |
1498 | priv->chip_type == FT232RL || | 1588 | priv->chip_type == FT232RL || |
1499 | priv->chip_type == FT2232H || | 1589 | priv->chip_type == FT2232H || |
1500 | priv->chip_type == FT4232H) { | 1590 | priv->chip_type == FT4232H || |
1591 | priv->chip_type == FT232H) { | ||
1501 | device_remove_file(&port->dev, &dev_attr_latency_timer); | 1592 | device_remove_file(&port->dev, &dev_attr_latency_timer); |
1502 | } | 1593 | } |
1503 | } | 1594 | } |
@@ -1559,6 +1650,7 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port) | |||
1559 | ftdi_set_max_packet_size(port); | 1650 | ftdi_set_max_packet_size(port); |
1560 | if (read_latency_timer(port) < 0) | 1651 | if (read_latency_timer(port) < 0) |
1561 | priv->latency = 16; | 1652 | priv->latency = 16; |
1653 | write_latency_timer(port); | ||
1562 | create_sysfs_attrs(port); | 1654 | create_sysfs_attrs(port); |
1563 | return 0; | 1655 | return 0; |
1564 | } | 1656 | } |
@@ -1642,6 +1734,25 @@ static int ftdi_jtag_probe(struct usb_serial *serial) | |||
1642 | } | 1734 | } |
1643 | 1735 | ||
1644 | /* | 1736 | /* |
1737 | * First and second port on STMCLiteadaptors is reserved for JTAG interface | ||
1738 | * and the forth port for pio | ||
1739 | */ | ||
1740 | static int ftdi_stmclite_probe(struct usb_serial *serial) | ||
1741 | { | ||
1742 | struct usb_device *udev = serial->dev; | ||
1743 | struct usb_interface *interface = serial->interface; | ||
1744 | |||
1745 | dbg("%s", __func__); | ||
1746 | |||
1747 | if (interface == udev->actconfig->interface[2]) | ||
1748 | return 0; | ||
1749 | |||
1750 | dev_info(&udev->dev, "Ignoring serial port reserved for JTAG\n"); | ||
1751 | |||
1752 | return -ENODEV; | ||
1753 | } | ||
1754 | |||
1755 | /* | ||
1645 | * The Matrix Orbital VK204-25-USB has an invalid IN endpoint. | 1756 | * The Matrix Orbital VK204-25-USB has an invalid IN endpoint. |
1646 | * We have to correct it if we want to read from it. | 1757 | * We have to correct it if we want to read from it. |
1647 | */ | 1758 | */ |
@@ -1687,8 +1798,6 @@ static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
1687 | 1798 | ||
1688 | dbg("%s", __func__); | 1799 | dbg("%s", __func__); |
1689 | 1800 | ||
1690 | write_latency_timer(port); | ||
1691 | |||
1692 | /* No error checking for this (will get errors later anyway) */ | 1801 | /* No error checking for this (will get errors later anyway) */ |
1693 | /* See ftdi_sio.h for description of what is reset */ | 1802 | /* See ftdi_sio.h for description of what is reset */ |
1694 | usb_control_msg(dev, usb_sndctrlpipe(dev, 0), | 1803 | usb_control_msg(dev, usb_sndctrlpipe(dev, 0), |
@@ -1835,6 +1944,12 @@ static int ftdi_process_packet(struct tty_struct *tty, | |||
1835 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); | 1944 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); |
1836 | } | 1945 | } |
1837 | 1946 | ||
1947 | /* save if the transmitter is empty or not */ | ||
1948 | if (packet[1] & FTDI_RS_TEMT) | ||
1949 | priv->transmit_empty = 1; | ||
1950 | else | ||
1951 | priv->transmit_empty = 0; | ||
1952 | |||
1838 | len -= 2; | 1953 | len -= 2; |
1839 | if (!len) | 1954 | if (!len) |
1840 | return 0; /* status only */ | 1955 | return 0; /* status only */ |
@@ -2028,8 +2143,6 @@ static void ftdi_set_termios(struct tty_struct *tty, | |||
2028 | "urb failed to set to rts/cts flow control\n"); | 2143 | "urb failed to set to rts/cts flow control\n"); |
2029 | } | 2144 | } |
2030 | 2145 | ||
2031 | /* raise DTR/RTS */ | ||
2032 | set_mctrl(port, TIOCM_DTR | TIOCM_RTS); | ||
2033 | } else { | 2146 | } else { |
2034 | /* | 2147 | /* |
2035 | * Xon/Xoff code | 2148 | * Xon/Xoff code |
@@ -2077,13 +2190,10 @@ static void ftdi_set_termios(struct tty_struct *tty, | |||
2077 | } | 2190 | } |
2078 | } | 2191 | } |
2079 | 2192 | ||
2080 | /* lower DTR/RTS */ | ||
2081 | clear_mctrl(port, TIOCM_DTR | TIOCM_RTS); | ||
2082 | } | 2193 | } |
2083 | return; | ||
2084 | } | 2194 | } |
2085 | 2195 | ||
2086 | static int ftdi_tiocmget(struct tty_struct *tty, struct file *file) | 2196 | static int ftdi_tiocmget(struct tty_struct *tty) |
2087 | { | 2197 | { |
2088 | struct usb_serial_port *port = tty->driver_data; | 2198 | struct usb_serial_port *port = tty->driver_data; |
2089 | struct ftdi_private *priv = usb_get_serial_port_data(port); | 2199 | struct ftdi_private *priv = usb_get_serial_port_data(port); |
@@ -2110,6 +2220,7 @@ static int ftdi_tiocmget(struct tty_struct *tty, struct file *file) | |||
2110 | case FT232RL: | 2220 | case FT232RL: |
2111 | case FT2232H: | 2221 | case FT2232H: |
2112 | case FT4232H: | 2222 | case FT4232H: |
2223 | case FT232H: | ||
2113 | len = 2; | 2224 | len = 2; |
2114 | break; | 2225 | break; |
2115 | default: | 2226 | default: |
@@ -2136,7 +2247,7 @@ out: | |||
2136 | return ret; | 2247 | return ret; |
2137 | } | 2248 | } |
2138 | 2249 | ||
2139 | static int ftdi_tiocmset(struct tty_struct *tty, struct file *file, | 2250 | static int ftdi_tiocmset(struct tty_struct *tty, |
2140 | unsigned int set, unsigned int clear) | 2251 | unsigned int set, unsigned int clear) |
2141 | { | 2252 | { |
2142 | struct usb_serial_port *port = tty->driver_data; | 2253 | struct usb_serial_port *port = tty->driver_data; |
@@ -2144,7 +2255,7 @@ static int ftdi_tiocmset(struct tty_struct *tty, struct file *file, | |||
2144 | return update_mctrl(port, set, clear); | 2255 | return update_mctrl(port, set, clear); |
2145 | } | 2256 | } |
2146 | 2257 | ||
2147 | static int ftdi_ioctl(struct tty_struct *tty, struct file *file, | 2258 | static int ftdi_ioctl(struct tty_struct *tty, |
2148 | unsigned int cmd, unsigned long arg) | 2259 | unsigned int cmd, unsigned long arg) |
2149 | { | 2260 | { |
2150 | struct usb_serial_port *port = tty->driver_data; | 2261 | struct usb_serial_port *port = tty->driver_data; |
@@ -2168,6 +2279,7 @@ static int ftdi_ioctl(struct tty_struct *tty, struct file *file, | |||
2168 | * - mask passed in arg for lines of interest | 2279 | * - mask passed in arg for lines of interest |
2169 | * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking) | 2280 | * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking) |
2170 | * Caller should use TIOCGICOUNT to see which one it was. | 2281 | * Caller should use TIOCGICOUNT to see which one it was. |
2282 | * (except that the driver doesn't support it !) | ||
2171 | * | 2283 | * |
2172 | * This code is borrowed from linux/drivers/char/serial.c | 2284 | * This code is borrowed from linux/drivers/char/serial.c |
2173 | */ | 2285 | */ |
@@ -2202,6 +2314,9 @@ static int ftdi_ioctl(struct tty_struct *tty, struct file *file, | |||
2202 | } | 2314 | } |
2203 | } | 2315 | } |
2204 | return 0; | 2316 | return 0; |
2317 | case TIOCSERGETLSR: | ||
2318 | return get_lsr_info(port, (struct serial_struct __user *)arg); | ||
2319 | break; | ||
2205 | default: | 2320 | default: |
2206 | break; | 2321 | break; |
2207 | } | 2322 | } |