mmc: fsl_esdhc: workaround for hardware 3.3v IO reliability issue
[oweals/u-boot.git] / drivers / core / uclass.c
index c520ef113a2a3fbc8f155e19a763d579e601dbd5..2ab419cfe4da0171aee21d14d69a79d21d5d0f38 100644 (file)
@@ -11,6 +11,7 @@
 #include <common.h>
 #include <dm.h>
 #include <errno.h>
+#include <log.h>
 #include <malloc.h>
 #include <dm/device.h>
 #include <dm/device-internal.h>
@@ -118,12 +119,12 @@ int uclass_destroy(struct uclass *uc)
        while (!list_empty(&uc->dev_head)) {
                dev = list_first_entry(&uc->dev_head, struct udevice,
                                       uclass_node);
-               ret = device_remove(dev, DM_REMOVE_NORMAL);
+               ret = device_remove(dev, DM_REMOVE_NORMAL | DM_REMOVE_NO_PD);
                if (ret)
-                       return ret;
+                       return log_msg_ret("remove", ret);
                ret = device_unbind(dev);
                if (ret)
-                       return ret;
+                       return log_msg_ret("unbind", ret);
        }
 
        uc_drv = uc->uc_drv;
@@ -271,9 +272,6 @@ int uclass_find_device_by_name(enum uclass_id id, const char *name,
        return -ENODEV;
 }
 
-#if !CONFIG_IS_ENABLED(OF_CONTROL) || \
-    CONFIG_IS_ENABLED(OF_PLATDATA) || \
-    CONFIG_IS_ENABLED(OF_PRIOR_STAGE)
 int uclass_find_next_free_req_seq(enum uclass_id id)
 {
        struct uclass *uc;
@@ -295,7 +293,6 @@ int uclass_find_next_free_req_seq(enum uclass_id id)
 
        return max + 1;
 }
-#endif
 
 int uclass_find_device_by_seq(enum uclass_id id, int seq_or_req_seq,
                              bool find_req_seq, struct udevice **devp)
@@ -629,6 +626,23 @@ int uclass_next_device_check(struct udevice **devp)
        return device_probe(*devp);
 }
 
+int uclass_first_device_drvdata(enum uclass_id id, ulong driver_data,
+                               struct udevice **devp)
+{
+       struct udevice *dev;
+       struct uclass *uc;
+
+       uclass_id_foreach_dev(id, dev, uc) {
+               if (dev_get_driver_data(dev) == driver_data) {
+                       *devp = dev;
+
+                       return device_probe(dev);
+               }
+       }
+
+       return -ENODEV;
+}
+
 int uclass_bind_device(struct udevice *dev)
 {
        struct uclass *uc;