diff options
Diffstat (limited to 'drivers/serial/bfin_5xx.c')
-rw-r--r-- | drivers/serial/bfin_5xx.c | 80 |
1 files changed, 28 insertions, 52 deletions
diff --git a/drivers/serial/bfin_5xx.c b/drivers/serial/bfin_5xx.c index d6b4ead693b7..fd9bb777df28 100644 --- a/drivers/serial/bfin_5xx.c +++ b/drivers/serial/bfin_5xx.c | |||
@@ -49,6 +49,7 @@ | |||
49 | #define DMA_RX_YCOUNT (PAGE_SIZE / DMA_RX_XCOUNT) | 49 | #define DMA_RX_YCOUNT (PAGE_SIZE / DMA_RX_XCOUNT) |
50 | 50 | ||
51 | #define DMA_RX_FLUSH_JIFFIES (HZ / 50) | 51 | #define DMA_RX_FLUSH_JIFFIES (HZ / 50) |
52 | #define CTS_CHECK_JIFFIES (HZ / 50) | ||
52 | 53 | ||
53 | #ifdef CONFIG_SERIAL_BFIN_DMA | 54 | #ifdef CONFIG_SERIAL_BFIN_DMA |
54 | static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart); | 55 | static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart); |
@@ -290,11 +291,6 @@ static void bfin_serial_tx_chars(struct bfin_serial_port *uart) | |||
290 | { | 291 | { |
291 | struct circ_buf *xmit = &uart->port.info->xmit; | 292 | struct circ_buf *xmit = &uart->port.info->xmit; |
292 | 293 | ||
293 | if (uart->port.x_char) { | ||
294 | UART_PUT_CHAR(uart, uart->port.x_char); | ||
295 | uart->port.icount.tx++; | ||
296 | uart->port.x_char = 0; | ||
297 | } | ||
298 | /* | 294 | /* |
299 | * Check the modem control lines before | 295 | * Check the modem control lines before |
300 | * transmitting anything. | 296 | * transmitting anything. |
@@ -306,6 +302,12 @@ static void bfin_serial_tx_chars(struct bfin_serial_port *uart) | |||
306 | return; | 302 | return; |
307 | } | 303 | } |
308 | 304 | ||
305 | if (uart->port.x_char) { | ||
306 | UART_PUT_CHAR(uart, uart->port.x_char); | ||
307 | uart->port.icount.tx++; | ||
308 | uart->port.x_char = 0; | ||
309 | } | ||
310 | |||
309 | while ((UART_GET_LSR(uart) & THRE) && xmit->tail != xmit->head) { | 311 | while ((UART_GET_LSR(uart) & THRE) && xmit->tail != xmit->head) { |
310 | UART_PUT_CHAR(uart, xmit->buf[xmit->tail]); | 312 | UART_PUT_CHAR(uart, xmit->buf[xmit->tail]); |
311 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | 313 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); |
@@ -345,15 +347,6 @@ static irqreturn_t bfin_serial_tx_int(int irq, void *dev_id) | |||
345 | } | 347 | } |
346 | #endif | 348 | #endif |
347 | 349 | ||
348 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | ||
349 | static void bfin_serial_do_work(struct work_struct *work) | ||
350 | { | ||
351 | struct bfin_serial_port *uart = container_of(work, struct bfin_serial_port, cts_workqueue); | ||
352 | |||
353 | bfin_serial_mctrl_check(uart); | ||
354 | } | ||
355 | #endif | ||
356 | |||
357 | #ifdef CONFIG_SERIAL_BFIN_DMA | 350 | #ifdef CONFIG_SERIAL_BFIN_DMA |
358 | static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart) | 351 | static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart) |
359 | { | 352 | { |
@@ -361,6 +354,12 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart) | |||
361 | 354 | ||
362 | uart->tx_done = 0; | 355 | uart->tx_done = 0; |
363 | 356 | ||
357 | /* | ||
358 | * Check the modem control lines before | ||
359 | * transmitting anything. | ||
360 | */ | ||
361 | bfin_serial_mctrl_check(uart); | ||
362 | |||
364 | if (uart_circ_empty(xmit) || uart_tx_stopped(&uart->port)) { | 363 | if (uart_circ_empty(xmit) || uart_tx_stopped(&uart->port)) { |
365 | uart->tx_count = 0; | 364 | uart->tx_count = 0; |
366 | uart->tx_done = 1; | 365 | uart->tx_done = 1; |
@@ -373,12 +372,6 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart) | |||
373 | uart->port.x_char = 0; | 372 | uart->port.x_char = 0; |
374 | } | 373 | } |
375 | 374 | ||
376 | /* | ||
377 | * Check the modem control lines before | ||
378 | * transmitting anything. | ||
379 | */ | ||
380 | bfin_serial_mctrl_check(uart); | ||
381 | |||
382 | uart->tx_count = CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE); | 375 | uart->tx_count = CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE); |
383 | if (uart->tx_count > (UART_XMIT_SIZE - xmit->tail)) | 376 | if (uart->tx_count > (UART_XMIT_SIZE - xmit->tail)) |
384 | uart->tx_count = UART_XMIT_SIZE - xmit->tail; | 377 | uart->tx_count = UART_XMIT_SIZE - xmit->tail; |
@@ -530,11 +523,7 @@ static unsigned int bfin_serial_get_mctrl(struct uart_port *port) | |||
530 | if (uart->cts_pin < 0) | 523 | if (uart->cts_pin < 0) |
531 | return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR; | 524 | return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR; |
532 | 525 | ||
533 | # ifdef BF54x | 526 | if (UART_GET_CTS(uart)) |
534 | if (UART_GET_MSR(uart) & CTS) | ||
535 | # else | ||
536 | if (gpio_get_value(uart->cts_pin)) | ||
537 | # endif | ||
538 | return TIOCM_DSR | TIOCM_CAR; | 527 | return TIOCM_DSR | TIOCM_CAR; |
539 | else | 528 | else |
540 | #endif | 529 | #endif |
@@ -549,17 +538,9 @@ static void bfin_serial_set_mctrl(struct uart_port *port, unsigned int mctrl) | |||
549 | return; | 538 | return; |
550 | 539 | ||
551 | if (mctrl & TIOCM_RTS) | 540 | if (mctrl & TIOCM_RTS) |
552 | # ifdef BF54x | 541 | UART_CLEAR_RTS(uart); |
553 | UART_PUT_MCR(uart, UART_GET_MCR(uart) & ~MRTS); | ||
554 | # else | ||
555 | gpio_set_value(uart->rts_pin, 0); | ||
556 | # endif | ||
557 | else | 542 | else |
558 | # ifdef BF54x | 543 | UART_SET_RTS(uart); |
559 | UART_PUT_MCR(uart, UART_GET_MCR(uart) | MRTS); | ||
560 | # else | ||
561 | gpio_set_value(uart->rts_pin, 1); | ||
562 | # endif | ||
563 | #endif | 544 | #endif |
564 | } | 545 | } |
565 | 546 | ||
@@ -577,7 +558,10 @@ static void bfin_serial_mctrl_check(struct bfin_serial_port *uart) | |||
577 | uart_handle_cts_change(&uart->port, status & TIOCM_CTS); | 558 | uart_handle_cts_change(&uart->port, status & TIOCM_CTS); |
578 | if (!(status & TIOCM_CTS)) { | 559 | if (!(status & TIOCM_CTS)) { |
579 | tty->hw_stopped = 1; | 560 | tty->hw_stopped = 1; |
580 | schedule_work(&uart->cts_workqueue); | 561 | uart->cts_timer.data = (unsigned long)(uart); |
562 | uart->cts_timer.function = (void *)bfin_serial_mctrl_check; | ||
563 | uart->cts_timer.expires = jiffies + CTS_CHECK_JIFFIES; | ||
564 | add_timer(&(uart->cts_timer)); | ||
581 | } else { | 565 | } else { |
582 | tty->hw_stopped = 0; | 566 | tty->hw_stopped = 0; |
583 | } | 567 | } |
@@ -752,11 +736,7 @@ bfin_serial_set_termios(struct uart_port *port, struct ktermios *termios, | |||
752 | 736 | ||
753 | /* Disable UART */ | 737 | /* Disable UART */ |
754 | ier = UART_GET_IER(uart); | 738 | ier = UART_GET_IER(uart); |
755 | #ifdef CONFIG_BF54x | 739 | UART_DISABLE_INTS(uart); |
756 | UART_CLEAR_IER(uart, 0xF); | ||
757 | #else | ||
758 | UART_PUT_IER(uart, 0); | ||
759 | #endif | ||
760 | 740 | ||
761 | /* Set DLAB in LCR to Access DLL and DLH */ | 741 | /* Set DLAB in LCR to Access DLL and DLH */ |
762 | UART_SET_DLAB(uart); | 742 | UART_SET_DLAB(uart); |
@@ -771,11 +751,7 @@ bfin_serial_set_termios(struct uart_port *port, struct ktermios *termios, | |||
771 | UART_PUT_LCR(uart, lcr); | 751 | UART_PUT_LCR(uart, lcr); |
772 | 752 | ||
773 | /* Enable UART */ | 753 | /* Enable UART */ |
774 | #ifdef CONFIG_BF54x | 754 | UART_ENABLE_INTS(uart, ier); |
775 | UART_SET_IER(uart, ier); | ||
776 | #else | ||
777 | UART_PUT_IER(uart, ier); | ||
778 | #endif | ||
779 | 755 | ||
780 | val = UART_GET_GCTL(uart); | 756 | val = UART_GET_GCTL(uart); |
781 | val |= UCEN; | 757 | val |= UCEN; |
@@ -833,15 +809,15 @@ bfin_serial_verify_port(struct uart_port *port, struct serial_struct *ser) | |||
833 | * Enable the IrDA function if tty->ldisc.num is N_IRDA. | 809 | * Enable the IrDA function if tty->ldisc.num is N_IRDA. |
834 | * In other cases, disable IrDA function. | 810 | * In other cases, disable IrDA function. |
835 | */ | 811 | */ |
836 | static void bfin_set_ldisc(struct tty_struct *tty) | 812 | static void bfin_serial_set_ldisc(struct uart_port *port) |
837 | { | 813 | { |
838 | int line = tty->index; | 814 | int line = port->line; |
839 | unsigned short val; | 815 | unsigned short val; |
840 | 816 | ||
841 | if (line >= tty->driver->num) | 817 | if (line >= port->info->tty->driver->num) |
842 | return; | 818 | return; |
843 | 819 | ||
844 | switch (tty->ldisc.num) { | 820 | switch (port->info->tty->ldisc.num) { |
845 | case N_IRDA: | 821 | case N_IRDA: |
846 | val = UART_GET_GCTL(&bfin_serial_ports[line]); | 822 | val = UART_GET_GCTL(&bfin_serial_ports[line]); |
847 | val |= (IREN | RPOLC); | 823 | val |= (IREN | RPOLC); |
@@ -866,6 +842,7 @@ static struct uart_ops bfin_serial_pops = { | |||
866 | .startup = bfin_serial_startup, | 842 | .startup = bfin_serial_startup, |
867 | .shutdown = bfin_serial_shutdown, | 843 | .shutdown = bfin_serial_shutdown, |
868 | .set_termios = bfin_serial_set_termios, | 844 | .set_termios = bfin_serial_set_termios, |
845 | .set_ldisc = bfin_serial_set_ldisc, | ||
869 | .type = bfin_serial_type, | 846 | .type = bfin_serial_type, |
870 | .release_port = bfin_serial_release_port, | 847 | .release_port = bfin_serial_release_port, |
871 | .request_port = bfin_serial_request_port, | 848 | .request_port = bfin_serial_request_port, |
@@ -904,7 +881,7 @@ static void __init bfin_serial_init_ports(void) | |||
904 | init_timer(&(bfin_serial_ports[i].rx_dma_timer)); | 881 | init_timer(&(bfin_serial_ports[i].rx_dma_timer)); |
905 | #endif | 882 | #endif |
906 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | 883 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS |
907 | INIT_WORK(&bfin_serial_ports[i].cts_workqueue, bfin_serial_do_work); | 884 | init_timer(&(bfin_serial_ports[i].cts_timer)); |
908 | bfin_serial_ports[i].cts_pin = | 885 | bfin_serial_ports[i].cts_pin = |
909 | bfin_serial_resource[i].uart_cts_pin; | 886 | bfin_serial_resource[i].uart_cts_pin; |
910 | bfin_serial_ports[i].rts_pin = | 887 | bfin_serial_ports[i].rts_pin = |
@@ -1206,7 +1183,6 @@ static int __init bfin_serial_init(void) | |||
1206 | 1183 | ||
1207 | ret = uart_register_driver(&bfin_serial_reg); | 1184 | ret = uart_register_driver(&bfin_serial_reg); |
1208 | if (ret == 0) { | 1185 | if (ret == 0) { |
1209 | bfin_serial_reg.tty_driver->set_ldisc = bfin_set_ldisc; | ||
1210 | ret = platform_driver_register(&bfin_serial_driver); | 1186 | ret = platform_driver_register(&bfin_serial_driver); |
1211 | if (ret) { | 1187 | if (ret) { |
1212 | pr_debug("uart register failed\n"); | 1188 | pr_debug("uart register failed\n"); |