diff options
author | Mark Brown <broonie@linaro.org> | 2014-06-02 17:08:01 +0100 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-06-02 17:08:01 +0100 |
commit | dc49f3d5eb93217b598383e9cbefe7df819ab267 (patch) | |
tree | 94b526c56c837658023a22f9c919bf36d86d3f48 /drivers | |
parent | 277b1be9d4c5b6f8e33d4445142ca39bafb05c2e (diff) | |
parent | 064d5cd110f94ce41ca5681dcda8b77fa63d5b95 (diff) | |
download | linux-dc49f3d5eb93217b598383e9cbefe7df819ab267.tar.bz2 |
Merge remote-tracking branch 'regulator/topic/constraints' into regulator-next
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/regulator/core.c | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 9a09f3cdbabb..d70f00f8fc66 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -844,13 +844,22 @@ static int machine_constraints_voltage(struct regulator_dev *rdev, /* do we need to apply the constraint voltage */ if (rdev->constraints->apply_uV && rdev->constraints->min_uV == rdev->constraints->max_uV) { - ret = _regulator_do_set_voltage(rdev, - rdev->constraints->min_uV, - rdev->constraints->max_uV); - if (ret < 0) { - rdev_err(rdev, "failed to apply %duV constraint\n", - rdev->constraints->min_uV); - return ret; + int current_uV = _regulator_get_voltage(rdev); + if (current_uV < 0) { + rdev_err(rdev, "failed to get the current voltage\n"); + return current_uV; + } + if (current_uV < rdev->constraints->min_uV || + current_uV > rdev->constraints->max_uV) { + ret = _regulator_do_set_voltage( + rdev, rdev->constraints->min_uV, + rdev->constraints->max_uV); + if (ret < 0) { + rdev_err(rdev, + "failed to apply %duV constraint\n", + rdev->constraints->min_uV); + return ret; + } } } @@ -3819,8 +3828,9 @@ static int __init regulator_init_complete(void) mutex_lock(®ulator_list_mutex); /* If we have a full configuration then disable any regulators - * which are not in use or always_on. This will become the - * default behaviour in the future. + * we have permission to change the status for and which are + * not in use or always_on. This is effectively the default + * for DT and ACPI as they have full constraints. */ list_for_each_entry(rdev, ®ulator_list, list) { ops = rdev->desc->ops; @@ -3829,6 +3839,9 @@ static int __init regulator_init_complete(void) if (c && c->always_on) continue; + if (c && !(c->valid_ops_mask & REGULATOR_CHANGE_STATUS)) + continue; + mutex_lock(&rdev->mutex); if (rdev->use_count) @@ -3867,4 +3880,4 @@ unlock: return 0; } -late_initcall(regulator_init_complete); +late_initcall_sync(regulator_init_complete); |