diff options
author | Stefan Agner <stefan@agner.ch> | 2015-01-30 15:43:03 +0100 |
---|---|---|
committer | Stefan Agner <stefan.agner@toradex.com> | 2015-01-30 16:37:17 +0100 |
commit | 7207703f2e15262a94c0176a23fd17c8c64747c0 (patch) | |
tree | 12b025e4158d0934809acff1a8687832e0d44f53 | |
parent | 5c9c1b41d2c9c7062b70adaaf899205e89c4ef84 (diff) |
tty: serial: fsl_lpuart: clear receive flag on FIFO flush
When the receiver was enabled during startup, a character could
have been in the FIFO when the UART get initially used. The
driver configures the (receive) watermark level, and flushes the
FIFO. However, the receive flag (RDRF) could still be set at that
stage (as mentioned in the register description of UARTx_RWFIFO).
This leads to an interrupt which won't be handled properly since
the receive interrupt function lpuart_rxint checks the FIFO state,
which is empty at that point.
Fix this situation by explicitly read the status register, which
leads to clearing of the RDRF flag. Due to the flush just after
the status flag read, a explicit data read seems not to be
required.
-rw-r--r-- | drivers/tty/serial/fsl_lpuart.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c index 6c154747d23f..ef69452c1fbc 100644 --- a/drivers/tty/serial/fsl_lpuart.c +++ b/drivers/tty/serial/fsl_lpuart.c @@ -921,6 +921,9 @@ static void lpuart_setup_watermark(struct lpuart_port *sport) writeb(val | UARTPFIFO_TXFE | UARTPFIFO_RXFE, sport->port.membase + UARTPFIFO); + /* explicitly clear RDRF */ + readb(sport->port.membase + UARTSR1); + /* flush Tx and Rx FIFO */ writeb(UARTCFIFO_TXFLUSH | UARTCFIFO_RXFLUSH, sport->port.membase + UARTCFIFO); |