Eric Auger <eric.au...@linaro.org> writes: > This new helper routine returns the node path of a device > referred to by its name and compat string. > > Signed-off-by: Eric Auger <eric.au...@linaro.org> > --- > device_tree.c | 40 ++++++++++++++++++++++++++++++++++++++++ > include/sysemu/device_tree.h | 3 +++ > 2 files changed, 43 insertions(+) > > diff --git a/device_tree.c b/device_tree.c > index 58a5329..f184e3c 100644 > --- a/device_tree.c > +++ b/device_tree.c > @@ -171,6 +171,46 @@ static int findnode_nofail(void *fdt, const char > *node_path) > return offset; > } > > +/** > + * qemu_fdt_node_path > + * > + * return the node path of a device, referred to by its node name > + * and its compat string > + * fdt: pointer to the dt blob > + * name: name of the device > + * compat: compatibility string of the device > + * > + * returns the node path > + */ > +int qemu_fdt_node_path(void *fdt, const char *name, char *compat, > + char **node_path) > +{ > + int offset = 0, len; > + const char *iter_name; > + char path[256]; > + int ret; > + > + *node_path = NULL; > + while (1) { > + offset = fdt_node_offset_by_compatible(fdt, offset, compat); > + if (offset == -FDT_ERR_NOTFOUND) {
Is this not the only error code fdt_node_offset_by_compatible() won't return? > + break; > + } > + iter_name = fdt_get_name(fdt, offset, &len); > + if (!strncmp(iter_name, name, len)) { is it possible for fdt_get_name to fail here and give you NULL and -len? > + goto found; > + } > + } > + return offset; > + > +found: > + ret = fdt_get_path(fdt, offset, path, 256); > + if (!ret) { > + *node_path = g_strdup(path); > + } > + return ret; > +} > + > int qemu_fdt_setprop(void *fdt, const char *node_path, > const char *property, const void *val, int size) > { > diff --git a/include/sysemu/device_tree.h b/include/sysemu/device_tree.h > index 307e53d..f9e6e6e 100644 > --- a/include/sysemu/device_tree.h > +++ b/include/sysemu/device_tree.h > @@ -18,6 +18,9 @@ void *create_device_tree(int *sizep); > void *load_device_tree(const char *filename_path, int *sizep); > void *load_device_tree_from_sysfs(void); > > +int qemu_fdt_node_path(void *fdt, const char *name, char *compat, > + char **node_path); > + > int qemu_fdt_setprop(void *fdt, const char *node_path, > const char *property, const void *val, int size); > int qemu_fdt_setprop_cell(void *fdt, const char *node_path, -- Alex Bennée