aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/serial
diff options
context:
space:
mode:
authorMagnus Damm <damm@igel.co.jp>2009-02-24 01:57:12 -0500
committerPaul Mundt <lethal@linux-sh.org>2009-02-27 02:50:00 -0500
commit973e5d525d39be6f9f6c38d37aacf03efda02e60 (patch)
tree618715c8df3e2d87a9b9a5d43839813e019f108e /drivers/serial
parenta73090ffaf0f6853880d9ac3fff7e5d88215131a (diff)
serial: sh-sci: console drainage
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>
Diffstat (limited to 'drivers/serial')
-rw-r--r--drivers/serial/sh-sci.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c
index 557b54ab2f25..d3ccce0bfd44 100644
--- a/drivers/serial/sh-sci.c
+++ b/drivers/serial/sh-sci.c
@@ -139,7 +139,7 @@ static void sci_poll_put_char(struct uart_port *port, unsigned char c)
139 } while (!(status & SCxSR_TDxE(port))); 139 } while (!(status & SCxSR_TDxE(port)));
140 140
141 sci_in(port, SCxSR); /* Dummy read */ 141 sci_in(port, SCxSR); /* Dummy read */
142 sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port)); 142 sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port) & ~SCxSR_TEND(port));
143 sci_out(port, SCxTDR, c); 143 sci_out(port, SCxTDR, c);
144} 144}
145#endif /* CONFIG_CONSOLE_POLL || CONFIG_SERIAL_SH_SCI_CONSOLE */ 145#endif /* CONFIG_CONSOLE_POLL || CONFIG_SERIAL_SH_SCI_CONSOLE */
@@ -1095,6 +1095,7 @@ static void serial_console_write(struct console *co, const char *s,
1095 unsigned count) 1095 unsigned count)
1096{ 1096{
1097 struct uart_port *port = &serial_console_port->port; 1097 struct uart_port *port = &serial_console_port->port;
1098 unsigned short bits;
1098 int i; 1099 int i;
1099 1100
1100 for (i = 0; i < count; i++) { 1101 for (i = 0; i < count; i++) {
@@ -1103,6 +1104,11 @@ static void serial_console_write(struct console *co, const char *s,
1103 1104
1104 sci_poll_put_char(port, *s++); 1105 sci_poll_put_char(port, *s++);
1105 } 1106 }
1107
1108 /* wait until fifo is empty and last bit has been transmitted */
1109 bits = SCxSR_TDxE(port) | SCxSR_TEND(port);
1110 while ((sci_in(port, SCxSR) & bits) != bits)
1111 cpu_relax();
1106} 1112}
1107 1113
1108static int __init serial_console_setup(struct console *co, char *options) 1114static int __init serial_console_setup(struct console *co, char *options)