regulator: core: Don't defer probe if there's no DT binding for a supply
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Thu, 29 Mar 2012 13:19:02 +0000 (14:19 +0100)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 3 Apr 2012 13:00:48 +0000 (14:00 +0100)
When using device tree if there's no binding for a supply then there's no
way that one could appear later so just fail permanently right away. This
avoids wasting time trying to reprobe when that can never work.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
drivers/regulator/core.c

index fe28481dc91c45c515b6b0cad95a0daa08f35b11..7b11979d79d1dbccede57b7b0437bed588104f59 100644 (file)
@@ -1169,7 +1169,8 @@ static int _regulator_get_enable_time(struct regulator_dev *rdev)
 }
 
 static struct regulator_dev *regulator_dev_lookup(struct device *dev,
-                                                        const char *supply)
+                                                 const char *supply,
+                                                 int *ret)
 {
        struct regulator_dev *r;
        struct device_node *node;
@@ -1177,11 +1178,20 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
        /* first do a dt based lookup */
        if (dev && dev->of_node) {
                node = of_get_regulator(dev, supply);
-               if (node)
+               if (node) {
                        list_for_each_entry(r, &regulator_list, list)
                                if (r->dev.parent &&
                                        node == r->dev.of_node)
                                        return r;
+               } else {
+                       /*
+                        * If we couldn't even get the node then it's
+                        * not just that the device didn't register
+                        * yet, there's no node and we'll never
+                        * succeed.
+                        */
+                       *ret = -ENODEV;
+               }
        }
 
        /* if not found, try doing it non-dt way */
@@ -1212,7 +1222,7 @@ static struct regulator *_regulator_get(struct device *dev, const char *id,
 
        mutex_lock(&regulator_list_mutex);
 
-       rdev = regulator_dev_lookup(dev, id);
+       rdev = regulator_dev_lookup(dev, id, &ret);
        if (rdev)
                goto found;
 
@@ -2926,7 +2936,7 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
        if (supply) {
                struct regulator_dev *r;
 
-               r = regulator_dev_lookup(dev, supply);
+               r = regulator_dev_lookup(dev, supply, &ret);
 
                if (!r) {
                        dev_err(dev, "Failed to find supply %s\n", supply);