diff options
Diffstat (limited to 'drivers/serial/bfin_5xx.c')
| -rw-r--r-- | drivers/serial/bfin_5xx.c | 40 |
1 files changed, 18 insertions, 22 deletions
diff --git a/drivers/serial/bfin_5xx.c b/drivers/serial/bfin_5xx.c index f20952c43cb8..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; |
| @@ -565,7 +558,10 @@ static void bfin_serial_mctrl_check(struct bfin_serial_port *uart) | |||
| 565 | uart_handle_cts_change(&uart->port, status & TIOCM_CTS); | 558 | uart_handle_cts_change(&uart->port, status & TIOCM_CTS); |
| 566 | if (!(status & TIOCM_CTS)) { | 559 | if (!(status & TIOCM_CTS)) { |
| 567 | tty->hw_stopped = 1; | 560 | tty->hw_stopped = 1; |
| 568 | 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)); | ||
| 569 | } else { | 565 | } else { |
| 570 | tty->hw_stopped = 0; | 566 | tty->hw_stopped = 0; |
| 571 | } | 567 | } |
| @@ -885,7 +881,7 @@ static void __init bfin_serial_init_ports(void) | |||
| 885 | init_timer(&(bfin_serial_ports[i].rx_dma_timer)); | 881 | init_timer(&(bfin_serial_ports[i].rx_dma_timer)); |
| 886 | #endif | 882 | #endif |
| 887 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | 883 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS |
| 888 | INIT_WORK(&bfin_serial_ports[i].cts_workqueue, bfin_serial_do_work); | 884 | init_timer(&(bfin_serial_ports[i].cts_timer)); |
| 889 | bfin_serial_ports[i].cts_pin = | 885 | bfin_serial_ports[i].cts_pin = |
| 890 | bfin_serial_resource[i].uart_cts_pin; | 886 | bfin_serial_resource[i].uart_cts_pin; |
| 891 | bfin_serial_ports[i].rts_pin = | 887 | bfin_serial_ports[i].rts_pin = |
