]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/core/device.c
dm: core: Add functions for iterating through device children
[karo-tx-uboot.git] / drivers / core / device.c
index 166b0732ab9e2ece25c292e42dec8ffc63102500..9538874017ac4865acc30177b6982b1e6e0f4fd1 100644 (file)
@@ -106,13 +106,18 @@ int device_bind(struct udevice *parent, struct driver *drv, const char *name,
         * a 'requested' sequence, and will be resolved (and ->seq updated)
         * when the device is probed.
         */
-       dev->req_seq = fdtdec_get_int(gd->fdt_blob, of_offset, "reg", -1);
        dev->seq = -1;
+#ifdef CONFIG_OF_CONTROL
+       dev->req_seq = fdtdec_get_int(gd->fdt_blob, of_offset, "reg", -1);
+       if (!IS_ERR_VALUE(dev->req_seq))
+               dev->req_seq &= INT_MAX;
        if (uc->uc_drv->name && of_offset != -1) {
                fdtdec_get_alias_seq(gd->fdt_blob, uc->uc_drv->name, of_offset,
                                     &dev->req_seq);
        }
-
+#else
+       dev->req_seq = -1;
+#endif
        if (!dev->platdata && drv->platdata_auto_alloc_size)
                dev->flags |= DM_FLAG_ALLOC_PDATA;
 
@@ -509,3 +514,30 @@ int device_get_child_by_of_offset(struct udevice *parent, int seq,
        ret = device_find_child_by_of_offset(parent, seq, &dev);
        return device_get_device_tail(dev, ret, devp);
 }
+
+int device_find_first_child(struct udevice *parent, struct udevice **devp)
+{
+       if (list_empty(&parent->child_head)) {
+               *devp = NULL;
+       } else {
+               *devp = list_first_entry(&parent->child_head, struct udevice,
+                                        sibling_node);
+       }
+
+       return 0;
+}
+
+int device_find_next_child(struct udevice **devp)
+{
+       struct udevice *dev = *devp;
+       struct udevice *parent = dev->parent;
+
+       if (list_is_last(&dev->sibling_node, &parent->child_head)) {
+               *devp = NULL;
+       } else {
+               *devp = list_entry(dev->sibling_node.next, struct udevice,
+                                  sibling_node);
+       }
+
+       return 0;
+}