Commit 317b5684 authored by Mark Brown's avatar Mark Brown

regulator: core: Correct default return value for full constraints

Once we have full constraints then all supply mappings should be known to
the regulator API. This means that we should treat failed lookups as fatal
rather than deferring in the hope of further registrations but this was
broken by commit 9b92da1f "regulator: core: Fix default return
value for _get()" which was targeted at DT systems but unintentionally
broke non-DT systems by changing the default return value.

Fix this by explicitly returning -EPROBE_DEFER from the DT lookup if we
find a property but no corresponding regulator and by having the non-DT
case default to -ENODEV when we have full constraints.

Fixes: 9b92da1f "regulator: core: Fix default return value for _get()"
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
Tested-by: default avatarGuenter Roeck <linux@roeck-us.net>
Cc: stable@vger.kernel.org
parent 07b19808
...@@ -1272,6 +1272,8 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev, ...@@ -1272,6 +1272,8 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
if (r->dev.parent && if (r->dev.parent &&
node == r->dev.of_node) node == r->dev.of_node)
return r; return r;
*ret = -EPROBE_DEFER;
return NULL;
} else { } else {
/* /*
* If we couldn't even get the node then it's * If we couldn't even get the node then it's
...@@ -1312,7 +1314,7 @@ static struct regulator *_regulator_get(struct device *dev, const char *id, ...@@ -1312,7 +1314,7 @@ static struct regulator *_regulator_get(struct device *dev, const char *id,
struct regulator_dev *rdev; struct regulator_dev *rdev;
struct regulator *regulator = ERR_PTR(-EPROBE_DEFER); struct regulator *regulator = ERR_PTR(-EPROBE_DEFER);
const char *devname = NULL; const char *devname = NULL;
int ret = -EPROBE_DEFER; int ret;
if (id == NULL) { if (id == NULL) {
pr_err("get() with no identifier\n"); pr_err("get() with no identifier\n");
...@@ -1322,6 +1324,11 @@ static struct regulator *_regulator_get(struct device *dev, const char *id, ...@@ -1322,6 +1324,11 @@ static struct regulator *_regulator_get(struct device *dev, const char *id,
if (dev) if (dev)
devname = dev_name(dev); devname = dev_name(dev);
if (have_full_constraints())
ret = -ENODEV;
else
ret = -EPROBE_DEFER;
mutex_lock(&regulator_list_mutex); mutex_lock(&regulator_list_mutex);
rdev = regulator_dev_lookup(dev, id, &ret); rdev = regulator_dev_lookup(dev, id, &ret);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment