aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/ftdi_sio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/serial/ftdi_sio.c')
-rw-r--r--drivers/usb/serial/ftdi_sio.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index fb0d537435eb..44ab12986805 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -33,7 +33,6 @@
33 33
34#include <linux/kernel.h> 34#include <linux/kernel.h>
35#include <linux/errno.h> 35#include <linux/errno.h>
36#include <linux/init.h>
37#include <linux/slab.h> 36#include <linux/slab.h>
38#include <linux/tty.h> 37#include <linux/tty.h>
39#include <linux/tty_driver.h> 38#include <linux/tty_driver.h>
@@ -145,7 +144,7 @@ static struct ftdi_sio_quirk ftdi_8u2232c_quirk = {
145 * Device ID not listed? Test it using 144 * Device ID not listed? Test it using
146 * /sys/bus/usb-serial/drivers/ftdi_sio/new_id and send a patch or report. 145 * /sys/bus/usb-serial/drivers/ftdi_sio/new_id and send a patch or report.
147 */ 146 */
148static struct usb_device_id id_table_combined [] = { 147static const struct usb_device_id id_table_combined[] = {
149 { USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) }, 148 { USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) },
150 { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) }, 149 { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) },
151 { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) }, 150 { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) },
@@ -153,6 +152,7 @@ static struct usb_device_id id_table_combined [] = {
153 { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) }, 152 { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) },
154 { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) }, 153 { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) },
155 { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) }, 154 { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) },
155 { USB_DEVICE(FTDI_VID, FTDI_EV3CON_PID) },
156 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) }, 156 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) },
157 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) }, 157 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) },
158 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) }, 158 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) },
@@ -192,6 +192,8 @@ static struct usb_device_id id_table_combined [] = {
192 { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, 192 { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
193 { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, 193 { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
194 { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) }, 194 { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
195 { USB_DEVICE(FTDI_VID, FTDI_TAGSYS_LP101_PID) },
196 { USB_DEVICE(FTDI_VID, FTDI_TAGSYS_P200X_PID) },
195 { USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) }, 197 { USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) },
196 { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) }, 198 { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) },
197 { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) }, 199 { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) },
@@ -905,6 +907,8 @@ static struct usb_device_id id_table_combined [] = {
905 /* Crucible Devices */ 907 /* Crucible Devices */
906 { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) }, 908 { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) },
907 { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) }, 909 { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) },
910 /* Cressi Devices */
911 { USB_DEVICE(FTDI_VID, FTDI_CRESSI_PID) },
908 { } /* Terminating entry */ 912 { } /* Terminating entry */
909}; 913};
910 914
@@ -1695,11 +1699,8 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port)
1695 1699
1696 1700
1697 priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL); 1701 priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL);
1698 if (!priv) { 1702 if (!priv)
1699 dev_err(&port->dev, "%s- kmalloc(%Zd) failed.\n", __func__,
1700 sizeof(struct ftdi_private));
1701 return -ENOMEM; 1703 return -ENOMEM;
1702 }
1703 1704
1704 mutex_init(&priv->cfg_lock); 1705 mutex_init(&priv->cfg_lock);
1705 1706
@@ -2124,10 +2125,20 @@ static void ftdi_set_termios(struct tty_struct *tty,
2124 } 2125 }
2125 2126
2126 /* 2127 /*
2127 * All FTDI UART chips are limited to CS7/8. We won't pretend to 2128 * All FTDI UART chips are limited to CS7/8. We shouldn't pretend to
2128 * support CS5/6 and revert the CSIZE setting instead. 2129 * support CS5/6 and revert the CSIZE setting instead.
2130 *
2131 * CS5 however is used to control some smartcard readers which abuse
2132 * this limitation to switch modes. Original FTDI chips fall back to
2133 * eight data bits.
2134 *
2135 * TODO: Implement a quirk to only allow this with mentioned
2136 * readers. One I know of (Argolis Smartreader V1)
2137 * returns "USB smartcard server" as iInterface string.
2138 * The vendor didn't bother with a custom VID/PID of
2139 * course.
2129 */ 2140 */
2130 if ((C_CSIZE(tty) != CS8) && (C_CSIZE(tty) != CS7)) { 2141 if (C_CSIZE(tty) == CS6) {
2131 dev_warn(ddev, "requested CSIZE setting not supported\n"); 2142 dev_warn(ddev, "requested CSIZE setting not supported\n");
2132 2143
2133 termios->c_cflag &= ~CSIZE; 2144 termios->c_cflag &= ~CSIZE;
@@ -2174,6 +2185,9 @@ no_skip:
2174 urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE; 2185 urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE;
2175 } 2186 }
2176 switch (cflag & CSIZE) { 2187 switch (cflag & CSIZE) {
2188 case CS5:
2189 dev_dbg(ddev, "Setting CS5 quirk\n");
2190 break;
2177 case CS7: 2191 case CS7:
2178 urb_value |= 7; 2192 urb_value |= 7;
2179 dev_dbg(ddev, "Setting CS7\n"); 2193 dev_dbg(ddev, "Setting CS7\n");
@@ -2383,8 +2397,6 @@ static int ftdi_ioctl(struct tty_struct *tty,
2383{ 2397{
2384 struct usb_serial_port *port = tty->driver_data; 2398 struct usb_serial_port *port = tty->driver_data;
2385 2399
2386 dev_dbg(&port->dev, "%s cmd 0x%04x\n", __func__, cmd);
2387
2388 /* Based on code from acm.c and others */ 2400 /* Based on code from acm.c and others */
2389 switch (cmd) { 2401 switch (cmd) {
2390 2402
@@ -2401,11 +2413,7 @@ static int ftdi_ioctl(struct tty_struct *tty,
2401 default: 2413 default:
2402 break; 2414 break;
2403 } 2415 }
2404 /* This is not necessarily an error - turns out the higher layers 2416
2405 * will do some ioctls themselves (see comment above)
2406 */
2407 dev_dbg(&port->dev, "%s arg not supported - it was 0x%04x - check /usr/include/asm/ioctls.h\n",
2408 __func__, cmd);
2409 return -ENOIOCTLCMD; 2417 return -ENOIOCTLCMD;
2410} 2418}
2411 2419