Commit d06563cb860ab594889010889a7111c9e25d1051

Authored by Axel Lin
Committed by Liam Girdwood
1 parent b9e5d11a7e

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>

Showing 1 changed file with 2 additions and 2 deletions Side-by-side Diff

drivers/regulator/88pm8607.c
... ... @@ -215,7 +215,7 @@
215 215 struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
216 216 int ret = -EINVAL;
217 217  
218   - if (info->vol_table && (index < (2 << info->vol_nbits))) {
  218 + if (info->vol_table && (index < (1 << info->vol_nbits))) {
219 219 ret = info->vol_table[index];
220 220 if (info->slope_double)
221 221 ret <<= 1;
... ... @@ -233,7 +233,7 @@
233 233 max_uV = max_uV >> 1;
234 234 }
235 235 if (info->vol_table) {
236   - for (i = 0; i < (2 << info->vol_nbits); i++) {
  236 + for (i = 0; i < (1 << info->vol_nbits); i++) {
237 237 if (!info->vol_table[i])
238 238 break;
239 239 if ((min_uV <= info->vol_table[i])