]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
dm: core: Add a macro to iterate through properties
authorSimon Glass <sjg@chromium.org>
Wed, 7 Sep 2022 02:27:16 +0000 (20:27 -0600)
committerTom Rini <trini@konsulko.com>
Thu, 29 Sep 2022 20:11:15 +0000 (16:11 -0400)
Add a 'for_each' macro like we have for nodes.

Fix the comment for struct ofprop while we are here.

Signed-off-by: Simon Glass <sjg@chromium.org>
include/dm/ofnode.h
include/dm/ofnode_decl.h
test/dm/ofnode.c

index 1e23a40c9958475622f59955575f2f321d51a18e..7b0ef109b79a120b487012e508c4ef59a6a904e4 100644 (file)
@@ -176,6 +176,20 @@ static inline ofnode ofnode_root(void)
        return node;
 }
 
+/**
+ * ofprop_valid() - check if an ofprop is valid
+ *
+ * @prop: Pointer to ofprop to check
+ * Return: true if the reference contains a valid ofprop, false if not
+ */
+static inline bool ofprop_valid(struct ofprop *prop)
+{
+       if (of_live_active())
+               return prop->prop;
+       else
+               return prop->offset >= 0;
+}
+
 /**
  * oftree_default() - Returns the default device tree (U-Boot's control FDT)
  *
@@ -821,6 +835,30 @@ int ofnode_first_property(ofnode node, struct ofprop *prop);
  */
 int ofnode_next_property(struct ofprop *prop);
 
+/**
+ * ofnode_for_each_prop() - iterate over all properties of a node
+ *
+ * @prop:      struct ofprop
+ * @node:      node (lvalue, ofnode)
+ *
+ * This is a wrapper around a for loop and is used like this::
+ *
+ *   ofnode node;
+ *   struct ofprop prop;
+ *
+ *   ofnode_for_each_prop(prop, node) {
+ *       ...use prop...
+ *   }
+ *
+ * Note that this is implemented as a macro and @prop is used as
+ * iterator in the loop. The parent variable can be a constant or even a
+ * literal.
+ */
+#define ofnode_for_each_prop(prop, node) \
+       for (ofnode_first_property(node, &prop); \
+            ofprop_valid(&prop); \
+            ofnode_next_property(&prop))
+
 /**
  * ofprop_get_property() - get a pointer to the value of a property
  *
index 8d0d7885aa6d48c7627f694057e5f14f31aec955..f666a0287badd425dd14b7190ffc20dea66e1d98 100644 (file)
@@ -57,7 +57,7 @@ typedef union ofnode_union {
  *
  * @node: Pointer to device node
  * @offset: Pointer into flat device tree, used for flat tree.
- * @prop: Pointer to property, used for live treee.
+ * @prop: Pointer to property, used for live tree.
  */
 
 struct ofprop {
index a421392a976c035b88ffeb991b24c960d2e5430e..5ddfd0298a6e88a897b5da0361dc982a4762a58f 100644 (file)
@@ -669,3 +669,27 @@ static int dm_test_ofnode_add_subnode(struct unit_test_state *uts)
        return 0;
 }
 DM_TEST(dm_test_ofnode_add_subnode, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
+
+static int dm_test_ofnode_for_each_prop(struct unit_test_state *uts)
+{
+       ofnode node, subnode;
+       struct ofprop prop;
+       int count;
+
+       node = ofnode_path("/buttons");
+       count = 0;
+
+       /* we expect "compatible" for each node */
+       ofnode_for_each_prop(prop, node)
+               count++;
+       ut_asserteq(1, count);
+
+       /* there are two nodes, each with 2 properties */
+       ofnode_for_each_subnode(subnode, node)
+               ofnode_for_each_prop(prop, subnode)
+                       count++;
+       ut_asserteq(5, count);
+
+       return 0;
+}
+DM_TEST(dm_test_ofnode_for_each_prop, UT_TESTF_SCAN_FDT);