diff options
| -rw-r--r-- | common/serial.c | 2 | ||||
| -rw-r--r-- | drivers/serial/lpc32xx_hsuart.c | 71 | 
2 files changed, 50 insertions, 23 deletions
| diff --git a/common/serial.c b/common/serial.c index 7b2030639..b065a99fc 100644 --- a/common/serial.c +++ b/common/serial.c @@ -73,6 +73,7 @@ serial_initfunc(p3mx_serial_initialize);  serial_initfunc(altera_jtag_serial_initialize);  serial_initfunc(altera_serial_initialize);  serial_initfunc(atmel_serial_initialize); +serial_initfunc(lpc32xx_serial_initialize);  void serial_register(struct serial_device *dev)  { @@ -124,6 +125,7 @@ void serial_initialize(void)  	altera_jtag_serial_initialize();  	altera_serial_initialize();  	atmel_serial_initialize(); +	lpc32xx_serial_initialize();  	serial_assign(default_serial_console()->name);  } diff --git a/drivers/serial/lpc32xx_hsuart.c b/drivers/serial/lpc32xx_hsuart.c index 8ce3382d8..536fd466e 100644 --- a/drivers/serial/lpc32xx_hsuart.c +++ b/drivers/serial/lpc32xx_hsuart.c @@ -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 |