summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2014-11-12 10:57:14 +0100
committerThierry Reding <treding@nvidia.com>2014-12-19 10:11:50 +0100
commit66eded915f7e21005555a596089abfb10e0de8d1 (patch)
tree1964f6d76e1e53fb87e35f0b80a66a22fd259ff6
parentbb6f24e344208b21978f67f34ea3fde0c9fabd02 (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.c21
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;