[U-Boot] [PATCH 42/71] serial: arm: Implement CONFIG_SERIAL_MULTI into lpc32xx serial driver

Vladimir Zapolskiy
2012-09-17T22:28:42Z

On 17.09.2012 02:21, Marek Vasut wrote:
> Implement support for CONFIG_SERIAL_MULTI into lpc32xx serial driver.
> This driver was so far only usable directly, but this patch also adds
> support for the multi method. This allows using more than one serial
> driver alongside the lpc32xx driver. Also, add a weak implementation
> of default_serial_console() returning this driver.
>
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Marek Vasut <marek.vasut@gmail.com>
> Cc: Tom Rini <trini@ti.com>
> Cc: Vladimir Zapolskiy <vz@mleia.com>

Acked-by: Vladimir Zapolskiy <vz@mleia.com>

Thanks,
Vladimir

> ---
> common/serial.c | 2 ++
> drivers/serial/lpc32xx_hsuart.c | 71 ++++++++++++++++++++++++++-------------
> 2 files changed, 50 insertions(+), 23 deletions(-)
>
> diff --git a/common/serial.c b/common/serial.c
> index b880303..8bc26d8 100644
> --- a/common/serial.c
> +++ b/common/serial.c
> @@ -72,6 +72,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)
> {
> @@ -122,6 +123,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 8ce3382..536fd46 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