diff options
author | Axel Lin <axel.lin@gmail.com> | 2010-09-04 23:10:48 +0800 |
---|---|---|
committer | Liam Girdwood <lrg@slimlogic.co.uk> | 2010-09-05 11:15:52 +0100 |
commit | d06563cb860ab594889010889a7111c9e25d1051 (patch) | |
tree | de5486bc44497e7cd8833d3a4d7c14449fef687b /drivers/regulator/88pm8607.c | |
parent | b9e5d11a7e70000ace3ba92100bf1e81ff607604 (diff) | |
download | linux-stable-d06563cb860ab594889010889a7111c9e25d1051.tar.gz linux-stable-d06563cb860ab594889010889a7111c9e25d1051.tar.bz2 linux-stable-d06563cb860ab594889010889a7111c9e25d1051.zip |
regulator: 88pm8607 - fix value range checking for accessing info->vol_table
In choose_voltage(), we use i as array index of info->vol_table.
The valid value range for i should be 0 .. ARRAY_SIZE(info->vol_table) - 1.
Take LDO1 as example, ARRAY_SIZE(LDO1_table) is 4, vol_nbits of LDO1 is 2.
for (i = 0; i < (2 << info->vol_nbits); i++) is equivalent to
for (i = 0; i < 8; i++)
which is wrong.
The same value range checking also applies for index in pm8607_list_voltage().
Signed-off-by: Axel Lin <axel.lin@gmail.com>
Acked-by: Mark Brown <broonie@openource.wolfsonmicro.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
Diffstat (limited to 'drivers/regulator/88pm8607.c')
-rw-r--r-- | drivers/regulator/88pm8607.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/regulator/88pm8607.c b/drivers/regulator/88pm8607.c index 7d149a8d8d9b..2ce2eb71d0f5 100644 --- a/drivers/regulator/88pm8607.c +++ b/drivers/regulator/88pm8607.c @@ -215,7 +215,7 @@ static int pm8607_list_voltage(struct regulator_dev *rdev, unsigned index) struct pm8607_regulator_info *info = rdev_get_drvdata(rdev); int ret = -EINVAL; - if (info->vol_table && (index < (2 << info->vol_nbits))) { + if (info->vol_table && (index < (1 << info->vol_nbits))) { ret = info->vol_table[index]; if (info->slope_double) ret <<= 1; @@ -233,7 +233,7 @@ static int choose_voltage(struct regulator_dev *rdev, int min_uV, int max_uV) max_uV = max_uV >> 1; } if (info->vol_table) { - for (i = 0; i < (2 << info->vol_nbits); i++) { + for (i = 0; i < (1 << info->vol_nbits); i++) { if (!info->vol_table[i]) break; if ((min_uV <= info->vol_table[i]) |