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