diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/serial/atmel_usart.c | 11 | 
1 files changed, 10 insertions, 1 deletions
| diff --git a/drivers/serial/atmel_usart.c b/drivers/serial/atmel_usart.c index e326b2bcf..943ef70fa 100644 --- a/drivers/serial/atmel_usart.c +++ b/drivers/serial/atmel_usart.c @@ -49,17 +49,26 @@ int serial_init(void)  {  	atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_USART_BASE; +	/* +	 * Just in case: drain transmitter register +	 * 1000us is enough for baudrate >= 9600 +	 */ +	if (!(readl(&usart->csr) & USART3_BIT(TXEMPTY))) +		__udelay(1000); +  	writel(USART3_BIT(RSTRX) | USART3_BIT(RSTTX), &usart->cr);  	serial_setbrg(); -	writel(USART3_BIT(RXEN) | USART3_BIT(TXEN), &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); +	writel(USART3_BIT(RXEN) | USART3_BIT(TXEN), &usart->cr); +	/* 100us is enough for the new settings to be settled */ +	__udelay(100);  	return 0;  } |