summaryrefslogtreecommitdiff
path: root/drivers/serial
diff options
context:
space:
mode:
authorPatrik Dahlström <risca@dalakolonin.se>2019-12-21 19:25:12 +0300
committerTom Rini <trini@konsulko.com>2020-01-24 19:19:52 +0300
commit1c16606aac8f03be80d9c38ada00fd03123e0dbe (patch)
tree5dbc242a579e1d6d31214f6482f7029f9558b005 /drivers/serial
parentb1b147f2b839c45b896dfacf5a2929313d88aa63 (diff)
downloadu-boot-1c16606aac8f03be80d9c38ada00fd03123e0dbe.tar.xz
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>
Diffstat (limited to 'drivers/serial')
-rw-r--r--drivers/serial/ns16550.c7
1 files changed, 7 insertions, 0 deletions
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