In FIFO mode, the transmitter FIFO should be checked to ensure it is not
full before writing a character.

Fixes: 09864c1cdf5c ("tty: serial: Add linflexuart driver for S32V234")
Signed-off-by: Larisa Grigore <[email protected]>
---
 drivers/tty/serial/fsl_linflexuart.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/tty/serial/fsl_linflexuart.c 
b/drivers/tty/serial/fsl_linflexuart.c
index 016011fd8760..9111e7af62ea 100644
--- a/drivers/tty/serial/fsl_linflexuart.c
+++ b/drivers/tty/serial/fsl_linflexuart.c
@@ -555,22 +555,24 @@ static struct uart_port *linflex_ports[UART_NR];
 static void linflex_console_putchar(struct uart_port *port, unsigned char ch)
 {
        unsigned long cr;
+       bool fifo_mode;
 
        cr = readl(port->membase + UARTCR);
+       fifo_mode = cr & LINFLEXD_UARTCR_TFBM;
+
+       if (fifo_mode)
+               while (readl(port->membase + UARTSR) &
+                                       LINFLEXD_UARTSR_DTFTFF)
+                       ;
 
        writeb(ch, port->membase + BDRL);
 
-       if (!(cr & LINFLEXD_UARTCR_TFBM))
+       if (!fifo_mode) {
                while ((readl(port->membase + UARTSR) &
                                        LINFLEXD_UARTSR_DTFTFF)
                                != LINFLEXD_UARTSR_DTFTFF)
                        ;
-       else
-               while (readl(port->membase + UARTSR) &
-                                       LINFLEXD_UARTSR_DTFTFF)
-                       ;
 
-       if (!(cr & LINFLEXD_UARTCR_TFBM)) {
                writel((readl(port->membase + UARTSR) |
                                        LINFLEXD_UARTSR_DTFTFF),
                                        port->membase + UARTSR);
-- 
2.47.0

Reply via email to