@@ -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) {
+ break;
+ }
+ iter_name = fdt_get_name(fdt, offset, &len);
+ if (!strncmp(iter_name, name, 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)
{
@@ -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,
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.auger@linaro.org> --- device_tree.c | 40 ++++++++++++++++++++++++++++++++++++++++ include/sysemu/device_tree.h | 3 +++ 2 files changed, 43 insertions(+)