serial: fsl_linflexuart: deduplicate character sending
authorJiri Slaby <jslaby@suse.cz>
Mon, 24 Jan 2022 07:14:27 +0000 (08:14 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 26 Jan 2022 13:54:48 +0000 (14:54 +0100)
Introduce a new linflex_put_char() helper to send a character. And use
it on both places this code was duplicated.

Cc: Stefan-gabriel Mirea <stefan-gabriel.mirea@nxp.com>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Link: https://lore.kernel.org/r/20220124071430.14907-9-jslaby@suse.cz
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/fsl_linflexuart.c

index 28375726460845938cd6b7df0c62783c3db580fd..81a04039b6c184a58859ebdb07ac630ca7c26937 100644 (file)
@@ -157,27 +157,29 @@ static void linflex_stop_rx(struct uart_port *port)
        writel(ier & ~LINFLEXD_LINIER_DRIE, port->membase + LINIER);
 }
 
-static inline void linflex_transmit_buffer(struct uart_port *sport)
+static void linflex_put_char(struct uart_port *sport, unsigned char c)
 {
-       struct circ_buf *xmit = &sport->state->xmit;
-       unsigned char c;
        unsigned long status;
 
-       while (!uart_circ_empty(xmit)) {
-               c = xmit->buf[xmit->tail];
-               writeb(c, sport->membase + BDRL);
+       writeb(c, sport->membase + BDRL);
 
-               /* Waiting for data transmission completed. */
-               while (((status = readl(sport->membase + UARTSR)) &
-                                       LINFLEXD_UARTSR_DTFTFF) !=
-                                       LINFLEXD_UARTSR_DTFTFF)
-                       ;
+       /* Waiting for data transmission completed. */
+       while (((status = readl(sport->membase + UARTSR)) &
+                               LINFLEXD_UARTSR_DTFTFF) !=
+                               LINFLEXD_UARTSR_DTFTFF)
+               ;
+
+       writel(status | LINFLEXD_UARTSR_DTFTFF, sport->membase + UARTSR);
+}
 
+static inline void linflex_transmit_buffer(struct uart_port *sport)
+{
+       struct circ_buf *xmit = &sport->state->xmit;
+
+       while (!uart_circ_empty(xmit)) {
+               linflex_put_char(sport, xmit->buf[xmit->tail]);
                xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
                sport->icount.tx++;
-
-               writel(status | LINFLEXD_UARTSR_DTFTFF,
-                      sport->membase + UARTSR);
        }
 
        if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
@@ -201,21 +203,11 @@ static irqreturn_t linflex_txint(int irq, void *dev_id)
        struct uart_port *sport = dev_id;
        struct circ_buf *xmit = &sport->state->xmit;
        unsigned long flags;
-       unsigned long status;
 
        spin_lock_irqsave(&sport->lock, flags);
 
        if (sport->x_char) {
-               writeb(sport->x_char, sport->membase + BDRL);
-
-               /* waiting for data transmission completed */
-               while (((status = readl(sport->membase + UARTSR)) &
-                       LINFLEXD_UARTSR_DTFTFF) != LINFLEXD_UARTSR_DTFTFF)
-                       ;
-
-               writel(status | LINFLEXD_UARTSR_DTFTFF,
-                      sport->membase + UARTSR);
-
+               linflex_put_char(sport, sport->x_char);
                goto out;
        }