diff options
Diffstat (limited to 'arch/sparc')
| -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 4f41b8e6a..61d059b7e 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 |