]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
serial: stm32: fix FIFO flush in startup and set_termios
authorErwan Le Ray <erwan.leray@foss.st.com>
Thu, 4 Mar 2021 16:23:05 +0000 (17:23 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 May 2021 08:49:36 +0000 (10:49 +0200)
[ Upstream commit 315e2d8a125ad77a1bc28f621162713f3e7aef48 ]

Fifo flush set USART_RQR register by calling stm32_usart_set_bits
routine (Read/Modify/Write). USART_RQR register is a write only
register. So, read before write isn't correct / relevant to flush
the FIFOs.
Replace stm32_usart_set_bits call by writel_relaxed.

Fixes: 84872dc448fe ("serial: stm32: add RX and TX FIFO flush")
Signed-off-by: Erwan Le Ray <erwan.leray@foss.st.com>
Link: https://lore.kernel.org/r/20210304162308.8984-11-erwan.leray@foss.st.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/tty/serial/stm32-usart.c

index a6295897c537997136d5a764ec373a375dd34b5b..6788fb3af6cb98026f1bd0f7cbb72f29972d5e0c 100644 (file)
@@ -656,7 +656,7 @@ static int stm32_usart_startup(struct uart_port *port)
 
        /* RX FIFO Flush */
        if (ofs->rqr != UNDEF_REG)
-               stm32_usart_set_bits(port, ofs->rqr, USART_RQR_RXFRQ);
+               writel_relaxed(USART_RQR_RXFRQ, port->membase + ofs->rqr);
 
        /* RX enabling */
        val = stm32_port->cr1_irq | USART_CR1_RE | BIT(cfg->uart_enable_bit);
@@ -760,8 +760,8 @@ static void stm32_usart_set_termios(struct uart_port *port,
 
        /* flush RX & TX FIFO */
        if (ofs->rqr != UNDEF_REG)
-               stm32_usart_set_bits(port, ofs->rqr,
-                                    USART_RQR_TXFRQ | USART_RQR_RXFRQ);
+               writel_relaxed(USART_RQR_TXFRQ | USART_RQR_RXFRQ,
+                              port->membase + ofs->rqr);
 
        cr1 = USART_CR1_TE | USART_CR1_RE;
        if (stm32_port->fifoen)