]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
drivers: gpio-uclass: support PMIC GPIO children
authorSvyatoslav Ryhel <clamor95@gmail.com>
Wed, 26 Jul 2023 14:10:06 +0000 (17:10 +0300)
committerSvyatoslav Ryhel <clamor95@gmail.com>
Tue, 19 Dec 2023 19:23:47 +0000 (21:23 +0200)
UCLASS_PMIC may have GPIO children without exposed fdt node,
in this case if requesting fails, check if uclass is PMIC.

Restrict build for supported devices only to save those precious
bytes on devices with no spare memory.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
drivers/gpio/gpio-uclass.c

index 7aece85a70ae738221c95d1c5f77f97bcef62513..4234cd912c9f0277d5af80fec249a3028c8ecc03 100644 (file)
@@ -1143,9 +1143,29 @@ 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);