
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