aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/device.c23
-rw-r--r--core/test/run-device.c13
-rw-r--r--include/device.h3
3 files changed, 39 insertions, 0 deletions
diff --git a/core/device.c b/core/device.c
index 2de37c7..a9bfdb1 100644
--- a/core/device.c
+++ b/core/device.c
@@ -394,6 +394,29 @@ struct dt_node *dt_find_by_name(struct dt_node *root, const char *name)
return NULL;
}
+struct dt_node *dt_find_by_name_before_addr(struct dt_node *root, const char *name)
+{
+ struct dt_node *child, *match;
+ char *child_name;
+
+ list_for_each(&root->children, child, list) {
+ child_name = strdup(child->name);
+ if (!child_name)
+ return NULL;
+
+ child_name = strtok(child_name, "@");
+ if (!strcmp(child_name, name))
+ match = child;
+ else
+ match = dt_find_by_name_before_addr(child, name);
+
+ free(child_name);
+ if (match)
+ return match;
+ }
+
+ return NULL;
+}
struct dt_node *dt_new_check(struct dt_node *parent, const char *name)
{
diff --git a/core/test/run-device.c b/core/test/run-device.c
index 4a12382..13f360e 100644
--- a/core/test/run-device.c
+++ b/core/test/run-device.c
@@ -466,6 +466,19 @@ int main(void)
new_prop_ph = dt_prop_get_u32(ut2, "something");
assert(!(new_prop_ph == ev1_ph));
dt_free(subtree);
+
+ /* Test dt_find_by_name_before_addr */
+ root = dt_new_root("");
+ addr1 = dt_new_addr(root, "node", 0x1);
+ addr2 = dt_new_addr(root, "node0_1", 0x2);
+ assert(dt_find_by_name(root, "node@1") == addr1);
+ assert(dt_find_by_name(root, "node0_1@2") == addr2);
+ assert(dt_find_by_name_before_addr(root, "node") == addr1);
+ assert(dt_find_by_name_before_addr(root, "node0") == NULL);
+ assert(dt_find_by_name_before_addr(root, "node0_") == NULL);
+ assert(dt_find_by_name_before_addr(root, "node0_1") == addr2);
+ dt_free(root);
+
return 0;
}
diff --git a/include/device.h b/include/device.h
index 93fb90f..f2402cc 100644
--- a/include/device.h
+++ b/include/device.h
@@ -184,6 +184,9 @@ struct dt_node *dt_find_by_path(struct dt_node *root, const char *path);
/* Find a child node by name */
struct dt_node *dt_find_by_name(struct dt_node *root, const char *name);
+/* Find a child node by name and substring */
+struct dt_node *dt_find_by_name_before_addr(struct dt_node *root, const char *name);
+
/* Find a node by phandle */
struct dt_node *dt_find_by_phandle(struct dt_node *root, u32 phandle);