All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 1/2] arm: vf610: lpuart: fix status register handling
@ 2014-08-19 15:54 Stefan Agner
  2014-08-19 15:54 ` [U-Boot] [PATCH 2/2] arm: vf610: lpuart: disable FIFO on initializaton Stefan Agner
  2014-09-09 14:53 ` [U-Boot] [PATCH 1/2] arm: vf610: lpuart: fix status register handling Stefano Babic
  0 siblings, 2 replies; 4+ messages in thread
From: Stefan Agner @ 2014-08-19 15:54 UTC (permalink / raw)
  To: u-boot

The status register 1 (S1) is not writeable, hence we should not
write it. In order to clear the RDRF flag we only need to read
the data register.

Also, when stressing U-Boot a lot with serial input, an overflow can
occur which asserts the S1_OR flag (while not asserting the S1_RDRF
flag). To clear this flag we again just need to read the data
register, hence add this flag to the abort conditions for the while
loop.

Insert a compiler barrier to make sure reading the data register
gets executed after reading the status register.

Signed-off-by: Stefan Agner <stefan@agner.ch>
---
 drivers/serial/serial_lpuart.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/serial/serial_lpuart.c b/drivers/serial/serial_lpuart.c
index da5f9a2..96173ca 100644
--- a/drivers/serial/serial_lpuart.c
+++ b/drivers/serial/serial_lpuart.c
@@ -14,6 +14,7 @@
 
 #define US1_TDRE        (1 << 7)
 #define US1_RDRF        (1 << 5)
+#define US1_OR          (1 << 3)
 #define UC2_TE          (1 << 3)
 #define UC2_RE          (1 << 2)
 
@@ -38,14 +39,10 @@ static void lpuart_serial_setbrg(void)
 
 static int lpuart_serial_getc(void)
 {
-	u8 status;
-
-	while (!(__raw_readb(&base->us1) & US1_RDRF))
+	while (!(__raw_readb(&base->us1) & (US1_RDRF | US1_OR)))
 		WATCHDOG_RESET();
 
-	status = __raw_readb(&base->us1);
-	status |= US1_RDRF;
-	__raw_writeb(status, &base->us1);
+	barrier();
 
 	return __raw_readb(&base->ud);
 }
-- 
2.0.4

^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-09-09 14:54 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-08-19 15:54 [U-Boot] [PATCH 1/2] arm: vf610: lpuart: fix status register handling Stefan Agner
2014-08-19 15:54 ` [U-Boot] [PATCH 2/2] arm: vf610: lpuart: disable FIFO on initializaton Stefan Agner
2014-09-09 14:54   ` Stefano Babic
2014-09-09 14:53 ` [U-Boot] [PATCH 1/2] arm: vf610: lpuart: fix status register handling Stefano Babic

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.