]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.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)
committerKelsey Skunberg <kelsey.skunberg@canonical.com>
Mon, 24 May 2021 23:46:19 +0000 (17:46 -0600)
BugLink: https://bugs.launchpad.net/bugs/1929455
[ 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>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Kelsey Skunberg <kelsey.skunberg@canonical.com>
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)