#include <config.h>
 #include <common.h>
 #include <asm/au1x00.h>
+#include <serial.h>
+#include <linux/compiler.h>
 
 /******************************************************************************
 *
 * RETURNS: N/A
 */
 
-int serial_init (void)
+static int au1x00_serial_init(void)
 {
        volatile u32 *uart_fifoctl = (volatile u32*)(UART0_ADDR+UART_FCR);
        volatile u32 *uart_enable = (volatile u32*)(UART0_ADDR+UART_ENABLE);
 }
 
 
-void serial_setbrg (void)
+static void au1x00_serial_setbrg(void)
 {
        volatile u32 *uart_clk = (volatile u32*)(UART0_ADDR+UART_CLK);
        volatile u32 *uart_lcr = (volatile u32*)(UART0_ADDR+UART_LCR);
        *uart_lcr = UART_LCR_WLEN8;
 }
 
-void serial_putc (const char c)
+static void au1x00_serial_putc(const char c)
 {
        volatile u32 *uart_lsr = (volatile u32*)(UART0_ADDR+UART_LSR);
        volatile u32 *uart_tx = (volatile u32*)(UART0_ADDR+UART_TX);
 
-       if (c == '\n') serial_putc ('\r');
+       if (c == '\n')
+               au1x00_serial_putc('\r');
 
        /* Wait for fifo to shift out some bytes */
        while((*uart_lsr&UART_LSR_THRE)==0);
        *uart_tx = (u32)c;
 }
 
-void serial_puts (const char *s)
+static void au1x00_serial_puts(const char *s)
 {
        while (*s)
-       {
-               serial_putc (*s++);
-       }
+               serial_putc(*s++);
 }
 
-int serial_getc (void)
+static int au1x00_serial_getc(void)
 {
        volatile u32 *uart_rx = (volatile u32*)(UART0_ADDR+UART_RX);
        char c;
        return c;
 }
 
-int serial_tstc (void)
+static int au1x00_serial_tstc(void)
 {
        volatile u32 *uart_lsr = (volatile u32*)(UART0_ADDR+UART_LSR);
 
        }
        return 0;
 }
+
+#ifdef CONFIG_SERIAL_MULTI
+static struct serial_device au1x00_serial_drv = {
+       .name   = "au1x00_serial",
+       .start  = au1x00_serial_init,
+       .stop   = NULL,
+       .setbrg = au1x00_serial_setbrg,
+       .putc   = au1x00_serial_putc,
+       .puts   = au1x00_serial_puts,
+       .getc   = au1x00_serial_getc,
+       .tstc   = au1x00_serial_tstc,
+};
+
+void au1x00_serial_initialize(void)
+{
+       serial_register(&au1x00_serial_drv);
+}
+
+__weak struct serial_device *default_serial_console(void)
+{
+       return &au1x00_serial_drv;
+}
+#else
+int serial_init(void)
+{
+       return au1x00_serial_init();
+}
+
+void serial_setbrg(void)
+{
+       au1x00_serial_setbrg();
+}
+
+void serial_putc(const char c)
+{
+       au1x00_serial_putc(c);
+}
+
+void serial_puts(const char *s)
+{
+       au1x00_serial_puts(s);
+}
+
+int serial_getc(void)
+{
+       return au1x00_serial_getc();
+}
+
+int serial_tstc(void)
+{
+       return au1x00_serial_tstc();
+}
+#endif