9
0
Fork 0

of: Add of_set_property and of_create_node

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.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2013-02-17 17:13:38 +01:00
parent 04bd477ee4
commit 6be4759579
2 changed files with 82 additions and 0 deletions

View File

@ -663,6 +663,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_amba_device(struct device_node *node)
{
struct amba_device *dev;
@ -942,6 +977,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,

View File

@ -138,6 +138,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,