diff options
author | Allen Yan <yanwei@marvell.com> | 2017-10-13 12:01:52 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-10-20 15:20:06 +0300 |
commit | 2ff23c48028a77114757438f9a480c453f68d4b0 (patch) | |
tree | 70ca1e280798a869cd6b35a65f54a4501186d1b9 /drivers/tty/serial/mvebu-uart.c | |
parent | 68a0db1d7da20fc99b64debddf71e7c6d1b9e334 (diff) | |
download | linux-2ff23c48028a77114757438f9a480c453f68d4b0.tar.xz |
serial: mvebu-uart: clear state register before IRQ request
When receiving data on RX pin before ->uart_startup() is called, some
error bits in the state register could be set up (like BRK_DET).
This is harmless when using only the standard UART (error bits are
read-only), but may procude an endless loop once in the extended UART
RX interrupt handler (error bits must be cleared).
Clear the status register in ->uart_startup() to avoid this situation.
Signed-off-by: Allen Yan <yanwei@marvell.com>
Signed-off-by: Miquel Raynal <miquel.raynal@free-electrons.com>
Reviewed-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/serial/mvebu-uart.c')
-rw-r--r-- | drivers/tty/serial/mvebu-uart.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/tty/serial/mvebu-uart.c b/drivers/tty/serial/mvebu-uart.c index 5767196ec0a9..6bd0c40008bb 100644 --- a/drivers/tty/serial/mvebu-uart.c +++ b/drivers/tty/serial/mvebu-uart.c @@ -322,6 +322,12 @@ static int mvebu_uart_startup(struct uart_port *port) writel(CTRL_TXFIFO_RST | CTRL_RXFIFO_RST, port->membase + UART_CTRL(port)); udelay(1); + + /* Clear the error bits of state register before IRQ request */ + ret = readl(port->membase + UART_STAT); + ret |= STAT_BRK_ERR; + writel(ret, port->membase + UART_STAT); + writel(CTRL_BRK_INT, port->membase + UART_CTRL(port)); ctl = readl(port->membase + UART_INTR(port)); |