Before reset dbgu transmitter, we just wait TXEMPTY to drain the
transmitter register. If not doing this, we may sometimes see several
weird characters from DBGU.

A short delay is also added to make sure the new serial settings are
settled.

Signed-off-by: Hong Xu <hong...@atmel.com>
---
 drivers/serial/atmel_usart.c |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/drivers/serial/atmel_usart.c b/drivers/serial/atmel_usart.c
index e326b2b..0d5d254 100644
--- a/drivers/serial/atmel_usart.c
+++ b/drivers/serial/atmel_usart.c
@@ -49,17 +49,23 @@ int serial_init(void)
 {
        atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_USART_BASE;
 
+       /* Just in case: drain transmitter register */
+       while (!(readl(&usart->csr) & USART3_BIT(TXEMPTY)))
+               ;
+
        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);
+       /* __udelay(100) is enough for the new settings to be settled */
+       __udelay(100);
 
        return 0;
 }
-- 
1.7.3.3

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to