| From c145dc3c90796951b7e45caf6423f0ccfe0aa24f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 4 Mar 2021 17:23:07 +0100 |
| Subject: serial: stm32: fix tx_empty condition |
| |
| From: Erwan Le Ray <erwan.leray@foss.st.com> |
| |
| [ 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 | 5 ++++- |
| drivers/tty/serial/stm32-usart.h | 3 --- |
| 2 files changed, 4 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c |
| index cb8c2bece6d6..2cf9fc915510 100644 |
| --- a/drivers/tty/serial/stm32-usart.c |
| +++ b/drivers/tty/serial/stm32-usart.c |
| @@ -514,7 +514,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) |
| diff --git a/drivers/tty/serial/stm32-usart.h b/drivers/tty/serial/stm32-usart.h |
| index cb4f327c46db..94b568aa46bb 100644 |
| --- a/drivers/tty/serial/stm32-usart.h |
| +++ b/drivers/tty/serial/stm32-usart.h |
| @@ -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) |
| |
| -- |
| 2.30.2 |
| |