mirror of https://gitee.com/openkylin/linux.git
[POWERPC] bootwrapper: Add ft_find_node_by_prop_value().
ft_find_node_by_prop_value() finds nodes with the specified property/value pair. Signed-off-by: Scott Wood <scottwood@freescale.com> Acked-by: Mark A. Greer <mgreer@mvista.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
a9ec7669fc
commit
8941c0c495
|
@ -820,6 +820,71 @@ int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *__ft_find_node_by_prop_value(struct ft_cxt *cxt, void *prev,
|
||||||
|
const char *propname, const char *propval,
|
||||||
|
unsigned int proplen)
|
||||||
|
{
|
||||||
|
struct ft_atom atom;
|
||||||
|
char *p = ft_root_node(cxt);
|
||||||
|
char *next;
|
||||||
|
int past_prev = prev ? 0 : 1;
|
||||||
|
int depth = -1;
|
||||||
|
|
||||||
|
while ((next = ft_next(cxt, p, &atom)) != NULL) {
|
||||||
|
const void *data;
|
||||||
|
unsigned int size;
|
||||||
|
|
||||||
|
switch (atom.tag) {
|
||||||
|
case OF_DT_BEGIN_NODE:
|
||||||
|
depth++;
|
||||||
|
|
||||||
|
if (prev == p) {
|
||||||
|
past_prev = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!past_prev || depth < 1)
|
||||||
|
break;
|
||||||
|
|
||||||
|
data = __ft_get_prop(cxt, p, propname, &size);
|
||||||
|
if (!data || size != proplen)
|
||||||
|
break;
|
||||||
|
if (memcmp(data, propval, size))
|
||||||
|
break;
|
||||||
|
|
||||||
|
return p;
|
||||||
|
|
||||||
|
case OF_DT_END_NODE:
|
||||||
|
if (depth-- == 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *ft_find_node_by_prop_value(struct ft_cxt *cxt, const void *prev,
|
||||||
|
const char *propname, const char *propval,
|
||||||
|
int proplen)
|
||||||
|
{
|
||||||
|
void *node = NULL;
|
||||||
|
|
||||||
|
if (prev) {
|
||||||
|
node = ft_node_ph2node(cxt, prev);
|
||||||
|
|
||||||
|
if (!node)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = __ft_find_node_by_prop_value(cxt, node, propname,
|
||||||
|
propval, proplen);
|
||||||
|
return ft_get_phandle(cxt, node);
|
||||||
|
}
|
||||||
|
|
||||||
int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
|
int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
|
||||||
const void *buf, const unsigned int buflen)
|
const void *buf, const unsigned int buflen)
|
||||||
{
|
{
|
||||||
|
|
|
@ -105,5 +105,8 @@ int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
|
||||||
int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
|
int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
|
||||||
const void *buf, const unsigned int buflen);
|
const void *buf, const unsigned int buflen);
|
||||||
void *ft_get_parent(struct ft_cxt *cxt, const void *phandle);
|
void *ft_get_parent(struct ft_cxt *cxt, const void *phandle);
|
||||||
|
void *ft_find_node_by_prop_value(struct ft_cxt *cxt, const void *prev,
|
||||||
|
const char *propname, const char *propval,
|
||||||
|
int proplen);
|
||||||
|
|
||||||
#endif /* FLATDEVTREE_H */
|
#endif /* FLATDEVTREE_H */
|
||||||
|
|
Loading…
Reference in New Issue