Patchwork [U-Boot,V3] AT91: Small fix on AT91 USART initialization code

login
register
mail settings
Submitter Xu, Hong
Date Aug. 2, 2011, 11:05 a.m.
Message ID <1312283104-15060-1-git-send-email-hong.xu@atmel.com>
Download mbox | patch
Permalink /patch/107896/
State Accepted
Commit 1f4faedd51ee72a57afb9edba2d71ba01a2ec20e
Delegated to: Reinhard Meyer
Headers show

Comments

Xu, Hong - Aug. 2, 2011, 11:05 a.m.
Before reset dbgu transmitter, we just wait TXEMPTY to drain the
transmitter register(Just in case). 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.xu@atmel.com>
---
Changes since V2,
  Using __udelay to avoid potential endless loop

 drivers/serial/atmel_usart.c |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)
Reinhard Meyer - Aug. 2, 2011, 12:29 p.m.
Dear Hong Xu,
> Before reset dbgu transmitter, we just wait TXEMPTY to drain the
> transmitter register(Just in case). 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.xu@atmel.com>
> ---
> Changes since V2,
>   Using __udelay to avoid potential endless loop
> 
>  drivers/serial/atmel_usart.c |   11 ++++++++++-
>  1 files changed, 10 insertions(+), 1 deletions(-)
Applied to u-boot-atmel/next.
Thanks,
Reinhard

Patch

diff --git a/drivers/serial/atmel_usart.c b/drivers/serial/atmel_usart.c
index e326b2b..943ef70 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;
 }