diff mbox series

[v3,3/5] gpio: qcom_pmic: fix support for upstream DT

Message ID 20231114-b4-qcom-dt-compat-v3-3-88a92f8f00ba@linaro.org
State Superseded
Headers show
Series Qualcomm PMIC fixes | expand

Commit Message

Caleb Connolly Nov. 14, 2023, 1:48 p.m. UTC
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(-)

Comments

Sumit Garg Nov. 17, 2023, 5:27 a.m. UTC | #1
On Tue, 14 Nov 2023 at 19:18, Caleb Connolly <caleb.connolly@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.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..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
>
diff mbox series

Patch

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;
 
 	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" },
 	{ }
 };