]> Pileus Git - ~andy/linux/blobdiff - drivers/usb/serial/ftdi_sio.c
Merge branches 'acpi-resources', 'acpi-ec' and 'acpi-sleep'
[~andy/linux] / drivers / usb / serial / ftdi_sio.c
index fb0d537435eb221019babe694aafefd25b9e90cc..44ab1298680557f840d243056d7fc4812d7adc0d 100644 (file)
@@ -33,7 +33,6 @@
 
 #include <linux/kernel.h>
 #include <linux/errno.h>
-#include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/tty.h>
 #include <linux/tty_driver.h>
@@ -145,7 +144,7 @@ static struct ftdi_sio_quirk ftdi_8u2232c_quirk = {
  * Device ID not listed? Test it using
  * /sys/bus/usb-serial/drivers/ftdi_sio/new_id and send a patch or report.
  */
-static struct usb_device_id id_table_combined [] = {
+static const struct usb_device_id id_table_combined[] = {
        { USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) },
@@ -153,6 +152,7 @@ static struct usb_device_id id_table_combined [] = {
        { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_EV3CON_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) },
@@ -192,6 +192,8 @@ static struct usb_device_id id_table_combined [] = {
        { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
        { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
+       { USB_DEVICE(FTDI_VID, FTDI_TAGSYS_LP101_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_TAGSYS_P200X_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) },
@@ -905,6 +907,8 @@ static struct usb_device_id id_table_combined [] = {
        /* Crucible Devices */
        { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) },
+       /* Cressi Devices */
+       { USB_DEVICE(FTDI_VID, FTDI_CRESSI_PID) },
        { }                                     /* Terminating entry */
 };
 
@@ -1695,11 +1699,8 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port)
 
 
        priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL);
-       if (!priv) {
-               dev_err(&port->dev, "%s- kmalloc(%Zd) failed.\n", __func__,
-                                       sizeof(struct ftdi_private));
+       if (!priv)
                return -ENOMEM;
-       }
 
        mutex_init(&priv->cfg_lock);
 
@@ -2124,10 +2125,20 @@ static void ftdi_set_termios(struct tty_struct *tty,
        }
 
        /*
-        * All FTDI UART chips are limited to CS7/8. We won't pretend to
+        * All FTDI UART chips are limited to CS7/8. We shouldn't pretend to
         * support CS5/6 and revert the CSIZE setting instead.
+        *
+        * CS5 however is used to control some smartcard readers which abuse
+        * this limitation to switch modes. Original FTDI chips fall back to
+        * eight data bits.
+        *
+        * TODO: Implement a quirk to only allow this with mentioned
+        *       readers. One I know of (Argolis Smartreader V1)
+        *       returns "USB smartcard server" as iInterface string.
+        *       The vendor didn't bother with a custom VID/PID of
+        *       course.
         */
-       if ((C_CSIZE(tty) != CS8) && (C_CSIZE(tty) != CS7)) {
+       if (C_CSIZE(tty) == CS6) {
                dev_warn(ddev, "requested CSIZE setting not supported\n");
 
                termios->c_cflag &= ~CSIZE;
@@ -2174,6 +2185,9 @@ no_skip:
                urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE;
        }
        switch (cflag & CSIZE) {
+       case CS5:
+               dev_dbg(ddev, "Setting CS5 quirk\n");
+               break;
        case CS7:
                urb_value |= 7;
                dev_dbg(ddev, "Setting CS7\n");
@@ -2383,8 +2397,6 @@ static int ftdi_ioctl(struct tty_struct *tty,
 {
        struct usb_serial_port *port = tty->driver_data;
 
-       dev_dbg(&port->dev, "%s cmd 0x%04x\n", __func__, cmd);
-
        /* Based on code from acm.c and others */
        switch (cmd) {
 
@@ -2401,11 +2413,7 @@ static int ftdi_ioctl(struct tty_struct *tty,
        default:
                break;
        }
-       /* This is not necessarily an error - turns out the higher layers
-        * will do some ioctls themselves (see comment above)
-        */
-       dev_dbg(&port->dev, "%s arg not supported - it was 0x%04x - check /usr/include/asm/ioctls.h\n",
-               __func__, cmd);
+
        return -ENOIOCTLCMD;
 }