Message ID | 20231128-b4-qcom-dt-compat-v4-3-949d0982d1de@linaro.org |
---|---|
State | New |
Headers | show |
Series | Qualcomm PMIC fixes | expand |
On 28/11/2023 17:30, Caleb Connolly 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.connolly@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..1adc6566a36d 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 = "pmic"; > > 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", }, > + { .compatible = "qcom,pm8994-gpio", }, > + { .compatible = "qcom,pm8998-gpio", }, > + { .compatible = "qcom,pms405-gpio", }, > { } > }; > > Here you could introduce qcom_gpio_of_parse_ranges() and use it only if gpio-count doesn't exist, then in a separate patch change the DT and afterward remove the gpio-count code ? Neil
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..1adc6566a36d 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 = "pmic"; 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", }, + { .compatible = "qcom,pm8994-gpio", }, + { .compatible = "qcom,pm8998-gpio", }, + { .compatible = "qcom,pms405-gpio", }, { } };
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.connolly@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(-)