power: qpnp-smb5: Handle cc_soc jump in the overcharge WA
There may be a jump in cc_soc due to a change in learnt
capacity or a good_ocv update. Fix this by detecting
a cc_soc jump by comparing against its last value.
Reinitialize the cc_soc_reference if a jump is detected.
Change-Id: I7a016cdf89904f4d5ecbfd9b9afbd05fbfe6244c
Signed-off-by: Anirudh Ghayal <aghayal@codeaurora.org>
diff --git a/drivers/power/supply/qcom/smb5-lib.c b/drivers/power/supply/qcom/smb5-lib.c
index a68f2b0..7d79eac 100644
--- a/drivers/power/supply/qcom/smb5-lib.c
+++ b/drivers/power/supply/qcom/smb5-lib.c
@@ -2787,7 +2787,8 @@
union power_supply_propval pval = {0, };
int rc = 0;
- rc = smblib_get_prop_from_bms(chg, POWER_SUPPLY_PROP_CAPACITY, &pval);
+ rc = smblib_get_prop_from_bms(chg,
+ POWER_SUPPLY_PROP_REAL_CAPACITY, &pval);
if (rc < 0) {
smblib_err(chg, "Couldn't read SOC value, rc=%d\n", rc);
return;
@@ -2801,6 +2802,8 @@
* to prevent overcharing.
*/
if ((batt_status == TERMINATE_CHARGE) && (pval.intval == 100)) {
+ chg->cc_soc_ref = 0;
+ chg->last_cc_soc = 0;
alarm_start_relative(&chg->chg_termination_alarm,
ms_to_ktime(CHG_TERM_WA_ENTRY_DELAY_MS));
} else if (pval.intval < 100) {
@@ -2809,6 +2812,7 @@
* we exit the TERMINATE_CHARGE state and soc drops below 100%
*/
chg->cc_soc_ref = 0;
+ chg->last_cc_soc = 0;
}
}
@@ -4160,7 +4164,8 @@
if (rc < 0 || !pval.intval)
goto out;
- rc = smblib_get_prop_from_bms(chg, POWER_SUPPLY_PROP_CAPACITY, &pval);
+ rc = smblib_get_prop_from_bms(chg,
+ POWER_SUPPLY_PROP_REAL_CAPACITY, &pval);
if (rc < 0 || (pval.intval < 100)) {
vote(chg->usb_icl_votable, CHG_TERMINATION_VOTER, false, 0);
goto out;
@@ -4193,6 +4198,18 @@
}
/*
+ * In BSM a sudden jump in CC_SOC is not expected. If seen, its a
+ * good_ocv or updated capacity, reject it.
+ */
+ if (chg->last_cc_soc && pval.intval > (chg->last_cc_soc + 100)) {
+ /* CC_SOC has increased by 1% from last time */
+ chg->cc_soc_ref = pval.intval;
+ smblib_dbg(chg, PR_MISC, "cc_soc jumped(%d->%d), reset cc_soc_ref\n",
+ chg->last_cc_soc, pval.intval);
+ }
+ chg->last_cc_soc = pval.intval;
+
+ /*
* Suspend/Unsuspend USB input to keep cc_soc within the 0.5% to 0.75%
* overshoot range of the cc_soc value at termination, to prevent
* overcharging.
diff --git a/drivers/power/supply/qcom/smb5-lib.h b/drivers/power/supply/qcom/smb5-lib.h
index 64b640f..63061da 100644
--- a/drivers/power/supply/qcom/smb5-lib.h
+++ b/drivers/power/supply/qcom/smb5-lib.h
@@ -413,6 +413,7 @@
bool fcc_stepper_enable;
int charge_full_cc;
int cc_soc_ref;
+ int last_cc_soc;
/* workaround flag */
u32 wa_flags;