diff options
Diffstat (limited to 'arch/sparc/cpu/leon2/serial.c')
-rw-r--r-- | arch/sparc/cpu/leon2/serial.c | 83 |
1 files changed, 69 insertions, 14 deletions
diff --git a/arch/sparc/cpu/leon2/serial.c b/arch/sparc/cpu/leon2/serial.c index 4f41b8e..61d059b 100644 --- a/arch/sparc/cpu/leon2/serial.c +++ b/arch/sparc/cpu/leon2/serial.c @@ -26,6 +26,8 @@ #include <common.h> #include <asm/processor.h> #include <asm/leon.h> +#include <serial.h> +#include <linux/compiler.h> DECLARE_GLOBAL_DATA_PTR; @@ -39,7 +41,7 @@ DECLARE_GLOBAL_DATA_PTR; #define READ_DWORD(var) SPARC_NOCACHE_READ_DWORD((unsigned int)&(var)) #endif -int serial_init(void) +static int leon2_serial_init(void) { LEON2_regs *leon2 = (LEON2_regs *) LEON2_PREGS; LEON2_Uart_regs *regs; @@ -72,15 +74,7 @@ int serial_init(void) return 0; } -void serial_putc(const char c) -{ - if (c == '\n') - serial_putc_raw('\r'); - - serial_putc_raw(c); -} - -void serial_putc_raw(const char c) +static void leon2_serial_putc_raw(const char c) { LEON2_regs *leon2 = (LEON2_regs *) LEON2_PREGS; LEON2_Uart_regs *regs; @@ -103,14 +97,22 @@ void serial_putc_raw(const char c) #endif } -void serial_puts(const char *s) +static void leon2_serial_putc(const char c) +{ + if (c == '\n') + leon2_serial_putc_raw('\r'); + + leon2_serial_putc_raw(c); +} + +static void leon2_serial_puts(const char *s) { while (*s) { serial_putc(*s++); } } -int serial_getc(void) +static int leon2_serial_getc(void) { LEON2_regs *leon2 = (LEON2_regs *) LEON2_PREGS; LEON2_Uart_regs *regs; @@ -128,7 +130,7 @@ int serial_getc(void) return READ_WORD(regs->UART_Channel); } -int serial_tstc(void) +static int leon2_serial_tstc(void) { LEON2_regs *leon2 = (LEON2_regs *) LEON2_PREGS; LEON2_Uart_regs *regs; @@ -143,7 +145,7 @@ int serial_tstc(void) } /* set baud rate for uart */ -void serial_setbrg(void) +static void leon2_serial_setbrg(void) { /* update baud rate settings, read it from gd->baudrate */ unsigned int scaler; @@ -163,3 +165,56 @@ void serial_setbrg(void) regs->UART_Scaler = scaler; } } + +#ifdef CONFIG_SERIAL_MULTI +static struct serial_device leon2_serial_drv = { + .name = "leon2_serial", + .start = leon2_serial_init, + .stop = NULL, + .setbrg = leon2_serial_setbrg, + .putc = leon2_serial_putc, + .puts = leon2_serial_puts, + .getc = leon2_serial_getc, + .tstc = leon2_serial_tstc, +}; + +void leon2_serial_initialize(void) +{ + serial_register(&leon2_serial_drv); +} + +__weak struct serial_device *default_serial_console(void) +{ + return &leon2_serial_drv; +} +#else +int serial_init(void) +{ + return leon2_serial_init(); +} + +void serial_setbrg(void) +{ + leon2_serial_setbrg(); +} + +void serial_putc(const char c) +{ + leon2_serial_putc(c); +} + +void serial_puts(const char *s) +{ + leon2_serial_puts(s); +} + +int serial_getc(void) +{ + return leon2_serial_getc(); +} + +int serial_tstc(void) +{ + return leon2_serial_tstc(); +} +#endif |