diff options
author | Thierry Reding <treding@nvidia.com> | 2014-11-12 10:57:14 +0100 |
---|---|---|
committer | Thierry Reding <treding@nvidia.com> | 2014-12-19 10:11:50 +0100 |
commit | 66eded915f7e21005555a596089abfb10e0de8d1 (patch) | |
tree | 1964f6d76e1e53fb87e35f0b80a66a22fd259ff6 | |
parent | bb6f24e344208b21978f67f34ea3fde0c9fabd02 (diff) |
regulator: Ensure voltages are within the allowed range
Unless a regulator has a fixed output voltage the core will not attempt
to modify the output voltage. This can cause a situation where a driver
enables the regulator but the currently configured voltage is outside
the valid range.
Fix this by constraining the current voltage to the allowed range upon
regulator registration.
Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r-- | drivers/regulator/core.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index e225711bb8b..693d79ccd9b 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -876,6 +876,7 @@ static int machine_constraints_voltage(struct regulator_dev *rdev, int max_uV = INT_MIN; int cmin = constraints->min_uV; int cmax = constraints->max_uV; + int value; /* it's safe to autoconfigure fixed-voltage supplies and the constraints are used by list_voltage. */ @@ -898,8 +899,6 @@ static int machine_constraints_voltage(struct regulator_dev *rdev, /* initial: [cmin..cmax] valid, [min_uV..max_uV] not */ for (i = 0; i < count; i++) { - int value; - value = ops->list_voltage(rdev, i); if (value <= 0) continue; @@ -930,6 +929,24 @@ static int machine_constraints_voltage(struct regulator_dev *rdev, constraints->max_uV, max_uV); constraints->max_uV = max_uV; } + + /* + * Now that the voltage range has been determined, make sure + * that the regulator's current voltage is within that range. + */ + value = _regulator_get_voltage(rdev); + + if (value < constraints->min_uV || + value > constraints->max_uV) { + ret = _regulator_do_set_voltage(rdev, + constraints->min_uV, + constraints->max_uV); + if (ret < 0) { + rdev_err(rdev, "failed to set voltage to within %d-%d\n", + constraints->min_uV, constraints->max_uV); + return ret; + } + } } return 0; |