aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/serial/ftdi_sio.c61
-rw-r--r--drivers/usb/serial/ftdi_sio.h12
2 files changed, 69 insertions, 4 deletions
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index e9e9c78dceb3..88eb5878914a 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -107,6 +107,7 @@ struct ftdi_sio_quirk {
107 107
108static int ftdi_jtag_probe(struct usb_serial *serial); 108static int ftdi_jtag_probe(struct usb_serial *serial);
109static int ftdi_mtxorb_hack_setup(struct usb_serial *serial); 109static int ftdi_mtxorb_hack_setup(struct usb_serial *serial);
110static int ftdi_NDI_device_setup(struct usb_serial *serial);
110static void ftdi_USB_UIRT_setup(struct ftdi_private *priv); 111static void ftdi_USB_UIRT_setup(struct ftdi_private *priv);
111static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv); 112static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv);
112 113
@@ -118,6 +119,10 @@ static struct ftdi_sio_quirk ftdi_mtxorb_hack_quirk = {
118 .probe = ftdi_mtxorb_hack_setup, 119 .probe = ftdi_mtxorb_hack_setup,
119}; 120};
120 121
122static struct ftdi_sio_quirk ftdi_NDI_device_quirk = {
123 .probe = ftdi_NDI_device_setup,
124};
125
121static struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = { 126static struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = {
122 .port_probe = ftdi_USB_UIRT_setup, 127 .port_probe = ftdi_USB_UIRT_setup,
123}; 128};
@@ -648,6 +653,16 @@ static struct usb_device_id id_table_combined [] = {
648 { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) }, 653 { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) },
649 { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) }, 654 { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) },
650 { USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) }, 655 { USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) },
656 { USB_DEVICE(FTDI_VID, FTDI_NDI_HUC_PID),
657 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
658 { USB_DEVICE(FTDI_VID, FTDI_NDI_SPECTRA_SCU_PID),
659 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
660 { USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_2_PID),
661 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
662 { USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_3_PID),
663 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
664 { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID),
665 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
651 { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, 666 { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
652 { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) }, 667 { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
653 { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) }, 668 { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) },
@@ -671,7 +686,6 @@ static struct usb_device_id id_table_combined [] = {
671 { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) }, 686 { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) },
672 { USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) }, 687 { USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) },
673 { USB_DEVICE(FTDI_VID, DIEBOLD_BCS_SE923_PID) }, 688 { USB_DEVICE(FTDI_VID, DIEBOLD_BCS_SE923_PID) },
674 { USB_DEVICE(FTDI_VID, FTDI_NDI_HUC_PID) },
675 { USB_DEVICE(ATMEL_VID, STK541_PID) }, 689 { USB_DEVICE(ATMEL_VID, STK541_PID) },
676 { USB_DEVICE(DE_VID, STB_PID) }, 690 { USB_DEVICE(DE_VID, STB_PID) },
677 { USB_DEVICE(DE_VID, WHT_PID) }, 691 { USB_DEVICE(DE_VID, WHT_PID) },
@@ -1027,6 +1041,16 @@ static __u32 get_ftdi_divisor(struct tty_struct *tty,
1027 case FT2232C: /* FT2232C chip */ 1041 case FT2232C: /* FT2232C chip */
1028 case FT232RL: 1042 case FT232RL:
1029 if (baud <= 3000000) { 1043 if (baud <= 3000000) {
1044 __u16 product_id = le16_to_cpu(
1045 port->serial->dev->descriptor.idProduct);
1046 if (((FTDI_NDI_HUC_PID == product_id) ||
1047 (FTDI_NDI_SPECTRA_SCU_PID == product_id) ||
1048 (FTDI_NDI_FUTURE_2_PID == product_id) ||
1049 (FTDI_NDI_FUTURE_3_PID == product_id) ||
1050 (FTDI_NDI_AURORA_SCU_PID == product_id)) &&
1051 (baud == 19200)) {
1052 baud = 1200000;
1053 }
1030 div_value = ftdi_232bm_baud_to_divisor(baud); 1054 div_value = ftdi_232bm_baud_to_divisor(baud);
1031 } else { 1055 } else {
1032 dbg("%s - Baud rate too high!", __func__); 1056 dbg("%s - Baud rate too high!", __func__);
@@ -1558,6 +1582,39 @@ static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv)
1558} /* ftdi_HE_TIRA1_setup */ 1582} /* ftdi_HE_TIRA1_setup */
1559 1583
1560/* 1584/*
1585 * Module parameter to control latency timer for NDI FTDI-based USB devices.
1586 * If this value is not set in modprobe.conf.local its value will be set to 1ms.
1587 */
1588static int ndi_latency_timer = 1;
1589
1590/* Setup for the NDI FTDI-based USB devices, which requires hardwired
1591 * baudrate (19200 gets mapped to 1200000).
1592 *
1593 * Called from usbserial:serial_probe.
1594 */
1595static int ftdi_NDI_device_setup(struct usb_serial *serial)
1596{
1597 struct usb_device *udev = serial->dev;
1598 int latency = ndi_latency_timer;
1599 int rv = 0;
1600 char buf[1];
1601
1602 if (latency == 0)
1603 latency = 1;
1604 if (latency > 99)
1605 latency = 99;
1606
1607 dbg("%s setting NDI device latency to %d", __func__, latency);
1608 dev_info(&udev->dev, "NDI device with a latency value of %d", latency);
1609
1610 rv = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
1611 FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
1612 FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
1613 latency, 0, buf, 0, WDR_TIMEOUT);
1614 return 0;
1615}
1616
1617/*
1561 * First port on JTAG adaptors such as Olimex arm-usb-ocd or the FIC/OpenMoko 1618 * First port on JTAG adaptors such as Olimex arm-usb-ocd or the FIC/OpenMoko
1562 * Neo1973 Debug Board is reserved for JTAG interface and can be accessed from 1619 * Neo1973 Debug Board is reserved for JTAG interface and can be accessed from
1563 * userspace using openocd. 1620 * userspace using openocd.
@@ -2626,3 +2683,5 @@ MODULE_PARM_DESC(vendor, "User specified vendor ID (default="
2626module_param(product, ushort, 0); 2683module_param(product, ushort, 0);
2627MODULE_PARM_DESC(product, "User specified product ID"); 2684MODULE_PARM_DESC(product, "User specified product ID");
2628 2685
2686module_param(ndi_latency_timer, int, S_IRUGO | S_IWUSR);
2687MODULE_PARM_DESC(ndi_latency_timer, "NDI device latency timer override");
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
index 62f05e66ddac..36dc7cd3499a 100644
--- a/drivers/usb/serial/ftdi_sio.h
+++ b/drivers/usb/serial/ftdi_sio.h
@@ -740,6 +740,15 @@
740#define FTDI_PYRAMID_PID 0xE6C8 /* Pyramid Appliance Display */ 740#define FTDI_PYRAMID_PID 0xE6C8 /* Pyramid Appliance Display */
741 741
742/* 742/*
743 * NDI (www.ndigital.com) product ids
744 */
745#define FTDI_NDI_HUC_PID 0xDA70 /* NDI Host USB Converter */
746#define FTDI_NDI_SPECTRA_SCU_PID 0xDA71 /* NDI Spectra SCU */
747#define FTDI_NDI_FUTURE_2_PID 0xDA72 /* NDI future device #2 */
748#define FTDI_NDI_FUTURE_3_PID 0xDA73 /* NDI future device #3 */
749#define FTDI_NDI_AURORA_SCU_PID 0xDA74 /* NDI Aurora SCU */
750
751/*
743 * Posiflex inc retail equipment (http://www.posiflex.com.tw) 752 * Posiflex inc retail equipment (http://www.posiflex.com.tw)
744 */ 753 */
745#define POSIFLEX_VID 0x0d3a /* Vendor ID */ 754#define POSIFLEX_VID 0x0d3a /* Vendor ID */
@@ -852,9 +861,6 @@
852#define TML_VID 0x1B91 /* Vendor ID */ 861#define TML_VID 0x1B91 /* Vendor ID */
853#define TML_USB_SERIAL_PID 0x0064 /* USB - Serial Converter */ 862#define TML_USB_SERIAL_PID 0x0064 /* USB - Serial Converter */
854 863
855/* NDI Polaris System */
856#define FTDI_NDI_HUC_PID 0xDA70
857
858/* Propox devices */ 864/* Propox devices */
859#define FTDI_PROPOX_JTAGCABLEII_PID 0xD738 865#define FTDI_PROPOX_JTAGCABLEII_PID 0xD738
860 866