[PATCH] regulator: Ensure voltages are within the allowed range

Thierry Reding
2014-11-12T10:12:14Z

From: Thierry Reding <treding@nvidia.com>

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>
---
drivers/regulator/core.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index bbf93c9caca3..97851f39b4c0 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;
--
2.1.3