mmi_parallel_charger: Optimize 40w charging policy

-1, Add chrg ucp and ocp detection
-2, Add chrg_policy_error_recovery policy
-3, Add chrg_dev_init
-4, change charger thermal cooling policy,
remove THERMAL_COOLING chrg step, add thermal cooling process
into CC loop and CV loop, that to avoid miss chrg step in cooling

Change-Id: I57d66af338505c5ff9fd711de8b650afdb4a4027
Signed-off-by: xuwt2 <xuwt2@lenovo.com>
Reviewed-on: https://gerrit.mot.com/1389618
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: Jianqi Yang <yangj@motorola.com>
Submit-Approved: Jira Key
Reviewed-on: https://gerrit.mot.com/1893545
Reviewed-by: Xiangpo Zhao <zhaoxp3@motorola.com>
Reviewed-by: Wei Xu <xuwei9@lenovo.com>
This commit is contained in:
xuwt2 2019-07-22 17:55:32 +08:00 • committed by Wei Xu
commit f6112d2bf5
6 changed files with 492 additions and 213 deletions

View file

@ -63,7 +63,7 @@
#define BAT_OCP_ALARM_SHIFT 1
#define BUS_OVP_ALARM_SHIFT 2
#define BUS_OCP_ALARM_SHIFT 3
#define BAT_THERM_ALARM_SHIFT 4
#define BUS_UCP_FAULT_SHIFT 4
#define BUS_THERM_ALARM_SHIFT 5
#define DIE_THERM_ALARM_SHIFT 6
#define BAT_UCP_ALARM_SHIFT 7
@ -72,7 +72,7 @@
#define BAT_OCP_ALARM_MASK (1 << BAT_OCP_ALARM_SHIFT)
#define BUS_OVP_ALARM_MASK (1 << BUS_OVP_ALARM_SHIFT)
#define BUS_OCP_ALARM_MASK (1 << BUS_OCP_ALARM_SHIFT)
#define BAT_THERM_ALARM_MASK (1 << BAT_THERM_ALARM_SHIFT)
#define BUS_UCP_FAULT_MASK (1 << BUS_UCP_FAULT_SHIFT)
#define BUS_THERM_ALARM_MASK (1 << BUS_THERM_ALARM_SHIFT)
#define DIE_THERM_ALARM_MASK (1 << DIE_THERM_ALARM_SHIFT)
#define BAT_UCP_ALARM_MASK (1 << BAT_UCP_ALARM_SHIFT)
@ -225,8 +225,6 @@ static int bq2597x_update_charger_error_status(struct mmi_charger_device *chrg)
!!(prop.intval & BUS_OCP_ALARM_MASK);
chrg->charger_error.bat_ucp_alarm =
!!(prop.intval & BAT_UCP_ALARM_MASK);
chrg->charger_error.bat_therm_alarm =
!!(prop.intval & BAT_THERM_ALARM_MASK);
chrg->charger_error.bus_therm_alarm =
!!(prop.intval & BUS_THERM_ALARM_MASK);
chrg->charger_error.die_therm_alarm =
@ -251,11 +249,27 @@ static int bq2597x_update_charger_error_status(struct mmi_charger_device *chrg)
!!(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);
}
return rc;
}
static int bq2597x_clear_charger_error(struct mmi_charger_device *chrg)
{
int rc;
union power_supply_propval prop = {0,};
if (!chrg->chrg_psy)
return -ENODEV;
rc = power_supply_set_property(chrg->chrg_psy,
POWER_SUPPLY_PROP_UPDATE_NOW, &prop);
return rc;
}
struct mmi_charger_ops bq2597x_charger_ops = {
.enable = bq2597x_enable_charging,
.is_enabled = bq2597x_is_charging_enabled,
@ -263,4 +277,5 @@ struct mmi_charger_ops bq2597x_charger_ops = {
.get_input_current = bq2597x_get_input_current,
.update_charger_status = bq2597x_update_charger_status,
.update_charger_error = bq2597x_update_charger_error_status,
.clear_charger_error = bq2597x_clear_charger_error,
};

View file

@ -110,6 +110,14 @@ int mmi_update_charger_error(struct mmi_charger_device *chrg)
return -ENOTSUPP;
}
int mmi_clear_charger_error(struct mmi_charger_device *chrg)
{
if(chrg != NULL && chrg->ops != NULL && chrg->ops->clear_charger_error)
return chrg->ops->clear_charger_error(chrg);
return -ENOTSUPP;
}
static void mmi_charger_device_release(struct device *dev)
{
struct mmi_charger_device *charger_dev = to_mmi_charger_device(dev);

View file

@ -64,6 +64,7 @@ struct mmi_charger_error_info {
bool bat_ocp_alarm;
bool bus_ovp_alarm;
bool bus_ocp_alarm;
bool bus_ucp_alarm;
bool bat_ucp_alarm;
bool bat_therm_alarm;
@ -77,6 +78,9 @@ struct mmi_charger_error_info {
bool conv_ocp_fault;
bool ss_timeout_fault;
bool ts_shut_fault;
int bus_ucp_err_cnt;
int bus_ocp_err_cnt;
};
struct mmi_charger_device {
@ -87,6 +91,7 @@ struct mmi_charger_device {
struct device dev;
struct mmi_charger_info charger_data;
struct mmi_charger_error_info charger_error;
int *debug_mask;
int input_curr_setted; /*save input current*/
int charging_curr_limited; /*charger current limitation*/
int charging_curr_min; /*The minimum charging current supported by this device*/
@ -104,6 +109,7 @@ struct mmi_charger_ops {
int (*set_input_current)(struct mmi_charger_device *chrg, u32 uA);
int (*update_charger_status)(struct mmi_charger_device *chrg);
int (*update_charger_error)(struct mmi_charger_device *chrg);
int (*clear_charger_error)(struct mmi_charger_device *chrg);
};
@ -123,6 +129,7 @@ extern int mmi_get_input_current(struct mmi_charger_device *chrg, u32 *uA);
extern int mmi_set_input_current(struct mmi_charger_device *chrg, u32 uA);
extern int mmi_update_charger_status(struct mmi_charger_device *chrg);
extern int mmi_update_charger_error(struct mmi_charger_device *chrg);
extern int mmi_clear_charger_error(struct mmi_charger_device *chrg);
extern struct mmi_charger_device *mmi_charger_device_register(const char *name,
const char *psy_name,struct device *parent, void *devdata,
const struct mmi_charger_ops *ops);

View file

@ -59,7 +59,6 @@ static char *charge_rate[] = {
};
#define MIN_TEMP_C -20
#define MAX_TEMP_C 60
//#define MIN_MAX_TEMP_C 47
#define HYSTERISIS_DEGC 2
bool mmi_find_temp_zone(struct mmi_charger_manager *chip, int temp_c)
{
@ -345,6 +344,8 @@ void mmi_dump_charger_error(struct mmi_charger_manager *chip,
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);
return;
}
@ -402,7 +403,6 @@ static int batt_get_property(struct power_supply *psy,
switch (psp) {
case POWER_SUPPLY_PROP_CAPACITY:
case POWER_SUPPLY_PROP_CURRENT_NOW:
// case POWER_SUPPLY_PROP_VOLTAGE_NOW:
case POWER_SUPPLY_PROP_TEMP:
rc = power_supply_get_property(chip->extrn_psy,
psp, &prop);
@ -420,7 +420,8 @@ static int batt_get_property(struct power_supply *psy,
psp, &prop);
if (rc < 0) {
mmi_chrg_err(chip, "Get Unknown prop %d rc = %d\n", psp, rc);
return -EINVAL;
rc = 0;
val->intval = -EINVAL;
} else
val->intval = prop.intval;
break;
@ -789,6 +790,9 @@ void clear_chg_manager(struct mmi_charger_manager *chip)
chip->pd_target_volt = 0;
chip->pd_volt_max = pd_volt_max_init;
chip->pd_curr_max = pd_curr_max_init;
chip->recovery_pmic_chrg = false;
chip->thermal_mitigation_doing = false;
chip->pd_pps_support = false;
memset(chip->mmi_pdo_info, 0,
sizeof(struct usbpd_pdo_info) * PD_MAX_PDO_NUM);

View file

@ -134,7 +134,7 @@ struct mmi_chrg_dts_info {
#define TYPEC_MIDDLE_CURRENT_UA 2000000
#define SWITCH_CHARGER_PPS_VOLT 5000000
#define PUMP_CHARGER_PPS_MIN_VOLT 8000000
#define COOLING_HYSTERISIS_DEGC 2
struct mmi_charger_manager {
const char *name;
struct device *dev;
@ -162,6 +162,7 @@ struct mmi_charger_manager {
int batt_ovp_lmt; /*the battery over current limitation*/
int pl_chrg_vbatt_min; /*the minimum battery voltage to enable parallel charging*/
int pps_volt_comp;
int pd_request_volt;
int pd_request_curr;
/*the request PD power*/
@ -191,6 +192,7 @@ struct mmi_charger_manager {
bool extrn_sense;
bool recovery_pmic_chrg;
bool thermal_mitigation_doing;
bool thermal_cooling;
struct delayed_work mmi_chrg_sm_work; /*mmi charger state machine work*/
struct delayed_work heartbeat_work; /*cycle trig heartbeat work*/

File diff suppressed because it is too large Load diff