dm: core: Add ofnode_for_each_subnode()
authorSimon Glass <sjg@chromium.org>
Sat, 5 Aug 2017 21:45:54 +0000 (15:45 -0600)
committerSimon Glass <sjg@chromium.org>
Tue, 12 Sep 2017 03:43:58 +0000 (21:43 -0600)
Add a convenience macro to iterate over subnodes of a node. Make use of
this where appropriate in the code.

Signed-off-by: Simon Glass <sjg@chromium.org>
arch/arm/mach-tegra/xusb-padctl-common.c
drivers/core/ofnode.c
drivers/misc/cros_ec.c
drivers/power/pmic/pmic-uclass.c
include/dm/ofnode.h

index 37b5b8fb5b9920b3758259729cc52d912b44989f..abc18c03a5ebb65e7f1fedf028d9c0f58fb5a994 100644 (file)
@@ -224,9 +224,7 @@ tegra_xusb_padctl_config_parse_dt(struct tegra_xusb_padctl *padctl,
 
        config->name = ofnode_get_name(node);
 
-       for (subnode = ofnode_first_subnode(node);
-            ofnode_valid(subnode);
-            subnode = ofnode_next_subnode(subnode)) {
+       ofnode_for_each_subnode(subnode, node) {
                struct tegra_xusb_padctl_group *group;
                int err;
 
@@ -256,9 +254,7 @@ static int tegra_xusb_padctl_parse_dt(struct tegra_xusb_padctl *padctl,
                return err;
        }
 
-       for (subnode = ofnode_first_subnode(node);
-            ofnode_valid(subnode);
-            subnode = ofnode_next_subnode(subnode)) {
+       ofnode_for_each_subnode(subnode, node) {
                struct tegra_xusb_padctl_config *config = &padctl->config;
 
                debug("%s: subnode=%s\n", __func__, ofnode_get_name(subnode));
index 0685b689d8467061aaa4ed6081538558eaa9fe98..c6ca13fabf1f7fbf1ab462d89a400057f89c98e7 100644 (file)
@@ -390,10 +390,11 @@ int ofnode_decode_display_timing(ofnode parent, int index,
        if (!ofnode_valid(timings))
                return -EINVAL;
 
-       for (i = 0, node = ofnode_first_subnode(timings);
-            ofnode_valid(node) && i != index;
-            node = ofnode_first_subnode(node))
-               i++;
+       i = 0;
+       ofnode_for_each_subnode(node, timings) {
+               if (i++ == index)
+                       break;
+       }
 
        if (!ofnode_valid(node))
                return -EINVAL;
index feaa5d85676c6cbbb561f4b9295fd4457630e843..eefaaa53ad41f5ba70f6be6c4e2031260cfeee34 100644 (file)
@@ -1038,8 +1038,7 @@ int cros_ec_decode_ec_flash(struct udevice *dev, struct fdt_cros_ec *config)
 
        config->flash_erase_value = ofnode_read_s32_default(flash_node,
                                                            "erase-value", -1);
-       for (node = ofnode_first_subnode(flash_node); ofnode_valid(node);
-            node = ofnode_next_subnode(node)) {
+       ofnode_for_each_subnode(node, flash_node) {
                const char *name = ofnode_get_name(node);
                enum ec_flash_region region;
 
index 953bbe50269322cb05a947f93f66ded00465dfbb..64964e4e963ddb6291499f272d907331a88cc5c1 100644 (file)
@@ -34,9 +34,7 @@ int pmic_bind_children(struct udevice *pmic, ofnode parent,
        debug("%s for '%s' at node offset: %d\n", __func__, pmic->name,
              dev_of_offset(pmic));
 
-       for (node = ofnode_first_subnode(parent);
-            ofnode_valid(node);
-            node = ofnode_next_subnode(node)) {
+       ofnode_for_each_subnode(node, parent) {
                node_name = ofnode_get_name(node);
 
                debug("* Found child node: '%s'\n", node_name);
index de2769ed537695416d651660fc568d2d59e60cec..79374b8f91aa8030cb5f1d3ad595290a14c5f818 100644 (file)
@@ -628,4 +628,28 @@ int ofnode_read_resource(ofnode node, uint index, struct resource *res);
 int ofnode_read_resource_byname(ofnode node, const char *name,
                                struct resource *res);
 
+/**
+ * ofnode_for_each_subnode() - iterate over all subnodes of a parent
+ *
+ * @node:       child node (ofnode, lvalue)
+ * @parent:     parent node (ofnode)
+ *
+ * This is a wrapper around a for loop and is used like so:
+ *
+ *     ofnode node;
+ *
+ *     ofnode_for_each_subnode(node, parent) {
+ *             Use node
+ *             ...
+ *     }
+ *
+ * Note that this is implemented as a macro and @node is used as
+ * iterator in the loop. The parent variable can be a constant or even a
+ * literal.
+ */
+#define ofnode_for_each_subnode(node, parent) \
+       for (node = ofnode_first_subnode(parent); \
+            ofnode_valid(node); \
+            node = ofnode_next_subnode(node))
+
 #endif