|
@@ -22,12 +22,14 @@
|
|
|
#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
|