Merge branch 'master' of git://git.kernel.org/pub/scm/fs/xfs/xfs
[pandora-kernel.git] / arch / powerpc / kernel / udbg_16550.c
index 7b7da8c..0362a89 100644 (file)
@@ -48,14 +48,21 @@ struct NS16550 {
 
 static struct NS16550 __iomem *udbg_comport;
 
-static void udbg_550_putc(char c)
+static void udbg_550_flush(void)
 {
        if (udbg_comport) {
                while ((in_8(&udbg_comport->lsr) & LSR_THRE) == 0)
                        /* wait for idle */;
-               out_8(&udbg_comport->thr, c);
+       }
+}
+
+static void udbg_550_putc(char c)
+{
+       if (udbg_comport) {
                if (c == '\n')
                        udbg_550_putc('\r');
+               udbg_550_flush();
+               out_8(&udbg_comport->thr, c);
        }
 }
 
@@ -108,6 +115,7 @@ void udbg_init_uart(void __iomem *comport, unsigned int speed,
                /* Clear & enable FIFOs */
                out_8(&udbg_comport->fcr ,0x07);
                udbg_putc = udbg_550_putc;
+               udbg_flush = udbg_550_flush;
                udbg_getc = udbg_550_getc;
                udbg_getc_poll = udbg_550_getc_poll;
        }
@@ -149,14 +157,21 @@ unsigned int udbg_probe_uart_speed(void __iomem *comport, unsigned int clock)
 }
 
 #ifdef CONFIG_PPC_MAPLE
-void udbg_maple_real_putc(char c)
+void udbg_maple_real_flush(void)
 {
        if (udbg_comport) {
                while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
                        /* wait for idle */;
-               real_writeb(c, &udbg_comport->thr); eieio();
+       }
+}
+
+void udbg_maple_real_putc(char c)
+{
+       if (udbg_comport) {
                if (c == '\n')
                        udbg_maple_real_putc('\r');
+               udbg_maple_real_flush();
+               real_writeb(c, &udbg_comport->thr); eieio();
        }
 }
 
@@ -165,20 +180,28 @@ void __init udbg_init_maple_realmode(void)
        udbg_comport = (struct NS16550 __iomem *)0xf40003f8;
 
        udbg_putc = udbg_maple_real_putc;
+       udbg_flush = udbg_maple_real_flush;
        udbg_getc = NULL;
        udbg_getc_poll = NULL;
 }
 #endif /* CONFIG_PPC_MAPLE */
 
 #ifdef CONFIG_PPC_PASEMI
-void udbg_pas_real_putc(char c)
+void udbg_pas_real_flush(void)
 {
        if (udbg_comport) {
                while ((real_205_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
                        /* wait for idle */;
-               real_205_writeb(c, &udbg_comport->thr); eieio();
+       }
+}
+
+void udbg_pas_real_putc(char c)
+{
+       if (udbg_comport) {
                if (c == '\n')
                        udbg_pas_real_putc('\r');
+               udbg_pas_real_flush();
+               real_205_writeb(c, &udbg_comport->thr); eieio();
        }
 }
 
@@ -187,6 +210,7 @@ void udbg_init_pas_realmode(void)
        udbg_comport = (struct NS16550 __iomem *)0xfcff03f8UL;
 
        udbg_putc = udbg_pas_real_putc;
+       udbg_flush = udbg_pas_real_flush;
        udbg_getc = NULL;
        udbg_getc_poll = NULL;
 }
@@ -195,14 +219,21 @@ void udbg_init_pas_realmode(void)
 #ifdef CONFIG_PPC_EARLY_DEBUG_44x
 #include <platforms/44x/44x.h>
 
-static void udbg_44x_as1_putc(char c)
+static int udbg_44x_as1_flush(void)
 {
        if (udbg_comport) {
                while ((as1_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
                        /* wait for idle */;
-               as1_writeb(c, &udbg_comport->thr); eieio();
+       }
+}
+
+static void udbg_44x_as1_putc(char c)
+{
+       if (udbg_comport) {
                if (c == '\n')
                        udbg_44x_as1_putc('\r');
+               udbg_44x_as1_flush();
+               as1_writeb(c, &udbg_comport->thr); eieio();
        }
 }
 
@@ -222,19 +253,27 @@ void __init udbg_init_44x_as1(void)
                (struct NS16550 __iomem *)PPC44x_EARLY_DEBUG_VIRTADDR;
 
        udbg_putc = udbg_44x_as1_putc;
+       udbg_flush = udbg_44x_as1_flush;
        udbg_getc = udbg_44x_as1_getc;
 }
 #endif /* CONFIG_PPC_EARLY_DEBUG_44x */
 
 #ifdef CONFIG_PPC_EARLY_DEBUG_40x
-static void udbg_40x_real_putc(char c)
+static void udbg_40x_real_flush(void)
 {
        if (udbg_comport) {
                while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
                        /* wait for idle */;
-               real_writeb(c, &udbg_comport->thr); eieio();
+       }
+}
+
+static void udbg_40x_real_putc(char c)
+{
+       if (udbg_comport) {
                if (c == '\n')
                        udbg_40x_real_putc('\r');
+               udbg_40x_real_flush();
+               real_writeb(c, &udbg_comport->thr); eieio();
        }
 }
 
@@ -254,6 +293,7 @@ void __init udbg_init_40x_realmode(void)
                CONFIG_PPC_EARLY_DEBUG_40x_PHYSADDR;
 
        udbg_putc = udbg_40x_real_putc;
+       udbg_flush = udbg_40x_real_flush;
        udbg_getc = udbg_40x_real_getc;
        udbg_getc_poll = NULL;
 }