@ -25,6 +25,7 @@
DECLARE_GLOBAL_DATA_PTR ;
# ifndef CONFIG_DM_SERIAL
static void atmel_serial_setbrg_internal ( atmel_usart3_t * usart , int id ,
int baudrate )
{
@ -66,7 +67,6 @@ static void atmel_serial_activate(atmel_usart3_t *usart)
__udelay ( 100 ) ;
}
# ifndef CONFIG_DM_SERIAL
static void atmel_serial_setbrg ( void )
{
atmel_serial_setbrg_internal ( ( atmel_usart3_t * ) CONFIG_USART_BASE ,
@ -138,12 +138,37 @@ struct atmel_serial_priv {
atmel_usart3_t * usart ;
} ;
static void _atmel_serial_set_brg ( atmel_usart3_t * usart ,
ulong usart_clk_rate , int baudrate )
{
unsigned long divisor ;
divisor = ( usart_clk_rate / 16 + baudrate / 2 ) / baudrate ;
writel ( USART3_BF ( CD , divisor ) , & usart - > brgr ) ;
}
void _atmel_serial_init ( atmel_usart3_t * usart ,
ulong usart_clk_rate , int baudrate )
{
writel ( USART3_BIT ( RXDIS ) | USART3_BIT ( TXDIS ) , & usart - > cr ) ;
writel ( ( USART3_BF ( USART_MODE , USART3_USART_MODE_NORMAL ) |
USART3_BF ( USCLKS , USART3_USCLKS_MCK ) |
USART3_BF ( CHRL , USART3_CHRL_8 ) |
USART3_BF ( PAR , USART3_PAR_NONE ) |
USART3_BF ( NBSTOP , USART3_NBSTOP_1 ) ) , & usart - > mr ) ;
_atmel_serial_set_brg ( usart , usart_clk_rate , baudrate ) ;
writel ( USART3_BIT ( RSTRX ) | USART3_BIT ( RSTTX ) , & usart - > cr ) ;
writel ( USART3_BIT ( RXEN ) | USART3_BIT ( TXEN ) , & usart - > cr ) ;
}
int atmel_serial_setbrg ( struct udevice * dev , int baudrate )
{
struct atmel_serial_priv * priv = dev_get_priv ( dev ) ;
atmel_serial_setbrg_internal ( priv - > usart , 0 /* ignored */ , baudrate ) ;
atmel_serial_activate ( priv - > usart ) ;
_atmel_serial_set_brg ( priv - > usart , get_usart_clk_rate ( 0 ) , baudrate ) ;
return 0 ;
}
@ -202,7 +227,8 @@ static int atmel_serial_probe(struct udevice *dev)
plat - > base_addr = ( uint32_t ) addr_base ;
# endif
priv - > usart = ( atmel_usart3_t * ) plat - > base_addr ;
atmel_serial_init_internal ( priv - > usart ) ;
_atmel_serial_init ( priv - > usart , get_usart_clk_rate ( 0 ) , gd - > baudrate ) ;
return 0 ;
}
@ -233,7 +259,7 @@ static inline void _debug_uart_init(void)
{
atmel_usart3_t * usart = ( atmel_usart3_t * ) CONFIG_DEBUG_UART_BASE ;
atmel_serial_setbrg_ internal ( usart , 0 , CONFIG_BAUDRATE ) ;
_ atmel_serial_ini t( usart , CONFIG_DEBUG_UART_CLOCK , CONFIG_BAUDRATE ) ;
}
static inline void _debug_uart_putc ( int ch )