From 0ed1dea7f4f5c5b2b7cd0130eb49c2c5c0b0ea42 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 23 Jun 2025 22:37:32 +0100 Subject: [PATCH] [uart] Wait for 16550 UART to become idle before modifying LCR Some implementations of 16550-compatible UARTs (e.g. the DesignWare UART) are known to ignore writes to the line control register while the transmitter is active. Wait for the transmitter to become empty before attempting to write to the line control register. Signed-off-by: Michael Brown --- src/drivers/uart/ns16550.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/drivers/uart/ns16550.c b/src/drivers/uart/ns16550.c index cf8c744c6..5455c68fb 100644 --- a/src/drivers/uart/ns16550.c +++ b/src/drivers/uart/ns16550.c @@ -131,6 +131,9 @@ static int ns16550_init ( struct uart *uart, unsigned int baud ) { if ( ns16550_read ( ns16550, NS16550_SCR ) != 0xae ) return -ENODEV; + /* Wait for UART to become idle before modifying LCR */ + ns16550_flush ( uart ); + /* Configure divisor and line control register, if applicable */ ns16550_write ( ns16550, NS16550_LCR, ( NS16550_LCR_8N1 | NS16550_LCR_DLAB ) ); -- 2.47.3