dm: board: complete the initialization of the muxes in initr_dm()
authorJean-Jacques Hiblot <jjhiblot@ti.com>
Fri, 16 Oct 2020 10:46:31 +0000 (16:16 +0530)
committerTom Rini <trini@konsulko.com>
Wed, 28 Oct 2020 15:48:55 +0000 (11:48 -0400)
This will probe the multiplexer devices that have a "u-boot,mux-autoprobe"
property. As a consequence they will be put in their idle state.

Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Pratyush Yadav <p.yadav@ti.com>
common/board_r.c
drivers/mux/mux-uclass.c
include/mux.h

index 9b2fec7..b9217b2 100644 (file)
@@ -46,6 +46,7 @@
 #include <miiphy.h>
 #endif
 #include <mmc.h>
+#include <mux.h>
 #include <nand.h>
 #include <of_live.h>
 #include <onenand_uboot.h>
@@ -341,6 +342,17 @@ static int initr_dm_devices(void)
                        return ret;
        }
 
+       if (IS_ENABLED(CONFIG_MULTIPLEXER)) {
+               /*
+                * Initialize the multiplexer controls to their default state.
+                * This must be done early as other drivers may unknowingly
+                * rely on it.
+                */
+               ret = dm_mux_init();
+               if (ret)
+                       return ret;
+       }
+
        return 0;
 }
 
index 815df93..a35c3d9 100644 (file)
@@ -304,6 +304,29 @@ static int mux_uclass_post_probe(struct udevice *dev)
        return 0;
 }
 
+int dm_mux_init(void)
+{
+       struct uclass *uc;
+       struct udevice *dev;
+       int ret;
+
+       ret = uclass_get(UCLASS_MUX, &uc);
+       if (ret < 0) {
+               log_debug("unable to get MUX uclass\n");
+               return ret;
+       }
+       uclass_foreach_dev(dev, uc) {
+               if (dev_read_bool(dev, "u-boot,mux-autoprobe")) {
+                       ret = device_probe(dev);
+                       if (ret)
+                               log_debug("unable to probe device %s\n",
+                                         dev->name);
+               }
+       }
+
+       return 0;
+}
+
 UCLASS_DRIVER(mux) = {
        .id             = UCLASS_MUX,
        .name           = "mux",
index 85eb7d4..23844f4 100644 (file)
@@ -109,6 +109,13 @@ void mux_control_put(struct mux_control *mux);
  */
 struct mux_control *devm_mux_control_get(struct udevice *dev,
                                         const char *mux_name);
+/**
+ * dm_mux_init() - Initialize the multiplexer controls to their default state.
+ *
+ * Return: 0 if OK, -errno otherwise.
+ */
+int dm_mux_init(void);
+
 #else
 unsigned int mux_control_states(struct mux_control *mux)
 {
@@ -142,6 +149,11 @@ struct mux_control *devm_mux_control_get(struct udevice *dev,
 {
        return NULL;
 }
+
+int dm_mux_init(void)
+{
+       return -ENOSYS;
+}
 #endif
 
 #endif