diff options
Diffstat (limited to 'drivers/usb/serial/cp2101.c')
-rw-r--r-- | drivers/usb/serial/cp2101.c | 315 |
1 files changed, 156 insertions, 159 deletions
diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c index 46c33fc9f6ce..442cba69cce5 100644 --- a/drivers/usb/serial/cp2101.c +++ b/drivers/usb/serial/cp2101.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/moduleparam.h> | 26 | #include <linux/moduleparam.h> |
27 | #include <linux/usb.h> | 27 | #include <linux/usb.h> |
28 | #include <asm/uaccess.h> | 28 | #include <linux/uaccess.h> |
29 | #include <linux/usb/serial.h> | 29 | #include <linux/usb/serial.h> |
30 | 30 | ||
31 | /* | 31 | /* |
@@ -45,12 +45,12 @@ static void cp2101_close(struct tty_struct *, struct usb_serial_port *, | |||
45 | static void cp2101_get_termios(struct tty_struct *); | 45 | static void cp2101_get_termios(struct tty_struct *); |
46 | static void cp2101_set_termios(struct tty_struct *, struct usb_serial_port *, | 46 | static void cp2101_set_termios(struct tty_struct *, struct usb_serial_port *, |
47 | struct ktermios*); | 47 | struct ktermios*); |
48 | static int cp2101_tiocmget (struct tty_struct *, struct file *); | 48 | static int cp2101_tiocmget(struct tty_struct *, struct file *); |
49 | static int cp2101_tiocmset (struct tty_struct *, struct file *, | 49 | static int cp2101_tiocmset(struct tty_struct *, struct file *, |
50 | unsigned int, unsigned int); | 50 | unsigned int, unsigned int); |
51 | static void cp2101_break_ctl(struct tty_struct *, int); | 51 | static void cp2101_break_ctl(struct tty_struct *, int); |
52 | static int cp2101_startup (struct usb_serial *); | 52 | static int cp2101_startup(struct usb_serial *); |
53 | static void cp2101_shutdown(struct usb_serial*); | 53 | static void cp2101_shutdown(struct usb_serial *); |
54 | 54 | ||
55 | 55 | ||
56 | static int debug; | 56 | static int debug; |
@@ -96,7 +96,7 @@ static struct usb_device_id id_table [] = { | |||
96 | { } /* Terminating Entry */ | 96 | { } /* Terminating Entry */ |
97 | }; | 97 | }; |
98 | 98 | ||
99 | MODULE_DEVICE_TABLE (usb, id_table); | 99 | MODULE_DEVICE_TABLE(usb, id_table); |
100 | 100 | ||
101 | static struct usb_driver cp2101_driver = { | 101 | static struct usb_driver cp2101_driver = { |
102 | .name = "cp2101", | 102 | .name = "cp2101", |
@@ -205,12 +205,12 @@ static int cp2101_get_config(struct usb_serial_port *port, u8 request, | |||
205 | request++; | 205 | request++; |
206 | 206 | ||
207 | /* Issue the request, attempting to read 'size' bytes */ | 207 | /* Issue the request, attempting to read 'size' bytes */ |
208 | result = usb_control_msg (serial->dev,usb_rcvctrlpipe (serial->dev, 0), | 208 | result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), |
209 | request, REQTYPE_DEVICE_TO_HOST, 0x0000, | 209 | request, REQTYPE_DEVICE_TO_HOST, 0x0000, |
210 | 0, buf, size, 300); | 210 | 0, buf, size, 300); |
211 | 211 | ||
212 | /* Convert data into an array of integers */ | 212 | /* Convert data into an array of integers */ |
213 | for (i=0; i<length; i++) | 213 | for (i = 0; i < length; i++) |
214 | data[i] = le32_to_cpu(buf[i]); | 214 | data[i] = le32_to_cpu(buf[i]); |
215 | 215 | ||
216 | kfree(buf); | 216 | kfree(buf); |
@@ -253,12 +253,12 @@ static int cp2101_set_config(struct usb_serial_port *port, u8 request, | |||
253 | buf[i] = cpu_to_le32(data[i]); | 253 | buf[i] = cpu_to_le32(data[i]); |
254 | 254 | ||
255 | if (size > 2) { | 255 | if (size > 2) { |
256 | result = usb_control_msg (serial->dev, | 256 | result = usb_control_msg(serial->dev, |
257 | usb_sndctrlpipe(serial->dev, 0), | 257 | usb_sndctrlpipe(serial->dev, 0), |
258 | request, REQTYPE_HOST_TO_DEVICE, 0x0000, | 258 | request, REQTYPE_HOST_TO_DEVICE, 0x0000, |
259 | 0, buf, size, 300); | 259 | 0, buf, size, 300); |
260 | } else { | 260 | } else { |
261 | result = usb_control_msg (serial->dev, | 261 | result = usb_control_msg(serial->dev, |
262 | usb_sndctrlpipe(serial->dev, 0), | 262 | usb_sndctrlpipe(serial->dev, 0), |
263 | request, REQTYPE_HOST_TO_DEVICE, data[0], | 263 | request, REQTYPE_HOST_TO_DEVICE, data[0], |
264 | 0, NULL, 0, 300); | 264 | 0, NULL, 0, 300); |
@@ -274,7 +274,7 @@ static int cp2101_set_config(struct usb_serial_port *port, u8 request, | |||
274 | } | 274 | } |
275 | 275 | ||
276 | /* Single data value */ | 276 | /* Single data value */ |
277 | result = usb_control_msg (serial->dev, | 277 | result = usb_control_msg(serial->dev, |
278 | usb_sndctrlpipe(serial->dev, 0), | 278 | usb_sndctrlpipe(serial->dev, 0), |
279 | request, REQTYPE_HOST_TO_DEVICE, data[0], | 279 | request, REQTYPE_HOST_TO_DEVICE, data[0], |
280 | 0, NULL, 0, 300); | 280 | 0, NULL, 0, 300); |
@@ -292,7 +292,7 @@ static inline int cp2101_set_config_single(struct usb_serial_port *port, | |||
292 | return cp2101_set_config(port, request, &data, 2); | 292 | return cp2101_set_config(port, request, &data, 2); |
293 | } | 293 | } |
294 | 294 | ||
295 | static int cp2101_open (struct tty_struct *tty, struct usb_serial_port *port, | 295 | static int cp2101_open(struct tty_struct *tty, struct usb_serial_port *port, |
296 | struct file *filp) | 296 | struct file *filp) |
297 | { | 297 | { |
298 | struct usb_serial *serial = port->serial; | 298 | struct usb_serial *serial = port->serial; |
@@ -307,7 +307,7 @@ static int cp2101_open (struct tty_struct *tty, struct usb_serial_port *port, | |||
307 | } | 307 | } |
308 | 308 | ||
309 | /* Start reading from the device */ | 309 | /* Start reading from the device */ |
310 | usb_fill_bulk_urb (port->read_urb, serial->dev, | 310 | usb_fill_bulk_urb(port->read_urb, serial->dev, |
311 | usb_rcvbulkpipe(serial->dev, | 311 | usb_rcvbulkpipe(serial->dev, |
312 | port->bulk_in_endpointAddress), | 312 | port->bulk_in_endpointAddress), |
313 | port->read_urb->transfer_buffer, | 313 | port->read_urb->transfer_buffer, |
@@ -330,7 +330,7 @@ static int cp2101_open (struct tty_struct *tty, struct usb_serial_port *port, | |||
330 | return 0; | 330 | return 0; |
331 | } | 331 | } |
332 | 332 | ||
333 | static void cp2101_cleanup (struct usb_serial_port *port) | 333 | static void cp2101_cleanup(struct usb_serial_port *port) |
334 | { | 334 | { |
335 | struct usb_serial *serial = port->serial; | 335 | struct usb_serial *serial = port->serial; |
336 | 336 | ||
@@ -346,7 +346,7 @@ static void cp2101_cleanup (struct usb_serial_port *port) | |||
346 | } | 346 | } |
347 | 347 | ||
348 | static void cp2101_close(struct tty_struct *tty, struct usb_serial_port *port, | 348 | static void cp2101_close(struct tty_struct *tty, struct usb_serial_port *port, |
349 | struct file * filp) | 349 | struct file *filp) |
350 | { | 350 | { |
351 | dbg("%s - port %d", __func__, port->number); | 351 | dbg("%s - port %d", __func__, port->number); |
352 | 352 | ||
@@ -388,99 +388,97 @@ static void cp2101_get_termios (struct tty_struct *tty) | |||
388 | 388 | ||
389 | cp2101_get_config(port, CP2101_BITS, &bits, 2); | 389 | cp2101_get_config(port, CP2101_BITS, &bits, 2); |
390 | cflag &= ~CSIZE; | 390 | cflag &= ~CSIZE; |
391 | switch(bits & BITS_DATA_MASK) { | 391 | switch (bits & BITS_DATA_MASK) { |
392 | case BITS_DATA_5: | 392 | case BITS_DATA_5: |
393 | dbg("%s - data bits = 5", __func__); | 393 | dbg("%s - data bits = 5", __func__); |
394 | cflag |= CS5; | 394 | cflag |= CS5; |
395 | break; | 395 | break; |
396 | case BITS_DATA_6: | 396 | case BITS_DATA_6: |
397 | dbg("%s - data bits = 6", __func__); | 397 | dbg("%s - data bits = 6", __func__); |
398 | cflag |= CS6; | 398 | cflag |= CS6; |
399 | break; | 399 | break; |
400 | case BITS_DATA_7: | 400 | case BITS_DATA_7: |
401 | dbg("%s - data bits = 7", __func__); | 401 | dbg("%s - data bits = 7", __func__); |
402 | cflag |= CS7; | 402 | cflag |= CS7; |
403 | break; | 403 | break; |
404 | case BITS_DATA_8: | 404 | case BITS_DATA_8: |
405 | dbg("%s - data bits = 8", __func__); | 405 | dbg("%s - data bits = 8", __func__); |
406 | cflag |= CS8; | 406 | cflag |= CS8; |
407 | break; | 407 | break; |
408 | case BITS_DATA_9: | 408 | case BITS_DATA_9: |
409 | dbg("%s - data bits = 9 (not supported, " | 409 | dbg("%s - data bits = 9 (not supported, using 8 data bits)", |
410 | "using 8 data bits)", __func__); | 410 | __func__); |
411 | cflag |= CS8; | 411 | cflag |= CS8; |
412 | bits &= ~BITS_DATA_MASK; | 412 | bits &= ~BITS_DATA_MASK; |
413 | bits |= BITS_DATA_8; | 413 | bits |= BITS_DATA_8; |
414 | cp2101_set_config(port, CP2101_BITS, &bits, 2); | 414 | cp2101_set_config(port, CP2101_BITS, &bits, 2); |
415 | break; | 415 | break; |
416 | default: | 416 | default: |
417 | dbg("%s - Unknown number of data bits, " | 417 | dbg("%s - Unknown number of data bits, using 8", __func__); |
418 | "using 8", __func__); | 418 | cflag |= CS8; |
419 | cflag |= CS8; | 419 | bits &= ~BITS_DATA_MASK; |
420 | bits &= ~BITS_DATA_MASK; | 420 | bits |= BITS_DATA_8; |
421 | bits |= BITS_DATA_8; | 421 | cp2101_set_config(port, CP2101_BITS, &bits, 2); |
422 | cp2101_set_config(port, CP2101_BITS, &bits, 2); | 422 | break; |
423 | break; | ||
424 | } | 423 | } |
425 | 424 | ||
426 | switch(bits & BITS_PARITY_MASK) { | 425 | switch (bits & BITS_PARITY_MASK) { |
427 | case BITS_PARITY_NONE: | 426 | case BITS_PARITY_NONE: |
428 | dbg("%s - parity = NONE", __func__); | 427 | dbg("%s - parity = NONE", __func__); |
429 | cflag &= ~PARENB; | 428 | cflag &= ~PARENB; |
430 | break; | 429 | break; |
431 | case BITS_PARITY_ODD: | 430 | case BITS_PARITY_ODD: |
432 | dbg("%s - parity = ODD", __func__); | 431 | dbg("%s - parity = ODD", __func__); |
433 | cflag |= (PARENB|PARODD); | 432 | cflag |= (PARENB|PARODD); |
434 | break; | 433 | break; |
435 | case BITS_PARITY_EVEN: | 434 | case BITS_PARITY_EVEN: |
436 | dbg("%s - parity = EVEN", __func__); | 435 | dbg("%s - parity = EVEN", __func__); |
437 | cflag &= ~PARODD; | 436 | cflag &= ~PARODD; |
438 | cflag |= PARENB; | 437 | cflag |= PARENB; |
439 | break; | 438 | break; |
440 | case BITS_PARITY_MARK: | 439 | case BITS_PARITY_MARK: |
441 | dbg("%s - parity = MARK (not supported, " | 440 | dbg("%s - parity = MARK (not supported, disabling parity)", |
442 | "disabling parity)", __func__); | 441 | __func__); |
443 | cflag &= ~PARENB; | 442 | cflag &= ~PARENB; |
444 | bits &= ~BITS_PARITY_MASK; | 443 | bits &= ~BITS_PARITY_MASK; |
445 | cp2101_set_config(port, CP2101_BITS, &bits, 2); | 444 | cp2101_set_config(port, CP2101_BITS, &bits, 2); |
446 | break; | 445 | break; |
447 | case BITS_PARITY_SPACE: | 446 | case BITS_PARITY_SPACE: |
448 | dbg("%s - parity = SPACE (not supported, " | 447 | dbg("%s - parity = SPACE (not supported, disabling parity)", |
449 | "disabling parity)", __func__); | 448 | __func__); |
450 | cflag &= ~PARENB; | 449 | cflag &= ~PARENB; |
451 | bits &= ~BITS_PARITY_MASK; | 450 | bits &= ~BITS_PARITY_MASK; |
452 | cp2101_set_config(port, CP2101_BITS, &bits, 2); | 451 | cp2101_set_config(port, CP2101_BITS, &bits, 2); |
453 | break; | 452 | break; |
454 | default: | 453 | default: |
455 | dbg("%s - Unknown parity mode, " | 454 | dbg("%s - Unknown parity mode, disabling parity", __func__); |
456 | "disabling parity", __func__); | 455 | cflag &= ~PARENB; |
457 | cflag &= ~PARENB; | 456 | bits &= ~BITS_PARITY_MASK; |
458 | bits &= ~BITS_PARITY_MASK; | 457 | cp2101_set_config(port, CP2101_BITS, &bits, 2); |
459 | cp2101_set_config(port, CP2101_BITS, &bits, 2); | 458 | break; |
460 | break; | ||
461 | } | 459 | } |
462 | 460 | ||
463 | cflag &= ~CSTOPB; | 461 | cflag &= ~CSTOPB; |
464 | switch(bits & BITS_STOP_MASK) { | 462 | switch (bits & BITS_STOP_MASK) { |
465 | case BITS_STOP_1: | 463 | case BITS_STOP_1: |
466 | dbg("%s - stop bits = 1", __func__); | 464 | dbg("%s - stop bits = 1", __func__); |
467 | break; | 465 | break; |
468 | case BITS_STOP_1_5: | 466 | case BITS_STOP_1_5: |
469 | dbg("%s - stop bits = 1.5 (not supported, " | 467 | dbg("%s - stop bits = 1.5 (not supported, using 1 stop bit)", |
470 | "using 1 stop bit)", __func__); | 468 | __func__); |
471 | bits &= ~BITS_STOP_MASK; | 469 | bits &= ~BITS_STOP_MASK; |
472 | cp2101_set_config(port, CP2101_BITS, &bits, 2); | 470 | cp2101_set_config(port, CP2101_BITS, &bits, 2); |
473 | break; | 471 | break; |
474 | case BITS_STOP_2: | 472 | case BITS_STOP_2: |
475 | dbg("%s - stop bits = 2", __func__); | 473 | dbg("%s - stop bits = 2", __func__); |
476 | cflag |= CSTOPB; | 474 | cflag |= CSTOPB; |
477 | break; | 475 | break; |
478 | default: | 476 | default: |
479 | dbg("%s - Unknown number of stop bits, " | 477 | dbg("%s - Unknown number of stop bits, using 1 stop bit", |
480 | "using 1 stop bit", __func__); | 478 | __func__); |
481 | bits &= ~BITS_STOP_MASK; | 479 | bits &= ~BITS_STOP_MASK; |
482 | cp2101_set_config(port, CP2101_BITS, &bits, 2); | 480 | cp2101_set_config(port, CP2101_BITS, &bits, 2); |
483 | break; | 481 | break; |
484 | } | 482 | } |
485 | 483 | ||
486 | cp2101_get_config(port, CP2101_MODEMCTL, modem_ctl, 16); | 484 | cp2101_get_config(port, CP2101_MODEMCTL, modem_ctl, 16); |
@@ -495,7 +493,7 @@ static void cp2101_get_termios (struct tty_struct *tty) | |||
495 | tty->termios->c_cflag = cflag; | 493 | tty->termios->c_cflag = cflag; |
496 | } | 494 | } |
497 | 495 | ||
498 | static void cp2101_set_termios (struct tty_struct *tty, | 496 | static void cp2101_set_termios(struct tty_struct *tty, |
499 | struct usb_serial_port *port, struct ktermios *old_termios) | 497 | struct usb_serial_port *port, struct ktermios *old_termios) |
500 | { | 498 | { |
501 | unsigned int cflag, old_cflag; | 499 | unsigned int cflag, old_cflag; |
@@ -515,30 +513,30 @@ static void cp2101_set_termios (struct tty_struct *tty, | |||
515 | /* If the baud rate is to be updated*/ | 513 | /* If the baud rate is to be updated*/ |
516 | if (baud != tty_termios_baud_rate(old_termios)) { | 514 | if (baud != tty_termios_baud_rate(old_termios)) { |
517 | switch (baud) { | 515 | switch (baud) { |
518 | case 0: | 516 | case 0: |
519 | case 600: | 517 | case 600: |
520 | case 1200: | 518 | case 1200: |
521 | case 1800: | 519 | case 1800: |
522 | case 2400: | 520 | case 2400: |
523 | case 4800: | 521 | case 4800: |
524 | case 7200: | 522 | case 7200: |
525 | case 9600: | 523 | case 9600: |
526 | case 14400: | 524 | case 14400: |
527 | case 19200: | 525 | case 19200: |
528 | case 28800: | 526 | case 28800: |
529 | case 38400: | 527 | case 38400: |
530 | case 55854: | 528 | case 55854: |
531 | case 57600: | 529 | case 57600: |
532 | case 115200: | 530 | case 115200: |
533 | case 127117: | 531 | case 127117: |
534 | case 230400: | 532 | case 230400: |
535 | case 460800: | 533 | case 460800: |
536 | case 921600: | 534 | case 921600: |
537 | case 3686400: | 535 | case 3686400: |
538 | break; | 536 | break; |
539 | default: | 537 | default: |
540 | baud = 9600; | 538 | baud = 9600; |
541 | break; | 539 | break; |
542 | } | 540 | } |
543 | 541 | ||
544 | if (baud) { | 542 | if (baud) { |
@@ -560,28 +558,28 @@ static void cp2101_set_termios (struct tty_struct *tty, | |||
560 | cp2101_get_config(port, CP2101_BITS, &bits, 2); | 558 | cp2101_get_config(port, CP2101_BITS, &bits, 2); |
561 | bits &= ~BITS_DATA_MASK; | 559 | bits &= ~BITS_DATA_MASK; |
562 | switch (cflag & CSIZE) { | 560 | switch (cflag & CSIZE) { |
563 | case CS5: | 561 | case CS5: |
564 | bits |= BITS_DATA_5; | 562 | bits |= BITS_DATA_5; |
565 | dbg("%s - data bits = 5", __func__); | 563 | dbg("%s - data bits = 5", __func__); |
566 | break; | 564 | break; |
567 | case CS6: | 565 | case CS6: |
568 | bits |= BITS_DATA_6; | 566 | bits |= BITS_DATA_6; |
569 | dbg("%s - data bits = 6", __func__); | 567 | dbg("%s - data bits = 6", __func__); |
570 | break; | 568 | break; |
571 | case CS7: | 569 | case CS7: |
572 | bits |= BITS_DATA_7; | 570 | bits |= BITS_DATA_7; |
573 | dbg("%s - data bits = 7", __func__); | 571 | dbg("%s - data bits = 7", __func__); |
574 | break; | 572 | break; |
575 | case CS8: | 573 | case CS8: |
576 | bits |= BITS_DATA_8; | 574 | bits |= BITS_DATA_8; |
577 | dbg("%s - data bits = 8", __func__); | 575 | dbg("%s - data bits = 8", __func__); |
578 | break; | 576 | break; |
579 | /*case CS9: | 577 | /*case CS9: |
580 | bits |= BITS_DATA_9; | 578 | bits |= BITS_DATA_9; |
581 | dbg("%s - data bits = 9", __func__); | 579 | dbg("%s - data bits = 9", __func__); |
582 | break;*/ | 580 | break;*/ |
583 | default: | 581 | default: |
584 | dev_err(&port->dev, "cp2101 driver does not " | 582 | dev_err(&port->dev, "cp2101 driver does not " |
585 | "support the number of bits requested," | 583 | "support the number of bits requested," |
586 | " using 8 bit mode\n"); | 584 | " using 8 bit mode\n"); |
587 | bits |= BITS_DATA_8; | 585 | bits |= BITS_DATA_8; |
@@ -714,30 +712,29 @@ static void cp2101_break_ctl (struct tty_struct *tty, int break_state) | |||
714 | else | 712 | else |
715 | state = BREAK_ON; | 713 | state = BREAK_ON; |
716 | dbg("%s - turning break %s", __func__, | 714 | dbg("%s - turning break %s", __func__, |
717 | state==BREAK_OFF ? "off" : "on"); | 715 | state == BREAK_OFF ? "off" : "on"); |
718 | cp2101_set_config(port, CP2101_BREAK, &state, 2); | 716 | cp2101_set_config(port, CP2101_BREAK, &state, 2); |
719 | } | 717 | } |
720 | 718 | ||
721 | static int cp2101_startup (struct usb_serial *serial) | 719 | static int cp2101_startup(struct usb_serial *serial) |
722 | { | 720 | { |
723 | /* CP2101 buffers behave strangely unless device is reset */ | 721 | /* CP2101 buffers behave strangely unless device is reset */ |
724 | usb_reset_device(serial->dev); | 722 | usb_reset_device(serial->dev); |
725 | return 0; | 723 | return 0; |
726 | } | 724 | } |
727 | 725 | ||
728 | static void cp2101_shutdown (struct usb_serial *serial) | 726 | static void cp2101_shutdown(struct usb_serial *serial) |
729 | { | 727 | { |
730 | int i; | 728 | int i; |
731 | 729 | ||
732 | dbg("%s", __func__); | 730 | dbg("%s", __func__); |
733 | 731 | ||
734 | /* Stop reads and writes on all ports */ | 732 | /* Stop reads and writes on all ports */ |
735 | for (i=0; i < serial->num_ports; ++i) { | 733 | for (i = 0; i < serial->num_ports; ++i) |
736 | cp2101_cleanup(serial->port[i]); | 734 | cp2101_cleanup(serial->port[i]); |
737 | } | ||
738 | } | 735 | } |
739 | 736 | ||
740 | static int __init cp2101_init (void) | 737 | static int __init cp2101_init(void) |
741 | { | 738 | { |
742 | int retval; | 739 | int retval; |
743 | 740 | ||
@@ -757,10 +754,10 @@ static int __init cp2101_init (void) | |||
757 | return 0; | 754 | return 0; |
758 | } | 755 | } |
759 | 756 | ||
760 | static void __exit cp2101_exit (void) | 757 | static void __exit cp2101_exit(void) |
761 | { | 758 | { |
762 | usb_deregister (&cp2101_driver); | 759 | usb_deregister(&cp2101_driver); |
763 | usb_serial_deregister (&cp2101_device); | 760 | usb_serial_deregister(&cp2101_device); |
764 | } | 761 | } |
765 | 762 | ||
766 | module_init(cp2101_init); | 763 | module_init(cp2101_init); |