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 <chailu1@lenovo.com>
Reviewed-on: https://gerrit.mot.com/2007936
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: Haijian Ma <mahj8@motorola.com>
Reviewed-by: Huosheng Liao <liaohs@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
chailu1 2021-07-09 16:12:44 +08:00 • committed by Lu Chai
commit dc475e8c19
4 changed files with 50 additions and 0 deletions

View file

@ -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

View file

@ -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);

View file

@ -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

View file

@ -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