]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
serial: stm32: fix tx_empty condition
authorErwan Le Ray <erwan.leray@foss.st.com>
Thu, 4 Mar 2021 16:23:07 +0000 (17:23 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 22 May 2021 08:59:27 +0000 (10:59 +0200)
[ Upstream commit 3db1d52466dc11dca4e47ef12a6e6e97f846af62 ]

In "tx_empty", we should poll TC bit in both DMA and PIO modes (instead of
TXE) to check transmission data register has been transmitted independently
of the FIFO mode. TC indicates that both transmit register and shift
register are empty. When shift register is empty, tx_empty should return
TIOCSER_TEMT instead of TC value.

Cleans the USART_CR_TC TCCF register define (transmission complete clear
flag) as it is duplicate of USART_ICR_TCCF.

Fixes: 48a6092fb41f ("serial: stm32-usart: Add STM32 USART Driver")
Signed-off-by: Erwan Le Ray <erwan.leray@foss.st.com>
Link: https://lore.kernel.org/r/20210304162308.8984-13-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
drivers/tty/serial/stm32-usart.h

index 09cecd34d13e51ab26f4e4aad5821b23df58f45b..50073ead5881bb5b6315018ab4f5b6142d238d0c 100644 (file)
@@ -472,7 +472,10 @@ static unsigned int stm32_tx_empty(struct uart_port *port)
        struct stm32_port *stm32_port = to_stm32_port(port);
        struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
 
-       return readl_relaxed(port->membase + ofs->isr) & USART_SR_TXE;
+       if (readl_relaxed(port->membase + ofs->isr) & USART_SR_TC)
+               return TIOCSER_TEMT;
+
+       return 0;
 }
 
 static void stm32_set_mctrl(struct uart_port *port, unsigned int mctrl)
index 30d2433e27c3c0a75c7f8ee144b2afd5a2e251e7..00daee7f83ee28ca6c5956a8a9cd9063f36e5e27 100644 (file)
@@ -123,9 +123,6 @@ struct stm32_usart_info stm32h7_info = {
 /* Dummy bits */
 #define USART_SR_DUMMY_RX      BIT(16)
 
-/* USART_ICR (F7) */
-#define USART_CR_TC            BIT(6)
-
 /* USART_DR */
 #define USART_DR_MASK          GENMASK(8, 0)