* [U-Boot] [PATCH 2/3] serial: 16550: Add port type as driver data
2016-05-26 18:39 [U-Boot] [PATCH 1/3] serial: 16550: Add getfcr accessor Marek Vasut
@ 2016-05-26 18:39 ` Marek Vasut
2016-06-10 0:34 ` Simon Glass
2016-05-26 18:39 ` [U-Boot] [PATCH 3/3] serial: 16550: Add Ingenic JZ4780 support Marek Vasut
2016-06-10 0:34 ` [U-Boot] [PATCH 1/3] serial: 16550: Add getfcr accessor Simon Glass
2 siblings, 1 reply; 15+ messages in thread
From: Marek Vasut @ 2016-05-26 18:39 UTC (permalink / raw)
To: u-boot
Add driver data to each compatible string to identify the type of
the port. Since all the ports in the driver are entirely compatible
with 16550 for now, all are marked with PORT_NS16550. But, there
are ports which have specific quirks, like the JZ4780 UART, which
do not have any DT property to denote the quirks. Instead, Linux
uses the compatible string to discern such ports and enable the
necessary quirks.
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Tom Rini <trini@konsulko.com>
Cc: Simon Glass <sjg@chromium.org>
---
drivers/serial/ns16550.c | 24 ++++++++++++++----------
1 file changed, 14 insertions(+), 10 deletions(-)
diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c
index b39ce02..f371f74 100644
--- a/drivers/serial/ns16550.c
+++ b/drivers/serial/ns16550.c
@@ -360,6 +360,10 @@ int ns16550_serial_probe(struct udevice *dev)
}
#if CONFIG_IS_ENABLED(OF_CONTROL)
+enum {
+ PORT_NS16550 = 0,
+};
+
int ns16550_serial_ofdata_to_platdata(struct udevice *dev)
{
struct ns16550_platdata *plat = dev->platdata;
@@ -437,16 +441,16 @@ const struct dm_serial_ops ns16550_serial_ops = {
* compatible string to your dts.
*/
static const struct udevice_id ns16550_serial_ids[] = {
- { .compatible = "ns16550" },
- { .compatible = "ns16550a" },
- { .compatible = "nvidia,tegra20-uart" },
- { .compatible = "snps,dw-apb-uart" },
- { .compatible = "ti,omap2-uart" },
- { .compatible = "ti,omap3-uart" },
- { .compatible = "ti,omap4-uart" },
- { .compatible = "ti,am3352-uart" },
- { .compatible = "ti,am4372-uart" },
- { .compatible = "ti,dra742-uart" },
+ { .compatible = "ns16550", .data = PORT_NS16550 },
+ { .compatible = "ns16550a", .data = PORT_NS16550 },
+ { .compatible = "nvidia,tegra20-uart", .data = PORT_NS16550 },
+ { .compatible = "snps,dw-apb-uart", .data = PORT_NS16550 },
+ { .compatible = "ti,omap2-uart", .data = PORT_NS16550 },
+ { .compatible = "ti,omap3-uart", .data = PORT_NS16550 },
+ { .compatible = "ti,omap4-uart", .data = PORT_NS16550 },
+ { .compatible = "ti,am3352-uart", .data = PORT_NS16550 },
+ { .compatible = "ti,am4372-uart", .data = PORT_NS16550 },
+ { .compatible = "ti,dra742-uart", .data = PORT_NS16550 },
{}
};
#endif
--
2.7.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [U-Boot] [PATCH 2/3] serial: 16550: Add port type as driver data
2016-05-26 18:39 ` [U-Boot] [PATCH 2/3] serial: 16550: Add port type as driver data Marek Vasut
@ 2016-06-10 0:34 ` Simon Glass
0 siblings, 0 replies; 15+ messages in thread
From: Simon Glass @ 2016-06-10 0:34 UTC (permalink / raw)
To: u-boot
On 26 May 2016 at 12:39, Marek Vasut <marex@denx.de> wrote:
> Add driver data to each compatible string to identify the type of
> the port. Since all the ports in the driver are entirely compatible
> with 16550 for now, all are marked with PORT_NS16550. But, there
> are ports which have specific quirks, like the JZ4780 UART, which
> do not have any DT property to denote the quirks. Instead, Linux
> uses the compatible string to discern such ports and enable the
> necessary quirks.
>
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Tom Rini <trini@konsulko.com>
> Cc: Simon Glass <sjg@chromium.org>
> ---
> drivers/serial/ns16550.c | 24 ++++++++++++++----------
> 1 file changed, 14 insertions(+), 10 deletions(-)
Reviewed-by: Simon Glass <sjg@chromium.org>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [U-Boot] [PATCH 3/3] serial: 16550: Add Ingenic JZ4780 support
2016-05-26 18:39 [U-Boot] [PATCH 1/3] serial: 16550: Add getfcr accessor Marek Vasut
2016-05-26 18:39 ` [U-Boot] [PATCH 2/3] serial: 16550: Add port type as driver data Marek Vasut
@ 2016-05-26 18:39 ` Marek Vasut
2016-06-10 0:34 ` Simon Glass
2016-06-10 0:34 ` [U-Boot] [PATCH 1/3] serial: 16550: Add getfcr accessor Simon Glass
2 siblings, 1 reply; 15+ messages in thread
From: Marek Vasut @ 2016-05-26 18:39 UTC (permalink / raw)
To: u-boot
Add compatibility string for the Ingenic JZ4780 SoC, the necessary
UART enable bit into FCR and register shift. Neither are encoded
in the DTS coming from Linux, so we need to support it this way.
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Tom Rini <trini@konsulko.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
Cc: Paul Burton <paul.burton@imgtec.com>
---
drivers/serial/ns16550.c | 7 +++++++
include/ns16550.h | 3 +++
2 files changed, 10 insertions(+)
diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c
index f371f74..8dc0e65 100644
--- a/drivers/serial/ns16550.c
+++ b/drivers/serial/ns16550.c
@@ -362,11 +362,13 @@ int ns16550_serial_probe(struct udevice *dev)
#if CONFIG_IS_ENABLED(OF_CONTROL)
enum {
PORT_NS16550 = 0,
+ PORT_JZ4780,
};
int ns16550_serial_ofdata_to_platdata(struct udevice *dev)
{
struct ns16550_platdata *plat = dev->platdata;
+ const u32 port_type = dev_get_driver_data(dev);
fdt_addr_t addr;
/* try Processor Local Bus device first */
@@ -422,6 +424,10 @@ int ns16550_serial_ofdata_to_platdata(struct udevice *dev)
}
plat->fcr = UART_FCRVAL;
+ if (port_type == PORT_JZ4780) {
+ plat->fcr |= UART_FCR_UME;
+ plat->reg_shift = 2;
+ }
return 0;
}
@@ -443,6 +449,7 @@ const struct dm_serial_ops ns16550_serial_ops = {
static const struct udevice_id ns16550_serial_ids[] = {
{ .compatible = "ns16550", .data = PORT_NS16550 },
{ .compatible = "ns16550a", .data = PORT_NS16550 },
+ { .compatible = "ingenic,jz4780-uart", .data = PORT_JZ4780 },
{ .compatible = "nvidia,tegra20-uart", .data = PORT_NS16550 },
{ .compatible = "snps,dw-apb-uart", .data = PORT_NS16550 },
{ .compatible = "ti,omap2-uart", .data = PORT_NS16550 },
diff --git a/include/ns16550.h b/include/ns16550.h
index 45fd68b..7c97036 100644
--- a/include/ns16550.h
+++ b/include/ns16550.h
@@ -118,6 +118,9 @@ typedef struct NS16550 *NS16550_t;
#define UART_FCR_RXSR 0x02 /* Receiver soft reset */
#define UART_FCR_TXSR 0x04 /* Transmitter soft reset */
+/* Ingenic JZ47xx specific UART-enable bit. */
+#define UART_FCR_UME 0x10
+
/*
* These are the definitions for the Modem Control Register
*/
--
2.7.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [U-Boot] [PATCH 3/3] serial: 16550: Add Ingenic JZ4780 support
2016-05-26 18:39 ` [U-Boot] [PATCH 3/3] serial: 16550: Add Ingenic JZ4780 support Marek Vasut
@ 2016-06-10 0:34 ` Simon Glass
0 siblings, 0 replies; 15+ messages in thread
From: Simon Glass @ 2016-06-10 0:34 UTC (permalink / raw)
To: u-boot
On 26 May 2016 at 12:39, Marek Vasut <marex@denx.de> wrote:
> Add compatibility string for the Ingenic JZ4780 SoC, the necessary
> UART enable bit into FCR and register shift. Neither are encoded
> in the DTS coming from Linux, so we need to support it this way.
>
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Tom Rini <trini@konsulko.com>
> Cc: Simon Glass <sjg@chromium.org>
> Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
> Cc: Paul Burton <paul.burton@imgtec.com>
> ---
> drivers/serial/ns16550.c | 7 +++++++
> include/ns16550.h | 3 +++
> 2 files changed, 10 insertions(+)
Reviewed-by: Simon Glass <sjg@chromium.org>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [U-Boot] [PATCH 1/3] serial: 16550: Add getfcr accessor
2016-05-26 18:39 [U-Boot] [PATCH 1/3] serial: 16550: Add getfcr accessor Marek Vasut
2016-05-26 18:39 ` [U-Boot] [PATCH 2/3] serial: 16550: Add port type as driver data Marek Vasut
2016-05-26 18:39 ` [U-Boot] [PATCH 3/3] serial: 16550: Add Ingenic JZ4780 support Marek Vasut
@ 2016-06-10 0:34 ` Simon Glass
2016-06-10 0:54 ` Marek Vasut
2 siblings, 1 reply; 15+ messages in thread
From: Simon Glass @ 2016-06-10 0:34 UTC (permalink / raw)
To: u-boot
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
^ permalink raw reply [flat|nested] 15+ messages in thread* [U-Boot] [PATCH 1/3] serial: 16550: Add getfcr accessor
2016-06-10 0:34 ` [U-Boot] [PATCH 1/3] serial: 16550: Add getfcr accessor Simon Glass
@ 2016-06-10 0:54 ` Marek Vasut
2016-06-10 1:17 ` Simon Glass
0 siblings, 1 reply; 15+ messages in thread
From: Marek Vasut @ 2016-06-10 0:54 UTC (permalink / raw)
To: u-boot
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.
--
Best regards,
Marek Vasut
^ permalink raw reply [flat|nested] 15+ messages in thread* [U-Boot] [PATCH 1/3] serial: 16550: Add getfcr accessor
2016-06-10 0:54 ` Marek Vasut
@ 2016-06-10 1:17 ` Simon Glass
2016-06-10 1:21 ` [U-Boot] [PATCH V2 " Marek Vasut
0 siblings, 1 reply; 15+ messages in thread
From: Simon Glass @ 2016-06-10 1:17 UTC (permalink / raw)
To: u-boot
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
^ permalink raw reply [flat|nested] 15+ messages in thread* [U-Boot] [PATCH V2 1/3] serial: 16550: Add getfcr accessor
2016-06-10 1:17 ` Simon Glass
@ 2016-06-10 1:21 ` Marek Vasut
2016-06-10 1:39 ` Simon Glass
0 siblings, 1 reply; 15+ messages in thread
From: Marek Vasut @ 2016-06-10 1:21 UTC (permalink / raw)
To: u-boot
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>
---
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;
+
+ 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);
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
^ permalink raw reply related [flat|nested] 15+ messages in thread* [U-Boot] [PATCH V2 1/3] serial: 16550: Add getfcr accessor
2016-06-10 1:21 ` [U-Boot] [PATCH V2 " Marek Vasut
@ 2016-06-10 1:39 ` Simon Glass
2016-06-10 2:03 ` Marek Vasut
2016-06-10 2:04 ` [U-Boot] [PATCH V3 " Marek Vasut
0 siblings, 2 replies; 15+ messages in thread
From: Simon Glass @ 2016-06-10 1:39 UTC (permalink / raw)
To: u-boot
Hi Marek,
On 9 June 2016 at 18:21, 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>
> ---
> 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
^ permalink raw reply [flat|nested] 15+ messages in thread* [U-Boot] [PATCH V2 1/3] serial: 16550: Add getfcr accessor
2016-06-10 1:39 ` Simon Glass
@ 2016-06-10 2:03 ` Marek Vasut
2016-06-10 2:04 ` [U-Boot] [PATCH V3 " Marek Vasut
1 sibling, 0 replies; 15+ messages in thread
From: Marek Vasut @ 2016-06-10 2:03 UTC (permalink / raw)
To: u-boot
On 06/10/2016 03:39 AM, Simon Glass wrote:
> Hi Marek,
Hi,
> On 9 June 2016 at 18:21, 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>
>> ---
>> 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
^ permalink raw reply [flat|nested] 15+ messages in thread* [U-Boot] [PATCH V3 1/3] serial: 16550: Add getfcr accessor
2016-06-10 1:39 ` Simon Glass
2016-06-10 2:03 ` Marek Vasut
@ 2016-06-10 2:04 ` Marek Vasut
2016-06-10 2:37 ` Simon Glass
1 sibling, 1 reply; 15+ messages in thread
From: Marek Vasut @ 2016-06-10 2:04 UTC (permalink / raw)
To: u-boot
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>
---
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.
---
drivers/serial/ns16550.c | 24 +++++++++++++++++++++---
include/ns16550.h | 1 +
2 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c
index c6cb3eb..728f338 100644
--- a/drivers/serial/ns16550.c
+++ b/drivers/serial/ns16550.c
@@ -120,6 +120,17 @@ 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)
+{
+#ifdef CONFIG_DEBUG_UART_NS16550
+ return UART_FCRVAL;
+#else
+ struct ns16550_platdata *plat = port->plat;
+
+ return plat->fcr;
+#endif
+}
+
/* We can clean these up once everything is moved to driver model */
#define serial_out(value, addr) \
ns16550_writeb(com_port, \
@@ -127,6 +138,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 +186,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 +207,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 +278,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 +421,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
^ permalink raw reply related [flat|nested] 15+ messages in thread* [U-Boot] [PATCH V3 1/3] serial: 16550: Add getfcr accessor
2016-06-10 2:04 ` [U-Boot] [PATCH V3 " Marek Vasut
@ 2016-06-10 2:37 ` Simon Glass
2016-06-10 2:44 ` [U-Boot] [PATCH V4 " Marek Vasut
0 siblings, 1 reply; 15+ messages in thread
From: Simon Glass @ 2016-06-10 2:37 UTC (permalink / raw)
To: u-boot
Hi Marek,
On 9 June 2016 at 19:04, 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>
> ---
> 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.
> ---
> drivers/serial/ns16550.c | 24 +++++++++++++++++++++---
> include/ns16550.h | 1 +
> 2 files changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c
> index c6cb3eb..728f338 100644
> --- a/drivers/serial/ns16550.c
> +++ b/drivers/serial/ns16550.c
> @@ -120,6 +120,17 @@ 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)
> +{
> +#ifdef CONFIG_DEBUG_UART_NS16550
> + return UART_FCRVAL;
> +#else
Not here...
> + struct ns16550_platdata *plat = port->plat;
> +
> + return plat->fcr;
> +#endif
> +}
> +
> /* We can clean these up once everything is moved to driver model */
> #define serial_out(value, addr) \
> ns16550_writeb(com_port, \
> @@ -127,6 +138,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 +186,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 +207,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 +278,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));
Just put UART_FCRVAL here instead of your function call.
>
> serial_dout(&com_port->lcr, UART_LCR_BKSE | UART_LCRVAL);
> serial_dout(&com_port->dll, baud_divisor & 0xff);
> @@ -405,6 +421,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
^ permalink raw reply [flat|nested] 15+ messages in thread* [U-Boot] [PATCH V4 1/3] serial: 16550: Add getfcr accessor
2016-06-10 2:37 ` Simon Glass
@ 2016-06-10 2:44 ` Marek Vasut
2016-06-10 2:48 ` Simon Glass
0 siblings, 1 reply; 15+ messages in thread
From: Marek Vasut @ 2016-06-10 2:44 UTC (permalink / raw)
To: u-boot
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>
---
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 c6cb3eb..880329b 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 */
@@ -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
^ permalink raw reply related [flat|nested] 15+ messages in thread* [U-Boot] [PATCH V4 1/3] serial: 16550: Add getfcr accessor
2016-06-10 2:44 ` [U-Boot] [PATCH V4 " Marek Vasut
@ 2016-06-10 2:48 ` Simon Glass
0 siblings, 0 replies; 15+ messages in thread
From: Simon Glass @ 2016-06-10 2:48 UTC (permalink / raw)
To: u-boot
On 9 June 2016 at 19:44, 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>
> ---
> 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(-)
Reviewed-by: Simon Glass <sjg@chromium.org>
^ permalink raw reply [flat|nested] 15+ messages in thread