[U-Boot] [PATCH V2 1/3] serial: 16550: Add getfcr accessor
Simon Glass
sjg at chromium.org
Fri Jun 10 03:39:24 CEST 2016
Hi Marek,
On 9 June 2016 at 18:21, Marek Vasut <marex at denx.de> wrote:
> 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 <marex at denx.de>
> Cc: Tom Rini <trini at konsulko.com>
> Cc: Simon Glass <sjg at chromium.org>
> ---
> 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.
> ---
> drivers/serial/ns16550.c | 20 +++++++++++++++++---
> include/ns16550.h | 1 +
> 2 files changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c
> index c6cb3eb..b7ff3d7 100644
> --- a/drivers/serial/ns16550.c
> +++ b/drivers/serial/ns16550.c
> @@ -120,6 +120,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;
port->plat does not exist when using the debug UART. The pointer
'port' points directly to the hardware...
> +
> + return plat ? plat->fcr : UART_FCRVAL;
> +}
> +
> /* We can clean these up once everything is moved to driver model */
> #define serial_out(value, addr) \
> ns16550_writeb(com_port, \
> @@ -127,6 +134,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)
> @@ -170,7 +182,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) || \
> @@ -191,7 +203,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);
So I think you need to just use the original value here, and thus not
support debug UART on your board (unless you want a Kconfig).
> NS16550_setbrg(com_port, baud_divisor);
> }
> #endif /* CONFIG_NS16550_MIN_FUNCTIONS */
> @@ -262,7 +274,7 @@ static inline void _debug_uart_init(void)
> CONFIG_BAUDRATE);
> 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->fcr, ns16550_getfcr(com_port));
>
> serial_dout(&com_port->lcr, UART_LCR_BKSE | UART_LCRVAL);
> serial_dout(&com_port->dll, baud_divisor & 0xff);
> @@ -405,6 +417,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.7.0
>
Regards,
Simon
More information about the U-Boot
mailing list