@ -22,12 +22,14 @@
# include <asm/arch/clk.h>
# include <asm/arch/uart.h>
# include <asm/io.h>
# include <serial.h>
# include <linux/compiler.h>
DECLARE_GLOBAL_DATA_PTR ;
static struct hsuart_regs * hsuart = ( struct hsuart_regs * ) HS_UART_BASE ;
static void lpc32xx_hsuart_set_baudrate ( void )
static void lpc32xx_serial_setbrg ( void )
{
u32 div ;
@ -39,7 +41,7 @@ static void lpc32xx_hsuart_set_baudrate(void)
writel ( div , & hsuart - > rate ) ;
}
static int lpc32xx_hsuart _getc ( void )
static int lpc32xx_serial _getc ( void )
{
while ( ! ( readl ( & hsuart - > level ) & HSUART_LEVEL_RX ) )
/* NOP */ ;
@ -47,7 +49,7 @@ static int lpc32xx_hsuart_getc(void)
return readl ( & hsuart - > rx ) & HSUART_RX_DATA ;
}
static void lpc32xx_hsuart _putc ( const char c )
static void lpc32xx_serial _putc ( const char c )
{
writel ( c , & hsuart - > tx ) ;
@ -56,7 +58,7 @@ static void lpc32xx_hsuart_putc(const char c)
/* NOP */ ;
}
static int lpc32xx_hsuart _tstc ( void )
static int lpc32xx_serial _tstc ( void )
{
if ( readl ( & hsuart - > level ) & HSUART_LEVEL_RX )
return 1 ;
@ -64,49 +66,72 @@ static int lpc32xx_hsuart_tstc(void)
return 0 ;
}
static void lpc32xx_hsuart _init( void )
static int lpc32xx_serial _init( void )
{
lpc32xx_hsuart_set_baudrate ( ) ;
lpc32xx_serial_setbrg ( ) ;
/* Disable hardware RTS and CTS flow control, set up RX and TX FIFO */
writel ( HSUART_CTRL_TMO_16 | HSUART_CTRL_HSU_OFFSET ( 20 ) |
HSUART_CTRL_HSU_RX_TRIG_32 | HSUART_CTRL_HSU_TX_TRIG_0 ,
& hsuart - > ctrl ) ;
return 0 ;
}
void serial_setbrg ( void )
static void lpc32xx_serial_puts ( const char * s )
{
return lpc32xx_hsuart_set_baudrate ( ) ;
while ( * s )
serial_putc ( * s + + ) ;
}
void serial_putc ( const char c )
# ifdef CONFIG_SERIAL_MULTI
static struct serial_device lpc32xx_serial_drv = {
. name = " lpc32xx_serial " ,
. start = lpc32xx_serial_init ,
. stop = NULL ,
. setbrg = lpc32xx_serial_setbrg ,
. putc = lpc32xx_serial_putc ,
. puts = lpc32xx_serial_puts ,
. getc = lpc32xx_serial_getc ,
. tstc = lpc32xx_serial_tstc ,
} ;
void lpc32xx_serial_initialize ( void )
{
lpc32xx_hsuart_putc ( c ) ;
serial_register ( & lpc32xx_serial_drv ) ;
}
/* If \n, also do \r */
if ( c = = ' \n ' )
lpc32xx_hsuart_putc ( ' \r ' ) ;
__weak struct serial_device * default_serial_console ( void )
{
return & lpc32xx_serial_drv ;
}
# else
int serial_init ( void )
{
return lpc32xx_serial_init ( ) ;
}
int serial_getc ( void )
void serial_setbrg ( void )
{
return lpc32xx_hsuart_getc ( ) ;
lpc32xx_serial_setbrg ( ) ;
}
void serial_puts ( const char * s )
void serial_putc ( const char c )
{
while ( * s )
serial_putc ( * s + + ) ;
lpc32xx_serial_putc ( c ) ;
}
int serial_tstc ( void )
void serial_puts ( const char * s )
{
return lpc32xx_hsuart_tstc ( ) ;
lpc32xx_serial_puts ( s ) ;
}
int serial_init ( void )
int serial_getc ( void )
{
lpc32xx_hsuart_init ( ) ;
return lpc32xx_serial_getc ( ) ;
}
return 0 ;
int serial_tstc ( void )
{
return lpc32xx_serial_tstc ( ) ;
}
# endif