qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RESEND RFC 3/6] device_tree: introduce qemu_fdt_node_path


From: Eric Auger
Subject: [Qemu-devel] [RESEND RFC 3/6] device_tree: introduce qemu_fdt_node_path
Date: Thu, 19 Nov 2015 15:22:05 +0000

This new helper routine returns the node path of a device
referred to by its name and compat string.

Signed-off-by: Eric Auger <address@hidden>
---
 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) {
+            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)
 {
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,
-- 
1.8.3.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]