Add a driver for the "snps,dw-apb-uart" used in socfpga and others.
This driver is required to get OF_PLATDATA to work for socfpga. It uses the ns16550 driver, converting the platdata from of-platdata go the ns16550 format. Signed-off-by: Simon Goldschmidt <simon.k.r.goldschm...@gmail.com> --- drivers/serial/Kconfig | 10 ++++++++ drivers/serial/Makefile | 1 + drivers/serial/serial_dw_apb.c | 42 ++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 drivers/serial/serial_dw_apb.c diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index b7ff2960ab..10addd3309 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -511,6 +511,16 @@ config BCM283X_PL011_SERIAL that supports automatic disable, so that it only gets used when the UART is actually muxed. +config DESIGNWARE_SERIAL + bool "DesignWare UART support" + depends on DM_SERIAL && SPL_OF_PLATDATA + help + Select this to enable a UART driver for "snps,dw-apb-uart" devices + when using CONFIG_SPL_OF_PLATDATA (i.e. a compiled-in device tree + replacement). + This uses the ns16550 driver, converting the platdata from of-platdata + to the ns16550 format. + config BCM6345_SERIAL bool "Support for BCM6345 UART" depends on DM_SERIAL diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile index 06ee30697d..f1ebb90d92 100644 --- a/drivers/serial/Makefile +++ b/drivers/serial/Makefile @@ -46,6 +46,7 @@ obj-$(CONFIG_MESON_SERIAL) += serial_meson.o obj-$(CONFIG_INTEL_MID_SERIAL) += serial_intel_mid.o ifdef CONFIG_SPL_BUILD obj-$(CONFIG_ROCKCHIP_SERIAL) += serial_rockchip.o +obj-$(CONFIG_DESIGNWARE_SERIAL) += serial_dw_apb.o endif obj-$(CONFIG_XILINX_UARTLITE) += serial_xuartlite.o obj-$(CONFIG_SANDBOX_SERIAL) += sandbox.o diff --git a/drivers/serial/serial_dw_apb.c b/drivers/serial/serial_dw_apb.c new file mode 100644 index 0000000000..26580e5ba5 --- /dev/null +++ b/drivers/serial/serial_dw_apb.c @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2018 Simon Goldschmidt + */ + +#include <common.h> +#include <dm.h> +#include <dt-structs.h> +#include <ns16550.h> +#include <serial.h> + +#if CONFIG_IS_ENABLED(OF_PLATDATA) +struct dw_apb_uart_platdata { + struct dtd_snps_dw_apb_uart dtplat; + struct ns16550_platdata plat; +}; + +static int dw_apb_serial_probe(struct udevice *dev) +{ + struct dw_apb_uart_platdata *plat = dev_get_platdata(dev); + + /* Set up correct platform data for the standard driver */ + plat->plat.base = plat->dtplat.reg[0]; + plat->plat.reg_shift = plat->dtplat.reg_shift; + plat->plat.reg_width = plat->dtplat.reg_io_width; + plat->plat.clock = plat->dtplat.clock_frequency; + plat->plat.fcr = UART_FCR_DEFVAL; + dev->platdata = &plat->plat; + + return ns16550_serial_probe(dev); +} + +U_BOOT_DRIVER(snps_dw_apb_uart) = { + .name = "snps_dw_apb_uart", + .id = UCLASS_SERIAL, + .priv_auto_alloc_size = sizeof(struct NS16550), + .platdata_auto_alloc_size = sizeof(struct dw_apb_uart_platdata), + .probe = dw_apb_serial_probe, + .ops = &ns16550_serial_ops, + .flags = DM_FLAG_PRE_RELOC, +}; +#endif -- 2.17.1 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot