Message ID | 1315318932-21338-1-git-send-email-monstr@monstr.eu |
---|---|
State | Changes Requested |
Delegated to: | Michal Simek |
Headers | show |
Michal Simek wrote: > Add support for SERIAL MULTI for uartlite. > > Signed-off-by: Michal Simek <monstr@monstr.eu> > > --- > 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 <config.h> > +#include <common.h> > #include <asm/io.h> > - > -#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 <linux/compiler.h> > +#include <serial.h> > > #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
Dear Michal Simek, In message <1315318932-21338-1-git-send-email-monstr@monstr.eu> you wrote: > Add support for SERIAL MULTI for uartlite. > > Signed-off-by: Michal Simek <monstr@monstr.eu> > > --- > 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(-) Checkpatch says: total: 16 errors, 12 warnings, 198 lines checked Please clean up and resubmit. Thanks. Best regards, Wolfgang Denk
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 <config.h> +#include <common.h> #include <asm/io.h> - -#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 <linux/compiler.h> +#include <serial.h> #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"); + +__weak struct serial_device *default_serial_console(void) +{ +# ifdef XILINX_UARTLITE_BASEADDR + return &uartlite_serial0_device; +# endif /* XILINX_UARTLITE_BASEADDR */ +# ifdef XILINX_UARTLITE_BASEADDR1 + return &uartlite_serial1_device; +# endif /* XILINX_UARTLITE_BASEADDR1 */ +# ifdef XILINX_UARTLITE_BASEADDR2 + return &uartlite_serial2_device; +# endif /* XILINX_UARTLITE_BASEADDR2 */ +# ifdef XILINX_UARTLITE_BASEADDR3 + return &uartlite_serial3_device; +# endif /* XILINX_UARTLITE_BASEADDR3 */ } +#endif /* CONFIG_SERIAL_MULTI */ diff --git a/include/serial.h b/include/serial.h index ff1ce99..5926244 100644 --- a/include/serial.h +++ b/include/serial.h @@ -50,6 +50,13 @@ extern struct serial_device serial4_device; extern struct serial_device serial6_device; #endif +#if defined(CONFIG_XILINX_UARTLITE) +extern struct serial_device uartlite_serial0_device; +extern struct serial_device uartlite_serial1_device; +extern struct serial_device uartlite_serial2_device; +extern struct serial_device uartlite_serial3_device; +#endif + #if defined(CONFIG_S3C2410) extern struct serial_device s3c24xx_serial0_device; extern struct serial_device s3c24xx_serial1_device;
Add support for SERIAL MULTI for uartlite. Signed-off-by: Michal Simek <monstr@monstr.eu> --- 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(-)