serial: sh-sci: console drainage
authorMagnus Damm <damm@igel.co.jp>
Tue, 24 Feb 2009 06:57:12 +0000 (15:57 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Fri, 27 Feb 2009 07:50:00 +0000 (16:50 +0900)
Modify the serial console code to wait for the transmit FIFO,
make sure all bits have been put on the wire before returning.

Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
drivers/serial/sh-sci.c

index 557b54ab2f25d22b0f623b7f6dde18cb12cc47f2..d3ccce0bfd445445ac4c5905717192e9a08b9110 100644 (file)
@@ -139,7 +139,7 @@ static void sci_poll_put_char(struct uart_port *port, unsigned char c)
        } while (!(status & SCxSR_TDxE(port)));
 
        sci_in(port, SCxSR);            /* Dummy read */
-       sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port));
+       sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port) & ~SCxSR_TEND(port));
        sci_out(port, SCxTDR, c);
 }
 #endif /* CONFIG_CONSOLE_POLL || CONFIG_SERIAL_SH_SCI_CONSOLE */
@@ -1095,6 +1095,7 @@ static void serial_console_write(struct console *co, const char *s,
                                 unsigned count)
 {
        struct uart_port *port = &serial_console_port->port;
+       unsigned short bits;
        int i;
 
        for (i = 0; i < count; i++) {
@@ -1103,6 +1104,11 @@ static void serial_console_write(struct console *co, const char *s,
 
                sci_poll_put_char(port, *s++);
        }
+
+       /* wait until fifo is empty and last bit has been transmitted */
+       bits = SCxSR_TDxE(port) | SCxSR_TEND(port);
+       while ((sci_in(port, SCxSR) & bits) != bits)
+               cpu_relax();
 }
 
 static int __init serial_console_setup(struct console *co, char *options)