[PATCH 14/21] dm: core: Provide a way to reset the device tree

Simon Glass sjg at chromium.org
Wed Aug 31 05:08:10 CEST 2022


At present there is only one device tree used by the ofnode functions,
except for some esoteric use of live tree. In preparation for supporting
more than one, add a way to reset the list of device trees.

For now this does nothing.

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

 common/board_r.c    | 2 ++
 include/dm/ofnode.h | 8 ++++++++
 lib/fdtdec.c        | 5 ++++-
 test/test-main.c    | 2 ++
 4 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/common/board_r.c b/common/board_r.c
index 56eb60fa275..77e9ca0581f 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -233,6 +233,8 @@ static int initr_dm(void)
 {
 	int ret;
 
+	oftree_reset();
+
 	/* Save the pre-reloc driver model and start a new one */
 	gd->dm_root_f = gd->dm_root;
 	gd->dm_root = NULL;
diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h
index 3b7ef793057..2b047c57d89 100644
--- a/include/dm/ofnode.h
+++ b/include/dm/ofnode.h
@@ -27,6 +27,14 @@ struct ofnode_phandle_args {
 	uint32_t args[OF_MAX_PHANDLE_ARGS];
 };
 
+/**
+ * oftree_reset() - reset the state of the oftree list
+ *
+ * Reset the oftree list so it can be started again. This should be called
+ * once the control FDT is in place, but before the ofnode interface is used.
+ */
+static inline void oftree_reset(void) {}
+
 /**
  * ofnode_to_np() - convert an ofnode to a live DT node pointer
  *
diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index 96b6b71a606..ffe3993aa76 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -13,7 +13,6 @@
 #include <log.h>
 #include <malloc.h>
 #include <net.h>
-#include <dm/of_extra.h>
 #include <env.h>
 #include <errno.h>
 #include <fdtdec.h>
@@ -24,6 +23,8 @@
 #include <serial.h>
 #include <asm/global_data.h>
 #include <asm/sections.h>
+#include <dm/ofnode.h>
+#include <dm/of_extra.h>
 #include <linux/ctype.h>
 #include <linux/lzo.h>
 #include <linux/ioport.h>
@@ -1668,6 +1669,8 @@ int fdtdec_setup(void)
 	ret = fdtdec_prepare_fdt();
 	if (!ret)
 		ret = fdtdec_board_setup(gd->fdt_blob);
+	oftree_reset();
+
 	return ret;
 }
 
diff --git a/test/test-main.c b/test/test-main.c
index 97ba25d927c..beca15041e0 100644
--- a/test/test-main.c
+++ b/test/test-main.c
@@ -8,6 +8,7 @@
 #include <console.h>
 #include <dm.h>
 #include <event.h>
+#include <dm/ofnode.h>
 #include <dm/root.h>
 #include <dm/test.h>
 #include <dm/uclass-internal.h>
@@ -95,6 +96,7 @@ static int dm_test_pre_run(struct unit_test_state *uts)
 
 	/* Determine whether to make the live tree available */
 	gd_set_of_root(of_live ? uts->of_root : NULL);
+	oftree_reset();
 	ut_assertok(dm_init(of_live));
 	uts->root = dm_root();
 
-- 
2.37.2.672.g94769d06f0-goog



More information about the U-Boot mailing list