From daae15dbfa7e6fab6f1b1e07e8d40804cb5bca07 Mon Sep 17 00:00:00 2001 From: yanyh2 Date: Tue, 19 Apr 2022 23:00:11 +0800 Subject: [PATCH] Use battery OCV to calculate the delta battery voltage In order to improve the accuracy of load switch controlling policy use battery OCV instead of vbat to calculate the delta battery voltage based on vbat, current and ESR. Add panic debounce when decide to turn off load switch for high battery voltage diff between flip and main battery. Change-Id: Ib9b374952a8f6400e008953b123b4878b17fbe4f Signed-off-by: yanyh2 Reviewed-on: https://gerrit.mot.com/2247225 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Jianqi Yang Submit-Approved: Jira Key --- .../sgm4154x_charger_lite.c | 78 +++++++++++++------ .../sgm4154x_charger_lite.h | 2 + 2 files changed, 56 insertions(+), 24 deletions(-) diff --git a/drivers/power/sgm4154x_charger_lite/sgm4154x_charger_lite.c b/drivers/power/sgm4154x_charger_lite/sgm4154x_charger_lite.c index ed26a254ad88..f836533efe34 100644 --- a/drivers/power/sgm4154x_charger_lite/sgm4154x_charger_lite.c +++ b/drivers/power/sgm4154x_charger_lite/sgm4154x_charger_lite.c @@ -2258,13 +2258,16 @@ static void sgm4154x_charger_set_constraint(void *data, /* Battery presence detection threshold on battery temperature */ #define BPD_TEMP_THRE (-30) +#define PANIC_DEB_CNT_MAX (3) static void sgm4154x_paired_battery_notify(void *data, struct mmi_battery_info *batt_info) { int i; int rc; u32 value; - int delta_vbat; + int batt_ocv; + int paired_ocv; + int delta_ocv; int delta_soc; bool high_load_en; bool low_load_en; @@ -2273,7 +2276,7 @@ static void sgm4154x_paired_battery_notify(void *data, struct sgm_mmi_charger *chg = data; int paired_ichg = chg->paired_ichg; int paired_load = chg->paired_load; - static bool initialized = false; + static int panic_deb_cnt = 0; static bool chg_present = false; if (!batt_info || batt_info->batt_mv <= 0) { @@ -2296,7 +2299,12 @@ static void sgm4154x_paired_battery_notify(void *data, return; } - delta_vbat = chg->batt_info.batt_mv - batt_info->batt_mv; + batt_ocv = chg->batt_info.batt_mv; + batt_ocv -= (chg->batt_info.batt_ma * chg->batt_esr) / 1000; + paired_ocv = batt_info->batt_mv; + paired_ocv -= (batt_info->batt_ma * chg->paired_esr) / 1000; + + delta_ocv = batt_ocv - paired_ocv; delta_soc = chg->batt_info.batt_soc - batt_info->batt_soc; if (chg->paired_ichg_table && chg->paired_ichg_table_len) { @@ -2316,33 +2324,30 @@ static void sgm4154x_paired_battery_notify(void *data, chg->paired_ichg = paired_ichg; } - if (!initialized && - chg->paired_load_thres && chg->paired_load_thres_len) { - initialized = true; + if (chg->paired_load_thres && chg->paired_load_thres_len) { paired_load = PAIRED_LOAD_HIGH; for (i = 0; i < chg->paired_load_thres_len; i++) { - if (delta_vbat > chg->paired_load_thres[i]) { + if (delta_ocv > chg->paired_load_thres[i]) { paired_load = i; break; } } if (paired_load == PAIRED_LOAD_OFF) { - if (paired_vbat_panic_enabled) - panic("ERROR: delta_vbat=%dmV, delta_soc=%d", - delta_vbat, delta_soc); - else - pr_err("ERROR: delta_vbat=%dmV, delta_soc=%d", - delta_vbat, delta_soc); + panic_deb_cnt++; + if (paired_vbat_panic_enabled && + panic_deb_cnt >= PANIC_DEB_CNT_MAX) { + panic("ERROR: delta_ocv=%dmV, delta_soc=%d", + delta_ocv, delta_soc); + panic_deb_cnt = 0; + } else { + pr_err("ERROR: delta_ocv=%dmV, delta_soc=%d", + delta_ocv, delta_soc); + } + } else { + panic_deb_cnt = 0; } } - if (paired_ichg > 0) { - if (paired_ichg < chg->sgm->init_data.max_ichg / 2) - paired_load = PAIRED_LOAD_LOW; - else - paired_load = PAIRED_LOAD_HIGH; - } - if (paired_load != chg->paired_load || chg_present != chg->chg_info.chrg_present) { chg->paired_load = paired_load; @@ -2375,12 +2380,23 @@ static void sgm4154x_paired_battery_notify(void *data, gpio_set_value(chg->sgm->low_load_en_gpio, low_load_en ^ chg->sgm->low_load_active_low); } - pr_info("chg_present: %d, high_load_en: %d, low_load_en: %d\n", - chg_present, high_load_en, low_load_en); } - pr_info("delta_vbat: %dmV, delta_soc: %d, paired_ichg: %duA, paired_load: %d\n", - delta_vbat, delta_soc, paired_ichg, paired_load); + if (gpio_is_valid(chg->sgm->high_load_en_gpio)) + high_load_en = gpio_get_value(chg->sgm->high_load_en_gpio) + ^ chg->sgm->high_load_active_low; + else + high_load_en = false; + if (gpio_is_valid(chg->sgm->low_load_en_gpio)) + low_load_en = gpio_get_value(chg->sgm->low_load_en_gpio) + ^ chg->sgm->low_load_active_low; + else + low_load_en = false; + + pr_info("paired_ocv: %dmV, batt_ocv: %dmV, delta_ocv: %dmV, delta_soc: %d\n", + paired_ocv, batt_ocv, delta_ocv, delta_soc); + pr_info("chg_present: %d, high_load_en: %d, low_load_en: %d, paired_ichg: %d\n", + chg_present, high_load_en, low_load_en, paired_ichg); } static int sgm4154x_mmi_charger_init(struct sgm_mmi_charger *chg) @@ -2486,6 +2502,20 @@ static int sgm4154x_mmi_charger_init(struct sgm_mmi_charger *chg) } } + rc = of_property_read_u32(chg->sgm->dev->of_node, + "mmi,paired-esr", + &chg->paired_esr); + if (rc) + chg->paired_esr = 60; + pr_info("paired battery ESR: %d\n", chg->paired_esr); + + rc = of_property_read_u32(chg->sgm->dev->of_node, + "mmi,batt-esr", + &chg->batt_esr); + if (rc) + chg->batt_esr = 40; + pr_info("battery ESR: %d\n", chg->batt_esr); + driver = devm_kzalloc(chg->sgm->dev, sizeof(struct mmi_charger_driver), GFP_KERNEL); diff --git a/drivers/power/sgm4154x_charger_lite/sgm4154x_charger_lite.h b/drivers/power/sgm4154x_charger_lite/sgm4154x_charger_lite.h index 4413b2d9f00b..18f46bfabff1 100644 --- a/drivers/power/sgm4154x_charger_lite/sgm4154x_charger_lite.h +++ b/drivers/power/sgm4154x_charger_lite/sgm4154x_charger_lite.h @@ -294,6 +294,8 @@ struct sgm_mmi_charger { int paired_load; int paired_load_thres_len; int *paired_load_thres; + int paired_esr; + int batt_esr; struct mmi_battery_info paired_batt_info; };