aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/regulator/core.c
diff options
context:
space:
mode:
authorDmitry Osipenko <digetx@gmail.com>2018-10-05 18:36:31 +0300
committerMark Brown <broonie@kernel.org>2018-11-08 12:41:10 +0000
commit79d6f049f4f05f5cb6e1647a9a253dad14bfabbe (patch)
tree65f5c35a2604a0492508b57c35ba56220f4745b6 /drivers/regulator/core.c
parentregulator: core: Mutually resolve regulators coupling (diff)
downloadlinux-dev-79d6f049f4f05f5cb6e1647a9a253dad14bfabbe.tar.xz
linux-dev-79d6f049f4f05f5cb6e1647a9a253dad14bfabbe.zip
regulator: core: Don't allow to get regulator until all couples resolved
Don't allow to get regulator until all of its couples resolved because consumer will get EPERM and coupling shall be transparent for the drivers. Signed-off-by: Dmitry Osipenko <digetx@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/regulator/core.c')
-rw-r--r--drivers/regulator/core.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 925df9e6f1e3..089e8ad8ef57 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1747,6 +1747,16 @@ struct regulator *_regulator_get(struct device *dev, const char *id,
return regulator;
}
+ mutex_lock(&regulator_list_mutex);
+ ret = (rdev->coupling_desc.n_resolved != rdev->coupling_desc.n_coupled);
+ mutex_unlock(&regulator_list_mutex);
+
+ if (ret != 0) {
+ regulator = ERR_PTR(-EPROBE_DEFER);
+ put_device(&rdev->dev);
+ return regulator;
+ }
+
ret = regulator_resolve_supply(rdev);
if (ret < 0) {
regulator = ERR_PTR(ret);