[ARM] Fix decompressor serial IO to give CRLF not LFCR
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Tue, 28 Mar 2006 09:24:33 +0000 (10:24 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Tue, 28 Mar 2006 09:24:33 +0000 (10:24 +0100)
As per the corresponding change to the serial drivers, arrange
for ARM decompressors to give CRLF.  Move the common putstr code
into misc.c such that machines only need to supply "putc" and
"flush" functions.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
24 files changed:
arch/arm/boot/compressed/misc.c
include/asm-arm/arch-aaec2000/uncompress.h
include/asm-arm/arch-at91rm9200/uncompress.h
include/asm-arm/arch-cl7500/uncompress.h
include/asm-arm/arch-clps711x/uncompress.h
include/asm-arm/arch-ebsa110/uncompress.h
include/asm-arm/arch-ebsa285/uncompress.h
include/asm-arm/arch-ep93xx/uncompress.h
include/asm-arm/arch-h720x/uncompress.h
include/asm-arm/arch-imx/uncompress.h
include/asm-arm/arch-integrator/uncompress.h
include/asm-arm/arch-iop3xx/uncompress.h
include/asm-arm/arch-ixp2000/uncompress.h
include/asm-arm/arch-ixp4xx/uncompress.h
include/asm-arm/arch-l7200/uncompress.h
include/asm-arm/arch-lh7a40x/uncompress.h
include/asm-arm/arch-omap/uncompress.h
include/asm-arm/arch-pxa/uncompress.h
include/asm-arm/arch-realview/uncompress.h
include/asm-arm/arch-rpc/uncompress.h
include/asm-arm/arch-s3c2410/uncompress.h
include/asm-arm/arch-sa1100/uncompress.h
include/asm-arm/arch-shark/uncompress.h
include/asm-arm/arch-versatile/uncompress.h

index 5ab9458..28626ec 100644 (file)
@@ -20,24 +20,32 @@ unsigned int __machine_arch_type;
 
 #include <linux/string.h>
 
-#include <asm/arch/uncompress.h>
-
 #ifdef STANDALONE_DEBUG
 #define putstr printf
-#endif
+#else
 
-#ifdef CONFIG_DEBUG_ICEDCC
-#define putstr icedcc_putstr
-#define putc icedcc_putc
+static void putstr(const char *ptr);
 
+#include <linux/compiler.h>
+#include <asm/arch/uncompress.h>
+
+#ifdef CONFIG_DEBUG_ICEDCC
 extern void icedcc_putc(int ch);
+#define putc(ch)       icedcc_putc(ch)
+#define flush()        do { } while (0)
+#endif
 
-static void
-icedcc_putstr(const char *ptr)
+static void putstr(const char *ptr)
 {
-       for (; *ptr != '\0'; ptr++) {
-               icedcc_putc(*ptr);
+       char c;
+
+       while ((c = *ptr++) != '\0') {
+               if (c == '\n')
+                       putc('\r');
+               putc(c);
        }
+
+       flush();
 }
 
 #endif
index fff0c94..300f4bf 100644 (file)
@@ -15,7 +15,7 @@
 
 #define UART(x)         (*(volatile unsigned long *)(serial_port + (x)))
 
-static void putstr( const char *s )
+static void putc(int c)
 {
        unsigned long serial_port;
         do {
@@ -28,17 +28,16 @@ static void putstr( const char *s )
                return;
        } while (0);
 
-       for (; *s; s++) {
-               /* wait for space in the UART's transmitter */
-               while ((UART(UART_SR) & UART_SR_TxFF));
-               /* send the character out. */
-               UART(UART_DR) = *s;
-               /* if a LF, also do CR... */
-               if (*s == 10) {
-                       while ((UART(UART_SR) & UART_SR_TxFF));
-                       UART(UART_DR) = 13;
-               }
-       }
+       /* wait for space in the UART's transmitter */
+       while ((UART(UART_SR) & UART_SR_TxFF))
+               barrier();
+
+       /* send the character out. */
+       UART(UART_DR) = c;
+}
+
+static inline void flush(void)
+{
 }
 
 #define arch_decomp_setup()
index b30dd55..7b38497 100644 (file)
  *
  * This does not append a newline
  */
-static void putstr(const char *s)
+static void putc(int c)
+{
+       void __iomem *sys = (void __iomem *) AT91_BASE_SYS;     /* physical address */
+
+       while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXRDY))
+               barrier();
+       __raw_writel(c, sys + AT91_DBGU_THR);
+}
+
+static inline void flush(void)
 {
        void __iomem *sys = (void __iomem *) AT91_BASE_SYS;     /* physical address */
 
-       while (*s) {
-               while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXRDY)) { barrier(); }
-               __raw_writel(*s, sys + AT91_DBGU_THR);
-               if (*s == '\n') {
-                       while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXRDY)) { barrier(); }
-                       __raw_writel('\r', sys + AT91_DBGU_THR);
-               }
-               s++;
-       }
        /* wait for transmission to complete */
-       while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXEMPTY)) { barrier(); }
+       while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXEMPTY))
+               barrier();
 }
 
 #define arch_decomp_setup()
index 68601b3..c437e0c 100644 (file)
@@ -3,27 +3,19 @@
  *
  * Copyright (C) 1999, 2000 Nexus Electronics Ltd.
  */
-
 #define BASE 0x03010000
 #define SERBASE (BASE + (0x2f8 << 2))
 
-static __inline__ void putc(char c)
+static inline void putc(char c)
 {
-       while (!(*((volatile unsigned int *)(SERBASE + 0x14)) & 0x20));
+       while (!(*((volatile unsigned int *)(SERBASE + 0x14)) & 0x20))
+               barrier();
+
        *((volatile unsigned int *)(SERBASE)) = c;
 }
 
-/*
- * This does not append a newline
- */
-static void putstr(const char *s)
+static inline void flush(void)
 {
-       while (*s) {
-               putc(*s);
-               if (*s == '\n')
-                       putc('\r');
-               s++;
-       }
 }
 
 static __inline__ void arch_decomp_setup(void)
index 9fc4bcf..07157b7 100644 (file)
@@ -25,7 +25,6 @@
 #undef CLPS7111_BASE
 #define CLPS7111_BASE CLPS7111_PHYS_BASE
 
-#define barrier()              __asm__ __volatile__("": : :"memory")
 #define __raw_readl(p)         (*(unsigned long *)(p))
 #define __raw_writel(v,p)      (*(unsigned long *)(p) = (v))
 
 /*
  * This does not append a newline
  */
-static void putstr(const char *s)
+static inline void putc(int c)
 {
-       char c;
-
-       while ((c = *s++) != '\0') {
-               while (clps_readl(SYSFLGx) & SYSFLG_UTXFF)
-                       barrier();
-               clps_writel(c, UARTDRx);
+       while (clps_readl(SYSFLGx) & SYSFLG_UTXFF)
+               barrier();
+       clps_writel(c, UARTDRx);
+}
 
-               if (c == '\n') {
-                       while (clps_readl(SYSFLGx) & SYSFLG_UTXFF)
-                               barrier();
-                       clps_writel('\r', UARTDRx);
-               }
-       }
+static inline void flush(void)
+{
        while (clps_readl(SYSFLGx) & SYSFLG_UBUSY)
                barrier();
 }
index eee9558..66b19c7 100644 (file)
@@ -8,33 +8,34 @@
  * published by the Free Software Foundation.
  */
 
+#include <linux/serial_reg.h>
+
+#define SERIAL_BASE    ((unsigned char *)0xfe000be0)
+
 /*
  * This does not append a newline
  */
-static void putstr(const char *s)
+static inline void putc(int c)
+{
+       unsigned char v, *base = SERIAL_BASE;
+
+       do {
+               v = base[UART_LSR << 2];
+               barrier();
+       } while (!(v & UART_LSR_THRE));
+
+       base[UART_TX << 2] = c;
+}
+
+static inline void flush(void)
 {
-       unsigned long tmp1, tmp2;
-       __asm__ __volatile__(
-       "ldrb   %0, [%2], #1\n"
-"      teq     %0, #0\n"
-"      beq     3f\n"
-"1:    strb    %0, [%3]\n"
-"2:    ldrb    %1, [%3, #0x14]\n"
-"      and     %1, %1, #0x60\n"
-"      teq     %1, #0x60\n"
-"      bne     2b\n"
-"      teq     %0, #'\n'\n"
-"      moveq   %0, #'\r'\n"
-"      beq     1b\n"
-"      ldrb    %0, [%2], #1\n"
-"      teq     %0, #0\n"
-"      bne     1b\n"
-"3:    ldrb    %1, [%3, #0x14]\n"
-"      and     %1, %1, #0x60\n"
-"      teq     %1, #0x60\n"
-"      bne     3b"
-       : "=&r" (tmp1), "=&r" (tmp2)
-       : "r" (s), "r" (0xf0000be0) : "cc");
+       unsigned char v, *base = SERIAL_BASE;
+
+       do {
+               v = base[UART_LSR << 2];
+               barrier();
+       } while ((v & (UART_LSR_TEMT|UART_LSR_THRE)) !=
+                (UART_LSR_TEMT|UART_LSR_THRE));
 }
 
 /*
index c2fd84e..86142c8 100644 (file)
 #define DC21285_BASE ((volatile unsigned int *)0x42000160)
 #define SER0_BASE    ((volatile unsigned char *)0x7c0003f8)
 
-static __inline__ void putc(char c)
+static inline void putc(char c)
 {
        if (machine_is_netwinder()) {
-               while ((SER0_BASE[5] & 0x60) != 0x60);
+               while ((SER0_BASE[5] & 0x60) != 0x60)
+                       barrier();
                SER0_BASE[0] = c;
        } else {
                while (DC21285_BASE[6] & 8);
@@ -26,17 +27,8 @@ static __inline__ void putc(char c)
        }
 }
 
-/*
- * This does not append a newline
- */
-static void putstr(const char *s)
+static inline void flush(void)
 {
-       while (*s) {
-               putc(*s);
-               if (*s == '\n')
-                       putc('\r');
-               s++;
-       }
 }
 
 /*
index 2171082..c15274c 100644 (file)
@@ -36,7 +36,7 @@ static void __raw_writel(unsigned int value, unsigned int ptr)
 #define PHYS_UART1_FLAG                0x808c0018
 #define UART1_FLAG_TXFF                0x20
 
-static __inline__ void putc(char c)
+static inline void putc(int c)
 {
        int i;
 
@@ -49,14 +49,8 @@ static __inline__ void putc(char c)
        __raw_writeb(c, PHYS_UART1_DATA);
 }
 
-static void putstr(const char *s)
+static inline void flush(void)
 {
-       while (*s) {
-               putc(*s);
-               if (*s == '\n')
-                       putc('\r');
-               s++;
-       }
 }
 
 
index 9535764..18c69e0 100644 (file)
 #define LSR    0x14
 #define TEMPTY         0x40
 
-static void putstr(const char *s)
+static inline void putc(int c)
 {
-       char c;
        volatile unsigned char *p = (volatile unsigned char *)(IO_PHYS+0x20000);
 
-       while ( (c = *s++) != '\0') {
-               /* wait until transmit buffer is empty */
-               while((p[LSR] & TEMPTY) == 0x0);
-               /* write next character */
-               *p = c;
-
-               if(c == '\n') {
-                       while((p[LSR] & TEMPTY) == 0x0);
-                       *p = '\r';
-               }
-       }
+       /* wait until transmit buffer is empty */
+       while((p[LSR] & TEMPTY) == 0x0)
+               barrier();
+
+       /* write next character */
+       *p = c;
+}
+
+static inline void flush(void)
+{
 }
 
 /*
index 096077f..da333f6 100644 (file)
@@ -39,8 +39,7 @@
  *
  * This does not append a newline
  */
-static void
-putstr(const char *s)
+static void putc(int c)
 {
        unsigned long serial_port;
 
@@ -54,20 +53,14 @@ putstr(const char *s)
                return;
        } while(0);
 
-       while (*s) {
-               while ( !(UART(USR2) & USR2_TXFE) )
-                       barrier();
+       while (!(UART(USR2) & USR2_TXFE))
+               barrier();
 
-               UART(TXR) = *s;
-
-               if (*s == '\n') {
-                       while ( !(UART(USR2) & USR2_TXFE) )
-                               barrier();
+       UART(TXR) = c;
+}
 
-                       UART(TXR) = '\r';
-               }
-               s++;
-       }
+static inline void flush(void)
+{
 }
 
 /*
index 3957402..f61825c 100644 (file)
 /*
  * This does not append a newline
  */
-static void putstr(const char *s)
+static void putc(int c)
 {
-       while (*s) {
-               while (AMBA_UART_FR & (1 << 5));
+       while (AMBA_UART_FR & (1 << 5))
+               barrier();
 
-               AMBA_UART_DR = *s;
-
-               if (*s == '\n') {
-                       while (AMBA_UART_FR & (1 << 5));
+       AMBA_UART_DR = c;
+}
 
-                       AMBA_UART_DR = '\r';
-               }
-               s++;
-       }
-       while (AMBA_UART_FR & (1 << 3));
+static inline void flush(void)
+{
+       while (AMBA_UART_FR & (1 << 3))
+               barrier();
 }
 
 /*
index 82b8876..c98eb62 100644 (file)
@@ -19,23 +19,15 @@ static volatile UTYPE uart_base;
 
 #define TX_DONE (UART_LSR_TEMT|UART_LSR_THRE)
 
-static __inline__ void putc(char c)
+static inline void putc(char c)
 {
-       while ((uart_base[UART_LSR] & TX_DONE) != TX_DONE);
+       while ((uart_base[UART_LSR] & TX_DONE) != TX_DONE)
+               barrier();
        *uart_base = c;
 }
 
-/*
- * This does not append a newline
- */
-static void putstr(const char *s)
+static inline void flush(void)
 {
-       while (*s) {
-               putc(*s);
-               if (*s == '\n')
-                       putc('\r');
-               s++;
-       }
 }
 
 static __inline__ void __arch_decomp_setup(unsigned long arch_id)
index 3d3d5b2..f66b408 100644 (file)
 #define UARTSR          PHYS(0x14)      /* Status reg */
 
 
-static __inline__ void putc(char c)
+static inline void putc(int c)
 {
        int j = 0x1000;
 
-       while (--j && !(*UARTSR & UART_LSR_THRE)); 
+       while (--j && !(*UARTSR & UART_LSR_THRE))
+               barrier();
+
        *UARTDR = c;
 }
 
-static void putstr(const char *s)
+static inline void flush(void)
 {
-       while (*s)
-       {
-               putc(*s);
-               if (*s == '\n')
-                       putc('\r');
-               s++;
-       }
 }
 
 #define arch_decomp_setup()
index 960c358..09ae6c9 100644 (file)
 
 static volatile u32* uart_base;
 
-static __inline__ void putc(char c)
+static inline void putc(int c)
 {
        /* Check THRE and TEMT bits before we transmit the character.
         */
-       while ((uart_base[UART_LSR] & TX_DONE) != TX_DONE); 
+       while ((uart_base[UART_LSR] & TX_DONE) != TX_DONE)
+               barrier();
+
        *uart_base = c;
 }
 
-/*
- * This does not append a newline
- */
-static void putstr(const char *s)
+static void flush(void)
 {
-       while (*s)
-       {
-               putc(*s);
-               if (*s == '\n')
-                       putc('\r');
-               s++;
-       }
 }
 
 static __inline__ void __arch_decomp_setup(unsigned long arch_id)
index 1caa2b5..9fcd40a 100644 (file)
 #define __raw_writeb(v,p)      (*(volatile unsigned char *)(p) = (v))
 #define __raw_readb(p)         (*(volatile unsigned char *)(p))
 
-static __inline__ void putc(char c)
+static inline void putc(int c)
 {
        while(__raw_readb(IO_UART + 0x18) & 0x20 ||
-               __raw_readb(IO_UART + 0x18) & 0x08);
+             __raw_readb(IO_UART + 0x18) & 0x08)
+               barrier();
+
        __raw_writeb(c, IO_UART + 0x00);
 }
 
-static void putstr(const char *s)
+static inline void flush(void)
 {
-       while (*s) {
-               if (*s == 10) {                 /* If a LF, add CR */
-                       putc(10);
-                       putc(13);
-               }
-               putc(*(s++));
-       }
 }
 
 static __inline__ void arch_decomp_setup(void)
index ec8ab67..f805334 100644 (file)
 #define UART_STATUS (*(volatile unsigned long*) (UART2_PHYS + UART_R_STATUS))
 #define UART_DATA   (*(volatile unsigned long*) (UART2_PHYS + UART_R_DATA))
 
-static __inline__ void putc (char ch)
+static inline void putc(int ch)
 {
        while (UART_STATUS & nTxRdy)
-               ;
+               barrier();
        UART_DATA = ch;
 }
 
-static void putstr (const char* sz)
+static inline void flush(void)
 {
-       for (; *sz; ++sz) {
-               putc (*sz);
-               if (*sz == '\n')
-                       putc ('\r');
-       }
 }
 
        /* NULL functions; we don't presently need them */
index c718264..ca2c8be 100644 (file)
@@ -30,8 +30,7 @@ unsigned int system_rev;
 #define check_port(base, shift) ((base[UART_OMAP_MDR1 << shift] & 7) == 0)
 #define omap_get_id() ((*(volatile unsigned int *)(0xfffed404)) >> 12) & ID_MASK
 
-static void
-putstr(const char *s)
+static void putc(int c)
 {
        volatile u8 * uart = 0;
        int shift = 2;
@@ -69,16 +68,13 @@ putstr(const char *s)
        /*
         * Now, xmit each character
         */
-       while (*s) {
-               while (!(uart[UART_LSR << shift] & UART_LSR_THRE))
-                       barrier();
-               uart[UART_TX << shift] = *s;
-               if (*s++ == '\n') {
-                       while (!(uart[UART_LSR << shift] & UART_LSR_THRE))
-                               barrier();
-                       uart[UART_TX << shift] = '\r';
-               }
-       }
+       while (!(uart[UART_LSR << shift] & UART_LSR_THRE))
+               barrier();
+       uart[UART_TX << shift] = c;
+}
+
+static inline void flush(void)
+{
 }
 
 /*
index fe38090..178aa2e 100644 (file)
 #define UART           FFUART
 
 
-static __inline__ void putc(char c)
+static inline void putc(char c)
 {
-       while (!(UART[5] & 0x20));
+       while (!(UART[5] & 0x20))
+               barrier();
        UART[0] = c;
 }
 
 /*
  * This does not append a newline
  */
-static void putstr(const char *s)
+static inline void flush(void)
 {
-       while (*s) {
-               putc(*s);
-               if (*s == '\n')
-                       putc('\r');
-               s++;
-       }
 }
 
 /*
index b5e4d36..f05631d 100644 (file)
 /*
  * This does not append a newline
  */
-static void putstr(const char *s)
+static inline void putc(int c)
 {
-       while (*s) {
-               while (AMBA_UART_FR & (1 << 5))
-                       barrier();
-
-               AMBA_UART_DR = *s;
+       while (AMBA_UART_FR & (1 << 5))
+               barrier();
 
-               if (*s == '\n') {
-                       while (AMBA_UART_FR & (1 << 5))
-                               barrier();
+       AMBA_UART_DR = c;
+}
 
-                       AMBA_UART_DR = '\r';
-               }
-               s++;
-       }
+static inline void flush(void)
+{
        while (AMBA_UART_FR & (1 << 3))
                barrier();
 }
index 43035fe..06231ed 100644 (file)
@@ -67,31 +67,28 @@ extern __attribute__((pure)) struct param_struct *params(void);
 /*
  * This does not append a newline
  */
-static void putstr(const char *s)
+static void putc(int c)
 {
        extern void ll_write_char(char *, char c, char white);
        int x,y;
-       unsigned char c;
        char *ptr;
 
        x = params->video_x;
        y = params->video_y;
 
-       while ( ( c = *(unsigned char *)s++ ) != '\0' ) {
-               if ( c == '\n' ) {
+       if (c == '\n') {
+               if (++y >= video_num_lines)
+                       y--;
+       } else if (c == '\r') {
+               x = 0;
+       } else {
+               ptr = VIDMEM + ((y*video_num_columns*params->bytes_per_char_v+x)*bytes_per_char_h);
+               ll_write_char(ptr, c, white);
+               if (++x >= video_num_columns) {
                        x = 0;
                        if ( ++y >= video_num_lines ) {
                                y--;
                        }
-               } else {
-                       ptr = VIDMEM + ((y*video_num_columns*params->bytes_per_char_v+x)*bytes_per_char_h);
-                       ll_write_char(ptr, c, white);
-                       if ( ++x >= video_num_columns ) {
-                               x = 0;
-                               if ( ++y >= video_num_lines ) {
-                                       y--;
-                               }
-                       }
                }
        }
 
@@ -99,6 +96,10 @@ static void putstr(const char *s)
        params->video_y = y;
 }
 
+static inline void flush(void)
+{
+}
+
 static void error(char *x);
 
 /*
index 4367ec0..a6f6a0e 100644 (file)
@@ -67,8 +67,7 @@ uart_rd(unsigned int reg)
  * waiting for tx to happen...
 */
 
-static void
-putc(char ch)
+static void putc(int ch)
 {
        int cpuid = S3C2410_GSTATUS1_2410;
 
@@ -77,9 +76,6 @@ putc(char ch)
        cpuid &= S3C2410_GSTATUS1_IDMASK;
 #endif
 
-       if (ch == '\n')
-               putc('\r');    /* expand newline to \r\n */
-
        if (uart_rd(S3C2410_UFCON) & S3C2410_UFCON_FIFOMODE) {
                int level;
 
@@ -101,19 +97,16 @@ putc(char ch)
        } else {
                /* not using fifos */
 
-               while ((uart_rd(S3C2410_UTRSTAT) & S3C2410_UTRSTAT_TXE) != S3C2410_UTRSTAT_TXE);
+               while ((uart_rd(S3C2410_UTRSTAT) & S3C2410_UTRSTAT_TXE) != S3C2410_UTRSTAT_TXE)
+                       barrier();
        }
 
        /* write byte to transmission register */
        uart_wr(S3C2410_UTXH, ch);
 }
 
-static void
-putstr(const char *ptr)
+static inline void flush(void)
 {
-       for (; *ptr != '\0'; ptr++) {
-               putc(*ptr);
-       }
 }
 
 #define __raw_writel(d,ad) do { *((volatile unsigned int *)(ad)) = (d); } while(0)
index 4345350..2601a77 100644 (file)
@@ -17,7 +17,7 @@
 
 #define UART(x)                (*(volatile unsigned long *)(serial_port + (x)))
 
-static void putstr( const char *s )
+static void putc(int c)
 {
        unsigned long serial_port;
 
@@ -31,19 +31,16 @@ static void putstr( const char *s )
                return;
        } while (0);
 
-       for (; *s; s++) {
-               /* wait for space in the UART's transmitter */
-               while (!(UART(UTSR1) & UTSR1_TNF));
+       /* wait for space in the UART's transmitter */
+       while (!(UART(UTSR1) & UTSR1_TNF))
+               barrier();
 
-               /* send the character out. */
-               UART(UTDR) = *s;
+       /* send the character out. */
+       UART(UTDR) = c;
+}
 
-               /* if a LF, also do CR... */
-               if (*s == 10) {
-                       while (!(UART(UTSR1) & UTSR1_TNF));
-                       UART(UTDR) = 13;
-               }
-       }
+static inline void flush(void)
+{
 }
 
 /*
index 910a8e0..7eca653 100644 (file)
@@ -9,7 +9,7 @@
 
 #define SERIAL_BASE ((volatile unsigned char *)0x400003f8)
 
-static __inline__ void putc(char c)
+static inline void putc(int c)
 {
        int t;
 
@@ -18,17 +18,8 @@ static __inline__ void putc(char c)
        while (t--);
 }
 
-/*
- * This does not append a newline
- */
-static void putstr(const char *s)
+static inline void flush(void)
 {
-       while (*s) {
-               putc(*s);
-               if (*s == '\n')
-                       putc('\r');
-               s++;
-       }
 }
 
 #ifdef DEBUG
index 2f57499..7215133 100644 (file)
 /*
  * This does not append a newline
  */
-static void putstr(const char *s)
+static inline void putc(int c)
 {
-       while (*s) {
-               while (AMBA_UART_FR & (1 << 5))
-                       barrier();
-
-               AMBA_UART_DR = *s;
+       while (AMBA_UART_FR & (1 << 5))
+               barrier();
 
-               if (*s == '\n') {
-                       while (AMBA_UART_FR & (1 << 5))
-                               barrier();
+       AMBA_UART_DR = c;
+}
 
-                       AMBA_UART_DR = '\r';
-               }
-               s++;
-       }
+static inline void flush(void)
+{
        while (AMBA_UART_FR & (1 << 3))
                barrier();
 }