[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