From dc475e8c191d295b0b66b16280fd1f5d91cb7fa0 Mon Sep 17 00:00:00 2001 From: chailu1 Date: Fri, 9 Jul 2021 16:12:44 +0800 Subject: [PATCH] charge: resolve sc85xx charge icon dont disappear There are 2 cases 1.SC85XX reverse voltage from battery to VBUS through sc8551 mosfet parasitic diode. this case vbus voltage is less than battery voltage 2. SC85XX reverse voltae from battery to VBUS through sc8551 working mosfet. this case vbus is about 2:1 battery voltage Refer to https://gerrit.mot.com/#/c/1852409/ Change-Id: Icc80bd63f20f27f294100aabeae3267544ba0fc5 Signed-off-by: chailu1 Reviewed-on: https://gerrit.mot.com/2007936 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Haijian Ma Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- .../mmi_charger_core.c | 43 +++++++++++++++++++ .../mmi_charger_core.h | 1 + .../mmi_charger_pump_policy.c | 3 ++ .../mmi_qc3p_cp_policy.c | 3 ++ 4 files changed, 50 insertions(+) diff --git a/drivers/power/mmi_parallel_charger_iio/mmi_charger_core.c b/drivers/power/mmi_parallel_charger_iio/mmi_charger_core.c index bd0cbcb744c6..23cb166e0ec3 100644 --- a/drivers/power/mmi_parallel_charger_iio/mmi_charger_core.c +++ b/drivers/power/mmi_parallel_charger_iio/mmi_charger_core.c @@ -778,6 +778,49 @@ static int get_prop_charger_present(struct mmi_charger_manager *chg, return rc; } +#define REV_CP_THRESH_UV 4400000 +#define CP_IBUS_THRESH_MA 20 +#define IBAT_THRESH_UA 10000 +#define REV_CP_DOUBLE_THRESH_UV 100000 +bool mmi_is_cable_plugout(struct mmi_charger_manager *chip) +{ + struct mmi_cp_policy_dev *chrg_list = &g_chrg_list; + int vbus_volt, ibatt_curr, ibus_curr, vbatt_volt; + bool cp_chrg_enable, cp_sw_en; + + if (chip->extrn_sense) { + ibatt_curr = chrg_list->chrg_dev[CP_MASTER]->charger_data.ibatt_curr; + ibatt_curr *= 1000; + vbatt_volt = chrg_list->chrg_dev[CP_MASTER]->charger_data.vbatt_volt; + vbatt_volt *= 1000; + } else { + ibatt_curr= chrg_list->chrg_dev[PMIC_SW]->charger_data.ibatt_curr; + vbatt_volt = chrg_list->chrg_dev[PMIC_SW]->charger_data.vbatt_volt; + } + vbus_volt = chrg_list->chrg_dev[PMIC_SW]->charger_data.vbus_volt; + ibus_curr = chrg_list->chrg_dev[CP_MASTER]->charger_data.ibus_curr; + cp_sw_en = chrg_list->chrg_dev[CP_MASTER]->charger_error.chrg_err_type & (1<< MMI_CP_SWITCH_BIT); + cp_chrg_enable = chrg_list->chrg_dev[CP_MASTER]->charger_enabled; + mmi_chrg_info(chip, "ibat:%d, vbat:%d, vbus:%d, ibus:%d, cp_chg_en:%d, cp_sw_en:%d\n", + ibatt_curr, vbatt_volt, vbus_volt, ibus_curr, cp_chrg_enable, cp_sw_en); + + if (!cp_chrg_enable ||ibus_curr > CP_IBUS_THRESH_MA || ibatt_curr > IBAT_THRESH_UA) + return false; + + if (vbatt_volt >= vbus_volt + && vbus_volt < REV_CP_THRESH_UV) { + mmi_chrg_info(chip, "cable plug out: cp reverse\n"); + return true; + } + + if (cp_sw_en && vbus_volt < 2 * vbatt_volt - REV_CP_DOUBLE_THRESH_UV) { + mmi_chrg_info(chip, "cable plug out: cp double reverse\n"); + return true; + } + + return false; +} + #define WEAK_CHRG_THRSH 450 #define TURBO_CHRG_THRSH 2500 #define TURBO_30W_CHRG_THRSH_UW 25000000 diff --git a/drivers/power/mmi_parallel_charger_iio/mmi_charger_core.h b/drivers/power/mmi_parallel_charger_iio/mmi_charger_core.h index 5b71a1215a11..9c71f29ce49f 100644 --- a/drivers/power/mmi_parallel_charger_iio/mmi_charger_core.h +++ b/drivers/power/mmi_parallel_charger_iio/mmi_charger_core.h @@ -316,6 +316,7 @@ extern void mmi_update_all_charger_status(struct mmi_charger_manager *chip); extern void mmi_update_all_charger_error(struct mmi_charger_manager *chip); extern void mmi_dump_charger_error(struct mmi_charger_manager *chip, struct mmi_charger_device *chrg_dev); +extern bool mmi_is_cable_plugout(struct mmi_charger_manager *chip); extern ssize_t mmi_get_factory_image_mode(void); extern ssize_t mmi_set_factory_image_mode(int mode); extern ssize_t mmi_get_factory_charge_upper(void); diff --git a/drivers/power/mmi_parallel_charger_iio/mmi_charger_pump_policy.c b/drivers/power/mmi_parallel_charger_iio/mmi_charger_pump_policy.c index 1694b5a366f6..bed4cdbe7b32 100644 --- a/drivers/power/mmi_parallel_charger_iio/mmi_charger_pump_policy.c +++ b/drivers/power/mmi_parallel_charger_iio/mmi_charger_pump_policy.c @@ -376,6 +376,9 @@ void mmi_chrg_sm_work_func(struct work_struct *work) mmi_chrg_info(chip, "battery temp %d\n", batt_temp); mmi_chrg_info(chip, "battery capacity %d\n", batt_soc); + if (vbus_pres && mmi_is_cable_plugout(chip)) + vbus_pres = 0; + if (vbus_pres && (sm_state == PM_STATE_PPS_TUNNING_CURR || sm_state == PM_STATE_PPS_TUNNING_VOLT diff --git a/drivers/power/mmi_parallel_charger_iio/mmi_qc3p_cp_policy.c b/drivers/power/mmi_parallel_charger_iio/mmi_qc3p_cp_policy.c index ccb7f1dbbc41..2b1996bcc7c6 100644 --- a/drivers/power/mmi_parallel_charger_iio/mmi_qc3p_cp_policy.c +++ b/drivers/power/mmi_parallel_charger_iio/mmi_qc3p_cp_policy.c @@ -364,6 +364,9 @@ void mmi_qc3p_chrg_sm_work_func(struct work_struct *work) mmi_chrg_info(chip, "battery temp %d\n", batt_temp); mmi_chrg_info(chip, "battery capacity %d\n", batt_soc); + if (vbus_pres && mmi_is_cable_plugout(chip)) + vbus_pres = 0; + if (vbus_pres && (qc3p_sm_state == PM_QC3P_STATE_TUNNING_VOLT || qc3p_sm_state == PM_QC3P_STATE_CP_CC_LOOP