[PATCH 09/11] dm: core: Combine the flattree and livetree binding code

Simon Glass sjg at chromium.org
Sun Nov 29 01:50:08 CET 2020


At present there are two copies of this code. With ofnode we can combine
them to reduce duplication. Update the dm_scan_fdt_node() function and
adjust its callers.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

 drivers/core/root.c | 74 ++++++++++-----------------------------------
 1 file changed, 16 insertions(+), 58 deletions(-)

diff --git a/drivers/core/root.c b/drivers/core/root.c
index 9ee65504e6e..62efa0fedcf 100644
--- a/drivers/core/root.c
+++ b/drivers/core/root.c
@@ -199,33 +199,6 @@ int dm_scan_platdata(bool pre_reloc_only)
 }
 
 #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
-static int dm_scan_fdt_live(struct udevice *parent,
-			    const struct device_node *node_parent,
-			    bool pre_reloc_only)
-{
-	struct device_node *np;
-	int ret = 0, err;
-
-	for (np = node_parent->child; np; np = np->sibling) {
-
-		if (!of_device_is_available(np)) {
-			pr_debug("   - ignoring disabled device\n");
-			continue;
-		}
-		err = lists_bind_fdt(parent, np_to_ofnode(np), NULL,
-				     pre_reloc_only);
-		if (err && !ret) {
-			ret = err;
-			debug("%s: ret=%d\n", np->name, ret);
-		}
-	}
-
-	if (ret)
-		dm_warn("Some drivers failed to bind\n");
-
-	return ret;
-}
-
 /**
  * dm_scan_fdt_node() - Scan the device tree and bind drivers for a node
  *
@@ -233,28 +206,30 @@ static int dm_scan_fdt_live(struct udevice *parent,
  * for each one.
  *
  * @parent: Parent device for the devices that will be created
- * @blob: Pointer to device tree blob
- * @offset: Offset of node to scan
+ * @node: Node to scan
  * @pre_reloc_only: If true, bind only drivers with the DM_FLAG_PRE_RELOC
  * flag. If false bind all drivers.
  * @return 0 if OK, -ve on error
  */
-static int dm_scan_fdt_node(struct udevice *parent, const void *blob,
-			    int offset, bool pre_reloc_only)
+static int dm_scan_fdt_node(struct udevice *parent, ofnode parent_node,
+			    bool pre_reloc_only)
 {
 	int ret = 0, err;
+	ofnode node;
+
+	if (!ofnode_valid(parent_node))
+		return 0;
 
-	for (offset = fdt_first_subnode(blob, offset);
-	     offset > 0;
-	     offset = fdt_next_subnode(blob, offset)) {
-		const char *node_name = fdt_get_name(blob, offset, NULL);
+	for (node = ofnode_first_subnode(parent_node);
+	     ofnode_valid(node);
+	     node = ofnode_next_subnode(node)) {
+		const char *node_name = ofnode_get_name(node);
 
-		if (!fdtdec_get_is_enabled(blob, offset)) {
+		if (!ofnode_is_enabled(node)) {
 			pr_debug("   - ignoring disabled device\n");
 			continue;
 		}
-		err = lists_bind_fdt(parent, offset_to_ofnode(offset), NULL,
-				     pre_reloc_only);
+		err = lists_bind_fdt(parent, node, NULL, pre_reloc_only);
 		if (err && !ret) {
 			ret = err;
 			debug("%s: ret=%d\n", node_name, ret);
@@ -269,24 +244,13 @@ static int dm_scan_fdt_node(struct udevice *parent, const void *blob,
 
 int dm_scan_fdt_dev(struct udevice *dev)
 {
-	if (!dev_of_valid(dev))
-		return 0;
-
-	if (of_live_active())
-		return dm_scan_fdt_live(dev, dev_np(dev),
-				gd->flags & GD_FLG_RELOC ? false : true);
-
-	return dm_scan_fdt_node(dev, gd->fdt_blob, dev_of_offset(dev),
+	return dm_scan_fdt_node(dev, dev_ofnode(dev),
 				gd->flags & GD_FLG_RELOC ? false : true);
 }
 
 int dm_scan_fdt(const void *blob, bool pre_reloc_only)
 {
-	if (of_live_active())
-		return dm_scan_fdt_live(gd->dm_root, gd_of_root(),
-					pre_reloc_only);
-
-	return dm_scan_fdt_node(gd->dm_root, blob, 0, pre_reloc_only);
+	return dm_scan_fdt_node(gd->dm_root, ofnode_root(), pre_reloc_only);
 }
 
 static int dm_scan_fdt_ofnode_path(const void *blob, const char *path,
@@ -295,14 +259,8 @@ static int dm_scan_fdt_ofnode_path(const void *blob, const char *path,
 	ofnode node;
 
 	node = ofnode_path(path);
-	if (!ofnode_valid(node))
-		return 0;
-
-	if (of_live_active())
-		return dm_scan_fdt_live(gd->dm_root, node.np, pre_reloc_only);
 
-	return dm_scan_fdt_node(gd->dm_root, blob, node.of_offset,
-				pre_reloc_only);
+	return dm_scan_fdt_node(gd->dm_root, node, pre_reloc_only);
 }
 
 int dm_extended_scan_fdt(const void *blob, bool pre_reloc_only)
-- 
2.29.2.454.gaff20da3a2-goog



More information about the U-Boot mailing list