Message ID | 1464287988-6452-1-git-send-email-marex@denx.de |
---|---|
State | Superseded |
Delegated to: | Daniel Schwierzeck |
Headers | show |
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
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.
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 --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;
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(-)