regulator: twl6030: Fix voltage selection logic
authorLaxman Dewangan <ldewangan@nvidia.com>
Fri, 3 Feb 2012 07:24:38 +0000 (12:54 +0530)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Sun, 11 Mar 2012 20:08:32 +0000 (20:08 +0000)
The voltage selection logic for the twl6030 smps fails if
min:max is such that min < 1300mV and max > 1300mV although
this is in valid range for a regulator e.g. [x, 1350] where
x < 1300.
Fixing the voltage selection logic such that first it will
check for min_uV for a range and then calculated value will
be checked against max_uV.

Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
drivers/regulator/twl-regulator.c

index 181a2cf..e5d2223 100644 (file)
@@ -755,12 +755,16 @@ twl6030smps_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV,
        case 0:
                if (min_uV == 0)
                        vsel = 0;
-               else if ((min_uV >= 600000) && (max_uV <= 1300000)) {
+               else if ((min_uV >= 600000) && (min_uV <= 1300000)) {
+                       int calc_uV;
                        vsel = (min_uV - 600000) / 125;
                        if (vsel % 100)
                                vsel += 100;
                        vsel /= 100;
                        vsel++;
+                       calc_uV = twl6030smps_list_voltage(rdev, vsel);
+                       if (calc_uV > max_uV)
+                               return -EINVAL;
                }
                /* Values 1..57 for vsel are linear and can be calculated
                 * values 58..62 are non linear.
@@ -781,12 +785,16 @@ twl6030smps_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV,
        case SMPS_OFFSET_EN:
                if (min_uV == 0)
                        vsel = 0;
-               else if ((min_uV >= 700000) && (max_uV <= 1420000)) {
+               else if ((min_uV >= 700000) && (min_uV <= 1420000)) {
+                       int calc_uV;
                        vsel = (min_uV - 700000) / 125;
                        if (vsel % 100)
                                vsel += 100;
                        vsel /= 100;
                        vsel++;
+                       calc_uV = twl6030smps_list_voltage(rdev, vsel);
+                       if (calc_uV > max_uV)
+                               return -EINVAL;
                }
                /* Values 1..57 for vsel are linear and can be calculated
                 * values 58..62 are non linear.
@@ -819,7 +827,7 @@ twl6030smps_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV,
                if (min_uV == 0)
                        vsel = 0;
                else if ((min_uV >= 2161000) && (max_uV <= 4321000)) {
-                       vsel = (min_uV - 1852000) / 386;
+                       vsel = (min_uV - 2161000) / 386;
                        if (vsel % 100)
                                vsel += 100;
                        vsel /= 100;