From 1ff00f4eb57b40c2cac882d01daab75ca6145018 Mon Sep 17 00:00:00 2001 From: shengfei Xu Date: Wed, 8 Nov 2023 03:45:29 +0000 Subject: [PATCH] power: supply: rk816/rk817/rk818 battery: avoid division by zero Signed-off-by: shengfei Xu Change-Id: I510263adc079f23ad52ebdf68971f7a28ce20a0d --- drivers/power/supply/rk816_battery.c | 7 ++++++- drivers/power/supply/rk817_battery.c | 10 +++++++++- drivers/power/supply/rk818_battery.c | 7 ++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/drivers/power/supply/rk816_battery.c b/drivers/power/supply/rk816_battery.c index d204a0129a8d..1e4f6cd8e54a 100644 --- a/drivers/power/supply/rk816_battery.c +++ b/drivers/power/supply/rk816_battery.c @@ -328,6 +328,9 @@ static u32 interpolate(int value, u32 *table, int size) u8 i; u16 d; + if (size < 2) + return 0; + for (i = 0; i < size; i++) { if (value < table[i]) break; @@ -2965,6 +2968,8 @@ static void rk816_bat_finish_algorithm(struct rk816_battery *di) FINISH_CHRG_CUR2 : FINISH_CHRG_CUR1; finish_sec = base2sec(di->chrg_finish_base); soc_sec = di->fcc * 3600 / 100 / DIV(finish_current); + if (soc_sec == 0) + soc_sec = 1; plus_soc = finish_sec / DIV(soc_sec); if (finish_sec > soc_sec) { rest = finish_sec % soc_sec; @@ -4671,7 +4676,7 @@ static int rk816_bat_parse_dt(struct rk816_battery *di) } pdata->ocv_size = length / sizeof(u32); - if (pdata->ocv_size <= 0) { + if (pdata->ocv_size < 2) { dev_err(dev, "invalid ocv table\n"); return -EINVAL; } diff --git a/drivers/power/supply/rk817_battery.c b/drivers/power/supply/rk817_battery.c index 6979531052cc..f6d4345cc677 100644 --- a/drivers/power/supply/rk817_battery.c +++ b/drivers/power/supply/rk817_battery.c @@ -651,6 +651,9 @@ static u32 interpolate(int value, u32 *table, int size) u8 i; u16 d; + if (size < 2) + return 0; + for (i = 0; i < size; i++) { if (value < table[i]) break; @@ -1599,6 +1602,9 @@ static void rk817_bat_first_pwron(struct rk817_battery_device *battery) battery->pwron_voltage) * 1000;/* uAH */ battery->dsoc = battery->rsoc; battery->fcc = battery->pdata->design_capacity; + if (battery->fcc < MIN_FCC) + battery->fcc = MIN_FCC; + battery->nac = rk817_bat_vol_to_cap(battery, battery->pwron_voltage); rk817_bat_update_qmax(battery, battery->qmax); @@ -1801,7 +1807,7 @@ static int rk817_bat_parse_dt(struct rk817_battery_device *battery) } pdata->ocv_size = length / sizeof(u32); - if (pdata->ocv_size <= 0) { + if (pdata->ocv_size < 2) { dev_err(dev, "invalid ocv table\n"); return -EINVAL; } @@ -2773,6 +2779,8 @@ static void rk817_bat_finish_algorithm(struct rk817_battery_device *battery) finish_sec = base2sec(battery->finish_base); soc_sec = battery->fcc * 3600 / 100 / DIV(finish_current); + if (soc_sec == 0) + soc_sec = 1; plus_soc = finish_sec / DIV(soc_sec); if (finish_sec > soc_sec) { rest = finish_sec % soc_sec; diff --git a/drivers/power/supply/rk818_battery.c b/drivers/power/supply/rk818_battery.c index 67cabe01c5d8..a538407ba522 100644 --- a/drivers/power/supply/rk818_battery.c +++ b/drivers/power/supply/rk818_battery.c @@ -287,6 +287,9 @@ static u32 interpolate(int value, u32 *table, int size) u8 i; u16 d; + if (size < 2) + return 0; + for (i = 0; i < size; i++) { if (value < table[i]) break; @@ -2101,6 +2104,8 @@ static void rk818_bat_finish_algorithm(struct rk818_battery *di) FINISH_CHRG_CUR2 : FINISH_CHRG_CUR1; finish_sec = base2sec(di->finish_base); soc_sec = di->fcc * 3600 / 100 / DIV(finish_current); + if (soc_sec == 0) + soc_sec = 1; plus_soc = finish_sec / DIV(soc_sec); if (finish_sec > soc_sec) { rest = finish_sec % soc_sec; @@ -3240,7 +3245,7 @@ static int rk818_bat_parse_dt(struct rk818_battery *di) } pdata->ocv_size = length / sizeof(u32); - if (pdata->ocv_size <= 0) { + if (pdata->ocv_size < 2) { dev_err(dev, "invalid ocv table\n"); return -EINVAL; }