serial: ns16550: Add an option to specify the debug UART register shift
authorSimon Glass <sjg@chromium.org>
Sat, 28 Feb 2015 05:06:25 +0000 (22:06 -0700)
committerSimon Glass <sjg@chromium.org>
Thu, 23 Apr 2015 02:03:41 +0000 (20:03 -0600)
This UART permits different register spacing. To support the debug UART on
devices which have a spacing other than 1 byte, allow the shift value to
be specified.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/serial/Kconfig
drivers/serial/ns16550.c

index 1686a1f951e860757bbc656678fbfdf6088b39b9..54e6f26d38d00a9a5b6781148f9fc1cd2d03b4b2 100644 (file)
@@ -66,6 +66,16 @@ config DEBUG_UART_CLOCK
          A default should be provided by your board, but if not you will need
          to use the correct value here.
 
+config DEBUG_UART_SHIFT
+       int "UART register shift"
+       depends on DEBUG_UART
+       default 0 if DEBUG_UART
+       help
+         Some UARTs (notably ns16550) support different register layouts
+         where the registers are spaced either as bytes, words or some other
+         value. Use this value to specify the shift to use, where 0=byte
+         registers, 2=32-bit word registers, etc.
+
 config UNIPHIER_SERIAL
        bool "UniPhier on-chip UART support"
        depends on ARCH_UNIPHIER && DM_SERIAL
index 67b1d60171abcaa0418dbde582d28a702a285db6..362f2ee8796199f7f4472408afa530efc28df9a4 100644 (file)
@@ -254,15 +254,20 @@ void debug_uart_init(void)
         */
        baud_divisor = calc_divisor(com_port, CONFIG_DEBUG_UART_CLOCK,
                                    CONFIG_BAUDRATE);
-
-       serial_out_shift(&com_port->ier, 0, CONFIG_SYS_NS16550_IER);
-       serial_out_shift(&com_port->mcr, 0, UART_MCRVAL);
-       serial_out_shift(&com_port->fcr, 0, UART_FCRVAL);
-
-       serial_out_shift(&com_port->lcr, 0, UART_LCR_BKSE | UART_LCRVAL);
-       serial_out_shift(&com_port->dll, 0, baud_divisor & 0xff);
-       serial_out_shift(&com_port->dlm, 0, (baud_divisor >> 8) & 0xff);
-       serial_out_shift(&com_port->lcr, 0, UART_LCRVAL);
+       baud_divisor = 13;
+       serial_out_shift(&com_port->ier, CONFIG_DEBUG_UART_SHIFT,
+                        CONFIG_SYS_NS16550_IER);
+       serial_out_shift(&com_port->mcr, CONFIG_DEBUG_UART_SHIFT, UART_MCRVAL);
+       serial_out_shift(&com_port->fcr, CONFIG_DEBUG_UART_SHIFT, UART_FCRVAL);
+
+       serial_out_shift(&com_port->lcr, CONFIG_DEBUG_UART_SHIFT,
+                        UART_LCR_BKSE | UART_LCRVAL);
+       serial_out_shift(&com_port->dll, CONFIG_DEBUG_UART_SHIFT,
+                        baud_divisor & 0xff);
+       serial_out_shift(&com_port->dlm, CONFIG_DEBUG_UART_SHIFT,
+                        (baud_divisor >> 8) & 0xff);
+       serial_out_shift(&com_port->lcr, CONFIG_DEBUG_UART_SHIFT,
+                        UART_LCRVAL);
 }
 
 static inline void _debug_uart_putc(int ch)
@@ -271,7 +276,7 @@ static inline void _debug_uart_putc(int ch)
 
        while (!(serial_in_shift(&com_port->lsr, 0) & UART_LSR_THRE))
                ;
-       serial_out_shift(&com_port->thr, 0, ch);
+       serial_out_shift(&com_port->thr, CONFIG_DEBUG_UART_SHIFT, ch);
 }
 
 DEBUG_UART_FUNCS