diff options
Diffstat (limited to 'drivers/serial/ns16550.c')
-rw-r--r-- | drivers/serial/ns16550.c | 49 |
1 files changed, 37 insertions, 12 deletions
diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c index 6e9b946..9b423a5 100644 --- a/drivers/serial/ns16550.c +++ b/drivers/serial/ns16550.c @@ -121,6 +121,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, \ @@ -128,6 +135,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) @@ -171,7 +183,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) || \ @@ -192,7 +204,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 */ @@ -348,10 +360,18 @@ int ns16550_serial_probe(struct udevice *dev) return 0; } +#if CONFIG_IS_ENABLED(OF_CONTROL) +enum { + PORT_NS16550 = 0, + PORT_JZ4780, +}; +#endif + #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA) 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; struct clk clk; int err; @@ -420,6 +440,10 @@ int ns16550_serial_ofdata_to_platdata(struct udevice *dev) return -EINVAL; } + plat->fcr = UART_FCRVAL; + if (port_type == PORT_JZ4780) + plat->fcr |= UART_FCR_UME; + return 0; } #endif @@ -439,16 +463,17 @@ 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 = "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 }, + { .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 |