• Linux/drivers/usb/serial/ftdi_sio.c


    Linux/drivers/usb/serial/ftdi_sio.h
    
      1 /*
      2  * Driver definitions for the FTDI USB Single Port Serial Converter -
      3  * known as FTDI_SIO (Serial Input/Output application of the chipset)
      4  *
      5  * For USB vendor/product IDs (VID/PID), please see ftdi_sio_ids.h
      6  *
      7  *
      8  * The example I have is known as the USC-1000 which is available from
      9  * http://www.dse.co.nz - cat no XH4214 It looks similar to this:
     10  * http://www.dansdata.com/usbser.htm but I can't be sure There are other
     11  * USC-1000s which don't look like my device though so beware!
     12  *
     13  * The device is based on the FTDI FT8U100AX chip. It has a DB25 on one side,
     14  * USB on the other.
     15  *
     16  * Thanx to FTDI (http://www.ftdichip.com) for so kindly providing details
     17  * of the protocol required to talk to the device and ongoing assistence
     18  * during development.
     19  *
     20  * Bill Ryder - bryder@sgi.com formerly of Silicon Graphics, Inc.- wrote the
     21  * FTDI_SIO implementation.
     22  *
     23  */
     24 
     25 /* Commands */
     26 #define FTDI_SIO_RESET                  0 /* Reset the port */
     27 #define FTDI_SIO_MODEM_CTRL             1 /* Set the modem control register */
     28 #define FTDI_SIO_SET_FLOW_CTRL          2 /* Set flow control register */
     29 #define FTDI_SIO_SET_BAUD_RATE          3 /* Set baud rate */
     30 #define FTDI_SIO_SET_DATA               4 /* Set the data characteristics of
     31                                              the port */
     32 #define FTDI_SIO_GET_MODEM_STATUS       5 /* Retrieve current value of modem
     33                                              status register */
     34 #define FTDI_SIO_SET_EVENT_CHAR         6 /* Set the event character */
     35 #define FTDI_SIO_SET_ERROR_CHAR         7 /* Set the error character */
     36 #define FTDI_SIO_SET_LATENCY_TIMER      9 /* Set the latency timer */
     37 #define FTDI_SIO_GET_LATENCY_TIMER      10 /* Get the latency timer */
     38 
     39 /* Interface indices for FT2232, FT2232H and FT4232H devices */
     40 #define INTERFACE_A             1
     41 #define INTERFACE_B             2
     42 #define INTERFACE_C             3
     43 #define INTERFACE_D             4
     44 
     45 
     46 /*
     47  *   BmRequestType:  1100 0000b
     48  *   bRequest:       FTDI_E2_READ
     49  *   wValue:         0
     50  *   wIndex:         Address of word to read
     51  *   wLength:        2
     52  *   Data:           Will return a word of data from E2Address
     53  *
     54  */
     55 
     56 /* Port Identifier Table */
     57 #define PIT_DEFAULT             0 /* SIOA */
     58 #define PIT_SIOA                1 /* SIOA */
     59 /* The device this driver is tested with one has only one port */
     60 #define PIT_SIOB                2 /* SIOB */
     61 #define PIT_PARALLEL            3 /* Parallel */
     62 
     63 /* FTDI_SIO_RESET */
     64 #define FTDI_SIO_RESET_REQUEST FTDI_SIO_RESET
     65 #define FTDI_SIO_RESET_REQUEST_TYPE 0x40
     66 #define FTDI_SIO_RESET_SIO 0
     67 #define FTDI_SIO_RESET_PURGE_RX 1
     68 #define FTDI_SIO_RESET_PURGE_TX 2
     69 
     70 /*
     71  * BmRequestType:  0100 0000B
     72  * bRequest:       FTDI_SIO_RESET
     73  * wValue:         Control Value
     74  *                   0 = Reset SIO
     75  *                   1 = Purge RX buffer
     76  *                   2 = Purge TX buffer
     77  * wIndex:         Port
     78  * wLength:        0
     79  * Data:           None
     80  *
     81  * The Reset SIO command has this effect:
     82  *
     83  *    Sets flow control set to 'none'
     84  *    Event char = $0D
     85  *    Event trigger = disabled
     86  *    Purge RX buffer
     87  *    Purge TX buffer
     88  *    Clear DTR
     89  *    Clear RTS
     90  *    baud and data format not reset
     91  *
     92  * The Purge RX and TX buffer commands affect nothing except the buffers
     93  *
     94    */
     95 
     96 /* FTDI_SIO_SET_BAUDRATE */
     97 #define FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE 0x40
     98 #define FTDI_SIO_SET_BAUDRATE_REQUEST 3
     99 
    100 /*
    101  * BmRequestType:  0100 0000B
    102  * bRequest:       FTDI_SIO_SET_BAUDRATE
    103  * wValue:         BaudDivisor value - see below
    104  * wIndex:         Port
    105  * wLength:        0
    106  * Data:           None
    107  * The BaudDivisor values are calculated as follows:
    108  * - BaseClock is either 12000000 or 48000000 depending on the device.
    109  *   FIXME: I wish I knew how to detect old chips to select proper base clock!
    110  * - BaudDivisor is a fixed point number encoded in a funny way.
    111  *   (--WRONG WAY OF THINKING--)
    112  *   BaudDivisor is a fixed point number encoded with following bit weighs:
    113  *   (-2)(-1)(13..0). It is a radical with a denominator of 4, so values
    114  *   end with 0.0 (00...), 0.25 (10...), 0.5 (01...), and 0.75 (11...).
    115  *   (--THE REALITY--)
    116  *   The both-bits-set has quite different meaning from 0.75 - the chip
    117  *   designers have decided it to mean 0.125 instead of 0.75.
    118  *   This info looked up in FTDI application note "FT8U232 DEVICES  Data Rates
    119  *   and Flow Control Consideration for USB to RS232".
    120  * - BaudDivisor = (BaseClock / 16) / BaudRate, where the (=) operation should
    121  *   automagically re-encode the resulting value to take fractions into
    122  *   consideration.
    123  * As all values are integers, some bit twiddling is in order:
    124  *   BaudDivisor = (BaseClock / 16 / BaudRate) |
    125  *   (((BaseClock / 2 / BaudRate) & 4) ? 0x4000    // 0.5
    126  *    : ((BaseClock / 2 / BaudRate) & 2) ? 0x8000  // 0.25
    127  *    : ((BaseClock / 2 / BaudRate) & 1) ? 0xc000  // 0.125
    128  *    : 0)
    129  *
    130  * For the FT232BM, a 17th divisor bit was introduced to encode the multiples
    131  * of 0.125 missing from the FT8U232AM.  Bits 16 to 14 are coded as follows
    132  * (the first four codes are the same as for the FT8U232AM, where bit 16 is
    133  * always 0):
    134  *   000 - add .000 to divisor
    135  *   001 - add .500 to divisor
    136  *   010 - add .250 to divisor
    137  *   011 - add .125 to divisor
    138  *   100 - add .375 to divisor
    139  *   101 - add .625 to divisor
    140  *   110 - add .750 to divisor
    141  *   111 - add .875 to divisor
    142  * Bits 15 to 0 of the 17-bit divisor are placed in the urb value.  Bit 16 is
    143  * placed in bit 0 of the urb index.
    144  *
    145  * Note that there are a couple of special cases to support the highest baud
    146  * rates.  If the calculated divisor value is 1, this needs to be replaced with
    147  * 0.  Additionally for the FT232BM, if the calculated divisor value is 0x4001
    148  * (1.5), this needs to be replaced with 0x0001 (1) (but this divisor value is
    149  * not supported by the FT8U232AM).
    150  */
    151 
    152 enum ftdi_chip_type {
    153         SIO = 1,
    154         FT8U232AM = 2,
    155         FT232BM = 3,
    156         FT2232C = 4,
    157         FT232RL = 5,
    158         FT2232H = 6,
    159         FT4232H = 7,
    160         FT232H  = 8,
    161         FTX     = 9,
    162 };
    163 
    164 enum ftdi_sio_baudrate {
    165         ftdi_sio_b300 = 0,
    166         ftdi_sio_b600 = 1,
    167         ftdi_sio_b1200 = 2,
    168         ftdi_sio_b2400 = 3,
    169         ftdi_sio_b4800 = 4,
    170         ftdi_sio_b9600 = 5,
    171         ftdi_sio_b19200 = 6,
    172         ftdi_sio_b38400 = 7,
    173         ftdi_sio_b57600 = 8,
    174         ftdi_sio_b115200 = 9
    175 };
    176 
    177 /*
    178  * The ftdi_8U232AM_xxMHz_byyy constants have been removed. The encoded divisor
    179  * values are calculated internally.
    180  */
    181 #define FTDI_SIO_SET_DATA_REQUEST       FTDI_SIO_SET_DATA
    182 #define FTDI_SIO_SET_DATA_REQUEST_TYPE  0x40
    183 #define FTDI_SIO_SET_DATA_PARITY_NONE   (0x0 << 8)
    184 #define FTDI_SIO_SET_DATA_PARITY_ODD    (0x1 << 8)
    185 #define FTDI_SIO_SET_DATA_PARITY_EVEN   (0x2 << 8)
    186 #define FTDI_SIO_SET_DATA_PARITY_MARK   (0x3 << 8)
    187 #define FTDI_SIO_SET_DATA_PARITY_SPACE  (0x4 << 8)
    188 #define FTDI_SIO_SET_DATA_STOP_BITS_1   (0x0 << 11)
    189 #define FTDI_SIO_SET_DATA_STOP_BITS_15  (0x1 << 11)
    190 #define FTDI_SIO_SET_DATA_STOP_BITS_2   (0x2 << 11)
    191 #define FTDI_SIO_SET_BREAK              (0x1 << 14)
    192 /* FTDI_SIO_SET_DATA */
    193 
    194 /*
    195  * BmRequestType:  0100 0000B
    196  * bRequest:       FTDI_SIO_SET_DATA
    197  * wValue:         Data characteristics (see below)
    198  * wIndex:         Port
    199  * wLength:        0
    200  * Data:           No
    201  *
    202  * Data characteristics
    203  *
    204  *   B0..7   Number of data bits
    205  *   B8..10  Parity
    206  *           0 = None
    207  *           1 = Odd
    208  *           2 = Even
    209  *           3 = Mark
    210  *           4 = Space
    211  *   B11..13 Stop Bits
    212  *           0 = 1
    213  *           1 = 1.5
    214  *           2 = 2
    215  *   B14
    216  *           1 = TX ON (break)
    217  *           0 = TX OFF (normal state)
    218  *   B15 Reserved
    219  *
    220  */
    221 
    222 
    223 
    224 /* FTDI_SIO_MODEM_CTRL */
    225 #define FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE 0x40
    226 #define FTDI_SIO_SET_MODEM_CTRL_REQUEST FTDI_SIO_MODEM_CTRL
    227 
    228 /*
    229  * BmRequestType:   0100 0000B
    230  * bRequest:        FTDI_SIO_MODEM_CTRL
    231  * wValue:          ControlValue (see below)
    232  * wIndex:          Port
    233  * wLength:         0
    234  * Data:            None
    235  *
    236  * NOTE: If the device is in RTS/CTS flow control, the RTS set by this
    237  * command will be IGNORED without an error being returned
    238  * Also - you can not set DTR and RTS with one control message
    239  */
    240 
    241 #define FTDI_SIO_SET_DTR_MASK 0x1
    242 #define FTDI_SIO_SET_DTR_HIGH (1 | (FTDI_SIO_SET_DTR_MASK  << 8))
    243 #define FTDI_SIO_SET_DTR_LOW  (0 | (FTDI_SIO_SET_DTR_MASK  << 8))
    244 #define FTDI_SIO_SET_RTS_MASK 0x2
    245 #define FTDI_SIO_SET_RTS_HIGH (2 | (FTDI_SIO_SET_RTS_MASK << 8))
    246 #define FTDI_SIO_SET_RTS_LOW (0 | (FTDI_SIO_SET_RTS_MASK << 8))
    247 
    248 /*
    249  * ControlValue
    250  * B0    DTR state
    251  *          0 = reset
    252  *          1 = set
    253  * B1    RTS state
    254  *          0 = reset
    255  *          1 = set
    256  * B2..7 Reserved
    257  * B8    DTR state enable
    258  *          0 = ignore
    259  *          1 = use DTR state
    260  * B9    RTS state enable
    261  *          0 = ignore
    262  *          1 = use RTS state
    263  * B10..15 Reserved
    264  */
    265 
    266 /* FTDI_SIO_SET_FLOW_CTRL */
    267 #define FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE 0x40
    268 #define FTDI_SIO_SET_FLOW_CTRL_REQUEST FTDI_SIO_SET_FLOW_CTRL
    269 #define FTDI_SIO_DISABLE_FLOW_CTRL 0x0
    270 #define FTDI_SIO_RTS_CTS_HS (0x1 << 8)
    271 #define FTDI_SIO_DTR_DSR_HS (0x2 << 8)
    272 #define FTDI_SIO_XON_XOFF_HS (0x4 << 8)
    273 /*
    274  *   BmRequestType:  0100 0000b
    275  *   bRequest:       FTDI_SIO_SET_FLOW_CTRL
    276  *   wValue:         Xoff/Xon
    277  *   wIndex:         Protocol/Port - hIndex is protocol / lIndex is port
    278  *   wLength:        0
    279  *   Data:           None
    280  *
    281  * hIndex protocol is:
    282  *   B0 Output handshaking using RTS/CTS
    283  *       0 = disabled
    284  *       1 = enabled
    285  *   B1 Output handshaking using DTR/DSR
    286  *       0 = disabled
    287  *       1 = enabled
    288  *   B2 Xon/Xoff handshaking
    289  *       0 = disabled
    290  *       1 = enabled
    291  *
    292  * A value of zero in the hIndex field disables handshaking
    293  *
    294  * If Xon/Xoff handshaking is specified, the hValue field should contain the
    295  * XOFF character and the lValue field contains the XON character.
    296  */
    297 
    298 /*
    299  * FTDI_SIO_GET_LATENCY_TIMER
    300  *
    301  * Set the timeout interval. The FTDI collects data from the slave
    302  * device, transmitting it to the host when either A) 62 bytes are
    303  * received, or B) the timeout interval has elapsed and the buffer
    304  * contains at least 1 byte.  Setting this value to a small number
    305  * can dramatically improve performance for applications which send
    306  * small packets, since the default value is 16ms.
    307  */
    308 #define  FTDI_SIO_GET_LATENCY_TIMER_REQUEST FTDI_SIO_GET_LATENCY_TIMER
    309 #define  FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE 0xC0
    310 
    311 /*
    312  *  BmRequestType:   1100 0000b
    313  *  bRequest:        FTDI_SIO_GET_LATENCY_TIMER
    314  *  wValue:          0
    315  *  wIndex:          Port
    316  *  wLength:         0
    317  *  Data:            latency (on return)
    318  */
    319 
    320 /*
    321  * FTDI_SIO_SET_LATENCY_TIMER
    322  *
    323  * Set the timeout interval. The FTDI collects data from the slave
    324  * device, transmitting it to the host when either A) 62 bytes are
    325  * received, or B) the timeout interval has elapsed and the buffer
    326  * contains at least 1 byte.  Setting this value to a small number
    327  * can dramatically improve performance for applications which send
    328  * small packets, since the default value is 16ms.
    329  */
    330 #define  FTDI_SIO_SET_LATENCY_TIMER_REQUEST FTDI_SIO_SET_LATENCY_TIMER
    331 #define  FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE 0x40
    332 
    333 /*
    334  *  BmRequestType:   0100 0000b
    335  *  bRequest:        FTDI_SIO_SET_LATENCY_TIMER
    336  *  wValue:          Latency (milliseconds)
    337  *  wIndex:          Port
    338  *  wLength:         0
    339  *  Data:            None
    340  *
    341  * wValue:
    342  *   B0..7   Latency timer
    343  *   B8..15  0
    344  *
    345  */
    346 
    347 /*
    348  * FTDI_SIO_SET_EVENT_CHAR
    349  *
    350  * Set the special event character for the specified communications port.
    351  * If the device sees this character it will immediately return the
    352  * data read so far - rather than wait 40ms or until 62 bytes are read
    353  * which is what normally happens.
    354  */
    355 
    356 
    357 #define  FTDI_SIO_SET_EVENT_CHAR_REQUEST FTDI_SIO_SET_EVENT_CHAR
    358 #define  FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE 0x40
    359 
    360 
    361 /*
    362  *  BmRequestType:   0100 0000b
    363  *  bRequest:        FTDI_SIO_SET_EVENT_CHAR
    364  *  wValue:          EventChar
    365  *  wIndex:          Port
    366  *  wLength:         0
    367  *  Data:            None
    368  *
    369  * wValue:
    370  *   B0..7   Event Character
    371  *   B8      Event Character Processing
    372  *             0 = disabled
    373  *             1 = enabled
    374  *   B9..15  Reserved
    375  *
    376  */
    377 
    378 /* FTDI_SIO_SET_ERROR_CHAR */
    379 
    380 /*
    381  * Set the parity error replacement character for the specified communications
    382  * port
    383  */
    384 
    385 /*
    386  *  BmRequestType:  0100 0000b
    387  *  bRequest:       FTDI_SIO_SET_EVENT_CHAR
    388  *  wValue:         Error Char
    389  *  wIndex:         Port
    390  *  wLength:        0
    391  *  Data:           None
    392  *
    393  *Error Char
    394  *  B0..7  Error Character
    395  *  B8     Error Character Processing
    396  *           0 = disabled
    397  *           1 = enabled
    398  *  B9..15 Reserved
    399  *
    400  */
    401 
    402 /* FTDI_SIO_GET_MODEM_STATUS */
    403 /* Retrieve the current value of the modem status register */
    404 
    405 #define FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE 0xc0
    406 #define FTDI_SIO_GET_MODEM_STATUS_REQUEST FTDI_SIO_GET_MODEM_STATUS
    407 #define FTDI_SIO_CTS_MASK 0x10
    408 #define FTDI_SIO_DSR_MASK 0x20
    409 #define FTDI_SIO_RI_MASK  0x40
    410 #define FTDI_SIO_RLSD_MASK 0x80
    411 /*
    412  *   BmRequestType:   1100 0000b
    413  *   bRequest:        FTDI_SIO_GET_MODEM_STATUS
    414  *   wValue:          zero
    415  *   wIndex:          Port
    416  *   wLength:         1
    417  *   Data:            Status
    418  *
    419  * One byte of data is returned
    420  * B0..3 0
    421  * B4    CTS
    422  *         0 = inactive
    423  *         1 = active
    424  * B5    DSR
    425  *         0 = inactive
    426  *         1 = active
    427  * B6    Ring Indicator (RI)
    428  *         0 = inactive
    429  *         1 = active
    430  * B7    Receive Line Signal Detect (RLSD)
    431  *         0 = inactive
    432  *         1 = active
    433  */
    434 
    435 
    436 
    437 /* Descriptors returned by the device
    438  *
    439  *  Device Descriptor
    440  *
    441  * Offset       Field           Size    Value   Description
    442  * 0    bLength         1       0x12    Size of descriptor in bytes
    443  * 1    bDescriptorType 1       0x01    DEVICE Descriptor Type
    444  * 2    bcdUSB          2       0x0110  USB Spec Release Number
    445  * 4    bDeviceClass    1       0x00    Class Code
    446  * 5    bDeviceSubClass 1       0x00    SubClass Code
    447  * 6    bDeviceProtocol 1       0x00    Protocol Code
    448  * 7    bMaxPacketSize0 1       0x08    Maximum packet size for endpoint 0
    449  * 8    idVendor        2       0x0403  Vendor ID
    450  * 10   idProduct       2       0x8372  Product ID (FTDI_SIO_PID)
    451  * 12   bcdDevice       2       0x0001  Device release number
    452  * 14   iManufacturer   1       0x01    Index of man. string desc
    453  * 15   iProduct        1       0x02    Index of prod string desc
    454  * 16   iSerialNumber   1       0x02    Index of serial nmr string desc
    455  * 17   bNumConfigurations 1    0x01    Number of possible configurations
    456  *
    457  * Configuration Descriptor
    458  *
    459  * Offset       Field                   Size    Value
    460  * 0    bLength                 1       0x09    Size of descriptor in bytes
    461  * 1    bDescriptorType         1       0x02    CONFIGURATION Descriptor Type
    462  * 2    wTotalLength            2       0x0020  Total length of data
    463  * 4    bNumInterfaces          1       0x01    Number of interfaces supported
    464  * 5    bConfigurationValue     1       0x01    Argument for SetCOnfiguration() req
    465  * 6    iConfiguration          1       0x02    Index of config string descriptor
    466  * 7    bmAttributes            1       0x20    Config characteristics Remote Wakeup
    467  * 8    MaxPower                1       0x1E    Max power consumption
    468  *
    469  * Interface Descriptor
    470  *
    471  * Offset       Field                   Size    Value
    472  * 0    bLength                 1       0x09    Size of descriptor in bytes
    473  * 1    bDescriptorType         1       0x04    INTERFACE Descriptor Type
    474  * 2    bInterfaceNumber        1       0x00    Number of interface
    475  * 3    bAlternateSetting       1       0x00    Value used to select alternate
    476  * 4    bNumEndpoints           1       0x02    Number of endpoints
    477  * 5    bInterfaceClass         1       0xFF    Class Code
    478  * 6    bInterfaceSubClass      1       0xFF    Subclass Code
    479  * 7    bInterfaceProtocol      1       0xFF    Protocol Code
    480  * 8    iInterface              1       0x02    Index of interface string description
    481  *
    482  * IN Endpoint Descriptor
    483  *
    484  * Offset       Field                   Size    Value
    485  * 0    bLength                 1       0x07    Size of descriptor in bytes
    486  * 1    bDescriptorType         1       0x05    ENDPOINT descriptor type
    487  * 2    bEndpointAddress        1       0x82    Address of endpoint
    488  * 3    bmAttributes            1       0x02    Endpoint attributes - Bulk
    489  * 4    bNumEndpoints           2       0x0040  maximum packet size
    490  * 5    bInterval               1       0x00    Interval for polling endpoint
    491  *
    492  * OUT Endpoint Descriptor
    493  *
    494  * Offset       Field                   Size    Value
    495  * 0    bLength                 1       0x07    Size of descriptor in bytes
    496  * 1    bDescriptorType         1       0x05    ENDPOINT descriptor type
    497  * 2    bEndpointAddress        1       0x02    Address of endpoint
    498  * 3    bmAttributes            1       0x02    Endpoint attributes - Bulk
    499  * 4    bNumEndpoints           2       0x0040  maximum packet size
    500  * 5    bInterval               1       0x00    Interval for polling endpoint
    501  *
    502  * DATA FORMAT
    503  *
    504  * IN Endpoint
    505  *
    506  * The device reserves the first two bytes of data on this endpoint to contain
    507  * the current values of the modem and line status registers. In the absence of
    508  * data, the device generates a message consisting of these two status bytes
    509  * every 40 ms
    510  *
    511  * Byte 0: Modem Status
    512  *
    513  * Offset       Description
    514  * B0   Reserved - must be 1
    515  * B1   Reserved - must be 0
    516  * B2   Reserved - must be 0
    517  * B3   Reserved - must be 0
    518  * B4   Clear to Send (CTS)
    519  * B5   Data Set Ready (DSR)
    520  * B6   Ring Indicator (RI)
    521  * B7   Receive Line Signal Detect (RLSD)
    522  *
    523  * Byte 1: Line Status
    524  *
    525  * Offset       Description
    526  * B0   Data Ready (DR)
    527  * B1   Overrun Error (OE)
    528  * B2   Parity Error (PE)
    529  * B3   Framing Error (FE)
    530  * B4   Break Interrupt (BI)
    531  * B5   Transmitter Holding Register (THRE)
    532  * B6   Transmitter Empty (TEMT)
    533  * B7   Error in RCVR FIFO
    534  *
    535  */
    536 #define FTDI_RS0_CTS    (1 << 4)
    537 #define FTDI_RS0_DSR    (1 << 5)
    538 #define FTDI_RS0_RI     (1 << 6)
    539 #define FTDI_RS0_RLSD   (1 << 7)
    540 
    541 #define FTDI_RS_DR      1
    542 #define FTDI_RS_OE      (1<<1)
    543 #define FTDI_RS_PE      (1<<2)
    544 #define FTDI_RS_FE      (1<<3)
    545 #define FTDI_RS_BI      (1<<4)
    546 #define FTDI_RS_THRE    (1<<5)
    547 #define FTDI_RS_TEMT    (1<<6)
    548 #define FTDI_RS_FIFO    (1<<7)
    549 
    550 /*
    551  * OUT Endpoint
    552  *
    553  * This device reserves the first bytes of data on this endpoint contain the
    554  * length and port identifier of the message. For the FTDI USB Serial converter
    555  * the port identifier is always 1.
    556  *
    557  * Byte 0: Line Status
    558  *
    559  * Offset       Description
    560  * B0   Reserved - must be 1
    561  * B1   Reserved - must be 0
    562  * B2..7        Length of message - (not including Byte 0)
    563  *
    564  */
    565 
    Linux/drivers/usb/serial/ftdi_sio_ids.h
    
      1 /*
      2  * vendor/product IDs (VID/PID) of devices using FTDI USB serial converters.
      3  * Please keep numerically sorted within individual areas, thanks!
      4  *
      5  * Philipp Gühring - pg@futureware.at - added the Device ID of the USB relais
      6  * from Rudolf Gugler
      7  *
      8  */
      9 
     10 
     11 /**********************************/
     12 /***** devices using FTDI VID *****/
     13 /**********************************/
     14 
     15 
     16 #define FTDI_VID        0x0403  /* Vendor Id */
     17 
     18 
     19 /*** "original" FTDI device PIDs ***/
     20 
     21 #define FTDI_8U232AM_PID 0x6001 /* Similar device to SIO above */
     22 #define FTDI_8U232AM_ALT_PID 0x6006 /* FTDI's alternate PID for above */
     23 #define FTDI_8U2232C_PID 0x6010 /* Dual channel device */
     24 #define FTDI_4232H_PID 0x6011 /* Quad channel hi-speed device */
     25 #define FTDI_232H_PID  0x6014 /* Single channel hi-speed device */
     26 #define FTDI_FTX_PID   0x6015 /* FT-X series (FT201X, FT230X, FT231X, etc) */
     27 #define FTDI_SIO_PID    0x8372  /* Product Id SIO application of 8U100AX */
     28 #define FTDI_232RL_PID  0xFBFA  /* Product ID for FT232RL */
     29 
     30 
     31 /*** third-party PIDs (using FTDI_VID) ***/
     32 
     33 #define FTDI_LUMEL_PD12_PID     0x6002
     34 
     35 /*
     36  * Marvell OpenRD Base, Client
     37  * http://www.open-rd.org
     38  * OpenRD Base, Client use VID 0x0403
     39  */
     40 #define MARVELL_OPENRD_PID      0x9e90
     41 
     42 /* www.candapter.com Ewert Energy Systems CANdapter device */
     43 #define FTDI_CANDAPTER_PID 0x9F80 /* Product Id */
     44 
     45 #define FTDI_BM_ATOM_NANO_PID   0xa559  /* Basic Micro ATOM Nano USB2Serial */
     46 
     47 /*
     48  * Texas Instruments XDS100v2 JTAG / BeagleBone A3
     49  * http://processors.wiki.ti.com/index.php/XDS100
     50  * http://beagleboard.org/bone
     51  */
     52 #define TI_XDS100V2_PID         0xa6d0
     53 
     54 #define FTDI_NXTCAM_PID         0xABB8 /* NXTCam for Mindstorms NXT */
     55 #define FTDI_EV3CON_PID         0xABB9 /* Mindstorms EV3 Console Adapter */
     56 
     57 /* US Interface Navigator (http://www.usinterface.com/) */
     58 #define FTDI_USINT_CAT_PID      0xb810  /* Navigator CAT and 2nd PTT lines */
     59 #define FTDI_USINT_WKEY_PID     0xb811  /* Navigator WKEY and FSK lines */
     60 #define FTDI_USINT_RS232_PID    0xb812  /* Navigator RS232 and CONFIG lines */
     61 
     62 /* OOCDlink by Joern Kaipf <joernk@web.de>
     63  * (http://www.joernonline.de/) */
     64 #define FTDI_OOCDLINK_PID       0xbaf8  /* Amontec JTAGkey */
     65 
     66 /* Luminary Micro Stellaris Boards, VID = FTDI_VID */
     67 /* FTDI 2332C Dual channel device, side A=245 FIFO (JTAG), Side B=RS232 UART */
     68 #define LMI_LM3S_DEVEL_BOARD_PID        0xbcd8
     69 #define LMI_LM3S_EVAL_BOARD_PID         0xbcd9
     70 #define LMI_LM3S_ICDI_BOARD_PID         0xbcda
     71 
     72 #define FTDI_TURTELIZER_PID     0xBDC8 /* JTAG/RS-232 adapter by egnite GmbH */
     73 
     74 /* OpenDCC (www.opendcc.de) product id */
     75 #define FTDI_OPENDCC_PID        0xBFD8
     76 #define FTDI_OPENDCC_SNIFFER_PID        0xBFD9
     77 #define FTDI_OPENDCC_THROTTLE_PID       0xBFDA
     78 #define FTDI_OPENDCC_GATEWAY_PID        0xBFDB
     79 #define FTDI_OPENDCC_GBM_PID    0xBFDC
     80 #define FTDI_OPENDCC_GBM_BOOST_PID      0xBFDD
     81 
     82 /* NZR SEM 16+ USB (http://www.nzr.de) */
     83 #define FTDI_NZR_SEM_USB_PID    0xC1E0  /* NZR SEM-LOG16+ */
     84 
     85 /*
     86  * RR-CirKits LocoBuffer USB (http://www.rr-cirkits.com)
     87  */
     88 #define FTDI_RRCIRKITS_LOCOBUFFER_PID   0xc7d0  /* LocoBuffer USB */
     89 
     90 /* DMX4ALL DMX Interfaces */
     91 #define FTDI_DMX4ALL 0xC850
     92 
     93 /*
     94  * ASK.fr devices
     95  */
     96 #define FTDI_ASK_RDR400_PID     0xC991  /* ASK RDR 400 series card reader */
     97 
     98 /* www.starting-point-systems.com µChameleon device */
     99 #define FTDI_MICRO_CHAMELEON_PID        0xCAA0  /* Product Id */
    100 
    101 /*
    102  * Tactrix OpenPort (ECU) devices.
    103  * OpenPort 1.3M submitted by Donour Sizemore.
    104  * OpenPort 1.3S and 1.3U submitted by Ian Abbott.
    105  */
    106 #define FTDI_TACTRIX_OPENPORT_13M_PID   0xCC48  /* OpenPort 1.3 Mitsubishi */
    107 #define FTDI_TACTRIX_OPENPORT_13S_PID   0xCC49  /* OpenPort 1.3 Subaru */
    108 #define FTDI_TACTRIX_OPENPORT_13U_PID   0xCC4A  /* OpenPort 1.3 Universal */
    109 
    110 #define FTDI_DISTORTEC_JTAG_LOCK_PICK_PID       0xCFF8
    111 
    112 /* SCS HF Radio Modems PID's (http://www.scs-ptc.com) */
    113 /* the VID is the standard ftdi vid (FTDI_VID) */
    114 #define FTDI_SCS_DEVICE_0_PID 0xD010    /* SCS PTC-IIusb */
    115 #define FTDI_SCS_DEVICE_1_PID 0xD011    /* SCS Tracker / DSP TNC */
    116 #define FTDI_SCS_DEVICE_2_PID 0xD012
    117 #define FTDI_SCS_DEVICE_3_PID 0xD013
    118 #define FTDI_SCS_DEVICE_4_PID 0xD014
    119 #define FTDI_SCS_DEVICE_5_PID 0xD015
    120 #define FTDI_SCS_DEVICE_6_PID 0xD016
    121 #define FTDI_SCS_DEVICE_7_PID 0xD017
    122 
    123 /* iPlus device */
    124 #define FTDI_IPLUS_PID 0xD070 /* Product Id */
    125 #define FTDI_IPLUS2_PID 0xD071 /* Product Id */
    126 
    127 /*
    128  * Gamma Scout (http://gamma-scout.com/). Submitted by rsc@runtux.com.
    129  */
    130 #define FTDI_GAMMA_SCOUT_PID            0xD678  /* Gamma Scout online */
    131 
    132 /* Propox devices */
    133 #define FTDI_PROPOX_JTAGCABLEII_PID     0xD738
    134 #define FTDI_PROPOX_ISPCABLEIII_PID     0xD739
    135 
    136 /* Lenz LI-USB Computer Interface. */
    137 #define FTDI_LENZ_LIUSB_PID     0xD780
    138 
    139 /* Vardaan Enterprises Serial Interface VEUSB422R3 */
    140 #define FTDI_VARDAAN_PID        0xF070
    141 
    142 /*
    143  * Xsens Technologies BV products (http://www.xsens.com).
    144  */
    145 #define XSENS_VID               0x2639
    146 #define XSENS_CONVERTER_PID     0xD00D  /* Xsens USB-serial converter */
    147 #define XSENS_MTW_PID           0x0200  /* Xsens MTw */
    148 #define XSENS_CONVERTER_0_PID   0xD388  /* Xsens USB converter */
    149 #define XSENS_CONVERTER_1_PID   0xD389  /* Xsens Wireless Receiver */
    150 #define XSENS_CONVERTER_2_PID   0xD38A
    151 #define XSENS_CONVERTER_3_PID   0xD38B  /* Xsens USB-serial converter */
    152 #define XSENS_CONVERTER_4_PID   0xD38C  /* Xsens Wireless Receiver */
    153 #define XSENS_CONVERTER_5_PID   0xD38D  /* Xsens Awinda Station */
    154 #define XSENS_CONVERTER_6_PID   0xD38E
    155 #define XSENS_CONVERTER_7_PID   0xD38F
    156 
    157 /**
    158  * Zolix (www.zolix.com.cb) product ids
    159  */
    160 #define FTDI_OMNI1509                   0xD491  /* Omni1509 embedded USB-serial */
    161 
    162 /*
    163  * NDI (www.ndigital.com) product ids
    164  */
    165 #define FTDI_NDI_HUC_PID                0xDA70  /* NDI Host USB Converter */
    166 #define FTDI_NDI_SPECTRA_SCU_PID        0xDA71  /* NDI Spectra SCU */
    167 #define FTDI_NDI_FUTURE_2_PID           0xDA72  /* NDI future device #2 */
    168 #define FTDI_NDI_FUTURE_3_PID           0xDA73  /* NDI future device #3 */
    169 #define FTDI_NDI_AURORA_SCU_PID         0xDA74  /* NDI Aurora SCU */
    170 
    171 /*
    172  * ChamSys Limited (www.chamsys.co.uk) USB wing/interface product IDs
    173  */
    174 #define FTDI_CHAMSYS_24_MASTER_WING_PID        0xDAF8
    175 #define FTDI_CHAMSYS_PC_WING_PID       0xDAF9
    176 #define FTDI_CHAMSYS_USB_DMX_PID       0xDAFA
    177 #define FTDI_CHAMSYS_MIDI_TIMECODE_PID 0xDAFB
    178 #define FTDI_CHAMSYS_MINI_WING_PID     0xDAFC
    179 #define FTDI_CHAMSYS_MAXI_WING_PID     0xDAFD
    180 #define FTDI_CHAMSYS_MEDIA_WING_PID    0xDAFE
    181 #define FTDI_CHAMSYS_WING_PID  0xDAFF
    182 
    183 /*
    184  * Westrex International devices submitted by Cory Lee
    185  */
    186 #define FTDI_WESTREX_MODEL_777_PID      0xDC00  /* Model 777 */
    187 #define FTDI_WESTREX_MODEL_8900F_PID    0xDC01  /* Model 8900F */
    188 
    189 /*
    190  * ACG Identification Technologies GmbH products (http://www.acg.de/).
    191  * Submitted by anton -at- goto10 -dot- org.
    192  */
    193 #define FTDI_ACG_HFDUAL_PID             0xDD20  /* HF Dual ISO Reader (RFID) */
    194 
    195 /*
    196  * Definitions for Artemis astronomical USB based cameras
    197  * Check it at http://www.artemisccd.co.uk/
    198  */
    199 #define FTDI_ARTEMIS_PID        0xDF28  /* All Artemis Cameras */
    200 
    201 /*
    202  * Definitions for ATIK Instruments astronomical USB based cameras
    203  * Check it at http://www.atik-instruments.com/
    204  */
    205 #define FTDI_ATIK_ATK16_PID     0xDF30  /* ATIK ATK-16 Grayscale Camera */
    206 #define FTDI_ATIK_ATK16C_PID    0xDF32  /* ATIK ATK-16C Colour Camera */
    207 #define FTDI_ATIK_ATK16HR_PID   0xDF31  /* ATIK ATK-16HR Grayscale Camera */
    208 #define FTDI_ATIK_ATK16HRC_PID  0xDF33  /* ATIK ATK-16HRC Colour Camera */
    209 #define FTDI_ATIK_ATK16IC_PID   0xDF35  /* ATIK ATK-16IC Grayscale Camera */
    210 
    211 /*
    212  * Yost Engineering, Inc. products (www.yostengineering.com).
    213  * PID 0xE050 submitted by Aaron Prose.
    214  */
    215 #define FTDI_YEI_SERVOCENTER31_PID      0xE050  /* YEI ServoCenter3.1 USB */
    216 
    217 /*
    218  * ELV USB devices submitted by Christian Abt of ELV (www.elv.de).
    219  * Almost all of these devices use FTDI's vendor ID (0x0403).
    220  * Further IDs taken from ELV Windows .inf file.
    221  *
    222  * The previously included PID for the UO 100 module was incorrect.
    223  * In fact, that PID was for ELV's UR 100 USB-RS232 converter (0xFB58).
    224  *
    225  * Armin Laeuger originally sent the PID for the UM 100 module.
    226  */
    227 #define FTDI_ELV_VID    0x1B1F  /* ELV AG */
    228 #define FTDI_ELV_WS300_PID      0xC006  /* eQ3 WS 300 PC II */
    229 #define FTDI_ELV_USR_PID        0xE000  /* ELV Universal-Sound-Recorder */
    230 #define FTDI_ELV_MSM1_PID       0xE001  /* ELV Mini-Sound-Modul */
    231 #define FTDI_ELV_KL100_PID      0xE002  /* ELV Kfz-Leistungsmesser KL 100 */
    232 #define FTDI_ELV_WS550_PID      0xE004  /* WS 550 */
    233 #define FTDI_ELV_EC3000_PID     0xE006  /* ENERGY CONTROL 3000 USB */
    234 #define FTDI_ELV_WS888_PID      0xE008  /* WS 888 */
    235 #define FTDI_ELV_TWS550_PID     0xE009  /* Technoline WS 550 */
    236 #define FTDI_ELV_FEM_PID        0xE00A  /* Funk Energie Monitor */
    237 #define FTDI_ELV_FHZ1300PC_PID  0xE0E8  /* FHZ 1300 PC */
    238 #define FTDI_ELV_WS500_PID      0xE0E9  /* PC-Wetterstation (WS 500) */
    239 #define FTDI_ELV_HS485_PID      0xE0EA  /* USB to RS-485 adapter */
    240 #define FTDI_ELV_UMS100_PID     0xE0EB  /* ELV USB Master-Slave Schaltsteckdose UMS 100 */
    241 #define FTDI_ELV_TFD128_PID     0xE0EC  /* ELV Temperatur-Feuchte-Datenlogger TFD 128 */
    242 #define FTDI_ELV_FM3RX_PID      0xE0ED  /* ELV Messwertuebertragung FM3 RX */
    243 #define FTDI_ELV_WS777_PID      0xE0EE  /* Conrad WS 777 */
    244 #define FTDI_ELV_EM1010PC_PID   0xE0EF  /* Energy monitor EM 1010 PC */
    245 #define FTDI_ELV_CSI8_PID       0xE0F0  /* Computer-Schalt-Interface (CSI 8) */
    246 #define FTDI_ELV_EM1000DL_PID   0xE0F1  /* PC-Datenlogger fuer Energiemonitor (EM 1000 DL) */
    247 #define FTDI_ELV_PCK100_PID     0xE0F2  /* PC-Kabeltester (PCK 100) */
    248 #define FTDI_ELV_RFP500_PID     0xE0F3  /* HF-Leistungsmesser (RFP 500) */
    249 #define FTDI_ELV_FS20SIG_PID    0xE0F4  /* Signalgeber (FS 20 SIG) */
    250 #define FTDI_ELV_UTP8_PID       0xE0F5  /* ELV UTP 8 */
    251 #define FTDI_ELV_WS300PC_PID    0xE0F6  /* PC-Wetterstation (WS 300 PC) */
    252 #define FTDI_ELV_WS444PC_PID    0xE0F7  /* Conrad WS 444 PC */
    253 #define FTDI_PHI_FISCO_PID      0xE40B  /* PHI Fisco USB to Serial cable */
    254 #define FTDI_ELV_UAD8_PID       0xF068  /* USB-AD-Wandler (UAD 8) */
    255 #define FTDI_ELV_UDA7_PID       0xF069  /* USB-DA-Wandler (UDA 7) */
    256 #define FTDI_ELV_USI2_PID       0xF06A  /* USB-Schrittmotoren-Interface (USI 2) */
    257 #define FTDI_ELV_T1100_PID      0xF06B  /* Thermometer (T 1100) */
    258 #define FTDI_ELV_PCD200_PID     0xF06C  /* PC-Datenlogger (PCD 200) */
    259 #define FTDI_ELV_ULA200_PID     0xF06D  /* USB-LCD-Ansteuerung (ULA 200) */
    260 #define FTDI_ELV_ALC8500_PID    0xF06E  /* ALC 8500 Expert */
    261 #define FTDI_ELV_FHZ1000PC_PID  0xF06F  /* FHZ 1000 PC */
    262 #define FTDI_ELV_UR100_PID      0xFB58  /* USB-RS232-Umsetzer (UR 100) */
    263 #define FTDI_ELV_UM100_PID      0xFB5A  /* USB-Modul UM 100 */
    264 #define FTDI_ELV_UO100_PID      0xFB5B  /* USB-Modul UO 100 */
    265 /* Additional ELV PIDs that default to using the FTDI D2XX drivers on
    266  * MS Windows, rather than the FTDI Virtual Com Port drivers.
    267  * Maybe these will be easier to use with the libftdi/libusb user-space
    268  * drivers, or possibly the Comedi drivers in some cases. */
    269 #define FTDI_ELV_CLI7000_PID    0xFB59  /* Computer-Light-Interface (CLI 7000) */
    270 #define FTDI_ELV_PPS7330_PID    0xFB5C  /* Processor-Power-Supply (PPS 7330) */
    271 #define FTDI_ELV_TFM100_PID     0xFB5D  /* Temperatur-Feuchte-Messgeraet (TFM 100) */
    272 #define FTDI_ELV_UDF77_PID      0xFB5E  /* USB DCF Funkuhr (UDF 77) */
    273 #define FTDI_ELV_UIO88_PID      0xFB5F  /* USB-I/O Interface (UIO 88) */
    274 
    275 /*
    276  * EVER Eco Pro UPS (http://www.ever.com.pl/)
    277  */
    278 
    279 #define EVER_ECO_PRO_CDS        0xe520  /* RS-232 converter */
    280 
    281 /*
    282  * Active Robots product ids.
    283  */
    284 #define FTDI_ACTIVE_ROBOTS_PID  0xE548  /* USB comms board */
    285 
    286 /* Pyramid Computer GmbH */
    287 #define FTDI_PYRAMID_PID        0xE6C8  /* Pyramid Appliance Display */
    288 
    289 /* www.elsterelectricity.com Elster Unicom III Optical Probe */
    290 #define FTDI_ELSTER_UNICOM_PID          0xE700 /* Product Id */
    291 
    292 /*
    293  * Gude Analog- und Digitalsysteme GmbH
    294  */
    295 #define FTDI_GUDEADS_E808_PID    0xE808
    296 #define FTDI_GUDEADS_E809_PID    0xE809
    297 #define FTDI_GUDEADS_E80A_PID    0xE80A
    298 #define FTDI_GUDEADS_E80B_PID    0xE80B
    299 #define FTDI_GUDEADS_E80C_PID    0xE80C
    300 #define FTDI_GUDEADS_E80D_PID    0xE80D
    301 #define FTDI_GUDEADS_E80E_PID    0xE80E
    302 #define FTDI_GUDEADS_E80F_PID    0xE80F
    303 #define FTDI_GUDEADS_E888_PID    0xE888  /* Expert ISDN Control USB */
    304 #define FTDI_GUDEADS_E889_PID    0xE889  /* USB RS-232 OptoBridge */
    305 #define FTDI_GUDEADS_E88A_PID    0xE88A
    306 #define FTDI_GUDEADS_E88B_PID    0xE88B
    307 #define FTDI_GUDEADS_E88C_PID    0xE88C
    308 #define FTDI_GUDEADS_E88D_PID    0xE88D
    309 #define FTDI_GUDEADS_E88E_PID    0xE88E
    310 #define FTDI_GUDEADS_E88F_PID    0xE88F
    311 
    312 /*
    313  * Eclo (http://www.eclo.pt/) product IDs.
    314  * PID 0xEA90 submitted by Martin Grill.
    315  */
    316 #define FTDI_ECLO_COM_1WIRE_PID 0xEA90  /* COM to 1-Wire USB adaptor */
    317 
    318 /* TNC-X USB-to-packet-radio adapter, versions prior to 3.0 (DLP module) */
    319 #define FTDI_TNC_X_PID          0xEBE0
    320 
    321 /*
    322  * Teratronik product ids.
    323  * Submitted by O. Wölfelschneider.
    324  */
    325 #define FTDI_TERATRONIK_VCP_PID  0xEC88 /* Teratronik device (preferring VCP driver on windows) */
    326 #define FTDI_TERATRONIK_D2XX_PID 0xEC89 /* Teratronik device (preferring D2XX driver on windows) */
    327 
    328 /* Rig Expert Ukraine devices */
    329 #define FTDI_REU_TINY_PID               0xED22  /* RigExpert Tiny */
    330 
    331 /*
    332  * Hameg HO820 and HO870 interface (using VID 0x0403)
    333  */
    334 #define HAMEG_HO820_PID                 0xed74
    335 #define HAMEG_HO730_PID                 0xed73
    336 #define HAMEG_HO720_PID                 0xed72
    337 #define HAMEG_HO870_PID                 0xed71
    338 
    339 /*
    340  *  MaxStream devices   www.maxstream.net
    341  */
    342 #define FTDI_MAXSTREAM_PID      0xEE18  /* Xbee PKG-U Module */
    343 
    344 /*
    345  * microHAM product IDs (http://www.microham.com).
    346  * Submitted by Justin Burket (KL1RL) <zorton@jtan.com>
    347  * and Mike Studer (K6EEP) <k6eep@hamsoftware.org>.
    348  * Ian Abbott <abbotti@mev.co.uk> added a few more from the driver INF file.
    349  */
    350 #define FTDI_MHAM_KW_PID        0xEEE8  /* USB-KW interface */
    351 #define FTDI_MHAM_YS_PID        0xEEE9  /* USB-YS interface */
    352 #define FTDI_MHAM_Y6_PID        0xEEEA  /* USB-Y6 interface */
    353 #define FTDI_MHAM_Y8_PID        0xEEEB  /* USB-Y8 interface */
    354 #define FTDI_MHAM_IC_PID        0xEEEC  /* USB-IC interface */
    355 #define FTDI_MHAM_DB9_PID       0xEEED  /* USB-DB9 interface */
    356 #define FTDI_MHAM_RS232_PID     0xEEEE  /* USB-RS232 interface */
    357 #define FTDI_MHAM_Y9_PID        0xEEEF  /* USB-Y9 interface */
    358 
    359 /* Domintell products  http://www.domintell.com */
    360 #define FTDI_DOMINTELL_DGQG_PID 0xEF50  /* Master */
    361 #define FTDI_DOMINTELL_DUSB_PID 0xEF51  /* DUSB01 module */
    362 
    363 /*
    364  * The following are the values for the Perle Systems
    365  * UltraPort USB serial converters
    366  */
    367 #define FTDI_PERLE_ULTRAPORT_PID 0xF0C0 /* Perle UltraPort Product Id */
    368 
    369 /* Sprog II (Andrew Crosland's SprogII DCC interface) */
    370 #define FTDI_SPROG_II           0xF0C8
    371 
    372 /*
    373  * Two of the Tagsys RFID Readers
    374  */
    375 #define FTDI_TAGSYS_LP101_PID   0xF0E9  /* Tagsys L-P101 RFID*/
    376 #define FTDI_TAGSYS_P200X_PID   0xF0EE  /* Tagsys Medio P200x RFID*/
    377 
    378 /* an infrared receiver for user access control with IR tags */
    379 #define FTDI_PIEGROUP_PID       0xF208  /* Product Id */
    380 
    381 /* ACT Solutions HomePro ZWave interface
    382    (http://www.act-solutions.com/HomePro-Product-Matrix.html) */
    383 #define FTDI_ACTZWAVE_PID       0xF2D0
    384 
    385 /*
    386  * 4N-GALAXY.DE PIDs for CAN-USB, USB-RS232, USB-RS422, USB-RS485,
    387  * USB-TTY aktiv, USB-TTY passiv.  Some PIDs are used by several devices
    388  * and I'm not entirely sure which are used by which.
    389  */
    390 #define FTDI_4N_GALAXY_DE_1_PID 0xF3C0
    391 #define FTDI_4N_GALAXY_DE_2_PID 0xF3C1
    392 #define FTDI_4N_GALAXY_DE_3_PID 0xF3C2
    393 
    394 /*
    395  * Linx Technologies product ids
    396  */
    397 #define LINX_SDMUSBQSS_PID      0xF448  /* Linx SDM-USB-QS-S */
    398 #define LINX_MASTERDEVEL2_PID   0xF449  /* Linx Master Development 2.0 */
    399 #define LINX_FUTURE_0_PID   0xF44A      /* Linx future device */
    400 #define LINX_FUTURE_1_PID   0xF44B      /* Linx future device */
    401 #define LINX_FUTURE_2_PID   0xF44C      /* Linx future device */
    402 
    403 /*
    404  * Oceanic product ids
    405  */
    406 #define FTDI_OCEANIC_PID        0xF460  /* Oceanic dive instrument */
    407 
    408 /*
    409  * SUUNTO product ids
    410  */
    411 #define FTDI_SUUNTO_SPORTS_PID  0xF680  /* Suunto Sports instrument */
    412 
    413 /* USB-UIRT - An infrared receiver and transmitter using the 8U232AM chip */
    414 /* http://www.usbuirt.com/ */
    415 #define FTDI_USB_UIRT_PID       0xF850  /* Product Id */
    416 
    417 /* CCS Inc. ICDU/ICDU40 product ID -
    418  * the FT232BM is used in an in-circuit-debugger unit for PIC16's/PIC18's */
    419 #define FTDI_CCSICDU20_0_PID    0xF9D0
    420 #define FTDI_CCSICDU40_1_PID    0xF9D1
    421 #define FTDI_CCSMACHX_2_PID     0xF9D2
    422 #define FTDI_CCSLOAD_N_GO_3_PID 0xF9D3
    423 #define FTDI_CCSICDU64_4_PID    0xF9D4
    424 #define FTDI_CCSPRIME8_5_PID    0xF9D5
    425 
    426 /*
    427  * The following are the values for the Matrix Orbital LCD displays,
    428  * which are the FT232BM ( similar to the 8U232AM )
    429  */
    430 #define FTDI_MTXORB_0_PID      0xFA00  /* Matrix Orbital Product Id */
    431 #define FTDI_MTXORB_1_PID      0xFA01  /* Matrix Orbital Product Id */
    432 #define FTDI_MTXORB_2_PID      0xFA02  /* Matrix Orbital Product Id */
    433 #define FTDI_MTXORB_3_PID      0xFA03  /* Matrix Orbital Product Id */
    434 #define FTDI_MTXORB_4_PID      0xFA04  /* Matrix Orbital Product Id */
    435 #define FTDI_MTXORB_5_PID      0xFA05  /* Matrix Orbital Product Id */
    436 #define FTDI_MTXORB_6_PID      0xFA06  /* Matrix Orbital Product Id */
    437 
    438 /*
    439  * Home Electronics (www.home-electro.com) USB gadgets
    440  */
    441 #define FTDI_HE_TIRA1_PID       0xFA78  /* Tira-1 IR transceiver */
    442 
    443 /* Inside Accesso contactless reader (http://www.insidecontactless.com/) */
    444 #define INSIDE_ACCESSO          0xFAD0
    445 
    446 /*
    447  * ThorLabs USB motor drivers
    448  */
    449 #define FTDI_THORLABS_PID               0xfaf0 /* ThorLabs USB motor drivers */
    450 
    451 /*
    452  * Protego product ids
    453  */
    454 #define PROTEGO_SPECIAL_1       0xFC70  /* special/unknown device */
    455 #define PROTEGO_R2X0            0xFC71  /* R200-USB TRNG unit (R210, R220, and R230) */
    456 #define PROTEGO_SPECIAL_3       0xFC72  /* special/unknown device */
    457 #define PROTEGO_SPECIAL_4       0xFC73  /* special/unknown device */
    458 
    459 /*
    460  * Sony Ericsson product ids
    461  */
    462 #define FTDI_DSS20_PID          0xFC82  /* DSS-20 Sync Station for Sony Ericsson P800 */
    463 #define FTDI_URBAN_0_PID        0xFC8A  /* Sony Ericsson Urban, uart #0 */
    464 #define FTDI_URBAN_1_PID        0xFC8B  /* Sony Ericsson Urban, uart #1 */
    465 
    466 /* www.irtrans.de device */
    467 #define FTDI_IRTRANS_PID 0xFC60 /* Product Id */
    468 
    469 /*
    470  * RM Michaelides CANview USB (http://www.rmcan.com) (FTDI_VID)
    471  * CAN fieldbus interface adapter, added by port GmbH www.port.de)
    472  * Ian Abbott changed the macro names for consistency.
    473  */
    474 #define FTDI_RM_CANVIEW_PID     0xfd60  /* Product Id */
    475 /* www.thoughttechnology.com/ TT-USB provide with procomp use ftdi_sio */
    476 #define FTDI_TTUSB_PID 0xFF20 /* Product Id */
    477 
    478 #define FTDI_USBX_707_PID 0xF857        /* ADSTech IR Blaster USBX-707 (FTDI_VID) */
    479 
    480 #define FTDI_RELAIS_PID 0xFA10  /* Relais device from Rudolf Gugler */
    481 
    482 /*
    483  * PCDJ use ftdi based dj-controllers. The following PID is
    484  * for their DAC-2 device http://www.pcdjhardware.com/DAC2.asp
    485  * (the VID is the standard ftdi vid (FTDI_VID), PID sent by Wouter Paesen)
    486  */
    487 #define FTDI_PCDJ_DAC2_PID 0xFA88
    488 
    489 #define FTDI_R2000KU_TRUE_RNG   0xFB80  /* R2000KU TRUE RNG (FTDI_VID) */
    490 
    491 /*
    492  * DIEBOLD BCS SE923 (FTDI_VID)
    493  */
    494 #define DIEBOLD_BCS_SE923_PID   0xfb99
    495 
    496 /* www.crystalfontz.com devices
    497  * - thanx for providing free devices for evaluation !
    498  * they use the ftdi chipset for the USB interface
    499  * and the vendor id is the same
    500  */
    501 #define FTDI_XF_632_PID 0xFC08  /* 632: 16x2 Character Display */
    502 #define FTDI_XF_634_PID 0xFC09  /* 634: 20x4 Character Display */
    503 #define FTDI_XF_547_PID 0xFC0A  /* 547: Two line Display */
    504 #define FTDI_XF_633_PID 0xFC0B  /* 633: 16x2 Character Display with Keys */
    505 #define FTDI_XF_631_PID 0xFC0C  /* 631: 20x2 Character Display */
    506 #define FTDI_XF_635_PID 0xFC0D  /* 635: 20x4 Character Display */
    507 #define FTDI_XF_640_PID 0xFC0E  /* 640: Two line Display */
    508 #define FTDI_XF_642_PID 0xFC0F  /* 642: Two line Display */
    509 
    510 /*
    511  * Video Networks Limited / Homechoice in the UK use an ftdi-based device
    512  * for their 1Mb broadband internet service.  The following PID is exhibited
    513  * by the usb device supplied (the VID is the standard ftdi vid (FTDI_VID)
    514  */
    515 #define FTDI_VNHCPCUSB_D_PID 0xfe38 /* Product Id */
    516 
    517 /* AlphaMicro Components AMC-232USB01 device (FTDI_VID) */
    518 #define FTDI_AMC232_PID 0xFF00 /* Product Id */
    519 
    520 /*
    521  * IBS elektronik product ids (FTDI_VID)
    522  * Submitted by Thomas Schleusener
    523  */
    524 #define FTDI_IBS_US485_PID      0xff38  /* IBS US485 (USB<-->RS422/485 interface) */
    525 #define FTDI_IBS_PICPRO_PID     0xff39  /* IBS PIC-Programmer */
    526 #define FTDI_IBS_PCMCIA_PID     0xff3a  /* IBS Card reader for PCMCIA SRAM-cards */
    527 #define FTDI_IBS_PK1_PID        0xff3b  /* IBS PK1 - Particel counter */
    528 #define FTDI_IBS_RS232MON_PID   0xff3c  /* IBS RS232 - Monitor */
    529 #define FTDI_IBS_APP70_PID      0xff3d  /* APP 70 (dust monitoring system) */
    530 #define FTDI_IBS_PEDO_PID       0xff3e  /* IBS PEDO-Modem (RF modem 868.35 MHz) */
    531 #define FTDI_IBS_PROD_PID       0xff3f  /* future device */
    532 /* www.canusb.com Lawicel CANUSB device (FTDI_VID) */
    533 #define FTDI_CANUSB_PID 0xFFA8 /* Product Id */
    534 
    535 /*
    536  * TavIR AVR product ids (FTDI_VID)
    537  */
    538 #define FTDI_TAVIR_STK500_PID   0xFA33  /* STK500 AVR programmer */
    539 
    540 /*
    541  * TIAO product ids (FTDI_VID)
    542  * http://www.tiaowiki.com/w/Main_Page
    543  */
    544 #define FTDI_TIAO_UMPA_PID      0x8a98  /* TIAO/DIYGADGET USB Multi-Protocol Adapter */
    545 
    546 /*
    547  * NovaTech product ids (FTDI_VID)
    548  */
    549 #define FTDI_NT_ORIONLXM_PID    0x7c90  /* OrionLXm Substation Automation Platform */
    550 
    551 
    552 /********************************/
    553 /** third-party VID/PID combos **/
    554 /********************************/
    555 
    556 
    557 
    558 /*
    559  * Atmel STK541
    560  */
    561 #define ATMEL_VID               0x03eb /* Vendor ID */
    562 #define STK541_PID              0x2109 /* Zigbee Controller */
    563 
    564 /*
    565  * Blackfin gnICE JTAG
    566  * http://docs.blackfin.uclinux.org/doku.php?id=hw:jtag:gnice
    567  */
    568 #define ADI_VID                 0x0456
    569 #define ADI_GNICE_PID           0xF000
    570 #define ADI_GNICEPLUS_PID       0xF001
    571 
    572 /*
    573  * Microchip Technology, Inc.
    574  *
    575  * MICROCHIP_VID (0x04D8) and MICROCHIP_USB_BOARD_PID (0x000A) are
    576  * used by single function CDC ACM class based firmware demo
    577  * applications.  The VID/PID has also been used in firmware
    578  * emulating FTDI serial chips by:
    579  * Hornby Elite - Digital Command Control Console
    580  * http://www.hornby.com/hornby-dcc/controllers/
    581  */
    582 #define MICROCHIP_VID           0x04D8
    583 #define MICROCHIP_USB_BOARD_PID 0x000A /* CDC RS-232 Emulation Demo */
    584 
    585 /*
    586  * RATOC REX-USB60F
    587  */
    588 #define RATOC_VENDOR_ID         0x0584
    589 #define RATOC_PRODUCT_ID_USB60F 0xb020
    590 
    591 /*
    592  * Infineon Technologies
    593  */
    594 #define INFINEON_VID            0x058b
    595 #define INFINEON_TRIBOARD_PID   0x0028 /* DAS JTAG TriBoard TC1798 V1.0 */
    596 
    597 /*
    598  * Acton Research Corp.
    599  */
    600 #define ACTON_VID               0x0647  /* Vendor ID */
    601 #define ACTON_SPECTRAPRO_PID    0x0100
    602 
    603 /*
    604  * Contec products (http://www.contec.com)
    605  * Submitted by Daniel Sangorrin
    606  */
    607 #define CONTEC_VID              0x06CE  /* Vendor ID */
    608 #define CONTEC_COM1USBH_PID     0x8311  /* COM-1(USB)H */
    609 
    610 /*
    611  * Mitsubishi Electric Corp. (http://www.meau.com)
    612  * Submitted by Konstantin Holoborodko
    613  */
    614 #define MITSUBISHI_VID          0x06D3
    615 #define MITSUBISHI_FXUSB_PID    0x0284 /* USB/RS422 converters: FX-USB-AW/-BD */
    616 
    617 /*
    618  * Definitions for B&B Electronics products.
    619  */
    620 #define BANDB_VID               0x0856  /* B&B Electronics Vendor ID */
    621 #define BANDB_USOTL4_PID        0xAC01  /* USOTL4 Isolated RS-485 Converter */
    622 #define BANDB_USTL4_PID         0xAC02  /* USTL4 RS-485 Converter */
    623 #define BANDB_USO9ML2_PID       0xAC03  /* USO9ML2 Isolated RS-232 Converter */
    624 #define BANDB_USOPTL4_PID       0xAC11
    625 #define BANDB_USPTL4_PID        0xAC12
    626 #define BANDB_USO9ML2DR_2_PID   0xAC16
    627 #define BANDB_USO9ML2DR_PID     0xAC17
    628 #define BANDB_USOPTL4DR2_PID    0xAC18  /* USOPTL4R-2 2-port Isolated RS-232 Converter */
    629 #define BANDB_USOPTL4DR_PID     0xAC19
    630 #define BANDB_485USB9F_2W_PID   0xAC25
    631 #define BANDB_485USB9F_4W_PID   0xAC26
    632 #define BANDB_232USB9M_PID      0xAC27
    633 #define BANDB_485USBTB_2W_PID   0xAC33
    634 #define BANDB_485USBTB_4W_PID   0xAC34
    635 #define BANDB_TTL5USB9M_PID     0xAC49
    636 #define BANDB_TTL3USB9M_PID     0xAC50
    637 #define BANDB_ZZ_PROG1_USB_PID  0xBA02
    638 
    639 /*
    640  * Intrepid Control Systems (http://www.intrepidcs.com/) ValueCAN and NeoVI
    641  */
    642 #define INTREPID_VID            0x093C
    643 #define INTREPID_VALUECAN_PID   0x0601
    644 #define INTREPID_NEOVI_PID      0x0701
    645 
    646 /*
    647  * Definitions for ID TECH (www.idt-net.com) devices
    648  */
    649 #define IDTECH_VID              0x0ACD  /* ID TECH Vendor ID */
    650 #define IDTECH_IDT1221U_PID     0x0300  /* IDT1221U USB to RS-232 adapter */
    651 
    652 /*
    653  * Definitions for Omnidirectional Control Technology, Inc. devices
    654  */
    655 #define OCT_VID                 0x0B39  /* OCT vendor ID */
    656 /* Note: OCT US101 is also rebadged as Dick Smith Electronics (NZ) XH6381 */
    657 /* Also rebadged as Dick Smith Electronics (Aus) XH6451 */
    658 /* Also rebadged as SIIG Inc. model US2308 hardware version 1 */
    659 #define OCT_DK201_PID           0x0103  /* OCT DK201 USB docking station */
    660 #define OCT_US101_PID           0x0421  /* OCT US101 USB to RS-232 */
    661 
    662 /*
    663  * Definitions for Icom Inc. devices
    664  */
    665 #define ICOM_VID                0x0C26 /* Icom vendor ID */
    666 /* Note: ID-1 is a communications tranceiver for HAM-radio operators */
    667 #define ICOM_ID_1_PID           0x0004 /* ID-1 USB to RS-232 */
    668 /* Note: OPC is an Optional cable to connect an Icom Tranceiver */
    669 #define ICOM_OPC_U_UC_PID       0x0018 /* OPC-478UC, OPC-1122U cloning cable */
    670 /* Note: ID-RP* devices are Icom Repeater Devices for HAM-radio */
    671 #define ICOM_ID_RP2C1_PID       0x0009 /* ID-RP2C Asset 1 to RS-232 */
    672 #define ICOM_ID_RP2C2_PID       0x000A /* ID-RP2C Asset 2 to RS-232 */
    673 #define ICOM_ID_RP2D_PID        0x000B /* ID-RP2D configuration port*/
    674 #define ICOM_ID_RP2VT_PID       0x000C /* ID-RP2V Transmit config port */
    675 #define ICOM_ID_RP2VR_PID       0x000D /* ID-RP2V Receive config port */
    676 #define ICOM_ID_RP4KVT_PID      0x0010 /* ID-RP4000V Transmit config port */
    677 #define ICOM_ID_RP4KVR_PID      0x0011 /* ID-RP4000V Receive config port */
    678 #define ICOM_ID_RP2KVT_PID      0x0012 /* ID-RP2000V Transmit config port */
    679 #define ICOM_ID_RP2KVR_PID      0x0013 /* ID-RP2000V Receive config port */
    680 
    681 /*
    682  * GN Otometrics (http://www.otometrics.com)
    683  * Submitted by Ville Sundberg.
    684  */
    685 #define GN_OTOMETRICS_VID       0x0c33  /* Vendor ID */
    686 #define AURICAL_USB_PID         0x0010  /* Aurical USB Audiometer */
    687 
    688 /*
    689  * The following are the values for the Sealevel SeaLINK+ adapters.
    690  * (Original list sent by Tuan Hoang.  Ian Abbott renamed the macros and
    691  * removed some PIDs that don't seem to match any existing products.)
    692  */
    693 #define SEALEVEL_VID            0x0c52  /* Sealevel Vendor ID */
    694 #define SEALEVEL_2101_PID       0x2101  /* SeaLINK+232 (2101/2105) */
    695 #define SEALEVEL_2102_PID       0x2102  /* SeaLINK+485 (2102) */
    696 #define SEALEVEL_2103_PID       0x2103  /* SeaLINK+232I (2103) */
    697 #define SEALEVEL_2104_PID       0x2104  /* SeaLINK+485I (2104) */
    698 #define SEALEVEL_2106_PID       0x9020  /* SeaLINK+422 (2106) */
    699 #define SEALEVEL_2201_1_PID     0x2211  /* SeaPORT+2/232 (2201) Port 1 */
    700 #define SEALEVEL_2201_2_PID     0x2221  /* SeaPORT+2/232 (2201) Port 2 */
    701 #define SEALEVEL_2202_1_PID     0x2212  /* SeaPORT+2/485 (2202) Port 1 */
    702 #define SEALEVEL_2202_2_PID     0x2222  /* SeaPORT+2/485 (2202) Port 2 */
    703 #define SEALEVEL_2203_1_PID     0x2213  /* SeaPORT+2 (2203) Port 1 */
    704 #define SEALEVEL_2203_2_PID     0x2223  /* SeaPORT+2 (2203) Port 2 */
    705 #define SEALEVEL_2401_1_PID     0x2411  /* SeaPORT+4/232 (2401) Port 1 */
    706 #define SEALEVEL_2401_2_PID     0x2421  /* SeaPORT+4/232 (2401) Port 2 */
    707 #define SEALEVEL_2401_3_PID     0x2431  /* SeaPORT+4/232 (2401) Port 3 */
    708 #define SEALEVEL_2401_4_PID     0x2441  /* SeaPORT+4/232 (2401) Port 4 */
    709 #define SEALEVEL_2402_1_PID     0x2412  /* SeaPORT+4/485 (2402) Port 1 */
    710 #define SEALEVEL_2402_2_PID     0x2422  /* SeaPORT+4/485 (2402) Port 2 */
    711 #define SEALEVEL_2402_3_PID     0x2432  /* SeaPORT+4/485 (2402) Port 3 */
    712 #define SEALEVEL_2402_4_PID     0x2442  /* SeaPORT+4/485 (2402) Port 4 */
    713 #define SEALEVEL_2403_1_PID     0x2413  /* SeaPORT+4 (2403) Port 1 */
    714 #define SEALEVEL_2403_2_PID     0x2423  /* SeaPORT+4 (2403) Port 2 */
    715 #define SEALEVEL_2403_3_PID     0x2433  /* SeaPORT+4 (2403) Port 3 */
    716 #define SEALEVEL_2403_4_PID     0x2443  /* SeaPORT+4 (2403) Port 4 */
    717 #define SEALEVEL_2801_1_PID     0X2811  /* SeaLINK+8/232 (2801) Port 1 */
    718 #define SEALEVEL_2801_2_PID     0X2821  /* SeaLINK+8/232 (2801) Port 2 */
    719 #define SEALEVEL_2801_3_PID     0X2831  /* SeaLINK+8/232 (2801) Port 3 */
    720 #define SEALEVEL_2801_4_PID     0X2841  /* SeaLINK+8/232 (2801) Port 4 */
    721 #define SEALEVEL_2801_5_PID     0X2851  /* SeaLINK+8/232 (2801) Port 5 */
    722 #define SEALEVEL_2801_6_PID     0X2861  /* SeaLINK+8/232 (2801) Port 6 */
    723 #define SEALEVEL_2801_7_PID     0X2871  /* SeaLINK+8/232 (2801) Port 7 */
    724 #define SEALEVEL_2801_8_PID     0X2881  /* SeaLINK+8/232 (2801) Port 8 */
    725 #define SEALEVEL_2802_1_PID     0X2812  /* SeaLINK+8/485 (2802) Port 1 */
    726 #define SEALEVEL_2802_2_PID     0X2822  /* SeaLINK+8/485 (2802) Port 2 */
    727 #define SEALEVEL_2802_3_PID     0X2832  /* SeaLINK+8/485 (2802) Port 3 */
    728 #define SEALEVEL_2802_4_PID     0X2842  /* SeaLINK+8/485 (2802) Port 4 */
    729 #define SEALEVEL_2802_5_PID     0X2852  /* SeaLINK+8/485 (2802) Port 5 */
    730 #define SEALEVEL_2802_6_PID     0X2862  /* SeaLINK+8/485 (2802) Port 6 */
    731 #define SEALEVEL_2802_7_PID     0X2872  /* SeaLINK+8/485 (2802) Port 7 */
    732 #define SEALEVEL_2802_8_PID     0X2882  /* SeaLINK+8/485 (2802) Port 8 */
    733 #define SEALEVEL_2803_1_PID     0X2813  /* SeaLINK+8 (2803) Port 1 */
    734 #define SEALEVEL_2803_2_PID     0X2823  /* SeaLINK+8 (2803) Port 2 */
    735 #define SEALEVEL_2803_3_PID     0X2833  /* SeaLINK+8 (2803) Port 3 */
    736 #define SEALEVEL_2803_4_PID     0X2843  /* SeaLINK+8 (2803) Port 4 */
    737 #define SEALEVEL_2803_5_PID     0X2853  /* SeaLINK+8 (2803) Port 5 */
    738 #define SEALEVEL_2803_6_PID     0X2863  /* SeaLINK+8 (2803) Port 6 */
    739 #define SEALEVEL_2803_7_PID     0X2873  /* SeaLINK+8 (2803) Port 7 */
    740 #define SEALEVEL_2803_8_PID     0X2883  /* SeaLINK+8 (2803) Port 8 */
    741 #define SEALEVEL_2803R_1_PID    0Xa02a  /* SeaLINK+8 (2803-ROHS) Port 1+2 */
    742 #define SEALEVEL_2803R_2_PID    0Xa02b  /* SeaLINK+8 (2803-ROHS) Port 3+4 */
    743 #define SEALEVEL_2803R_3_PID    0Xa02c  /* SeaLINK+8 (2803-ROHS) Port 5+6 */
    744 #define SEALEVEL_2803R_4_PID    0Xa02d  /* SeaLINK+8 (2803-ROHS) Port 7+8 */
    745 
    746 /*
    747  * JETI SPECTROMETER SPECBOS 1201
    748  * http://www.jeti.com/cms/index.php/instruments/other-instruments/specbos-2101
    749  */
    750 #define JETI_VID                0x0c6c
    751 #define JETI_SPC1201_PID        0x04b2
    752 
    753 /*
    754  * FTDI USB UART chips used in construction projects from the
    755  * Elektor Electronics magazine (http://www.elektor.com/)
    756  */
    757 #define ELEKTOR_VID             0x0C7D
    758 #define ELEKTOR_FT323R_PID      0x0005  /* RFID-Reader, issue 09-2006 */
    759 
    760 /*
    761  * Posiflex inc retail equipment (http://www.posiflex.com.tw)
    762  */
    763 #define POSIFLEX_VID            0x0d3a  /* Vendor ID */
    764 #define POSIFLEX_PP7000_PID     0x0300  /* PP-7000II thermal printer */
    765 
    766 /*
    767  * The following are the values for two KOBIL chipcard terminals.
    768  */
    769 #define KOBIL_VID               0x0d46  /* KOBIL Vendor ID */
    770 #define KOBIL_CONV_B1_PID       0x2020  /* KOBIL Konverter for B1 */
    771 #define KOBIL_CONV_KAAN_PID     0x2021  /* KOBIL_Konverter for KAAN */
    772 
    773 #define FTDI_NF_RIC_VID 0x0DCD  /* Vendor Id */
    774 #define FTDI_NF_RIC_PID 0x0001  /* Product Id */
    775 
    776 /*
    777  * Falcom Wireless Communications GmbH
    778  */
    779 #define FALCOM_VID              0x0F94  /* Vendor Id */
    780 #define FALCOM_TWIST_PID        0x0001  /* Falcom Twist USB GPRS modem */
    781 #define FALCOM_SAMBA_PID        0x0005  /* Falcom Samba USB GPRS modem */
    782 
    783 /* Larsen and Brusgaard AltiTrack/USBtrack */
    784 #define LARSENBRUSGAARD_VID             0x0FD8
    785 #define LB_ALTITRACK_PID                0x0001
    786 
    787 /*
    788  * TTi (Thurlby Thandar Instruments)
    789  */
    790 #define TTI_VID                 0x103E  /* Vendor Id */
    791 #define TTI_QL355P_PID          0x03E8  /* TTi QL355P power supply */
    792 
    793 /*
    794  * Newport Cooperation (www.newport.com)
    795  */
    796 #define NEWPORT_VID                     0x104D
    797 #define NEWPORT_AGILIS_PID              0x3000
    798 #define NEWPORT_CONEX_CC_PID            0x3002
    799 #define NEWPORT_CONEX_AGP_PID           0x3006
    800 
    801 /* Interbiometrics USB I/O Board */
    802 /* Developed for Interbiometrics by Rudolf Gugler */
    803 #define INTERBIOMETRICS_VID              0x1209
    804 #define INTERBIOMETRICS_IOBOARD_PID      0x1002
    805 #define INTERBIOMETRICS_MINI_IOBOARD_PID 0x1006
    806 
    807 /*
    808  * Testo products (http://www.testo.com/)
    809  * Submitted by Colin Leroy
    810  */
    811 #define TESTO_VID                       0x128D
    812 #define TESTO_1_PID                     0x0001
    813 #define TESTO_3_PID                     0x0003
    814 
    815 /*
    816  * Mobility Electronics products.
    817  */
    818 #define MOBILITY_VID                    0x1342
    819 #define MOBILITY_USB_SERIAL_PID         0x0202  /* EasiDock USB 200 serial */
    820 
    821 /*
    822  * FIC / OpenMoko, Inc. http://wiki.openmoko.org/wiki/Neo1973_Debug_Board_v3
    823  * Submitted by Harald Welte <laforge@openmoko.org>
    824  */
    825 #define FIC_VID                 0x1457
    826 #define FIC_NEO1973_DEBUG_PID   0x5118
    827 
    828 /* Olimex */
    829 #define OLIMEX_VID                      0x15BA
    830 #define OLIMEX_ARM_USB_OCD_PID          0x0003
    831 #define OLIMEX_ARM_USB_OCD_H_PID        0x002b
    832 
    833 /*
    834  * Telldus Technologies
    835  */
    836 #define TELLDUS_VID                     0x1781  /* Vendor ID */
    837 #define TELLDUS_TELLSTICK_PID           0x0C30  /* RF control dongle 433 MHz using FT232RL */
    838 
    839 /*
    840  * NOVITUS printers
    841  */
    842 #define NOVITUS_VID                     0x1a28
    843 #define NOVITUS_BONO_E_PID              0x6010
    844 
    845 /*
    846  * RT Systems programming cables for various ham radios
    847  */
    848 #define RTSYSTEMS_VID           0x2100  /* Vendor ID */
    849 #define RTSYSTEMS_USB_S03_PID   0x9001  /* RTS-03 USB to Serial Adapter */
    850 #define RTSYSTEMS_USB_59_PID    0x9e50  /* USB-59 USB to 8 pin plug */
    851 #define RTSYSTEMS_USB_57A_PID   0x9e51  /* USB-57A USB to 4pin 3.5mm plug */
    852 #define RTSYSTEMS_USB_57B_PID   0x9e52  /* USB-57B USB to extended 4pin 3.5mm plug */
    853 #define RTSYSTEMS_USB_29A_PID   0x9e53  /* USB-29A USB to 3.5mm stereo plug */
    854 #define RTSYSTEMS_USB_29B_PID   0x9e54  /* USB-29B USB to 6 pin mini din */
    855 #define RTSYSTEMS_USB_29F_PID   0x9e55  /* USB-29F USB to 6 pin modular plug */
    856 #define RTSYSTEMS_USB_62B_PID   0x9e56  /* USB-62B USB to 8 pin mini din plug*/
    857 #define RTSYSTEMS_USB_S01_PID   0x9e57  /* USB-RTS01 USB to 3.5 mm stereo plug*/
    858 #define RTSYSTEMS_USB_63_PID    0x9e58  /* USB-63 USB to 9 pin female*/
    859 #define RTSYSTEMS_USB_29C_PID   0x9e59  /* USB-29C USB to 4 pin modular plug*/
    860 #define RTSYSTEMS_USB_81B_PID   0x9e5A  /* USB-81 USB to 8 pin mini din plug*/
    861 #define RTSYSTEMS_USB_82B_PID   0x9e5B  /* USB-82 USB to 2.5 mm stereo plug*/
    862 #define RTSYSTEMS_USB_K5D_PID   0x9e5C  /* USB-K5D USB to 8 pin modular plug*/
    863 #define RTSYSTEMS_USB_K4Y_PID   0x9e5D  /* USB-K4Y USB to 2.5/3.5 mm plugs*/
    864 #define RTSYSTEMS_USB_K5G_PID   0x9e5E  /* USB-K5G USB to 8 pin modular plug*/
    865 #define RTSYSTEMS_USB_S05_PID   0x9e5F  /* USB-RTS05 USB to 2.5 mm stereo plug*/
    866 #define RTSYSTEMS_USB_60_PID    0x9e60  /* USB-60 USB to 6 pin din*/
    867 #define RTSYSTEMS_USB_61_PID    0x9e61  /* USB-61 USB to 6 pin mini din*/
    868 #define RTSYSTEMS_USB_62_PID    0x9e62  /* USB-62 USB to 8 pin mini din*/
    869 #define RTSYSTEMS_USB_63B_PID   0x9e63  /* USB-63 USB to 9 pin female*/
    870 #define RTSYSTEMS_USB_64_PID    0x9e64  /* USB-64 USB to 9 pin male*/
    871 #define RTSYSTEMS_USB_65_PID    0x9e65  /* USB-65 USB to 9 pin female null modem*/
    872 #define RTSYSTEMS_USB_92_PID    0x9e66  /* USB-92 USB to 12 pin plug*/
    873 #define RTSYSTEMS_USB_92D_PID   0x9e67  /* USB-92D USB to 12 pin plug data*/
    874 #define RTSYSTEMS_USB_W5R_PID   0x9e68  /* USB-W5R USB to 8 pin modular plug*/
    875 #define RTSYSTEMS_USB_A5R_PID   0x9e69  /* USB-A5R USB to 8 pin modular plug*/
    876 #define RTSYSTEMS_USB_PW1_PID   0x9e6A  /* USB-PW1 USB to 8 pin modular plug*/
    877 
    878 /*
    879  * Physik Instrumente
    880  * http://www.physikinstrumente.com/en/products/
    881  */
    882 /* These two devices use the VID of FTDI */
    883 #define PI_C865_PID     0xe0a0  /* PI C-865 Piezomotor Controller */
    884 #define PI_C857_PID     0xe0a1  /* PI Encoder Trigger Box */
    885 
    886 #define PI_VID              0x1a72  /* Vendor ID */
    887 #define PI_C866_PID     0x1000  /* PI C-866 Piezomotor Controller */
    888 #define PI_C663_PID     0x1001  /* PI C-663 Mercury-Step */
    889 #define PI_C725_PID     0x1002  /* PI C-725 Piezomotor Controller */
    890 #define PI_E517_PID     0x1005  /* PI E-517 Digital Piezo Controller Operation Module */
    891 #define PI_C863_PID     0x1007  /* PI C-863 */
    892 #define PI_E861_PID     0x1008  /* PI E-861 Piezomotor Controller */
    893 #define PI_C867_PID     0x1009  /* PI C-867 Piezomotor Controller */
    894 #define PI_E609_PID     0x100D  /* PI E-609 Digital Piezo Controller */
    895 #define PI_E709_PID     0x100E  /* PI E-709 Digital Piezo Controller */
    896 #define PI_100F_PID     0x100F  /* PI Digital Piezo Controller */
    897 #define PI_1011_PID     0x1011  /* PI Digital Piezo Controller */
    898 #define PI_1012_PID     0x1012  /* PI Motion Controller */
    899 #define PI_1013_PID     0x1013  /* PI Motion Controller */
    900 #define PI_1014_PID     0x1014  /* PI Device */
    901 #define PI_1015_PID     0x1015  /* PI Device */
    902 #define PI_1016_PID     0x1016  /* PI Digital Servo Module */
    903 
    904 /*
    905  * Kondo Kagaku Co.Ltd.
    906  * http://www.kondo-robot.com/EN
    907  */
    908 #define KONDO_VID               0x165c
    909 #define KONDO_USB_SERIAL_PID    0x0002
    910 
    911 /*
    912  * Bayer Ascensia Contour blood glucose meter USB-converter cable.
    913  * http://winglucofacts.com/cables/
    914  */
    915 #define BAYER_VID                      0x1A79
    916 #define BAYER_CONTOUR_CABLE_PID        0x6001
    917 
    918 /*
    919  * The following are the values for the Matrix Orbital FTDI Range
    920  * Anything in this range will use an FT232RL.
    921  */
    922 #define MTXORB_VID                      0x1B3D
    923 #define MTXORB_FTDI_RANGE_0100_PID      0x0100
    924 #define MTXORB_FTDI_RANGE_0101_PID      0x0101
    925 #define MTXORB_FTDI_RANGE_0102_PID      0x0102
    926 #define MTXORB_FTDI_RANGE_0103_PID      0x0103
    927 #define MTXORB_FTDI_RANGE_0104_PID      0x0104
    928 #define MTXORB_FTDI_RANGE_0105_PID      0x0105
    929 #define MTXORB_FTDI_RANGE_0106_PID      0x0106
    930 #define MTXORB_FTDI_RANGE_0107_PID      0x0107
    931 #define MTXORB_FTDI_RANGE_0108_PID      0x0108
    932 #define MTXORB_FTDI_RANGE_0109_PID      0x0109
    933 #define MTXORB_FTDI_RANGE_010A_PID      0x010A
    934 #define MTXORB_FTDI_RANGE_010B_PID      0x010B
    935 #define MTXORB_FTDI_RANGE_010C_PID      0x010C
    936 #define MTXORB_FTDI_RANGE_010D_PID      0x010D
    937 #define MTXORB_FTDI_RANGE_010E_PID      0x010E
    938 #define MTXORB_FTDI_RANGE_010F_PID      0x010F
    939 #define MTXORB_FTDI_RANGE_0110_PID      0x0110
    940 #define MTXORB_FTDI_RANGE_0111_PID      0x0111
    941 #define MTXORB_FTDI_RANGE_0112_PID      0x0112
    942 #define MTXORB_FTDI_RANGE_0113_PID      0x0113
    943 #define MTXORB_FTDI_RANGE_0114_PID      0x0114
    944 #define MTXORB_FTDI_RANGE_0115_PID      0x0115
    945 #define MTXORB_FTDI_RANGE_0116_PID      0x0116
    946 #define MTXORB_FTDI_RANGE_0117_PID      0x0117
    947 #define MTXORB_FTDI_RANGE_0118_PID      0x0118
    948 #define MTXORB_FTDI_RANGE_0119_PID      0x0119
    949 #define MTXORB_FTDI_RANGE_011A_PID      0x011A
    950 #define MTXORB_FTDI_RANGE_011B_PID      0x011B
    951 #define MTXORB_FTDI_RANGE_011C_PID      0x011C
    952 #define MTXORB_FTDI_RANGE_011D_PID      0x011D
    953 #define MTXORB_FTDI_RANGE_011E_PID      0x011E
    954 #define MTXORB_FTDI_RANGE_011F_PID      0x011F
    955 #define MTXORB_FTDI_RANGE_0120_PID      0x0120
    956 #define MTXORB_FTDI_RANGE_0121_PID      0x0121
    957 #define MTXORB_FTDI_RANGE_0122_PID      0x0122
    958 #define MTXORB_FTDI_RANGE_0123_PID      0x0123
    959 #define MTXORB_FTDI_RANGE_0124_PID      0x0124
    960 #define MTXORB_FTDI_RANGE_0125_PID      0x0125
    961 #define MTXORB_FTDI_RANGE_0126_PID      0x0126
    962 #define MTXORB_FTDI_RANGE_0127_PID      0x0127
    963 #define MTXORB_FTDI_RANGE_0128_PID      0x0128
    964 #define MTXORB_FTDI_RANGE_0129_PID      0x0129
    965 #define MTXORB_FTDI_RANGE_012A_PID      0x012A
    966 #define MTXORB_FTDI_RANGE_012B_PID      0x012B
    967 #define MTXORB_FTDI_RANGE_012C_PID      0x012C
    968 #define MTXORB_FTDI_RANGE_012D_PID      0x012D
    969 #define MTXORB_FTDI_RANGE_012E_PID      0x012E
    970 #define MTXORB_FTDI_RANGE_012F_PID      0x012F
    971 #define MTXORB_FTDI_RANGE_0130_PID      0x0130
    972 #define MTXORB_FTDI_RANGE_0131_PID      0x0131
    973 #define MTXORB_FTDI_RANGE_0132_PID      0x0132
    974 #define MTXORB_FTDI_RANGE_0133_PID      0x0133
    975 #define MTXORB_FTDI_RANGE_0134_PID      0x0134
    976 #define MTXORB_FTDI_RANGE_0135_PID      0x0135
    977 #define MTXORB_FTDI_RANGE_0136_PID      0x0136
    978 #define MTXORB_FTDI_RANGE_0137_PID      0x0137
    979 #define MTXORB_FTDI_RANGE_0138_PID      0x0138
    980 #define MTXORB_FTDI_RANGE_0139_PID      0x0139
    981 #define MTXORB_FTDI_RANGE_013A_PID      0x013A
    982 #define MTXORB_FTDI_RANGE_013B_PID      0x013B
    983 #define MTXORB_FTDI_RANGE_013C_PID      0x013C
    984 #define MTXORB_FTDI_RANGE_013D_PID      0x013D
    985 #define MTXORB_FTDI_RANGE_013E_PID      0x013E
    986 #define MTXORB_FTDI_RANGE_013F_PID      0x013F
    987 #define MTXORB_FTDI_RANGE_0140_PID      0x0140
    988 #define MTXORB_FTDI_RANGE_0141_PID      0x0141
    989 #define MTXORB_FTDI_RANGE_0142_PID      0x0142
    990 #define MTXORB_FTDI_RANGE_0143_PID      0x0143
    991 #define MTXORB_FTDI_RANGE_0144_PID      0x0144
    992 #define MTXORB_FTDI_RANGE_0145_PID      0x0145
    993 #define MTXORB_FTDI_RANGE_0146_PID      0x0146
    994 #define MTXORB_FTDI_RANGE_0147_PID      0x0147
    995 #define MTXORB_FTDI_RANGE_0148_PID      0x0148
    996 #define MTXORB_FTDI_RANGE_0149_PID      0x0149
    997 #define MTXORB_FTDI_RANGE_014A_PID      0x014A
    998 #define MTXORB_FTDI_RANGE_014B_PID      0x014B
    999 #define MTXORB_FTDI_RANGE_014C_PID      0x014C
    1000 #define MTXORB_FTDI_RANGE_014D_PID      0x014D
    1001 #define MTXORB_FTDI_RANGE_014E_PID      0x014E
    1002 #define MTXORB_FTDI_RANGE_014F_PID      0x014F
    1003 #define MTXORB_FTDI_RANGE_0150_PID      0x0150
    1004 #define MTXORB_FTDI_RANGE_0151_PID      0x0151
    1005 #define MTXORB_FTDI_RANGE_0152_PID      0x0152
    1006 #define MTXORB_FTDI_RANGE_0153_PID      0x0153
    1007 #define MTXORB_FTDI_RANGE_0154_PID      0x0154
    1008 #define MTXORB_FTDI_RANGE_0155_PID      0x0155
    1009 #define MTXORB_FTDI_RANGE_0156_PID      0x0156
    1010 #define MTXORB_FTDI_RANGE_0157_PID      0x0157
    1011 #define MTXORB_FTDI_RANGE_0158_PID      0x0158
    1012 #define MTXORB_FTDI_RANGE_0159_PID      0x0159
    1013 #define MTXORB_FTDI_RANGE_015A_PID      0x015A
    1014 #define MTXORB_FTDI_RANGE_015B_PID      0x015B
    1015 #define MTXORB_FTDI_RANGE_015C_PID      0x015C
    1016 #define MTXORB_FTDI_RANGE_015D_PID      0x015D
    1017 #define MTXORB_FTDI_RANGE_015E_PID      0x015E
    1018 #define MTXORB_FTDI_RANGE_015F_PID      0x015F
    1019 #define MTXORB_FTDI_RANGE_0160_PID      0x0160
    1020 #define MTXORB_FTDI_RANGE_0161_PID      0x0161
    1021 #define MTXORB_FTDI_RANGE_0162_PID      0x0162
    1022 #define MTXORB_FTDI_RANGE_0163_PID      0x0163
    1023 #define MTXORB_FTDI_RANGE_0164_PID      0x0164
    1024 #define MTXORB_FTDI_RANGE_0165_PID      0x0165
    1025 #define MTXORB_FTDI_RANGE_0166_PID      0x0166
    1026 #define MTXORB_FTDI_RANGE_0167_PID      0x0167
    1027 #define MTXORB_FTDI_RANGE_0168_PID      0x0168
    1028 #define MTXORB_FTDI_RANGE_0169_PID      0x0169
    1029 #define MTXORB_FTDI_RANGE_016A_PID      0x016A
    1030 #define MTXORB_FTDI_RANGE_016B_PID      0x016B
    1031 #define MTXORB_FTDI_RANGE_016C_PID      0x016C
    1032 #define MTXORB_FTDI_RANGE_016D_PID      0x016D
    1033 #define MTXORB_FTDI_RANGE_016E_PID      0x016E
    1034 #define MTXORB_FTDI_RANGE_016F_PID      0x016F
    1035 #define MTXORB_FTDI_RANGE_0170_PID      0x0170
    1036 #define MTXORB_FTDI_RANGE_0171_PID      0x0171
    1037 #define MTXORB_FTDI_RANGE_0172_PID      0x0172
    1038 #define MTXORB_FTDI_RANGE_0173_PID      0x0173
    1039 #define MTXORB_FTDI_RANGE_0174_PID      0x0174
    1040 #define MTXORB_FTDI_RANGE_0175_PID      0x0175
    1041 #define MTXORB_FTDI_RANGE_0176_PID      0x0176
    1042 #define MTXORB_FTDI_RANGE_0177_PID      0x0177
    1043 #define MTXORB_FTDI_RANGE_0178_PID      0x0178
    1044 #define MTXORB_FTDI_RANGE_0179_PID      0x0179
    1045 #define MTXORB_FTDI_RANGE_017A_PID      0x017A
    1046 #define MTXORB_FTDI_RANGE_017B_PID      0x017B
    1047 #define MTXORB_FTDI_RANGE_017C_PID      0x017C
    1048 #define MTXORB_FTDI_RANGE_017D_PID      0x017D
    1049 #define MTXORB_FTDI_RANGE_017E_PID      0x017E
    1050 #define MTXORB_FTDI_RANGE_017F_PID      0x017F
    1051 #define MTXORB_FTDI_RANGE_0180_PID      0x0180
    1052 #define MTXORB_FTDI_RANGE_0181_PID      0x0181
    1053 #define MTXORB_FTDI_RANGE_0182_PID      0x0182
    1054 #define MTXORB_FTDI_RANGE_0183_PID      0x0183
    1055 #define MTXORB_FTDI_RANGE_0184_PID      0x0184
    1056 #define MTXORB_FTDI_RANGE_0185_PID      0x0185
    1057 #define MTXORB_FTDI_RANGE_0186_PID      0x0186
    1058 #define MTXORB_FTDI_RANGE_0187_PID      0x0187
    1059 #define MTXORB_FTDI_RANGE_0188_PID      0x0188
    1060 #define MTXORB_FTDI_RANGE_0189_PID      0x0189
    1061 #define MTXORB_FTDI_RANGE_018A_PID      0x018A
    1062 #define MTXORB_FTDI_RANGE_018B_PID      0x018B
    1063 #define MTXORB_FTDI_RANGE_018C_PID      0x018C
    1064 #define MTXORB_FTDI_RANGE_018D_PID      0x018D
    1065 #define MTXORB_FTDI_RANGE_018E_PID      0x018E
    1066 #define MTXORB_FTDI_RANGE_018F_PID      0x018F
    1067 #define MTXORB_FTDI_RANGE_0190_PID      0x0190
    1068 #define MTXORB_FTDI_RANGE_0191_PID      0x0191
    1069 #define MTXORB_FTDI_RANGE_0192_PID      0x0192
    1070 #define MTXORB_FTDI_RANGE_0193_PID      0x0193
    1071 #define MTXORB_FTDI_RANGE_0194_PID      0x0194
    1072 #define MTXORB_FTDI_RANGE_0195_PID      0x0195
    1073 #define MTXORB_FTDI_RANGE_0196_PID      0x0196
    1074 #define MTXORB_FTDI_RANGE_0197_PID      0x0197
    1075 #define MTXORB_FTDI_RANGE_0198_PID      0x0198
    1076 #define MTXORB_FTDI_RANGE_0199_PID      0x0199
    1077 #define MTXORB_FTDI_RANGE_019A_PID      0x019A
    1078 #define MTXORB_FTDI_RANGE_019B_PID      0x019B
    1079 #define MTXORB_FTDI_RANGE_019C_PID      0x019C
    1080 #define MTXORB_FTDI_RANGE_019D_PID      0x019D
    1081 #define MTXORB_FTDI_RANGE_019E_PID      0x019E
    1082 #define MTXORB_FTDI_RANGE_019F_PID      0x019F
    1083 #define MTXORB_FTDI_RANGE_01A0_PID      0x01A0
    1084 #define MTXORB_FTDI_RANGE_01A1_PID      0x01A1
    1085 #define MTXORB_FTDI_RANGE_01A2_PID      0x01A2
    1086 #define MTXORB_FTDI_RANGE_01A3_PID      0x01A3
    1087 #define MTXORB_FTDI_RANGE_01A4_PID      0x01A4
    1088 #define MTXORB_FTDI_RANGE_01A5_PID      0x01A5
    1089 #define MTXORB_FTDI_RANGE_01A6_PID      0x01A6
    1090 #define MTXORB_FTDI_RANGE_01A7_PID      0x01A7
    1091 #define MTXORB_FTDI_RANGE_01A8_PID      0x01A8
    1092 #define MTXORB_FTDI_RANGE_01A9_PID      0x01A9
    1093 #define MTXORB_FTDI_RANGE_01AA_PID      0x01AA
    1094 #define MTXORB_FTDI_RANGE_01AB_PID      0x01AB
    1095 #define MTXORB_FTDI_RANGE_01AC_PID      0x01AC
    1096 #define MTXORB_FTDI_RANGE_01AD_PID      0x01AD
    1097 #define MTXORB_FTDI_RANGE_01AE_PID      0x01AE
    1098 #define MTXORB_FTDI_RANGE_01AF_PID      0x01AF
    1099 #define MTXORB_FTDI_RANGE_01B0_PID      0x01B0
    1100 #define MTXORB_FTDI_RANGE_01B1_PID      0x01B1
    1101 #define MTXORB_FTDI_RANGE_01B2_PID      0x01B2
    1102 #define MTXORB_FTDI_RANGE_01B3_PID      0x01B3
    1103 #define MTXORB_FTDI_RANGE_01B4_PID      0x01B4
    1104 #define MTXORB_FTDI_RANGE_01B5_PID      0x01B5
    1105 #define MTXORB_FTDI_RANGE_01B6_PID      0x01B6
    1106 #define MTXORB_FTDI_RANGE_01B7_PID      0x01B7
    1107 #define MTXORB_FTDI_RANGE_01B8_PID      0x01B8
    1108 #define MTXORB_FTDI_RANGE_01B9_PID      0x01B9
    1109 #define MTXORB_FTDI_RANGE_01BA_PID      0x01BA
    1110 #define MTXORB_FTDI_RANGE_01BB_PID      0x01BB
    1111 #define MTXORB_FTDI_RANGE_01BC_PID      0x01BC
    1112 #define MTXORB_FTDI_RANGE_01BD_PID      0x01BD
    1113 #define MTXORB_FTDI_RANGE_01BE_PID      0x01BE
    1114 #define MTXORB_FTDI_RANGE_01BF_PID      0x01BF
    1115 #define MTXORB_FTDI_RANGE_01C0_PID      0x01C0
    1116 #define MTXORB_FTDI_RANGE_01C1_PID      0x01C1
    1117 #define MTXORB_FTDI_RANGE_01C2_PID      0x01C2
    1118 #define MTXORB_FTDI_RANGE_01C3_PID      0x01C3
    1119 #define MTXORB_FTDI_RANGE_01C4_PID      0x01C4
    1120 #define MTXORB_FTDI_RANGE_01C5_PID      0x01C5
    1121 #define MTXORB_FTDI_RANGE_01C6_PID      0x01C6
    1122 #define MTXORB_FTDI_RANGE_01C7_PID      0x01C7
    1123 #define MTXORB_FTDI_RANGE_01C8_PID      0x01C8
    1124 #define MTXORB_FTDI_RANGE_01C9_PID      0x01C9
    1125 #define MTXORB_FTDI_RANGE_01CA_PID      0x01CA
    1126 #define MTXORB_FTDI_RANGE_01CB_PID      0x01CB
    1127 #define MTXORB_FTDI_RANGE_01CC_PID      0x01CC
    1128 #define MTXORB_FTDI_RANGE_01CD_PID      0x01CD
    1129 #define MTXORB_FTDI_RANGE_01CE_PID      0x01CE
    1130 #define MTXORB_FTDI_RANGE_01CF_PID      0x01CF
    1131 #define MTXORB_FTDI_RANGE_01D0_PID      0x01D0
    1132 #define MTXORB_FTDI_RANGE_01D1_PID      0x01D1
    1133 #define MTXORB_FTDI_RANGE_01D2_PID      0x01D2
    1134 #define MTXORB_FTDI_RANGE_01D3_PID      0x01D3
    1135 #define MTXORB_FTDI_RANGE_01D4_PID      0x01D4
    1136 #define MTXORB_FTDI_RANGE_01D5_PID      0x01D5
    1137 #define MTXORB_FTDI_RANGE_01D6_PID      0x01D6
    1138 #define MTXORB_FTDI_RANGE_01D7_PID      0x01D7
    1139 #define MTXORB_FTDI_RANGE_01D8_PID      0x01D8
    1140 #define MTXORB_FTDI_RANGE_01D9_PID      0x01D9
    1141 #define MTXORB_FTDI_RANGE_01DA_PID      0x01DA
    1142 #define MTXORB_FTDI_RANGE_01DB_PID      0x01DB
    1143 #define MTXORB_FTDI_RANGE_01DC_PID      0x01DC
    1144 #define MTXORB_FTDI_RANGE_01DD_PID      0x01DD
    1145 #define MTXORB_FTDI_RANGE_01DE_PID      0x01DE
    1146 #define MTXORB_FTDI_RANGE_01DF_PID      0x01DF
    1147 #define MTXORB_FTDI_RANGE_01E0_PID      0x01E0
    1148 #define MTXORB_FTDI_RANGE_01E1_PID      0x01E1
    1149 #define MTXORB_FTDI_RANGE_01E2_PID      0x01E2
    1150 #define MTXORB_FTDI_RANGE_01E3_PID      0x01E3
    1151 #define MTXORB_FTDI_RANGE_01E4_PID      0x01E4
    1152 #define MTXORB_FTDI_RANGE_01E5_PID      0x01E5
    1153 #define MTXORB_FTDI_RANGE_01E6_PID      0x01E6
    1154 #define MTXORB_FTDI_RANGE_01E7_PID      0x01E7
    1155 #define MTXORB_FTDI_RANGE_01E8_PID      0x01E8
    1156 #define MTXORB_FTDI_RANGE_01E9_PID      0x01E9
    1157 #define MTXORB_FTDI_RANGE_01EA_PID      0x01EA
    1158 #define MTXORB_FTDI_RANGE_01EB_PID      0x01EB
    1159 #define MTXORB_FTDI_RANGE_01EC_PID      0x01EC
    1160 #define MTXORB_FTDI_RANGE_01ED_PID      0x01ED
    1161 #define MTXORB_FTDI_RANGE_01EE_PID      0x01EE
    1162 #define MTXORB_FTDI_RANGE_01EF_PID      0x01EF
    1163 #define MTXORB_FTDI_RANGE_01F0_PID      0x01F0
    1164 #define MTXORB_FTDI_RANGE_01F1_PID      0x01F1
    1165 #define MTXORB_FTDI_RANGE_01F2_PID      0x01F2
    1166 #define MTXORB_FTDI_RANGE_01F3_PID      0x01F3
    1167 #define MTXORB_FTDI_RANGE_01F4_PID      0x01F4
    1168 #define MTXORB_FTDI_RANGE_01F5_PID      0x01F5
    1169 #define MTXORB_FTDI_RANGE_01F6_PID      0x01F6
    1170 #define MTXORB_FTDI_RANGE_01F7_PID      0x01F7
    1171 #define MTXORB_FTDI_RANGE_01F8_PID      0x01F8
    1172 #define MTXORB_FTDI_RANGE_01F9_PID      0x01F9
    1173 #define MTXORB_FTDI_RANGE_01FA_PID      0x01FA
    1174 #define MTXORB_FTDI_RANGE_01FB_PID      0x01FB
    1175 #define MTXORB_FTDI_RANGE_01FC_PID      0x01FC
    1176 #define MTXORB_FTDI_RANGE_01FD_PID      0x01FD
    1177 #define MTXORB_FTDI_RANGE_01FE_PID      0x01FE
    1178 #define MTXORB_FTDI_RANGE_01FF_PID      0x01FF
    1179 
    1180 
    1181 
    1182 /*
    1183  * The Mobility Lab (TML)
    1184  * Submitted by Pierre Castella
    1185  */
    1186 #define TML_VID                 0x1B91  /* Vendor ID */
    1187 #define TML_USB_SERIAL_PID      0x0064  /* USB - Serial Converter */
    1188 
    1189 /* Alti-2 products  http://www.alti-2.com */
    1190 #define ALTI2_VID       0x1BC9
    1191 #define ALTI2_N3_PID    0x6001  /* Neptune 3 */
    1192 
    1193 /*
    1194  * Ionics PlugComputer
    1195  */
    1196 #define IONICS_VID                      0x1c0c
    1197 #define IONICS_PLUGCOMPUTER_PID         0x0102
    1198 
    1199 /*
    1200  * Dresden Elektronik Sensor Terminal Board
    1201  */
    1202 #define DE_VID                  0x1cf1 /* Vendor ID */
    1203 #define STB_PID                 0x0001 /* Sensor Terminal Board */
    1204 #define WHT_PID                 0x0004 /* Wireless Handheld Terminal */
    1205 
    1206 /*
    1207  * STMicroelectonics
    1208  */
    1209 #define ST_VID                  0x0483
    1210 #define ST_STMCLT_2232_PID      0x3746
    1211 #define ST_STMCLT_4232_PID      0x3747
    1212 
    1213 /*
    1214  * Papouch products (http://www.papouch.com/)
    1215  * Submitted by Folkert van Heusden
    1216  */
    1217 
    1218 #define PAPOUCH_VID                     0x5050  /* Vendor ID */
    1219 #define PAPOUCH_SB485_PID               0x0100  /* Papouch SB485 USB-485/422 Converter */
    1220 #define PAPOUCH_AP485_PID               0x0101  /* AP485 USB-RS485 Converter */
    1221 #define PAPOUCH_SB422_PID               0x0102  /* Papouch SB422 USB-RS422 Converter  */
    1222 #define PAPOUCH_SB485_2_PID             0x0103  /* Papouch SB485 USB-485/422 Converter */
    1223 #define PAPOUCH_AP485_2_PID             0x0104  /* AP485 USB-RS485 Converter */
    1224 #define PAPOUCH_SB422_2_PID             0x0105  /* Papouch SB422 USB-RS422 Converter  */
    1225 #define PAPOUCH_SB485S_PID              0x0106  /* Papouch SB485S USB-485/422 Converter */
    1226 #define PAPOUCH_SB485C_PID              0x0107  /* Papouch SB485C USB-485/422 Converter */
    1227 #define PAPOUCH_LEC_PID                 0x0300  /* LEC USB Converter */
    1228 #define PAPOUCH_SB232_PID               0x0301  /* Papouch SB232 USB-RS232 Converter */
    1229 #define PAPOUCH_TMU_PID                 0x0400  /* TMU USB Thermometer */
    1230 #define PAPOUCH_IRAMP_PID               0x0500  /* Papouch IRAmp Duplex */
    1231 #define PAPOUCH_DRAK5_PID               0x0700  /* Papouch DRAK5 */
    1232 #define PAPOUCH_QUIDO8x8_PID            0x0800  /* Papouch Quido 8/8 Module */
    1233 #define PAPOUCH_QUIDO4x4_PID            0x0900  /* Papouch Quido 4/4 Module */
    1234 #define PAPOUCH_QUIDO2x2_PID            0x0a00  /* Papouch Quido 2/2 Module */
    1235 #define PAPOUCH_QUIDO10x1_PID           0x0b00  /* Papouch Quido 10/1 Module */
    1236 #define PAPOUCH_QUIDO30x3_PID           0x0c00  /* Papouch Quido 30/3 Module */
    1237 #define PAPOUCH_QUIDO60x3_PID           0x0d00  /* Papouch Quido 60(100)/3 Module */
    1238 #define PAPOUCH_QUIDO2x16_PID           0x0e00  /* Papouch Quido 2/16 Module */
    1239 #define PAPOUCH_QUIDO3x32_PID           0x0f00  /* Papouch Quido 3/32 Module */
    1240 #define PAPOUCH_DRAK6_PID               0x1000  /* Papouch DRAK6 */
    1241 #define PAPOUCH_UPSUSB_PID              0x8000  /* Papouch UPS-USB adapter */
    1242 #define PAPOUCH_MU_PID                  0x8001  /* MU controller */
    1243 #define PAPOUCH_SIMUKEY_PID             0x8002  /* Papouch SimuKey */
    1244 #define PAPOUCH_AD4USB_PID              0x8003  /* AD4USB Measurement Module */
    1245 #define PAPOUCH_GMUX_PID                0x8004  /* Papouch GOLIATH MUX */
    1246 #define PAPOUCH_GMSR_PID                0x8005  /* Papouch GOLIATH MSR */
    1247 
    1248 /*
    1249  * Marvell SheevaPlug
    1250  */
    1251 #define MARVELL_VID             0x9e88
    1252 #define MARVELL_SHEEVAPLUG_PID  0x9e8f
    1253 
    1254 /*
    1255  * Evolution Robotics products (http://www.evolution.com/).
    1256  * Submitted by Shawn M. Lavelle.
    1257  */
    1258 #define EVOLUTION_VID           0xDEEE  /* Vendor ID */
    1259 #define EVOLUTION_ER1_PID       0x0300  /* ER1 Control Module */
    1260 #define EVO_8U232AM_PID         0x02FF  /* Evolution robotics RCM2 (FT232AM)*/
    1261 #define EVO_HYBRID_PID          0x0302  /* Evolution robotics RCM4 PID (FT232BM)*/
    1262 #define EVO_RCM4_PID            0x0303  /* Evolution robotics RCM4 PID */
    1263 
    1264 /*
    1265  * MJS Gadgets HD Radio / XM Radio / Sirius Radio interfaces (using VID 0x0403)
    1266  */
    1267 #define MJSG_GENERIC_PID        0x9378
    1268 #define MJSG_SR_RADIO_PID       0x9379
    1269 #define MJSG_XM_RADIO_PID       0x937A
    1270 #define MJSG_HD_RADIO_PID       0x937C
    1271 
    1272 /*
    1273  * D.O.Tec products (http://www.directout.eu)
    1274  */
    1275 #define FTDI_DOTEC_PID 0x9868
    1276 
    1277 /*
    1278  * Xverve Signalyzer tools (http://www.signalyzer.com/)
    1279  */
    1280 #define XVERVE_SIGNALYZER_ST_PID        0xBCA0
    1281 #define XVERVE_SIGNALYZER_SLITE_PID     0xBCA1
    1282 #define XVERVE_SIGNALYZER_SH2_PID       0xBCA2
    1283 #define XVERVE_SIGNALYZER_SH4_PID       0xBCA4
    1284 
    1285 /*
    1286  * Segway Robotic Mobility Platform USB interface (using VID 0x0403)
    1287  * Submitted by John G. Rogers
    1288  */
    1289 #define SEGWAY_RMP200_PID       0xe729
    1290 
    1291 
    1292 /*
    1293  * Accesio USB Data Acquisition products (http://www.accesio.com/)
    1294  */
    1295 #define ACCESIO_COM4SM_PID      0xD578
    1296 
    1297 /* www.sciencescope.co.uk educational dataloggers */
    1298 #define FTDI_SCIENCESCOPE_LOGBOOKML_PID         0xFF18
    1299 #define FTDI_SCIENCESCOPE_LS_LOGBOOK_PID        0xFF1C
    1300 #define FTDI_SCIENCESCOPE_HS_LOGBOOK_PID        0xFF1D
    1301 
    1302 /*
    1303  * Milkymist One JTAG/Serial
    1304  */
    1305 #define QIHARDWARE_VID                  0x20B7
    1306 #define MILKYMISTONE_JTAGSERIAL_PID     0x0713
    1307 
    1308 /*
    1309  * CTI GmbH RS485 Converter http://www.cti-lean.com/
    1310  */
    1311 /* USB-485-Mini*/
    1312 #define FTDI_CTI_MINI_PID       0xF608
    1313 /* USB-Nano-485*/
    1314 #define FTDI_CTI_NANO_PID       0xF60B
    1315 
    1316 /*
    1317  * ZeitControl cardsystems GmbH rfid-readers http://zeitconrol.de
    1318  */
    1319 /* TagTracer MIFARE*/
    1320 #define FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID    0xF7C0
    1321 
    1322 /*
    1323  * Rainforest Automation
    1324  */
    1325 /* ZigBee controller */
    1326 #define FTDI_RF_R106            0x8A28
    1327 
    1328 /*
    1329  * Product: HCP HIT GPRS modem
    1330  * Manufacturer: HCP d.o.o.
    1331  * ATI command output: Cinterion MC55i
    1332  */
    1333 #define FTDI_CINTERION_MC55I_PID        0xA951
    1334 
    1335 /*
    1336  * Product: Comet Caller ID decoder
    1337  * Manufacturer: Crucible Technologies
    1338  */
    1339 #define FTDI_CT_COMET_PID       0x8e08
    1340 
    1341 /*
    1342  * Product: Z3X Box
    1343  * Manufacturer: Smart GSM Team
    1344  */
    1345 #define FTDI_Z3X_PID            0x0011
    1346 
    1347 /*
    1348  * Product: Cressi PC Interface
    1349  * Manufacturer: Cressi
    1350  */
    1351 #define FTDI_CRESSI_PID         0x87d0
    1352 
    1353 /*
    1354  * Brainboxes devices
    1355  */
    1356 #define BRAINBOXES_VID                  0x05d1
    1357 #define BRAINBOXES_VX_001_PID           0x1001 /* VX-001 ExpressCard 1 Port RS232 */
    1358 #define BRAINBOXES_VX_012_PID           0x1002 /* VX-012 ExpressCard 2 Port RS232 */
    1359 #define BRAINBOXES_VX_023_PID           0x1003 /* VX-023 ExpressCard 1 Port RS422/485 */
    1360 #define BRAINBOXES_VX_034_PID           0x1004 /* VX-034 ExpressCard 2 Port RS422/485 */
    1361 #define BRAINBOXES_US_101_PID           0x1011 /* US-101 1xRS232 */
    1362 #define BRAINBOXES_US_324_PID           0x1013 /* US-324 1xRS422/485 1Mbaud */
    1363 #define BRAINBOXES_US_606_1_PID         0x2001 /* US-606 6 Port RS232 Serial Port 1 and 2 */
    1364 #define BRAINBOXES_US_606_2_PID         0x2002 /* US-606 6 Port RS232 Serial Port 3 and 4 */
    1365 #define BRAINBOXES_US_606_3_PID         0x2003 /* US-606 6 Port RS232 Serial Port 4 and 6 */
    1366 #define BRAINBOXES_US_701_1_PID         0x2011 /* US-701 4xRS232 1Mbaud Port 1 and 2 */
    1367 #define BRAINBOXES_US_701_2_PID         0x2012 /* US-701 4xRS422 1Mbaud Port 3 and 4 */
    1368 #define BRAINBOXES_US_279_1_PID         0x2021 /* US-279 8xRS422 1Mbaud Port 1 and 2 */
    1369 #define BRAINBOXES_US_279_2_PID         0x2022 /* US-279 8xRS422 1Mbaud Port 3 and 4 */
    1370 #define BRAINBOXES_US_279_3_PID         0x2023 /* US-279 8xRS422 1Mbaud Port 5 and 6 */
    1371 #define BRAINBOXES_US_279_4_PID         0x2024 /* US-279 8xRS422 1Mbaud Port 7 and 8 */
    1372 #define BRAINBOXES_US_346_1_PID         0x3011 /* US-346 4xRS422/485 1Mbaud Port 1 and 2 */
    1373 #define BRAINBOXES_US_346_2_PID         0x3012 /* US-346 4xRS422/485 1Mbaud Port 3 and 4 */
    1374 #define BRAINBOXES_US_257_PID           0x5001 /* US-257 2xRS232 1Mbaud */
    1375 #define BRAINBOXES_US_313_PID           0x6001 /* US-313 2xRS422/485 1Mbaud */
    1376 #define BRAINBOXES_US_357_PID           0x7001 /* US_357 1xRS232/422/485 */
    1377 #define BRAINBOXES_US_842_1_PID         0x8001 /* US-842 8xRS422/485 1Mbaud Port 1 and 2 */
    1378 #define BRAINBOXES_US_842_2_PID         0x8002 /* US-842 8xRS422/485 1Mbaud Port 3 and 4 */
    1379 #define BRAINBOXES_US_842_3_PID         0x8003 /* US-842 8xRS422/485 1Mbaud Port 5 and 6 */
    1380 #define BRAINBOXES_US_842_4_PID         0x8004 /* US-842 8xRS422/485 1Mbaud Port 7 and 8 */
    1381 #define BRAINBOXES_US_160_1_PID         0x9001 /* US-160 16xRS232 1Mbaud Port 1 and 2 */
    1382 #define BRAINBOXES_US_160_2_PID         0x9002 /* US-160 16xRS232 1Mbaud Port 3 and 4 */
    1383 #define BRAINBOXES_US_160_3_PID         0x9003 /* US-160 16xRS232 1Mbaud Port 5 and 6 */
    1384 #define BRAINBOXES_US_160_4_PID         0x9004 /* US-160 16xRS232 1Mbaud Port 7 and 8 */
    1385 #define BRAINBOXES_US_160_5_PID         0x9005 /* US-160 16xRS232 1Mbaud Port 9 and 10 */
    1386 #define BRAINBOXES_US_160_6_PID         0x9006 /* US-160 16xRS232 1Mbaud Port 11 and 12 */
    1387 #define BRAINBOXES_US_160_7_PID         0x9007 /* US-160 16xRS232 1Mbaud Port 13 and 14 */
    1388 #define BRAINBOXES_US_160_8_PID         0x9008 /* US-160 16xRS232 1Mbaud Port 15 and 16 */
    1389 
    1390 /*
    1391  * ekey biometric systems GmbH (http://ekey.net/)
    1392  */
    1393 #define FTDI_EKEY_CONV_USB_PID          0xCB08  /* Converter USB */
    1394 
    1395 /*
    1396  * GE Healthcare devices
    1397  */
    1398 #define GE_HEALTHCARE_VID               0x1901
    1399 #define GE_HEALTHCARE_NEMO_TRACKER_PID  0x0015
    1400 
     1 /*
      2  * USB FTDI SIO driver
      3  *
      4  *      Copyright (C) 2009 - 2013
      5  *          Johan Hovold (jhovold@gmail.com)
      6  *      Copyright (C) 1999 - 2001
      7  *          Greg Kroah-Hartman (greg@kroah.com)
      8  *          Bill Ryder (bryder@sgi.com)
      9  *      Copyright (C) 2002
     10  *          Kuba Ober (kuba@mareimbrium.org)
     11  *
     12  *      This program is free software; you can redistribute it and/or modify
     13  *      it under the terms of the GNU General Public License as published by
     14  *      the Free Software Foundation; either version 2 of the License, or
     15  *      (at your option) any later version.
     16  *
     17  * See Documentation/usb/usb-serial.txt for more information on using this
     18  * driver
     19  *
     20  * See http://ftdi-usb-sio.sourceforge.net for up to date testing info
     21  *      and extra documentation
     22  *
     23  * Change entries from 2004 and earlier can be found in versions of this
     24  * file in kernel versions prior to the 2.6.24 release.
     25  *
     26  */
     27 
     28 /* Bill Ryder - bryder@sgi.com - wrote the FTDI_SIO implementation */
     29 /* Thanx to FTDI for so kindly providing details of the protocol required */
     30 /*   to talk to the device */
     31 /* Thanx to gkh and the rest of the usb dev group for all code I have
     32    assimilated :-) */
     33 
     34 #include <linux/kernel.h>
     35 #include <linux/errno.h>
     36 #include <linux/slab.h>
     37 #include <linux/tty.h>
     38 #include <linux/tty_driver.h>
     39 #include <linux/tty_flip.h>
     40 #include <linux/module.h>
     41 #include <linux/spinlock.h>
     42 #include <linux/mutex.h>
     43 #include <linux/uaccess.h>
     44 #include <linux/usb.h>
     45 #include <linux/serial.h>
     46 #include <linux/usb/serial.h>
     47 #include "ftdi_sio.h"
     48 #include "ftdi_sio_ids.h"
     49 
     50 #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Bill Ryder <bryder@sgi.com>, Kuba Ober <kuba@mareimbrium.org>, Andreas Mohr, Johan Hovold <jhovold@gmail.com>"
     51 #define DRIVER_DESC "USB FTDI Serial Converters Driver"
     52 
     53 
     54 struct ftdi_private {
     55         enum ftdi_chip_type chip_type;
     56                                 /* type of device, either SIO or FT8U232AM */
     57         int baud_base;          /* baud base clock for divisor setting */
     58         int custom_divisor;     /* custom_divisor kludge, this is for
     59                                    baud_base (different from what goes to the
     60                                    chip!) */
     61         __u16 last_set_data_urb_value ;
     62                                 /* the last data state set - needed for doing
     63                                  * a break
     64                                  */
     65         int flags;              /* some ASYNC_xxxx flags are supported */
     66         unsigned long last_dtr_rts;     /* saved modem control outputs */
     67         char prev_status;        /* Used for TIOCMIWAIT */
     68         char transmit_empty;    /* If transmitter is empty or not */
     69         __u16 interface;        /* FT2232C, FT2232H or FT4232H port interface
     70                                    (0 for FT232/245) */
     71 
     72         speed_t force_baud;     /* if non-zero, force the baud rate to
     73                                    this value */
     74         int force_rtscts;       /* if non-zero, force RTS-CTS to always
     75                                    be enabled */
     76 
     77         unsigned int latency;           /* latency setting in use */
     78         unsigned short max_packet_size;
     79         struct mutex cfg_lock; /* Avoid mess by parallel calls of config ioctl() and change_speed() */
     80 };
     81 
     82 /* struct ftdi_sio_quirk is used by devices requiring special attention. */
     83 struct ftdi_sio_quirk {
     84         int (*probe)(struct usb_serial *);
     85         /* Special settings for probed ports. */
     86         void (*port_probe)(struct ftdi_private *);
     87 };
     88 
     89 static int   ftdi_jtag_probe(struct usb_serial *serial);
     90 static int   ftdi_NDI_device_setup(struct usb_serial *serial);
     91 static int   ftdi_stmclite_probe(struct usb_serial *serial);
     92 static int   ftdi_8u2232c_probe(struct usb_serial *serial);
     93 static void  ftdi_USB_UIRT_setup(struct ftdi_private *priv);
     94 static void  ftdi_HE_TIRA1_setup(struct ftdi_private *priv);
     95 
     96 static struct ftdi_sio_quirk ftdi_jtag_quirk = {
     97         .probe  = ftdi_jtag_probe,
     98 };
     99 
    100 static struct ftdi_sio_quirk ftdi_NDI_device_quirk = {
    101         .probe  = ftdi_NDI_device_setup,
    102 };
    103 
    104 static struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = {
    105         .port_probe = ftdi_USB_UIRT_setup,
    106 };
    107 
    108 static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = {
    109         .port_probe = ftdi_HE_TIRA1_setup,
    110 };
    111 
    112 static struct ftdi_sio_quirk ftdi_stmclite_quirk = {
    113         .probe  = ftdi_stmclite_probe,
    114 };
    115 
    116 static struct ftdi_sio_quirk ftdi_8u2232c_quirk = {
    117         .probe  = ftdi_8u2232c_probe,
    118 };
    119 
    120 /*
    121  * The 8U232AM has the same API as the sio except for:
    122  * - it can support MUCH higher baudrates; up to:
    123  *   o 921600 for RS232 and 2000000 for RS422/485 at 48MHz
    124  *   o 230400 at 12MHz
    125  *   so .. 8U232AM's baudrate setting codes are different
    126  * - it has a two byte status code.
    127  * - it returns characters every 16ms (the FTDI does it every 40ms)
    128  *
    129  * the bcdDevice value is used to differentiate FT232BM and FT245BM from
    130  * the earlier FT8U232AM and FT8U232BM.  For now, include all known VID/PID
    131  * combinations in both tables.
    132  * FIXME: perhaps bcdDevice can also identify 12MHz FT8U232AM devices,
    133  * but I don't know if those ever went into mass production. [Ian Abbott]
    134  */
    135 
    136 
    137 
    138 /*
    139  * Device ID not listed? Test it using
    140  * /sys/bus/usb-serial/drivers/ftdi_sio/new_id and send a patch or report.
    141  */
    142 static const struct usb_device_id id_table_combined[] = {
    143         { USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) },
    144         { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) },
    145         { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) },
    146         { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) },
    147         { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) },
    148         { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) },
    149         { USB_DEVICE(FTDI_VID, FTDI_BM_ATOM_NANO_PID) },
    150         { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) },
    151         { USB_DEVICE(FTDI_VID, FTDI_EV3CON_PID) },
    152         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) },
    153         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) },
    154         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) },
    155         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_3_PID) },
    156         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_4_PID) },
    157         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_5_PID) },
    158         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_6_PID) },
    159         { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_7_PID) },
    160         { USB_DEVICE(FTDI_VID, FTDI_USINT_CAT_PID) },
    161         { USB_DEVICE(FTDI_VID, FTDI_USINT_WKEY_PID) },
    162         { USB_DEVICE(FTDI_VID, FTDI_USINT_RS232_PID) },
    163         { USB_DEVICE(FTDI_VID, FTDI_ACTZWAVE_PID) },
    164         { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) },
    165         { USB_DEVICE(FTDI_VID, FTDI_IPLUS_PID) },
    166         { USB_DEVICE(FTDI_VID, FTDI_IPLUS2_PID) },
    167         { USB_DEVICE(FTDI_VID, FTDI_DMX4ALL) },
    168         { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
    169         { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) },
    170         { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) },
    171         { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) },
    172         { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) ,
    173                 .driver_info = (kernel_ulong_t)&ftdi_8u2232c_quirk },
    174         { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) },
    175         { USB_DEVICE(FTDI_VID, FTDI_232H_PID) },
    176         { USB_DEVICE(FTDI_VID, FTDI_FTX_PID) },
    177         { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) },
    178         { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
    179         { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) },
    180         { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_SNIFFER_PID) },
    181         { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) },
    182         { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) },
    183         { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) },
    184         { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_BOOST_PID) },
    185         { USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) },
    186         { USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_CC_PID) },
    187         { USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_AGP_PID) },
    188         { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
    189         { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
    190         { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
    191         { USB_DEVICE(FTDI_VID, FTDI_TAGSYS_LP101_PID) },
    192         { USB_DEVICE(FTDI_VID, FTDI_TAGSYS_P200X_PID) },
    193         { USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) },
    194         { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) },
    195         { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) },
    196         { USB_DEVICE(FTDI_VID, FTDI_XF_547_PID) },
    197         { USB_DEVICE(FTDI_VID, FTDI_XF_633_PID) },
    198         { USB_DEVICE(FTDI_VID, FTDI_XF_631_PID) },
    199         { USB_DEVICE(FTDI_VID, FTDI_XF_635_PID) },
    200         { USB_DEVICE(FTDI_VID, FTDI_XF_640_PID) },
    201         { USB_DEVICE(FTDI_VID, FTDI_XF_642_PID) },
    202         { USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) },
    203         { USB_DEVICE(FTDI_VID, FTDI_URBAN_0_PID) },
    204         { USB_DEVICE(FTDI_VID, FTDI_URBAN_1_PID) },
    205         { USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) },
    206         { USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) },
    207         { USB_DEVICE(FTDI_VID, FTDI_MTXORB_0_PID) },
    208         { USB_DEVICE(FTDI_VID, FTDI_MTXORB_1_PID) },
    209         { USB_DEVICE(FTDI_VID, FTDI_MTXORB_2_PID) },
    210         { USB_DEVICE(FTDI_VID, FTDI_MTXORB_3_PID) },
    211         { USB_DEVICE(FTDI_VID, FTDI_MTXORB_4_PID) },
    212         { USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) },
    213         { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) },
    214         { USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) },
    215         { USB_DEVICE(FTDI_VID, FTDI_VARDAAN_PID) },
    216         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) },
    217         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) },
    218         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) },
    219         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0103_PID) },
    220         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0104_PID) },
    221         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0105_PID) },
    222         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0106_PID) },
    223         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0107_PID) },
    224         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0108_PID) },
    225         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0109_PID) },
    226         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010A_PID) },
    227         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010B_PID) },
    228         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010C_PID) },
    229         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010D_PID) },
    230         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010E_PID) },
    231         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_010F_PID) },
    232         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0110_PID) },
    233         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0111_PID) },
    234         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0112_PID) },
    235         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0113_PID) },
    236         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0114_PID) },
    237         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0115_PID) },
    238         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0116_PID) },
    239         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0117_PID) },
    240         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0118_PID) },
    241         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0119_PID) },
    242         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011A_PID) },
    243         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011B_PID) },
    244         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011C_PID) },
    245         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011D_PID) },
    246         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011E_PID) },
    247         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_011F_PID) },
    248         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0120_PID) },
    249         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0121_PID) },
    250         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0122_PID) },
    251         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0123_PID) },
    252         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0124_PID) },
    253         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0125_PID) },
    254         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0126_PID) },
    255         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0127_PID) },
    256         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0128_PID) },
    257         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0129_PID) },
    258         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012A_PID) },
    259         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012B_PID) },
    260         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012C_PID) },
    261         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012D_PID) },
    262         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012E_PID) },
    263         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012F_PID) },
    264         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0130_PID) },
    265         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0131_PID) },
    266         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0132_PID) },
    267         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0133_PID) },
    268         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0134_PID) },
    269         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0135_PID) },
    270         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0136_PID) },
    271         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0137_PID) },
    272         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0138_PID) },
    273         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0139_PID) },
    274         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013A_PID) },
    275         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013B_PID) },
    276         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013C_PID) },
    277         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013D_PID) },
    278         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013E_PID) },
    279         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_013F_PID) },
    280         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0140_PID) },
    281         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0141_PID) },
    282         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0142_PID) },
    283         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0143_PID) },
    284         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0144_PID) },
    285         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0145_PID) },
    286         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0146_PID) },
    287         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0147_PID) },
    288         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0148_PID) },
    289         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0149_PID) },
    290         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014A_PID) },
    291         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014B_PID) },
    292         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014C_PID) },
    293         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014D_PID) },
    294         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014E_PID) },
    295         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_014F_PID) },
    296         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0150_PID) },
    297         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0151_PID) },
    298         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0152_PID) },
    299         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0153_PID) },
    300         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0154_PID) },
    301         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0155_PID) },
    302         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0156_PID) },
    303         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0157_PID) },
    304         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0158_PID) },
    305         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0159_PID) },
    306         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015A_PID) },
    307         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015B_PID) },
    308         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015C_PID) },
    309         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015D_PID) },
    310         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015E_PID) },
    311         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015F_PID) },
    312         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0160_PID) },
    313         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0161_PID) },
    314         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0162_PID) },
    315         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0163_PID) },
    316         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0164_PID) },
    317         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0165_PID) },
    318         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0166_PID) },
    319         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0167_PID) },
    320         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0168_PID) },
    321         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0169_PID) },
    322         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016A_PID) },
    323         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016B_PID) },
    324         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016C_PID) },
    325         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016D_PID) },
    326         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016E_PID) },
    327         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_016F_PID) },
    328         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0170_PID) },
    329         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0171_PID) },
    330         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0172_PID) },
    331         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0173_PID) },
    332         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0174_PID) },
    333         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0175_PID) },
    334         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0176_PID) },
    335         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0177_PID) },
    336         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0178_PID) },
    337         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0179_PID) },
    338         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017A_PID) },
    339         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017B_PID) },
    340         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017C_PID) },
    341         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017D_PID) },
    342         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017E_PID) },
    343         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_017F_PID) },
    344         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0180_PID) },
    345         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0181_PID) },
    346         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0182_PID) },
    347         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0183_PID) },
    348         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0184_PID) },
    349         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0185_PID) },
    350         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0186_PID) },
    351         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0187_PID) },
    352         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0188_PID) },
    353         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0189_PID) },
    354         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018A_PID) },
    355         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018B_PID) },
    356         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018C_PID) },
    357         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018D_PID) },
    358         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018E_PID) },
    359         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_018F_PID) },
    360         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0190_PID) },
    361         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0191_PID) },
    362         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0192_PID) },
    363         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0193_PID) },
    364         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0194_PID) },
    365         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0195_PID) },
    366         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0196_PID) },
    367         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0197_PID) },
    368         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0198_PID) },
    369         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0199_PID) },
    370         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019A_PID) },
    371         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019B_PID) },
    372         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019C_PID) },
    373         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019D_PID) },
    374         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019E_PID) },
    375         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_019F_PID) },
    376         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A0_PID) },
    377         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A1_PID) },
    378         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A2_PID) },
    379         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A3_PID) },
    380         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A4_PID) },
    381         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A5_PID) },
    382         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A6_PID) },
    383         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A7_PID) },
    384         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A8_PID) },
    385         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01A9_PID) },
    386         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AA_PID) },
    387         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AB_PID) },
    388         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AC_PID) },
    389         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AD_PID) },
    390         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AE_PID) },
    391         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01AF_PID) },
    392         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B0_PID) },
    393         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B1_PID) },
    394         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B2_PID) },
    395         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B3_PID) },
    396         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B4_PID) },
    397         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B5_PID) },
    398         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B6_PID) },
    399         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B7_PID) },
    400         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B8_PID) },
    401         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01B9_PID) },
    402         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BA_PID) },
    403         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BB_PID) },
    404         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BC_PID) },
    405         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BD_PID) },
    406         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BE_PID) },
    407         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01BF_PID) },
    408         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C0_PID) },
    409         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C1_PID) },
    410         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C2_PID) },
    411         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C3_PID) },
    412         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C4_PID) },
    413         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C5_PID) },
    414         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C6_PID) },
    415         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C7_PID) },
    416         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C8_PID) },
    417         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01C9_PID) },
    418         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CA_PID) },
    419         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CB_PID) },
    420         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CC_PID) },
    421         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CD_PID) },
    422         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CE_PID) },
    423         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01CF_PID) },
    424         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D0_PID) },
    425         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D1_PID) },
    426         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D2_PID) },
    427         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D3_PID) },
    428         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D4_PID) },
    429         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D5_PID) },
    430         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D6_PID) },
    431         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D7_PID) },
    432         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D8_PID) },
    433         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01D9_PID) },
    434         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DA_PID) },
    435         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DB_PID) },
    436         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DC_PID) },
    437         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DD_PID) },
    438         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DE_PID) },
    439         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01DF_PID) },
    440         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E0_PID) },
    441         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E1_PID) },
    442         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E2_PID) },
    443         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E3_PID) },
    444         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E4_PID) },
    445         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E5_PID) },
    446         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E6_PID) },
    447         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E7_PID) },
    448         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E8_PID) },
    449         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01E9_PID) },
    450         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EA_PID) },
    451         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EB_PID) },
    452         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EC_PID) },
    453         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01ED_PID) },
    454         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EE_PID) },
    455         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01EF_PID) },
    456         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F0_PID) },
    457         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F1_PID) },
    458         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F2_PID) },
    459         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F3_PID) },
    460         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F4_PID) },
    461         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F5_PID) },
    462         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F6_PID) },
    463         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F7_PID) },
    464         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F8_PID) },
    465         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01F9_PID) },
    466         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FA_PID) },
    467         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FB_PID) },
    468         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FC_PID) },
    469         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FD_PID) },
    470         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FE_PID) },
    471         { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_01FF_PID) },
    472         { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) },
    473         { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) },
    474         { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) },
    475         { USB_DEVICE(FTDI_VID, FTDI_USBX_707_PID) },
    476         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) },
    477         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) },
    478         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) },
    479         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2104_PID) },
    480         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2106_PID) },
    481         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_1_PID) },
    482         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2201_2_PID) },
    483         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_1_PID) },
    484         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2202_2_PID) },
    485         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_1_PID) },
    486         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2203_2_PID) },
    487         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_1_PID) },
    488         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_2_PID) },
    489         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_3_PID) },
    490         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2401_4_PID) },
    491         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_1_PID) },
    492         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_2_PID) },
    493         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_3_PID) },
    494         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2402_4_PID) },
    495         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_1_PID) },
    496         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_2_PID) },
    497         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_3_PID) },
    498         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2403_4_PID) },
    499         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_1_PID) },
    500         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_2_PID) },
    501         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_3_PID) },
    502         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_4_PID) },
    503         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_5_PID) },
    504         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_6_PID) },
    505         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_7_PID) },
    506         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2801_8_PID) },
    507         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_1_PID) },
    508         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_2_PID) },
    509         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_3_PID) },
    510         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_4_PID) },
    511         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_5_PID) },
    512         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_6_PID) },
    513         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_7_PID) },
    514         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2802_8_PID) },
    515         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_1_PID) },
    516         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_2_PID) },
    517         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_3_PID) },
    518         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_4_PID) },
    519         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_5_PID) },
    520         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_6_PID) },
    521         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_7_PID) },
    522         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) },
    523         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_1_PID) },
    524         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_2_PID) },
    525         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_3_PID) },
    526         { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803R_4_PID) },
    527         { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) },
    528         { USB_DEVICE(OCT_VID, OCT_US101_PID) },
    529         { USB_DEVICE(OCT_VID, OCT_DK201_PID) },
    530         { USB_DEVICE(FTDI_VID, FTDI_HE_TIRA1_PID),
    531                 .driver_info = (kernel_ulong_t)&ftdi_HE_TIRA1_quirk },
    532         { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID),
    533                 .driver_info = (kernel_ulong_t)&ftdi_USB_UIRT_quirk },
    534         { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_1) },
    535         { USB_DEVICE(FTDI_VID, PROTEGO_R2X0) },
    536         { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) },
    537         { USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) },
    538         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E808_PID) },
    539         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E809_PID) },
    540         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80A_PID) },
    541         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80B_PID) },
    542         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80C_PID) },
    543         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80D_PID) },
    544         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80E_PID) },
    545         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E80F_PID) },
    546         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E888_PID) },
    547         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E889_PID) },
    548         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88A_PID) },
    549         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88B_PID) },
    550         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88C_PID) },
    551         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88D_PID) },
    552         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88E_PID) },
    553         { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88F_PID) },
    554         { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) },
    555         { USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) },
    556         { USB_DEVICE(FTDI_VID, FTDI_ELV_UR100_PID) },
    557         { USB_DEVICE(FTDI_VID, FTDI_ELV_ALC8500_PID) },
    558         { USB_DEVICE(FTDI_VID, FTDI_PYRAMID_PID) },
    559         { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1000PC_PID) },
    560         { USB_DEVICE(FTDI_VID, FTDI_IBS_US485_PID) },
    561         { USB_DEVICE(FTDI_VID, FTDI_IBS_PICPRO_PID) },
    562         { USB_DEVICE(FTDI_VID, FTDI_IBS_PCMCIA_PID) },
    563         { USB_DEVICE(FTDI_VID, FTDI_IBS_PK1_PID) },
    564         { USB_DEVICE(FTDI_VID, FTDI_IBS_RS232MON_PID) },
    565         { USB_DEVICE(FTDI_VID, FTDI_IBS_APP70_PID) },
    566         { USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) },
    567         { USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) },
    568         { USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) },
    569         { USB_DEVICE(FTDI_VID, FTDI_TIAO_UMPA_PID),
    570                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    571         { USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLXM_PID),
    572                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    573         /*
    574          * ELV devices:
    575          */
    576         { USB_DEVICE(FTDI_ELV_VID, FTDI_ELV_WS300_PID) },
    577         { USB_DEVICE(FTDI_VID, FTDI_ELV_USR_PID) },
    578         { USB_DEVICE(FTDI_VID, FTDI_ELV_MSM1_PID) },
    579         { USB_DEVICE(FTDI_VID, FTDI_ELV_KL100_PID) },
    580         { USB_DEVICE(FTDI_VID, FTDI_ELV_WS550_PID) },
    581         { USB_DEVICE(FTDI_VID, FTDI_ELV_EC3000_PID) },
    582         { USB_DEVICE(FTDI_VID, FTDI_ELV_WS888_PID) },
    583         { USB_DEVICE(FTDI_VID, FTDI_ELV_TWS550_PID) },
    584         { USB_DEVICE(FTDI_VID, FTDI_ELV_FEM_PID) },
    585         { USB_DEVICE(FTDI_VID, FTDI_ELV_CLI7000_PID) },
    586         { USB_DEVICE(FTDI_VID, FTDI_ELV_PPS7330_PID) },
    587         { USB_DEVICE(FTDI_VID, FTDI_ELV_TFM100_PID) },
    588         { USB_DEVICE(FTDI_VID, FTDI_ELV_UDF77_PID) },
    589         { USB_DEVICE(FTDI_VID, FTDI_ELV_UIO88_PID) },
    590         { USB_DEVICE(FTDI_VID, FTDI_ELV_UAD8_PID) },
    591         { USB_DEVICE(FTDI_VID, FTDI_ELV_UDA7_PID) },
    592         { USB_DEVICE(FTDI_VID, FTDI_ELV_USI2_PID) },
    593         { USB_DEVICE(FTDI_VID, FTDI_ELV_T1100_PID) },
    594         { USB_DEVICE(FTDI_VID, FTDI_ELV_PCD200_PID) },
    595         { USB_DEVICE(FTDI_VID, FTDI_ELV_ULA200_PID) },
    596         { USB_DEVICE(FTDI_VID, FTDI_ELV_CSI8_PID) },
    597         { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1000DL_PID) },
    598         { USB_DEVICE(FTDI_VID, FTDI_ELV_PCK100_PID) },
    599         { USB_DEVICE(FTDI_VID, FTDI_ELV_RFP500_PID) },
    600         { USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) },
    601         { USB_DEVICE(FTDI_VID, FTDI_ELV_UTP8_PID) },
    602         { USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) },
    603         { USB_DEVICE(FTDI_VID, FTDI_ELV_WS444PC_PID) },
    604         { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) },
    605         { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1010PC_PID) },
    606         { USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) },
    607         { USB_DEVICE(FTDI_VID, FTDI_ELV_HS485_PID) },
    608         { USB_DEVICE(FTDI_VID, FTDI_ELV_UMS100_PID) },
    609         { USB_DEVICE(FTDI_VID, FTDI_ELV_TFD128_PID) },
    610         { USB_DEVICE(FTDI_VID, FTDI_ELV_FM3RX_PID) },
    611         { USB_DEVICE(FTDI_VID, FTDI_ELV_WS777_PID) },
    612         { USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) },
    613         { USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) },
    614         { USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) },
    615         { USB_DEVICE(FTDI_VID, LINX_FUTURE_1_PID) },
    616         { USB_DEVICE(FTDI_VID, LINX_FUTURE_2_PID) },
    617         { USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) },
    618         { USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) },
    619         { USB_DEVICE(FTDI_VID, FTDI_CCSMACHX_2_PID) },
    620         { USB_DEVICE(FTDI_VID, FTDI_CCSLOAD_N_GO_3_PID) },
    621         { USB_DEVICE(FTDI_VID, FTDI_CCSICDU64_4_PID) },
    622         { USB_DEVICE(FTDI_VID, FTDI_CCSPRIME8_5_PID) },
    623         { USB_DEVICE(FTDI_VID, INSIDE_ACCESSO) },
    624         { USB_DEVICE(INTREPID_VID, INTREPID_VALUECAN_PID) },
    625         { USB_DEVICE(INTREPID_VID, INTREPID_NEOVI_PID) },
    626         { USB_DEVICE(FALCOM_VID, FALCOM_TWIST_PID) },
    627         { USB_DEVICE(FALCOM_VID, FALCOM_SAMBA_PID) },
    628         { USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) },
    629         { USB_DEVICE(FTDI_VID, FTDI_OCEANIC_PID) },
    630         { USB_DEVICE(TTI_VID, TTI_QL355P_PID) },
    631         { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) },
    632         { USB_DEVICE(ACTON_VID, ACTON_SPECTRAPRO_PID) },
    633         { USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) },
    634         { USB_DEVICE(MITSUBISHI_VID, MITSUBISHI_FXUSB_PID) },
    635         { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) },
    636         { USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) },
    637         { USB_DEVICE(BANDB_VID, BANDB_USO9ML2_PID) },
    638         { USB_DEVICE(BANDB_VID, BANDB_USOPTL4_PID) },
    639         { USB_DEVICE(BANDB_VID, BANDB_USPTL4_PID) },
    640         { USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_2_PID) },
    641         { USB_DEVICE(BANDB_VID, BANDB_USO9ML2DR_PID) },
    642         { USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR2_PID) },
    643         { USB_DEVICE(BANDB_VID, BANDB_USOPTL4DR_PID) },
    644         { USB_DEVICE(BANDB_VID, BANDB_485USB9F_2W_PID) },
    645         { USB_DEVICE(BANDB_VID, BANDB_485USB9F_4W_PID) },
    646         { USB_DEVICE(BANDB_VID, BANDB_232USB9M_PID) },
    647         { USB_DEVICE(BANDB_VID, BANDB_485USBTB_2W_PID) },
    648         { USB_DEVICE(BANDB_VID, BANDB_485USBTB_4W_PID) },
    649         { USB_DEVICE(BANDB_VID, BANDB_TTL5USB9M_PID) },
    650         { USB_DEVICE(BANDB_VID, BANDB_TTL3USB9M_PID) },
    651         { USB_DEVICE(BANDB_VID, BANDB_ZZ_PROG1_USB_PID) },
    652         { USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) },
    653         { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) },
    654         { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) },
    655         { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_3_PID) },
    656         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) },
    657         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) },
    658         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) },
    659         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_3_PID) },
    660         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_4_PID) },
    661         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) },
    662         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) },
    663         { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) },
    664         { USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) },
    665         { USB_DEVICE(XSENS_VID, XSENS_MTW_PID) },
    666         { USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
    667         { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
    668         { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) },
    669         { USB_DEVICE(FTDI_VID, FTDI_MHAM_KW_PID) },
    670         { USB_DEVICE(FTDI_VID, FTDI_MHAM_YS_PID) },
    671         { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) },
    672         { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) },
    673         { USB_DEVICE(FTDI_VID, FTDI_MHAM_IC_PID) },
    674         { USB_DEVICE(FTDI_VID, FTDI_MHAM_DB9_PID) },
    675         { USB_DEVICE(FTDI_VID, FTDI_MHAM_RS232_PID) },
    676         { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y9_PID) },
    677         { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_VCP_PID) },
    678         { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_D2XX_PID) },
    679         { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) },
    680         { USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) },
    681         { USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) },
    682         { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) },
    683         { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) },
    684         { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) },
    685         { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) },
    686         { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HRC_PID) },
    687         { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16IC_PID) },
    688         { USB_DEVICE(KOBIL_VID, KOBIL_CONV_B1_PID) },
    689         { USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) },
    690         { USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) },
    691         { USB_DEVICE(FTDI_VID, FTDI_TTUSB_PID) },
    692         { USB_DEVICE(FTDI_VID, FTDI_ECLO_COM_1WIRE_PID) },
    693         { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_777_PID) },
    694         { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_8900F_PID) },
    695         { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) },
    696         { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) },
    697         { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) },
    698         { USB_DEVICE(FTDI_VID, FTDI_NZR_SEM_USB_PID) },
    699         { USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) },
    700         { USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) },
    701         { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) },
    702         { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C2_PID) },
    703         { USB_DEVICE(ICOM_VID, ICOM_ID_RP2D_PID) },
    704         { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VT_PID) },
    705         { USB_DEVICE(ICOM_VID, ICOM_ID_RP2VR_PID) },
    706         { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVT_PID) },
    707         { USB_DEVICE(ICOM_VID, ICOM_ID_RP4KVR_PID) },
    708         { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVT_PID) },
    709         { USB_DEVICE(ICOM_VID, ICOM_ID_RP2KVR_PID) },
    710         { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) },
    711         { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) },
    712         { USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) },
    713         { USB_DEVICE(TESTO_VID, TESTO_1_PID) },
    714         { USB_DEVICE(TESTO_VID, TESTO_3_PID) },
    715         { USB_DEVICE(FTDI_VID, FTDI_GAMMA_SCOUT_PID) },
    716         { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13M_PID) },
    717         { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13S_PID) },
    718         { USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) },
    719         { USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) },
    720         { USB_DEVICE(FTDI_VID, FTDI_NDI_HUC_PID),
    721                 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
    722         { USB_DEVICE(FTDI_VID, FTDI_NDI_SPECTRA_SCU_PID),
    723                 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
    724         { USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_2_PID),
    725                 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
    726         { USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_3_PID),
    727                 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
    728         { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID),
    729                 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
    730         { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
    731         { USB_DEVICE(NOVITUS_VID, NOVITUS_BONO_E_PID) },
    732         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S03_PID) },
    733         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_59_PID) },
    734         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57A_PID) },
    735         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57B_PID) },
    736         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29A_PID) },
    737         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29B_PID) },
    738         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29F_PID) },
    739         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62B_PID) },
    740         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S01_PID) },
    741         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63_PID) },
    742         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29C_PID) },
    743         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_81B_PID) },
    744         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_82B_PID) },
    745         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5D_PID) },
    746         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K4Y_PID) },
    747         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5G_PID) },
    748         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S05_PID) },
    749         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_60_PID) },
    750         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_61_PID) },
    751         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62_PID) },
    752         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63B_PID) },
    753         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_64_PID) },
    754         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_65_PID) },
    755         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92_PID) },
    756         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92D_PID) },
    757         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_W5R_PID) },
    758         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_A5R_PID) },
    759         { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_PW1_PID) },
    760         { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
    761         { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) },
    762         { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
    763         { USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) },
    764         { USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) },
    765         { USB_DEVICE(FTDI_VID, FTDI_PROPOX_ISPCABLEIII_PID) },
    766         { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID),
    767                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    768         { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID),
    769                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    770         { USB_DEVICE(FIC_VID, FIC_NEO1973_DEBUG_PID),
    771                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    772         { USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID),
    773                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    774         { USB_DEVICE(FTDI_VID, LMI_LM3S_DEVEL_BOARD_PID),
    775                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    776         { USB_DEVICE(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID),
    777                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    778         { USB_DEVICE(FTDI_VID, LMI_LM3S_ICDI_BOARD_PID),
    779                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    780         { USB_DEVICE(FTDI_VID, FTDI_TURTELIZER_PID),
    781                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    782         { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
    783         { USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) },
    784 
    785         /* Papouch devices based on FTDI chip */
    786         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_PID) },
    787         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_PID) },
    788         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_PID) },
    789         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485_2_PID) },
    790         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AP485_2_PID) },
    791         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB422_2_PID) },
    792         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485S_PID) },
    793         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB485C_PID) },
    794         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_LEC_PID) },
    795         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SB232_PID) },
    796         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) },
    797         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_IRAMP_PID) },
    798         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK5_PID) },
    799         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO8x8_PID) },
    800         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) },
    801         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x2_PID) },
    802         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO10x1_PID) },
    803         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO30x3_PID) },
    804         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO60x3_PID) },
    805         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO2x16_PID) },
    806         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO3x32_PID) },
    807         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_DRAK6_PID) },
    808         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_UPSUSB_PID) },
    809         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_MU_PID) },
    810         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_SIMUKEY_PID) },
    811         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_AD4USB_PID) },
    812         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMUX_PID) },
    813         { USB_DEVICE(PAPOUCH_VID, PAPOUCH_GMSR_PID) },
    814 
    815         { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) },
    816         { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) },
    817         { USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) },
    818         { USB_DEVICE(FTDI_VID, DIEBOLD_BCS_SE923_PID) },
    819         { USB_DEVICE(ATMEL_VID, STK541_PID) },
    820         { USB_DEVICE(DE_VID, STB_PID) },
    821         { USB_DEVICE(DE_VID, WHT_PID) },
    822         { USB_DEVICE(ADI_VID, ADI_GNICE_PID),
    823                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    824         { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID),
    825                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    826         { USB_DEVICE_AND_INTERFACE_INFO(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID,
    827                                         USB_CLASS_VENDOR_SPEC,
    828                                         USB_SUBCLASS_VENDOR_SPEC, 0x00) },
    829         { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
    830         { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID),
    831                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    832         { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) },
    833         { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) },
    834         { USB_DEVICE(FTDI_VID, PI_C865_PID) },
    835         { USB_DEVICE(FTDI_VID, PI_C857_PID) },
    836         { USB_DEVICE(PI_VID, PI_C866_PID) },
    837         { USB_DEVICE(PI_VID, PI_C663_PID) },
    838         { USB_DEVICE(PI_VID, PI_C725_PID) },
    839         { USB_DEVICE(PI_VID, PI_E517_PID) },
    840         { USB_DEVICE(PI_VID, PI_C863_PID) },
    841         { USB_DEVICE(PI_VID, PI_E861_PID) },
    842         { USB_DEVICE(PI_VID, PI_C867_PID) },
    843         { USB_DEVICE(PI_VID, PI_E609_PID) },
    844         { USB_DEVICE(PI_VID, PI_E709_PID) },
    845         { USB_DEVICE(PI_VID, PI_100F_PID) },
    846         { USB_DEVICE(PI_VID, PI_1011_PID) },
    847         { USB_DEVICE(PI_VID, PI_1012_PID) },
    848         { USB_DEVICE(PI_VID, PI_1013_PID) },
    849         { USB_DEVICE(PI_VID, PI_1014_PID) },
    850         { USB_DEVICE(PI_VID, PI_1015_PID) },
    851         { USB_DEVICE(PI_VID, PI_1016_PID) },
    852         { USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) },
    853         { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
    854         { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
    855                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    856         { USB_DEVICE(FTDI_VID, TI_XDS100V2_PID),
    857                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    858         { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) },
    859         { USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) },
    860         { USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) },
    861         { USB_DEVICE(FTDI_VID, HAMEG_HO870_PID) },
    862         { USB_DEVICE(FTDI_VID, MJSG_GENERIC_PID) },
    863         { USB_DEVICE(FTDI_VID, MJSG_SR_RADIO_PID) },
    864         { USB_DEVICE(FTDI_VID, MJSG_HD_RADIO_PID) },
    865         { USB_DEVICE(FTDI_VID, MJSG_XM_RADIO_PID) },
    866         { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_ST_PID),
    867                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    868         { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SLITE_PID),
    869                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    870         { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH2_PID),
    871                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    872         { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID),
    873                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    874         { USB_DEVICE(FTDI_VID, SEGWAY_RMP200_PID) },
    875         { USB_DEVICE(FTDI_VID, ACCESIO_COM4SM_PID) },
    876         { USB_DEVICE(IONICS_VID, IONICS_PLUGCOMPUTER_PID),
    877                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    878         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_24_MASTER_WING_PID) },
    879         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_PC_WING_PID) },
    880         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_USB_DMX_PID) },
    881         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MIDI_TIMECODE_PID) },
    882         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MINI_WING_PID) },
    883         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MAXI_WING_PID) },
    884         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MEDIA_WING_PID) },
    885         { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_WING_PID) },
    886         { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LOGBOOKML_PID) },
    887         { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_LS_LOGBOOK_PID) },
    888         { USB_DEVICE(FTDI_VID, FTDI_SCIENCESCOPE_HS_LOGBOOK_PID) },
    889         { USB_DEVICE(FTDI_VID, FTDI_CINTERION_MC55I_PID) },
    890         { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) },
    891         { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID),
    892                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    893         { USB_DEVICE(ST_VID, ST_STMCLT_2232_PID),
    894                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    895         { USB_DEVICE(ST_VID, ST_STMCLT_4232_PID),
    896                 .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk },
    897         { USB_DEVICE(FTDI_VID, FTDI_RF_R106) },
    898         { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID),
    899                 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    900         { USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) },
    901         /* Crucible Devices */
    902         { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) },
    903         { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) },
    904         /* Cressi Devices */
    905         { USB_DEVICE(FTDI_VID, FTDI_CRESSI_PID) },
    906         /* Brainboxes Devices */
    907         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_001_PID) },
    908         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_012_PID) },
    909         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_023_PID) },
    910         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_034_PID) },
    911         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_101_PID) },
    912         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_1_PID) },
    913         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_2_PID) },
    914         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_3_PID) },
    915         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_4_PID) },
    916         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_5_PID) },
    917         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_6_PID) },
    918         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_7_PID) },
    919         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_8_PID) },
    920         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_257_PID) },
    921         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_1_PID) },
    922         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_2_PID) },
    923         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_3_PID) },
    924         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_4_PID) },
    925         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_313_PID) },
    926         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_324_PID) },
    927         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_1_PID) },
    928         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_2_PID) },
    929         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_357_PID) },
    930         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_1_PID) },
    931         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_2_PID) },
    932         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_3_PID) },
    933         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_1_PID) },
    934         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_2_PID) },
    935         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_1_PID) },
    936         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_2_PID) },
    937         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_3_PID) },
    938         { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_4_PID) },
    939         /* ekey Devices */
    940         { USB_DEVICE(FTDI_VID, FTDI_EKEY_CONV_USB_PID) },
    941         /* Infineon Devices */
    942         { USB_DEVICE_INTERFACE_NUMBER(INFINEON_VID, INFINEON_TRIBOARD_PID, 1) },
    943         /* GE Healthcare devices */
    944         { USB_DEVICE(GE_HEALTHCARE_VID, GE_HEALTHCARE_NEMO_TRACKER_PID) },
    945         { }                                     /* Terminating entry */
    946 };
    947 
    948 MODULE_DEVICE_TABLE(usb, id_table_combined);
    949 
    950 static const char *ftdi_chip_name[] = {
    951         [SIO] = "SIO",  /* the serial part of FT8U100AX */
    952         [FT8U232AM] = "FT8U232AM",
    953         [FT232BM] = "FT232BM",
    954         [FT2232C] = "FT2232C",
    955         [FT232RL] = "FT232RL",
    956         [FT2232H] = "FT2232H",
    957         [FT4232H] = "FT4232H",
    958         [FT232H]  = "FT232H",
    959         [FTX]     = "FT-X"
    960 };
    961 
    962 
    963 /* Used for TIOCMIWAIT */
    964 #define FTDI_STATUS_B0_MASK     (FTDI_RS0_CTS | FTDI_RS0_DSR | FTDI_RS0_RI | FTDI_RS0_RLSD)
    965 #define FTDI_STATUS_B1_MASK     (FTDI_RS_BI)
    966 /* End TIOCMIWAIT */
    967 
    968 /* function prototypes for a FTDI serial converter */
    969 static int  ftdi_sio_probe(struct usb_serial *serial,
    970                                         const struct usb_device_id *id);
    971 static int  ftdi_sio_port_probe(struct usb_serial_port *port);
    972 static int  ftdi_sio_port_remove(struct usb_serial_port *port);
    973 static int  ftdi_open(struct tty_struct *tty, struct usb_serial_port *port);
    974 static void ftdi_dtr_rts(struct usb_serial_port *port, int on);
    975 static void ftdi_process_read_urb(struct urb *urb);
    976 static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
    977                                                 void *dest, size_t size);
    978 static void ftdi_set_termios(struct tty_struct *tty,
    979                         struct usb_serial_port *port, struct ktermios *old);
    980 static int  ftdi_tiocmget(struct tty_struct *tty);
    981 static int  ftdi_tiocmset(struct tty_struct *tty,
    982                         unsigned int set, unsigned int clear);
    983 static int  ftdi_ioctl(struct tty_struct *tty,
    984                         unsigned int cmd, unsigned long arg);
    985 static void ftdi_break_ctl(struct tty_struct *tty, int break_state);
    986 static bool ftdi_tx_empty(struct usb_serial_port *port);
    987 static int ftdi_get_modem_status(struct usb_serial_port *port,
    988                                                 unsigned char status[2]);
    989 
    990 static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base);
    991 static unsigned short int ftdi_232am_baud_to_divisor(int baud);
    992 static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base);
    993 static __u32 ftdi_232bm_baud_to_divisor(int baud);
    994 static __u32 ftdi_2232h_baud_base_to_divisor(int baud, int base);
    995 static __u32 ftdi_2232h_baud_to_divisor(int baud);
    996 
    997 static struct usb_serial_driver ftdi_sio_device = {
    998         .driver = {
    999                 .owner =        THIS_MODULE,
    1000                 .name =         "ftdi_sio",
    1001         },
    1002         .description =          "FTDI USB Serial Device",
    1003         .id_table =             id_table_combined,
    1004         .num_ports =            1,
    1005         .bulk_in_size =         512,
    1006         .bulk_out_size =        256,
    1007         .probe =                ftdi_sio_probe,
    1008         .port_probe =           ftdi_sio_port_probe,
    1009         .port_remove =          ftdi_sio_port_remove,
    1010         .open =                 ftdi_open,
    1011         .dtr_rts =              ftdi_dtr_rts,
    1012         .throttle =             usb_serial_generic_throttle,
    1013         .unthrottle =           usb_serial_generic_unthrottle,
    1014         .process_read_urb =     ftdi_process_read_urb,
    1015         .prepare_write_buffer = ftdi_prepare_write_buffer,
    1016         .tiocmget =             ftdi_tiocmget,
    1017         .tiocmset =             ftdi_tiocmset,
    1018         .tiocmiwait =           usb_serial_generic_tiocmiwait,
    1019         .get_icount =           usb_serial_generic_get_icount,
    1020         .ioctl =                ftdi_ioctl,
    1021         .set_termios =          ftdi_set_termios,
    1022         .break_ctl =            ftdi_break_ctl,
    1023         .tx_empty =             ftdi_tx_empty,
    1024 };
    1025 
    1026 static struct usb_serial_driver * const serial_drivers[] = {
    1027         &ftdi_sio_device, NULL
    1028 };
    1029 
    1030 
    1031 #define WDR_TIMEOUT 5000 /* default urb timeout */
    1032 #define WDR_SHORT_TIMEOUT 1000  /* shorter urb timeout */
    1033 
    1034 /*
    1035  * ***************************************************************************
    1036  * Utility functions
    1037  * ***************************************************************************
    1038  */
    1039 
    1040 static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base)
    1041 {
    1042         unsigned short int divisor;
    1043         /* divisor shifted 3 bits to the left */
    1044         int divisor3 = base / 2 / baud;
    1045         if ((divisor3 & 0x7) == 7)
    1046                 divisor3++; /* round x.7/8 up to x+1 */
    1047         divisor = divisor3 >> 3;
    1048         divisor3 &= 0x7;
    1049         if (divisor3 == 1)
    1050                 divisor |= 0xc000;
    1051         else if (divisor3 >= 4)
    1052                 divisor |= 0x4000;
    1053         else if (divisor3 != 0)
    1054                 divisor |= 0x8000;
    1055         else if (divisor == 1)
    1056                 divisor = 0;    /* special case for maximum baud rate */
    1057         return divisor;
    1058 }
    1059 
    1060 static unsigned short int ftdi_232am_baud_to_divisor(int baud)
    1061 {
    1062          return ftdi_232am_baud_base_to_divisor(baud, 48000000);
    1063 }
    1064 
    1065 static __u32 ftdi_232bm_baud_base_to_divisor(int baud, int base)
    1066 {
    1067         static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
    1068         __u32 divisor;
    1069         /* divisor shifted 3 bits to the left */
    1070         int divisor3 = base / 2 / baud;
    1071         divisor = divisor3 >> 3;
    1072         divisor |= (__u32)divfrac[divisor3 & 0x7] << 14;
    1073         /* Deal with special cases for highest baud rates. */
    1074         if (divisor == 1)
    1075                 divisor = 0;
    1076         else if (divisor == 0x4001)
    1077                 divisor = 1;
    1078         return divisor;
    1079 }
    1080 
    1081 static __u32 ftdi_232bm_baud_to_divisor(int baud)
    1082 {
    1083          return ftdi_232bm_baud_base_to_divisor(baud, 48000000);
    1084 }
    1085 
    1086 static __u32 ftdi_2232h_baud_base_to_divisor(int baud, int base)
    1087 {
    1088         static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
    1089         __u32 divisor;
    1090         int divisor3;
    1091 
    1092         /* hi-speed baud rate is 10-bit sampling instead of 16-bit */
    1093         divisor3 = base * 8 / (baud * 10);
    1094 
    1095         divisor = divisor3 >> 3;
    1096         divisor |= (__u32)divfrac[divisor3 & 0x7] << 14;
    1097         /* Deal with special cases for highest baud rates. */
    1098         if (divisor == 1)
    1099                 divisor = 0;
    1100         else if (divisor == 0x4001)
    1101                 divisor = 1;
    1102         /*
    1103          * Set this bit to turn off a divide by 2.5 on baud rate generator
    1104          * This enables baud rates up to 12Mbaud but cannot reach below 1200
    1105          * baud with this bit set
    1106          */
    1107         divisor |= 0x00020000;
    1108         return divisor;
    1109 }
    1110 
    1111 static __u32 ftdi_2232h_baud_to_divisor(int baud)
    1112 {
    1113          return ftdi_2232h_baud_base_to_divisor(baud, 120000000);
    1114 }
    1115 
    1116 #define set_mctrl(port, set)            update_mctrl((port), (set), 0)
    1117 #define clear_mctrl(port, clear)        update_mctrl((port), 0, (clear))
    1118 
    1119 static int update_mctrl(struct usb_serial_port *port, unsigned int set,
    1120                                                         unsigned int clear)
    1121 {
    1122         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1123         struct device *dev = &port->dev;
    1124         unsigned urb_value;
    1125         int rv;
    1126 
    1127         if (((set | clear) & (TIOCM_DTR | TIOCM_RTS)) == 0) {
    1128                 dev_dbg(dev, "%s - DTR|RTS not being set|cleared
    ", __func__);
    1129                 return 0;       /* no change */
    1130         }
    1131 
    1132         clear &= ~set;  /* 'set' takes precedence over 'clear' */
    1133         urb_value = 0;
    1134         if (clear & TIOCM_DTR)
    1135                 urb_value |= FTDI_SIO_SET_DTR_LOW;
    1136         if (clear & TIOCM_RTS)
    1137                 urb_value |= FTDI_SIO_SET_RTS_LOW;
    1138         if (set & TIOCM_DTR)
    1139                 urb_value |= FTDI_SIO_SET_DTR_HIGH;
    1140         if (set & TIOCM_RTS)
    1141                 urb_value |= FTDI_SIO_SET_RTS_HIGH;
    1142         rv = usb_control_msg(port->serial->dev,
    1143                                usb_sndctrlpipe(port->serial->dev, 0),
    1144                                FTDI_SIO_SET_MODEM_CTRL_REQUEST,
    1145                                FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE,
    1146                                urb_value, priv->interface,
    1147                                NULL, 0, WDR_TIMEOUT);
    1148         if (rv < 0) {
    1149                 dev_dbg(dev, "%s Error from MODEM_CTRL urb: DTR %s, RTS %s
    ",
    1150                         __func__,
    1151                         (set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged",
    1152                         (set & TIOCM_RTS) ? "HIGH" : (clear & TIOCM_RTS) ? "LOW" : "unchanged");
    1153                 rv = usb_translate_errors(rv);
    1154         } else {
    1155                 dev_dbg(dev, "%s - DTR %s, RTS %s
    ", __func__,
    1156                         (set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged",
    1157                         (set & TIOCM_RTS) ? "HIGH" : (clear & TIOCM_RTS) ? "LOW" : "unchanged");
    1158                 /* FIXME: locking on last_dtr_rts */
    1159                 priv->last_dtr_rts = (priv->last_dtr_rts & ~clear) | set;
    1160         }
    1161         return rv;
    1162 }
    1163 
    1164 
    1165 static __u32 get_ftdi_divisor(struct tty_struct *tty,
    1166                                                 struct usb_serial_port *port)
    1167 {
    1168         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1169         struct device *dev = &port->dev;
    1170         __u32 div_value = 0;
    1171         int div_okay = 1;
    1172         int baud;
    1173 
    1174         /*
    1175          * The logic involved in setting the baudrate can be cleanly split into
    1176          * 3 steps.
    1177          * 1. Standard baud rates are set in tty->termios->c_cflag
    1178          * 2. If these are not enough, you can set any speed using alt_speed as
    1179          * follows:
    1180          *    - set tty->termios->c_cflag speed to B38400
    1181          *    - set your real speed in tty->alt_speed; it gets ignored when
    1182          *      alt_speed==0, (or)
    1183          *    - call TIOCSSERIAL ioctl with (struct serial_struct) set as
    1184          *      follows:
    1185          *      flags & ASYNC_SPD_MASK == ASYNC_SPD_[HI, VHI, SHI, WARP],
    1186          *      this just sets alt_speed to (HI: 57600, VHI: 115200,
    1187          *      SHI: 230400, WARP: 460800)
    1188          * ** Steps 1, 2 are done courtesy of tty_get_baud_rate
    1189          * 3. You can also set baud rate by setting custom divisor as follows
    1190          *    - set tty->termios->c_cflag speed to B38400
    1191          *    - call TIOCSSERIAL ioctl with (struct serial_struct) set as
    1192          *      follows:
    1193          *      o flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST
    1194          *      o custom_divisor set to baud_base / your_new_baudrate
    1195          * ** Step 3 is done courtesy of code borrowed from serial.c
    1196          *    I should really spend some time and separate + move this common
    1197          *    code to serial.c, it is replicated in nearly every serial driver
    1198          *    you see.
    1199          */
    1200 
    1201         /* 1. Get the baud rate from the tty settings, this observes
    1202               alt_speed hack */
    1203 
    1204         baud = tty_get_baud_rate(tty);
    1205         dev_dbg(dev, "%s - tty_get_baud_rate reports speed %d
    ", __func__, baud);
    1206 
    1207         /* 2. Observe async-compatible custom_divisor hack, update baudrate
    1208            if needed */
    1209 
    1210         if (baud == 38400 &&
    1211             ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
    1212              (priv->custom_divisor)) {
    1213                 baud = priv->baud_base / priv->custom_divisor;
    1214                 dev_dbg(dev, "%s - custom divisor %d sets baud rate to %d
    ",
    1215                         __func__, priv->custom_divisor, baud);
    1216         }
    1217 
    1218         /* 3. Convert baudrate to device-specific divisor */
    1219 
    1220         if (!baud)
    1221                 baud = 9600;
    1222         switch (priv->chip_type) {
    1223         case SIO: /* SIO chip */
    1224                 switch (baud) {
    1225                 case 300: div_value = ftdi_sio_b300; break;
    1226                 case 600: div_value = ftdi_sio_b600; break;
    1227                 case 1200: div_value = ftdi_sio_b1200; break;
    1228                 case 2400: div_value = ftdi_sio_b2400; break;
    1229                 case 4800: div_value = ftdi_sio_b4800; break;
    1230                 case 9600: div_value = ftdi_sio_b9600; break;
    1231                 case 19200: div_value = ftdi_sio_b19200; break;
    1232                 case 38400: div_value = ftdi_sio_b38400; break;
    1233                 case 57600: div_value = ftdi_sio_b57600;  break;
    1234                 case 115200: div_value = ftdi_sio_b115200; break;
    1235                 } /* baud */
    1236                 if (div_value == 0) {
    1237                         dev_dbg(dev, "%s - Baudrate (%d) requested is not supported
    ",
    1238                                 __func__,  baud);
    1239                         div_value = ftdi_sio_b9600;
    1240                         baud = 9600;
    1241                         div_okay = 0;
    1242                 }
    1243                 break;
    1244         case FT8U232AM: /* 8U232AM chip */
    1245                 if (baud <= 3000000) {
    1246                         div_value = ftdi_232am_baud_to_divisor(baud);
    1247                 } else {
    1248                         dev_dbg(dev, "%s - Baud rate too high!
    ", __func__);
    1249                         baud = 9600;
    1250                         div_value = ftdi_232am_baud_to_divisor(9600);
    1251                         div_okay = 0;
    1252                 }
    1253                 break;
    1254         case FT232BM: /* FT232BM chip */
    1255         case FT2232C: /* FT2232C chip */
    1256         case FT232RL: /* FT232RL chip */
    1257         case FTX:     /* FT-X series */
    1258                 if (baud <= 3000000) {
    1259                         __u16 product_id = le16_to_cpu(
    1260                                 port->serial->dev->descriptor.idProduct);
    1261                         if (((FTDI_NDI_HUC_PID == product_id) ||
    1262                              (FTDI_NDI_SPECTRA_SCU_PID == product_id) ||
    1263                              (FTDI_NDI_FUTURE_2_PID == product_id) ||
    1264                              (FTDI_NDI_FUTURE_3_PID == product_id) ||
    1265                              (FTDI_NDI_AURORA_SCU_PID == product_id)) &&
    1266                             (baud == 19200)) {
    1267                                 baud = 1200000;
    1268                         }
    1269                         div_value = ftdi_232bm_baud_to_divisor(baud);
    1270                 } else {
    1271                         dev_dbg(dev, "%s - Baud rate too high!
    ", __func__);
    1272                         div_value = ftdi_232bm_baud_to_divisor(9600);
    1273                         div_okay = 0;
    1274                         baud = 9600;
    1275                 }
    1276                 break;
    1277         case FT2232H: /* FT2232H chip */
    1278         case FT4232H: /* FT4232H chip */
    1279         case FT232H:  /* FT232H chip */
    1280                 if ((baud <= 12000000) && (baud >= 1200)) {
    1281                         div_value = ftdi_2232h_baud_to_divisor(baud);
    1282                 } else if (baud < 1200) {
    1283                         div_value = ftdi_232bm_baud_to_divisor(baud);
    1284                 } else {
    1285                         dev_dbg(dev, "%s - Baud rate too high!
    ", __func__);
    1286                         div_value = ftdi_232bm_baud_to_divisor(9600);
    1287                         div_okay = 0;
    1288                         baud = 9600;
    1289                 }
    1290                 break;
    1291         } /* priv->chip_type */
    1292 
    1293         if (div_okay) {
    1294                 dev_dbg(dev, "%s - Baud rate set to %d (divisor 0x%lX) on chip %s
    ",
    1295                         __func__, baud, (unsigned long)div_value,
    1296                         ftdi_chip_name[priv->chip_type]);
    1297         }
    1298 
    1299         tty_encode_baud_rate(tty, baud, baud);
    1300         return div_value;
    1301 }
    1302 
    1303 static int change_speed(struct tty_struct *tty, struct usb_serial_port *port)
    1304 {
    1305         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1306         __u16 urb_value;
    1307         __u16 urb_index;
    1308         __u32 urb_index_value;
    1309         int rv;
    1310 
    1311         urb_index_value = get_ftdi_divisor(tty, port);
    1312         urb_value = (__u16)urb_index_value;
    1313         urb_index = (__u16)(urb_index_value >> 16);
    1314         if ((priv->chip_type == FT2232C) || (priv->chip_type == FT2232H) ||
    1315                 (priv->chip_type == FT4232H) || (priv->chip_type == FT232H)) {
    1316                 /* Probably the BM type needs the MSB of the encoded fractional
    1317                  * divider also moved like for the chips above. Any infos? */
    1318                 urb_index = (__u16)((urb_index << 8) | priv->interface);
    1319         }
    1320 
    1321         rv = usb_control_msg(port->serial->dev,
    1322                             usb_sndctrlpipe(port->serial->dev, 0),
    1323                             FTDI_SIO_SET_BAUDRATE_REQUEST,
    1324                             FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE,
    1325                             urb_value, urb_index,
    1326                             NULL, 0, WDR_SHORT_TIMEOUT);
    1327         return rv;
    1328 }
    1329 
    1330 static int write_latency_timer(struct usb_serial_port *port)
    1331 {
    1332         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1333         struct usb_device *udev = port->serial->dev;
    1334         int rv;
    1335         int l = priv->latency;
    1336 
    1337         if (priv->flags & ASYNC_LOW_LATENCY)
    1338                 l = 1;
    1339 
    1340         dev_dbg(&port->dev, "%s: setting latency timer = %i
    ", __func__, l);
    1341 
    1342         rv = usb_control_msg(udev,
    1343                              usb_sndctrlpipe(udev, 0),
    1344                              FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
    1345                              FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
    1346                              l, priv->interface,
    1347                              NULL, 0, WDR_TIMEOUT);
    1348         if (rv < 0)
    1349                 dev_err(&port->dev, "Unable to write latency timer: %i
    ", rv);
    1350         return rv;
    1351 }
    1352 
    1353 static int read_latency_timer(struct usb_serial_port *port)
    1354 {
    1355         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1356         struct usb_device *udev = port->serial->dev;
    1357         unsigned char *buf;
    1358         int rv;
    1359 
    1360         buf = kmalloc(1, GFP_KERNEL);
    1361         if (!buf)
    1362                 return -ENOMEM;
    1363 
    1364         rv = usb_control_msg(udev,
    1365                              usb_rcvctrlpipe(udev, 0),
    1366                              FTDI_SIO_GET_LATENCY_TIMER_REQUEST,
    1367                              FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE,
    1368                              0, priv->interface,
    1369                              buf, 1, WDR_TIMEOUT);
    1370         if (rv < 0)
    1371                 dev_err(&port->dev, "Unable to read latency timer: %i
    ", rv);
    1372         else
    1373                 priv->latency = buf[0];
    1374 
    1375         kfree(buf);
    1376 
    1377         return rv;
    1378 }
    1379 
    1380 static int get_serial_info(struct usb_serial_port *port,
    1381                                 struct serial_struct __user *retinfo)
    1382 {
    1383         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1384         struct serial_struct tmp;
    1385 
    1386         if (!retinfo)
    1387                 return -EFAULT;
    1388         memset(&tmp, 0, sizeof(tmp));
    1389         tmp.flags = priv->flags;
    1390         tmp.baud_base = priv->baud_base;
    1391         tmp.custom_divisor = priv->custom_divisor;
    1392         if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
    1393                 return -EFAULT;
    1394         return 0;
    1395 }
    1396 
    1397 static int set_serial_info(struct tty_struct *tty,
    1398         struct usb_serial_port *port, struct serial_struct __user *newinfo)
    1399 {
    1400         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1401         struct serial_struct new_serial;
    1402         struct ftdi_private old_priv;
    1403 
    1404         if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
    1405                 return -EFAULT;
    1406 
    1407         mutex_lock(&priv->cfg_lock);
    1408         old_priv = *priv;
    1409 
    1410         /* Do error checking and permission checking */
    1411 
    1412         if (!capable(CAP_SYS_ADMIN)) {
    1413                 if (((new_serial.flags & ~ASYNC_USR_MASK) !=
    1414                      (priv->flags & ~ASYNC_USR_MASK))) {
    1415                         mutex_unlock(&priv->cfg_lock);
    1416                         return -EPERM;
    1417                 }
    1418                 priv->flags = ((priv->flags & ~ASYNC_USR_MASK) |
    1419                                (new_serial.flags & ASYNC_USR_MASK));
    1420                 priv->custom_divisor = new_serial.custom_divisor;
    1421                 goto check_and_exit;
    1422         }
    1423 
    1424         if (new_serial.baud_base != priv->baud_base) {
    1425                 mutex_unlock(&priv->cfg_lock);
    1426                 return -EINVAL;
    1427         }
    1428 
    1429         /* Make the changes - these are privileged changes! */
    1430 
    1431         priv->flags = ((priv->flags & ~ASYNC_FLAGS) |
    1432                                         (new_serial.flags & ASYNC_FLAGS));
    1433         priv->custom_divisor = new_serial.custom_divisor;
    1434 
    1435         write_latency_timer(port);
    1436 
    1437 check_and_exit:
    1438         if ((old_priv.flags & ASYNC_SPD_MASK) !=
    1439              (priv->flags & ASYNC_SPD_MASK)) {
    1440                 if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
    1441                         tty->alt_speed = 57600;
    1442                 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
    1443                         tty->alt_speed = 115200;
    1444                 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
    1445                         tty->alt_speed = 230400;
    1446                 else if ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
    1447                         tty->alt_speed = 460800;
    1448                 else
    1449                         tty->alt_speed = 0;
    1450         }
    1451         if (((old_priv.flags & ASYNC_SPD_MASK) !=
    1452              (priv->flags & ASYNC_SPD_MASK)) ||
    1453             (((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
    1454              (old_priv.custom_divisor != priv->custom_divisor))) {
    1455                 change_speed(tty, port);
    1456                 mutex_unlock(&priv->cfg_lock);
    1457         }
    1458         else
    1459                 mutex_unlock(&priv->cfg_lock);
    1460         return 0;
    1461 }
    1462 
    1463 static int get_lsr_info(struct usb_serial_port *port,
    1464                         struct serial_struct __user *retinfo)
    1465 {
    1466         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1467         unsigned int result = 0;
    1468 
    1469         if (!retinfo)
    1470                 return -EFAULT;
    1471 
    1472         if (priv->transmit_empty)
    1473                 result = TIOCSER_TEMT;
    1474 
    1475         if (copy_to_user(retinfo, &result, sizeof(unsigned int)))
    1476                 return -EFAULT;
    1477         return 0;
    1478 }
    1479 
    1480 
    1481 /* Determine type of FTDI chip based on USB config and descriptor. */
    1482 static void ftdi_determine_type(struct usb_serial_port *port)
    1483 {
    1484         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1485         struct usb_serial *serial = port->serial;
    1486         struct usb_device *udev = serial->dev;
    1487         unsigned version;
    1488         unsigned interfaces;
    1489 
    1490         /* Assume it is not the original SIO device for now. */
    1491         priv->baud_base = 48000000 / 2;
    1492 
    1493         version = le16_to_cpu(udev->descriptor.bcdDevice);
    1494         interfaces = udev->actconfig->desc.bNumInterfaces;
    1495         dev_dbg(&port->dev, "%s: bcdDevice = 0x%x, bNumInterfaces = %u
    ", __func__,
    1496                 version, interfaces);
    1497         if (interfaces > 1) {
    1498                 int inter;
    1499 
    1500                 /* Multiple interfaces.*/
    1501                 if (version == 0x0800) {
    1502                         priv->chip_type = FT4232H;
    1503                         /* Hi-speed - baud clock runs at 120MHz */
    1504                         priv->baud_base = 120000000 / 2;
    1505                 } else if (version == 0x0700) {
    1506                         priv->chip_type = FT2232H;
    1507                         /* Hi-speed - baud clock runs at 120MHz */
    1508                         priv->baud_base = 120000000 / 2;
    1509                 } else
    1510                         priv->chip_type = FT2232C;
    1511 
    1512                 /* Determine interface code. */
    1513                 inter = serial->interface->altsetting->desc.bInterfaceNumber;
    1514                 if (inter == 0) {
    1515                         priv->interface = INTERFACE_A;
    1516                 } else  if (inter == 1) {
    1517                         priv->interface = INTERFACE_B;
    1518                 } else  if (inter == 2) {
    1519                         priv->interface = INTERFACE_C;
    1520                 } else  if (inter == 3) {
    1521                         priv->interface = INTERFACE_D;
    1522                 }
    1523                 /* BM-type devices have a bug where bcdDevice gets set
    1524                  * to 0x200 when iSerialNumber is 0.  */
    1525                 if (version < 0x500) {
    1526                         dev_dbg(&port->dev,
    1527                                 "%s: something fishy - bcdDevice too low for multi-interface device
    ",
    1528                                 __func__);
    1529                 }
    1530         } else if (version < 0x200) {
    1531                 /* Old device.  Assume it's the original SIO. */
    1532                 priv->chip_type = SIO;
    1533                 priv->baud_base = 12000000 / 16;
    1534         } else if (version < 0x400) {
    1535                 /* Assume it's an FT8U232AM (or FT8U245AM) */
    1536                 /* (It might be a BM because of the iSerialNumber bug,
    1537                  * but it will still work as an AM device.) */
    1538                 priv->chip_type = FT8U232AM;
    1539         } else if (version < 0x600) {
    1540                 /* Assume it's an FT232BM (or FT245BM) */
    1541                 priv->chip_type = FT232BM;
    1542         } else if (version < 0x900) {
    1543                 /* Assume it's an FT232RL */
    1544                 priv->chip_type = FT232RL;
    1545         } else if (version < 0x1000) {
    1546                 /* Assume it's an FT232H */
    1547                 priv->chip_type = FT232H;
    1548         } else {
    1549                 /* Assume it's an FT-X series device */
    1550                 priv->chip_type = FTX;
    1551         }
    1552 
    1553         dev_info(&udev->dev, "Detected %s
    ", ftdi_chip_name[priv->chip_type]);
    1554 }
    1555 
    1556 
    1557 /*
    1558  * Determine the maximum packet size for the device. This depends on the chip
    1559  * type and the USB host capabilities. The value should be obtained from the
    1560  * device descriptor as the chip will use the appropriate values for the host.
    1561  */
    1562 static void ftdi_set_max_packet_size(struct usb_serial_port *port)
    1563 {
    1564         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1565         struct usb_interface *interface = port->serial->interface;
    1566         struct usb_endpoint_descriptor *ep_desc;
    1567         unsigned num_endpoints;
    1568         unsigned i;
    1569 
    1570         num_endpoints = interface->cur_altsetting->desc.bNumEndpoints;
    1571         if (!num_endpoints)
    1572                 return;
    1573 
    1574         /*
    1575          * NOTE: Some customers have programmed FT232R/FT245R devices
    1576          * with an endpoint size of 0 - not good. In this case, we
    1577          * want to override the endpoint descriptor setting and use a
    1578          * value of 64 for wMaxPacketSize.
    1579          */
    1580         for (i = 0; i < num_endpoints; i++) {
    1581                 ep_desc = &interface->cur_altsetting->endpoint[i].desc;
    1582                 if (!ep_desc->wMaxPacketSize) {
    1583                         ep_desc->wMaxPacketSize = cpu_to_le16(0x40);
    1584                         dev_warn(&port->dev, "Overriding wMaxPacketSize on endpoint %d
    ",
    1585                                         usb_endpoint_num(ep_desc));
    1586                 }
    1587         }
    1588 
    1589         /* Set max packet size based on last descriptor. */
    1590         priv->max_packet_size = usb_endpoint_maxp(ep_desc);
    1591 }
    1592 
    1593 
    1594 /*
    1595  * ***************************************************************************
    1596  * Sysfs Attribute
    1597  * ***************************************************************************
    1598  */
    1599 
    1600 static ssize_t latency_timer_show(struct device *dev,
    1601                                   struct device_attribute *attr, char *buf)
    1602 {
    1603         struct usb_serial_port *port = to_usb_serial_port(dev);
    1604         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1605         if (priv->flags & ASYNC_LOW_LATENCY)
    1606                 return sprintf(buf, "1
    ");
    1607         else
    1608                 return sprintf(buf, "%i
    ", priv->latency);
    1609 }
    1610 
    1611 /* Write a new value of the latency timer, in units of milliseconds. */
    1612 static ssize_t latency_timer_store(struct device *dev,
    1613                                    struct device_attribute *attr,
    1614                                    const char *valbuf, size_t count)
    1615 {
    1616         struct usb_serial_port *port = to_usb_serial_port(dev);
    1617         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1618         int v = simple_strtoul(valbuf, NULL, 10);
    1619         int rv;
    1620 
    1621         priv->latency = v;
    1622         rv = write_latency_timer(port);
    1623         if (rv < 0)
    1624                 return -EIO;
    1625         return count;
    1626 }
    1627 static DEVICE_ATTR_RW(latency_timer);
    1628 
    1629 /* Write an event character directly to the FTDI register.  The ASCII
    1630    value is in the low 8 bits, with the enable bit in the 9th bit. */
    1631 static ssize_t store_event_char(struct device *dev,
    1632         struct device_attribute *attr, const char *valbuf, size_t count)
    1633 {
    1634         struct usb_serial_port *port = to_usb_serial_port(dev);
    1635         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1636         struct usb_device *udev = port->serial->dev;
    1637         int v = simple_strtoul(valbuf, NULL, 10);
    1638         int rv;
    1639 
    1640         dev_dbg(&port->dev, "%s: setting event char = %i
    ", __func__, v);
    1641 
    1642         rv = usb_control_msg(udev,
    1643                              usb_sndctrlpipe(udev, 0),
    1644                              FTDI_SIO_SET_EVENT_CHAR_REQUEST,
    1645                              FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE,
    1646                              v, priv->interface,
    1647                              NULL, 0, WDR_TIMEOUT);
    1648         if (rv < 0) {
    1649                 dev_dbg(&port->dev, "Unable to write event character: %i
    ", rv);
    1650                 return -EIO;
    1651         }
    1652 
    1653         return count;
    1654 }
    1655 static DEVICE_ATTR(event_char, S_IWUSR, NULL, store_event_char);
    1656 
    1657 static int create_sysfs_attrs(struct usb_serial_port *port)
    1658 {
    1659         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1660         int retval = 0;
    1661 
    1662         /* XXX I've no idea if the original SIO supports the event_char
    1663          * sysfs parameter, so I'm playing it safe.  */
    1664         if (priv->chip_type != SIO) {
    1665                 dev_dbg(&port->dev, "sysfs attributes for %s
    ", ftdi_chip_name[priv->chip_type]);
    1666                 retval = device_create_file(&port->dev, &dev_attr_event_char);
    1667                 if ((!retval) &&
    1668                     (priv->chip_type == FT232BM ||
    1669                      priv->chip_type == FT2232C ||
    1670                      priv->chip_type == FT232RL ||
    1671                      priv->chip_type == FT2232H ||
    1672                      priv->chip_type == FT4232H ||
    1673                      priv->chip_type == FT232H ||
    1674                      priv->chip_type == FTX)) {
    1675                         retval = device_create_file(&port->dev,
    1676                                                     &dev_attr_latency_timer);
    1677                 }
    1678         }
    1679         return retval;
    1680 }
    1681 
    1682 static void remove_sysfs_attrs(struct usb_serial_port *port)
    1683 {
    1684         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1685 
    1686         /* XXX see create_sysfs_attrs */
    1687         if (priv->chip_type != SIO) {
    1688                 device_remove_file(&port->dev, &dev_attr_event_char);
    1689                 if (priv->chip_type == FT232BM ||
    1690                     priv->chip_type == FT2232C ||
    1691                     priv->chip_type == FT232RL ||
    1692                     priv->chip_type == FT2232H ||
    1693                     priv->chip_type == FT4232H ||
    1694                     priv->chip_type == FT232H ||
    1695                     priv->chip_type == FTX) {
    1696                         device_remove_file(&port->dev, &dev_attr_latency_timer);
    1697                 }
    1698         }
    1699 
    1700 }
    1701 
    1702 /*
    1703  * ***************************************************************************
    1704  * FTDI driver specific functions
    1705  * ***************************************************************************
    1706  */
    1707 
    1708 /* Probe function to check for special devices */
    1709 static int ftdi_sio_probe(struct usb_serial *serial,
    1710                                         const struct usb_device_id *id)
    1711 {
    1712         struct ftdi_sio_quirk *quirk =
    1713                                 (struct ftdi_sio_quirk *)id->driver_info;
    1714 
    1715         if (quirk && quirk->probe) {
    1716                 int ret = quirk->probe(serial);
    1717                 if (ret != 0)
    1718                         return ret;
    1719         }
    1720 
    1721         usb_set_serial_data(serial, (void *)id->driver_info);
    1722 
    1723         return 0;
    1724 }
    1725 
    1726 static int ftdi_sio_port_probe(struct usb_serial_port *port)
    1727 {
    1728         struct ftdi_private *priv;
    1729         struct ftdi_sio_quirk *quirk = usb_get_serial_data(port->serial);
    1730 
    1731 
    1732         priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL);
    1733         if (!priv)
    1734                 return -ENOMEM;
    1735 
    1736         mutex_init(&priv->cfg_lock);
    1737 
    1738         priv->flags = ASYNC_LOW_LATENCY;
    1739 
    1740         if (quirk && quirk->port_probe)
    1741                 quirk->port_probe(priv);
    1742 
    1743         usb_set_serial_port_data(port, priv);
    1744 
    1745         ftdi_determine_type(port);
    1746         ftdi_set_max_packet_size(port);
    1747         if (read_latency_timer(port) < 0)
    1748                 priv->latency = 16;
    1749         write_latency_timer(port);
    1750         create_sysfs_attrs(port);
    1751         return 0;
    1752 }
    1753 
    1754 /* Setup for the USB-UIRT device, which requires hardwired
    1755  * baudrate (38400 gets mapped to 312500) */
    1756 /* Called from usbserial:serial_probe */
    1757 static void ftdi_USB_UIRT_setup(struct ftdi_private *priv)
    1758 {
    1759         priv->flags |= ASYNC_SPD_CUST;
    1760         priv->custom_divisor = 77;
    1761         priv->force_baud = 38400;
    1762 }
    1763 
    1764 /* Setup for the HE-TIRA1 device, which requires hardwired
    1765  * baudrate (38400 gets mapped to 100000) and RTS-CTS enabled.  */
    1766 
    1767 static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv)
    1768 {
    1769         priv->flags |= ASYNC_SPD_CUST;
    1770         priv->custom_divisor = 240;
    1771         priv->force_baud = 38400;
    1772         priv->force_rtscts = 1;
    1773 }
    1774 
    1775 /*
    1776  * Module parameter to control latency timer for NDI FTDI-based USB devices.
    1777  * If this value is not set in /etc/modprobe.d/ its value will be set
    1778  * to 1ms.
    1779  */
    1780 static int ndi_latency_timer = 1;
    1781 
    1782 /* Setup for the NDI FTDI-based USB devices, which requires hardwired
    1783  * baudrate (19200 gets mapped to 1200000).
    1784  *
    1785  * Called from usbserial:serial_probe.
    1786  */
    1787 static int ftdi_NDI_device_setup(struct usb_serial *serial)
    1788 {
    1789         struct usb_device *udev = serial->dev;
    1790         int latency = ndi_latency_timer;
    1791 
    1792         if (latency == 0)
    1793                 latency = 1;
    1794         if (latency > 99)
    1795                 latency = 99;
    1796 
    1797         dev_dbg(&udev->dev, "%s setting NDI device latency to %d
    ", __func__, latency);
    1798         dev_info(&udev->dev, "NDI device with a latency value of %d
    ", latency);
    1799 
    1800         /* FIXME: errors are not returned */
    1801         usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
    1802                                 FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
    1803                                 FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
    1804                                 latency, 0, NULL, 0, WDR_TIMEOUT);
    1805         return 0;
    1806 }
    1807 
    1808 /*
    1809  * First port on JTAG adaptors such as Olimex arm-usb-ocd or the FIC/OpenMoko
    1810  * Neo1973 Debug Board is reserved for JTAG interface and can be accessed from
    1811  * userspace using openocd.
    1812  */
    1813 static int ftdi_jtag_probe(struct usb_serial *serial)
    1814 {
    1815         struct usb_device *udev = serial->dev;
    1816         struct usb_interface *interface = serial->interface;
    1817 
    1818         if (interface == udev->actconfig->interface[0]) {
    1819                 dev_info(&udev->dev,
    1820                          "Ignoring serial port reserved for JTAG
    ");
    1821                 return -ENODEV;
    1822         }
    1823 
    1824         return 0;
    1825 }
    1826 
    1827 static int ftdi_8u2232c_probe(struct usb_serial *serial)
    1828 {
    1829         struct usb_device *udev = serial->dev;
    1830 
    1831         if ((udev->manufacturer && !strcmp(udev->manufacturer, "CALAO Systems")) ||
    1832             (udev->product && !strcmp(udev->product, "BeagleBone/XDS100V2")))
    1833                 return ftdi_jtag_probe(serial);
    1834 
    1835         return 0;
    1836 }
    1837 
    1838 /*
    1839  * First two ports on JTAG adaptors using an FT4232 such as STMicroelectronics's
    1840  * ST Micro Connect Lite are reserved for JTAG or other non-UART interfaces and
    1841  * can be accessed from userspace.
    1842  * The next two ports are enabled as UARTs by default, where port 2 is
    1843  * a conventional RS-232 UART.
    1844  */
    1845 static int ftdi_stmclite_probe(struct usb_serial *serial)
    1846 {
    1847         struct usb_device *udev = serial->dev;
    1848         struct usb_interface *interface = serial->interface;
    1849 
    1850         if (interface == udev->actconfig->interface[0] ||
    1851             interface == udev->actconfig->interface[1]) {
    1852                 dev_info(&udev->dev, "Ignoring serial port reserved for JTAG
    ");
    1853                 return -ENODEV;
    1854         }
    1855 
    1856         return 0;
    1857 }
    1858 
    1859 static int ftdi_sio_port_remove(struct usb_serial_port *port)
    1860 {
    1861         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1862 
    1863         remove_sysfs_attrs(port);
    1864 
    1865         kfree(priv);
    1866 
    1867         return 0;
    1868 }
    1869 
    1870 static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port)
    1871 {
    1872         struct usb_device *dev = port->serial->dev;
    1873         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1874 
    1875         /* No error checking for this (will get errors later anyway) */
    1876         /* See ftdi_sio.h for description of what is reset */
    1877         usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
    1878                         FTDI_SIO_RESET_REQUEST, FTDI_SIO_RESET_REQUEST_TYPE,
    1879                         FTDI_SIO_RESET_SIO,
    1880                         priv->interface, NULL, 0, WDR_TIMEOUT);
    1881 
    1882         /* Termios defaults are set by usb_serial_init. We don't change
    1883            port->tty->termios - this would lose speed settings, etc.
    1884            This is same behaviour as serial.c/rs_open() - Kuba */
    1885 
    1886         /* ftdi_set_termios  will send usb control messages */
    1887         if (tty)
    1888                 ftdi_set_termios(tty, port, NULL);
    1889 
    1890         return usb_serial_generic_open(tty, port);
    1891 }
    1892 
    1893 static void ftdi_dtr_rts(struct usb_serial_port *port, int on)
    1894 {
    1895         struct ftdi_private *priv = usb_get_serial_port_data(port);
    1896 
    1897         /* Disable flow control */
    1898         if (!on) {
    1899                 if (usb_control_msg(port->serial->dev,
    1900                             usb_sndctrlpipe(port->serial->dev, 0),
    1901                             FTDI_SIO_SET_FLOW_CTRL_REQUEST,
    1902                             FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
    1903                             0, priv->interface, NULL, 0,
    1904                             WDR_TIMEOUT) < 0) {
    1905                         dev_err(&port->dev, "error from flowcontrol urb
    ");
    1906                 }
    1907         }
    1908         /* drop RTS and DTR */
    1909         if (on)
    1910                 set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
    1911         else
    1912                 clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
    1913 }
    1914 
    1915 /* The SIO requires the first byte to have:
    1916  *  B0 1
    1917  *  B1 0
    1918  *  B2..7 length of message excluding byte 0
    1919  *
    1920  * The new devices do not require this byte
    1921  */
    1922 static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
    1923                                                 void *dest, size_t size)
    1924 {
    1925         struct ftdi_private *priv;
    1926         int count;
    1927         unsigned long flags;
    1928 
    1929         priv = usb_get_serial_port_data(port);
    1930 
    1931         if (priv->chip_type == SIO) {
    1932                 unsigned char *buffer = dest;
    1933                 int i, len, c;
    1934 
    1935                 count = 0;
    1936                 spin_lock_irqsave(&port->lock, flags);
    1937                 for (i = 0; i < size - 1; i += priv->max_packet_size) {
    1938                         len = min_t(int, size - i, priv->max_packet_size) - 1;
    1939                         c = kfifo_out(&port->write_fifo, &buffer[i + 1], len);
    1940                         if (!c)
    1941                                 break;
    1942                         port->icount.tx += c;
    1943                         buffer[i] = (c << 2) + 1;
    1944                         count += c + 1;
    1945                 }
    1946                 spin_unlock_irqrestore(&port->lock, flags);
    1947         } else {
    1948                 count = kfifo_out_locked(&port->write_fifo, dest, size,
    1949                                                                 &port->lock);
    1950                 port->icount.tx += count;
    1951         }
    1952 
    1953         return count;
    1954 }
    1955 
    1956 #define FTDI_RS_ERR_MASK (FTDI_RS_BI | FTDI_RS_PE | FTDI_RS_FE | FTDI_RS_OE)
    1957 
    1958 static int ftdi_process_packet(struct usb_serial_port *port,
    1959                 struct ftdi_private *priv, char *packet, int len)
    1960 {
    1961         int i;
    1962         char status;
    1963         char flag;
    1964         char *ch;
    1965 
    1966         if (len < 2) {
    1967                 dev_dbg(&port->dev, "malformed packet
    ");
    1968                 return 0;
    1969         }
    1970 
    1971         /* Compare new line status to the old one, signal if different/
    1972            N.B. packet may be processed more than once, but differences
    1973            are only processed once.  */
    1974         status = packet[0] & FTDI_STATUS_B0_MASK;
    1975         if (status != priv->prev_status) {
    1976                 char diff_status = status ^ priv->prev_status;
    1977 
    1978                 if (diff_status & FTDI_RS0_CTS)
    1979                         port->icount.cts++;
    1980                 if (diff_status & FTDI_RS0_DSR)
    1981                         port->icount.dsr++;
    1982                 if (diff_status & FTDI_RS0_RI)
    1983                         port->icount.rng++;
    1984                 if (diff_status & FTDI_RS0_RLSD) {
    1985                         struct tty_struct *tty;
    1986 
    1987                         port->icount.dcd++;
    1988                         tty = tty_port_tty_get(&port->port);
    1989                         if (tty)
    1990                                 usb_serial_handle_dcd_change(port, tty,
    1991                                                 status & FTDI_RS0_RLSD);
    1992                         tty_kref_put(tty);
    1993                 }
    1994 
    1995                 wake_up_interruptible(&port->port.delta_msr_wait);
    1996                 priv->prev_status = status;
    1997         }
    1998 
    1999         flag = TTY_NORMAL;
    2000         if (packet[1] & FTDI_RS_ERR_MASK) {
    2001                 /* Break takes precedence over parity, which takes precedence
    2002                  * over framing errors */
    2003                 if (packet[1] & FTDI_RS_BI) {
    2004                         flag = TTY_BREAK;
    2005                         port->icount.brk++;
    2006                         usb_serial_handle_break(port);
    2007                 } else if (packet[1] & FTDI_RS_PE) {
    2008                         flag = TTY_PARITY;
    2009                         port->icount.parity++;
    2010                 } else if (packet[1] & FTDI_RS_FE) {
    2011                         flag = TTY_FRAME;
    2012                         port->icount.frame++;
    2013                 }
    2014                 /* Overrun is special, not associated with a char */
    2015                 if (packet[1] & FTDI_RS_OE) {
    2016                         port->icount.overrun++;
    2017                         tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
    2018                 }
    2019         }
    2020 
    2021         /* save if the transmitter is empty or not */
    2022         if (packet[1] & FTDI_RS_TEMT)
    2023                 priv->transmit_empty = 1;
    2024         else
    2025                 priv->transmit_empty = 0;
    2026 
    2027         len -= 2;
    2028         if (!len)
    2029                 return 0;       /* status only */
    2030         port->icount.rx += len;
    2031         ch = packet + 2;
    2032 
    2033         if (port->port.console && port->sysrq) {
    2034                 for (i = 0; i < len; i++, ch++) {
    2035                         if (!usb_serial_handle_sysrq_char(port, *ch))
    2036                                 tty_insert_flip_char(&port->port, *ch, flag);
    2037                 }
    2038         } else {
    2039                 tty_insert_flip_string_fixed_flag(&port->port, ch, flag, len);
    2040         }
    2041 
    2042         return len;
    2043 }
    2044 
    2045 static void ftdi_process_read_urb(struct urb *urb)
    2046 {
    2047         struct usb_serial_port *port = urb->context;
    2048         struct ftdi_private *priv = usb_get_serial_port_data(port);
    2049         char *data = (char *)urb->transfer_buffer;
    2050         int i;
    2051         int len;
    2052         int count = 0;
    2053 
    2054         for (i = 0; i < urb->actual_length; i += priv->max_packet_size) {
    2055                 len = min_t(int, urb->actual_length - i, priv->max_packet_size);
    2056                 count += ftdi_process_packet(port, priv, &data[i], len);
    2057         }
    2058 
    2059         if (count)
    2060                 tty_flip_buffer_push(&port->port);
    2061 }
    2062 
    2063 static void ftdi_break_ctl(struct tty_struct *tty, int break_state)
    2064 {
    2065         struct usb_serial_port *port = tty->driver_data;
    2066         struct ftdi_private *priv = usb_get_serial_port_data(port);
    2067         __u16 urb_value;
    2068 
    2069         /* break_state = -1 to turn on break, and 0 to turn off break */
    2070         /* see drivers/char/tty_io.c to see it used */
    2071         /* last_set_data_urb_value NEVER has the break bit set in it */
    2072 
    2073         if (break_state)
    2074                 urb_value = priv->last_set_data_urb_value | FTDI_SIO_SET_BREAK;
    2075         else
    2076                 urb_value = priv->last_set_data_urb_value;
    2077 
    2078         if (usb_control_msg(port->serial->dev,
    2079                         usb_sndctrlpipe(port->serial->dev, 0),
    2080                         FTDI_SIO_SET_DATA_REQUEST,
    2081                         FTDI_SIO_SET_DATA_REQUEST_TYPE,
    2082                         urb_value , priv->interface,
    2083                         NULL, 0, WDR_TIMEOUT) < 0) {
    2084                 dev_err(&port->dev, "%s FAILED to enable/disable break state (state was %d)
    ",
    2085                         __func__, break_state);
    2086         }
    2087 
    2088         dev_dbg(&port->dev, "%s break state is %d - urb is %d
    ", __func__,
    2089                 break_state, urb_value);
    2090 
    2091 }
    2092 
    2093 static bool ftdi_tx_empty(struct usb_serial_port *port)
    2094 {
    2095         unsigned char buf[2];
    2096         int ret;
    2097 
    2098         ret = ftdi_get_modem_status(port, buf);
    2099         if (ret == 2) {
    2100                 if (!(buf[1] & FTDI_RS_TEMT))
    2101                         return false;
    2102         }
    2103 
    2104         return true;
    2105 }
    2106 
    2107 /* old_termios contains the original termios settings and tty->termios contains
    2108  * the new setting to be used
    2109  * WARNING: set_termios calls this with old_termios in kernel space
    2110  */
    2111 static void ftdi_set_termios(struct tty_struct *tty,
    2112                 struct usb_serial_port *port, struct ktermios *old_termios)
    2113 {
    2114         struct usb_device *dev = port->serial->dev;
    2115         struct device *ddev = &port->dev;
    2116         struct ftdi_private *priv = usb_get_serial_port_data(port);
    2117         struct ktermios *termios = &tty->termios;
    2118         unsigned int cflag = termios->c_cflag;
    2119         __u16 urb_value; /* will hold the new flags */
    2120 
    2121         /* Added for xon/xoff support */
    2122         unsigned int iflag = termios->c_iflag;
    2123         unsigned char vstop;
    2124         unsigned char vstart;
    2125 
    2126         /* Force baud rate if this device requires it, unless it is set to
    2127            B0. */
    2128         if (priv->force_baud && ((termios->c_cflag & CBAUD) != B0)) {
    2129                 dev_dbg(ddev, "%s: forcing baud rate for this device
    ", __func__);
    2130                 tty_encode_baud_rate(tty, priv->force_baud,
    2131                                         priv->force_baud);
    2132         }
    2133 
    2134         /* Force RTS-CTS if this device requires it. */
    2135         if (priv->force_rtscts) {
    2136                 dev_dbg(ddev, "%s: forcing rtscts for this device
    ", __func__);
    2137                 termios->c_cflag |= CRTSCTS;
    2138         }
    2139 
    2140         /*
    2141          * All FTDI UART chips are limited to CS7/8. We shouldn't pretend to
    2142          * support CS5/6 and revert the CSIZE setting instead.
    2143          *
    2144          * CS5 however is used to control some smartcard readers which abuse
    2145          * this limitation to switch modes. Original FTDI chips fall back to
    2146          * eight data bits.
    2147          *
    2148          * TODO: Implement a quirk to only allow this with mentioned
    2149          *       readers. One I know of (Argolis Smartreader V1)
    2150          *       returns "USB smartcard server" as iInterface string.
    2151          *       The vendor didn't bother with a custom VID/PID of
    2152          *       course.
    2153          */
    2154         if (C_CSIZE(tty) == CS6) {
    2155                 dev_warn(ddev, "requested CSIZE setting not supported
    ");
    2156 
    2157                 termios->c_cflag &= ~CSIZE;
    2158                 if (old_termios)
    2159                         termios->c_cflag |= old_termios->c_cflag & CSIZE;
    2160                 else
    2161                         termios->c_cflag |= CS8;
    2162         }
    2163 
    2164         cflag = termios->c_cflag;
    2165 
    2166         if (!old_termios)
    2167                 goto no_skip;
    2168 
    2169         if (old_termios->c_cflag == termios->c_cflag
    2170             && old_termios->c_ispeed == termios->c_ispeed
    2171             && old_termios->c_ospeed == termios->c_ospeed)
    2172                 goto no_c_cflag_changes;
    2173 
    2174         /* NOTE These routines can get interrupted by
    2175            ftdi_sio_read_bulk_callback  - need to examine what this means -
    2176            don't see any problems yet */
    2177 
    2178         if ((old_termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)) ==
    2179             (termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)))
    2180                 goto no_data_parity_stop_changes;
    2181 
    2182 no_skip:
    2183         /* Set number of data bits, parity, stop bits */
    2184 
    2185         urb_value = 0;
    2186         urb_value |= (cflag & CSTOPB ? FTDI_SIO_SET_DATA_STOP_BITS_2 :
    2187                       FTDI_SIO_SET_DATA_STOP_BITS_1);
    2188         if (cflag & PARENB) {
    2189                 if (cflag & CMSPAR)
    2190                         urb_value |= cflag & PARODD ?
    2191                                      FTDI_SIO_SET_DATA_PARITY_MARK :
    2192                                      FTDI_SIO_SET_DATA_PARITY_SPACE;
    2193                 else
    2194                         urb_value |= cflag & PARODD ?
    2195                                      FTDI_SIO_SET_DATA_PARITY_ODD :
    2196                                      FTDI_SIO_SET_DATA_PARITY_EVEN;
    2197         } else {
    2198                 urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE;
    2199         }
    2200         switch (cflag & CSIZE) {
    2201         case CS5:
    2202                 dev_dbg(ddev, "Setting CS5 quirk
    ");
    2203                 break;
    2204         case CS7:
    2205                 urb_value |= 7;
    2206                 dev_dbg(ddev, "Setting CS7
    ");
    2207                 break;
    2208         default:
    2209         case CS8:
    2210                 urb_value |= 8;
    2211                 dev_dbg(ddev, "Setting CS8
    ");
    2212                 break;
    2213         }
    2214 
    2215         /* This is needed by the break command since it uses the same command
    2216            - but is or'ed with this value  */
    2217         priv->last_set_data_urb_value = urb_value;
    2218 
    2219         if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
    2220                             FTDI_SIO_SET_DATA_REQUEST,
    2221                             FTDI_SIO_SET_DATA_REQUEST_TYPE,
    2222                             urb_value , priv->interface,
    2223                             NULL, 0, WDR_SHORT_TIMEOUT) < 0) {
    2224                 dev_err(ddev, "%s FAILED to set databits/stopbits/parity
    ",
    2225                         __func__);
    2226         }
    2227 
    2228         /* Now do the baudrate */
    2229 no_data_parity_stop_changes:
    2230         if ((cflag & CBAUD) == B0) {
    2231                 /* Disable flow control */
    2232                 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
    2233                                     FTDI_SIO_SET_FLOW_CTRL_REQUEST,
    2234                                     FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
    2235                                     0, priv->interface,
    2236                                     NULL, 0, WDR_TIMEOUT) < 0) {
    2237                         dev_err(ddev, "%s error from disable flowcontrol urb
    ",
    2238                                 __func__);
    2239                 }
    2240                 /* Drop RTS and DTR */
    2241                 clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
    2242         } else {
    2243                 /* set the baudrate determined before */
    2244                 mutex_lock(&priv->cfg_lock);
    2245                 if (change_speed(tty, port))
    2246                         dev_err(ddev, "%s urb failed to set baudrate
    ", __func__);
    2247                 mutex_unlock(&priv->cfg_lock);
    2248                 /* Ensure RTS and DTR are raised when baudrate changed from 0 */
    2249                 if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
    2250                         set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
    2251         }
    2252 
    2253         /* Set flow control */
    2254         /* Note device also supports DTR/CD (ugh) and Xon/Xoff in hardware */
    2255 no_c_cflag_changes:
    2256         if (cflag & CRTSCTS) {
    2257                 dev_dbg(ddev, "%s Setting to CRTSCTS flow control
    ", __func__);
    2258                 if (usb_control_msg(dev,
    2259                                     usb_sndctrlpipe(dev, 0),
    2260                                     FTDI_SIO_SET_FLOW_CTRL_REQUEST,
    2261                                     FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
    2262                                     0 , (FTDI_SIO_RTS_CTS_HS | priv->interface),
    2263                                     NULL, 0, WDR_TIMEOUT) < 0) {
    2264                         dev_err(ddev, "urb failed to set to rts/cts flow control
    ");
    2265                 }
    2266         } else {
    2267                 /*
    2268                  * Xon/Xoff code
    2269                  *
    2270                  * Check the IXOFF status in the iflag component of the
    2271                  * termios structure. If IXOFF is not set, the pre-xon/xoff
    2272                  * code is executed.
    2273                  */
    2274                 if (iflag & IXOFF) {
    2275                         dev_dbg(ddev, "%s  request to enable xonxoff iflag=%04x
    ",
    2276                                 __func__, iflag);
    2277                         /* Try to enable the XON/XOFF on the ftdi_sio
    2278                          * Set the vstart and vstop -- could have been done up
    2279                          * above where a lot of other dereferencing is done but
    2280                          * that would be very inefficient as vstart and vstop
    2281                          * are not always needed.
    2282                          */
    2283                         vstart = termios->c_cc[VSTART];
    2284                         vstop = termios->c_cc[VSTOP];
    2285                         urb_value = (vstop << 8) | (vstart);
    2286 
    2287                         if (usb_control_msg(dev,
    2288                                             usb_sndctrlpipe(dev, 0),
    2289                                             FTDI_SIO_SET_FLOW_CTRL_REQUEST,
    2290                                             FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
    2291                                             urb_value , (FTDI_SIO_XON_XOFF_HS
    2292                                                          | priv->interface),
    2293                                             NULL, 0, WDR_TIMEOUT) < 0) {
    2294                                 dev_err(&port->dev, "urb failed to set to "
    2295                                         "xon/xoff flow control
    ");
    2296                         }
    2297                 } else {
    2298                         /* else clause to only run if cflag ! CRTSCTS and iflag
    2299                          * ! XOFF. CHECKME Assuming XON/XOFF handled by tty
    2300                          * stack - not by device */
    2301                         dev_dbg(ddev, "%s Turning off hardware flow control
    ", __func__);
    2302                         if (usb_control_msg(dev,
    2303                                             usb_sndctrlpipe(dev, 0),
    2304                                             FTDI_SIO_SET_FLOW_CTRL_REQUEST,
    2305                                             FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
    2306                                             0, priv->interface,
    2307                                             NULL, 0, WDR_TIMEOUT) < 0) {
    2308                                 dev_err(ddev, "urb failed to clear flow control
    ");
    2309                         }
    2310                 }
    2311         }
    2312 }
    2313 
    2314 /*
    2315  * Get modem-control status.
    2316  *
    2317  * Returns the number of status bytes retrieved (device dependant), or
    2318  * negative error code.
    2319  */
    2320 static int ftdi_get_modem_status(struct usb_serial_port *port,
    2321                                                 unsigned char status[2])
    2322 {
    2323         struct ftdi_private *priv = usb_get_serial_port_data(port);
    2324         unsigned char *buf;
    2325         int len;
    2326         int ret;
    2327 
    2328         buf = kmalloc(2, GFP_KERNEL);
    2329         if (!buf)
    2330                 return -ENOMEM;
    2331         /*
    2332          * The 8U232AM returns a two byte value (the SIO a 1 byte value) in
    2333          * the same format as the data returned from the in point.
    2334          */
    2335         switch (priv->chip_type) {
    2336         case SIO:
    2337                 len = 1;
    2338                 break;
    2339         case FT8U232AM:
    2340         case FT232BM:
    2341         case FT2232C:
    2342         case FT232RL:
    2343         case FT2232H:
    2344         case FT4232H:
    2345         case FT232H:
    2346         case FTX:
    2347                 len = 2;
    2348                 break;
    2349         default:
    2350                 ret = -EFAULT;
    2351                 goto out;
    2352         }
    2353 
    2354         ret = usb_control_msg(port->serial->dev,
    2355                         usb_rcvctrlpipe(port->serial->dev, 0),
    2356                         FTDI_SIO_GET_MODEM_STATUS_REQUEST,
    2357                         FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
    2358                         0, priv->interface,
    2359                         buf, len, WDR_TIMEOUT);
    2360         if (ret < 0) {
    2361                 dev_err(&port->dev, "failed to get modem status: %d
    ", ret);
    2362                 ret = usb_translate_errors(ret);
    2363                 goto out;
    2364         }
    2365 
    2366         status[0] = buf[0];
    2367         if (ret > 1)
    2368                 status[1] = buf[1];
    2369         else
    2370                 status[1] = 0;
    2371 
    2372         dev_dbg(&port->dev, "%s - 0x%02x%02x
    ", __func__, status[0],
    2373                                                                 status[1]);
    2374 out:
    2375         kfree(buf);
    2376 
    2377         return ret;
    2378 }
    2379 
    2380 static int ftdi_tiocmget(struct tty_struct *tty)
    2381 {
    2382         struct usb_serial_port *port = tty->driver_data;
    2383         struct ftdi_private *priv = usb_get_serial_port_data(port);
    2384         unsigned char buf[2];
    2385         int ret;
    2386 
    2387         ret = ftdi_get_modem_status(port, buf);
    2388         if (ret < 0)
    2389                 return ret;
    2390 
    2391         ret =   (buf[0] & FTDI_SIO_DSR_MASK  ? TIOCM_DSR : 0) |
    2392                 (buf[0] & FTDI_SIO_CTS_MASK  ? TIOCM_CTS : 0) |
    2393                 (buf[0] & FTDI_SIO_RI_MASK   ? TIOCM_RI  : 0) |
    2394                 (buf[0] & FTDI_SIO_RLSD_MASK ? TIOCM_CD  : 0) |
    2395                 priv->last_dtr_rts;
    2396 
    2397         return ret;
    2398 }
    2399 
    2400 static int ftdi_tiocmset(struct tty_struct *tty,
    2401                         unsigned int set, unsigned int clear)
    2402 {
    2403         struct usb_serial_port *port = tty->driver_data;
    2404 
    2405         return update_mctrl(port, set, clear);
    2406 }
    2407 
    2408 static int ftdi_ioctl(struct tty_struct *tty,
    2409                                         unsigned int cmd, unsigned long arg)
    2410 {
    2411         struct usb_serial_port *port = tty->driver_data;
    2412 
    2413         /* Based on code from acm.c and others */
    2414         switch (cmd) {
    2415 
    2416         case TIOCGSERIAL: /* gets serial port data */
    2417                 return get_serial_info(port,
    2418                                         (struct serial_struct __user *) arg);
    2419 
    2420         case TIOCSSERIAL: /* sets serial port data */
    2421                 return set_serial_info(tty, port,
    2422                                         (struct serial_struct __user *) arg);
    2423         case TIOCSERGETLSR:
    2424                 return get_lsr_info(port, (struct serial_struct __user *)arg);
    2425                 break;
    2426         default:
    2427                 break;
    2428         }
    2429 
    2430         return -ENOIOCTLCMD;
    2431 }
    2432 
    2433 module_usb_serial_driver(serial_drivers, id_table_combined);
    2434 
    2435 MODULE_AUTHOR(DRIVER_AUTHOR);
    2436 MODULE_DESCRIPTION(DRIVER_DESC);
    2437 MODULE_LICENSE("GPL");
    2438 
    2439 module_param(ndi_latency_timer, int, S_IRUGO | S_IWUSR);
    2440 MODULE_PARM_DESC(ndi_latency_timer, "NDI device latency timer override");
    2441 
  • 相关阅读:
    软件工程概论-用户登录界面
    2016.11.25异常处理
    2016.11.18多态
    2016.11.11继承与接口
    11.6数组
    10.28字符串加密等
    python 读写文件
    python可变的类型、不可变的类型
    python 字典练习 记录学生是否交作业的小程序
    python字典
  • 原文地址:https://www.cnblogs.com/shangdawei/p/4073471.html
Copyright © 2020-2023  润新知