From 018560f4b8f80f1ccc6a6d03b6e5e8faffc949e2 Mon Sep 17 00:00:00 2001 From: mahj8 Date: Sat, 10 Oct 2020 09:57:38 +0800 Subject: [PATCH] smb5: adjust USBIN OV debounce condition Adjust the USBIN OV debounce trigger condition. Use chg_done help to decide charge FULL state. Change-Id: If8d77be7884e809aab859ce45ef4238565a27338 Reviewed-on: https://gerrit.mot.com/1770943 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- drivers/power/supply/qcom/smb5-iio.c | 1 + drivers/power/supply/qcom/smb5-lib.c | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/drivers/power/supply/qcom/smb5-iio.c b/drivers/power/supply/qcom/smb5-iio.c index 0935331c8506..62eeafd92b66 100644 --- a/drivers/power/supply/qcom/smb5-iio.c +++ b/drivers/power/supply/qcom/smb5-iio.c @@ -486,6 +486,7 @@ int smb5_iio_set_prop(struct smb_charger *chg, int channel, int val) msleep(50); vote(chg->chg_disable_votable, FORCE_RECHARGE_VOTER, false, 0); + chg->chg_done = 0; break; case PSY_IIO_FCC_STEPPER_ENABLE: chg->fcc_stepper_enable = val; diff --git a/drivers/power/supply/qcom/smb5-lib.c b/drivers/power/supply/qcom/smb5-lib.c index 1e6f981afff1..6b8c830ba09b 100644 --- a/drivers/power/supply/qcom/smb5-lib.c +++ b/drivers/power/supply/qcom/smb5-lib.c @@ -1323,6 +1323,7 @@ static void smblib_uusb_removal(struct smb_charger *chg) cancel_delayed_work_sync(&chg->usbov_dbc_work); vote(chg->awake_votable, USBOV_DBC_VOTER, false, 0); chg->dbc_usbov = false; + chg->chg_done = 0; chg->voltage_min_uv = MICRO_5V; chg->voltage_max_uv = MICRO_5V; @@ -2156,7 +2157,10 @@ int smblib_get_prop_batt_status(struct smb_charger *chg, * charging path is un-suspended. */ if (pval.intval && !suspend) { - val->intval = POWER_SUPPLY_STATUS_CHARGING; + if (chg->chg_done) + val->intval = POWER_SUPPLY_STATUS_FULL; + else + val->intval = POWER_SUPPLY_STATUS_CHARGING; return 0; } } @@ -5267,6 +5271,7 @@ static void smblib_eval_chg_termination(struct smb_charger *chg, u8 batt_status) chg->cc_soc_ref = 0; chg->last_cc_soc = 0; chg->term_vbat_uv = 0; + chg->chg_done = 1; alarm_start_relative(&chg->chg_termination_alarm, ms_to_ktime(CHG_TERM_WA_ENTRY_DELAY_MS)); } else if (pval.intval < 100) { @@ -6448,6 +6453,7 @@ static void typec_src_removal(struct smb_charger *chg) cancel_delayed_work_sync(&chg->usbov_dbc_work); vote(chg->awake_votable, USBOV_DBC_VOTER, false, 0); chg->dbc_usbov = false; + chg->chg_done = 0; chg->pulse_cnt = 0; chg->usb_icl_delta_ua = 0; @@ -7258,17 +7264,12 @@ irqreturn_t smb5_usbin_ov_irq_handler(int irq, void *data) * differentiate between OV IRQ glitch and real OV_IRQ, add a debounce * period for evaluation. */ - if (stat & USBIN_OV_RT_STS_BIT) { - chg->dbc_usbov = true; - vote(chg->awake_votable, USBOV_DBC_VOTER, true, 0); - schedule_delayed_work(&chg->usbov_dbc_work, - msecs_to_jiffies(USB_OV_DBC_PERIOD_MS)); - } else { - cancel_delayed_work_sync(&chg->usbov_dbc_work); - chg->dbc_usbov = false; - vote(chg->awake_votable, USBOV_DBC_VOTER, false, 0); - } + chg->dbc_usbov = true; + vote(chg->awake_votable, USBOV_DBC_VOTER, true, 0); + schedule_delayed_work(&chg->usbov_dbc_work, + msecs_to_jiffies(USB_OV_DBC_PERIOD_MS)); + power_supply_changed(chg->batt_psy); smblib_dbg(chg, PR_MISC, "USBOV debounce status %d\n", chg->dbc_usbov); return IRQ_HANDLED;