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

Marek Vasut marex at denx.de
Fri Jun 10 04:03:16 CEST 2016


On 06/10/2016 03:39 AM, Simon Glass wrote:
> Hi Marek,

Hi,

> 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...

Sigh, the code is really convoluted and nasty.

>> +
>> +       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).

I don't want more Kconfig options.

[...]

-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list