Commit 6c59a17b authored by Dan Murphy's avatar Dan Murphy Committed by Sebastian Reichel

power: supply: bq25980: Fix uninitialized wd_reg_val and overrun

Fix the issue when 'i' is equal to array size then array index over
runs the array when checking for the watch dog value.

Fixes: 5069185f ("power: supply: bq25980: Add support for the BQ259xx family")
Signed-off-by: default avatarDan Murphy <dmurphy@ti.com>
Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parent 58d1620c
......@@ -1096,28 +1096,29 @@ static int bq25980_power_supply_init(struct bq25980_device *bq,
static int bq25980_hw_init(struct bq25980_device *bq)
{
struct power_supply_battery_info bat_info = { };
int wd_reg_val = 0;
int wd_reg_val = BQ25980_WATCHDOG_DIS;
int wd_max_val = BQ25980_NUM_WD_VAL - 1;
int ret = 0;
int curr_val;
int volt_val;
int i;
if (!bq->watchdog_timer) {
ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_3,
BQ25980_WATCHDOG_DIS,
BQ25980_WATCHDOG_DIS);
} else {
for (i = 0; i < BQ25980_NUM_WD_VAL; i++) {
if (bq->watchdog_timer > bq25980_watchdog_time[i] &&
bq->watchdog_timer < bq25980_watchdog_time[i + 1]) {
wd_reg_val = i;
break;
if (bq->watchdog_timer) {
if (bq->watchdog_timer >= bq25980_watchdog_time[wd_max_val])
wd_reg_val = wd_max_val;
else {
for (i = 0; i < wd_max_val; i++) {
if (bq->watchdog_timer > bq25980_watchdog_time[i] &&
bq->watchdog_timer < bq25980_watchdog_time[i + 1]) {
wd_reg_val = i;
break;
}
}
}
ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_3,
BQ25980_WATCHDOG_MASK, wd_reg_val);
}
ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_3,
BQ25980_WATCHDOG_MASK, wd_reg_val);
if (ret)
return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment