aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/ftdi_sio.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/usb/serial/ftdi_sio.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (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.c159
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 {
99static int ftdi_jtag_probe(struct usb_serial *serial); 100static int ftdi_jtag_probe(struct usb_serial *serial);
100static int ftdi_mtxorb_hack_setup(struct usb_serial *serial); 101static int ftdi_mtxorb_hack_setup(struct usb_serial *serial);
101static int ftdi_NDI_device_setup(struct usb_serial *serial); 102static int ftdi_NDI_device_setup(struct usb_serial *serial);
103static int ftdi_stmclite_probe(struct usb_serial *serial);
102static void ftdi_USB_UIRT_setup(struct ftdi_private *priv); 104static void ftdi_USB_UIRT_setup(struct ftdi_private *priv);
103static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv); 105static 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
127static 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 */
147static struct usb_device_id id_table_combined [] = { 153static 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);
808static void ftdi_set_termios(struct tty_struct *tty, 876static 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);
810static int ftdi_tiocmget(struct tty_struct *tty, struct file *file); 878static int ftdi_tiocmget(struct tty_struct *tty);
811static int ftdi_tiocmset(struct tty_struct *tty, struct file *file, 879static int ftdi_tiocmset(struct tty_struct *tty,
812 unsigned int set, unsigned int clear); 880 unsigned int set, unsigned int clear);
813static int ftdi_ioctl(struct tty_struct *tty, struct file *file, 881static int ftdi_ioctl(struct tty_struct *tty,
814 unsigned int cmd, unsigned long arg); 882 unsigned int cmd, unsigned long arg);
815static void ftdi_break_ctl(struct tty_struct *tty, int break_state); 883static 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
1357static 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. */
1290static void ftdi_determine_type(struct usb_serial_port *port) 1376static 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 */
1740static 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
2086static int ftdi_tiocmget(struct tty_struct *tty, struct file *file) 2196static 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
2139static int ftdi_tiocmset(struct tty_struct *tty, struct file *file, 2250static 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
2147static int ftdi_ioctl(struct tty_struct *tty, struct file *file, 2258static 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 }