From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vladimir Zapolskiy Date: Tue, 18 Sep 2012 01:28:42 +0300 Subject: [U-Boot] [PATCH 42/71] serial: arm: Implement CONFIG_SERIAL_MULTI into lpc32xx serial driver In-Reply-To: <1347837696-3192-43-git-send-email-marex@denx.de> References: <1347837696-3192-1-git-send-email-marex@denx.de> <1347837696-3192-43-git-send-email-marex@denx.de> Message-ID: <5057A41A.3050207@mleia.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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 > Cc: Marek Vasut > Cc: Tom Rini > Cc: Vladimir Zapolskiy Acked-by: Vladimir Zapolskiy 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 > #include > #include > +#include > +#include > > 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