On Tue, Aug 24, 2021 at 3:46 PM Bharat Kumar Reddy Gooty <bharat.go...@broadcom.com> wrote: > > From: Bharat Gooty <bharat.go...@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.kokata...@broadcom.com> > Signed-off-by: Bharat Gooty <bharat.go...@broadcom.com> > --- > drivers/pinctrl/pinctrl-single.c | 52 ++++++++++++++++++++++++++++++++ > 1 file changed, 52 insertions(+) > > 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 > + * @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"; > + 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"); > + > dev_dbg(dev, "%d pins\n", priv->npins); > return 0; > } > -- > 2.17.1 >
Acked-by: Rayagonda Kokatanur <rayagonda.kokata...@broadcom.com>
smime.p7s
Description: S/MIME Cryptographic Signature