]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
serial: 8250: Use high-level writing function for FIFO
authorJohn Ogness <john.ogness@linutronix.de>
Tue, 7 Jan 2025 21:26:59 +0000 (22:32 +0106)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Jan 2025 15:08:25 +0000 (16:08 +0100)
Currently serial8250_console_fifo_write() directly writes into
the UART_TX register rather than using the high-level function
serial8250_console_putchar(). This is because
serial8250_console_putchar() waits for the holding register to
become empty, which would defeat the purpose of the FIFO code.

Move the LSR_THRE waiting to a new function
serial8250_console_wait_putchar() so that the FIFO code can use
serial8250_console_putchar(). This will be particularly important
for a follow-up commit, where output bytes are inspected to track
newlines.

This is only refactoring and has no functional change.

Signed-off-by: John Ogness <john.ogness@linutronix.de>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Link: https://lore.kernel.org/r/20250107212702.169493-4-john.ogness@linutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_port.c

index ca8f6f3855eb26305469644b48e76e7ecf4dc204..15abd95fcf066dbba888230eefe3e710025f05ef 100644 (file)
@@ -3298,11 +3298,16 @@ EXPORT_SYMBOL_GPL(serial8250_set_defaults);
 #ifdef CONFIG_SERIAL_8250_CONSOLE
 
 static void serial8250_console_putchar(struct uart_port *port, unsigned char ch)
+{
+       serial_port_out(port, UART_TX, ch);
+}
+
+static void serial8250_console_wait_putchar(struct uart_port *port, unsigned char ch)
 {
        struct uart_8250_port *up = up_to_u8250p(port);
 
        wait_for_xmitr(up, UART_LSR_THRE);
-       serial_port_out(port, UART_TX, ch);
+       serial8250_console_putchar(port, ch);
 }
 
 /*
@@ -3352,6 +3357,7 @@ static void serial8250_console_fifo_write(struct uart_8250_port *up,
 {
        const char *end = s + count;
        unsigned int fifosize = up->tx_loadsz;
+       struct uart_port *port = &up->port;
        unsigned int tx_count = 0;
        bool cr_sent = false;
        unsigned int i;
@@ -3362,10 +3368,10 @@ static void serial8250_console_fifo_write(struct uart_8250_port *up,
 
                for (i = 0; i < fifosize && s != end; ++i) {
                        if (*s == '\n' && !cr_sent) {
-                               serial_out(up, UART_TX, '\r');
+                               serial8250_console_putchar(port, '\r');
                                cr_sent = true;
                        } else {
-                               serial_out(up, UART_TX, *s++);
+                               serial8250_console_putchar(port, *s++);
                                cr_sent = false;
                        }
                }
@@ -3445,7 +3451,7 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s,
        if (likely(use_fifo))
                serial8250_console_fifo_write(up, s, count);
        else
-               uart_console_write(port, s, count, serial8250_console_putchar);
+               uart_console_write(port, s, count, serial8250_console_wait_putchar);
 
        /*
         *      Finally, wait for transmitter to become empty