diff mbox series

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

Message ID 20231108-b4-qcom-dt-compat-v2-3-713233c72948@linaro.org
State New
Headers show
Series Qualcomm PMIC fixes | expand

Commit Message

Caleb Connolly Nov. 8, 2023, 4:20 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>
---
 drivers/gpio/qcom_pmic_gpio.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

Comments

Stephan Gerhold Nov. 9, 2023, 2:35 p.m. UTC | #1
On Wed, Nov 08, 2023 at 04:20:55PM +0000, 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>
> ---
>  drivers/gpio/qcom_pmic_gpio.c | 26 ++++++++++++++++++++++++++
>  1 file changed, 26 insertions(+)
> 
> diff --git a/drivers/gpio/qcom_pmic_gpio.c b/drivers/gpio/qcom_pmic_gpio.c
> index 7b83c67fa464..647d4143ce14 100644
> --- a/drivers/gpio/qcom_pmic_gpio.c
> +++ b/drivers/gpio/qcom_pmic_gpio.c
> @@ -245,11 +245,37 @@ 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);
> +	if (!uc_priv->gpio_count) {
> +		ret = qcom_gpio_of_parse_ranges(dev);
> +		if (ret > 0)
> +			uc_priv->gpio_count = ret;
> +		else
> +			printf("gpio-ranges error: %d\n", ret);
> +	}

I would drop support for the non-standard gpio-count and instead adjust
the existing device trees to use gpio-ranges (copied from the upstream
DTs).

>  	uc_priv->bank_name = dev_read_string(dev, "gpio-bank-name");
>  	if (uc_priv->bank_name == NULL)
>  		uc_priv->bank_name = "qcom_pmic";
> 

Maybe you can replace this property as well while you're at it. Perhaps
the default fallback name is sufficient. Alternatively one could
obtain the actual PMIC name from the compatible or similar.

Thanks,
Stephan
diff mbox series

Patch

diff --git a/drivers/gpio/qcom_pmic_gpio.c b/drivers/gpio/qcom_pmic_gpio.c
index 7b83c67fa464..647d4143ce14 100644
--- a/drivers/gpio/qcom_pmic_gpio.c
+++ b/drivers/gpio/qcom_pmic_gpio.c
@@ -245,11 +245,37 @@  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);
+	if (!uc_priv->gpio_count) {
+		ret = qcom_gpio_of_parse_ranges(dev);
+		if (ret > 0)
+			uc_priv->gpio_count = ret;
+		else
+			printf("gpio-ranges error: %d\n", ret);
+	}
 	uc_priv->bank_name = dev_read_string(dev, "gpio-bank-name");
 	if (uc_priv->bank_name == NULL)
 		uc_priv->bank_name = "qcom_pmic";