]> git.ipfire.org Git - people/arne_f/kernel.git/blobdiff - drivers/usb/serial/ftdi_sio.c
USB: serial: ftdi_sio: add IDs for Xsens Mti USB converter
[people/arne_f/kernel.git] / drivers / usb / serial / ftdi_sio.c
index 1cec03799cdfbb60d369f9f454284110672f1a27..3e2d3a96b559e95135bc9a5cdb9f1804c9b64a32 100644 (file)
@@ -604,6 +604,8 @@ static const struct usb_device_id id_table_combined[] = {
                .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
        { USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLXM_PID),
                .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+       { USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLX_PLUS_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_NT_ORION_IO_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_SYNAPSE_SS200_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX2_PID) },
@@ -706,6 +708,7 @@ static const struct usb_device_id id_table_combined[] = {
        { USB_DEVICE(XSENS_VID, XSENS_AWINDA_STATION_PID) },
        { USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) },
        { USB_DEVICE(XSENS_VID, XSENS_MTDEVBOARD_PID) },
+       { USB_DEVICE(XSENS_VID, XSENS_MTIUSBCONVERTER_PID) },
        { USB_DEVICE(XSENS_VID, XSENS_MTW_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
        { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
@@ -773,6 +776,7 @@ static const struct usb_device_id id_table_combined[] = {
                .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
        { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
        { USB_DEVICE(NOVITUS_VID, NOVITUS_BONO_E_PID) },
+       { USB_DEVICE(FTDI_VID, RTSYSTEMS_USB_VX8_PID) },
        { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S03_PID) },
        { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_59_PID) },
        { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57A_PID) },
@@ -935,6 +939,7 @@ static const struct usb_device_id id_table_combined[] = {
        { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LS_LOGBOOK_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_HS_LOGBOOK_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_CINTERION_MC55I_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_FHE_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) },
        { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID),
                .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
@@ -1015,6 +1020,18 @@ static const struct usb_device_id id_table_combined[] = {
        { USB_DEVICE(WICED_VID, WICED_USB20706V2_PID) },
        { USB_DEVICE(TI_VID, TI_CC3200_LAUNCHPAD_PID),
                .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+       { USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_BT_USB_PID) },
+       { USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_WL_USB_PID) },
+       { USB_DEVICE(AIRBUS_DS_VID, AIRBUS_DS_P8GR) },
+       /* EZPrototypes devices */
+       { USB_DEVICE(EZPROTOTYPES_VID, HJELMSLUND_USB485_ISO_PID) },
+       { USB_DEVICE_INTERFACE_NUMBER(UNJO_VID, UNJO_ISODEBUG_V1_PID, 1) },
+       /* Sienna devices */
+       { USB_DEVICE(FTDI_VID, FTDI_SIENNA_PID) },
+       { USB_DEVICE(ECHELON_VID, ECHELON_U20_PID) },
+       /* U-Blox devices */
+       { USB_DEVICE(UBLOX_VID, UBLOX_C099F9P_ZED_PID) },
+       { USB_DEVICE(UBLOX_VID, UBLOX_C099F9P_ODIN_PID) },
        { }                                     /* Terminating entry */
 };
 
@@ -1897,7 +1914,8 @@ static int ftdi_8u2232c_probe(struct usb_serial *serial)
                return ftdi_jtag_probe(serial);
 
        if (udev->product &&
-               (!strcmp(udev->product, "BeagleBone/XDS100V2") ||
+               (!strcmp(udev->product, "Arrow USB Blaster") ||
+                !strcmp(udev->product, "BeagleBone/XDS100V2") ||
                 !strcmp(udev->product, "SNAP Connect E10")))
                return ftdi_jtag_probe(serial);
 
@@ -2025,12 +2043,11 @@ static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
 #define FTDI_RS_ERR_MASK (FTDI_RS_BI | FTDI_RS_PE | FTDI_RS_FE | FTDI_RS_OE)
 
 static int ftdi_process_packet(struct usb_serial_port *port,
-               struct ftdi_private *priv, char *packet, int len)
+               struct ftdi_private *priv, unsigned char *buf, int len)
 {
+       unsigned char status;
        int i;
-       char status;
        char flag;
-       char *ch;
 
        if (len < 2) {
                dev_dbg(&port->dev, "malformed packet\n");
@@ -2040,7 +2057,7 @@ static int ftdi_process_packet(struct usb_serial_port *port,
        /* Compare new line status to the old one, signal if different/
           N.B. packet may be processed more than once, but differences
           are only processed once.  */
-       status = packet[0] & FTDI_STATUS_B0_MASK;
+       status = buf[0] & FTDI_STATUS_B0_MASK;
        if (status != priv->prev_status) {
                char diff_status = status ^ priv->prev_status;
 
@@ -2066,13 +2083,12 @@ static int ftdi_process_packet(struct usb_serial_port *port,
        }
 
        /* save if the transmitter is empty or not */
-       if (packet[1] & FTDI_RS_TEMT)
+       if (buf[1] & FTDI_RS_TEMT)
                priv->transmit_empty = 1;
        else
                priv->transmit_empty = 0;
 
-       len -= 2;
-       if (!len)
+       if (len == 2)
                return 0;       /* status only */
 
        /*
@@ -2080,40 +2096,41 @@ static int ftdi_process_packet(struct usb_serial_port *port,
         * data payload to avoid over-reporting.
         */
        flag = TTY_NORMAL;
-       if (packet[1] & FTDI_RS_ERR_MASK) {
+       if (buf[1] & FTDI_RS_ERR_MASK) {
                /* Break takes precedence over parity, which takes precedence
                 * over framing errors */
-               if (packet[1] & FTDI_RS_BI) {
+               if (buf[1] & FTDI_RS_BI) {
                        flag = TTY_BREAK;
                        port->icount.brk++;
                        usb_serial_handle_break(port);
-               } else if (packet[1] & FTDI_RS_PE) {
+               } else if (buf[1] & FTDI_RS_PE) {
                        flag = TTY_PARITY;
                        port->icount.parity++;
-               } else if (packet[1] & FTDI_RS_FE) {
+               } else if (buf[1] & FTDI_RS_FE) {
                        flag = TTY_FRAME;
                        port->icount.frame++;
                }
                /* Overrun is special, not associated with a char */
-               if (packet[1] & FTDI_RS_OE) {
+               if (buf[1] & FTDI_RS_OE) {
                        port->icount.overrun++;
                        tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
                }
        }
 
-       port->icount.rx += len;
-       ch = packet + 2;
+       port->icount.rx += len - 2;
 
        if (port->port.console && port->sysrq) {
-               for (i = 0; i < len; i++, ch++) {
-                       if (!usb_serial_handle_sysrq_char(port, *ch))
-                               tty_insert_flip_char(&port->port, *ch, flag);
+               for (i = 2; i < len; i++) {
+                       if (usb_serial_handle_sysrq_char(port, buf[i]))
+                               continue;
+                       tty_insert_flip_char(&port->port, buf[i], flag);
                }
        } else {
-               tty_insert_flip_string_fixed_flag(&port->port, ch, flag, len);
+               tty_insert_flip_string_fixed_flag(&port->port, buf + 2, flag,
+                               len - 2);
        }
 
-       return len;
+       return len - 2;
 }
 
 static void ftdi_process_read_urb(struct urb *urb)