omap3_beagle: Flush UART3 xmit on enable if TEMT is broken
authorManfred Huber <man.huber@arcor.de>
Fri, 29 Mar 2013 02:52:36 +0000 (02:52 +0000)
committerTom Rini <trini@ti.com>
Mon, 8 Apr 2013 15:29:05 +0000 (11:29 -0400)
Flush UART3 xmit on enable if TEMT is broken

On some OMAP3 devices when UART3 is configured for boot mode before SPL starts
only THRE bit is set. We have to empty the transmitter before initialization
starts. This patch avoids the use of CONFIG_SYS_NS16550_BROKEN_TEMT.

Signed-off-by: Manfred Huber <man.huber@arcor.de>
Tested-by: Javier Martinez Canillas <javier@dowhile0.org>
Tested-by: Andreas Bießmann <andreas.devel@googlemail.com>
README
drivers/serial/ns16550.c
include/configs/igep00x0.h

diff --git a/README b/README
index a35ef318da100b51f66c5515f6660fa2014ed90a..5c5cd18551ce34627f9ec652fd5cc9d490c9dbc0 100644 (file)
--- a/README
+++ b/README
@@ -627,14 +627,6 @@ The following options need to be configured:
                boot loader that has already initialized the UART.  Define this
                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:
                Depending on board, define exactly one serial port
index ed4e6b3a1fdc6822491b1b2a7b641afe5967d36d..7f013ab33c511d41e2bcbdd47d2372b778d52f43 100644 (file)
 
 void NS16550_init(NS16550_t com_port, int baud_divisor)
 {
-#if (!defined(CONFIG_SYS_NS16550_BROKEN_TEMT))
+#if (defined(CONFIG_SPL_BUILD) && defined(CONFIG_OMAP34XX))
+       /*
+        * On some OMAP3 devices when UART3 is configured for boot mode before
+        * SPL starts only THRE bit is set. We have to empty the transmitter
+        * before initialization starts.
+        */
+       if ((serial_in(&com_port->lsr) & (UART_LSR_TEMT | UART_LSR_THRE))
+            == UART_LSR_THRE) {
+               serial_out(UART_LCR_DLAB, &com_port->lcr);
+               serial_out(baud_divisor & 0xff, &com_port->dll);
+               serial_out((baud_divisor >> 8) & 0xff, &com_port->dlm);
+               serial_out(UART_LCRVAL, &com_port->lcr);
+               serial_out(0, &com_port->mdr1);
+       }
+#endif
+
        while (!(serial_in(&com_port->lsr) & UART_LSR_TEMT))
                ;
-#endif
 
        serial_out(CONFIG_SYS_NS16550_IER, &com_port->ier);
 #if (defined(CONFIG_OMAP) && !defined(CONFIG_OMAP3_ZOOM2)) || \
index 849fb1624f0d8625df874bcb028d79f22ec40374..1d8090bf6ae9c88b1c3fdc3ce3cda6f1f1173bbe 100644 (file)
@@ -69,9 +69,6 @@
 #define CONFIG_SYS_NS16550_REG_SIZE    (-4)
 #define CONFIG_SYS_NS16550_CLK         V_NS16550_CLK
 
-/* define to avoid U-Boot to hang while waiting for TEMT */
-#define CONFIG_SYS_NS16550_BROKEN_TEMT
-
 /* select serial console configuration */
 #define CONFIG_CONS_INDEX              3
 #define CONFIG_SYS_NS16550_COM3                OMAP34XX_UART3