serial/ns16550: add an option to avoid hanging on broken platforms

Some platforms (e.g. IGEPv2 board) has a broken ns16550 UART that
does not set the TEMT bit when the transmitter is empty in SPL.
This makes U-Boot to hang while waiting for TEMT to be set.

Add a new option to avoid this:

CONFIG_SYS_NS16550_BROKEN_TEMT

16550 UART set the Transmitter Empty (TEMT) Bit when all output
has finished and the transmitter is totally empty. U-Boot waits
for this bit to be set to initialize the serial console. On some
broken platforms this bit is not set in SPL making U-Boot to
hang while waiting for TEMT. Define this option to avoid it.

Signed-off-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
This commit is contained in:
Javier Martinez Canillas 2013-01-07 01:35:20 +00:00 committed by Tom Rini
parent 94bcfe524c
commit 7de0fe1ac3
2 changed files with 10 additions and 0 deletions

8
README
View File

@ -616,6 +616,14 @@ The following options need to be configured:
boot loader that has already initialized the UART. Define this boot loader that has already initialized the UART. Define this
variable to flush the UART at init time. variable to flush the UART at init time.
CONFIG_SYS_NS16550_BROKEN_TEMT
16550 UART set the Transmitter Empty (TEMT) Bit when all output
has finished and the transmitter is totally empty. U-Boot waits
for this bit to be set to initialize the serial console. On some
broken platforms this bit is not set in SPL making U-Boot to
hang while waiting for TEMT. Define this option to avoid it.
- Console Interface: - Console Interface:
Depending on board, define exactly one serial port Depending on board, define exactly one serial port

View File

@ -36,8 +36,10 @@
void NS16550_init(NS16550_t com_port, int baud_divisor) void NS16550_init(NS16550_t com_port, int baud_divisor)
{ {
#if (!defined(CONFIG_SYS_NS16550_BROKEN_TEMT))
while (!(serial_in(&com_port->lsr) & UART_LSR_TEMT)) while (!(serial_in(&com_port->lsr) & UART_LSR_TEMT))
; ;
#endif
serial_out(CONFIG_SYS_NS16550_IER, &com_port->ier); serial_out(CONFIG_SYS_NS16550_IER, &com_port->ier);
#if (defined(CONFIG_OMAP) && !defined(CONFIG_OMAP3_ZOOM2)) || \ #if (defined(CONFIG_OMAP) && !defined(CONFIG_OMAP3_ZOOM2)) || \