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

Vladimir Zapolskiy vz at mleia.com
Tue Sep 18 00:28:42 CEST 2012


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 at denx.de>
> Cc: Marek Vasut <marek.vasut at gmail.com>
> Cc: Tom Rini <trini at ti.com>
> Cc: Vladimir Zapolskiy <vz at mleia.com>

Acked-by: Vladimir Zapolskiy <vz at 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


More information about the U-Boot mailing list