Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at 989a7241df87526bfef0396567e71ebe53a84ae4 769 lines 21 kB view raw
1/* 2 * Silicon Laboratories CP2101/CP2102 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 * Outstanding Issues: 15 * Buffers are not flushed when the port is opened. 16 * Multiple calls to write() may fail with "Resource temporarily unavailable" 17 * 18 */ 19 20#include <linux/kernel.h> 21#include <linux/errno.h> 22#include <linux/slab.h> 23#include <linux/tty.h> 24#include <linux/tty_flip.h> 25#include <linux/module.h> 26#include <linux/moduleparam.h> 27#include <linux/usb.h> 28#include <asm/uaccess.h> 29#include <linux/usb/serial.h> 30 31/* 32 * Version Information 33 */ 34#define DRIVER_VERSION "v0.07" 35#define DRIVER_DESC "Silicon Labs CP2101/CP2102 RS232 serial adaptor driver" 36 37/* 38 * Function Prototypes 39 */ 40static int cp2101_open(struct usb_serial_port*, struct file*); 41static void cp2101_cleanup(struct usb_serial_port*); 42static void cp2101_close(struct usb_serial_port*, struct file*); 43static void cp2101_get_termios(struct usb_serial_port*); 44static void cp2101_set_termios(struct usb_serial_port*, struct ktermios*); 45static int cp2101_tiocmget (struct usb_serial_port *, struct file *); 46static int cp2101_tiocmset (struct usb_serial_port *, struct file *, 47 unsigned int, unsigned int); 48static void cp2101_break_ctl(struct usb_serial_port*, int); 49static int cp2101_startup (struct usb_serial *); 50static void cp2101_shutdown(struct usb_serial*); 51 52 53static int debug; 54 55static struct usb_device_id id_table [] = { 56 { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */ 57 { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */ 58 { USB_DEVICE(0x0FCF, 0x1004) }, /* Dynastream ANT2USB */ 59 { USB_DEVICE(0x10A6, 0xAA26) }, /* Knock-off DCU-11 cable */ 60 { USB_DEVICE(0x10AB, 0x10C5) }, /* Siemens MC60 Cable */ 61 { USB_DEVICE(0x10B5, 0xAC70) }, /* Nokia CA-42 USB */ 62 { USB_DEVICE(0x10C4, 0x800A) }, /* SPORTident BSM7-D-USB main station */ 63 { USB_DEVICE(0x10C4, 0x803B) }, /* Pololu USB-serial converter */ 64 { USB_DEVICE(0x10C4, 0x8053) }, /* Enfora EDG1228 */ 65 { USB_DEVICE(0x10C4, 0x8066) }, /* Argussoft In-System Programmer */ 66 { USB_DEVICE(0x10C4, 0x807A) }, /* Crumb128 board */ 67 { USB_DEVICE(0x10C4, 0x80CA) }, /* Degree Controls Inc */ 68 { USB_DEVICE(0x10C4, 0x80DD) }, /* Tracient RFID */ 69 { USB_DEVICE(0x10C4, 0x80F6) }, /* Suunto sports instrument */ 70 { USB_DEVICE(0x10C4, 0x813D) }, /* Burnside Telecom Deskmobile */ 71 { USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */ 72 { USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */ 73 { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */ 74 { USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */ 75 { USB_DEVICE(0x10C4, 0x81E2) }, /* Lipowsky Industrie Elektronik GmbH, Baby-LIN */ 76 { USB_DEVICE(0x10C4, 0x81E7) }, /* Aerocomm Radio */ 77 { USB_DEVICE(0x10C4, 0x8218) }, /* Lipowsky Industrie Elektronik GmbH, HARP-1 */ 78 { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ 79 { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ 80 { USB_DEVICE(0x10C4, 0xF001) }, /* Elan Digital Systems USBscope50 */ 81 { USB_DEVICE(0x10C4, 0xF002) }, /* Elan Digital Systems USBwave12 */ 82 { USB_DEVICE(0x10C4, 0xF003) }, /* Elan Digital Systems USBpulse100 */ 83 { USB_DEVICE(0x10C4, 0xF004) }, /* Elan Digital Systems USBcount50 */ 84 { USB_DEVICE(0x10C5, 0xEA61) }, /* Silicon Labs MobiData GPRS USB Modem */ 85 { USB_DEVICE(0x13AD, 0x9999) }, /* Baltech card reader */ 86 { USB_DEVICE(0x166A, 0x0303) }, /* Clipsal 5500PCU C-Bus USB interface */ 87 { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */ 88 { } /* Terminating Entry */ 89}; 90 91MODULE_DEVICE_TABLE (usb, id_table); 92 93static struct usb_driver cp2101_driver = { 94 .name = "cp2101", 95 .probe = usb_serial_probe, 96 .disconnect = usb_serial_disconnect, 97 .id_table = id_table, 98 .no_dynamic_id = 1, 99}; 100 101static struct usb_serial_driver cp2101_device = { 102 .driver = { 103 .owner = THIS_MODULE, 104 .name = "cp2101", 105 }, 106 .usb_driver = &cp2101_driver, 107 .id_table = id_table, 108 .num_interrupt_in = 0, 109 .num_bulk_in = NUM_DONT_CARE, 110 .num_bulk_out = NUM_DONT_CARE, 111 .num_ports = 1, 112 .open = cp2101_open, 113 .close = cp2101_close, 114 .break_ctl = cp2101_break_ctl, 115 .set_termios = cp2101_set_termios, 116 .tiocmget = cp2101_tiocmget, 117 .tiocmset = cp2101_tiocmset, 118 .attach = cp2101_startup, 119 .shutdown = cp2101_shutdown, 120}; 121 122/* Config request types */ 123#define REQTYPE_HOST_TO_DEVICE 0x41 124#define REQTYPE_DEVICE_TO_HOST 0xc1 125 126/* Config SET requests. To GET, add 1 to the request number */ 127#define CP2101_UART 0x00 /* Enable / Disable */ 128#define CP2101_BAUDRATE 0x01 /* (BAUD_RATE_GEN_FREQ / baudrate) */ 129#define CP2101_BITS 0x03 /* 0x(0)(databits)(parity)(stopbits) */ 130#define CP2101_BREAK 0x05 /* On / Off */ 131#define CP2101_CONTROL 0x07 /* Flow control line states */ 132#define CP2101_MODEMCTL 0x13 /* Modem controls */ 133#define CP2101_CONFIG_6 0x19 /* 6 bytes of config data ??? */ 134 135/* CP2101_UART */ 136#define UART_ENABLE 0x0001 137#define UART_DISABLE 0x0000 138 139/* CP2101_BAUDRATE */ 140#define BAUD_RATE_GEN_FREQ 0x384000 141 142/* CP2101_BITS */ 143#define BITS_DATA_MASK 0X0f00 144#define BITS_DATA_5 0X0500 145#define BITS_DATA_6 0X0600 146#define BITS_DATA_7 0X0700 147#define BITS_DATA_8 0X0800 148#define BITS_DATA_9 0X0900 149 150#define BITS_PARITY_MASK 0x00f0 151#define BITS_PARITY_NONE 0x0000 152#define BITS_PARITY_ODD 0x0010 153#define BITS_PARITY_EVEN 0x0020 154#define BITS_PARITY_MARK 0x0030 155#define BITS_PARITY_SPACE 0x0040 156 157#define BITS_STOP_MASK 0x000f 158#define BITS_STOP_1 0x0000 159#define BITS_STOP_1_5 0x0001 160#define BITS_STOP_2 0x0002 161 162/* CP2101_BREAK */ 163#define BREAK_ON 0x0000 164#define BREAK_OFF 0x0001 165 166/* CP2101_CONTROL */ 167#define CONTROL_DTR 0x0001 168#define CONTROL_RTS 0x0002 169#define CONTROL_CTS 0x0010 170#define CONTROL_DSR 0x0020 171#define CONTROL_RING 0x0040 172#define CONTROL_DCD 0x0080 173#define CONTROL_WRITE_DTR 0x0100 174#define CONTROL_WRITE_RTS 0x0200 175 176/* 177 * cp2101_get_config 178 * Reads from the CP2101 configuration registers 179 * 'size' is specified in bytes. 180 * 'data' is a pointer to a pre-allocated array of integers large 181 * enough to hold 'size' bytes (with 4 bytes to each integer) 182 */ 183static int cp2101_get_config(struct usb_serial_port* port, u8 request, 184 unsigned int *data, int size) 185{ 186 struct usb_serial *serial = port->serial; 187 __le32 *buf; 188 int result, i, length; 189 190 /* Number of integers required to contain the array */ 191 length = (((size - 1) | 3) + 1)/4; 192 193 buf = kcalloc(length, sizeof(__le32), GFP_KERNEL); 194 if (!buf) { 195 dev_err(&port->dev, "%s - out of memory.\n", __FUNCTION__); 196 return -ENOMEM; 197 } 198 199 /* For get requests, the request number must be incremented */ 200 request++; 201 202 /* Issue the request, attempting to read 'size' bytes */ 203 result = usb_control_msg (serial->dev,usb_rcvctrlpipe (serial->dev, 0), 204 request, REQTYPE_DEVICE_TO_HOST, 0x0000, 205 0, buf, size, 300); 206 207 /* Convert data into an array of integers */ 208 for (i=0; i<length; i++) 209 data[i] = le32_to_cpu(buf[i]); 210 211 kfree(buf); 212 213 if (result != size) { 214 dev_err(&port->dev, "%s - Unable to send config request, " 215 "request=0x%x size=%d result=%d\n", 216 __FUNCTION__, request, size, result); 217 return -EPROTO; 218 } 219 220 return 0; 221} 222 223/* 224 * cp2101_set_config 225 * Writes to the CP2101 configuration registers 226 * Values less than 16 bits wide are sent directly 227 * 'size' is specified in bytes. 228 */ 229static int cp2101_set_config(struct usb_serial_port* port, u8 request, 230 unsigned int *data, int size) 231{ 232 struct usb_serial *serial = port->serial; 233 __le32 *buf; 234 int result, i, length; 235 236 /* Number of integers required to contain the array */ 237 length = (((size - 1) | 3) + 1)/4; 238 239 buf = kmalloc(length * sizeof(__le32), GFP_KERNEL); 240 if (!buf) { 241 dev_err(&port->dev, "%s - out of memory.\n", 242 __FUNCTION__); 243 return -ENOMEM; 244 } 245 246 /* Array of integers into bytes */ 247 for (i = 0; i < length; i++) 248 buf[i] = cpu_to_le32(data[i]); 249 250 if (size > 2) { 251 result = usb_control_msg (serial->dev, 252 usb_sndctrlpipe(serial->dev, 0), 253 request, REQTYPE_HOST_TO_DEVICE, 0x0000, 254 0, buf, size, 300); 255 } else { 256 result = usb_control_msg (serial->dev, 257 usb_sndctrlpipe(serial->dev, 0), 258 request, REQTYPE_HOST_TO_DEVICE, data[0], 259 0, NULL, 0, 300); 260 } 261 262 kfree(buf); 263 264 if ((size > 2 && result != size) || result < 0) { 265 dev_err(&port->dev, "%s - Unable to send request, " 266 "request=0x%x size=%d result=%d\n", 267 __FUNCTION__, request, size, result); 268 return -EPROTO; 269 } 270 271 /* Single data value */ 272 result = usb_control_msg (serial->dev, 273 usb_sndctrlpipe(serial->dev, 0), 274 request, REQTYPE_HOST_TO_DEVICE, data[0], 275 0, NULL, 0, 300); 276 return 0; 277} 278 279/* 280 * cp2101_set_config_single 281 * Convenience function for calling cp2101_set_config on single data values 282 * without requiring an integer pointer 283 */ 284static inline int cp2101_set_config_single(struct usb_serial_port* port, 285 u8 request, unsigned int data) 286{ 287 return cp2101_set_config(port, request, &data, 2); 288} 289 290static int cp2101_open (struct usb_serial_port *port, struct file *filp) 291{ 292 struct usb_serial *serial = port->serial; 293 int result; 294 295 dbg("%s - port %d", __FUNCTION__, port->number); 296 297 if (cp2101_set_config_single(port, CP2101_UART, UART_ENABLE)) { 298 dev_err(&port->dev, "%s - Unable to enable UART\n", 299 __FUNCTION__); 300 return -EPROTO; 301 } 302 303 /* Start reading from the device */ 304 usb_fill_bulk_urb (port->read_urb, serial->dev, 305 usb_rcvbulkpipe(serial->dev, 306 port->bulk_in_endpointAddress), 307 port->read_urb->transfer_buffer, 308 port->read_urb->transfer_buffer_length, 309 serial->type->read_bulk_callback, 310 port); 311 result = usb_submit_urb(port->read_urb, GFP_KERNEL); 312 if (result) { 313 dev_err(&port->dev, "%s - failed resubmitting read urb, " 314 "error %d\n", __FUNCTION__, result); 315 return result; 316 } 317 318 /* Configure the termios structure */ 319 cp2101_get_termios(port); 320 321 /* Set the DTR and RTS pins low */ 322 cp2101_tiocmset(port, NULL, TIOCM_DTR | TIOCM_RTS, 0); 323 324 return 0; 325} 326 327static void cp2101_cleanup (struct usb_serial_port *port) 328{ 329 struct usb_serial *serial = port->serial; 330 331 dbg("%s - port %d", __FUNCTION__, port->number); 332 333 if (serial->dev) { 334 /* shutdown any bulk reads that might be going on */ 335 if (serial->num_bulk_out) 336 usb_kill_urb(port->write_urb); 337 if (serial->num_bulk_in) 338 usb_kill_urb(port->read_urb); 339 } 340} 341 342static void cp2101_close (struct usb_serial_port *port, struct file * filp) 343{ 344 dbg("%s - port %d", __FUNCTION__, port->number); 345 346 /* shutdown our urbs */ 347 dbg("%s - shutting down urbs", __FUNCTION__); 348 usb_kill_urb(port->write_urb); 349 usb_kill_urb(port->read_urb); 350 351 mutex_lock(&port->serial->disc_mutex); 352 if (!port->serial->disconnected) 353 cp2101_set_config_single(port, CP2101_UART, UART_DISABLE); 354 mutex_unlock(&port->serial->disc_mutex); 355} 356 357/* 358 * cp2101_get_termios 359 * Reads the baud rate, data bits, parity, stop bits and flow control mode 360 * from the device, corrects any unsupported values, and configures the 361 * termios structure to reflect the state of the device 362 */ 363static void cp2101_get_termios (struct usb_serial_port *port) 364{ 365 unsigned int cflag, modem_ctl[4]; 366 int baud; 367 int bits; 368 369 dbg("%s - port %d", __FUNCTION__, port->number); 370 371 if (!port->tty || !port->tty->termios) { 372 dbg("%s - no tty structures", __FUNCTION__); 373 return; 374 } 375 376 cp2101_get_config(port, CP2101_BAUDRATE, &baud, 2); 377 /* Convert to baudrate */ 378 if (baud) 379 baud = BAUD_RATE_GEN_FREQ / baud; 380 381 dbg("%s - baud rate = %d", __FUNCTION__, baud); 382 383 tty_encode_baud_rate(port->tty, baud, baud); 384 cflag = port->tty->termios->c_cflag; 385 386 cp2101_get_config(port, CP2101_BITS, &bits, 2); 387 cflag &= ~CSIZE; 388 switch(bits & BITS_DATA_MASK) { 389 case BITS_DATA_5: 390 dbg("%s - data bits = 5", __FUNCTION__); 391 cflag |= CS5; 392 break; 393 case BITS_DATA_6: 394 dbg("%s - data bits = 6", __FUNCTION__); 395 cflag |= CS6; 396 break; 397 case BITS_DATA_7: 398 dbg("%s - data bits = 7", __FUNCTION__); 399 cflag |= CS7; 400 break; 401 case BITS_DATA_8: 402 dbg("%s - data bits = 8", __FUNCTION__); 403 cflag |= CS8; 404 break; 405 case BITS_DATA_9: 406 dbg("%s - data bits = 9 (not supported, " 407 "using 8 data bits)", __FUNCTION__); 408 cflag |= CS8; 409 bits &= ~BITS_DATA_MASK; 410 bits |= BITS_DATA_8; 411 cp2101_set_config(port, CP2101_BITS, &bits, 2); 412 break; 413 default: 414 dbg("%s - Unknown number of data bits, " 415 "using 8", __FUNCTION__); 416 cflag |= CS8; 417 bits &= ~BITS_DATA_MASK; 418 bits |= BITS_DATA_8; 419 cp2101_set_config(port, CP2101_BITS, &bits, 2); 420 break; 421 } 422 423 switch(bits & BITS_PARITY_MASK) { 424 case BITS_PARITY_NONE: 425 dbg("%s - parity = NONE", __FUNCTION__); 426 cflag &= ~PARENB; 427 break; 428 case BITS_PARITY_ODD: 429 dbg("%s - parity = ODD", __FUNCTION__); 430 cflag |= (PARENB|PARODD); 431 break; 432 case BITS_PARITY_EVEN: 433 dbg("%s - parity = EVEN", __FUNCTION__); 434 cflag &= ~PARODD; 435 cflag |= PARENB; 436 break; 437 case BITS_PARITY_MARK: 438 dbg("%s - parity = MARK (not supported, " 439 "disabling parity)", __FUNCTION__); 440 cflag &= ~PARENB; 441 bits &= ~BITS_PARITY_MASK; 442 cp2101_set_config(port, CP2101_BITS, &bits, 2); 443 break; 444 case BITS_PARITY_SPACE: 445 dbg("%s - parity = SPACE (not supported, " 446 "disabling parity)", __FUNCTION__); 447 cflag &= ~PARENB; 448 bits &= ~BITS_PARITY_MASK; 449 cp2101_set_config(port, CP2101_BITS, &bits, 2); 450 break; 451 default: 452 dbg("%s - Unknown parity mode, " 453 "disabling parity", __FUNCTION__); 454 cflag &= ~PARENB; 455 bits &= ~BITS_PARITY_MASK; 456 cp2101_set_config(port, CP2101_BITS, &bits, 2); 457 break; 458 } 459 460 cflag &= ~CSTOPB; 461 switch(bits & BITS_STOP_MASK) { 462 case BITS_STOP_1: 463 dbg("%s - stop bits = 1", __FUNCTION__); 464 break; 465 case BITS_STOP_1_5: 466 dbg("%s - stop bits = 1.5 (not supported, " 467 "using 1 stop bit)", __FUNCTION__); 468 bits &= ~BITS_STOP_MASK; 469 cp2101_set_config(port, CP2101_BITS, &bits, 2); 470 break; 471 case BITS_STOP_2: 472 dbg("%s - stop bits = 2", __FUNCTION__); 473 cflag |= CSTOPB; 474 break; 475 default: 476 dbg("%s - Unknown number of stop bits, " 477 "using 1 stop bit", __FUNCTION__); 478 bits &= ~BITS_STOP_MASK; 479 cp2101_set_config(port, CP2101_BITS, &bits, 2); 480 break; 481 } 482 483 cp2101_get_config(port, CP2101_MODEMCTL, modem_ctl, 16); 484 if (modem_ctl[0] & 0x0008) { 485 dbg("%s - flow control = CRTSCTS", __FUNCTION__); 486 cflag |= CRTSCTS; 487 } else { 488 dbg("%s - flow control = NONE", __FUNCTION__); 489 cflag &= ~CRTSCTS; 490 } 491 492 port->tty->termios->c_cflag = cflag; 493} 494 495static void cp2101_set_termios (struct usb_serial_port *port, 496 struct ktermios *old_termios) 497{ 498 unsigned int cflag, old_cflag; 499 int baud=0, bits; 500 unsigned int modem_ctl[4]; 501 502 dbg("%s - port %d", __FUNCTION__, port->number); 503 504 if (!port->tty || !port->tty->termios) { 505 dbg("%s - no tty structures", __FUNCTION__); 506 return; 507 } 508 port->tty->termios->c_cflag &= ~CMSPAR; 509 510 cflag = port->tty->termios->c_cflag; 511 old_cflag = old_termios->c_cflag; 512 baud = tty_get_baud_rate(port->tty); 513 514 /* If the baud rate is to be updated*/ 515 if (baud != tty_termios_baud_rate(old_termios)) { 516 switch (baud) { 517 case 0: 518 case 600: 519 case 1200: 520 case 1800: 521 case 2400: 522 case 4800: 523 case 7200: 524 case 9600: 525 case 14400: 526 case 19200: 527 case 28800: 528 case 38400: 529 case 55854: 530 case 57600: 531 case 115200: 532 case 127117: 533 case 230400: 534 case 460800: 535 case 921600: 536 case 3686400: 537 break; 538 default: 539 baud = 9600; 540 break; 541 } 542 543 if (baud) { 544 dbg("%s - Setting baud rate to %d baud", __FUNCTION__, 545 baud); 546 if (cp2101_set_config_single(port, CP2101_BAUDRATE, 547 (BAUD_RATE_GEN_FREQ / baud))) { 548 dev_err(&port->dev, "Baud rate requested not " 549 "supported by device\n"); 550 baud = tty_termios_baud_rate(old_termios); 551 } 552 } 553 } 554 /* Report back the resulting baud rate */ 555 tty_encode_baud_rate(port->tty, baud, baud); 556 557 /* If the number of data bits is to be updated */ 558 if ((cflag & CSIZE) != (old_cflag & CSIZE)) { 559 cp2101_get_config(port, CP2101_BITS, &bits, 2); 560 bits &= ~BITS_DATA_MASK; 561 switch (cflag & CSIZE) { 562 case CS5: 563 bits |= BITS_DATA_5; 564 dbg("%s - data bits = 5", __FUNCTION__); 565 break; 566 case CS6: 567 bits |= BITS_DATA_6; 568 dbg("%s - data bits = 6", __FUNCTION__); 569 break; 570 case CS7: 571 bits |= BITS_DATA_7; 572 dbg("%s - data bits = 7", __FUNCTION__); 573 break; 574 case CS8: 575 bits |= BITS_DATA_8; 576 dbg("%s - data bits = 8", __FUNCTION__); 577 break; 578 /*case CS9: 579 bits |= BITS_DATA_9; 580 dbg("%s - data bits = 9", __FUNCTION__); 581 break;*/ 582 default: 583 dev_err(&port->dev, "cp2101 driver does not " 584 "support the number of bits requested," 585 " using 8 bit mode\n"); 586 bits |= BITS_DATA_8; 587 break; 588 } 589 if (cp2101_set_config(port, CP2101_BITS, &bits, 2)) 590 dev_err(&port->dev, "Number of data bits requested " 591 "not supported by device\n"); 592 } 593 594 if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD))) { 595 cp2101_get_config(port, CP2101_BITS, &bits, 2); 596 bits &= ~BITS_PARITY_MASK; 597 if (cflag & PARENB) { 598 if (cflag & PARODD) { 599 bits |= BITS_PARITY_ODD; 600 dbg("%s - parity = ODD", __FUNCTION__); 601 } else { 602 bits |= BITS_PARITY_EVEN; 603 dbg("%s - parity = EVEN", __FUNCTION__); 604 } 605 } 606 if (cp2101_set_config(port, CP2101_BITS, &bits, 2)) 607 dev_err(&port->dev, "Parity mode not supported " 608 "by device\n"); 609 } 610 611 if ((cflag & CSTOPB) != (old_cflag & CSTOPB)) { 612 cp2101_get_config(port, CP2101_BITS, &bits, 2); 613 bits &= ~BITS_STOP_MASK; 614 if (cflag & CSTOPB) { 615 bits |= BITS_STOP_2; 616 dbg("%s - stop bits = 2", __FUNCTION__); 617 } else { 618 bits |= BITS_STOP_1; 619 dbg("%s - stop bits = 1", __FUNCTION__); 620 } 621 if (cp2101_set_config(port, CP2101_BITS, &bits, 2)) 622 dev_err(&port->dev, "Number of stop bits requested " 623 "not supported by device\n"); 624 } 625 626 if ((cflag & CRTSCTS) != (old_cflag & CRTSCTS)) { 627 cp2101_get_config(port, CP2101_MODEMCTL, modem_ctl, 16); 628 dbg("%s - read modem controls = 0x%.4x 0x%.4x 0x%.4x 0x%.4x", 629 __FUNCTION__, modem_ctl[0], modem_ctl[1], 630 modem_ctl[2], modem_ctl[3]); 631 632 if (cflag & CRTSCTS) { 633 modem_ctl[0] &= ~0x7B; 634 modem_ctl[0] |= 0x09; 635 modem_ctl[1] = 0x80; 636 dbg("%s - flow control = CRTSCTS", __FUNCTION__); 637 } else { 638 modem_ctl[0] &= ~0x7B; 639 modem_ctl[0] |= 0x01; 640 modem_ctl[1] |= 0x40; 641 dbg("%s - flow control = NONE", __FUNCTION__); 642 } 643 644 dbg("%s - write modem controls = 0x%.4x 0x%.4x 0x%.4x 0x%.4x", 645 __FUNCTION__, modem_ctl[0], modem_ctl[1], 646 modem_ctl[2], modem_ctl[3]); 647 cp2101_set_config(port, CP2101_MODEMCTL, modem_ctl, 16); 648 } 649 650} 651 652static int cp2101_tiocmset (struct usb_serial_port *port, struct file *file, 653 unsigned int set, unsigned int clear) 654{ 655 int control = 0; 656 657 dbg("%s - port %d", __FUNCTION__, port->number); 658 659 if (set & TIOCM_RTS) { 660 control |= CONTROL_RTS; 661 control |= CONTROL_WRITE_RTS; 662 } 663 if (set & TIOCM_DTR) { 664 control |= CONTROL_DTR; 665 control |= CONTROL_WRITE_DTR; 666 } 667 if (clear & TIOCM_RTS) { 668 control &= ~CONTROL_RTS; 669 control |= CONTROL_WRITE_RTS; 670 } 671 if (clear & TIOCM_DTR) { 672 control &= ~CONTROL_DTR; 673 control |= CONTROL_WRITE_DTR; 674 } 675 676 dbg("%s - control = 0x%.4x", __FUNCTION__, control); 677 678 return cp2101_set_config(port, CP2101_CONTROL, &control, 2); 679 680} 681 682static int cp2101_tiocmget (struct usb_serial_port *port, struct file *file) 683{ 684 int control, result; 685 686 dbg("%s - port %d", __FUNCTION__, port->number); 687 688 cp2101_get_config(port, CP2101_CONTROL, &control, 1); 689 690 result = ((control & CONTROL_DTR) ? TIOCM_DTR : 0) 691 |((control & CONTROL_RTS) ? TIOCM_RTS : 0) 692 |((control & CONTROL_CTS) ? TIOCM_CTS : 0) 693 |((control & CONTROL_DSR) ? TIOCM_DSR : 0) 694 |((control & CONTROL_RING)? TIOCM_RI : 0) 695 |((control & CONTROL_DCD) ? TIOCM_CD : 0); 696 697 dbg("%s - control = 0x%.2x", __FUNCTION__, control); 698 699 return result; 700} 701 702static void cp2101_break_ctl (struct usb_serial_port *port, int break_state) 703{ 704 int state; 705 706 dbg("%s - port %d", __FUNCTION__, port->number); 707 if (break_state == 0) 708 state = BREAK_OFF; 709 else 710 state = BREAK_ON; 711 dbg("%s - turning break %s", __FUNCTION__, 712 state==BREAK_OFF ? "off" : "on"); 713 cp2101_set_config(port, CP2101_BREAK, &state, 2); 714} 715 716static int cp2101_startup (struct usb_serial *serial) 717{ 718 /* CP2101 buffers behave strangely unless device is reset */ 719 usb_reset_device(serial->dev); 720 return 0; 721} 722 723static void cp2101_shutdown (struct usb_serial *serial) 724{ 725 int i; 726 727 dbg("%s", __FUNCTION__); 728 729 /* Stop reads and writes on all ports */ 730 for (i=0; i < serial->num_ports; ++i) { 731 cp2101_cleanup(serial->port[i]); 732 } 733} 734 735static int __init cp2101_init (void) 736{ 737 int retval; 738 739 retval = usb_serial_register(&cp2101_device); 740 if (retval) 741 return retval; /* Failed to register */ 742 743 retval = usb_register(&cp2101_driver); 744 if (retval) { 745 /* Failed to register */ 746 usb_serial_deregister(&cp2101_device); 747 return retval; 748 } 749 750 /* Success */ 751 info(DRIVER_DESC " " DRIVER_VERSION); 752 return 0; 753} 754 755static void __exit cp2101_exit (void) 756{ 757 usb_deregister (&cp2101_driver); 758 usb_serial_deregister (&cp2101_device); 759} 760 761module_init(cp2101_init); 762module_exit(cp2101_exit); 763 764MODULE_DESCRIPTION(DRIVER_DESC); 765MODULE_VERSION(DRIVER_VERSION); 766MODULE_LICENSE("GPL"); 767 768module_param(debug, bool, S_IRUGO | S_IWUSR); 769MODULE_PARM_DESC(debug, "Enable verbose debugging messages");