charging: sometime main charger can't recovery to max icl

when sometimes charger pump closed, but main charger don't
recovery to max icl

Change-Id: Id8032d310e41dabcd9be86b115a29c49ce0f17b8
Signed-off-by: mahj8 <mahj8@motorola.com>
Reviewed-on: https://gerrit.mot.com/2200412
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: Lei Chen <chenl18@motorola.com>
Reviewed-by: Huosheng Liao <liaohs@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
mahj8 2022-02-24 18:01:33 +08:00 • committed by Haijian Ma
commit 08435d13fe
4 changed files with 72 additions and 31 deletions

View file

@ -1424,6 +1424,12 @@ static int mmi_discrete_usb_set_prop(struct power_supply *psy,
case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
rc = set_prop_sdp_current_max(chip, val->intval);
break;
case POWER_SUPPLY_PROP_CURRENT_MAX:
if (val->intval < 0) {
vote(chip->usb_icl_votable, USER_VOTER, false, 0);
} else
vote(chip->usb_icl_votable, USER_VOTER, true, val->intval);
break;
default:
pr_err("Set prop %d is not supported in usb psy\n",
psp);
@ -1439,6 +1445,7 @@ static int mmi_discrete_usb_prop_is_writeable(struct power_supply *psy,
{
switch (psp) {
case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
case POWER_SUPPLY_PROP_CURRENT_MAX:
return 1;
default:
break;
@ -1952,13 +1959,61 @@ int mmi_discrete_config_typec_mode(struct mmi_discrete_charger *chip, int val)
return 0;
}
int mmi_discrete_get_hw_current_max(struct mmi_discrete_charger *chip, int *val)
int mmi_discrete_get_hw_current_max(struct mmi_discrete_charger *chip, int *total_current_ua)
{
update_sw_icl_max(chip);
*val = get_effective_result(chip->usb_icl_votable);
mmi_dbg(chip, "get input current max :%d\n",
*val);
int current_ua = 0;
if (chip->pd_active) {
*total_current_ua =
get_client_vote_locked(chip->usb_icl_votable, PD_VOTER);
return 0;
}
/* QC 2.0/3.0 adapter */
if (chip->real_charger_type == POWER_SUPPLY_TYPE_USB_HVDCP) {
*total_current_ua = chip->hvdcp2_max_icl_ua;
return 0;
} else if (chip->real_charger_type == POWER_SUPPLY_TYPE_USB_HVDCP_3
|| chip->real_charger_type == POWER_SUPPLY_TYPE_USB_HVDCP_3P5) {
*total_current_ua = HVDCP_CURRENT_UA;
return 0;
}
switch (chip->typec_mode) {
case MMI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT:
switch (chip->real_charger_type) {
case POWER_SUPPLY_TYPE_USB_CDP:
current_ua = CDP_CURRENT_UA;
break;
case POWER_SUPPLY_TYPE_USB_DCP:
current_ua = DCP_CURRENT_UA;
break;
case POWER_SUPPLY_TYPE_USB_FLOAT:
case POWER_SUPPLY_TYPE_USB:
current_ua = SDP_CURRENT_UA;
break;
default:
current_ua = 0;
break;
}
break;
case MMI_POWER_SUPPLY_TYPEC_SOURCE_MEDIUM:
current_ua = TYPEC_MEDIUM_CURRENT_UA;
break;
case MMI_POWER_SUPPLY_TYPEC_SOURCE_HIGH:
current_ua = TYPEC_HIGH_CURRENT_UA;
break;
case MMI_POWER_SUPPLY_TYPEC_NON_COMPLIANT:
case MMI_POWER_SUPPLY_TYPEC_NONE:
default:
current_ua = 0;
break;
}
*total_current_ua = current_ua;
mmi_dbg(chip, "get input current max :%d\n",
*total_current_ua);
return 0;
}

View file

@ -298,7 +298,7 @@ struct mmi_charger_manager {
#define QC3P_INIT_VOLT_COMP 500000
//For discrete main charger have no ibus adc capability
#define CP_ENABLED_MAIN_INPUT_LIMIT 300*1000
#define CP_DISABLED_MAIN_INPUT_LIMIT 3000*1000
extern void mmi_qc3p_chrg_sm_work_func(struct work_struct *work);
extern struct mmi_cp_policy_dev g_chrg_list;
extern const struct mmi_chrg_dev_ops dev_ops[];

View file

@ -42,14 +42,10 @@ static int cp_enable_charging(struct mmi_charger_device *chrg, bool en)
{
int rc;
struct mmi_charger_manager *chip = dev_get_drvdata(&chrg->dev);
union power_supply_propval prop = {0,};
if (!chip)
return -ENODEV;
if (!chip->charger_psy)
return -ENODEV;
rc = mmi_charger_write_iio_chan(chip, CP_ENABLE, en);
if (!rc) {
@ -61,17 +57,6 @@ static int cp_enable_charging(struct mmi_charger_device *chrg, bool en)
if(rc)
chrg_dev_info(chrg, "%s, enable termination fail\n",__func__);
if(chrg->charger_enabled) {
prop.intval = CP_ENABLED_MAIN_INPUT_LIMIT;
}else {
prop.intval = CP_DISABLED_MAIN_INPUT_LIMIT;
}
rc = power_supply_set_property(chip->charger_psy,
POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, &prop);
if(rc)
chrg_dev_info(chrg, "%s, set main charger input limit fail\n",__func__);
chrg_dev_info(chrg, "%s end, en:%d\n",__func__,en);
return rc;
}

View file

@ -120,13 +120,17 @@ static int qpnp_pmic_get_ibus(struct mmi_charger_device *chrg, u32 *uA)
static int qpnp_pmic_set_charging_current(struct mmi_charger_device *chrg, u32 uA)
{
int rc;
struct mmi_charger_manager *chip = dev_get_drvdata(&chrg->dev);
union power_supply_propval prop = {0,};
if (!chrg->chrg_psy)
if (!chip)
return -ENODEV;
if (!chip->usb_psy)
return -ENODEV;
prop.intval = uA;
rc = power_supply_set_property(chrg->chrg_psy,
rc = power_supply_set_property(chip->usb_psy,
POWER_SUPPLY_PROP_CURRENT_MAX, &prop);
// if (!rc)
// chrg->charger_limited = true;
@ -137,19 +141,16 @@ static int qpnp_pmic_set_charging_current(struct mmi_charger_device *chrg, u32 u
static int qpnp_pmic_get_input_current_settled(struct mmi_charger_device *chrg, u32 *uA)
{
int rc = 0;
union power_supply_propval prop = {0,};
int value;
struct mmi_charger_manager *chip = dev_get_drvdata(&chrg->dev);
if (!chip)
return -ENODEV;
if (!chip->charger_psy)
return -ENODEV;
rc = power_supply_get_property(chip->charger_psy,
POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, &prop);
rc = mmi_charger_read_iio_chan(chip, SMB5_HW_CURRENT_MAX, &value);
if (!rc)
*uA = prop.intval;
chrg->input_curr_setted = value;
*uA = chrg->input_curr_setted;
chrg_dev_info(chrg, "%s end, uA:%d\n",__func__,*uA);
return rc;
}
@ -191,7 +192,7 @@ static int qpnp_pmic_update_charger_status(struct mmi_charger_device *chrg)
if (!rc)
chrg->charger_data.batt_temp = prop.intval / 10;
rc = power_supply_get_property(chip->cp_psy,
rc = power_supply_get_property(chip->usb_psy,
POWER_SUPPLY_PROP_VOLTAGE_NOW, &prop);
if (!rc)
chrg->charger_data.vbus_volt = prop.intval;