serial: uartlite: Support for SERIAL_MULTI
Michal Simek
maintainerPATCH v2 1/1 serial: uartlite: Support for SERIAL_MULTI
Add support for SERIAL MULTI for uartlite.
---
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(-)
common/serial.c +14 -0
@@ -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); }
drivers/serial/serial_xuartlite.c +119 -18
165 lines not on this page · raw message
include/serial.h +7 -0
@@ -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;
Signature · 1 line
1.5.5.6
Michal Simek
maintainerPATCH 1/1 microblaze: Enable SERIAL_MULTI
Enable support for SERIAL_MULTI.
Microblaze can use uart16550 and uartlite drivers.
--- arch/microblaze/lib/board.c | 4 ++++ include/configs/microblaze-generic.h | 2 ++ include/serial.h | 2 +- 3 files changed, 7 insertions(+), 1 deletions(-)
arch/microblaze/lib/board.c +4 -0
@@ -31,6 +31,7 @@#include <watchdog.h> #include <stdio_dev.h> #include <net.h> +#include <serial.h> DECLARE_GLOBAL_DATA_PTR ;
@@ -111,6 +112,9 @@ void board_init (void) monitor_flash_len = __end - __text_start; +#ifdef CONFIG_SERIAL_MULTI +serial_initialize (); +#endif /* * The Malloc area is immediately below the monitor copy in DRAM * aka CONFIG_SYS_MONITOR_BASE - Note there is no need for reloc_off
include/configs/microblaze-generic.h +2 -0
@@ -31,6 +31,8 @@#define CONFIG_MICROBLAZE 1#define MICROBLAZE_V5 1 +#define CONFIG_SERIAL_MULTI 1 +/* uart */ #ifdef XILINX_UARTLITE_BASEADDR # define CONFIG_XILINX_UARTLITE
include/serial.h +1 -1
@@ -31,7 +31,7 @@ extern struct serial_device * default_serial_console (void);defined (CONFIG_MB86R0x) ||defined (CONFIG_MPC5xxx) || \defined (CONFIG_MPC83xx) ||defined (CONFIG_MPC85xx) || \defined (CONFIG_MPC86xx) ||defined (CONFIG_SYS_SC520 ) || \ - defined(CONFIG_TEGRA2) + defined(CONFIG_TEGRA2) || defined(CONFIG_MICROBLAZE)extern struct serial_device serial0_device;extern struct serial_device serial1_device;#if defined(CONFIG_SYS_NS16550_SERIAL )
Signature · 1 line
1.5.5.6
Michal Simek
maintainerPATCH v2 1/1 serial: uartlite: Support for SERIAL_MULTI
In reply to Michal SimekQuoted 181 lines · Michal Simek
Add support for SERIAL MULTI for uartlite.
Signed-off-by Michal Simek <[email protected]>---
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(-)common/serial.c +14
-0@@ -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); }drivers/serial/serial_xuartlite.c +93
-18@@ -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 =
drivers/serial/serial_xuartlite.c void serial_setbrg(void) · line 161
Quoted 10 lines
drivers/serial/serial_xuartlite.c +10
-0+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
Signature · 4 lines
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
PATCH v2 1/1 serial: uartlite: Support for SERIAL_MULTI
In reply to Michal SimekDear Michal Simek,
Quoted 11 lines · In message <[email protected]> you wrote:
Add support for SERIAL MULTI for uartlite.
Signed-off-by Michal Simek <[email protected]>---
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
Signature · 5 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de Don't tell me how hard you work. Tell me how much you get done. - James J. Ling