]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/serial/lpc32xx_hsuart.c
serial: arm: Implement CONFIG_SERIAL_MULTI into lpc32xx serial driver
[karo-tx-uboot.git] / drivers / serial / lpc32xx_hsuart.c
index 8ce3382d8690aa9c648ecada2852f0857c23cd5b..536fd466ed0a2cf92f7b192cfa273bb1a871d3a5 100644 (file)
 #include <asm/arch/clk.h>
 #include <asm/arch/uart.h>
 #include <asm/io.h>
+#include <serial.h>
+#include <linux/compiler.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
 static struct hsuart_regs *hsuart = (struct hsuart_regs *)HS_UART_BASE;
 
-static void lpc32xx_hsuart_set_baudrate(void)
+static void lpc32xx_serial_setbrg(void)
 {
        u32 div;
 
@@ -39,7 +41,7 @@ static void lpc32xx_hsuart_set_baudrate(void)
        writel(div, &hsuart->rate);
 }
 
-static int lpc32xx_hsuart_getc(void)
+static int lpc32xx_serial_getc(void)
 {
        while (!(readl(&hsuart->level) & HSUART_LEVEL_RX))
                /* NOP */;
@@ -47,7 +49,7 @@ static int lpc32xx_hsuart_getc(void)
        return readl(&hsuart->rx) & HSUART_RX_DATA;
 }
 
-static void lpc32xx_hsuart_putc(const char c)
+static void lpc32xx_serial_putc(const char c)
 {
        writel(c, &hsuart->tx);
 
@@ -56,7 +58,7 @@ static void lpc32xx_hsuart_putc(const char c)
                /* NOP */;
 }
 
-static int lpc32xx_hsuart_tstc(void)
+static int lpc32xx_serial_tstc(void)
 {
        if (readl(&hsuart->level) & HSUART_LEVEL_RX)
                return 1;
@@ -64,49 +66,72 @@ static int lpc32xx_hsuart_tstc(void)
        return 0;
 }
 
-static void lpc32xx_hsuart_init(void)
+static int lpc32xx_serial_init(void)
 {
-       lpc32xx_hsuart_set_baudrate();
+       lpc32xx_serial_setbrg();
 
        /* Disable hardware RTS and CTS flow control, set up RX and TX FIFO */
        writel(HSUART_CTRL_TMO_16 | HSUART_CTRL_HSU_OFFSET(20) |
               HSUART_CTRL_HSU_RX_TRIG_32 | HSUART_CTRL_HSU_TX_TRIG_0,
               &hsuart->ctrl);
+       return 0;
 }
 
-void serial_setbrg(void)
+static void lpc32xx_serial_puts(const char *s)
 {
-       return lpc32xx_hsuart_set_baudrate();
+       while (*s)
+               serial_putc(*s++);
 }
 
-void serial_putc(const char c)
+#ifdef CONFIG_SERIAL_MULTI
+static struct serial_device lpc32xx_serial_drv = {
+       .name   = "lpc32xx_serial",
+       .start  = lpc32xx_serial_init,
+       .stop   = NULL,
+       .setbrg = lpc32xx_serial_setbrg,
+       .putc   = lpc32xx_serial_putc,
+       .puts   = lpc32xx_serial_puts,
+       .getc   = lpc32xx_serial_getc,
+       .tstc   = lpc32xx_serial_tstc,
+};
+
+void lpc32xx_serial_initialize(void)
 {
-       lpc32xx_hsuart_putc(c);
+       serial_register(&lpc32xx_serial_drv);
+}
 
-       /* If \n, also do \r */
-       if (c == '\n')
-               lpc32xx_hsuart_putc('\r');
+__weak struct serial_device *default_serial_console(void)
+{
+       return &lpc32xx_serial_drv;
+}
+#else
+int serial_init(void)
+{
+       return lpc32xx_serial_init();
 }
 
-int serial_getc(void)
+void serial_setbrg(void)
 {
-       return lpc32xx_hsuart_getc();
+       lpc32xx_serial_setbrg();
 }
 
-void serial_puts(const char *s)
+void serial_putc(const char c)
 {
-       while (*s)
-               serial_putc(*s++);
+       lpc32xx_serial_putc(c);
 }
 
-int serial_tstc(void)
+void serial_puts(const char *s)
 {
-       return lpc32xx_hsuart_tstc();
+       lpc32xx_serial_puts(s);
 }
 
-int serial_init(void)
+int serial_getc(void)
 {
-       lpc32xx_hsuart_init();
+       return lpc32xx_serial_getc();
+}
 
-       return 0;
+int serial_tstc(void)
+{
+       return lpc32xx_serial_tstc();
 }
+#endif