power: fuel_gauge: sprd2713: fix division by zero during initialization 52/103352/3
authorSeung-Woo Kim <sw0312.kim@samsung.com>
Thu, 8 Dec 2016 06:14:16 +0000 (15:14 +0900)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Tue, 17 Jan 2017 07:25:10 +0000 (23:25 -0800)
This patch fixes following division by zero during initialization.

  Division by zero in kernel.
  CPU: 1 PID: 1 Comm: swapper/0 Not tainted 3.10.65 #1-Tizen
  [<c00153bc>] (unwind_backtrace+0x0/0x118) from [<c0013010>] (show_stack+0x10/0x14)
  [<c0013010>] (show_stack+0x10/0x14) from [<c021487c>] (Ldiv0+0x8/0x10)
  [<c021487c>] (Ldiv0+0x8/0x10) from [<c043b184>] (:+0x38c/0xb70)
  [<c043b184>] (sprdfgu_init+0x38c/0xb70) from [<c0438b00>] (sec_hal_fg_init+0x1b0/0x22c)
  [<c0438b00>] (sec_hal_fg_init+0x1b0/0x22c) from [<c043965c>] (sec_fuelgauge_probe+0x154/0x2fc)
  [<c043965c>] (sec_fuelgauge_probe+0x154/0x2fc) from [<c02c1b14>] (driver_probe_device+0x124/0x32c)
  [<c02c1b14>] (driver_probe_device+0x124/0x32c) from [<c02c1dc8>] (__driver_attach+0x68/0x8c)
  [<c02c1dc8>] (__driver_attach+0x68/0x8c) from [<c02bfffc>] (bus_for_each_dev+0x68/0x8c)
  [<c02bfffc>] (bus_for_each_dev+0x68/0x8c) from [<c02c1120>] (bus_add_driver+0x104/0x240)
  [<c02c1120>] (bus_add_driver+0x104/0x240) from [<c02c2340>] (driver_register+0x9c/0x120)
  [<c02c2340>] (driver_register+0x9c/0x120) from [<c0009550>] (do_one_initcall+0xb8/0x160)
  [<c0009550>] (do_one_initcall+0xb8/0x160) from [<c09c6be4>] (kernel_init_freeable+0x158/0x220)
  [<c09c6be4>] (kernel_init_freeable+0x158/0x220) from [<c06c2efc>] (kernel_init+0x8/0xe8)
  [<c06c2efc>] (kernel_init+0x8/0xe8) from [<c000f258>] (ret_from_fork+0x14/0x3c)

Change-Id: Iba009b1eab23c34456c8d2b0283efda4b003498b
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
drivers/power/sprd_2713_fgu.c

index a8bb4d2..1af68fd 100644 (file)
@@ -721,7 +721,10 @@ static void sprdfgu_cal_battery_impedance(void)
        delta_current_raw = sprdfgu_adc2cur_ma(delta_current_raw);
        printk("sprdfgu: delta vol delta_vol_raw: %d delta_current_raw %d!\n",
               (delta_vol_raw), (delta_current_raw));
-       temp = (delta_vol_raw * 1000) / delta_current_raw;
+       if (delta_current_raw)
+               temp = (delta_vol_raw * 1000) / delta_current_raw;
+       else
+               return;
 
        impedance = abs(temp);
        if (impedance > 100) {