Add functions to create a new device node and to create/set a new property based on the nodepath.
Signed-off-by: Sascha Hauer <s.ha...@pengutronix.de> --- drivers/of/base.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++ include/of.h | 3 ++ 2 files changed, 82 insertions(+) diff --git a/drivers/of/base.c b/drivers/of/base.c index d6c346d..ecc49c4 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -662,6 +662,41 @@ void of_delete_property(struct property *pp) free(pp); } +/** + * of_set_property - create a property for a given node + * @node - the node + * @name - the name of the property + * @val - the value for the property + * @len - the length of the properties value + * @create - if true, the property is created if not existing already + */ +int of_set_property(struct device_node *np, const char *name, const void *val, int len, + int create) +{ + struct property *pp; + + if (!np) + return -ENOENT; + + pp = of_find_property(np, name); + if (pp) { + void *data; + + free(pp->value); + data = xzalloc(len); + memcpy(data, val, len); + pp->value = data; + pp->length = len; + } else { + if (!create) + return -ENOENT; + + pp = of_new_property(np, name, val, len); + } + + return 0; +} + static struct device_d *add_of_device(struct device_node *node) { struct device_d *dev; @@ -886,6 +921,50 @@ struct device_node *of_find_child_by_name(struct device_node *node, const char * return NULL; } +/** + * of_create_node - create a new node including its parents + * @path - the nodepath to create + */ +struct device_node *of_create_node(struct device_node *root, const char *path) +{ + char *slash, *p, *freep; + struct device_node *tmp, *dn = root; + + if (*path != '/') + return NULL; + + path++; + + p = freep = xstrdup(path); + + while (1) { + if (!*p) + goto out; + + slash = strchr(p, '/'); + if (slash) + *slash = 0; + + tmp = of_find_child_by_name(dn, p); + if (tmp) + dn = tmp; + else + dn = of_new_node(dn, p); + + if (!dn) + goto out; + + if (!slash) + goto out; + + p = slash + 1; + } +out: + free(freep); + + return dn; +} + /* * Parse a flat device tree binary blob and store it in the barebox * internal tree format, diff --git a/include/of.h b/include/of.h index 933e855..12c5703 100644 --- a/include/of.h +++ b/include/of.h @@ -124,6 +124,9 @@ void of_delete_property(struct property *pp); int of_property_read_string(struct device_node *np, const char *propname, const char **out_string); +int of_set_property(struct device_node *node, const char *p, const void *val, int len, + int create); +struct device_node *of_create_node(struct device_node *root, const char *path); #ifdef CONFIG_OFDEVICE int of_parse_partitions(const char *cdevname, -- 1.7.10.4 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox