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 <[email protected]>
Cc: Tom Rini <[email protected]>
Cc: Simon Glass <[email protected]>
---
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

_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to