From: Andrew Jones <drjo...@redhat.com> qemu_fdt_add_path works like qemu_fdt_add_subnode, except it also recursively adds any missing parent nodes.
Cc: Peter Crosthwaite <crosthwaite.pe...@gmail.com> Cc: Alexander Graf <ag...@suse.de> Signed-off-by: Andrew Jones <drjo...@redhat.com> --- device_tree.c | 24 ++++++++++++++++++++++++ include/sysemu/device_tree.h | 1 + 2 files changed, 25 insertions(+) diff --git a/device_tree.c b/device_tree.c index b335dae707..1854be3a02 100644 --- a/device_tree.c +++ b/device_tree.c @@ -524,6 +524,30 @@ int qemu_fdt_add_subnode(void *fdt, const char *name) return retval; } +int qemu_fdt_add_path(void *fdt, const char *path) +{ + char *parent; + int offset; + + offset = fdt_path_offset(fdt, path); + if (offset < 0 && offset != -FDT_ERR_NOTFOUND) { + error_report("%s Couldn't find node %s: %s", __func__, path, + fdt_strerror(offset)); + exit(1); + } + + if (offset != -FDT_ERR_NOTFOUND) { + return offset; + } + + parent = g_strdup(path); + strrchr(parent, '/')[0] = '\0'; + qemu_fdt_add_path(fdt, parent); + g_free(parent); + + return qemu_fdt_add_subnode(fdt, path); +} + void qemu_fdt_dumpdtb(void *fdt, int size) { const char *dumpdtb = qemu_opt_get(qemu_get_machine_opts(), "dumpdtb"); diff --git a/include/sysemu/device_tree.h b/include/sysemu/device_tree.h index 982c89345f..15fb98af98 100644 --- a/include/sysemu/device_tree.h +++ b/include/sysemu/device_tree.h @@ -104,6 +104,7 @@ uint32_t qemu_fdt_get_phandle(void *fdt, const char *path); uint32_t qemu_fdt_alloc_phandle(void *fdt); int qemu_fdt_nop_node(void *fdt, const char *node_path); int qemu_fdt_add_subnode(void *fdt, const char *name); +int qemu_fdt_add_path(void *fdt, const char *path); #define qemu_fdt_setprop_cells(fdt, node_path, property, ...) \ do { \ -- 2.23.0