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>
Wed, 10 Mar 2021 08:34:11 +0000 (09:34 +0100)
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>
drivers/tty/serial/stm32-usart.c
drivers/tty/serial/stm32-usart.h

index d205fce1950ac1ecccc004c78a63fe45ec1ec833..99dfa884cbefb1399bc49fb08b6da031e7cf7f57 100644 (file)
@@ -515,7 +515,10 @@ static unsigned int stm32_usart_tx_empty(struct uart_port *port)
        struct stm32_port *stm32_port = to_stm32_port(port);
        const 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_usart_set_mctrl(struct uart_port *port, unsigned int mctrl)
index cb4f327c46db992140ecf13e2f4b4e4f8958304d..94b568aa46bbd68f82b86342153b3f440755765d 100644 (file)
@@ -127,9 +127,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)