[U-Boot] [PATCH] dm: gpio: MPC85XX GPIO platform data support

Mario Six mario.six at gdsys.cc
Mon May 30 10:01:13 CEST 2016


Hi Hamish,

On Mon, May 30, 2016 at 2:57 AM, 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>
> ---
>  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)

Missing semicolon :-)

>         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,

boards using device tree need a

.platdata_auto_alloc_size = sizeof(struct mpc85xx_gpio_plat),

here, otherwise the data structure is not allocated properly.

> +#endif
>         .probe  = mpc85xx_gpio_probe,
>         .priv_auto_alloc_size = sizeof(struct mpc85xx_gpio_data),
>  };
> --
> 2.8.3
>

Aside from that:

Reviewed-By: Mario Six <mario.six at gdsys.cc>
Tested-By: Mario Six <mario.six at gdsys.cc> (on P1022)

Best regards,
Mario


More information about the U-Boot mailing list