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, 0x8470) }, /* Juniper Networks BX Series System Console */
 122        { USB_DEVICE(0x10C4, 0x8477) }, /* Balluff RFID */
 123        { USB_DEVICE(0x10C4, 0x84B6) }, /* Starizona Hyperion */
 124        { USB_DEVICE(0x10C4, 0x85EA) }, /* AC-Services IBUS-IF */
 125        { USB_DEVICE(0x10C4, 0x85EB) }, /* AC-Services CIS-IBUS */
 126        { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */
 127        { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */
 128        { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */
 129        { USB_DEVICE(0x10C4, 0x8856) }, /* CEL EM357 ZigBee USB Stick - LR */
 130        { USB_DEVICE(0x10C4, 0x8857) }, /* CEL EM357 ZigBee USB Stick */
 131        { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */
 132        { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */
 133        { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */
 134        { USB_DEVICE(0x10C4, 0x8962) }, /* Brim Brothers charging dock */
 135        { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */
 136        { USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */
 137        { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */
 138        { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
 139        { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */
 140        { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */
 141        { USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */
 142        { USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */
 143        { USB_DEVICE(0x10C4, 0xF002) }, /* Elan Digital Systems USBwave12 */
 144        { USB_DEVICE(0x10C4, 0xF003) }, /* Elan Digital Systems USBpulse100 */
 145        { USB_DEVICE(0x10C4, 0xF004) }, /* Elan Digital Systems USBcount50 */
 146        { USB_DEVICE(0x10C5, 0xEA61) }, /* Silicon Labs MobiData GPRS USB Modem */
 147        { USB_DEVICE(0x10CE, 0xEA6A) }, /* Silicon Labs MobiData GPRS USB Modem 100EU */
 148        { USB_DEVICE(0x12B8, 0xEC60) }, /* Link G4 ECU */
 149        { USB_DEVICE(0x12B8, 0xEC62) }, /* Link G4+ ECU */
 150        { USB_DEVICE(0x13AD, 0x9999) }, /* Baltech card reader */
 151        { USB_DEVICE(0x1555, 0x0004) }, /* Owen AC4 USB-RS485 Converter */
 152        { USB_DEVICE(0x166A, 0x0201) }, /* Clipsal 5500PACA C-Bus Pascal Automation Controller */
 153        { USB_DEVICE(0x166A, 0x0301) }, /* Clipsal 5800PC C-Bus Wireless PC Interface */
 154        { USB_DEVICE(0x166A, 0x0303) }, /* Clipsal 5500PCU C-Bus USB interface */
 155        { USB_DEVICE(0x166A, 0x0304) }, /* Clipsal 5000CT2 C-Bus Black and White Touchscreen */
 156        { USB_DEVICE(0x166A, 0x0305) }, /* Clipsal C-5000CT2 C-Bus Spectrum Colour Touchscreen */
 157        { USB_DEVICE(0x166A, 0x0401) }, /* Clipsal L51xx C-Bus Architectural Dimmer */
 158        { USB_DEVICE(0x166A, 0x0101) }, /* Clipsal 5560884 C-Bus Multi-room Audio Matrix Switcher */
 159        { USB_DEVICE(0x16C0, 0x09B0) }, /* Lunatico Seletek */
 160        { USB_DEVICE(0x16C0, 0x09B1) }, /* Lunatico Seletek */
 161        { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */
 162        { USB_DEVICE(0x16DC, 0x0010) }, /* W-IE-NE-R Plein & Baus GmbH PL512 Power Supply */
 163        { USB_DEVICE(0x16DC, 0x0011) }, /* W-IE-NE-R Plein & Baus GmbH RCM Remote Control for MARATON Power Supply */
 164        { USB_DEVICE(0x16DC, 0x0012) }, /* W-IE-NE-R Plein & Baus GmbH MPOD Multi Channel Power Supply */
 165        { USB_DEVICE(0x16DC, 0x0015) }, /* W-IE-NE-R Plein & Baus GmbH CML Control, Monitoring and Data Logger */
 166        { USB_DEVICE(0x17A8, 0x0001) }, /* Kamstrup Optical Eye/3-wire */
 167        { USB_DEVICE(0x17A8, 0x0005) }, /* Kamstrup M-Bus Master MultiPort 250D */
 168        { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */
 169        { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */
 170        { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */
 171        { USB_DEVICE(0x18EF, 0xE025) }, /* ELV Marble Sound Board 1 */
 172        { USB_DEVICE(0x1901, 0x0190) }, /* GE B850 CP2105 Recorder interface */
 173        { USB_DEVICE(0x1901, 0x0193) }, /* GE B650 CP2104 PMC interface */
 174        { USB_DEVICE(0x1901, 0x0194) }, /* GE Healthcare Remote Alarm Box */
 175        { USB_DEVICE(0x19CF, 0x3000) }, /* Parrot NMEA GPS Flight Recorder */
 176        { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */
 177        { USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */
 178        { USB_DEVICE(0x1BA4, 0x0002) }, /* Silicon Labs 358x factory default */
 179        { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */
 180        { USB_DEVICE(0x1D6F, 0x0010) }, /* Seluxit ApS RF Dongle */
 181        { USB_DEVICE(0x1E29, 0x0102) }, /* Festo CPX-USB */
 182        { USB_DEVICE(0x1E29, 0x0501) }, /* Festo CMSP */
 183        { USB_DEVICE(0x1FB9, 0x0100) }, /* Lake Shore Model 121 Current Source */
 184        { USB_DEVICE(0x1FB9, 0x0200) }, /* Lake Shore Model 218A Temperature Monitor */
 185        { USB_DEVICE(0x1FB9, 0x0201) }, /* Lake Shore Model 219 Temperature Monitor */
 186        { USB_DEVICE(0x1FB9, 0x0202) }, /* Lake Shore Model 233 Temperature Transmitter */
 187        { USB_DEVICE(0x1FB9, 0x0203) }, /* Lake Shore Model 235 Temperature Transmitter */
 188        { USB_DEVICE(0x1FB9, 0x0300) }, /* Lake Shore Model 335 Temperature Controller */
 189        { USB_DEVICE(0x1FB9, 0x0301) }, /* Lake Shore Model 336 Temperature Controller */
 190        { USB_DEVICE(0x1FB9, 0x0302) }, /* Lake Shore Model 350 Temperature Controller */
 191        { USB_DEVICE(0x1FB9, 0x0303) }, /* Lake Shore Model 371 AC Bridge */
 192        { USB_DEVICE(0x1FB9, 0x0400) }, /* Lake Shore Model 411 Handheld Gaussmeter */
 193        { USB_DEVICE(0x1FB9, 0x0401) }, /* Lake Shore Model 425 Gaussmeter */
 194        { USB_DEVICE(0x1FB9, 0x0402) }, /* Lake Shore Model 455A Gaussmeter */
 195        { USB_DEVICE(0x1FB9, 0x0403) }, /* Lake Shore Model 475A Gaussmeter */
 196        { USB_DEVICE(0x1FB9, 0x0404) }, /* Lake Shore Model 465 Three Axis Gaussmeter */
 197        { USB_DEVICE(0x1FB9, 0x0600) }, /* Lake Shore Model 625A Superconducting MPS */
 198        { USB_DEVICE(0x1FB9, 0x0601) }, /* Lake Shore Model 642A Magnet Power Supply */
 199        { USB_DEVICE(0x1FB9, 0x0602) }, /* Lake Shore Model 648 Magnet Power Supply */
 200        { USB_DEVICE(0x1FB9, 0x0700) }, /* Lake Shore Model 737 VSM Controller */
 201        { USB_DEVICE(0x1FB9, 0x0701) }, /* Lake Shore Model 776 Hall Matrix */
 202        { USB_DEVICE(0x2626, 0xEA60) }, /* Aruba Networks 7xxx USB Serial Console */
 203        { USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */
 204        { USB_DEVICE(0x3195, 0xF280) }, /* Link Instruments MSO-28 */
 205        { USB_DEVICE(0x3195, 0xF281) }, /* Link Instruments MSO-28 */
 206        { USB_DEVICE(0x413C, 0x9500) }, /* DW700 GPS USB interface */
 207        { } /* Terminating Entry */
 208};
 209
 210MODULE_DEVICE_TABLE(usb, id_table);
 211
 212struct cp210x_port_private {
 213        __u8                    bInterfaceNumber;
 214        bool                    has_swapped_line_ctl;
 215};
 216
 217static struct usb_serial_driver cp210x_device = {
 218        .driver = {
 219                .owner =        THIS_MODULE,
 220                .name =         "cp210x",
 221        },
 222        .id_table               = id_table,
 223        .num_ports              = 1,
 224        .bulk_in_size           = 256,
 225        .bulk_out_size          = 256,
 226        .open                   = cp210x_open,
 227        .close                  = cp210x_close,
 228        .break_ctl              = cp210x_break_ctl,
 229        .set_termios            = cp210x_set_termios,
 230        .tx_empty               = cp210x_tx_empty,
 231        .tiocmget               = cp210x_tiocmget,
 232        .tiocmset               = cp210x_tiocmset,
 233        .port_probe             = cp210x_port_probe,
 234        .port_remove            = cp210x_port_remove,
 235        .dtr_rts                = cp210x_dtr_rts
 236};
 237
 238static struct usb_serial_driver * const serial_drivers[] = {
 239        &cp210x_device, NULL
 240};
 241
 242/* Config request types */
 243#define REQTYPE_HOST_TO_INTERFACE       0x41
 244#define REQTYPE_INTERFACE_TO_HOST       0xc1
 245#define REQTYPE_HOST_TO_DEVICE  0x40
 246#define REQTYPE_DEVICE_TO_HOST  0xc0
 247
 248/* Config request codes */
 249#define CP210X_IFC_ENABLE       0x00
 250#define CP210X_SET_BAUDDIV      0x01
 251#define CP210X_GET_BAUDDIV      0x02
 252#define CP210X_SET_LINE_CTL     0x03
 253#define CP210X_GET_LINE_CTL     0x04
 254#define CP210X_SET_BREAK        0x05
 255#define CP210X_IMM_CHAR         0x06
 256#define CP210X_SET_MHS          0x07
 257#define CP210X_GET_MDMSTS       0x08
 258#define CP210X_SET_XON          0x09
 259#define CP210X_SET_XOFF         0x0A
 260#define CP210X_SET_EVENTMASK    0x0B
 261#define CP210X_GET_EVENTMASK    0x0C
 262#define CP210X_SET_CHAR         0x0D
 263#define CP210X_GET_CHARS        0x0E
 264#define CP210X_GET_PROPS        0x0F
 265#define CP210X_GET_COMM_STATUS  0x10
 266#define CP210X_RESET            0x11
 267#define CP210X_PURGE            0x12
 268#define CP210X_SET_FLOW         0x13
 269#define CP210X_GET_FLOW         0x14
 270#define CP210X_EMBED_EVENTS     0x15
 271#define CP210X_GET_EVENTSTATE   0x16
 272#define CP210X_SET_CHARS        0x19
 273#define CP210X_GET_BAUDRATE     0x1D
 274#define CP210X_SET_BAUDRATE     0x1E
 275
 276/* CP210X_IFC_ENABLE */
 277#define UART_ENABLE             0x0001
 278#define UART_DISABLE            0x0000
 279
 280/* CP210X_(SET|GET)_BAUDDIV */
 281#define BAUD_RATE_GEN_FREQ      0x384000
 282
 283/* CP210X_(SET|GET)_LINE_CTL */
 284#define BITS_DATA_MASK          0X0f00
 285#define BITS_DATA_5             0X0500
 286#define BITS_DATA_6             0X0600
 287#define BITS_DATA_7             0X0700
 288#define BITS_DATA_8             0X0800
 289#define BITS_DATA_9             0X0900
 290
 291#define BITS_PARITY_MASK        0x00f0
 292#define BITS_PARITY_NONE        0x0000
 293#define BITS_PARITY_ODD         0x0010
 294#define BITS_PARITY_EVEN        0x0020
 295#define BITS_PARITY_MARK        0x0030
 296#define BITS_PARITY_SPACE       0x0040
 297
 298#define BITS_STOP_MASK          0x000f
 299#define BITS_STOP_1             0x0000
 300#define BITS_STOP_1_5           0x0001
 301#define BITS_STOP_2             0x0002
 302
 303/* CP210X_SET_BREAK */
 304#define BREAK_ON                0x0001
 305#define BREAK_OFF               0x0000
 306
 307/* CP210X_(SET_MHS|GET_MDMSTS) */
 308#define CONTROL_DTR             0x0001
 309#define CONTROL_RTS             0x0002
 310#define CONTROL_CTS             0x0010
 311#define CONTROL_DSR             0x0020
 312#define CONTROL_RING            0x0040
 313#define CONTROL_DCD             0x0080
 314#define CONTROL_WRITE_DTR       0x0100
 315#define CONTROL_WRITE_RTS       0x0200
 316
 317/* CP210X_GET_COMM_STATUS returns these 0x13 bytes */
 318struct cp210x_comm_status {
 319        __le32   ulErrors;
 320        __le32   ulHoldReasons;
 321        __le32   ulAmountInInQueue;
 322        __le32   ulAmountInOutQueue;
 323        u8       bEofReceived;
 324        u8       bWaitForImmediate;
 325        u8       bReserved;
 326} __packed;
 327
 328/*
 329 * CP210X_PURGE - 16 bits passed in wValue of USB request.
 330 * SiLabs app note AN571 gives a strange description of the 4 bits:
 331 * bit 0 or bit 2 clears the transmit queue and 1 or 3 receive.
 332 * writing 1 to all, however, purges cp2108 well enough to avoid the hang.
 333 */
 334#define PURGE_ALL               0x000f
 335
 336/* CP210X_GET_FLOW/CP210X_SET_FLOW read/write these 0x10 bytes */
 337struct cp210x_flow_ctl {
 338        __le32  ulControlHandshake;
 339        __le32  ulFlowReplace;
 340        __le32  ulXonLimit;
 341        __le32  ulXoffLimit;
 342} __packed;
 343
 344/* cp210x_flow_ctl::ulControlHandshake */
 345#define CP210X_SERIAL_DTR_MASK          GENMASK(1, 0)
 346#define CP210X_SERIAL_DTR_SHIFT(_mode)  (_mode)
 347#define CP210X_SERIAL_CTS_HANDSHAKE     BIT(3)
 348#define CP210X_SERIAL_DSR_HANDSHAKE     BIT(4)
 349#define CP210X_SERIAL_DCD_HANDSHAKE     BIT(5)
 350#define CP210X_SERIAL_DSR_SENSITIVITY   BIT(6)
 351
 352/* values for cp210x_flow_ctl::ulControlHandshake::CP210X_SERIAL_DTR_MASK */
 353#define CP210X_SERIAL_DTR_INACTIVE      0
 354#define CP210X_SERIAL_DTR_ACTIVE        1
 355#define CP210X_SERIAL_DTR_FLOW_CTL      2
 356
 357/* cp210x_flow_ctl::ulFlowReplace */
 358#define CP210X_SERIAL_AUTO_TRANSMIT     BIT(0)
 359#define CP210X_SERIAL_AUTO_RECEIVE      BIT(1)
 360#define CP210X_SERIAL_ERROR_CHAR        BIT(2)
 361#define CP210X_SERIAL_NULL_STRIPPING    BIT(3)
 362#define CP210X_SERIAL_BREAK_CHAR        BIT(4)
 363#define CP210X_SERIAL_RTS_MASK          GENMASK(7, 6)
 364#define CP210X_SERIAL_RTS_SHIFT(_mode)  (_mode << 6)
 365#define CP210X_SERIAL_XOFF_CONTINUE     BIT(31)
 366
 367/* values for cp210x_flow_ctl::ulFlowReplace::CP210X_SERIAL_RTS_MASK */
 368#define CP210X_SERIAL_RTS_INACTIVE      0
 369#define CP210X_SERIAL_RTS_ACTIVE        1
 370#define CP210X_SERIAL_RTS_FLOW_CTL      2
 371
 372/*
 373 * Reads a variable-sized block of CP210X_ registers, identified by req.
 374 * Returns data into buf in native USB byte order.
 375 */
 376static int cp210x_read_reg_block(struct usb_serial_port *port, u8 req,
 377                void *buf, int bufsize)
 378{
 379        struct usb_serial *serial = port->serial;
 380        struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
 381        void *dmabuf;
 382        int result;
 383
 384        dmabuf = kmalloc(bufsize, GFP_KERNEL);
 385        if (!dmabuf) {
 386                /*
 387                 * FIXME Some callers don't bother to check for error,
 388                 * at least give them consistent junk until they are fixed
 389                 */
 390                memset(buf, 0, bufsize);
 391                return -ENOMEM;
 392        }
 393
 394        result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
 395                        req, REQTYPE_INTERFACE_TO_HOST, 0,
 396                        port_priv->bInterfaceNumber, dmabuf, bufsize,
 397                        USB_CTRL_SET_TIMEOUT);
 398        if (result == bufsize) {
 399                memcpy(buf, dmabuf, bufsize);
 400                result = 0;
 401        } else {
 402                dev_err(&port->dev, "failed get req 0x%x size %d status: %d\n",
 403                                req, bufsize, result);
 404                if (result >= 0)
 405                        result = -EPROTO;
 406
 407                /*
 408                 * FIXME Some callers don't bother to check for error,
 409                 * at least give them consistent junk until they are fixed
 410                 */
 411                memset(buf, 0, bufsize);
 412        }
 413
 414        kfree(dmabuf);
 415
 416        return result;
 417}
 418
 419/*
 420 * Reads any 32-bit CP210X_ register identified by req.
 421 */
 422static int cp210x_read_u32_reg(struct usb_serial_port *port, u8 req, u32 *val)
 423{
 424        __le32 le32_val;
 425        int err;
 426
 427        err = cp210x_read_reg_block(port, req, &le32_val, sizeof(le32_val));
 428        if (err) {
 429                /*
 430                 * FIXME Some callers don't bother to check for error,
 431                 * at least give them consistent junk until they are fixed
 432                 */
 433                *val = 0;
 434                return err;
 435        }
 436
 437        *val = le32_to_cpu(le32_val);
 438
 439        return 0;
 440}
 441
 442/*
 443 * Reads any 16-bit CP210X_ register identified by req.
 444 */
 445static int cp210x_read_u16_reg(struct usb_serial_port *port, u8 req, u16 *val)
 446{
 447        __le16 le16_val;
 448        int err;
 449
 450        err = cp210x_read_reg_block(port, req, &le16_val, sizeof(le16_val));
 451        if (err)
 452                return err;
 453
 454        *val = le16_to_cpu(le16_val);
 455
 456        return 0;
 457}
 458
 459/*
 460 * Reads any 8-bit CP210X_ register identified by req.
 461 */
 462static int cp210x_read_u8_reg(struct usb_serial_port *port, u8 req, u8 *val)
 463{
 464        return cp210x_read_reg_block(port, req, val, sizeof(*val));
 465}
 466
 467/*
 468 * Writes any 16-bit CP210X_ register (req) whose value is passed
 469 * entirely in the wValue field of the USB request.
 470 */
 471static int cp210x_write_u16_reg(struct usb_serial_port *port, u8 req, u16 val)
 472{
 473        struct usb_serial *serial = port->serial;
 474        struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
 475        int result;
 476
 477        result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
 478                        req, REQTYPE_HOST_TO_INTERFACE, val,
 479                        port_priv->bInterfaceNumber, NULL, 0,
 480                        USB_CTRL_SET_TIMEOUT);
 481        if (result < 0) {
 482                dev_err(&port->dev, "failed set request 0x%x status: %d\n",
 483                                req, result);
 484        }
 485
 486        return result;
 487}
 488
 489/*
 490 * Writes a variable-sized block of CP210X_ registers, identified by req.
 491 * Data in buf must be in native USB byte order.
 492 */
 493static int cp210x_write_reg_block(struct usb_serial_port *port, u8 req,
 494                void *buf, int bufsize)
 495{
 496        struct usb_serial *serial = port->serial;
 497        struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
 498        void *dmabuf;
 499        int result;
 500
 501        dmabuf = kmemdup(buf, bufsize, GFP_KERNEL);
 502        if (!dmabuf)
 503                return -ENOMEM;
 504
 505        result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
 506                        req, REQTYPE_HOST_TO_INTERFACE, 0,
 507                        port_priv->bInterfaceNumber, dmabuf, bufsize,
 508                        USB_CTRL_SET_TIMEOUT);
 509
 510        kfree(dmabuf);
 511
 512        if (result == bufsize) {
 513                result = 0;
 514        } else {
 515                dev_err(&port->dev, "failed set req 0x%x size %d status: %d\n",
 516                                req, bufsize, result);
 517                if (result >= 0)
 518                        result = -EPROTO;
 519        }
 520
 521        return result;
 522}
 523
 524/*
 525 * Writes any 32-bit CP210X_ register identified by req.
 526 */
 527static int cp210x_write_u32_reg(struct usb_serial_port *port, u8 req, u32 val)
 528{
 529        __le32 le32_val;
 530
 531        le32_val = cpu_to_le32(val);
 532
 533        return cp210x_write_reg_block(port, req, &le32_val, sizeof(le32_val));
 534}
 535
 536/*
 537 * Detect CP2108 GET_LINE_CTL bug and activate workaround.
 538 * Write a known good value 0x800, read it back.
 539 * If it comes back swapped the bug is detected.
 540 * Preserve the original register value.
 541 */
 542static int cp210x_detect_swapped_line_ctl(struct usb_serial_port *port)
 543{
 544        struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
 545        u16 line_ctl_save;
 546        u16 line_ctl_test;
 547        int err;
 548
 549        err = cp210x_read_u16_reg(port, CP210X_GET_LINE_CTL, &line_ctl_save);
 550        if (err)
 551                return err;
 552
 553        err = cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, 0x800);
 554        if (err)
 555                return err;
 556
 557        err = cp210x_read_u16_reg(port, CP210X_GET_LINE_CTL, &line_ctl_test);
 558        if (err)
 559                return err;
 560
 561        if (line_ctl_test == 8) {
 562                port_priv->has_swapped_line_ctl = true;
 563                line_ctl_save = swab16(line_ctl_save);
 564        }
 565
 566        return cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, line_ctl_save);
 567}
 568
 569/*
 570 * Must always be called instead of cp210x_read_u16_reg(CP210X_GET_LINE_CTL)
 571 * to workaround cp2108 bug and get correct value.
 572 */
 573static int cp210x_get_line_ctl(struct usb_serial_port *port, u16 *ctl)
 574{
 575        struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
 576        int err;
 577
 578        err = cp210x_read_u16_reg(port, CP210X_GET_LINE_CTL, ctl);
 579        if (err)
 580                return err;
 581
 582        /* Workaround swapped bytes in 16-bit value from CP210X_GET_LINE_CTL */
 583        if (port_priv->has_swapped_line_ctl)
 584                *ctl = swab16(*ctl);
 585
 586        return 0;
 587}
 588
 589/*
 590 * cp210x_quantise_baudrate
 591 * Quantises the baud rate as per AN205 Table 1
 592 */
 593static unsigned int cp210x_quantise_baudrate(unsigned int baud)
 594{
 595        if (baud <= 300)
 596                baud = 300;
 597        else if (baud <= 600)      baud = 600;
 598        else if (baud <= 1200)     baud = 1200;
 599        else if (baud <= 1800)     baud = 1800;
 600        else if (baud <= 2400)     baud = 2400;
 601        else if (baud <= 4000)     baud = 4000;
 602        else if (baud <= 4803)     baud = 4800;
 603        else if (baud <= 7207)     baud = 7200;
 604        else if (baud <= 9612)     baud = 9600;
 605        else if (baud <= 14428)    baud = 14400;
 606        else if (baud <= 16062)    baud = 16000;
 607        else if (baud <= 19250)    baud = 19200;
 608        else if (baud <= 28912)    baud = 28800;
 609        else if (baud <= 38601)    baud = 38400;
 610        else if (baud <= 51558)    baud = 51200;
 611        else if (baud <= 56280)    baud = 56000;
 612        else if (baud <= 58053)    baud = 57600;
 613        else if (baud <= 64111)    baud = 64000;
 614        else if (baud <= 77608)    baud = 76800;
 615        else if (baud <= 117028)   baud = 115200;
 616        else if (baud <= 129347)   baud = 128000;
 617        else if (baud <= 156868)   baud = 153600;
 618        else if (baud <= 237832)   baud = 230400;
 619        else if (baud <= 254234)   baud = 250000;
 620        else if (baud <= 273066)   baud = 256000;
 621        else if (baud <= 491520)   baud = 460800;
 622        else if (baud <= 567138)   baud = 500000;
 623        else if (baud <= 670254)   baud = 576000;
 624        else if (baud < 1000000)
 625                baud = 921600;
 626        else if (baud > 2000000)
 627                baud = 2000000;
 628        return baud;
 629}
 630
 631static int cp210x_open(struct tty_struct *tty, struct usb_serial_port *port)
 632{
 633        int result;
 634
 635        result = cp210x_write_u16_reg(port, CP210X_IFC_ENABLE, UART_ENABLE);
 636        if (result) {
 637                dev_err(&port->dev, "%s - Unable to enable UART\n", __func__);
 638                return result;
 639        }
 640
 641        /* Configure the termios structure */
 642        cp210x_get_termios(tty, port);
 643
 644        /* The baud rate must be initialised on cp2104 */
 645        if (tty)
 646                cp210x_change_speed(tty, port, NULL);
 647
 648        return usb_serial_generic_open(tty, port);
 649}
 650
 651static void cp210x_close(struct usb_serial_port *port)
 652{
 653        usb_serial_generic_close(port);
 654
 655        /* Clear both queues; cp2108 needs this to avoid an occasional hang */
 656        cp210x_write_u16_reg(port, CP210X_PURGE, PURGE_ALL);
 657
 658        cp210x_write_u16_reg(port, CP210X_IFC_ENABLE, UART_DISABLE);
 659}
 660
 661/*
 662 * Read how many bytes are waiting in the TX queue.
 663 */
 664static int cp210x_get_tx_queue_byte_count(struct usb_serial_port *port,
 665                u32 *count)
 666{
 667        struct usb_serial *serial = port->serial;
 668        struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
 669        struct cp210x_comm_status *sts;
 670        int result;
 671
 672        sts = kmalloc(sizeof(*sts), GFP_KERNEL);
 673        if (!sts)
 674                return -ENOMEM;
 675
 676        result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
 677                        CP210X_GET_COMM_STATUS, REQTYPE_INTERFACE_TO_HOST,
 678                        0, port_priv->bInterfaceNumber, sts, sizeof(*sts),
 679                        USB_CTRL_GET_TIMEOUT);
 680        if (result == sizeof(*sts)) {
 681                *count = le32_to_cpu(sts->ulAmountInOutQueue);
 682                result = 0;
 683        } else {
 684                dev_err(&port->dev, "failed to get comm status: %d\n", result);
 685                if (result >= 0)
 686                        result = -EPROTO;
 687        }
 688
 689        kfree(sts);
 690
 691        return result;
 692}
 693
 694static bool cp210x_tx_empty(struct usb_serial_port *port)
 695{
 696        int err;
 697        u32 count;
 698
 699        err = cp210x_get_tx_queue_byte_count(port, &count);
 700        if (err)
 701                return true;
 702
 703        return !count;
 704}
 705
 706/*
 707 * cp210x_get_termios
 708 * Reads the baud rate, data bits, parity, stop bits and flow control mode
 709 * from the device, corrects any unsupported values, and configures the
 710 * termios structure to reflect the state of the device
 711 */
 712static void cp210x_get_termios(struct tty_struct *tty,
 713        struct usb_serial_port *port)
 714{
 715        unsigned int baud;
 716
 717        if (tty) {
 718                cp210x_get_termios_port(tty->driver_data,
 719                        &tty->termios.c_cflag, &baud);
 720                tty_encode_baud_rate(tty, baud, baud);
 721        } else {
 722                unsigned int cflag;
 723                cflag = 0;
 724                cp210x_get_termios_port(port, &cflag, &baud);
 725        }
 726}
 727
 728/*
 729 * cp210x_get_termios_port
 730 * This is the heart of cp210x_get_termios which always uses a &usb_serial_port.
 731 */
 732static void cp210x_get_termios_port(struct usb_serial_port *port,
 733        unsigned int *cflagp, unsigned int *baudp)
 734{
 735        struct device *dev = &port->dev;
 736        unsigned int cflag;
 737        struct cp210x_flow_ctl flow_ctl;
 738        u32 baud;
 739        u16 bits;
 740        u32 ctl_hs;
 741
 742        cp210x_read_u32_reg(port, CP210X_GET_BAUDRATE, &baud);
 743
 744        dev_dbg(dev, "%s - baud rate = %d\n", __func__, baud);
 745        *baudp = baud;
 746
 747        cflag = *cflagp;
 748
 749        cp210x_get_line_ctl(port, &bits);
 750        cflag &= ~CSIZE;
 751        switch (bits & BITS_DATA_MASK) {
 752        case BITS_DATA_5:
 753                dev_dbg(dev, "%s - data bits = 5\n", __func__);
 754                cflag |= CS5;
 755                break;
 756        case BITS_DATA_6:
 757                dev_dbg(dev, "%s - data bits = 6\n", __func__);
 758                cflag |= CS6;
 759                break;
 760        case BITS_DATA_7:
 761                dev_dbg(dev, "%s - data bits = 7\n", __func__);
 762                cflag |= CS7;
 763                break;
 764        case BITS_DATA_8:
 765                dev_dbg(dev, "%s - data bits = 8\n", __func__);
 766                cflag |= CS8;
 767                break;
 768        case BITS_DATA_9:
 769                dev_dbg(dev, "%s - data bits = 9 (not supported, using 8 data bits)\n", __func__);
 770                cflag |= CS8;
 771                bits &= ~BITS_DATA_MASK;
 772                bits |= BITS_DATA_8;
 773                cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits);
 774                break;
 775        default:
 776                dev_dbg(dev, "%s - Unknown number of data bits, using 8\n", __func__);
 777                cflag |= CS8;
 778                bits &= ~BITS_DATA_MASK;
 779                bits |= BITS_DATA_8;
 780                cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits);
 781                break;
 782        }
 783
 784        switch (bits & BITS_PARITY_MASK) {
 785        case BITS_PARITY_NONE:
 786                dev_dbg(dev, "%s - parity = NONE\n", __func__);
 787                cflag &= ~PARENB;
 788                break;
 789        case BITS_PARITY_ODD:
 790                dev_dbg(dev, "%s - parity = ODD\n", __func__);
 791                cflag |= (PARENB|PARODD);
 792                break;
 793        case BITS_PARITY_EVEN:
 794                dev_dbg(dev, "%s - parity = EVEN\n", __func__);
 795                cflag &= ~PARODD;
 796                cflag |= PARENB;
 797                break;
 798        case BITS_PARITY_MARK:
 799                dev_dbg(dev, "%s - parity = MARK\n", __func__);
 800                cflag |= (PARENB|PARODD|CMSPAR);
 801                break;
 802        case BITS_PARITY_SPACE:
 803                dev_dbg(dev, "%s - parity = SPACE\n", __func__);
 804                cflag &= ~PARODD;
 805                cflag |= (PARENB|CMSPAR);
 806                break;
 807        default:
 808                dev_dbg(dev, "%s - Unknown parity mode, disabling parity\n", __func__);
 809                cflag &= ~PARENB;
 810                bits &= ~BITS_PARITY_MASK;
 811                cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits);
 812                break;
 813        }
 814
 815        cflag &= ~CSTOPB;
 816        switch (bits & BITS_STOP_MASK) {
 817        case BITS_STOP_1:
 818                dev_dbg(dev, "%s - stop bits = 1\n", __func__);
 819                break;
 820        case BITS_STOP_1_5:
 821                dev_dbg(dev, "%s - stop bits = 1.5 (not supported, using 1 stop bit)\n", __func__);
 822                bits &= ~BITS_STOP_MASK;
 823                cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits);
 824                break;
 825        case BITS_STOP_2:
 826                dev_dbg(dev, "%s - stop bits = 2\n", __func__);
 827                cflag |= CSTOPB;
 828                break;
 829        default:
 830                dev_dbg(dev, "%s - Unknown number of stop bits, using 1 stop bit\n", __func__);
 831                bits &= ~BITS_STOP_MASK;
 832                cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits);
 833                break;
 834        }
 835
 836        cp210x_read_reg_block(port, CP210X_GET_FLOW, &flow_ctl,
 837                        sizeof(flow_ctl));
 838        ctl_hs = le32_to_cpu(flow_ctl.ulControlHandshake);
 839        if (ctl_hs & CP210X_SERIAL_CTS_HANDSHAKE) {
 840                dev_dbg(dev, "%s - flow control = CRTSCTS\n", __func__);
 841                cflag |= CRTSCTS;
 842        } else {
 843                dev_dbg(dev, "%s - flow control = NONE\n", __func__);
 844                cflag &= ~CRTSCTS;
 845        }
 846
 847        *cflagp = cflag;
 848}
 849
 850/*
 851 * CP2101 supports the following baud rates:
 852 *
 853 *      300, 600, 1200, 1800, 2400, 4800, 7200, 9600, 14400, 19200, 28800,
 854 *      38400, 56000, 57600, 115200, 128000, 230400, 460800, 921600
 855 *
 856 * CP2102 and CP2103 support the following additional rates:
 857 *
 858 *      4000, 16000, 51200, 64000, 76800, 153600, 250000, 256000, 500000,
 859 *      576000
 860 *
 861 * The device will map a requested rate to a supported one, but the result
 862 * of requests for rates greater than 1053257 is undefined (see AN205).
 863 *
 864 * CP2104, CP2105 and CP2110 support most rates up to 2M, 921k and 1M baud,
 865 * respectively, with an error less than 1%. The actual rates are determined
 866 * by
 867 *
 868 *      div = round(freq / (2 x prescale x request))
 869 *      actual = freq / (2 x prescale x div)
 870 *
 871 * For CP2104 and CP2105 freq is 48Mhz and prescale is 4 for request <= 365bps
 872 * or 1 otherwise.
 873 * For CP2110 freq is 24Mhz and prescale is 4 for request <= 300bps or 1
 874 * otherwise.
 875 */
 876static void cp210x_change_speed(struct tty_struct *tty,
 877                struct usb_serial_port *port, struct ktermios *old_termios)
 878{
 879        u32 baud;
 880
 881        baud = tty->termios.c_ospeed;
 882
 883        /* This maps the requested rate to a rate valid on cp2102 or cp2103,
 884         * or to an arbitrary rate in [1M,2M].
 885         *
 886         * NOTE: B0 is not implemented.
 887         */
 888        baud = cp210x_quantise_baudrate(baud);
 889
 890        dev_dbg(&port->dev, "%s - setting baud rate to %u\n", __func__, baud);
 891        if (cp210x_write_u32_reg(port, CP210X_SET_BAUDRATE, baud)) {
 892                dev_warn(&port->dev, "failed to set baud rate to %u\n", baud);
 893                if (old_termios)
 894                        baud = old_termios->c_ospeed;
 895                else
 896                        baud = 9600;
 897        }
 898
 899        tty_encode_baud_rate(tty, baud, baud);
 900}
 901
 902static void cp210x_set_termios(struct tty_struct *tty,
 903                struct usb_serial_port *port, struct ktermios *old_termios)
 904{
 905        struct device *dev = &port->dev;
 906        unsigned int cflag, old_cflag;
 907        u16 bits;
 908
 909        cflag = tty->termios.c_cflag;
 910        old_cflag = old_termios->c_cflag;
 911
 912        if (tty->termios.c_ospeed != old_termios->c_ospeed)
 913                cp210x_change_speed(tty, port, old_termios);
 914
 915        /* If the number of data bits is to be updated */
 916        if ((cflag & CSIZE) != (old_cflag & CSIZE)) {
 917                cp210x_get_line_ctl(port, &bits);
 918                bits &= ~BITS_DATA_MASK;
 919                switch (cflag & CSIZE) {
 920                case CS5:
 921                        bits |= BITS_DATA_5;
 922                        dev_dbg(dev, "%s - data bits = 5\n", __func__);
 923                        break;
 924                case CS6:
 925                        bits |= BITS_DATA_6;
 926                        dev_dbg(dev, "%s - data bits = 6\n", __func__);
 927                        break;
 928                case CS7:
 929                        bits |= BITS_DATA_7;
 930                        dev_dbg(dev, "%s - data bits = 7\n", __func__);
 931                        break;
 932                case CS8:
 933                        bits |= BITS_DATA_8;
 934                        dev_dbg(dev, "%s - data bits = 8\n", __func__);
 935                        break;
 936                /*case CS9:
 937                        bits |= BITS_DATA_9;
 938                        dev_dbg(dev, "%s - data bits = 9\n", __func__);
 939                        break;*/
 940                default:
 941                        dev_dbg(dev, "cp210x driver does not support the number of bits requested, using 8 bit mode\n");
 942                        bits |= BITS_DATA_8;
 943                        break;
 944                }
 945                if (cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits))
 946                        dev_dbg(dev, "Number of data bits requested not supported by device\n");
 947        }
 948
 949        if ((cflag     & (PARENB|PARODD|CMSPAR)) !=
 950            (old_cflag & (PARENB|PARODD|CMSPAR))) {
 951                cp210x_get_line_ctl(port, &bits);
 952                bits &= ~BITS_PARITY_MASK;
 953                if (cflag & PARENB) {
 954                        if (cflag & CMSPAR) {
 955                                if (cflag & PARODD) {
 956                                        bits |= BITS_PARITY_MARK;
 957                                        dev_dbg(dev, "%s - parity = MARK\n", __func__);
 958                                } else {
 959                                        bits |= BITS_PARITY_SPACE;
 960                                        dev_dbg(dev, "%s - parity = SPACE\n", __func__);
 961                                }
 962                        } else {
 963                                if (cflag & PARODD) {
 964                                        bits |= BITS_PARITY_ODD;
 965                                        dev_dbg(dev, "%s - parity = ODD\n", __func__);
 966                                } else {
 967                                        bits |= BITS_PARITY_EVEN;
 968                                        dev_dbg(dev, "%s - parity = EVEN\n", __func__);
 969                                }
 970                        }
 971                }
 972                if (cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits))
 973                        dev_dbg(dev, "Parity mode not supported by device\n");
 974        }
 975
 976        if ((cflag & CSTOPB) != (old_cflag & CSTOPB)) {
 977                cp210x_get_line_ctl(port, &bits);
 978                bits &= ~BITS_STOP_MASK;
 979                if (cflag & CSTOPB) {
 980                        bits |= BITS_STOP_2;
 981                        dev_dbg(dev, "%s - stop bits = 2\n", __func__);
 982                } else {
 983                        bits |= BITS_STOP_1;
 984                        dev_dbg(dev, "%s - stop bits = 1\n", __func__);
 985                }
 986                if (cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits))
 987                        dev_dbg(dev, "Number of stop bits requested not supported by device\n");
 988        }
 989
 990        if ((cflag & CRTSCTS) != (old_cflag & CRTSCTS)) {
 991                struct cp210x_flow_ctl flow_ctl;
 992                u32 ctl_hs;
 993                u32 flow_repl;
 994
 995                cp210x_read_reg_block(port, CP210X_GET_FLOW, &flow_ctl,
 996                                sizeof(flow_ctl));
 997                ctl_hs = le32_to_cpu(flow_ctl.ulControlHandshake);
 998                flow_repl = le32_to_cpu(flow_ctl.ulFlowReplace);
 999                dev_dbg(dev, "%s - read ulControlHandshake=0x%08x, ulFlowReplace=0x%08x\n",
1000                                __func__, ctl_hs, flow_repl);
1001
1002                ctl_hs &= ~CP210X_SERIAL_DSR_HANDSHAKE;
1003                ctl_hs &= ~CP210X_SERIAL_DCD_HANDSHAKE;
1004                ctl_hs &= ~CP210X_SERIAL_DSR_SENSITIVITY;
1005                ctl_hs &= ~CP210X_SERIAL_DTR_MASK;
1006                ctl_hs |= CP210X_SERIAL_DTR_SHIFT(CP210X_SERIAL_DTR_ACTIVE);
1007                if (cflag & CRTSCTS) {
1008                        ctl_hs |= CP210X_SERIAL_CTS_HANDSHAKE;
1009
1010                        flow_repl &= ~CP210X_SERIAL_RTS_MASK;
1011                        flow_repl |= CP210X_SERIAL_RTS_SHIFT(
1012                                        CP210X_SERIAL_RTS_FLOW_CTL);
1013                        dev_dbg(dev, "%s - flow control = CRTSCTS\n", __func__);
1014                } else {
1015                        ctl_hs &= ~CP210X_SERIAL_CTS_HANDSHAKE;
1016
1017                        flow_repl &= ~CP210X_SERIAL_RTS_MASK;
1018                        flow_repl |= CP210X_SERIAL_RTS_SHIFT(
1019                                        CP210X_SERIAL_RTS_ACTIVE);
1020                        dev_dbg(dev, "%s - flow control = NONE\n", __func__);
1021                }
1022
1023                dev_dbg(dev, "%s - write ulControlHandshake=0x%08x, ulFlowReplace=0x%08x\n",
1024                                __func__, ctl_hs, flow_repl);
1025                flow_ctl.ulControlHandshake = cpu_to_le32(ctl_hs);
1026                flow_ctl.ulFlowReplace = cpu_to_le32(flow_repl);
1027                cp210x_write_reg_block(port, CP210X_SET_FLOW, &flow_ctl,
1028                                sizeof(flow_ctl));
1029        }
1030
1031}
1032
1033static int cp210x_tiocmset(struct tty_struct *tty,
1034                unsigned int set, unsigned int clear)
1035{
1036        struct usb_serial_port *port = tty->driver_data;
1037        return cp210x_tiocmset_port(port, set, clear);
1038}
1039
1040static int cp210x_tiocmset_port(struct usb_serial_port *port,
1041                unsigned int set, unsigned int clear)
1042{
1043        u16 control = 0;
1044
1045        if (set & TIOCM_RTS) {
1046                control |= CONTROL_RTS;
1047                control |= CONTROL_WRITE_RTS;
1048        }
1049        if (set & TIOCM_DTR) {
1050                control |= CONTROL_DTR;
1051                control |= CONTROL_WRITE_DTR;
1052        }
1053        if (clear & TIOCM_RTS) {
1054                control &= ~CONTROL_RTS;
1055                control |= CONTROL_WRITE_RTS;
1056        }
1057        if (clear & TIOCM_DTR) {
1058                control &= ~CONTROL_DTR;
1059                control |= CONTROL_WRITE_DTR;
1060        }
1061
1062        dev_dbg(&port->dev, "%s - control = 0x%.4x\n", __func__, control);
1063
1064        return cp210x_write_u16_reg(port, CP210X_SET_MHS, control);
1065}
1066
1067static void cp210x_dtr_rts(struct usb_serial_port *p, int on)
1068{
1069        if (on)
1070                cp210x_tiocmset_port(p, TIOCM_DTR|TIOCM_RTS, 0);
1071        else
1072                cp210x_tiocmset_port(p, 0, TIOCM_DTR|TIOCM_RTS);
1073}
1074
1075static int cp210x_tiocmget(struct tty_struct *tty)
1076{
1077        struct usb_serial_port *port = tty->driver_data;
1078        u8 control;
1079        int result;
1080
1081        result = cp210x_read_u8_reg(port, CP210X_GET_MDMSTS, &control);
1082        if (result)
1083                return result;
1084
1085        result = ((control & CONTROL_DTR) ? TIOCM_DTR : 0)
1086                |((control & CONTROL_RTS) ? TIOCM_RTS : 0)
1087                |((control & CONTROL_CTS) ? TIOCM_CTS : 0)
1088                |((control & CONTROL_DSR) ? TIOCM_DSR : 0)
1089                |((control & CONTROL_RING)? TIOCM_RI  : 0)
1090                |((control & CONTROL_DCD) ? TIOCM_CD  : 0);
1091
1092        dev_dbg(&port->dev, "%s - control = 0x%.2x\n", __func__, control);
1093
1094        return result;
1095}
1096
1097static void cp210x_break_ctl(struct tty_struct *tty, int break_state)
1098{
1099        struct usb_serial_port *port = tty->driver_data;
1100        u16 state;
1101
1102        if (break_state == 0)
1103                state = BREAK_OFF;
1104        else
1105                state = BREAK_ON;
1106        dev_dbg(&port->dev, "%s - turning break %s\n", __func__,
1107                state == BREAK_OFF ? "off" : "on");
1108        cp210x_write_u16_reg(port, CP210X_SET_BREAK, state);
1109}
1110
1111static int cp210x_port_probe(struct usb_serial_port *port)
1112{
1113        struct usb_serial *serial = port->serial;
1114        struct usb_host_interface *cur_altsetting;
1115        struct cp210x_port_private *port_priv;
1116        int ret;
1117
1118        port_priv = kzalloc(sizeof(*port_priv), GFP_KERNEL);
1119        if (!port_priv)
1120                return -ENOMEM;
1121
1122        cur_altsetting = serial->interface->cur_altsetting;
1123        port_priv->bInterfaceNumber = cur_altsetting->desc.bInterfaceNumber;
1124
1125        usb_set_serial_port_data(port, port_priv);
1126
1127        ret = cp210x_detect_swapped_line_ctl(port);
1128        if (ret) {
1129                kfree(port_priv);
1130                return ret;
1131        }
1132
1133        return 0;
1134}
1135
1136static int cp210x_port_remove(struct usb_serial_port *port)
1137{
1138        struct cp210x_port_private *port_priv;
1139
1140        port_priv = usb_get_serial_port_data(port);
1141        kfree(port_priv);
1142
1143        return 0;
1144}
1145
1146module_usb_serial_driver(serial_drivers, id_table);
1147
1148MODULE_DESCRIPTION(DRIVER_DESC);
1149MODULE_LICENSE("GPL");
1150