On Tue, 14 Nov 2023 at 19:18, Caleb Connolly <caleb.conno...@linaro.org> wrote: > > Linux devicetrees use the "gpio-ranges" property, add support for > parsing it instead of "gpio-count" so that upstream DTs can be used with > U-Boot. > > Signed-off-by: Caleb Connolly <caleb.conno...@linaro.org> > --- > arch/arm/dts/dragonboard410c.dts | 3 +-- > arch/arm/dts/dragonboard820c.dts | 3 +-- > arch/arm/dts/qcs404-evb.dts | 2 +- > arch/arm/dts/sdm845.dtsi | 3 +-- > drivers/gpio/qcom_pmic_gpio.c | 38 ++++++++++++++++++++++++++++++-------- > 5 files changed, 34 insertions(+), 15 deletions(-) > > diff --git a/arch/arm/dts/dragonboard410c.dts > b/arch/arm/dts/dragonboard410c.dts > index c41fee977813..6a4e3ccf17b1 100644 > --- a/arch/arm/dts/dragonboard410c.dts > +++ b/arch/arm/dts/dragonboard410c.dts > @@ -170,9 +170,8 @@ > compatible = "qcom,pm8916-gpio"; > reg = <0xc000 0x400>; > gpio-controller; > - gpio-count = <4>; > + gpio-ranges = <&pm8916_gpios 0 0 4>; > #gpio-cells = <2>; > - gpio-bank-name="pmic"; > }; > }; > > diff --git a/arch/arm/dts/dragonboard820c.dts > b/arch/arm/dts/dragonboard820c.dts > index 0d9c9f7a4922..146a0af8aafe 100644 > --- a/arch/arm/dts/dragonboard820c.dts > +++ b/arch/arm/dts/dragonboard820c.dts > @@ -132,9 +132,8 @@ > compatible = "qcom,pm8994-gpio"; > reg = <0xc000 0x400>; > gpio-controller; > - gpio-count = <24>; > + gpio-ranges = <&pm8994_gpios 0 0 22>; > #gpio-cells = <2>; > - gpio-bank-name="pm8994."; > }; > }; > > diff --git a/arch/arm/dts/qcs404-evb.dts b/arch/arm/dts/qcs404-evb.dts > index 84224a8a3d39..3bb580ba4e17 100644 > --- a/arch/arm/dts/qcs404-evb.dts > +++ b/arch/arm/dts/qcs404-evb.dts > @@ -378,7 +378,7 @@ > compatible = "qcom,pms405-gpio"; > reg = <0xc000 0x400>; > gpio-controller; > - gpio-count = <12>; > + gpio-ranges = <&pms405_gpios 0 0 12>; > #gpio-cells = <2>; > gpio-bank-name="pmic"; > }; > diff --git a/arch/arm/dts/sdm845.dtsi b/arch/arm/dts/sdm845.dtsi > index cd5d890e9a45..a26e9f411ee0 100644 > --- a/arch/arm/dts/sdm845.dtsi > +++ b/arch/arm/dts/sdm845.dtsi > @@ -103,9 +103,8 @@ > compatible = "qcom,pm8998-gpio"; > reg = <0xc000 0x1a00>; > gpio-controller; > - gpio-count = <21>; > + gpio-ranges = <&pm8998_gpios 0 0 26>; > #gpio-cells = <2>; > - gpio-bank-name = "pm8998."; > }; > }; > > diff --git a/drivers/gpio/qcom_pmic_gpio.c b/drivers/gpio/qcom_pmic_gpio.c > index 7b83c67fa464..f2424766e5cc 100644 > --- a/drivers/gpio/qcom_pmic_gpio.c > +++ b/drivers/gpio/qcom_pmic_gpio.c > @@ -245,23 +245,45 @@ static int qcom_gpio_probe(struct udevice *dev) > return 0; > } > > +/* > + * Parse basic GPIO count specified via the gpio-ranges property > + * as specified in Linux devicetrees > + * Returns < 0 on error, otherwise gpio count > + */ > +static int qcom_gpio_of_parse_ranges(struct udevice *dev) > +{ > + int ret; > + struct ofnode_phandle_args args; > + > + ret = ofnode_parse_phandle_with_args(dev_ofnode(dev), "gpio-ranges", > + NULL, 3, 0, &args); > + if (ret) > + return log_msg_ret("gpio-ranges", ret); > + > + return args.args[2]; > +} > + > static int qcom_gpio_of_to_plat(struct udevice *dev) > { > struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev); > + int ret; > > - uc_priv->gpio_count = dev_read_u32_default(dev, "gpio-count", 0); > - uc_priv->bank_name = dev_read_string(dev, "gpio-bank-name"); > - if (uc_priv->bank_name == NULL) > - uc_priv->bank_name = "qcom_pmic"; > + ret = qcom_gpio_of_parse_ranges(dev); > + if (ret > 0) > + uc_priv->gpio_count = ret; > + else > + return ret; > + > + uc_priv->bank_name = (const char *)dev->driver_data;
Do you see any value add for users to know the underlying PMIC chip id for GPIO bank_name? To me it is sufficient to just say that these GPIOs are coming from PMIC. In Linux I do see the driver data being used as an alternative way to provide GPIO count for older devicetree which doesn't provide "gpio-ranges" but I don't think that will be the case for u-boot. However, we can leave driver_data empty if it's not really needed. -Sumit > > return 0; > } > > static const struct udevice_id qcom_gpio_ids[] = { > - { .compatible = "qcom,pm8916-gpio" }, > - { .compatible = "qcom,pm8994-gpio" }, /* 22 GPIO's */ > - { .compatible = "qcom,pm8998-gpio" }, > - { .compatible = "qcom,pms405-gpio" }, > + { .compatible = "qcom,pm8916-gpio", .data = (ulong)&"pm8916_gpio" }, > + { .compatible = "qcom,pm8994-gpio", .data = (ulong)&"pm8994_gpio" }, > + { .compatible = "qcom,pm8998-gpio", .data = (ulong)&"pm8998_gpio" }, > + { .compatible = "qcom,pms405-gpio", .data = (ulong)&"pms405_gpio" }, > { } > }; > > > -- > 2.42.1 >