dm: core: Add ofnode_get_chosen_prop()
authorSimon Glass <sjg@chromium.org>
Mon, 27 Jan 2020 15:49:46 +0000 (08:49 -0700)
committerSimon Glass <sjg@chromium.org>
Thu, 6 Feb 2020 02:33:45 +0000 (19:33 -0700)
Add a function to read a property from the chosen node, providing access
to its length. Update ofnode_get_chosen_string() to make use of it.

Signed-off-by: Simon Glass <sjg@chromium.org>
arch/sandbox/dts/test.dts
drivers/core/ofnode.c
include/dm/ofnode.h
test/dm/ofnode.c

index a04afd4076bb469b38efdee2b1c04872939b9246..347ea79077dfa358c060a88cbfa59331d5ba4e0b 100644 (file)
                #size-cells = <1>;
                setting = "sunrise ohoka";
                other-node = "/some-bus/c-test@5";
+               int-values = <0x1937 72993>;
                chosen-test {
                        compatible = "denx,u-boot-fdt-test";
                        reg = <9 1>;
index 4fc29a7c432b010297acbb63a1f345816e3727ab..f55ef15cee37beac3844ed1c50e0da2c999a0f24 100644 (file)
@@ -427,20 +427,25 @@ ofnode ofnode_path(const char *path)
                return offset_to_ofnode(fdt_path_offset(gd->fdt_blob, path));
 }
 
-const char *ofnode_read_chosen_string(const char *name)
+const void *ofnode_read_chosen_prop(const char *propname, int *sizep)
 {
        ofnode chosen_node;
 
        chosen_node = ofnode_path("/chosen");
 
-       return ofnode_read_string(chosen_node, name);
+       return ofnode_read_prop(chosen_node, propname, sizep);
+}
+
+const char *ofnode_read_chosen_string(const char *propname)
+{
+       return ofnode_read_chosen_prop(propname, NULL);
 }
 
 ofnode ofnode_get_chosen_node(const char *name)
 {
        const char *prop;
 
-       prop = ofnode_read_chosen_string(name);
+       prop = ofnode_read_chosen_prop(name, NULL);
        if (!prop)
                return ofnode_null();
 
index 80074836809bd6571f87e7d93efc3cc8c6bb1b9b..b5a50e88499a04d15b7e0c3cee29367a7ed31454 100644 (file)
@@ -520,6 +520,18 @@ int ofnode_count_phandle_with_args(ofnode node, const char *list_name,
  */
 ofnode ofnode_path(const char *path);
 
+/**
+ * ofnode_read_chosen_prop() - get the value of a chosen property
+ *
+ * This looks for a property within the /chosen 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_chosen_prop(const char *propname, int *sizep);
+
 /**
  * ofnode_read_chosen_string() - get the string value of a chosen property
  *
index f1e4ed75db0c1a8285ca52307e8571553d97f0b2..1c49eaf38bff96f68e55e6ddccc55dd0bad1d725 100644 (file)
@@ -88,7 +88,9 @@ DM_TEST(dm_test_ofnode_read, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
 static int dm_test_ofnode_read_chosen(struct unit_test_state *uts)
 {
        const char *str;
+       const u32 *val;
        ofnode node;
+       int size;
 
        str = ofnode_read_chosen_string("setting");
        ut_assertnonnull(str);
@@ -102,6 +104,12 @@ static int dm_test_ofnode_read_chosen(struct unit_test_state *uts)
        node = ofnode_get_chosen_node("setting");
        ut_assert(!ofnode_valid(node));
 
+       val = ofnode_read_chosen_prop("int-values", &size);
+       ut_assertnonnull(val);
+       ut_asserteq(8, size);
+       ut_asserteq(0x1937, fdt32_to_cpu(val[0]));
+       ut_asserteq(72993, fdt32_to_cpu(val[1]));
+
        return 0;
 }
 DM_TEST(dm_test_ofnode_read_chosen, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);