From: Patrik Dahlström <risca@dalakolonin.se>
Date: Sat, 21 Dec 2019 16:25:12 +0000 (+0100)
Subject: serial: ns16550: Use old baud rate divisor for flushing if not given
X-Git-Tag: v2025.01-rc5-pxa1908~2593^2~20
X-Git-Url: http://git.dujemihanovic.xyz/img/static/gitweb.css?a=commitdiff_plain;h=1c16606aac8f03be80d9c38ada00fd03123e0dbe;p=u-boot.git

serial: ns16550: Use old baud rate divisor for flushing if not given

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>
---

diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c
index a92d2b1de8..9851663dc5 100644
--- a/drivers/serial/ns16550.c
+++ b/drivers/serial/ns16550.c
@@ -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