[U-Boot] [PATCH v1 3/4] serial: add an of-platdata driver for "snps, dw-apb-uart"

Lukasz Majewski lukma at denx.de
Mon Jan 7 22:12:05 UTC 2019


Hi Simon,

> 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.goldschmidt at 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,

Is it possible/or is your application requiring the pinmux/clock setting
for this serial?

With OF_PLATDATA we don't need to parse (and provide) the DTS (and we
use the DM/DTS driver's code in a way similar to "native" one).

I'm wondering, if it would be possible to "mimic" the dependencies
between DM drivers without DTS parsing / providing overhead.

At least in my case I would need in SPL:

-> driver XXX (working with u-boot proper's DM/DTS)
	---> CLK (uclass-clk) to enable clocks
	---> pinctrl (to config pins)

As an example: uart or eMMC.

I'm aware that it would be possible to use the old "approach" to
configure pinmux and clk separately (as it is done now) and only
re-use the DM portion of driver with OF_PLATDATA having all the
necessary info.

However, I'm wondering if there is a better way to achieve it (or if I
misunderstood something).

> +};
> +#endif




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20190107/120a02ab/attachment.sig>


More information about the U-Boot mailing list