linux/drivers/usb/serial/cp210x.c
<<
>>
Prefs
   1/*
   2 * Silicon Laboratories CP210x USB to RS232 serial adaptor driver
   3 *
   4 * Copyright (C) 2005 Craig Shelley (craig@microtron.org.uk)
   5 *
   6 *      This program is free software; you can redistribute it and/or
   7 *      modify it under the terms of the GNU General Public License version
   8 *      2 as published by the Free Software Foundation.
   9 *
  10 * Support to set flow control line levels using TIOCMGET and TIOCMSET
  11 * thanks to Karl Hiramoto karl@hiramoto.org. RTSCTS hardware flow
  12 * control thanks to Munir Nassar nassarmu@real-time.com
  13 *
  14 */
  15
  16#include <linux/kernel.h>
  17#include <linux/errno.h>
  18#include <linux/slab.h>
  19#include <linux/tty.h>
  20#include <linux/tty_flip.h>
  21#include <linux/module.h>
  22#include <linux/moduleparam.h>
  23#include <linux/usb.h>
  24#include <linux/uaccess.h>
  25#include <linux/usb/serial.h>
  26
  27#define DRIVER_DESC "Silicon Labs CP210x RS232 serial adaptor driver"
  28
  29/*
  30 * Function Prototypes
  31 */
  32static int cp210x_open(struct tty_struct *tty, struct usb_serial_port *);
  33static void cp210x_close(struct usb_serial_port *);
  34static void cp210x_get_termios(struct tty_struct *, struct usb_serial_port *);
  35static void cp210x_get_termios_port(struct usb_serial_port *port,
  36        unsigned int *cflagp, unsigned int *baudp);
  37static void cp210x_change_speed(struct tty_struct *, struct usb_serial_port *,
  38                                                        struct ktermios *);
  39static void cp210x_set_termios(struct tty_struct *, struct usb_serial_port *,
  40                                                        struct ktermios*);
  41static bool cp210x_tx_empty(struct usb_serial_port *port);
  42static int cp210x_tiocmget(struct tty_struct *);
  43static int cp210x_tiocmset(struct tty_struct *, unsigned int, unsigned int);
  44static int cp210x_tiocmset_port(struct usb_serial_port *port,
  45                unsigned int, unsigned int);
  46static void cp210x_break_ctl(struct tty_struct *, int);
  47static int cp210x_port_probe(struct usb_serial_port *);
  48static int cp210x_port_remove(struct usb_serial_port *);
  49static void cp210x_dtr_rts(struct usb_serial_port *p, int on);
  50
  51static const struct usb_device_id id_table[] = {
  52        { USB_DEVICE(0x045B, 0x0053) }, /* Renesas RX610 RX-Stick */
  53        { USB_DEVICE(0x0471, 0x066A) }, /* AKTAKOM ACE-1001 cable */
  54        { USB_DEVICE(0x0489, 0xE000) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */
  55        { USB_DEVICE(0x0489, 0xE003) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */
  56        { USB_DEVICE(0x0745, 0x1000) }, /* CipherLab USB CCD Barcode Scanner 1000 */
  57        { USB_DEVICE(0x0846, 0x1100) }, /* NetGear Managed Switch M4100 series, M5300 series, M7100 series */
  58        { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */
  59        { USB_DEVICE(0x08FD, 0x000A) }, /* Digianswer A/S , ZigBee/802.15.4 MAC Device */
  60        { USB_DEVICE(0x0908, 0x01FF) }, /* Siemens RUGGEDCOM USB Serial Console */
  61        { USB_DEVICE(0x0BED, 0x1100) }, /* MEI (TM) Cashflow-SC Bill/Voucher Acceptor */
  62        { USB_DEVICE(0x0BED, 0x1101) }, /* MEI series 2000 Combo Acceptor */
  63        { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */
  64        { USB_DEVICE(0x0FCF, 0x1004) }, /* Dynastream ANT2USB */
  65        { USB_DEVICE(0x0FCF, 0x1006) }, /* Dynastream ANT development board */
  66        { USB_DEVICE(0x0FDE, 0xCA05) }, /* OWL Wireless Electricity Monitor CM-160 */
  67        { USB_DEVICE(0x10A6, 0xAA26) }, /* Knock-off DCU-11 cable */
  68        { USB_DEVICE(0x10AB, 0x10C5) }, /* Siemens MC60 Cable */
  69        { USB_DEVICE(0x10B5, 0xAC70) }, /* Nokia CA-42 USB */
  70        { USB_DEVICE(0x10C4, 0x0F91) }, /* Vstabi */
  71        { USB_DEVICE(0x10C4, 0x1101) }, /* Arkham Technology DS101 Bus Monitor */
  72        { USB_DEVICE(0x10C4, 0x1601) }, /* Arkham Technology DS101 Adapter */
  73        { USB_DEVICE(0x10C4, 0x800A) }, /* SPORTident BSM7-D-USB main station */
  74        { USB_DEVICE(0x10C4, 0x803B) }, /* Pololu USB-serial converter */
  75        { USB_DEVICE(0x10C4, 0x8044) }, /* Cygnal Debug Adapter */
  76        { USB_DEVICE(0x10C4, 0x804E) }, /* Software Bisque Paramount ME build-in converter */
  77        { USB_DEVICE(0x10C4, 0x8053) }, /* Enfora EDG1228 */
  78        { USB_DEVICE(0x10C4, 0x8054) }, /* Enfora GSM2228 */
  79        { USB_DEVICE(0x10C4, 0x8066) }, /* Argussoft In-System Programmer */
  80        { USB_DEVICE(0x10C4, 0x806F) }, /* IMS USB to RS422 Converter Cable */
  81        { USB_DEVICE(0x10C4, 0x807A) }, /* Crumb128 board */
  82        { USB_DEVICE(0x10C4, 0x80C4) }, /* Cygnal Integrated Products, Inc., Optris infrared thermometer */
  83        { USB_DEVICE(0x10C4, 0x80CA) }, /* Degree Controls Inc */
  84        { USB_DEVICE(0x10C4, 0x80DD) }, /* Tracient RFID */
  85        { USB_DEVICE(0x10C4, 0x80F6) }, /* Suunto sports instrument */
  86        { USB_DEVICE(0x10C4, 0x8115) }, /* Arygon NFC/Mifare Reader */
  87        { USB_DEVICE(0x10C4, 0x813D) }, /* Burnside Telecom Deskmobile */
  88        { USB_DEVICE(0x10C4, 0x813F) }, /* Tams Master Easy Control */
  89        { USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */
  90        { USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */
  91        { USB_DEVICE(0x2405, 0x0003) }, /* West Mountain Radio RIGblaster Advantage */
  92        { USB_DEVICE(0x10C4, 0x8156) }, /* B&G H3000 link cable */
  93        { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */
  94        { USB_DEVICE(0x10C4, 0x815F) }, /* Timewave HamLinkUSB */
  95        { USB_DEVICE(0x10C4, 0x818B) }, /* AVIT Research USB to TTL */
  96        { USB_DEVICE(0x10C4, 0x819F) }, /* MJS USB Toslink Switcher */
  97        { USB_DEVICE(0x10C4, 0x81A6) }, /* ThinkOptics WavIt */
  98        { USB_DEVICE(0x10C4, 0x81A9) }, /* Multiplex RC Interface */
  99        { USB_DEVICE(0x10C4, 0x81AC) }, /* MSD Dash Hawk */
 100        { USB_DEVICE(0x10C4, 0x81AD) }, /* INSYS USB Modem */
 101        { USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */
 102        { USB_DEVICE(0x10C4, 0x81D7) }, /* IAI Corp. RCB-CV-USB USB to RS485 Adaptor */
 103        { USB_DEVICE(0x10C4, 0x81E2) }, /* Lipowsky Industrie Elektronik GmbH, Baby-LIN */
 104        { USB_DEVICE(0x10C4, 0x81E7) }, /* Aerocomm Radio */
 105        { USB_DEVICE(0x10C4, 0x81E8) }, /* Zephyr Bioharness */
 106        { USB_DEVICE(0x10C4, 0x81F2) }, /* C1007 HF band RFID controller */
 107        { USB_DEVICE(0x10C4, 0x8218) }, /* Lipowsky Industrie Elektronik GmbH, HARP-1 */
 108        { USB_DEVICE(0x10C4, 0x822B) }, /* Modem EDGE(GSM) Comander 2 */
 109        { USB_DEVICE(0x10C4, 0x826B) }, /* Cygnal Integrated Products, Inc., Fasttrax GPS demonstration module */
 110        { USB_DEVICE(0x10C4, 0x8281) }, /* Nanotec Plug & Drive */
 111        { USB_DEVICE(0x10C4, 0x8293) }, /* Telegesis ETRX2USB */
 112        { USB_DEVICE(0x10C4, 0x82F4) }, /* Starizona MicroTouch */
 113        { USB_DEVICE(0x10C4, 0x82F9) }, /* Procyon AVS */
 114        { USB_DEVICE(0x10C4, 0x8341) }, /* Siemens MC35PU GPRS Modem */
 115        { USB_DEVICE(0x10C4, 0x8382) }, /* Cygnal Integrated Products, Inc. */
 116        { USB_DEVICE(0x10C4, 0x83A8) }, /* Amber Wireless AMB2560 */
 117        { USB_DEVICE(0x10C4, 0x83D8) }, /* DekTec DTA Plus VHF/UHF Booster/Attenuator */
 118        { USB_DEVICE(0x10C4, 0x8411) }, /* Kyocera GPS Module */
 119        { USB_DEVICE(0x10C4, 0x8418) }, /* IRZ Automation Teleport SG-10 GSM/GPRS Modem */
 120        { USB_DEVICE(0x10C4, 0x846E) }, /* BEI USB Sensor Interface (VCP) */
 121        { USB_DEVICE(0x10C4, 0x8477) }, /* Balluff RFID */
 122        { USB_DEVICE(0x10C4, 0x84B6) }, /* Starizona Hyperion */
 123        { USB_DEVICE(0x10C4, 0x85EA) }, /* AC-Services IBUS-IF */
 124        { USB_DEVICE(0x10C4, 0x85EB) }, /* AC-Services CIS-IBUS */
 125        { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */
 126        { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */
 127        { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */
 128        { USB_DEVICE(0x10C4, 0x8856) }, /* CEL EM357 ZigBee USB Stick - LR */
 129        { USB_DEVICE(0x10C4, 0x8857) }, /* CEL EM357 ZigBee USB Stick */
 130        { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */
 131        { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */
 132        { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */
 133        { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */
 134        { USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */
 135        { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */
 136        { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
 137        { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */
 138        { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */
 139        { USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */
 140        { USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */
 141        { USB_DEVICE(0x10C4, 0xF002) }, /* Elan Digital Systems USBwave12 */
 142        { USB_DEVICE(0x10C4, 0xF003) }, /* Elan Digital Systems USBpulse100 */
 143        { USB_DEVICE(0x10C4, 0xF004) }, /* Elan Digital Systems USBcount50 */
 144        { USB_DEVICE(0x10C5, 0xEA61) }, /* Silicon Labs MobiData GPRS USB Modem */
 145        { USB_DEVICE(0x10CE, 0xEA6A) }, /* Silicon Labs MobiData GPRS USB Modem 100EU */
 146        { USB_DEVICE(0x12B8, 0xEC60) }, /* Link G4 ECU */
 147        { USB_DEVICE(0x12B8, 0xEC62) }, /* Link G4+ ECU */
 148        { USB_DEVICE(0x13AD, 0x9999) }, /* Baltech card reader */
 149        { USB_DEVICE(0x1555, 0x0004) }, /* Owen AC4 USB-RS485 Converter */
 150        { USB_DEVICE(0x166A, 0x0201) }, /* Clipsal 5500PACA C-Bus Pascal Automation Controller */
 151        { USB_DEVICE(0x166A, 0x0301) }, /* Clipsal 5800PC C-Bus Wireless PC Interface */
 152        { USB_DEVICE(0x166A, 0x0303) }, /* Clipsal 5500PCU C-Bus USB interface */
 153        { USB_DEVICE(0x166A, 0x0304) }, /* Clipsal 5000CT2 C-Bus Black and White Touchscreen */
 154        { USB_DEVICE(0x166A, 0x0305) }, /* Clipsal C-5000CT2 C-Bus Spectrum Colour Touchscreen */
 155        { USB_DEVICE(0x166A, 0x0401) }, /* Clipsal L51xx C-Bus Architectural Dimmer */
 156        { USB_DEVICE(0x166A, 0x0101) }, /* Clipsal 5560884 C-Bus Multi-room Audio Matrix Switcher */
 157        { USB_DEVICE(0x16C0, 0x09B0) }, /* Lunatico Seletek */
 158        { USB_DEVICE(0x16C0, 0x09B1) }, /* Lunatico Seletek */
 159        { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */
 160        { USB_DEVICE(0x16DC, 0x0010) }, /* W-IE-NE-R Plein & Baus GmbH PL512 Power Supply */
 161        { USB_DEVICE(0x16DC, 0x0011) }, /* W-IE-NE-R Plein & Baus GmbH RCM Remote Control for MARATON Power Supply */
 162        { USB_DEVICE(0x16DC, 0x0012) }, /* W-IE-NE-R Plein & Baus GmbH MPOD Multi Channel Power Supply */
 163        { USB_DEVICE(0x16DC, 0x0015) }, /* W-IE-NE-R Plein & Baus GmbH CML Control, Monitoring and Data Logger */
 164        { USB_DEVICE(0x17A8, 0x0001) }, /* Kamstrup Optical Eye/3-wire */
 165        { USB_DEVICE(0x17A8, 0x0005) }, /* Kamstrup M-Bus Master MultiPort 250D */
 166        { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */
 167        { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */
 168        { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */
 169        { USB_DEVICE(0x18EF, 0xE025) }, /* ELV Marble Sound Board 1 */
 170        { USB_DEVICE(0x1901, 0x0190) }, /* GE B850 CP2105 Recorder interface */
 171        { USB_DEVICE(0x1901, 0x0193) }, /* GE B650 CP2104 PMC interface */
 172        { USB_DEVICE(0x1901, 0x0194) }, /* GE Healthcare Remote Alarm Box */
 173        { USB_DEVICE(0x19CF, 0x3000) }, /* Parrot NMEA GPS Flight Recorder */
 174        { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */
 175        { USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */
 176        { USB_DEVICE(0x1BA4, 0x0002) }, /* Silicon Labs 358x factory default */
 177        { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */
 178        { USB_DEVICE(0x1D6F, 0x0010) }, /* Seluxit ApS RF Dongle */
 179        { USB_DEVICE(0x1E29, 0x0102) }, /* Festo CPX-USB */
 180        { USB_DEVICE(0x1E29, 0x0501) }, /* Festo CMSP */
 181        { USB_DEVICE(0x1FB9, 0x0100) }, /* Lake Shore Model 121 Current Source */
 182        { USB_DEVICE(0x1FB9, 0x0200) }, /* Lake Shore Model 218A Temperature Monitor */
 183        { USB_DEVICE(0x1FB9, 0x0201) }, /* Lake Shore Model 219 Temperature Monitor */
 184        { USB_DEVICE(0x1FB9, 0x0202) }, /* Lake Shore Model 233 Temperature Transmitter */
 185        { USB_DEVICE(0x1FB9, 0x0203) }, /* Lake Shore Model 235 Temperature Transmitter */
 186        { USB_DEVICE(0x1FB9, 0x0300) }, /* Lake Shore Model 335 Temperature Controller */
 187        { USB_DEVICE(0x1FB9, 0x0301) }, /* Lake Shore Model 336 Temperature Controller */
 188        { USB_DEVICE(0x1FB9, 0x0302) }, /* Lake Shore Model 350 Temperature Controller */
 189        { USB_DEVICE(0x1FB9, 0x0303) }, /* Lake Shore Model 371 AC Bridge */
 190        { USB_DEVICE(0x1FB9, 0x0400) }, /* Lake Shore Model 411 Handheld Gaussmeter */
 191        { USB_DEVICE(0x1FB9, 0x0401) }, /* Lake Shore Model 425 Gaussmeter */
 192        { USB_DEVICE(0x1FB9, 0x0402) }, /* Lake Shore Model 455A Gaussmeter */
 193        { USB_DEVICE(0x1FB9, 0x0403) }, /* Lake Shore Model 475A Gaussmeter */
 194        { USB_DEVICE(0x1FB9, 0x0404) }, /* Lake Shore Model 465 Three Axis Gaussmeter */
 195        { USB_DEVICE(0x1FB9, 0x0600) }, /* Lake Shore Model 625A Superconducting MPS */
 196        { USB_DEVICE(0x1FB9, 0x0601) }, /* Lake Shore Model 642A Magnet Power Supply */
 197        { USB_DEVICE(0x1FB9, 0x0602) }, /* Lake Shore Model 648 Magnet Power Supply */
 198        { USB_DEVICE(0x1FB9, 0x0700) }, /* Lake Shore Model 737 VSM Controller */
 199        { USB_DEVICE(0x1FB9, 0x0701) }, /* Lake Shore Model 776 Hall Matrix */
 200        { USB_DEVICE(0x2626, 0xEA60) }, /* Aruba Networks 7xxx USB Serial Console */
 201        { USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */
 202        { USB_DEVICE(0x3195, 0xF280) }, /* Link Instruments MSO-28 */
 203        { USB_DEVICE(0x3195, 0xF281) }, /* Link Instruments MSO-28 */
 204        { USB_DEVICE(0x413C, 0x9500) }, /* DW700 GPS USB interface */
 205        { } /* Terminating Entry */
 206};
 207
 208MODULE_DEVICE_TABLE(usb, id_table);
 209
 210struct cp210x_port_private {
 211        __u8                    bInterfaceNumber;
 212        bool                    has_swapped_line_ctl;
 213};
 214
 215static struct usb_serial_driver cp210x_device = {
 216        .driver = {
 217                .owner =        THIS_MODULE,
 218                .name =         "cp210x",
 219        },
 220        .id_table               = id_table,
 221        .num_ports              = 1,
 222        .bulk_in_size           = 256,
 223        .bulk_out_size          = 256,
 224        .open                   = cp210x_open,
 225        .close                  = cp210x_close,
 226        .break_ctl              = cp210x_break_ctl,
 227        .set_termios            = cp210x_set_termios,
 228        .tx_empty               = cp210x_tx_empty,
 229        .tiocmget               = cp210x_tiocmget,
 230        .tiocmset               = cp210x_tiocmset,
 231        .port_probe             = cp210x_port_probe,
 232        .port_remove            = cp210x_port_remove,
 233        .dtr_rts                = cp210x_dtr_rts
 234};
 235
 236static struct usb_serial_driver * const serial_drivers[] = {
 237        &cp210x_device, NULL
 238};
 239
 240/* Config request types */
 241#define REQTYPE_HOST_TO_INTERFACE       0x41
 242#define REQTYPE_INTERFACE_TO_HOST       0xc1
 243#define REQTYPE_HOST_TO_DEVICE  0x40
 244#define REQTYPE_DEVICE_TO_HOST  0xc0
 245
 246/* Config request codes */
 247#define CP210X_IFC_ENABLE       0x00
 248#define CP210X_SET_BAUDDIV      0x01
 249#define CP210X_GET_BAUDDIV      0x02
 250#define CP210X_SET_LINE_CTL     0x03
 251#define CP210X_GET_LINE_CTL     0x04
 252#define CP210X_SET_BREAK        0x05
 253#define CP210X_IMM_CHAR         0x06
 254#define CP210X_SET_MHS          0x07
 255#define CP210X_GET_MDMSTS       0x08
 256#define CP210X_SET_XON          0x09
 257#define CP210X_SET_XOFF         0x0A
 258#define CP210X_SET_EVENTMASK    0x0B
 259#define CP210X_GET_EVENTMASK    0x0C
 260#define CP210X_SET_CHAR         0x0D
 261#define CP210X_GET_CHARS        0x0E
 262#define CP210X_GET_PROPS        0x0F
 263#define CP210X_GET_COMM_STATUS  0x10
 264#define CP210X_RESET            0x11
 265#define CP210X_PURGE            0x12
 266#define CP210X_SET_FLOW         0x13
 267#define CP210X_GET_FLOW         0x14
 268#define CP210X_EMBED_EVENTS     0x15
 269#define CP210X_GET_EVENTSTATE   0x16
 270#define CP210X_SET_CHARS        0x19
 271#define CP210X_GET_BAUDRATE     0x1D
 272#define CP210X_SET_BAUDRATE     0x1E
 273
 274/* CP210X_IFC_ENABLE */
 275#define UART_ENABLE             0x0001
 276#define UART_DISABLE            0x0000
 277
 278/* CP210X_(SET|GET)_BAUDDIV */
 279#define BAUD_RATE_GEN_FREQ      0x384000
 280
 281/* CP210X_(SET|GET)_LINE_CTL */
 282#define BITS_DATA_MASK          0X0f00
 283#define BITS_DATA_5             0X0500
 284#define BITS_DATA_6             0X0600
 285#define BITS_DATA_7             0X0700
 286#define BITS_DATA_8             0X0800
 287#define BITS_DATA_9             0X0900
 288
 289#define BITS_PARITY_MASK        0x00f0
 290#define BITS_PARITY_NONE        0x0000
 291#define BITS_PARITY_ODD         0x0010
 292#define BITS_PARITY_EVEN        0x0020
 293#define BITS_PARITY_MARK        0x0030
 294#define BITS_PARITY_SPACE       0x0040
 295
 296#define BITS_STOP_MASK          0x000f
 297#define BITS_STOP_1             0x0000
 298#define BITS_STOP_1_5           0x0001
 299#define BITS_STOP_2             0x0002
 300
 301/* CP210X_SET_BREAK */
 302#define BREAK_ON                0x0001
 303#define BREAK_OFF               0x0000
 304
 305/* CP210X_(SET_MHS|GET_MDMSTS) */
 306#define CONTROL_DTR             0x0001
 307#define CONTROL_RTS             0x0002
 308#define CONTROL_CTS             0x0010
 309#define CONTROL_DSR             0x0020
 310#define CONTROL_RING            0x0040
 311#define CONTROL_DCD             0x0080
 312#define CONTROL_WRITE_DTR       0x0100
 313#define CONTROL_WRITE_RTS       0x0200
 314
 315/* CP210X_GET_COMM_STATUS returns these 0x13 bytes */
 316struct cp210x_comm_status {
 317        __le32   ulErrors;
 318        __le32   ulHoldReasons;
 319        __le32   ulAmountInInQueue;
 320        __le32   ulAmountInOutQueue;
 321        u8       bEofReceived;
 322        u8       bWaitForImmediate;
 323        u8       bReserved;
 324} __packed;
 325
 326/*
 327 * CP210X_PURGE - 16 bits passed in wValue of USB request.
 328 * SiLabs app note AN571 gives a strange description of the 4 bits:
 329 * bit 0 or bit 2 clears the transmit queue and 1 or 3 receive.
 330 * writing 1 to all, however, purges cp2108 well enough to avoid the hang.
 331 */
 332#define PURGE_ALL               0x000f
 333
 334/*
 335 * Reads a variable-sized block of CP210X_ registers, identified by req.
 336 * Returns data into buf in native USB byte order.
 337 */
 338static int cp210x_read_reg_block(struct usb_serial_port *port, u8 req,
 339                void *buf, int bufsize)
 340{
 341        struct usb_serial *serial = port->serial;
 342        struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
 343        void *dmabuf;
 344        int result;
 345
 346        dmabuf = kmalloc(bufsize, GFP_KERNEL);
 347        if (!dmabuf) {
 348                /*
 349                 * FIXME Some callers don't bother to check for error,
 350                 * at least give them consistent junk until they are fixed
 351                 */
 352                memset(buf, 0, bufsize);
 353                return -ENOMEM;
 354        }
 355
 356        result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
 357                        req, REQTYPE_INTERFACE_TO_HOST, 0,
 358                        port_priv->bInterfaceNumber, dmabuf, bufsize,
 359                        USB_CTRL_SET_TIMEOUT);
 360        if (result == bufsize) {
 361                memcpy(buf, dmabuf, bufsize);
 362                result = 0;
 363        } else {
 364                dev_err(&port->dev, "failed get req 0x%x size %d status: %d\n",
 365                                req, bufsize, result);
 366                if (result >= 0)
 367                        result = -EPROTO;
 368
 369                /*
 370                 * FIXME Some callers don't bother to check for error,
 371                 * at least give them consistent junk until they are fixed
 372                 */
 373                memset(buf, 0, bufsize);
 374        }
 375
 376        kfree(dmabuf);
 377
 378        return result;
 379}
 380
 381/*
 382 * Reads any 32-bit CP210X_ register identified by req.
 383 */
 384static int cp210x_read_u32_reg(struct usb_serial_port *port, u8 req, u32 *val)
 385{
 386        __le32 le32_val;
 387        int err;
 388
 389        err = cp210x_read_reg_block(port, req, &le32_val, sizeof(le32_val));
 390        if (err) {
 391                /*
 392                 * FIXME Some callers don't bother to check for error,
 393                 * at least give them consistent junk until they are fixed
 394                 */
 395                *val = 0;
 396                return err;
 397        }
 398
 399        *val = le32_to_cpu(le32_val);
 400
 401        return 0;
 402}
 403
 404/*
 405 * Reads any 16-bit CP210X_ register identified by req.
 406 */
 407static int cp210x_read_u16_reg(struct usb_serial_port *port, u8 req, u16 *val)
 408{
 409        __le16 le16_val;
 410        int err;
 411
 412        err = cp210x_read_reg_block(port, req, &le16_val, sizeof(le16_val));
 413        if (err)
 414                return err;
 415
 416        *val = le16_to_cpu(le16_val);
 417
 418        return 0;
 419}
 420
 421/*
 422 * Reads any 8-bit CP210X_ register identified by req.
 423 */
 424static int cp210x_read_u8_reg(struct usb_serial_port *port, u8 req, u8 *val)
 425{
 426        return cp210x_read_reg_block(port, req, val, sizeof(*val));
 427}
 428
 429/*
 430 * Writes any 16-bit CP210X_ register (req) whose value is passed
 431 * entirely in the wValue field of the USB request.
 432 */
 433static int cp210x_write_u16_reg(struct usb_serial_port *port, u8 req, u16 val)
 434{
 435        struct usb_serial *serial = port->serial;
 436        struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
 437        int result;
 438
 439        result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
 440                        req, REQTYPE_HOST_TO_INTERFACE, val,
 441                        port_priv->bInterfaceNumber, NULL, 0,
 442                        USB_CTRL_SET_TIMEOUT);
 443        if (result < 0) {
 444                dev_err(&port->dev, "failed set request 0x%x status: %d\n",
 445                                req, result);
 446        }
 447
 448        return result;
 449}
 450
 451/*
 452 * Writes a variable-sized block of CP210X_ registers, identified by req.
 453 * Data in buf must be in native USB byte order.
 454 */
 455static int cp210x_write_reg_block(struct usb_serial_port *port, u8 req,
 456                void *buf, int bufsize)
 457{
 458        struct usb_serial *serial = port->serial;
 459        struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
 460        void *dmabuf;
 461        int result;
 462
 463        dmabuf = kmalloc(bufsize, GFP_KERNEL);
 464        if (!dmabuf)
 465                return -ENOMEM;
 466
 467        memcpy(dmabuf, buf, bufsize);
 468
 469        result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
 470                        req, REQTYPE_HOST_TO_INTERFACE, 0,
 471                        port_priv->bInterfaceNumber, dmabuf, bufsize,
 472                        USB_CTRL_SET_TIMEOUT);
 473
 474        kfree(dmabuf);
 475
 476        if (result == bufsize) {
 477                result = 0;
 478        } else {
 479                dev_err(&port->dev, "failed set req 0x%x size %d status: %d\n",
 480                                req, bufsize, result);
 481                if (result >= 0)
 482                        result = -EPROTO;
 483        }
 484
 485        return result;
 486}
 487
 488/*
 489 * Writes any 32-bit CP210X_ register identified by req.
 490 */
 491static int cp210x_write_u32_reg(struct usb_serial_port *port, u8 req, u32 val)
 492{
 493        __le32 le32_val;
 494
 495        le32_val = cpu_to_le32(val);
 496
 497        return cp210x_write_reg_block(port, req, &le32_val, sizeof(le32_val));
 498}
 499
 500/*
 501 * Detect CP2108 GET_LINE_CTL bug and activate workaround.
 502 * Write a known good value 0x800, read it back.
 503 * If it comes back swapped the bug is detected.
 504 * Preserve the original register value.
 505 */
 506static int cp210x_detect_swapped_line_ctl(struct usb_serial_port *port)
 507{
 508        struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
 509        u16 line_ctl_save;
 510        u16 line_ctl_test;
 511        int err;
 512
 513        err = cp210x_read_u16_reg(port, CP210X_GET_LINE_CTL, &line_ctl_save);
 514        if (err)
 515                return err;
 516
 517        err = cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, 0x800);
 518        if (err)
 519                return err;
 520
 521        err = cp210x_read_u16_reg(port, CP210X_GET_LINE_CTL, &line_ctl_test);
 522        if (err)
 523                return err;
 524
 525        if (line_ctl_test == 8) {
 526                port_priv->has_swapped_line_ctl = true;
 527                line_ctl_save = swab16(line_ctl_save);
 528        }
 529
 530        return cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, line_ctl_save);
 531}
 532
 533/*
 534 * Must always be called instead of cp210x_read_u16_reg(CP210X_GET_LINE_CTL)
 535 * to workaround cp2108 bug and get correct value.
 536 */
 537static int cp210x_get_line_ctl(struct usb_serial_port *port, u16 *ctl)
 538{
 539        struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
 540        int err;
 541
 542        err = cp210x_read_u16_reg(port, CP210X_GET_LINE_CTL, ctl);
 543        if (err)
 544                return err;
 545
 546        /* Workaround swapped bytes in 16-bit value from CP210X_GET_LINE_CTL */
 547        if (port_priv->has_swapped_line_ctl)
 548                *ctl = swab16(*ctl);
 549
 550        return 0;
 551}
 552
 553/*
 554 * cp210x_quantise_baudrate
 555 * Quantises the baud rate as per AN205 Table 1
 556 */
 557static unsigned int cp210x_quantise_baudrate(unsigned int baud)
 558{
 559        if (baud <= 300)
 560                baud = 300;
 561        else if (baud <= 600)      baud = 600;
 562        else if (baud <= 1200)     baud = 1200;
 563        else if (baud <= 1800)     baud = 1800;
 564        else if (baud <= 2400)     baud = 2400;
 565        else if (baud <= 4000)     baud = 4000;
 566        else if (baud <= 4803)     baud = 4800;
 567        else if (baud <= 7207)     baud = 7200;
 568        else if (baud <= 9612)     baud = 9600;
 569        else if (baud <= 14428)    baud = 14400;
 570        else if (baud <= 16062)    baud = 16000;
 571        else if (baud <= 19250)    baud = 19200;
 572        else if (baud <= 28912)    baud = 28800;
 573        else if (baud <= 38601)    baud = 38400;
 574        else if (baud <= 51558)    baud = 51200;
 575        else if (baud <= 56280)    baud = 56000;
 576        else if (baud <= 58053)    baud = 57600;
 577        else if (baud <= 64111)    baud = 64000;
 578        else if (baud <= 77608)    baud = 76800;
 579        else if (baud <= 117028)   baud = 115200;
 580        else if (baud <= 129347)   baud = 128000;
 581        else if (baud <= 156868)   baud = 153600;
 582        else if (baud <= 237832)   baud = 230400;
 583        else if (baud <= 254234)   baud = 250000;
 584        else if (baud <= 273066)   baud = 256000;
 585        else if (baud <= 491520)   baud = 460800;
 586        else if (baud <= 567138)   baud = 500000;
 587        else if (baud <= 670254)   baud = 576000;
 588        else if (baud < 1000000)
 589                baud = 921600;
 590        else if (baud > 2000000)
 591                baud = 2000000;
 592        return baud;
 593}
 594
 595static int cp210x_open(struct tty_struct *tty, struct usb_serial_port *port)
 596{
 597        int result;
 598
 599        result = cp210x_write_u16_reg(port, CP210X_IFC_ENABLE, UART_ENABLE);
 600        if (result) {
 601                dev_err(&port->dev, "%s - Unable to enable UART\n", __func__);
 602                return result;
 603        }
 604
 605        /* Configure the termios structure */
 606        cp210x_get_termios(tty, port);
 607
 608        /* The baud rate must be initialised on cp2104 */
 609        if (tty)
 610                cp210x_change_speed(tty, port, NULL);
 611
 612        return usb_serial_generic_open(tty, port);
 613}
 614
 615static void cp210x_close(struct usb_serial_port *port)
 616{
 617        usb_serial_generic_close(port);
 618
 619        /* Clear both queues; cp2108 needs this to avoid an occasional hang */
 620        cp210x_write_u16_reg(port, CP210X_PURGE, PURGE_ALL);
 621
 622        cp210x_write_u16_reg(port, CP210X_IFC_ENABLE, UART_DISABLE);
 623}
 624
 625/*
 626 * Read how many bytes are waiting in the TX queue.
 627 */
 628static int cp210x_get_tx_queue_byte_count(struct usb_serial_port *port,
 629                u32 *count)
 630{
 631        struct usb_serial *serial = port->serial;
 632        struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
 633        struct cp210x_comm_status *sts;
 634        int result;
 635
 636        sts = kmalloc(sizeof(*sts), GFP_KERNEL);
 637        if (!sts)
 638                return -ENOMEM;
 639
 640        result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
 641                        CP210X_GET_COMM_STATUS, REQTYPE_INTERFACE_TO_HOST,
 642                        0, port_priv->bInterfaceNumber, sts, sizeof(*sts),
 643                        USB_CTRL_GET_TIMEOUT);
 644        if (result == sizeof(*sts)) {
 645                *count = le32_to_cpu(sts->ulAmountInOutQueue);
 646                result = 0;
 647        } else {
 648                dev_err(&port->dev, "failed to get comm status: %d\n", result);
 649                if (result >= 0)
 650                        result = -EPROTO;
 651        }
 652
 653        kfree(sts);
 654
 655        return result;
 656}
 657
 658static bool cp210x_tx_empty(struct usb_serial_port *port)
 659{
 660        int err;
 661        u32 count;
 662
 663        err = cp210x_get_tx_queue_byte_count(port, &count);
 664        if (err)
 665                return true;
 666
 667        return !count;
 668}
 669
 670/*
 671 * cp210x_get_termios
 672 * Reads the baud rate, data bits, parity, stop bits and flow control mode
 673 * from the device, corrects any unsupported values, and configures the
 674 * termios structure to reflect the state of the device
 675 */
 676static void cp210x_get_termios(struct tty_struct *tty,
 677        struct usb_serial_port *port)
 678{
 679        unsigned int baud;
 680
 681        if (tty) {
 682                cp210x_get_termios_port(tty->driver_data,
 683                        &tty->termios.c_cflag, &baud);
 684                tty_encode_baud_rate(tty, baud, baud);
 685        } else {
 686                unsigned int cflag;
 687                cflag = 0;
 688                cp210x_get_termios_port(port, &cflag, &baud);
 689        }
 690}
 691
 692/*
 693 * cp210x_get_termios_port
 694 * This is the heart of cp210x_get_termios which always uses a &usb_serial_port.
 695 */
 696static void cp210x_get_termios_port(struct usb_serial_port *port,
 697        unsigned int *cflagp, unsigned int *baudp)
 698{
 699        struct device *dev = &port->dev;
 700        unsigned int cflag;
 701        u8 modem_ctl[16];
 702        u32 baud;
 703        u16 bits;
 704
 705        cp210x_read_u32_reg(port, CP210X_GET_BAUDRATE, &baud);
 706
 707        dev_dbg(dev, "%s - baud rate = %d\n", __func__, baud);
 708        *baudp = baud;
 709
 710        cflag = *cflagp;
 711
 712        cp210x_get_line_ctl(port, &bits);
 713        cflag &= ~CSIZE;
 714        switch (bits & BITS_DATA_MASK) {
 715        case BITS_DATA_5:
 716                dev_dbg(dev, "%s - data bits = 5\n", __func__);
 717                cflag |= CS5;
 718                break;
 719        case BITS_DATA_6:
 720                dev_dbg(dev, "%s - data bits = 6\n", __func__);
 721                cflag |= CS6;
 722                break;
 723        case BITS_DATA_7:
 724                dev_dbg(dev, "%s - data bits = 7\n", __func__);
 725                cflag |= CS7;
 726                break;
 727        case BITS_DATA_8:
 728                dev_dbg(dev, "%s - data bits = 8\n", __func__);
 729                cflag |= CS8;
 730                break;
 731        case BITS_DATA_9:
 732                dev_dbg(dev, "%s - data bits = 9 (not supported, using 8 data bits)\n", __func__);
 733                cflag |= CS8;
 734                bits &= ~BITS_DATA_MASK;
 735                bits |= BITS_DATA_8;
 736                cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits);
 737                break;
 738        default:
 739                dev_dbg(dev, "%s - Unknown number of data bits, using 8\n", __func__);
 740                cflag |= CS8;
 741                bits &= ~BITS_DATA_MASK;
 742                bits |= BITS_DATA_8;
 743                cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits);
 744                break;
 745        }
 746
 747        switch (bits & BITS_PARITY_MASK) {
 748        case BITS_PARITY_NONE:
 749                dev_dbg(dev, "%s - parity = NONE\n", __func__);
 750                cflag &= ~PARENB;
 751                break;
 752        case BITS_PARITY_ODD:
 753                dev_dbg(dev, "%s - parity = ODD\n", __func__);
 754                cflag |= (PARENB|PARODD);
 755                break;
 756        case BITS_PARITY_EVEN:
 757                dev_dbg(dev, "%s - parity = EVEN\n", __func__);
 758                cflag &= ~PARODD;
 759                cflag |= PARENB;
 760                break;
 761        case BITS_PARITY_MARK:
 762                dev_dbg(dev, "%s - parity = MARK\n", __func__);
 763                cflag |= (PARENB|PARODD|CMSPAR);
 764                break;
 765        case BITS_PARITY_SPACE:
 766                dev_dbg(dev, "%s - parity = SPACE\n", __func__);
 767                cflag &= ~PARODD;
 768                cflag |= (PARENB|CMSPAR);
 769                break;
 770        default:
 771                dev_dbg(dev, "%s - Unknown parity mode, disabling parity\n", __func__);
 772                cflag &= ~PARENB;
 773                bits &= ~BITS_PARITY_MASK;
 774                cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits);
 775                break;
 776        }
 777
 778        cflag &= ~CSTOPB;
 779        switch (bits & BITS_STOP_MASK) {
 780        case BITS_STOP_1:
 781                dev_dbg(dev, "%s - stop bits = 1\n", __func__);
 782                break;
 783        case BITS_STOP_1_5:
 784                dev_dbg(dev, "%s - stop bits = 1.5 (not supported, using 1 stop bit)\n", __func__);
 785                bits &= ~BITS_STOP_MASK;
 786                cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits);
 787                break;
 788        case BITS_STOP_2:
 789                dev_dbg(dev, "%s - stop bits = 2\n", __func__);
 790                cflag |= CSTOPB;
 791                break;
 792        default:
 793                dev_dbg(dev, "%s - Unknown number of stop bits, using 1 stop bit\n", __func__);
 794                bits &= ~BITS_STOP_MASK;
 795                cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits);
 796                break;
 797        }
 798
 799        cp210x_read_reg_block(port, CP210X_GET_FLOW, modem_ctl,
 800                        sizeof(modem_ctl));
 801        if (modem_ctl[0] & 0x08) {
 802                dev_dbg(dev, "%s - flow control = CRTSCTS\n", __func__);
 803                cflag |= CRTSCTS;
 804        } else {
 805                dev_dbg(dev, "%s - flow control = NONE\n", __func__);
 806                cflag &= ~CRTSCTS;
 807        }
 808
 809        *cflagp = cflag;
 810}
 811
 812/*
 813 * CP2101 supports the following baud rates:
 814 *
 815 *      300, 600, 1200, 1800, 2400, 4800, 7200, 9600, 14400, 19200, 28800,
 816 *      38400, 56000, 57600, 115200, 128000, 230400, 460800, 921600
 817 *
 818 * CP2102 and CP2103 support the following additional rates:
 819 *
 820 *      4000, 16000, 51200, 64000, 76800, 153600, 250000, 256000, 500000,
 821 *      576000
 822 *
 823 * The device will map a requested rate to a supported one, but the result
 824 * of requests for rates greater than 1053257 is undefined (see AN205).
 825 *
 826 * CP2104, CP2105 and CP2110 support most rates up to 2M, 921k and 1M baud,
 827 * respectively, with an error less than 1%. The actual rates are determined
 828 * by
 829 *
 830 *      div = round(freq / (2 x prescale x request))
 831 *      actual = freq / (2 x prescale x div)
 832 *
 833 * For CP2104 and CP2105 freq is 48Mhz and prescale is 4 for request <= 365bps
 834 * or 1 otherwise.
 835 * For CP2110 freq is 24Mhz and prescale is 4 for request <= 300bps or 1
 836 * otherwise.
 837 */
 838static void cp210x_change_speed(struct tty_struct *tty,
 839                struct usb_serial_port *port, struct ktermios *old_termios)
 840{
 841        u32 baud;
 842
 843        baud = tty->termios.c_ospeed;
 844
 845        /* This maps the requested rate to a rate valid on cp2102 or cp2103,
 846         * or to an arbitrary rate in [1M,2M].
 847         *
 848         * NOTE: B0 is not implemented.
 849         */
 850        baud = cp210x_quantise_baudrate(baud);
 851
 852        dev_dbg(&port->dev, "%s - setting baud rate to %u\n", __func__, baud);
 853        if (cp210x_write_u32_reg(port, CP210X_SET_BAUDRATE, baud)) {
 854                dev_warn(&port->dev, "failed to set baud rate to %u\n", baud);
 855                if (old_termios)
 856                        baud = old_termios->c_ospeed;
 857                else
 858                        baud = 9600;
 859        }
 860
 861        tty_encode_baud_rate(tty, baud, baud);
 862}
 863
 864static void cp210x_set_termios(struct tty_struct *tty,
 865                struct usb_serial_port *port, struct ktermios *old_termios)
 866{
 867        struct device *dev = &port->dev;
 868        unsigned int cflag, old_cflag;
 869        u16 bits;
 870        u8 modem_ctl[16];
 871
 872        cflag = tty->termios.c_cflag;
 873        old_cflag = old_termios->c_cflag;
 874
 875        if (tty->termios.c_ospeed != old_termios->c_ospeed)
 876                cp210x_change_speed(tty, port, old_termios);
 877
 878        /* If the number of data bits is to be updated */
 879        if ((cflag & CSIZE) != (old_cflag & CSIZE)) {
 880                cp210x_get_line_ctl(port, &bits);
 881                bits &= ~BITS_DATA_MASK;
 882                switch (cflag & CSIZE) {
 883                case CS5:
 884                        bits |= BITS_DATA_5;
 885                        dev_dbg(dev, "%s - data bits = 5\n", __func__);
 886                        break;
 887                case CS6:
 888                        bits |= BITS_DATA_6;
 889                        dev_dbg(dev, "%s - data bits = 6\n", __func__);
 890                        break;
 891                case CS7:
 892                        bits |= BITS_DATA_7;
 893                        dev_dbg(dev, "%s - data bits = 7\n", __func__);
 894                        break;
 895                case CS8:
 896                        bits |= BITS_DATA_8;
 897                        dev_dbg(dev, "%s - data bits = 8\n", __func__);
 898                        break;
 899                /*case CS9:
 900                        bits |= BITS_DATA_9;
 901                        dev_dbg(dev, "%s - data bits = 9\n", __func__);
 902                        break;*/
 903                default:
 904                        dev_dbg(dev, "cp210x driver does not support the number of bits requested, using 8 bit mode\n");
 905                        bits |= BITS_DATA_8;
 906                        break;
 907                }
 908                if (cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits))
 909                        dev_dbg(dev, "Number of data bits requested not supported by device\n");
 910        }
 911
 912        if ((cflag     & (PARENB|PARODD|CMSPAR)) !=
 913            (old_cflag & (PARENB|PARODD|CMSPAR))) {
 914                cp210x_get_line_ctl(port, &bits);
 915                bits &= ~BITS_PARITY_MASK;
 916                if (cflag & PARENB) {
 917                        if (cflag & CMSPAR) {
 918                                if (cflag & PARODD) {
 919                                        bits |= BITS_PARITY_MARK;
 920                                        dev_dbg(dev, "%s - parity = MARK\n", __func__);
 921                                } else {
 922                                        bits |= BITS_PARITY_SPACE;
 923                                        dev_dbg(dev, "%s - parity = SPACE\n", __func__);
 924                                }
 925                        } else {
 926                                if (cflag & PARODD) {
 927                                        bits |= BITS_PARITY_ODD;
 928                                        dev_dbg(dev, "%s - parity = ODD\n", __func__);
 929                                } else {
 930                                        bits |= BITS_PARITY_EVEN;
 931                                        dev_dbg(dev, "%s - parity = EVEN\n", __func__);
 932                                }
 933                        }
 934                }
 935                if (cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits))
 936                        dev_dbg(dev, "Parity mode not supported by device\n");
 937        }
 938
 939        if ((cflag & CSTOPB) != (old_cflag & CSTOPB)) {
 940                cp210x_get_line_ctl(port, &bits);
 941                bits &= ~BITS_STOP_MASK;
 942                if (cflag & CSTOPB) {
 943                        bits |= BITS_STOP_2;
 944                        dev_dbg(dev, "%s - stop bits = 2\n", __func__);
 945                } else {
 946                        bits |= BITS_STOP_1;
 947                        dev_dbg(dev, "%s - stop bits = 1\n", __func__);
 948                }
 949                if (cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits))
 950                        dev_dbg(dev, "Number of stop bits requested not supported by device\n");
 951        }
 952
 953        if ((cflag & CRTSCTS) != (old_cflag & CRTSCTS)) {
 954
 955                /* Only bytes 0, 4 and 7 out of first 8 have functional bits */
 956
 957                cp210x_read_reg_block(port, CP210X_GET_FLOW, modem_ctl,
 958                                sizeof(modem_ctl));
 959                dev_dbg(dev, "%s - read modem controls = %02x .. .. .. %02x .. .. %02x\n",
 960                        __func__, modem_ctl[0], modem_ctl[4], modem_ctl[7]);
 961
 962                if (cflag & CRTSCTS) {
 963                        modem_ctl[0] &= ~0x7B;
 964                        modem_ctl[0] |= 0x09;
 965                        modem_ctl[4] = 0x80;
 966                        /* FIXME - why clear reserved bits just read? */
 967                        modem_ctl[5] = 0;
 968                        modem_ctl[6] = 0;
 969                        modem_ctl[7] = 0;
 970                        dev_dbg(dev, "%s - flow control = CRTSCTS\n", __func__);
 971                } else {
 972                        modem_ctl[0] &= ~0x7B;
 973                        modem_ctl[0] |= 0x01;
 974                        /* FIXME - OR here instead of assignment looks wrong */
 975                        modem_ctl[4] |= 0x40;
 976                        dev_dbg(dev, "%s - flow control = NONE\n", __func__);
 977                }
 978
 979                dev_dbg(dev, "%s - write modem controls = %02x .. .. .. %02x .. .. %02x\n",
 980                        __func__, modem_ctl[0], modem_ctl[4], modem_ctl[7]);
 981                cp210x_write_reg_block(port, CP210X_SET_FLOW, modem_ctl,
 982                                sizeof(modem_ctl));
 983        }
 984
 985}
 986
 987static int cp210x_tiocmset(struct tty_struct *tty,
 988                unsigned int set, unsigned int clear)
 989{
 990        struct usb_serial_port *port = tty->driver_data;
 991        return cp210x_tiocmset_port(port, set, clear);
 992}
 993
 994static int cp210x_tiocmset_port(struct usb_serial_port *port,
 995                unsigned int set, unsigned int clear)
 996{
 997        u16 control = 0;
 998
 999        if (set & TIOCM_RTS) {
1000                control |= CONTROL_RTS;
1001                control |= CONTROL_WRITE_RTS;
1002        }
1003        if (set & TIOCM_DTR) {
1004                control |= CONTROL_DTR;
1005                control |= CONTROL_WRITE_DTR;
1006        }
1007        if (clear & TIOCM_RTS) {
1008                control &= ~CONTROL_RTS;
1009                control |= CONTROL_WRITE_RTS;
1010        }
1011        if (clear & TIOCM_DTR) {
1012                control &= ~CONTROL_DTR;
1013                control |= CONTROL_WRITE_DTR;
1014        }
1015
1016        dev_dbg(&port->dev, "%s - control = 0x%.4x\n", __func__, control);
1017
1018        return cp210x_write_u16_reg(port, CP210X_SET_MHS, control);
1019}
1020
1021static void cp210x_dtr_rts(struct usb_serial_port *p, int on)
1022{
1023        if (on)
1024                cp210x_tiocmset_port(p, TIOCM_DTR|TIOCM_RTS, 0);
1025        else
1026                cp210x_tiocmset_port(p, 0, TIOCM_DTR|TIOCM_RTS);
1027}
1028
1029static int cp210x_tiocmget(struct tty_struct *tty)
1030{
1031        struct usb_serial_port *port = tty->driver_data;
1032        u8 control;
1033        int result;
1034
1035        cp210x_read_u8_reg(port, CP210X_GET_MDMSTS, &control);
1036
1037        result = ((control & CONTROL_DTR) ? TIOCM_DTR : 0)
1038                |((control & CONTROL_RTS) ? TIOCM_RTS : 0)
1039                |((control & CONTROL_CTS) ? TIOCM_CTS : 0)
1040                |((control & CONTROL_DSR) ? TIOCM_DSR : 0)
1041                |((control & CONTROL_RING)? TIOCM_RI  : 0)
1042                |((control & CONTROL_DCD) ? TIOCM_CD  : 0);
1043
1044        dev_dbg(&port->dev, "%s - control = 0x%.2x\n", __func__, control);
1045
1046        return result;
1047}
1048
1049static void cp210x_break_ctl(struct tty_struct *tty, int break_state)
1050{
1051        struct usb_serial_port *port = tty->driver_data;
1052        u16 state;
1053
1054        if (break_state == 0)
1055                state = BREAK_OFF;
1056        else
1057                state = BREAK_ON;
1058        dev_dbg(&port->dev, "%s - turning break %s\n", __func__,
1059                state == BREAK_OFF ? "off" : "on");
1060        cp210x_write_u16_reg(port, CP210X_SET_BREAK, state);
1061}
1062
1063static int cp210x_port_probe(struct usb_serial_port *port)
1064{
1065        struct usb_serial *serial = port->serial;
1066        struct usb_host_interface *cur_altsetting;
1067        struct cp210x_port_private *port_priv;
1068        int ret;
1069
1070        port_priv = kzalloc(sizeof(*port_priv), GFP_KERNEL);
1071        if (!port_priv)
1072                return -ENOMEM;
1073
1074        cur_altsetting = serial->interface->cur_altsetting;
1075        port_priv->bInterfaceNumber = cur_altsetting->desc.bInterfaceNumber;
1076
1077        usb_set_serial_port_data(port, port_priv);
1078
1079        ret = cp210x_detect_swapped_line_ctl(port);
1080        if (ret) {
1081                kfree(port_priv);
1082                return ret;
1083        }
1084
1085        return 0;
1086}
1087
1088static int cp210x_port_remove(struct usb_serial_port *port)
1089{
1090        struct cp210x_port_private *port_priv;
1091
1092        port_priv = usb_get_serial_port_data(port);
1093        kfree(port_priv);
1094
1095        return 0;
1096}
1097
1098module_usb_serial_driver(serial_drivers, id_table);
1099
1100MODULE_DESCRIPTION(DRIVER_DESC);
1101MODULE_LICENSE("GPL");
1102