regulator: core: Prioritise consumer mappings over regulator name
authorCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Tue, 13 Jun 2017 15:12:47 +0000 (16:12 +0100)
committerMark Brown <broonie@kernel.org>
Tue, 13 Jun 2017 17:43:28 +0000 (18:43 +0100)
Currently, when looking up a regulator supply, the regulator name
takes priority over the consumer mappings. As there are a lot of
regulator names that are in fairly common use (VDD, MICVDD, etc.) this
can easily lead to obtaining the wrong supply, when a system contains
two regulators that share a name.

The explicit consumer mappings contain much less ambiguity as they
specify both a name and a consumer device. As such prioritise those if
one exists and only fall back to the regulator name if there are no
matching explicit mappings.

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

index c0d9ae8d0860e8e9466dee6fe1e275853b1f9e3b..a0362a63902ee37b72844aea2c015e514bb5f910 100644 (file)
@@ -1462,7 +1462,7 @@ static struct regulator_dev *regulator_lookup_by_name(const char *name)
 static struct regulator_dev *regulator_dev_lookup(struct device *dev,
                                                  const char *supply)
 {
-       struct regulator_dev *r;
+       struct regulator_dev *r = NULL;
        struct device_node *node;
        struct regulator_map *map;
        const char *devname = NULL;
@@ -1489,10 +1489,6 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
        if (dev)
                devname = dev_name(dev);
 
-       r = regulator_lookup_by_name(supply);
-       if (r)
-               return r;
-
        mutex_lock(&regulator_list_mutex);
        list_for_each_entry(map, &regulator_map_list, list) {
                /* If the mapping has a device set up it must match */
@@ -1508,6 +1504,10 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
        }
        mutex_unlock(&regulator_list_mutex);
 
+       if (r)
+               return r;
+
+       r = regulator_lookup_by_name(supply);
        if (r)
                return r;