mmi_pl_chrg: improve the chrg recovery handling

Redefine the charger device error type,
In some case, the output of PD adapter is not stable,
It would cause the UCP or OCP occurs on the bq2597x,
Add a recovery handling to response to this issue.

Change-Id: I9350df26252483b5c9010c9ef27d0364b59d57b2
Signed-off-by: xuwt2 <xuwt2@lenovo.com>
Reviewed-on: https://gerrit.mot.com/1427195
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: Jichao Zou <zoujc@motorola.com>
Submit-Approved: Jira Key
Reviewed-on: https://gerrit.mot.com/1893555
Reviewed-by: Xiangpo Zhao <zhaoxp3@motorola.com>
Reviewed-by: Wei Xu <xuwei9@lenovo.com>
This commit is contained in:
xuwt2 2019-09-24 20:26:14 +08:00 • committed by Wei Xu
commit 13aa1a1a19
4 changed files with 133 additions and 155 deletions

View file

@ -215,44 +215,41 @@ static int bq2597x_update_charger_error_status(struct mmi_charger_device *chrg)
rc = power_supply_get_property(chrg->chrg_psy,
POWER_SUPPLY_PROP_STATUS, &prop);
if (!rc) {
chrg->charger_error.bat_ovp_alarm =
!!(prop.intval & BAT_OVP_ALARM_MASK);
chrg->charger_error.bat_ocp_alarm =
!!(prop.intval & BAT_OCP_ALARM_MASK);
chrg->charger_error.bus_ovp_alarm =
!!(prop.intval & BUS_OVP_ALARM_MASK);
chrg->charger_error.bus_ocp_alarm =
!!(prop.intval & BUS_OCP_ALARM_MASK);
chrg->charger_error.bat_ucp_alarm =
!!(prop.intval & BAT_UCP_ALARM_MASK);
chrg->charger_error.bus_therm_alarm =
!!(prop.intval & BUS_THERM_ALARM_MASK);
chrg->charger_error.die_therm_alarm =
!!(prop.intval & DIE_THERM_ALARM_MASK);
chrg->charger_error.bat_ovp_fault =
!!(prop.intval & BAT_OVP_FAULT_MASK);
chrg->charger_error.bat_ocp_fault =
!!(prop.intval & BAT_OCP_FAULT_MASK);
chrg->charger_error.bus_ovp_fault =
!!(prop.intval & BUS_OVP_FAULT_MASK);
chrg->charger_error.bus_ocp_fault =
!!(prop.intval & BUS_OCP_FAULT_MASK);
chrg->charger_error.bat_therm_fault =
!!(prop.intval & BAT_THERM_FAULT_MASK);
chrg->charger_error.bus_therm_fault =
!!(prop.intval & BUS_THERM_FAULT_MASK);
chrg->charger_error.die_therm_fault =
!!(prop.intval & DIE_THERM_FAULT_MASK);
chrg->charger_error.conv_ocp_fault =
!!(prop.intval & CONV_OCP_FAULT_MASK);
chrg->charger_error.ss_timeout_fault =
!!(prop.intval & SS_TIMEOUT_FAULT_MASK);
chrg->charger_error.ts_shut_fault =
!!(prop.intval & TS_SHUT_FAULT_MASK);
chrg->charger_error.bus_ucp_alarm =
!!(prop.intval & BUS_UCP_FAULT_MASK);
chrg->charger_error.chrg_err_type =
((!!(prop.intval & BAT_OVP_ALARM_MASK)) ?
1 << MMI_BAT_OVP_ALARM_BIT :
0 << MMI_BAT_OVP_ALARM_BIT) |
((!!(prop.intval & BAT_OCP_ALARM_MASK)) ?
1 << MMI_BAT_OCP_ALARM_BIT :
0 << MMI_BAT_OCP_ALARM_BIT) |
((!!(prop.intval & BAT_UCP_ALARM_MASK)) ?
1 << MMI_BAT_UCP_ALARM_BIT :
0 << MMI_BAT_UCP_ALARM_BIT) |
((!!(prop.intval & BUS_OVP_ALARM_MASK)) ?
1 << MMI_BUS_OVP_ALARM_BIT :
0 << MMI_BUS_OVP_ALARM_BIT) |
((!!(prop.intval & BUS_OCP_ALARM_MASK)) ?
1 << MMI_BUS_OCP_ALARM_BIT :
0 << MMI_BUS_OCP_ALARM_BIT) |
((!!(prop.intval & BAT_OVP_FAULT_MASK)) ?
1 << MMI_BAT_OVP_FAULT_BIT :
0 << MMI_BAT_OVP_FAULT_BIT) |
((!!(prop.intval & BAT_OCP_FAULT_MASK)) ?
1 << MMI_BAT_OCP_FAULT_BIT :
0 << MMI_BAT_OCP_FAULT_BIT) |
((!!(prop.intval & BUS_OVP_FAULT_MASK)) ?
1 << MMI_BUS_OVP_FAULT_BIT :
0 << MMI_BUS_OVP_FAULT_BIT) |
((!!(prop.intval & BUS_OCP_FAULT_MASK)) ?
1 << MMI_BUS_OCP_FAULT_BIT :
0 << MMI_BUS_OCP_FAULT_BIT) |
((!!(prop.intval & BUS_UCP_FAULT_MASK)) ?
1 << MMI_BUS_UCP_FAULT_BIT :
0 << MMI_BUS_UCP_FAULT_BIT) |
((!!(prop.intval & CONV_OCP_FAULT_MASK)) ?
1 << MMI_CONV_OCP_FAULT_BIT :
0 << MMI_CONV_OCP_FAULT_BIT);
}
return rc;
}

View file

@ -53,32 +53,24 @@ struct mmi_charger_info {
int batt_temp;
};
#define MMI_BAT_OVP_ALARM_BIT 0
#define MMI_BAT_OCP_ALARM_BIT 1
#define MMI_BAT_UCP_ALARM_BIT 2
#define MMI_BUS_OVP_ALARM_BIT 3
#define MMI_BUS_OCP_ALARM_BIT 4
#define MMI_BUS_UCP_ALARM_BIT 5
#define MMI_BAT_OVP_FAULT_BIT 6
#define MMI_BAT_OCP_FAULT_BIT 7
#define MMI_BAT_UCP_FAULT_BIT 8
#define MMI_BUS_OVP_FAULT_BIT 9
#define MMI_BUS_OCP_FAULT_BIT 10
#define MMI_BUS_UCP_FAULT_BIT 11
#define MMI_CONV_OCP_FAULT_BIT 12
#define MMI_THERM_ALARM_BIT 13
#define MMI_THERM_FAULT_BIT 14
struct mmi_charger_error_info {
/* alarm/fault status */
bool bat_ovp_fault;
bool bat_ocp_fault;
bool bus_ovp_fault;
bool bus_ocp_fault;
bool bat_ovp_alarm;
bool bat_ocp_alarm;
bool bus_ovp_alarm;
bool bus_ocp_alarm;
bool bus_ucp_alarm;
bool bat_ucp_alarm;
bool bat_therm_alarm;
bool bus_therm_alarm;
bool die_therm_alarm;
bool bat_therm_fault;
bool bus_therm_fault;
bool die_therm_fault;
bool conv_ocp_fault;
bool ss_timeout_fault;
bool ts_shut_fault;
int chrg_err_type;
int bus_ucp_err_cnt;
int bus_ocp_err_cnt;
};

View file

@ -305,48 +305,12 @@ void mmi_dump_charger_error(struct mmi_charger_manager *chip,
mmi_chrg_err(chip, "called before chip valid!\n");
return;
}
mmi_chrg_dbg(chip, PR_MOTO, "%s: bat_ovp_fault %d\n",
chrg_dev->name, chrg_dev->charger_error.bat_ovp_fault);
mmi_chrg_dbg(chip, PR_MOTO, "%s: bat_ocp_fault %d\n",
chrg_dev->name, chrg_dev->charger_error.bat_ocp_fault);
mmi_chrg_dbg(chip, PR_MOTO, "%s: bus_ovp_fault %d\n",
chrg_dev->name, chrg_dev->charger_error.bus_ovp_fault);
mmi_chrg_dbg(chip, PR_MOTO, "%s: bus_ocp_fault %d\n",
chrg_dev->name, chrg_dev->charger_error.bus_ocp_fault);
mmi_chrg_dbg(chip, PR_MOTO, "%s: bat_ovp_alarm %d\n",
chrg_dev->name, chrg_dev->charger_error.bat_ovp_alarm);
mmi_chrg_dbg(chip, PR_MOTO, "%s: bat_ocp_alarm %d\n",
chrg_dev->name, chrg_dev->charger_error.bat_ocp_alarm);
mmi_chrg_dbg(chip, PR_MOTO, "%s: bus_ovp_alarm %d\n",
chrg_dev->name, chrg_dev->charger_error.bus_ovp_alarm);
mmi_chrg_dbg(chip, PR_MOTO, "%s: bus_ocp_alarm %d\n",
chrg_dev->name, chrg_dev->charger_error.bus_ocp_alarm);
mmi_chrg_dbg(chip, PR_MOTO, "%s: bat_ucp_alarm %d\n",
chrg_dev->name, chrg_dev->charger_error.bat_ucp_alarm);
mmi_chrg_dbg(chip, PR_MOTO, "%s: bat_therm_alarm %d\n",
chrg_dev->name, chrg_dev->charger_error.bat_therm_alarm);
mmi_chrg_dbg(chip, PR_MOTO, "%s: bus_therm_alarm %d\n",
chrg_dev->name, chrg_dev->charger_error.bus_therm_alarm);
mmi_chrg_dbg(chip, PR_MOTO, "%s: die_therm_alarm %d\n",
chrg_dev->name, chrg_dev->charger_error.die_therm_alarm);
mmi_chrg_dbg(chip, PR_MOTO, "%s: bat_therm_fault %d\n",
chrg_dev->name, chrg_dev->charger_error.bat_therm_fault);
mmi_chrg_dbg(chip, PR_MOTO, "%s: bus_therm_fault %d\n",
chrg_dev->name, chrg_dev->charger_error.bus_therm_fault);
mmi_chrg_dbg(chip, PR_MOTO, "%s: die_therm_fault %d\n",
chrg_dev->name, chrg_dev->charger_error.die_therm_fault);
mmi_chrg_dbg(chip, PR_MOTO, "%s: conv_ocp_fault %d\n",
chrg_dev->name, chrg_dev->charger_error.conv_ocp_fault);
mmi_chrg_dbg(chip, PR_MOTO, "%s: ss_timeout_fault %d\n",
chrg_dev->name, chrg_dev->charger_error.ss_timeout_fault);
mmi_chrg_dbg(chip, PR_MOTO, "%s: ts_shut_fault %d\n",
chrg_dev->name, chrg_dev->charger_error.ts_shut_fault);
mmi_chrg_dbg(chip, PR_MOTO, "%s: bus_ucp_fault %d\n",
chrg_dev->name, chrg_dev->charger_error.bus_ucp_alarm);
mmi_chrg_dbg(chip, PR_MOTO, "%s: charger error type %d, "
"bus ucp err cnt %d, bus ocp err cnt %d\n",
chrg_dev->name,
chrg_dev->charger_error.chrg_err_type,
chrg_dev->charger_error.bus_ucp_err_cnt,
chrg_dev->charger_error.bus_ocp_err_cnt);
return;
}

View file

@ -179,10 +179,11 @@ static void clear_chrg_dev_error_cnt(struct mmi_charger_manager *chip, struct mm
}
#define PPS_INIT_VOLT_COMP 500000
#define PPS_VOLT_COMP_DELTA 300000
static void chrg_policy_error_recovery(struct mmi_charger_manager *chip,
struct mmi_cp_policy_dev *chrg_list)
{
int chrg_num, i;
int chrg_num = 0, i = 0, chrg_error_type= 0;
struct mmi_charger_device *chrg_dev;
chrg_num = chip->mmi_chrg_dev_num;
@ -194,54 +195,68 @@ static void chrg_policy_error_recovery(struct mmi_charger_manager *chip,
case CP_MASTER:
if (is_charger_exist(dev_ops[CP_MASTER].dev_name)) {
chrg_dev = chrg_list->chrg_dev[CP_MASTER];
if (chrg_dev->charger_error.bus_ucp_alarm) {
mmi_chrg_info(chip,"CP master bus ucp error %d, "
chrg_error_type = chrg_dev->charger_error.chrg_err_type;
if (chrg_error_type & (1 << MMI_BUS_UCP_ALARM_BIT) ||
chrg_error_type & (1 << MMI_BUS_UCP_FAULT_BIT)) {
mmi_chrg_info(chip,"CP master bus ucp error %d, cnt %d,"
"pps volt comp %dmV\n",
chrg_error_type,
chrg_dev->charger_error.bus_ucp_err_cnt,
chip->pps_volt_comp);
if (chrg_dev->charger_error.bus_ucp_err_cnt > 3) {
if (chrg_list->cp_slave) {
chrg_list->cp_slave = false;
chrg_dev->charger_error.bus_ucp_err_cnt = 0;
mmi_chrg_sm_move_state(chip,
PM_STATE_CHRG_PUMP_ENTRY);
} else {
chip->recovery_pmic_chrg = true;
mmi_chrg_sm_move_state(chip,
PM_STATE_SW_ENTRY);
chrg_dev->charger_error.bus_ucp_err_cnt = 0;
}
} else if (chrg_dev->charger_error.bus_ucp_err_cnt > 6) {
if (chrg_dev->charger_error.bus_ucp_err_cnt > 3) {
if (chrg_list->cp_slave) {
chrg_list->cp_slave = false;
chrg_dev->charger_error.bus_ucp_err_cnt = 0;
mmi_chrg_sm_move_state(chip,
PM_STATE_CHRG_PUMP_ENTRY);
} else {
chip->recovery_pmic_chrg = true;
mmi_chrg_sm_move_state(chip,
PM_STATE_SW_ENTRY);
PM_STATE_SW_ENTRY);
chrg_dev->charger_error.bus_ucp_err_cnt = 0;
}
chrg_dev->charger_error.bus_ucp_err_cnt++;
chip->pps_volt_comp += PPS_INIT_VOLT_COMP;
mmi_clear_charger_error(chrg_dev);
} else if (chrg_dev->charger_error.bus_ocp_alarm) {
mmi_chrg_info(chip, "CP master bus ocp error %d, "
"pps volt comp %dmV\n",
chrg_dev->charger_error.bus_ocp_err_cnt,
chip->pps_volt_comp);
if (chrg_dev->charger_error.bus_ocp_err_cnt > 3) {
chip->recovery_pmic_chrg = true;
mmi_chrg_sm_move_state(chip,
PM_STATE_SW_ENTRY);
chrg_dev->charger_error.bus_ocp_err_cnt = 0;
}
chrg_dev->charger_error.bus_ucp_err_cnt++;
chip->pps_volt_comp = PPS_INIT_VOLT_COMP;
mmi_chrg_info(chip,"reset pps volt comp %dmV\n",
chip->pps_volt_comp);
} else if (chrg_dev->charger_error.bus_ucp_err_cnt > 6) {
chip->recovery_pmic_chrg = true;
mmi_chrg_sm_move_state(chip,
PM_STATE_SW_ENTRY);
chrg_dev->charger_error.bus_ucp_err_cnt = 0;
}
chrg_dev->charger_error.bus_ucp_err_cnt++;
chip->pps_volt_comp += PPS_VOLT_COMP_DELTA;
mmi_chrg_info(chip,"Restart charging, "
"increase pps volt comp %dmV\n",
chip->pps_volt_comp);
mmi_chrg_sm_move_state(chip,
PM_STATE_CHRG_PUMP_ENTRY);
mmi_clear_charger_error(chrg_dev);
}else if (chrg_error_type & (1 << MMI_BUS_OCP_ALARM_BIT) ||
chrg_error_type & (1 << MMI_BUS_OCP_FAULT_BIT) ||
chrg_error_type & (1 << MMI_CONV_OCP_FAULT_BIT)) {
mmi_chrg_info(chip,"CP master ocp error %d, cnt %d,"
"pps volt comp %dmV\n",
chrg_error_type,
chrg_dev->charger_error.bus_ocp_err_cnt,
chip->pps_volt_comp);
if (chrg_dev->charger_error.bus_ocp_err_cnt > 3) {
chip->recovery_pmic_chrg = true;
mmi_chrg_sm_move_state(chip,
PM_STATE_SW_ENTRY);
chrg_dev->charger_error.bus_ocp_err_cnt = 0;
}
chrg_dev->charger_error.bus_ocp_err_cnt++;
chip->pps_volt_comp -= PPS_VOLT_COMP_DELTA;
if (chip->pps_volt_comp < 0)
chip->pps_volt_comp = 0;
mmi_chrg_info(chip,"Restart charging, "
"decrease pps volt comp %dmV\n",
chip->pps_volt_comp);
mmi_chrg_sm_move_state(chip,
PM_STATE_CHRG_PUMP_ENTRY);
mmi_clear_charger_error(chrg_dev);
}
}
break;
case CP_SLAVE:
break;
@ -358,7 +373,7 @@ static void mmi_chrg_sm_work_func(struct work_struct *work)
mmi_chrg_info(chip, "battery capacity %d\n", batt_soc);
if (vbus_pres) {
// mmi_dump_charger_error(chip, chrg_list->chrg_dev[CP_MASTER]);
mmi_dump_charger_error(chip, chrg_list->chrg_dev[CP_MASTER]);
chrg_policy_error_recovery(chip, chrg_list);
}
@ -1298,28 +1313,38 @@ schedule:
chip->pd_target_volt = min(chip->pd_request_volt, chip->pd_thermal_volt);
chip->pd_target_curr = min(chip->pd_request_curr, chip->pd_thermal_curr);
}
mmi_chrg_dbg(chip, PR_MOTO, "chrg sm work, chrg step %s, "
"pd request volt %dmV,"
mmi_chrg_dbg(chip, PR_MOTO, "chrg sm work,%s, "
"battery soc %d, "
"battery temp %d, "
"battery current %d, "
"battery voltage %d"
"thermal level %d, "
"thermal cooling %d, "
"thermal mitigation %d, "
"thermal force pmic chrg %d, "
"recovery pmic chrg %d\n",
pm_state_str[sm_state],
batt_soc, batt_temp,
ibatt_curr, vbatt_volt,
chip->system_thermal_level,
chip->thermal_cooling,
chip->thermal_mitigation_doing,
chip->thermal_force_pmic_chrg,
chip->recovery_pmic_chrg);
mmi_chrg_dbg(chip, PR_MOTO, "pd request volt %dmV,"
"pd request curr %dmA, "
"pd target volt %dmV, "
"pd target curr %dmA, "
"thermal level %d, "
"thermal volt %dmV, "
"thermal curr %dmA, "
"thermal cooling %d, "
"thermal mitigation %d, "
"thermal force pmic chrg %d\n",
pm_state_str[sm_state],
"thermal curr %dmA\n",
chip->pd_request_volt,
chip->pd_request_curr,
chip->pd_target_volt,
chip->pd_target_curr,
chip->system_thermal_level,
chip->pd_thermal_volt,
chip->pd_thermal_curr,
chip->thermal_cooling,
chip->thermal_mitigation_doing,
chip->thermal_force_pmic_chrg);
chip->pd_thermal_curr);
chip->pps_result = usbpd_select_pdo(chip->pd_handle,
chip->mmi_pd_pdo_idx,