diff mbox

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

Message ID 1464287988-6452-1-git-send-email-marex@denx.de
State Superseded
Delegated to: Daniel Schwierzeck
Headers show

Commit Message

Marek Vasut May 26, 2016, 6:39 p.m. UTC
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(-)

Comments

Simon Glass June 10, 2016, 12:34 a.m. UTC | #1
Hi Marek,

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

>
>         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
Marek Vasut June 10, 2016, 12:54 a.m. UTC | #2
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.

> 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.
Simon Glass June 10, 2016, 1:17 a.m. UTC | #3
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
diff mbox

Patch

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));
 
 	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;