dm: core: implement ofnode/tree_parse_phandle() helper
authorChristian Marangi <ansuelsmth@gmail.com>
Sun, 10 Nov 2024 11:50:22 +0000 (12:50 +0100)
committerTom Rini <trini@konsulko.com>
Fri, 6 Dec 2024 19:00:40 +0000 (13:00 -0600)
Implement ofnode/tree_parse_phandle() helper as an equivalent of
of_parse_phandle to handle simple single value phandle.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
drivers/core/ofnode.c
include/dm/ofnode.h

index b9cc941..dc6ac06 100644 (file)
@@ -879,6 +879,64 @@ int ofnode_read_string_list(ofnode node, const char *property,
        return count;
 }
 
+ofnode ofnode_parse_phandle(ofnode node, const char *phandle_name,
+                           int index)
+{
+       ofnode phandle;
+
+       if (ofnode_is_np(node)) {
+               struct device_node *np;
+
+               np = of_parse_phandle(ofnode_to_np(node), phandle_name,
+                                     index);
+               if (!np)
+                       return ofnode_null();
+
+               phandle = np_to_ofnode(np);
+       } else {
+               struct fdtdec_phandle_args args;
+
+               if (fdtdec_parse_phandle_with_args(ofnode_to_fdt(node),
+                                                  ofnode_to_offset(node),
+                                                  phandle_name, NULL,
+                                                  0, index, &args))
+                       return ofnode_null();
+
+               phandle = offset_to_ofnode(args.node);
+       }
+
+       return phandle;
+}
+
+ofnode oftree_parse_phandle(oftree tree, ofnode node, const char *phandle_name,
+                           int index)
+{
+       ofnode phandle;
+
+       if (ofnode_is_np(node)) {
+               struct device_node *np;
+
+               np = of_root_parse_phandle(tree.np, ofnode_to_np(node),
+                                          phandle_name, index);
+               if (!np)
+                       return ofnode_null();
+
+               phandle = np_to_ofnode(np);
+       } else {
+               struct fdtdec_phandle_args args;
+
+               if (fdtdec_parse_phandle_with_args(tree.fdt,
+                                                  ofnode_to_offset(node),
+                                                  phandle_name, NULL,
+                                                  0, index, &args))
+                       return ofnode_null();
+
+               phandle = noffset_to_ofnode(node, args.node);
+       }
+
+       return phandle;
+}
+
 static void ofnode_from_fdtdec_phandle_args(ofnode node, struct fdtdec_phandle_args *in,
                                            struct ofnode_phandle_args *out)
 {
index 7ece688..eea6b13 100644 (file)
@@ -847,6 +847,18 @@ int ofnode_read_string_count(ofnode node, const char *property);
 int ofnode_read_string_list(ofnode node, const char *property,
                            const char ***listp);
 
+/**
+ * ofnode_parse_phandle() - Resolve a phandle property to an ofnode
+ *
+ * @node: node to check
+ * @phandle_name: Name of property holding a phandle value
+ * @index: For properties holding a table of phandles, this is the index into
+ *         the table
+ * Return: ofnode that the phandle points to or ofnode_null() on error.
+ */
+ofnode ofnode_parse_phandle(ofnode node, const char *phandle_name,
+                           int index);
+
 /**
  * ofnode_parse_phandle_with_args() - Find a node pointed by phandle in a list
  *
@@ -909,6 +921,20 @@ int ofnode_parse_phandle_with_args(ofnode node, const char *list_name,
 int ofnode_count_phandle_with_args(ofnode node, const char *list_name,
                                   const char *cells_name, int cell_count);
 
+/**
+ * oftree_parse_phandle() - Resolve a phandle property to an ofnode
+ *                         from a root node
+ *
+ * @tree: device tree to use
+ * @node: node to check
+ * @phandle_name: Name of property holding a phandle value
+ * @index: For properties holding a table of phandles, this is the index into
+ *         the table
+ * Return: ofnode that the phandle points to or ofnode_null() on error.
+ */
+ofnode oftree_parse_phandle(oftree tree, ofnode node, const char *phandle_name,
+                           int index);
+
 /**
  * oftree_parse_phandle_with_args() - Find a node pointed by phandle in a list
  *                                   from a root node