regulator: twl6030: Fix voltage selection logic
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>
This commit is contained in:
parent
dcd6c92267
commit
a33b6e5a8f
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue