serial: atmel_usart: Fix early debug not work in SPL
Add the uart init function to be used on both probe and the early debug uart init. For the latter, the input clock should be from CONFIG_DEBUG_UART_CLOCK. Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
3fea809b42
commit
5f29e79915
@ -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_init(usart, CONFIG_DEBUG_UART_CLOCK, CONFIG_BAUDRATE);
|
||||
}
|
||||
|
||||
static inline void _debug_uart_putc(int ch)
|
||||
|
Loading…
Reference in New Issue
Block a user