From 3eb4a0528703aa6635b5632d296e1bf191354076 Mon Sep 17 00:00:00 2001 From: Sonic Zhang Date: Mon, 19 Nov 2012 14:40:56 +0800 Subject: [PATCH] --- yaml --- r: 338455 b: refs/heads/master c: 1cd3f2d2c99892209c4751155ae56ff18b1b253e h: refs/heads/master i: 338453: e6fde97c6f629c7718d771cb1796b3a3098a95cd 338451: c448f14c7a89816951c8e7c7f5a8b8ab6aa613b4 338447: 3e7b483e383b441d6a2f6becc80f57abd8bddbbf v: v3 --- [refs] | 2 +- trunk/drivers/tty/serial/bfin_uart.c | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index d243e49c06a7..547372ab9136 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 159a8e92fdf6967cb67e7639832f819fbc607242 +refs/heads/master: 1cd3f2d2c99892209c4751155ae56ff18b1b253e diff --git a/trunk/drivers/tty/serial/bfin_uart.c b/trunk/drivers/tty/serial/bfin_uart.c index 18cf45a29d40..e6a008f4939f 100644 --- a/trunk/drivers/tty/serial/bfin_uart.c +++ b/trunk/drivers/tty/serial/bfin_uart.c @@ -799,6 +799,7 @@ bfin_serial_set_termios(struct uart_port *port, struct ktermios *termios, unsigned long flags; unsigned int baud, quot; unsigned int ier, lcr = 0; + unsigned long timeout; switch (termios->c_cflag & CSIZE) { case CS8: @@ -868,6 +869,14 @@ bfin_serial_set_termios(struct uart_port *port, struct ktermios *termios, UART_SET_ANOMALY_THRESHOLD(uart, USEC_PER_SEC / baud * 15); + /* Wait till the transfer buffer is empty */ + timeout = jiffies + msecs_to_jiffies(10); + while (UART_GET_GCTL(uart) & UCEN && !(UART_GET_LSR(uart) & TEMT)) + if (time_after(jiffies, timeout)) { + dev_warn(port->dev, "timeout waiting for TX buffer empty\n"); + break; + } + /* Disable UART */ ier = UART_GET_IER(uart); UART_PUT_GCTL(uart, UART_GET_GCTL(uart) & ~UCEN);