gpio: Get rid of gpio_hog_probe_all()
authorMarek Vasut <marex@denx.de>
Thu, 22 Sep 2022 15:53:26 +0000 (17:53 +0200)
committerTom Rini <trini@konsulko.com>
Thu, 12 Jan 2023 19:06:16 +0000 (14:06 -0500)
The gpio_hog_probe_all() functionality can be perfectly well replaced by
DM_FLAG_PROBE_AFTER_BIND DM flag, which would trigger .probe() callback
of each GPIO hog driver instance after .bind() and thus configure the
hogged GPIO accordingly.

Signed-off-by: Marek Vasut <marex@denx.de>
Signed-off-by: Quentin Schulz <quentin.schulz@theobroma-systems.com>
Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
Reviewed-by: Samuel Holland <samuel@sholland.org>
common/board_r.c
common/spl/spl.c
doc/README.gpio
drivers/gpio/gpio-uclass.c
include/asm-generic/gpio.h

index 42060ee..3618aca 100644 (file)
@@ -756,9 +756,6 @@ static init_fnc_t init_sequence_r[] = {
        initr_status_led,
 #endif
        /* PPC has a udelay(20) here dating from 2002. Why? */
-#if defined(CONFIG_GPIO_HOG)
-       gpio_hog_probe_all,
-#endif
 #ifdef CONFIG_BOARD_LATE_INIT
        board_late_init,
 #endif
index 4668367..a630e79 100644 (file)
@@ -786,9 +786,6 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
                }
        }
 
-       if (CONFIG_IS_ENABLED(GPIO_HOG))
-               gpio_hog_probe_all();
-
 #if CONFIG_IS_ENABLED(BOARD_INIT)
        spl_board_init();
 #endif
index 548ff37..d253f65 100644 (file)
@@ -2,10 +2,8 @@
 GPIO hog (CONFIG_GPIO_HOG)
 --------
 
-All the GPIO hog are initialized in gpio_hog_probe_all() function called in
-board_r.c just before board_late_init() but you can also acces directly to
-the gpio with gpio_hog_lookup_name().
-
+All the GPIO hog are initialized using DM_FLAG_PROBE_AFTER_BIND DM flag
+after bind().
 
 Example, for the device tree:
 
index 3a6ef3b..dbebf3a 100644 (file)
@@ -311,34 +311,11 @@ static int gpio_hog_probe(struct udevice *dev)
        return 0;
 }
 
-int gpio_hog_probe_all(void)
-{
-       struct udevice *dev;
-       int ret;
-       int retval = 0;
-
-       for (uclass_first_device(UCLASS_NOP, &dev);
-            dev;
-            uclass_find_next_device(&dev)) {
-               if (dev->driver == DM_DRIVER_GET(gpio_hog)) {
-                       ret = device_probe(dev);
-                       if (ret) {
-                               printf("Failed to probe device %s err: %d\n",
-                                      dev->name, ret);
-                               retval = ret;
-                       }
-               }
-       }
-
-       return retval;
-}
-
 int gpio_hog_lookup_name(const char *name, struct gpio_desc **desc)
 {
        struct udevice *dev;
 
        *desc = NULL;
-       gpio_hog_probe_all();
        if (!uclass_get_device_by_name(UCLASS_NOP, name, &dev)) {
                struct gpio_hog_priv *priv = dev_get_priv(dev);
 
@@ -1505,9 +1482,17 @@ static int gpio_post_bind(struct udevice *dev)
                                                                 &child);
                                if (ret)
                                        return ret;
+
+                               /*
+                                * Make sure gpio-hogs are probed after bind
+                                * since hogs can be essential to the hardware
+                                * system.
+                                */
+                               dev_or_flags(child, DM_FLAG_PROBE_AFTER_BIND);
                        }
                }
        }
+
        return 0;
 }
 
index 0fcf709..dd0bdf2 100644 (file)
@@ -462,14 +462,6 @@ int dm_gpio_lookup_name(const char *name, struct gpio_desc *desc);
 int gpio_hog_lookup_name(const char *name, struct gpio_desc **desc);
 
 /**
- * gpio_hog_probe_all() - probe all gpio devices with
- * gpio-hog subnodes.
- *
- * @return:    Returns return value from device_probe()
- */
-int gpio_hog_probe_all(void);
-
-/**
  * gpio_lookup_name - Look up a GPIO name and return its details
  *
  * This is used to convert a named GPIO into a device, offset and GPIO