From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marek Vasut Date: Fri, 25 Nov 2016 23:32:25 +0100 Subject: [U-Boot] [PATCH 04/14] serial: 16550: Add getfcr accessor In-Reply-To: <20161125223235.3434-1-marex@denx.de> References: <20161125223235.3434-1-marex@denx.de> Message-ID: <20161125223235.3434-4-marex@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Add function which allows fetching the default FCR register setting from platform data for DM , while retaining old behavior for non-DM by returning UART_FCRVAL. Signed-off-by: Marek Vasut Cc: Tom Rini Cc: Simon Glass --- V2: If CONFIG_DM_SERIAL and DEBUG_UART are enabled, the ns16550_getfcr() can be invoked with NULL plat data . Check for this case and return the default UART_FCRVAL then. V3: It turns out that if DEBUG_UART is defined, $port points directly to hardware registers. Add additional ifdef to handle the case where debug uart is enabled with DM_SERIAL correctly. V4: Use UART_FCRVAL in _debug_uart_init() directly --- drivers/serial/ns16550.c | 18 ++++++++++++++++-- include/ns16550.h | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c index 6e9b946..3c9f3b0 100644 --- a/drivers/serial/ns16550.c +++ b/drivers/serial/ns16550.c @@ -121,6 +121,13 @@ static int ns16550_readb(NS16550_t port, int offset) return serial_in_shift(addr + plat->reg_offset, plat->reg_shift); } +static u32 ns16550_getfcr(NS16550_t port) +{ + struct ns16550_platdata *plat = port->plat; + + return plat->fcr; +} + /* We can clean these up once everything is moved to driver model */ #define serial_out(value, addr) \ ns16550_writeb(com_port, \ @@ -128,6 +135,11 @@ static int ns16550_readb(NS16550_t port, int offset) #define serial_in(addr) \ ns16550_readb(com_port, \ (unsigned char *)addr - (unsigned char *)com_port) +#else +static u32 ns16550_getfcr(NS16550_t port) +{ + return UART_FCRVAL; +} #endif int ns16550_calc_divisor(NS16550_t port, int clock, int baudrate) @@ -171,7 +183,7 @@ void NS16550_init(NS16550_t com_port, int baud_divisor) serial_out(0x7, &com_port->mdr1); /* mode select reset TL16C750*/ #endif serial_out(UART_MCRVAL, &com_port->mcr); - serial_out(UART_FCRVAL, &com_port->fcr); + serial_out(ns16550_getfcr(com_port), &com_port->fcr); if (baud_divisor != -1) NS16550_setbrg(com_port, baud_divisor); #if defined(CONFIG_OMAP) || \ @@ -192,7 +204,7 @@ void NS16550_reinit(NS16550_t com_port, int baud_divisor) serial_out(CONFIG_SYS_NS16550_IER, &com_port->ier); NS16550_setbrg(com_port, 0); serial_out(UART_MCRVAL, &com_port->mcr); - serial_out(UART_FCRVAL, &com_port->fcr); + serial_out(ns16550_getfcr(com_port), &com_port->fcr); NS16550_setbrg(com_port, baud_divisor); } #endif /* CONFIG_NS16550_MIN_FUNCTIONS */ @@ -420,6 +432,8 @@ int ns16550_serial_ofdata_to_platdata(struct udevice *dev) return -EINVAL; } + plat->fcr = UART_FCRVAL; + return 0; } #endif diff --git a/include/ns16550.h b/include/ns16550.h index 1311f4c..45fd68b 100644 --- a/include/ns16550.h +++ b/include/ns16550.h @@ -57,6 +57,7 @@ struct ns16550_platdata { int reg_shift; int clock; int reg_offset; + u32 fcr; }; struct udevice; -- 2.10.2