aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/regulator
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2012-02-03 02:24:38 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-03-11 16:08:32 -0400
commita33b6e5a8fb5fadeef206bacef13117e8a3080c4 (patch)
tree2c577e59b279e938c0c9638ebf4b1e67e1868c43 /drivers/regulator
parentdcd6c92267155e70a94b3927bce681ce74b80d1f (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>
Diffstat (limited to 'drivers/regulator')
-rw-r--r--drivers/regulator/twl-regulator.c14
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;