]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/regulator/mc13xxx-regulator-core.c
Merge tag 'disintegrate-fbdev-20121220' of git://git.infradead.org/users/dhowells...
[karo-tx-linux.git] / drivers / regulator / mc13xxx-regulator-core.c
index 4ed89c6541100e838e8d6c3afb5aea3e0ad5bebf..23cf9f9c383b557b7cb7119576c5618356addfc8 100644 (file)
@@ -164,29 +164,30 @@ EXPORT_SYMBOL_GPL(mc13xxx_fixed_regulator_ops);
 #ifdef CONFIG_OF
 int mc13xxx_get_num_regulators_dt(struct platform_device *pdev)
 {
-       struct device_node *parent, *child;
-       int num = 0;
+       struct device_node *parent;
+       int num;
 
        of_node_get(pdev->dev.parent->of_node);
        parent = of_find_node_by_name(pdev->dev.parent->of_node, "regulators");
        if (!parent)
                return -ENODEV;
 
-       for_each_child_of_node(parent, child)
-               num++;
-
+       num = of_get_child_count(parent);
+       of_node_put(parent);
        return num;
 }
 EXPORT_SYMBOL_GPL(mc13xxx_get_num_regulators_dt);
 
 struct mc13xxx_regulator_init_data *mc13xxx_parse_regulators_dt(
        struct platform_device *pdev, struct mc13xxx_regulator *regulators,
-       int num_regulators)
+       int num_regulators, int *num_parsed)
 {
        struct mc13xxx_regulator_priv *priv = platform_get_drvdata(pdev);
        struct mc13xxx_regulator_init_data *data, *p;
        struct device_node *parent, *child;
-       int i;
+       int i, parsed = 0;
+
+       *num_parsed = 0;
 
        of_node_get(pdev->dev.parent->of_node);
        parent = of_find_node_by_name(pdev->dev.parent->of_node, "regulators");
@@ -195,24 +196,32 @@ struct mc13xxx_regulator_init_data *mc13xxx_parse_regulators_dt(
 
        data = devm_kzalloc(&pdev->dev, sizeof(*data) * priv->num_regulators,
                            GFP_KERNEL);
-       if (!data)
+       if (!data) {
+               of_node_put(parent);
                return NULL;
+       }
+
        p = data;
 
        for_each_child_of_node(parent, child) {
                for (i = 0; i < num_regulators; i++) {
                        if (!of_node_cmp(child->name,
                                         regulators[i].desc.name)) {
+
                                p->id = i;
                                p->init_data = of_get_regulator_init_data(
                                                        &pdev->dev, child);
                                p->node = child;
                                p++;
+
+                               parsed++;
                                break;
                        }
                }
        }
+       of_node_put(parent);
 
+       *num_parsed = parsed;
        return data;
 }
 EXPORT_SYMBOL_GPL(mc13xxx_parse_regulators_dt);