Loading drivers/power/supply/qcom/smb1390-charger-psy.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -1106,6 +1106,7 @@ static void smb1390_status_change_work(struct work_struct *work) vote(chip->fcc_votable, CP_VOTER, false, 0); vote(chip->fcc_votable, CP_VOTER, false, 0); vote(chip->disable_votable, SOC_LEVEL_VOTER, true, 0); vote(chip->disable_votable, SOC_LEVEL_VOTER, true, 0); vote_override(chip->ilim_votable, CC_MODE_VOTER, false, 0); vote_override(chip->ilim_votable, CC_MODE_VOTER, false, 0); vote(chip->ilim_votable, WIRELESS_VOTER, false, 0); vote(chip->slave_disable_votable, TAPER_END_VOTER, false, 0); vote(chip->slave_disable_votable, TAPER_END_VOTER, false, 0); vote(chip->slave_disable_votable, MAIN_DISABLE_VOTER, true, 0); vote(chip->slave_disable_votable, MAIN_DISABLE_VOTER, true, 0); vote_override(chip->usb_icl_votable, TAPER_MAIN_ICL_LIMIT_VOTER, vote_override(chip->usb_icl_votable, TAPER_MAIN_ICL_LIMIT_VOTER, Loading drivers/power/supply/qcom/smb5-lib.c +44 −0 Original line number Original line Diff line number Diff line Loading @@ -6061,6 +6061,31 @@ irqreturn_t dcin_uv_irq_handler(int irq, void *data) return IRQ_HANDLED; return IRQ_HANDLED; } } static bool is_cp_topo_vbatt(struct smb_charger *chg) { int rc; bool is_vbatt; union power_supply_propval pval; if (!chg->cp_psy) { chg->cp_psy = power_supply_get_by_name("charge_pump_master"); if (!chg->cp_psy) return false; } rc = power_supply_get_property(chg->cp_psy, POWER_SUPPLY_PROP_PARALLEL_OUTPUT_MODE, &pval); if (rc < 0) return false; is_vbatt = (pval.intval == POWER_SUPPLY_PL_OUTPUT_VBAT); smblib_dbg(chg, PR_WLS, "%s\n", is_vbatt ? "true" : "false"); return is_vbatt; } irqreturn_t dc_plugin_irq_handler(int irq, void *data) irqreturn_t dc_plugin_irq_handler(int irq, void *data) { { struct smb_irq_data *irq_data = data; struct smb_irq_data *irq_data = data; Loading @@ -6085,6 +6110,9 @@ irqreturn_t dc_plugin_irq_handler(int irq, void *data) dcin_present = input_present & INPUT_PRESENT_DC; dcin_present = input_present & INPUT_PRESENT_DC; vbus_present = input_present & INPUT_PRESENT_USB; vbus_present = input_present & INPUT_PRESENT_USB; if (!chg->cp_ilim_votable) chg->cp_ilim_votable = find_votable("CP_ILIM"); if (dcin_present && !vbus_present) { if (dcin_present && !vbus_present) { cancel_work_sync(&chg->dcin_aicl_work); cancel_work_sync(&chg->dcin_aicl_work); Loading @@ -6098,7 +6126,22 @@ irqreturn_t dc_plugin_irq_handler(int irq, void *data) smblib_dbg(chg, (PR_WLS | PR_INTERRUPT), "reset: icl: 100 mA\n"); smblib_dbg(chg, (PR_WLS | PR_INTERRUPT), "reset: icl: 100 mA\n"); /* * Remove USB's CP ILIM vote - inapplicable for wireless * parallel charging. */ if (chg->cp_ilim_votable) vote(chg->cp_ilim_votable, ICL_CHANGE_VOTER, false, 0); if (chg->sec_cp_present) { if (chg->sec_cp_present) { /* * If CP output topology is VBATT, limit main charger's * FCC share to 1 A and let the CPs handle the rest. */ if (is_cp_topo_vbatt(chg)) vote(chg->fcc_main_votable, WLS_PL_CHARGING_VOTER, true, 1000000); pval.intval = wireless_vout; pval.intval = wireless_vout; rc = smblib_set_prop_voltage_wls_output(chg, &pval); rc = smblib_set_prop_voltage_wls_output(chg, &pval); if (rc < 0) if (rc < 0) Loading Loading @@ -6137,6 +6180,7 @@ irqreturn_t dc_plugin_irq_handler(int irq, void *data) } } vote(chg->dc_suspend_votable, CHG_TERMINATION_VOTER, false, 0); vote(chg->dc_suspend_votable, CHG_TERMINATION_VOTER, false, 0); vote(chg->fcc_main_votable, WLS_PL_CHARGING_VOTER, false, 0); chg->last_wls_vout = 0; chg->last_wls_vout = 0; } } Loading drivers/power/supply/qcom/smb5-lib.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -74,6 +74,8 @@ enum print_reason { #define CC_MODE_VOTER "CC_MODE_VOTER" #define CC_MODE_VOTER "CC_MODE_VOTER" #define MAIN_FCC_VOTER "MAIN_FCC_VOTER" #define MAIN_FCC_VOTER "MAIN_FCC_VOTER" #define DCIN_AICL_VOTER "DCIN_AICL_VOTER" #define DCIN_AICL_VOTER "DCIN_AICL_VOTER" #define WLS_PL_CHARGING_VOTER "WLS_PL_CHARGING_VOTER" #define ICL_CHANGE_VOTER "ICL_CHANGE_VOTER" #define BOOST_BACK_STORM_COUNT 3 #define BOOST_BACK_STORM_COUNT 3 #define WEAK_CHG_STORM_COUNT 8 #define WEAK_CHG_STORM_COUNT 8 Loading Loading @@ -420,6 +422,7 @@ struct smb_charger { struct votable *chg_disable_votable; struct votable *chg_disable_votable; struct votable *pl_enable_votable_indirect; struct votable *pl_enable_votable_indirect; struct votable *cp_disable_votable; struct votable *cp_disable_votable; struct votable *cp_ilim_votable; struct votable *smb_override_votable; struct votable *smb_override_votable; struct votable *icl_irq_disable_votable; struct votable *icl_irq_disable_votable; struct votable *limited_irq_disable_votable; struct votable *limited_irq_disable_votable; Loading Loading
drivers/power/supply/qcom/smb1390-charger-psy.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -1106,6 +1106,7 @@ static void smb1390_status_change_work(struct work_struct *work) vote(chip->fcc_votable, CP_VOTER, false, 0); vote(chip->fcc_votable, CP_VOTER, false, 0); vote(chip->disable_votable, SOC_LEVEL_VOTER, true, 0); vote(chip->disable_votable, SOC_LEVEL_VOTER, true, 0); vote_override(chip->ilim_votable, CC_MODE_VOTER, false, 0); vote_override(chip->ilim_votable, CC_MODE_VOTER, false, 0); vote(chip->ilim_votable, WIRELESS_VOTER, false, 0); vote(chip->slave_disable_votable, TAPER_END_VOTER, false, 0); vote(chip->slave_disable_votable, TAPER_END_VOTER, false, 0); vote(chip->slave_disable_votable, MAIN_DISABLE_VOTER, true, 0); vote(chip->slave_disable_votable, MAIN_DISABLE_VOTER, true, 0); vote_override(chip->usb_icl_votable, TAPER_MAIN_ICL_LIMIT_VOTER, vote_override(chip->usb_icl_votable, TAPER_MAIN_ICL_LIMIT_VOTER, Loading
drivers/power/supply/qcom/smb5-lib.c +44 −0 Original line number Original line Diff line number Diff line Loading @@ -6061,6 +6061,31 @@ irqreturn_t dcin_uv_irq_handler(int irq, void *data) return IRQ_HANDLED; return IRQ_HANDLED; } } static bool is_cp_topo_vbatt(struct smb_charger *chg) { int rc; bool is_vbatt; union power_supply_propval pval; if (!chg->cp_psy) { chg->cp_psy = power_supply_get_by_name("charge_pump_master"); if (!chg->cp_psy) return false; } rc = power_supply_get_property(chg->cp_psy, POWER_SUPPLY_PROP_PARALLEL_OUTPUT_MODE, &pval); if (rc < 0) return false; is_vbatt = (pval.intval == POWER_SUPPLY_PL_OUTPUT_VBAT); smblib_dbg(chg, PR_WLS, "%s\n", is_vbatt ? "true" : "false"); return is_vbatt; } irqreturn_t dc_plugin_irq_handler(int irq, void *data) irqreturn_t dc_plugin_irq_handler(int irq, void *data) { { struct smb_irq_data *irq_data = data; struct smb_irq_data *irq_data = data; Loading @@ -6085,6 +6110,9 @@ irqreturn_t dc_plugin_irq_handler(int irq, void *data) dcin_present = input_present & INPUT_PRESENT_DC; dcin_present = input_present & INPUT_PRESENT_DC; vbus_present = input_present & INPUT_PRESENT_USB; vbus_present = input_present & INPUT_PRESENT_USB; if (!chg->cp_ilim_votable) chg->cp_ilim_votable = find_votable("CP_ILIM"); if (dcin_present && !vbus_present) { if (dcin_present && !vbus_present) { cancel_work_sync(&chg->dcin_aicl_work); cancel_work_sync(&chg->dcin_aicl_work); Loading @@ -6098,7 +6126,22 @@ irqreturn_t dc_plugin_irq_handler(int irq, void *data) smblib_dbg(chg, (PR_WLS | PR_INTERRUPT), "reset: icl: 100 mA\n"); smblib_dbg(chg, (PR_WLS | PR_INTERRUPT), "reset: icl: 100 mA\n"); /* * Remove USB's CP ILIM vote - inapplicable for wireless * parallel charging. */ if (chg->cp_ilim_votable) vote(chg->cp_ilim_votable, ICL_CHANGE_VOTER, false, 0); if (chg->sec_cp_present) { if (chg->sec_cp_present) { /* * If CP output topology is VBATT, limit main charger's * FCC share to 1 A and let the CPs handle the rest. */ if (is_cp_topo_vbatt(chg)) vote(chg->fcc_main_votable, WLS_PL_CHARGING_VOTER, true, 1000000); pval.intval = wireless_vout; pval.intval = wireless_vout; rc = smblib_set_prop_voltage_wls_output(chg, &pval); rc = smblib_set_prop_voltage_wls_output(chg, &pval); if (rc < 0) if (rc < 0) Loading Loading @@ -6137,6 +6180,7 @@ irqreturn_t dc_plugin_irq_handler(int irq, void *data) } } vote(chg->dc_suspend_votable, CHG_TERMINATION_VOTER, false, 0); vote(chg->dc_suspend_votable, CHG_TERMINATION_VOTER, false, 0); vote(chg->fcc_main_votable, WLS_PL_CHARGING_VOTER, false, 0); chg->last_wls_vout = 0; chg->last_wls_vout = 0; } } Loading
drivers/power/supply/qcom/smb5-lib.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -74,6 +74,8 @@ enum print_reason { #define CC_MODE_VOTER "CC_MODE_VOTER" #define CC_MODE_VOTER "CC_MODE_VOTER" #define MAIN_FCC_VOTER "MAIN_FCC_VOTER" #define MAIN_FCC_VOTER "MAIN_FCC_VOTER" #define DCIN_AICL_VOTER "DCIN_AICL_VOTER" #define DCIN_AICL_VOTER "DCIN_AICL_VOTER" #define WLS_PL_CHARGING_VOTER "WLS_PL_CHARGING_VOTER" #define ICL_CHANGE_VOTER "ICL_CHANGE_VOTER" #define BOOST_BACK_STORM_COUNT 3 #define BOOST_BACK_STORM_COUNT 3 #define WEAK_CHG_STORM_COUNT 8 #define WEAK_CHG_STORM_COUNT 8 Loading Loading @@ -420,6 +422,7 @@ struct smb_charger { struct votable *chg_disable_votable; struct votable *chg_disable_votable; struct votable *pl_enable_votable_indirect; struct votable *pl_enable_votable_indirect; struct votable *cp_disable_votable; struct votable *cp_disable_votable; struct votable *cp_ilim_votable; struct votable *smb_override_votable; struct votable *smb_override_votable; struct votable *icl_irq_disable_votable; struct votable *icl_irq_disable_votable; struct votable *limited_irq_disable_votable; struct votable *limited_irq_disable_votable; Loading