diff --git a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c index 81a3ae49ff34..121d891f80f4 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c @@ -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; } diff --git a/drivers/power/mmi_discrete_turbo_charger/mmi_charger_core.h b/drivers/power/mmi_discrete_turbo_charger/mmi_charger_core.h index 704607a298ba..97c39513545b 100644 --- a/drivers/power/mmi_discrete_turbo_charger/mmi_charger_core.h +++ b/drivers/power/mmi_discrete_turbo_charger/mmi_charger_core.h @@ -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[]; diff --git a/drivers/power/mmi_discrete_turbo_charger/mmi_cp_charger.c b/drivers/power/mmi_discrete_turbo_charger/mmi_cp_charger.c index 8672e8b70498..e8f62cdf3532 100644 --- a/drivers/power/mmi_discrete_turbo_charger/mmi_cp_charger.c +++ b/drivers/power/mmi_discrete_turbo_charger/mmi_cp_charger.c @@ -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; } diff --git a/drivers/power/mmi_discrete_turbo_charger/qpnp_pmic_charger.c b/drivers/power/mmi_discrete_turbo_charger/qpnp_pmic_charger.c index 38e5a8819041..5ba953223360 100644 --- a/drivers/power/mmi_discrete_turbo_charger/qpnp_pmic_charger.c +++ b/drivers/power/mmi_discrete_turbo_charger/qpnp_pmic_charger.c @@ -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;