[PATCH v1 1/2] pinctrl: single: Parse gpio details from dt
Rayagonda Kokatanur
rayagonda.kokatanur at broadcom.com
Mon Sep 13 08:40:57 CEST 2021
On Tue, Aug 24, 2021 at 3:46 PM 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(+)
>
> 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.kokatanur at broadcom.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4230 bytes
Desc: S/MIME Cryptographic Signature
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20210913/90eeab7b/attachment.bin>
More information about the U-Boot
mailing list