power: supply: sc27xx: prevent adc * 1000 from overflow
authorChunyan Zhang <chunyan.zhang@unisoc.com>
Fri, 24 Jul 2020 12:21:48 +0000 (20:21 +0800)
committerSebastian Reichel <sre@kernel.org>
Mon, 27 Jul 2020 22:49:26 +0000 (00:49 +0200)
The input parameter is int type, cause adc * 1000 could overflow.
Change to use s64 to avoid this issue.

Signed-off-by: Chen Yongzhi <yongzhi.chen@unisoc.com>
Signed-off-by: Chunyan Zhang <chunyan.zhang@unisoc.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/sc27xx_fuel_gauge.c

index be42e814ea34b4b94f79c4680dfe768e25656375..9c627618c22499fa7e8815af34d0cc9692c1591d 100644 (file)
@@ -5,6 +5,7 @@
 #include <linux/iio/consumer.h>
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
+#include <linux/math64.h>
 #include <linux/module.h>
 #include <linux/nvmem-consumer.h>
 #include <linux/of.h>
@@ -133,14 +134,14 @@ static const char * const sc27xx_charger_supply_name[] = {
        "sc2723_charger",
 };
 
-static int sc27xx_fgu_adc_to_current(struct sc27xx_fgu_data *data, int adc)
+static int sc27xx_fgu_adc_to_current(struct sc27xx_fgu_data *data, s64 adc)
 {
-       return DIV_ROUND_CLOSEST(adc * 1000, data->cur_1000ma_adc);
+       return DIV_S64_ROUND_CLOSEST(adc * 1000, data->cur_1000ma_adc);
 }
 
-static int sc27xx_fgu_adc_to_voltage(struct sc27xx_fgu_data *data, int adc)
+static int sc27xx_fgu_adc_to_voltage(struct sc27xx_fgu_data *data, s64 adc)
 {
-       return DIV_ROUND_CLOSEST(adc * 1000, data->vol_1000mv_adc);
+       return DIV_S64_ROUND_CLOSEST(adc * 1000, data->vol_1000mv_adc);
 }
 
 static int sc27xx_fgu_voltage_to_adc(struct sc27xx_fgu_data *data, int vol)