[PATCH v2 1/2] of: rework of_node_cmp() to support short and full node names

yegorslists at googlemail.com yegorslists at googlemail.com
Tue Jan 12 02:16:38 PST 2016


From: Yegor Yefremov <yegorslists at googlemail.com>

Copy functionality of U-Boot's _fdt_nodename_eq() routine.

First it checks, if both node names are equal using the length
of the node in question and then it checks, if the in-tree
node has '@' as next character. This way following use cases are
possible:

If *.its file has following configurations:

        conf214 at 1 {
                description = "Boot Linux kernel with FDT blob (214)";
                kernel = "kernel at 1";
                fdt = "fdt220 at 1";
        };
        conf214 at 2 {
                description = "Boot Linux kernel with FDT blob (214 at 2)";
                kernel = "kernel at 1";
                fdt = "fdt210 at 1";
        };

Then:

> bootm /boot/kernel-fit.itb at conf214 - would select "conf214 at 1"
> bootm /boot/kernel-fit.itb at conf214@2 - would select "conf214 at 2"

Signed-off-by: Yegor Yefremov <yegorslists at googlemail.com>
---
Changes:
	v2: add of_node_cmp() description (Trent Piepho)

 drivers/of/base.c | 21 +++++++++++++++++++++
 include/of.h      |  2 +-
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index d12bfe3..971e27e 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -31,6 +31,27 @@
 #include <linux/err.h>
 
 /*
+ * Compare node names using the length of the node in question
+ * and then check, if the in-tree node has '@' as next character.
+ * This way both short names like 'name' and full like 'name at 1' will
+ * be accepted.
+ */
+int of_node_cmp(const char *s1, const char *s2)
+{
+	int len = strlen(s2);
+
+	if (strncasecmp(s1, s2, len) != 0)
+		return 1;
+
+	if (s1[len] == '\0')
+		return 0;
+	else if (!memchr(s2, '@', len) && (s1[len] == '@'))
+		return 0;
+	else
+		return 1;
+}
+
+/*
  * Iterate over all nodes of a tree. As a devicetree does not
  * have a dedicated list head, the start node (usually the root
  * node) will not be iterated over.
diff --git a/include/of.h b/include/of.h
index 75cc3c1..3b18eef 100644
--- a/include/of.h
+++ b/include/of.h
@@ -10,7 +10,6 @@
 /* Default string compare functions */
 #define of_compat_cmp(s1, s2, l)	strcasecmp((s1), (s2))
 #define of_prop_cmp(s1, s2)		strcmp((s1), (s2))
-#define of_node_cmp(s1, s2)		strcasecmp((s1), (s2))
 
 #define OF_BAD_ADDR      ((u64)-1)
 
@@ -104,6 +103,7 @@ struct device_node *of_unflatten_dtb(const void *fdt);
 struct cdev;
 
 #ifdef CONFIG_OFTREE
+extern int of_node_cmp(const char *s1, const char *s2);
 extern int of_n_addr_cells(struct device_node *np);
 extern int of_n_size_cells(struct device_node *np);
 
-- 
2.1.4




More information about the barebox mailing list