[U-Boot] [PATCH] dm: gpio: MPC85XX GPIO platform data support
Mario Six
mario.six at gdsys.cc
Tue May 31 07:58:02 CEST 2016
Hi Hamish,
On Mon, May 30, 2016 at 11:00 PM, Hamish Martin
<hamish.martin at alliedtelesis.co.nz> wrote:
> Define a platform data structure for the MPC85XX GPIO driver to allow
> use of the driver without device tree. Users should define the GPIO
> blocks for their platform like this:
> struct mpc85xx_gpio_plat gpio_blocks[] = {
> {
> .addr = 0x130000,
> .ngpios = 32,
> },
> {
> .addr = 0x131000,
> .ngpios = 32,
> },
> };
>
> U_BOOT_DEVICES(my_platform_gpios) = {
> { "gpio_mpc85xx", &gpio_blocks[0] },
> { "gpio_mpc85xx", &gpio_blocks[1] },
> };
>
> This is intended to build upon the recent submission of the base
> MPC85XX driver from Mario Six. We need to use that new driver
> without dts support and this patch gives us that flexibility.
> This has been tested on a Freescale T2080 CPU, although only the first
> GPIO block.
>
> Signed-off-by: Hamish Martin <hamish.martin at alliedtelesis.co.nz>
> Reviewed-by: Mario Six <mario.six at gdsys.cc>
> Tested-by: Mario Six <mario.six at gdsys.cc>
> ---
> arch/powerpc/include/asm/arch-mpc85xx/gpio.h | 6 +++++
> drivers/gpio/mpc85xx_gpio.c | 36 ++++++++++++++++++++++------
> 2 files changed, 35 insertions(+), 7 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/arch-mpc85xx/gpio.h b/arch/powerpc/include/asm/arch-mpc85xx/gpio.h
> index 41b6677bba38..76faa22c8b43 100644
> --- a/arch/powerpc/include/asm/arch-mpc85xx/gpio.h
> +++ b/arch/powerpc/include/asm/arch-mpc85xx/gpio.h
> @@ -18,4 +18,10 @@
> #include <asm/mpc85xx_gpio.h>
> #endif
>
> +struct mpc85xx_gpio_plat {
> + ulong addr;
> + unsigned long size;
> + uint ngpios;
> +};
> +
> #endif
> diff --git a/drivers/gpio/mpc85xx_gpio.c b/drivers/gpio/mpc85xx_gpio.c
> index 04773e2b31c3..c4563bee4d84 100644
> --- a/drivers/gpio/mpc85xx_gpio.c
> +++ b/drivers/gpio/mpc85xx_gpio.c
> @@ -163,23 +163,41 @@ static int mpc85xx_gpio_get_function(struct udevice *dev, unsigned gpio)
> return dir ? GPIOF_OUTPUT : GPIOF_INPUT;
> }
>
> +#if CONFIG_IS_ENABLED(OF_CONTROL)
> static int mpc85xx_gpio_ofdata_to_platdata(struct udevice *dev) {
> - struct mpc85xx_gpio_data *data = dev_get_priv(dev);
> + struct mpc85xx_gpio_plat *plat = dev_get_platdata(dev)
> fdt_addr_t addr;
> fdt_size_t size;
>
> addr = fdtdec_get_addr_size_auto_noparent(gd->fdt_blob, dev->of_offset,
> "reg", 0, &size);
>
> - data->addr = addr;
> - data->base = map_sysmem(CONFIG_SYS_IMMR + addr, size);
> + plat->addr = addr;
> + plat->size = size;
> + plat->ngpios = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
> + "ngpios", 32);
>
> - if (!data->base)
> + return 0;
> +}
> +#endif
> +
> +static int mpc85xx_gpio_platdata_to_priv(struct udevice *dev)
> +{
> + struct mpc85xx_gpio_data *priv = dev_get_priv(dev);
> + struct mpc85xx_gpio_plat *plat = dev_get_platdata(dev);
> + unsigned long size = plat->size;
> +
> + if (size == 0)
> + size = 0x100;
> +
> + priv->addr = plat->addr;
> + priv->base = map_sysmem(CONFIG_SYS_IMMR + plat->addr, size);
> +
> + if (!priv->base)
> return -ENOMEM;
>
> - data->gpio_count = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
> - "ngpios", 32);
> - data->dat_shadow = 0;
> + priv->gpio_count = plat->ngpios;
> + priv->dat_shadow = 0;
>
> return 0;
> }
> @@ -190,6 +208,8 @@ static int mpc85xx_gpio_probe(struct udevice *dev)
> struct mpc85xx_gpio_data *data = dev_get_priv(dev);
> char name[32], *str;
>
> + mpc85xx_gpio_platdata_to_priv(dev);
> +
> snprintf(name, sizeof(name), "MPC@%lx_", data->addr);
> str = strdup(name);
>
> @@ -221,8 +241,10 @@ U_BOOT_DRIVER(gpio_mpc85xx) = {
> .name = "gpio_mpc85xx",
> .id = UCLASS_GPIO,
> .ops = &gpio_mpc85xx_ops,
> +#if CONFIG_IS_ENABLED(OF_CONTROL)
> .ofdata_to_platdata = mpc85xx_gpio_ofdata_to_platdata,
> .of_match = mpc85xx_gpio_ids,
> +#endif
> .probe = mpc85xx_gpio_probe,
> .priv_auto_alloc_size = sizeof(struct mpc85xx_gpio_data),
> };
> --
> 2.8.3
>
There were two little corrections in my last reply (missing semicolon + missing
.platdata_auto_alloc_size); if you could add those, that would be great.
Best regards,
Mario
More information about the U-Boot
mailing list