[PATCH v1 1/2] pinctrl: single: Parse gpio details from dt

Simon Glass sjg at chromium.org
Thu Sep 30 06:09:00 CEST 2021


Hi Bharat,

On Tue, 24 Aug 2021 at 04:16, Bharat Kumar Reddy Gooty
<bharat.gooty at broadcom.com> wrote:
>
> From: Bharat Gooty <bharat.gooty at broadcom.com>
>
> Parse different gpio properties from dt as part of probe
> function. This detail is required to enable pinctrl pad
> later when gpio lines are requested.
>
> Signed-off-by: Rayagonda Kokatanur <rayagonda.kokatanur at broadcom.com>
> Signed-off-by: Bharat Gooty <bharat.gooty at broadcom.com>
> ---
>  drivers/pinctrl/pinctrl-single.c | 52 ++++++++++++++++++++++++++++++++
>  1 file changed, 52 insertions(+)

Looks OK but please update the pinctrl.c test. Also please see below.

>
> diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c
> index cf9ad3670f..0f96cd5870 100644
> --- a/drivers/pinctrl/pinctrl-single.c
> +++ b/drivers/pinctrl/pinctrl-single.c
> @@ -8,6 +8,7 @@
>  #include <dm.h>
>  #include <dm/device_compat.h>
>  #include <dm/devres.h>
> +#include <dm/of_access.h>
>  #include <dm/pinctrl.h>
>  #include <linux/libfdt.h>
>  #include <linux/list.h>
> @@ -44,11 +45,27 @@ struct single_func {
>         unsigned int *pins;
>  };
>
> +/**
> + * struct single_gpiofunc_range - pin ranges with same mux value of gpio fun

fun?

> + * @offset: offset base of pins
> + * @npins: number pins with the same mux value of gpio function
> + * @gpiofunc: mux value of gpio function
> + * @node: list node
> + */
> +struct single_gpiofunc_range {
> +       u32 offset;
> +       u32 npins;
> +       u32 gpiofunc;
> +       struct list_head node;
> +};
> +
>  /**
>   * struct single_priv - private data
>   * @bits_per_pin: number of bits per pin
>   * @npins: number of selectable pins
>   * @pin_name: temporary buffer to store the pin name
> + * @functions: list pin functions
> + * @gpiofuncs: list gpio functions
>   */
>  struct single_priv {
>  #if (IS_ENABLED(CONFIG_SANDBOX))
> @@ -58,6 +75,7 @@ struct single_priv {
>         unsigned int npins;
>         char pin_name[PINNAME_SIZE];
>         struct list_head functions;
> +       struct list_head gpiofuncs;
>  };
>
>  /**
> @@ -454,6 +472,36 @@ static int single_get_pins_count(struct udevice *dev)
>         return priv->npins;
>  }
>
> +static int single_add_gpio_func(struct udevice *dev)
> +{
> +       struct single_priv *priv = dev_get_priv(dev);
> +       const char *propname = "pinctrl-single,gpio-range";

Can you please add the binding for this to U-Boot?

> +       const char *cellname = "#pinctrl-single,gpio-range-cells";
> +       struct single_gpiofunc_range *range;
> +       struct ofnode_phandle_args gpiospec;
> +       int ret, i;
> +
> +       for (i = 0; ; i++) {
> +               ret = ofnode_parse_phandle_with_args(dev_ofnode(dev), propname,
> +                                                    cellname, 0, i, &gpiospec);
> +               /* Do not treat it as error. Only treat it as end condition. */
> +               if (ret) {
> +                       ret = 0;
> +                       break;
> +               }
> +               range = devm_kzalloc(dev, sizeof(*range), GFP_KERNEL);
> +               if (!range) {
> +                       ret = -ENOMEM;
> +                       break;
> +               }
> +               range->offset = gpiospec.args[0];
> +               range->npins = gpiospec.args[1];
> +               range->gpiofunc = gpiospec.args[2];
> +               list_add_tail(&range->node, &priv->gpiofuncs);
> +       }
> +       return ret;
> +}
> +
>  static int single_probe(struct udevice *dev)
>  {
>         struct single_pdata *pdata = dev_get_plat(dev);
> @@ -461,6 +509,7 @@ static int single_probe(struct udevice *dev)
>         u32 size;
>
>         INIT_LIST_HEAD(&priv->functions);
> +       INIT_LIST_HEAD(&priv->gpiofuncs);
>
>         size = pdata->offset + pdata->width / BITS_PER_BYTE;
>         #if (CONFIG_IS_ENABLED(SANDBOX))
> @@ -483,6 +532,9 @@ static int single_probe(struct udevice *dev)
>                 priv->npins *= (pdata->width / priv->bits_per_pin);
>         }
>
> +       if (single_add_gpio_func(dev))
> +               dev_dbg(dev, "gpio functions are not added\n");

return the error here

> +
>         dev_dbg(dev, "%d pins\n", priv->npins);
>         return 0;
>  }
> --
> 2.17.1
>
>
> --
> This electronic communication and the information and any files transmitted
> with it, or attached to it, are confidential and are intended solely for
> the use of the individual or entity to whom it is addressed and may contain
> information that is confidential, legally privileged, protected by privacy
> laws, or otherwise restricted from disclosure to anyone else. If you are
> not the intended recipient or the person responsible for delivering the
> e-mail to the intended recipient, you are hereby notified that any use,
> copying, distributing, dissemination, forwarding, printing, or copying of
> this e-mail is strictly prohibited. If you received this e-mail in error,
> please return the e-mail to the sender, delete it from your computer, and
> destroy any printed copy of it.

Plesew drop this

Regards,
Simon


More information about the U-Boot mailing list