diff options
-rw-r--r-- | core/device.c | 23 | ||||
-rw-r--r-- | core/test/run-device.c | 13 | ||||
-rw-r--r-- | include/device.h | 3 |
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); |