From 7bad927328d3750397c7ca2f4b336632b6cae924 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Tue, 23 Jun 2015 15:39:06 -0600 Subject: [PATCH] ns16550: Improve debug UART so it can work with 32-bit access Since Rockchip requires 32-bit serial access, add this to the driver. Refactor a little to make this easier. Signed-off-by: Simon Glass --- drivers/serial/ns16550.c | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c index 9b044a37da..c8a77e295e 100644 --- a/drivers/serial/ns16550.c +++ b/drivers/serial/ns16550.c @@ -246,6 +246,17 @@ int NS16550_tstc(NS16550_t com_port) #include +#define serial_dout(reg, value) \ + serial_out_shift((char *)com_port + \ + ((char *)reg - (char *)com_port) * \ + (1 << CONFIG_DEBUG_UART_SHIFT), \ + CONFIG_DEBUG_UART_SHIFT, value) +#define serial_din(reg) \ + serial_in_shift((char *)com_port + \ + ((char *)reg - (char *)com_port) * \ + (1 << CONFIG_DEBUG_UART_SHIFT), \ + CONFIG_DEBUG_UART_SHIFT) + void debug_uart_init(void) { struct NS16550 *com_port = (struct NS16550 *)CONFIG_DEBUG_UART_BASE; @@ -259,28 +270,23 @@ void debug_uart_init(void) */ baud_divisor = calc_divisor(com_port, CONFIG_DEBUG_UART_CLOCK, CONFIG_BAUDRATE); - 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); + serial_dout(&com_port->ier, CONFIG_SYS_NS16550_IER); + serial_dout(&com_port->mcr, UART_MCRVAL); + serial_dout(&com_port->fcr, UART_FCRVAL); + + serial_dout(&com_port->lcr, UART_LCR_BKSE | UART_LCRVAL); + serial_dout(&com_port->dll, baud_divisor & 0xff); + serial_dout(&com_port->dlm, (baud_divisor >> 8) & 0xff); + serial_dout(&com_port->lcr, UART_LCRVAL); } static inline void _debug_uart_putc(int ch) { struct NS16550 *com_port = (struct NS16550 *)CONFIG_DEBUG_UART_BASE; - while (!(serial_in_shift(&com_port->lsr, 0) & UART_LSR_THRE)) + while (!(serial_din(&com_port->lsr) & UART_LSR_THRE)) ; - serial_out_shift(&com_port->thr, CONFIG_DEBUG_UART_SHIFT, ch); + serial_dout(&com_port->thr, ch); } DEBUG_UART_FUNCS -- 2.39.2