提交 f30ac0ce 编写于 作者: S Sonic Zhang 提交者: Bryan Wu

Blackfin Serial Driver: Use timer to poll CTS PIN instead of workqueue.

This allows other threads to run when the serial driver polls the CTS
PIN in a loop.
Signed-off-by: NSonic Zhang <sonic.zhang@analog.com>
Signed-off-by: NBryan Wu <cooloney@kernel.org>
上级 ec64b6c8
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
#define DMA_RX_YCOUNT (PAGE_SIZE / DMA_RX_XCOUNT) #define DMA_RX_YCOUNT (PAGE_SIZE / DMA_RX_XCOUNT)
#define DMA_RX_FLUSH_JIFFIES (HZ / 50) #define DMA_RX_FLUSH_JIFFIES (HZ / 50)
#define CTS_CHECK_JIFFIES (HZ / 50)
#ifdef CONFIG_SERIAL_BFIN_DMA #ifdef CONFIG_SERIAL_BFIN_DMA
static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart); 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,11 +291,6 @@ static void bfin_serial_tx_chars(struct bfin_serial_port *uart)
{ {
struct circ_buf *xmit = &uart->port.info->xmit; struct circ_buf *xmit = &uart->port.info->xmit;
if (uart->port.x_char) {
UART_PUT_CHAR(uart, uart->port.x_char);
uart->port.icount.tx++;
uart->port.x_char = 0;
}
/* /*
* Check the modem control lines before * Check the modem control lines before
* transmitting anything. * transmitting anything.
...@@ -306,6 +302,12 @@ static void bfin_serial_tx_chars(struct bfin_serial_port *uart) ...@@ -306,6 +302,12 @@ static void bfin_serial_tx_chars(struct bfin_serial_port *uart)
return; return;
} }
if (uart->port.x_char) {
UART_PUT_CHAR(uart, uart->port.x_char);
uart->port.icount.tx++;
uart->port.x_char = 0;
}
while ((UART_GET_LSR(uart) & THRE) && xmit->tail != xmit->head) { while ((UART_GET_LSR(uart) & THRE) && xmit->tail != xmit->head) {
UART_PUT_CHAR(uart, xmit->buf[xmit->tail]); UART_PUT_CHAR(uart, xmit->buf[xmit->tail]);
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); 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,15 +347,6 @@ static irqreturn_t bfin_serial_tx_int(int irq, void *dev_id)
} }
#endif #endif
#ifdef CONFIG_SERIAL_BFIN_CTSRTS
static void bfin_serial_do_work(struct work_struct *work)
{
struct bfin_serial_port *uart = container_of(work, struct bfin_serial_port, cts_workqueue);
bfin_serial_mctrl_check(uart);
}
#endif
#ifdef CONFIG_SERIAL_BFIN_DMA #ifdef CONFIG_SERIAL_BFIN_DMA
static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart) static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart)
{ {
...@@ -361,6 +354,12 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart) ...@@ -361,6 +354,12 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart)
uart->tx_done = 0; uart->tx_done = 0;
/*
* Check the modem control lines before
* transmitting anything.
*/
bfin_serial_mctrl_check(uart);
if (uart_circ_empty(xmit) || uart_tx_stopped(&uart->port)) { if (uart_circ_empty(xmit) || uart_tx_stopped(&uart->port)) {
uart->tx_count = 0; uart->tx_count = 0;
uart->tx_done = 1; uart->tx_done = 1;
...@@ -373,12 +372,6 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart) ...@@ -373,12 +372,6 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart)
uart->port.x_char = 0; uart->port.x_char = 0;
} }
/*
* Check the modem control lines before
* transmitting anything.
*/
bfin_serial_mctrl_check(uart);
uart->tx_count = CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE); uart->tx_count = CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE);
if (uart->tx_count > (UART_XMIT_SIZE - xmit->tail)) if (uart->tx_count > (UART_XMIT_SIZE - xmit->tail))
uart->tx_count = UART_XMIT_SIZE - xmit->tail; uart->tx_count = UART_XMIT_SIZE - xmit->tail;
...@@ -565,7 +558,10 @@ static void bfin_serial_mctrl_check(struct bfin_serial_port *uart) ...@@ -565,7 +558,10 @@ static void bfin_serial_mctrl_check(struct bfin_serial_port *uart)
uart_handle_cts_change(&uart->port, status & TIOCM_CTS); uart_handle_cts_change(&uart->port, status & TIOCM_CTS);
if (!(status & TIOCM_CTS)) { if (!(status & TIOCM_CTS)) {
tty->hw_stopped = 1; tty->hw_stopped = 1;
schedule_work(&uart->cts_workqueue); uart->cts_timer.data = (unsigned long)(uart);
uart->cts_timer.function = (void *)bfin_serial_mctrl_check;
uart->cts_timer.expires = jiffies + CTS_CHECK_JIFFIES;
add_timer(&(uart->cts_timer));
} else { } else {
tty->hw_stopped = 0; tty->hw_stopped = 0;
} }
...@@ -885,7 +881,7 @@ static void __init bfin_serial_init_ports(void) ...@@ -885,7 +881,7 @@ static void __init bfin_serial_init_ports(void)
init_timer(&(bfin_serial_ports[i].rx_dma_timer)); init_timer(&(bfin_serial_ports[i].rx_dma_timer));
#endif #endif
#ifdef CONFIG_SERIAL_BFIN_CTSRTS #ifdef CONFIG_SERIAL_BFIN_CTSRTS
INIT_WORK(&bfin_serial_ports[i].cts_workqueue, bfin_serial_do_work); init_timer(&(bfin_serial_ports[i].cts_timer));
bfin_serial_ports[i].cts_pin = bfin_serial_ports[i].cts_pin =
bfin_serial_resource[i].uart_cts_pin; bfin_serial_resource[i].uart_cts_pin;
bfin_serial_ports[i].rts_pin = bfin_serial_ports[i].rts_pin =
......
...@@ -96,7 +96,7 @@ struct bfin_serial_port { ...@@ -96,7 +96,7 @@ struct bfin_serial_port {
struct work_struct tx_dma_workqueue; struct work_struct tx_dma_workqueue;
#endif #endif
#ifdef CONFIG_SERIAL_BFIN_CTSRTS #ifdef CONFIG_SERIAL_BFIN_CTSRTS
struct work_struct cts_workqueue; struct timer_list cts_timer;
int cts_pin; int cts_pin;
int rts_pin; int rts_pin;
#endif #endif
......
...@@ -88,7 +88,7 @@ struct bfin_serial_port { ...@@ -88,7 +88,7 @@ struct bfin_serial_port {
# endif # endif
#endif #endif
#ifdef CONFIG_SERIAL_BFIN_CTSRTS #ifdef CONFIG_SERIAL_BFIN_CTSRTS
struct work_struct cts_workqueue; struct timer_list cts_timer;
int cts_pin; int cts_pin;
int rts_pin; int rts_pin;
#endif #endif
......
...@@ -96,7 +96,7 @@ struct bfin_serial_port { ...@@ -96,7 +96,7 @@ struct bfin_serial_port {
struct work_struct tx_dma_workqueue; struct work_struct tx_dma_workqueue;
#endif #endif
#ifdef CONFIG_SERIAL_BFIN_CTSRTS #ifdef CONFIG_SERIAL_BFIN_CTSRTS
struct work_struct cts_workqueue; struct timer_list cts_timer;
int cts_pin; int cts_pin;
int rts_pin; int rts_pin;
#endif #endif
......
...@@ -99,7 +99,7 @@ struct bfin_serial_port { ...@@ -99,7 +99,7 @@ struct bfin_serial_port {
struct work_struct tx_dma_workqueue; struct work_struct tx_dma_workqueue;
#endif #endif
#ifdef CONFIG_SERIAL_BFIN_CTSRTS #ifdef CONFIG_SERIAL_BFIN_CTSRTS
struct work_struct cts_workqueue; struct timer_list cts_timer;
int cts_pin; int cts_pin;
int rts_pin; int rts_pin;
#endif #endif
......
...@@ -88,7 +88,7 @@ struct bfin_serial_port { ...@@ -88,7 +88,7 @@ struct bfin_serial_port {
# endif # endif
#endif #endif
#ifdef CONFIG_SERIAL_BFIN_CTSRTS #ifdef CONFIG_SERIAL_BFIN_CTSRTS
struct work_struct cts_workqueue; struct timer_list cts_timer;
int cts_pin; int cts_pin;
int rts_pin; int rts_pin;
#endif #endif
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册