From mboxrd@z Thu Jan 1 00:00:00 1970 From: Michal Simek Date: Tue, 13 Sep 2011 16:15:11 +0200 Subject: [U-Boot] [PATCH v2] serial: uartlite: Support for SERIAL_MULTI In-Reply-To: <1315318932-21338-1-git-send-email-monstr@monstr.eu> References: <1315318932-21338-1-git-send-email-monstr@monstr.eu> Message-ID: <4E6F656F.1030902@monstr.eu> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Michal Simek wrote: > Add support for SERIAL MULTI for uartlite. > > Signed-off-by: Michal Simek > > --- > v2: Use in/out_be32 functions > --- > common/serial.c | 14 ++++ > drivers/serial/serial_xuartlite.c | 137 ++++++++++++++++++++++++++++++++----- > include/serial.h | 7 ++ > 3 files changed, 140 insertions(+), 18 deletions(-) > > diff --git a/common/serial.c b/common/serial.c > index 995d268..df02fa5 100644 > --- a/common/serial.c > +++ b/common/serial.c > @@ -108,6 +108,20 @@ void serial_initialize (void) > #if defined(CONFIG_SYS_BFIN_UART) > serial_register_bfin_uart(); > #endif > +#if defined(CONFIG_XILINX_UARTLITE) > +# ifdef XILINX_UARTLITE_BASEADDR > + serial_register(&uartlite_serial0_device); > +# endif /* XILINX_UARTLITE_BASEADDR */ > +# ifdef XILINX_UARTLITE_BASEADDR1 > + serial_register(&uartlite_serial1_device); > +# endif /* XILINX_UARTLITE_BASEADDR1 */ > +# ifdef XILINX_UARTLITE_BASEADDR2 > + serial_register(&uartlite_serial2_device); > +# endif /* XILINX_UARTLITE_BASEADDR2 */ > +# ifdef XILINX_UARTLITE_BASEADDR3 > + serial_register(&uartlite_serial3_device); > +# endif /* XILINX_UARTLITE_BASEADDR3 */ > +#endif /* CONFIG_XILINX_UARTLITE */ > serial_assign (default_serial_console ()->name); > } > > diff --git a/drivers/serial/serial_xuartlite.c b/drivers/serial/serial_xuartlite.c > index 00d0eaa..948d952 100644 > --- a/drivers/serial/serial_xuartlite.c > +++ b/drivers/serial/serial_xuartlite.c > @@ -25,20 +25,75 @@ > */ > > #include > +#include > #include > - > -#define RX_FIFO_OFFSET 0 /* receive FIFO, read only */ > -#define TX_FIFO_OFFSET 4 /* transmit FIFO, write only */ > -#define STATUS_REG_OFFSET 8 /* status register, read only */ > +#include > +#include > > #define SR_TX_FIFO_FULL 0x08 /* transmit FIFO full */ > #define SR_RX_FIFO_VALID_DATA 0x01 /* data in receive FIFO */ > #define SR_RX_FIFO_FULL 0x02 /* receive FIFO full */ > > -#define UARTLITE_STATUS (CONFIG_SERIAL_BASE + STATUS_REG_OFFSET) > -#define UARTLITE_TX_FIFO (CONFIG_SERIAL_BASE + TX_FIFO_OFFSET) > -#define UARTLITE_RX_FIFO (CONFIG_SERIAL_BASE + RX_FIFO_OFFSET) > +struct uartlite { > + u32 rx_fifo; > + u32 tx_fifo; > + u32 status; > +}; > + > +static struct uartlite *userial_ports[4] = { > +#ifdef XILINX_UARTLITE_BASEADDR > + (struct uartlite *)XILINX_UARTLITE_BASEADDR, > +#else > + NULL, > +#endif > +#ifdef XILINX_UARTLITE_BASEADDR1 > + (struct uartlite *)XILINX_UARTLITE_BASEADDR1, > +#else > + NULL, > +#endif > +#ifdef XILINX_UARTLITE_BASEADDR2 > + (struct uartlite *)XILINX_UARTLITE_BASEADDR2, > +#else > + NULL, > +#endif > +#ifdef XILINX_UARTLITE_BASEADDR3 > + (struct uartlite *)XILINX_UARTLITE_BASEADDR3 > +#else > + NULL > +#endif > +}; > + > +void uartlite_serial_putc(const char c, const int port) > +{ > + struct uartlite *regs = userial_ports[port]; > + if (c == '\n') > + uartlite_serial_putc('\r', port); > + while (in_be32(®s->status) & SR_TX_FIFO_FULL) > + ; > + out_be32(®s->tx_fifo, c & 0xff); > +} > + > +void uartlite_serial_puts(const char * s, const int port) > +{ > + while (*s) > + uartlite_serial_putc(*s++, port); > +} > + > +int uartlite_serial_getc(const int port) > +{ > + struct uartlite *regs = userial_ports[port]; > + while (!(in_be32(®s->status) & SR_RX_FIFO_VALID_DATA)) > + ; > + return in_be32(®s->rx_fifo) & 0xff; > +} > + > +int uartlite_serial_tstc(const int port) > +{ > + struct uartlite *regs = userial_ports[port]; > + return in_be32(®s->status) & SR_RX_FIFO_VALID_DATA; > +} > > +#if !defined(CONFIG_SERIAL_MULTI) > int serial_init(void) > { > /* FIXME: Nothing for now. We should initialize fifo, etc */ > @@ -52,26 +107,72 @@ void serial_setbrg(void) > > void serial_putc(const char c) > { > - if (c == '\n') > - serial_putc('\r'); > - while (in_be32((u32 *) UARTLITE_STATUS) & SR_TX_FIFO_FULL); > - out_be32((u32 *) UARTLITE_TX_FIFO, (unsigned char) (c & 0xff)); > + uartlite_serial_putc(c, 0); > } > > -void serial_puts(const char * s) > +void serial_puts(const char *s) > { > - while (*s) { > - serial_putc(*s++); > - } > + uartlite_serial_puts(s, 0); > } > > int serial_getc(void) > { > - while (!(in_be32((u32 *) UARTLITE_STATUS) & SR_RX_FIFO_VALID_DATA)); > - return in_be32((u32 *) UARTLITE_RX_FIFO) & 0xff; > + return uartlite_serial_getc(0); > } > > int serial_tstc(void) > { > - return (in_be32((u32 *) UARTLITE_STATUS) & SR_RX_FIFO_VALID_DATA); > + return uartlite_serial_tstc(0); > +} > +#endif > + > +#if defined(CONFIG_SERIAL_MULTI) > +/* Multi serial device functions */ > +#define DECLARE_ESERIAL_FUNCTIONS(port) \ > + int userial##port##_init (void) {return(0);}\ > + void userial##port##_setbrg (void) {}\ > + int userial##port##_getc (void) {return uartlite_serial_getc(port);}\ > + int userial##port##_tstc (void) {return uartlite_serial_tstc(port);}\ > + void userial##port##_putc (const char c) {uartlite_serial_putc(c, port);}\ > + void userial##port##_puts (const char *s) {uartlite_serial_puts(s, port);} > + > +/* Serial device descriptor */ > +#define INIT_ESERIAL_STRUCTURE(port,name) {\ > + name,\ > + userial##port##_init,\ > + NULL,\ > + userial##port##_setbrg,\ > + userial##port##_getc,\ > + userial##port##_tstc,\ > + userial##port##_putc,\ > + userial##port##_puts, } > + > +DECLARE_ESERIAL_FUNCTIONS(0); > +struct serial_device uartlite_serial0_device = > + INIT_ESERIAL_STRUCTURE(0,"ttyUL0"); > +DECLARE_ESERIAL_FUNCTIONS(1); > +struct serial_device uartlite_serial1_device = > + INIT_ESERIAL_STRUCTURE(1,"ttyUL1"); > +DECLARE_ESERIAL_FUNCTIONS(2); > +struct serial_device uartlite_serial2_device = > + INIT_ESERIAL_STRUCTURE(2,"ttyUL2"); > +DECLARE_ESERIAL_FUNCTIONS(3); > +struct serial_device uartlite_serial3_device = > + INIT_ESERIAL_STRUCTURE(3,"ttyUL3"); Here are some coding style violations. It is fixed in the next version. Michal -- Michal Simek, Ing. (M.Eng) w: www.monstr.eu p: +42-0-721842854 Maintainer of Linux kernel 2.6 Microblaze Linux - http://www.monstr.eu/fdt/ Microblaze U-BOOT custodian