power: pm8921-bms: create functions for charge calculation
Refator the code by creating separate functions for remaining charge
and the unusable charge calulations
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
diff --git a/drivers/power/pm8921-bms.c b/drivers/power/pm8921-bms.c
index 3aed5f7..db763f4 100644
--- a/drivers/power/pm8921-bms.c
+++ b/drivers/power/pm8921-bms.c
@@ -660,38 +660,34 @@
return 0;
}
-static int calculate_state_of_charge(struct pm8921_bms_chip *chip,
- int batt_temp, int chargecycles)
+static int calculate_unusable_charge_mah(struct pm8921_bms_chip *chip,
+ int fcc, int batt_temp, int chargecycles)
{
- int remaining_usable_charge, fcc, unusable_charge;
- int remaining_charge, soc, rc, ocv, pc, coulumb_counter;
int rbatt, voltage_unusable_uv, pc_unusable;
- int update_userspace = 1;
- int64_t cc_mah;
rbatt = calculate_rbatt(chip);
if (rbatt < 0) {
rbatt = (last_rbatt < 0) ? DEFAULT_RBATT_MOHMS : last_rbatt;
- pr_debug("rbatt unavailable assuming %d\n",
- rbatt);
- update_userspace = 0;
+ pr_debug("rbatt unavailable assuming %d\n", rbatt);
+ } else {
+ last_rbatt = rbatt;
}
- pr_debug("rbatt = %umilliOhms", rbatt);
-
- fcc = calculate_fcc(chip, batt_temp, chargecycles);
- pr_debug("FCC = %umAh", fcc);
/* calculate unusable charge */
voltage_unusable_uv = (rbatt * chip->i_test)
+ (chip->v_failure * 1000);
pc_unusable = calculate_pc(chip, voltage_unusable_uv,
batt_temp, chargecycles);
+ pr_debug("rbatt = %umilliOhms unusable_v =%d unusable_pc = %d\n",
+ rbatt, voltage_unusable_uv, pc_unusable);
+ return (fcc * pc_unusable) / 100;
+}
- unusable_charge = (fcc * pc_unusable) / 100;
- pr_debug("UUC = %umAh at temp = %d, fcc = %umAh"
- "unusable_voltage = %umicroVolts pc_unusable = %d\n",
- unusable_charge, batt_temp, fcc,
- voltage_unusable_uv, pc_unusable);
+/* calculate remainging charge at the time of ocv */
+static int calculate_remaining_charge_mah(struct pm8921_bms_chip *chip, int fcc,
+ int batt_temp, int chargecycles)
+{
+ int rc, ocv, pc;
/* calculate remainging charge */
rc = read_last_good_ocv(chip, &ocv);
@@ -704,12 +700,36 @@
pr_debug("adc ocv failed assuming %d rc = %d\n",
ocv, rc);
}
- update_userspace = 0;
+ } else {
+ last_ocv_uv = ocv;
}
+
pc = calculate_pc(chip, ocv, batt_temp, chargecycles);
- remaining_charge = (fcc * pc) / 100;
- pr_debug("RC = %umAh ocv = %d pc = %d\n",
- remaining_charge, ocv, pc);
+ pr_debug("ocv = %d pc = %d\n", ocv, pc);
+ return (fcc * pc) / 100;
+}
+
+static int calculate_state_of_charge(struct pm8921_bms_chip *chip,
+ int batt_temp, int chargecycles)
+{
+ int remaining_usable_charge, fcc, unusable_charge;
+ int remaining_charge, soc, coulumb_counter;
+ int update_userspace = 1;
+ int64_t cc_mah;
+
+ fcc = calculate_fcc(chip, batt_temp, chargecycles);
+ pr_debug("FCC = %umAh batt_temp = %d, cycles = %d",
+ fcc, batt_temp, chargecycles);
+
+ unusable_charge = calculate_unusable_charge_mah(chip, fcc,
+ batt_temp, chargecycles);
+
+ pr_debug("UUC = %umAh", unusable_charge);
+
+ /* calculate remainging charge */
+ remaining_charge = calculate_remaining_charge_mah(chip, fcc, batt_temp,
+ chargecycles);
+ pr_debug("RC = %umAh\n", remaining_charge);
/* calculate cc milli_volt_hour */
calculate_cc_mah(chip, &cc_mah, &coulumb_counter);
@@ -733,8 +753,6 @@
pr_debug("SOC = %u%%\n", soc);
if (update_userspace) {
- last_rbatt = rbatt;
- last_ocv_uv = ocv;
last_soc = soc;
}
return soc;