aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMagnus Damm <magnus.damm@gmail.com>2008-04-23 21:05:11 +0900
committerPaul Mundt <lethal@linux-sh.org>2008-05-08 19:51:53 +0900
commit4a65e3827bcff072e5f4a96b3f73f9f17eb7d6d8 (patch)
treebdfc0eb486e76e31024cf7279c7f55c32516e827
parentsh: use sci_out() for early printk (diff)
downloadlinux-dev-4a65e3827bcff072e5f4a96b3f73f9f17eb7d6d8.tar.xz
linux-dev-4a65e3827bcff072e5f4a96b3f73f9f17eb7d6d8.zip
sh: drain and wait for early printk
Drain by waiting for all characters to be sent, and make sure to wait a little bit after setting up the baud rate. Signed-off-by: Magnus Damm <damm@igel.co.jp> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
-rw-r--r--arch/sh/kernel/early_printk.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/sh/kernel/early_printk.c b/arch/sh/kernel/early_printk.c
index 18ca249e8409..11b4c85999b7 100644
--- a/arch/sh/kernel/early_printk.c
+++ b/arch/sh/kernel/early_printk.c
@@ -143,6 +143,7 @@ static void scif_sercon_init(char *s)
{
struct uart_port *port = &scif_port;
unsigned baud = DEFAULT_BAUD;
+ unsigned int status;
char *e;
if (*s == ',')
@@ -161,12 +162,17 @@ static void scif_sercon_init(char *s)
baud = DEFAULT_BAUD;
}
+ do {
+ status = sci_in(port, SCxSR);
+ } while (!(status & SCxSR_TEND(port)));
+
sci_out(port, SCSCR, 0); /* TE=0, RE=0 */
sci_out(port, SCSMR, 0);
/* Set baud rate */
sci_out(port, SCBRR, (CONFIG_SH_PCLK_FREQ + 16 * baud) /
(32 * baud) - 1);
+ udelay((1000000+(baud-1)) / baud); /* Wait one bit interval */
sci_out(port, SCFCR, 12);
sci_out(port, SCFCR, 8);