serial: ns16550: Use old baud rate divisor for flushing if not given
authorPatrik Dahlström <risca@dalakolonin.se>
Sat, 21 Dec 2019 16:25:12 +0000 (17:25 +0100)
committerTom Rini <trini@konsulko.com>
Fri, 24 Jan 2020 16:19:52 +0000 (11:19 -0500)
If baud_divisor is not set (i.e. == -1), we should use the baud divisor
already in use for flushing the xmit register. If we don't flush the
xmit register, then SPL will hang.

Signed-off-by: Patrik Dahlström <risca@dalakolonin.se>
drivers/serial/ns16550.c

index a92d2b1de882f05c570377610b6ca74fed3524f9..9851663dc54f8a301fb8bb075898473621cc8538 100644 (file)
@@ -171,6 +171,13 @@ void NS16550_init(NS16550_t com_port, int baud_divisor)
             == UART_LSR_THRE) {
                if (baud_divisor != -1)
                        NS16550_setbrg(com_port, baud_divisor);
+               else {
+                       // Re-use old baud rate divisor to flush transmit reg.
+                       const int dll = serial_in(&com_port->dll);
+                       const int dlm = serial_in(&com_port->dlm);
+                       const int divisor = dll | (dlm << 8);
+                       NS16550_setbrg(com_port, divisor);
+               }
                serial_out(0, &com_port->mdr1);
        }
 #endif