[U-Boot] [PATCH 1/3] serial: 16550: Add getfcr accessor

Simon Glass
2016-06-10T01:17:45Z

Hi Marek,

On 9 June 2016 at 17:54, Marek Vasut <marex@denx.de> wrote:
> On 06/10/2016 02:34 AM, Simon Glass wrote:
>> Hi Marek,
>
> Hi,
>
>> On 26 May 2016 at 12:39, Marek Vasut <marex@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@denx.de>
>>> Cc: Tom Rini <trini@konsulko.com>
>>> Cc: Simon Glass <sjg@chromium.org>
>>> ---
>>> 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..b39ce02 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;
>>> +
>>> + return plat->fcr;
>>> +}
>>> +
>>> /* 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);
>>> 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));
>>
>> The debug UART does not have platdata, so I don't think this will
>> work.
>
> Hrm, true. If you have DM_SERIAL enabled and debug uart enabled,
> this will likely fail.

Right.

>
>> For the debug UART perhaps you can use the default value. If
>> not, then I think the only option is a new debug UART Kconfig.
>
> I don't use the debug uart, so I don't need the Kconfig option.

OK, then you could pass in the default value.

Regards,
Simon