dm: core: Add support for getting node from aliases
authorMichal Simek <michal.simek@xilinx.com>
Tue, 28 Jul 2020 10:51:08 +0000 (12:51 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Tue, 27 Oct 2020 07:13:32 +0000 (08:13 +0100)
Add support for getting a node/property from aliases.
The similar functionality is provided for chosen node and this
implemenatation is copy of it.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
drivers/core/ofnode.c
include/dm/ofnode.h
test/dm/ofnode.c

index 7d1b895..a68076b 100644 (file)
@@ -476,6 +476,28 @@ ofnode ofnode_get_chosen_node(const char *name)
        return ofnode_path(prop);
 }
 
+const void *ofnode_read_aliases_prop(const char *propname, int *sizep)
+{
+       ofnode node;
+
+       node = ofnode_path("/aliases");
+
+       return ofnode_read_prop(node, propname, sizep);
+}
+
+ofnode ofnode_get_aliases_node(const char *name)
+{
+       const char *prop;
+
+       prop = ofnode_read_aliases_prop(name, NULL);
+       if (!prop)
+               return ofnode_null();
+
+       debug("%s: node_path: %s\n", __func__, prop);
+
+       return ofnode_path(prop);
+}
+
 int ofnode_get_child_count(ofnode parent)
 {
        ofnode child;
index 4b7af37..ced7f6f 100644 (file)
@@ -605,6 +605,28 @@ const char *ofnode_read_chosen_string(const char *propname);
  */
 ofnode ofnode_get_chosen_node(const char *propname);
 
+/**
+ * ofnode_read_aliases_prop() - get the value of a aliases property
+ *
+ * This looks for a property within the /aliases node and returns its value
+ *
+ * @propname: Property name to look for
+ * @sizep: Returns size of property, or FDT_ERR_... error code if function
+ *     returns NULL
+ * @return property value if found, else NULL
+ */
+const void *ofnode_read_aliases_prop(const char *propname, int *sizep);
+
+/**
+ * ofnode_get_aliases_node() - get a referenced node from the aliases node
+ *
+ * This looks up a named property in the aliases node and uses that as a path to
+ * look up a code.
+ *
+ * @return the referenced node if present, else ofnode_null()
+ */
+ofnode ofnode_get_aliases_node(const char *propname);
+
 struct display_timing;
 /**
  * ofnode_decode_display_timing() - decode display timings
index 01ac3c2..fb1ceb1 100644 (file)
@@ -207,6 +207,28 @@ static int dm_test_ofnode_read_chosen(struct unit_test_state *uts)
 }
 DM_TEST(dm_test_ofnode_read_chosen, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
 
+static int dm_test_ofnode_read_aliases(struct unit_test_state *uts)
+{
+       const void *val;
+       ofnode node;
+       int size;
+
+       node = ofnode_get_aliases_node("eth3");
+       ut_assert(ofnode_valid(node));
+       ut_asserteq_str("sbe5", ofnode_get_name(node));
+
+       node = ofnode_get_aliases_node("unknown");
+       ut_assert(!ofnode_valid(node));
+
+       val = ofnode_read_aliases_prop("spi0", &size);
+       ut_assertnonnull(val);
+       ut_asserteq(7, size);
+       ut_asserteq_str("/spi@0", (const char *)val);
+
+       return 0;
+}
+DM_TEST(dm_test_ofnode_read_aliases, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
+
 static int dm_test_ofnode_get_child_count(struct unit_test_state *uts)
 {
        ofnode node, child_node;