[PATCH v2 2/2] gpio: fix request of PMIC GPIO child

Jonas Karlman jonas at kwiboo.se
Mon Dec 9 11:11:02 CET 2024


Hi Svyatoslav,

On 2024-12-09 07:44, Svyatoslav Ryhel wrote:
> If correct PMIC child was found it should be requested as well.
> 
> Signed-off-by: Svyatoslav Ryhel <clamor95 at gmail.com>
> ---
>  drivers/gpio/gpio-uclass.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/gpio/gpio-uclass.c b/drivers/gpio/gpio-uclass.c
> index e776906fe73..e6c00c48722 100644
> --- a/drivers/gpio/gpio-uclass.c
> +++ b/drivers/gpio/gpio-uclass.c
> @@ -1160,6 +1160,14 @@ static int gpio_request_tail(int ret, const char *nodename,
>  			/* if loop exits without GPIO device return error */
>  			if (device_get_uclass_id(desc->dev) != UCLASS_GPIO)
>  				goto err;
> +
> +			ret = uclass_get_device_by_name(UCLASS_GPIO, desc->dev->name,
> +							&desc->dev);
> +			if (ret) {
> +				log_debug("%s: getting GPIO device failed %d\n",
> +					  __func__, ret);
> +				goto err;
> +			}
>  #else
>  			debug("%s: uclass_get_device_by_ofnode failed\n",
>  			      __func__);

Instead of extending this PMIC/GPIO workaround maybe it is better to fix
the issue at bind time? Look like the max77663 pmic driver use
device_bind_driver() instead of device_bind_driver_to_node().

Also palmas gpio driver should not need to be bind, the DTs I can find
in tree all have a gpio node with compatible = ti,palmas-gpio. Do not
really understand why the palmas driver should need this workaround
the gpios props seem to bind to &palmas_gpio node in the DTs I checked.

Maybe something like following diff could work for your boards? I.e.
revert c03cd98d1a16 ("drivers: gpio-uclass: support PMIC GPIO children")
and bind gpio dirver to the pmic node.

Binding to pmic node should probably only happen if the pmic node has
the gpio-controller prop.

Regards,
Jonas

diff --git a/drivers/gpio/gpio-uclass.c b/drivers/gpio/gpio-uclass.c
index 0213271e3a69..67fc776cada2 100644
--- a/drivers/gpio/gpio-uclass.c
+++ b/drivers/gpio/gpio-uclass.c
@@ -1142,29 +1142,9 @@ static int gpio_request_tail(int ret, const char *nodename,
 		ret = uclass_get_device_by_ofnode(UCLASS_GPIO, args->node,
 						  &desc->dev);
 		if (ret) {
-#if CONFIG_IS_ENABLED(MAX77663_GPIO) || CONFIG_IS_ENABLED(PALMAS_GPIO)
-			struct udevice *pmic;
-			ret = uclass_get_device_by_ofnode(UCLASS_PMIC, args->node,
-							  &pmic);
-			if (ret) {
-				log_debug("%s: PMIC device get failed, err %d\n",
-					  __func__, ret);
-				goto err;
-			}
-
-			device_foreach_child(desc->dev, pmic) {
-				if (device_get_uclass_id(desc->dev) == UCLASS_GPIO)
-					break;
-			}
-
-			/* if loop exits without GPIO device return error */
-			if (device_get_uclass_id(desc->dev) != UCLASS_GPIO)
-				goto err;
-#else
 			debug("%s: uclass_get_device_by_ofnode failed\n",
 			      __func__);
 			goto err;
-#endif
 		}
 	}
 	ret = gpio_find_and_xlate(desc, args);
diff --git a/drivers/power/pmic/max77663.c b/drivers/power/pmic/max77663.c
index cf08b6a7e1df..838eae50740d 100644
--- a/drivers/power/pmic/max77663.c
+++ b/drivers/power/pmic/max77663.c
@@ -56,8 +56,8 @@ static int max77663_bind(struct udevice *dev)
 	}
 
 	if (IS_ENABLED(CONFIG_MAX77663_GPIO)) {
-		ret = device_bind_driver(dev, MAX77663_GPIO_DRIVER,
-					 "gpio", NULL);
+		ret = device_bind_driver_to_node(dev, MAX77663_GPIO_DRIVER,
+						 "gpio", dev_ofnode(dev), NULL);
 		if (ret) {
 			log_err("cannot bind GPIOs (ret = %d)\n", ret);
 			return ret;
diff --git a/drivers/power/pmic/palmas.c b/drivers/power/pmic/palmas.c
index f676bf641694..faa876f4e73d 100644
--- a/drivers/power/pmic/palmas.c
+++ b/drivers/power/pmic/palmas.c
@@ -45,7 +45,6 @@ static int palmas_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
 static int palmas_bind(struct udevice *dev)
 {
 	ofnode pmic_node = ofnode_null(), regulators_node;
-	ofnode subnode, gpio_node;
 	int children, ret;
 
 	if (IS_ENABLED(CONFIG_SYSRESET_PALMAS)) {
@@ -57,14 +56,6 @@ static int palmas_bind(struct udevice *dev)
 		}
 	}
 
-	gpio_node = ofnode_find_subnode(dev_ofnode(dev), "gpio");
-	if (ofnode_valid(gpio_node)) {
-		ret = device_bind_driver_to_node(dev, PALMAS_GPIO_DRIVER,
-						 "gpio", gpio_node, NULL);
-		if (ret)
-			log_err("cannot bind GPIOs (ret = %d)\n", ret);
-	}
-
 	dev_for_each_subnode(subnode, dev) {
 		const char *name;
 		char *temp;




More information about the U-Boot mailing list