mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-08 10:39:08 +00:00
dm: core: add ofnode and dev function to iterate on node property
Add functions to iterate on all property with livetree - dev_read_first_prop - dev_read_next_prop - dev_read_prop_by_prop and - ofnode_get_first_property - ofnode_get_next_property - ofnode_get_property_by_prop And helper: dev_for_each_property For example: struct ofprop property; dev_for_each_property(property, config) { value = dev_read_prop_by_prop(&property, &propname, &len); or: for (res = ofnode_get_first_property(node, &property); !res; res = ofnode_get_next_property(&property)) { value = ofnode_get_property_by_prop(&property, &propname, &len); .... } Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
719cab6d2e
commit
ce891fcada
8 changed files with 317 additions and 2 deletions
|
@ -171,6 +171,38 @@ const void *of_get_property(const struct device_node *np, const char *name,
|
|||
return pp ? pp->value : NULL;
|
||||
}
|
||||
|
||||
const struct property *of_get_first_property(const struct device_node *np)
|
||||
{
|
||||
if (!np)
|
||||
return NULL;
|
||||
|
||||
return np->properties;
|
||||
}
|
||||
|
||||
const struct property *of_get_next_property(const struct device_node *np,
|
||||
const struct property *property)
|
||||
{
|
||||
if (!np)
|
||||
return NULL;
|
||||
|
||||
return property->next;
|
||||
}
|
||||
|
||||
const void *of_get_property_by_prop(const struct device_node *np,
|
||||
const struct property *property,
|
||||
const char **name,
|
||||
int *lenp)
|
||||
{
|
||||
if (!np || !property)
|
||||
return NULL;
|
||||
if (name)
|
||||
*name = property->name;
|
||||
if (lenp)
|
||||
*lenp = property->length;
|
||||
|
||||
return property->value;
|
||||
}
|
||||
|
||||
static const char *of_prop_next_string(struct property *prop, const char *cur)
|
||||
{
|
||||
const void *curv = cur;
|
||||
|
|
|
@ -571,6 +571,54 @@ const void *ofnode_get_property(ofnode node, const char *propname, int *lenp)
|
|||
propname, lenp);
|
||||
}
|
||||
|
||||
int ofnode_get_first_property(ofnode node, struct ofprop *prop)
|
||||
{
|
||||
prop->node = node;
|
||||
|
||||
if (ofnode_is_np(node)) {
|
||||
prop->prop = of_get_first_property(ofnode_to_np(prop->node));
|
||||
if (!prop->prop)
|
||||
return -FDT_ERR_NOTFOUND;
|
||||
} else {
|
||||
prop->offset =
|
||||
fdt_first_property_offset(gd->fdt_blob,
|
||||
ofnode_to_offset(prop->node));
|
||||
if (prop->offset < 0)
|
||||
return prop->offset;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ofnode_get_next_property(struct ofprop *prop)
|
||||
{
|
||||
if (ofnode_is_np(prop->node)) {
|
||||
prop->prop = of_get_next_property(ofnode_to_np(prop->node),
|
||||
prop->prop);
|
||||
if (!prop->prop)
|
||||
return -FDT_ERR_NOTFOUND;
|
||||
} else {
|
||||
prop->offset = fdt_next_property_offset(gd->fdt_blob,
|
||||
prop->offset);
|
||||
if (prop->offset < 0)
|
||||
return prop->offset;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const void *ofnode_get_property_by_prop(const struct ofprop *prop,
|
||||
const char **propname, int *lenp)
|
||||
{
|
||||
if (ofnode_is_np(prop->node))
|
||||
return of_get_property_by_prop(ofnode_to_np(prop->node),
|
||||
prop->prop, propname, lenp);
|
||||
else
|
||||
return fdt_getprop_by_offset(gd->fdt_blob,
|
||||
prop->offset,
|
||||
propname, lenp);
|
||||
}
|
||||
|
||||
bool ofnode_is_available(ofnode node)
|
||||
{
|
||||
if (ofnode_is_np(node))
|
||||
|
|
|
@ -255,6 +255,22 @@ const void *dev_read_prop(const struct udevice *dev, const char *propname,
|
|||
return ofnode_get_property(dev_ofnode(dev), propname, lenp);
|
||||
}
|
||||
|
||||
int dev_read_first_prop(const struct udevice *dev, struct ofprop *prop)
|
||||
{
|
||||
return ofnode_get_first_property(dev_ofnode(dev), prop);
|
||||
}
|
||||
|
||||
int dev_read_next_prop(struct ofprop *prop)
|
||||
{
|
||||
return ofnode_get_next_property(prop);
|
||||
}
|
||||
|
||||
const void *dev_read_prop_by_prop(struct ofprop *prop,
|
||||
const char **propname, int *lenp)
|
||||
{
|
||||
return ofnode_get_property_by_prop(prop, propname, lenp);
|
||||
}
|
||||
|
||||
int dev_read_alias_seq(const struct udevice *dev, int *devnump)
|
||||
{
|
||||
ofnode node = dev_ofnode(dev);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue