diff options
| author | Laxman Dewangan <ldewangan@nvidia.com> | 2012-02-03 02:24:38 -0500 |
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-03-11 16:08:32 -0400 |
| commit | a33b6e5a8fb5fadeef206bacef13117e8a3080c4 (patch) | |
| tree | 2c577e59b279e938c0c9638ebf4b1e67e1868c43 | |
| parent | dcd6c92267155e70a94b3927bce681ce74b80d1f (diff) | |
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>
| -rw-r--r-- | drivers/regulator/twl-regulator.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c index 181a2cfe180c..e5d222342157 100644 --- a/drivers/regulator/twl-regulator.c +++ b/drivers/regulator/twl-regulator.c | |||
| @@ -755,12 +755,16 @@ twl6030smps_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV, | |||
| 755 | case 0: | 755 | case 0: |
| 756 | if (min_uV == 0) | 756 | if (min_uV == 0) |
| 757 | vsel = 0; | 757 | vsel = 0; |
| 758 | else if ((min_uV >= 600000) && (max_uV <= 1300000)) { | 758 | else if ((min_uV >= 600000) && (min_uV <= 1300000)) { |
| 759 | int calc_uV; | ||
| 759 | vsel = (min_uV - 600000) / 125; | 760 | vsel = (min_uV - 600000) / 125; |
| 760 | if (vsel % 100) | 761 | if (vsel % 100) |
| 761 | vsel += 100; | 762 | vsel += 100; |
| 762 | vsel /= 100; | 763 | vsel /= 100; |
| 763 | vsel++; | 764 | vsel++; |
| 765 | calc_uV = twl6030smps_list_voltage(rdev, vsel); | ||
| 766 | if (calc_uV > max_uV) | ||
| 767 | return -EINVAL; | ||
| 764 | } | 768 | } |
| 765 | /* Values 1..57 for vsel are linear and can be calculated | 769 | /* Values 1..57 for vsel are linear and can be calculated |
| 766 | * values 58..62 are non linear. | 770 | * values 58..62 are non linear. |
| @@ -781,12 +785,16 @@ twl6030smps_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV, | |||
| 781 | case SMPS_OFFSET_EN: | 785 | case SMPS_OFFSET_EN: |
| 782 | if (min_uV == 0) | 786 | if (min_uV == 0) |
| 783 | vsel = 0; | 787 | vsel = 0; |
| 784 | else if ((min_uV >= 700000) && (max_uV <= 1420000)) { | 788 | else if ((min_uV >= 700000) && (min_uV <= 1420000)) { |
| 789 | int calc_uV; | ||
| 785 | vsel = (min_uV - 700000) / 125; | 790 | vsel = (min_uV - 700000) / 125; |
| 786 | if (vsel % 100) | 791 | if (vsel % 100) |
| 787 | vsel += 100; | 792 | vsel += 100; |
| 788 | vsel /= 100; | 793 | vsel /= 100; |
| 789 | vsel++; | 794 | vsel++; |
| 795 | calc_uV = twl6030smps_list_voltage(rdev, vsel); | ||
| 796 | if (calc_uV > max_uV) | ||
| 797 | return -EINVAL; | ||
| 790 | } | 798 | } |
| 791 | /* Values 1..57 for vsel are linear and can be calculated | 799 | /* Values 1..57 for vsel are linear and can be calculated |
| 792 | * values 58..62 are non linear. | 800 | * values 58..62 are non linear. |
| @@ -819,7 +827,7 @@ twl6030smps_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV, | |||
| 819 | if (min_uV == 0) | 827 | if (min_uV == 0) |
| 820 | vsel = 0; | 828 | vsel = 0; |
| 821 | else if ((min_uV >= 2161000) && (max_uV <= 4321000)) { | 829 | else if ((min_uV >= 2161000) && (max_uV <= 4321000)) { |
| 822 | vsel = (min_uV - 1852000) / 386; | 830 | vsel = (min_uV - 2161000) / 386; |
| 823 | if (vsel % 100) | 831 | if (vsel % 100) |
| 824 | vsel += 100; | 832 | vsel += 100; |
| 825 | vsel /= 100; | 833 | vsel /= 100; |
