diff options
| author | Alan Cox <alan@linux.intel.com> | 2009-11-05 08:28:06 -0500 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-12-11 18:18:05 -0500 |
| commit | b5849b1a82853171ce8a35220204f17ec282a9a8 (patch) | |
| tree | 42276bb4b2c2fe5cf7ba241e9ed85acc5b4ea48e | |
| parent | e707c35cbbe83a016cf0122a29e3a47b5a9e35c4 (diff) | |
sdio_uart: use tty_port
Add a tty_port object to the sdio uart. For the moment just begin using the
tty field of the port, as this is the critical one to clean up.
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
| -rw-r--r-- | drivers/mmc/card/sdio_uart.c | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/drivers/mmc/card/sdio_uart.c b/drivers/mmc/card/sdio_uart.c index b8e7c5ae981e..c2759dbfdfd2 100644 --- a/drivers/mmc/card/sdio_uart.c +++ b/drivers/mmc/card/sdio_uart.c | |||
| @@ -73,6 +73,7 @@ struct uart_icount { | |||
| 73 | }; | 73 | }; |
| 74 | 74 | ||
| 75 | struct sdio_uart_port { | 75 | struct sdio_uart_port { |
| 76 | struct tty_port port; | ||
| 76 | struct kref kref; | 77 | struct kref kref; |
| 77 | struct tty_struct *tty; | 78 | struct tty_struct *tty; |
| 78 | unsigned int index; | 79 | unsigned int index; |
| @@ -172,7 +173,7 @@ static void sdio_uart_port_remove(struct sdio_uart_port *port) | |||
| 172 | port->func = NULL; | 173 | port->func = NULL; |
| 173 | mutex_unlock(&port->func_lock); | 174 | mutex_unlock(&port->func_lock); |
| 174 | if (port->opened) | 175 | if (port->opened) |
| 175 | tty_hangup(port->tty); | 176 | tty_hangup(port->port.tty); |
| 176 | mutex_unlock(&port->open_lock); | 177 | mutex_unlock(&port->open_lock); |
| 177 | sdio_release_irq(func); | 178 | sdio_release_irq(func); |
| 178 | sdio_disable_func(func); | 179 | sdio_disable_func(func); |
| @@ -391,7 +392,7 @@ static void sdio_uart_stop_rx(struct sdio_uart_port *port) | |||
| 391 | static void sdio_uart_receive_chars(struct sdio_uart_port *port, | 392 | static void sdio_uart_receive_chars(struct sdio_uart_port *port, |
| 392 | unsigned int *status) | 393 | unsigned int *status) |
| 393 | { | 394 | { |
| 394 | struct tty_struct *tty = port->tty; | 395 | struct tty_struct *tty = port->port.tty; |
| 395 | unsigned int ch, flag; | 396 | unsigned int ch, flag; |
| 396 | int max_count = 256; | 397 | int max_count = 256; |
| 397 | 398 | ||
| @@ -446,6 +447,7 @@ static void sdio_uart_transmit_chars(struct sdio_uart_port *port) | |||
| 446 | { | 447 | { |
| 447 | struct circ_buf *xmit = &port->xmit; | 448 | struct circ_buf *xmit = &port->xmit; |
| 448 | int count; | 449 | int count; |
| 450 | struct tty_struct *tty = port->port.tty; | ||
| 449 | 451 | ||
| 450 | if (port->x_char) { | 452 | if (port->x_char) { |
| 451 | sdio_out(port, UART_TX, port->x_char); | 453 | sdio_out(port, UART_TX, port->x_char); |
| @@ -453,7 +455,7 @@ static void sdio_uart_transmit_chars(struct sdio_uart_port *port) | |||
| 453 | port->x_char = 0; | 455 | port->x_char = 0; |
| 454 | return; | 456 | return; |
| 455 | } | 457 | } |
| 456 | if (circ_empty(xmit) || port->tty->stopped || port->tty->hw_stopped) { | 458 | if (circ_empty(xmit) || tty->stopped || tty->hw_stopped) { |
| 457 | sdio_uart_stop_tx(port); | 459 | sdio_uart_stop_tx(port); |
| 458 | return; | 460 | return; |
| 459 | } | 461 | } |
| @@ -468,7 +470,7 @@ static void sdio_uart_transmit_chars(struct sdio_uart_port *port) | |||
| 468 | } while (--count > 0); | 470 | } while (--count > 0); |
| 469 | 471 | ||
| 470 | if (circ_chars_pending(xmit) < WAKEUP_CHARS) | 472 | if (circ_chars_pending(xmit) < WAKEUP_CHARS) |
| 471 | tty_wakeup(port->tty); | 473 | tty_wakeup(tty); |
| 472 | 474 | ||
| 473 | if (circ_empty(xmit)) | 475 | if (circ_empty(xmit)) |
| 474 | sdio_uart_stop_tx(port); | 476 | sdio_uart_stop_tx(port); |
| @@ -477,6 +479,7 @@ static void sdio_uart_transmit_chars(struct sdio_uart_port *port) | |||
| 477 | static void sdio_uart_check_modem_status(struct sdio_uart_port *port) | 479 | static void sdio_uart_check_modem_status(struct sdio_uart_port *port) |
| 478 | { | 480 | { |
| 479 | int status; | 481 | int status; |
| 482 | struct tty_struct *tty = port->port.tty; | ||
| 480 | 483 | ||
| 481 | status = sdio_in(port, UART_MSR); | 484 | status = sdio_in(port, UART_MSR); |
| 482 | 485 | ||
| @@ -491,17 +494,17 @@ static void sdio_uart_check_modem_status(struct sdio_uart_port *port) | |||
| 491 | port->icount.dcd++; | 494 | port->icount.dcd++; |
| 492 | if (status & UART_MSR_DCTS) { | 495 | if (status & UART_MSR_DCTS) { |
| 493 | port->icount.cts++; | 496 | port->icount.cts++; |
| 494 | if (port->tty->termios->c_cflag & CRTSCTS) { | 497 | if (tty->termios->c_cflag & CRTSCTS) { |
| 495 | int cts = (status & UART_MSR_CTS); | 498 | int cts = (status & UART_MSR_CTS); |
| 496 | if (port->tty->hw_stopped) { | 499 | if (tty->hw_stopped) { |
| 497 | if (cts) { | 500 | if (cts) { |
| 498 | port->tty->hw_stopped = 0; | 501 | tty->hw_stopped = 0; |
| 499 | sdio_uart_start_tx(port); | 502 | sdio_uart_start_tx(port); |
| 500 | tty_wakeup(port->tty); | 503 | tty_wakeup(tty); |
| 501 | } | 504 | } |
| 502 | } else { | 505 | } else { |
| 503 | if (!cts) { | 506 | if (!cts) { |
| 504 | port->tty->hw_stopped = 1; | 507 | tty->hw_stopped = 1; |
| 505 | sdio_uart_stop_tx(port); | 508 | sdio_uart_stop_tx(port); |
| 506 | } | 509 | } |
| 507 | } | 510 | } |
| @@ -546,12 +549,13 @@ static int sdio_uart_startup(struct sdio_uart_port *port) | |||
| 546 | { | 549 | { |
| 547 | unsigned long page; | 550 | unsigned long page; |
| 548 | int ret; | 551 | int ret; |
| 552 | struct tty_struct *tty = port->port.tty; | ||
| 549 | 553 | ||
| 550 | /* | 554 | /* |
| 551 | * Set the TTY IO error marker - we will only clear this | 555 | * Set the TTY IO error marker - we will only clear this |
| 552 | * once we have successfully opened the port. | 556 | * once we have successfully opened the port. |
| 553 | */ | 557 | */ |
| 554 | set_bit(TTY_IO_ERROR, &port->tty->flags); | 558 | set_bit(TTY_IO_ERROR, &tty->flags); |
| 555 | 559 | ||
| 556 | /* Initialise and allocate the transmit buffer. */ | 560 | /* Initialise and allocate the transmit buffer. */ |
| 557 | page = __get_free_page(GFP_KERNEL); | 561 | page = __get_free_page(GFP_KERNEL); |
| @@ -595,14 +599,14 @@ static int sdio_uart_startup(struct sdio_uart_port *port) | |||
| 595 | port->ier = UART_IER_RLSI | UART_IER_RDI | UART_IER_RTOIE | UART_IER_UUE; | 599 | port->ier = UART_IER_RLSI | UART_IER_RDI | UART_IER_RTOIE | UART_IER_UUE; |
| 596 | port->mctrl = TIOCM_OUT2; | 600 | port->mctrl = TIOCM_OUT2; |
| 597 | 601 | ||
| 598 | sdio_uart_change_speed(port, port->tty->termios, NULL); | 602 | sdio_uart_change_speed(port, tty->termios, NULL); |
| 599 | 603 | ||
| 600 | if (port->tty->termios->c_cflag & CBAUD) | 604 | if (tty->termios->c_cflag & CBAUD) |
| 601 | sdio_uart_set_mctrl(port, TIOCM_RTS | TIOCM_DTR); | 605 | sdio_uart_set_mctrl(port, TIOCM_RTS | TIOCM_DTR); |
| 602 | 606 | ||
| 603 | if (port->tty->termios->c_cflag & CRTSCTS) | 607 | if (tty->termios->c_cflag & CRTSCTS) |
| 604 | if (!(sdio_uart_get_mctrl(port) & TIOCM_CTS)) | 608 | if (!(sdio_uart_get_mctrl(port) & TIOCM_CTS)) |
| 605 | port->tty->hw_stopped = 1; | 609 | tty->hw_stopped = 1; |
| 606 | 610 | ||
| 607 | clear_bit(TTY_IO_ERROR, &port->tty->flags); | 611 | clear_bit(TTY_IO_ERROR, &port->tty->flags); |
| 608 | 612 | ||
| @@ -634,7 +638,7 @@ static void sdio_uart_shutdown(struct sdio_uart_port *port) | |||
| 634 | /* TODO: wait here for TX FIFO to drain */ | 638 | /* TODO: wait here for TX FIFO to drain */ |
| 635 | 639 | ||
| 636 | /* Turn off DTR and RTS early. */ | 640 | /* Turn off DTR and RTS early. */ |
| 637 | if (port->tty->termios->c_cflag & HUPCL) | 641 | if (port->port.tty->termios->c_cflag & HUPCL) |
| 638 | sdio_uart_clear_mctrl(port, TIOCM_DTR | TIOCM_RTS); | 642 | sdio_uart_clear_mctrl(port, TIOCM_DTR | TIOCM_RTS); |
| 639 | 643 | ||
| 640 | /* Disable interrupts from this port */ | 644 | /* Disable interrupts from this port */ |
| @@ -684,11 +688,11 @@ static int sdio_uart_open(struct tty_struct *tty, struct file *filp) | |||
| 684 | 688 | ||
| 685 | if (!port->opened) { | 689 | if (!port->opened) { |
| 686 | tty->driver_data = port; | 690 | tty->driver_data = port; |
| 687 | port->tty = tty; | 691 | port->port.tty = tty; |
| 688 | ret = sdio_uart_startup(port); | 692 | ret = sdio_uart_startup(port); |
| 689 | if (ret) { | 693 | if (ret) { |
| 690 | tty->driver_data = NULL; | 694 | tty->driver_data = NULL; |
| 691 | port->tty = NULL; | 695 | port->port.tty = NULL; |
| 692 | mutex_unlock(&port->open_lock); | 696 | mutex_unlock(&port->open_lock); |
| 693 | sdio_uart_port_put(port); | 697 | sdio_uart_port_put(port); |
| 694 | return ret; | 698 | return ret; |
| @@ -723,7 +727,7 @@ static void sdio_uart_close(struct tty_struct *tty, struct file * filp) | |||
| 723 | tty->closing = 1; | 727 | tty->closing = 1; |
| 724 | sdio_uart_shutdown(port); | 728 | sdio_uart_shutdown(port); |
| 725 | tty_ldisc_flush(tty); | 729 | tty_ldisc_flush(tty); |
| 726 | port->tty = NULL; | 730 | port->port.tty = NULL; |
| 727 | tty->driver_data = NULL; | 731 | tty->driver_data = NULL; |
| 728 | tty->closing = 0; | 732 | tty->closing = 0; |
| 729 | } | 733 | } |
| @@ -1068,6 +1072,7 @@ static int sdio_uart_probe(struct sdio_func *func, | |||
| 1068 | 1072 | ||
| 1069 | port->func = func; | 1073 | port->func = func; |
| 1070 | sdio_set_drvdata(func, port); | 1074 | sdio_set_drvdata(func, port); |
| 1075 | tty_port_init(&port->port); | ||
| 1071 | 1076 | ||
| 1072 | ret = sdio_uart_add_port(port); | 1077 | ret = sdio_uart_add_port(port); |
| 1073 | if (ret) { | 1078 | if (ret) { |
