Loading drivers/power/supply/qcom/smb5-lib.c +34 −16 Original line number Diff line number Diff line Loading @@ -235,12 +235,14 @@ static int smblib_select_sec_charger_locked(struct smb_charger *chg, return rc; } /* Enable Charge Pump, under HW control */ rc = smblib_write(chg, MISC_SMB_EN_CMD_REG, EN_CP_CMD_BIT); rc = smblib_masked_write(chg, MISC_SMB_EN_CMD_REG, EN_CP_CMD_BIT, EN_CP_CMD_BIT); if (rc < 0) { dev_err(chg->dev, "Couldn't enable SMB charger rc=%d\n", rc); return rc; } vote(chg->smb_override_votable, PL_SMB_EN_VOTER, false, 0); break; case POWER_SUPPLY_CHARGER_SEC_PL: /* select slave charger instead of Charge Pump */ Loading @@ -252,12 +254,14 @@ static int smblib_select_sec_charger_locked(struct smb_charger *chg, return rc; } /* Enable slave charger, under HW control */ rc = smblib_write(chg, MISC_SMB_EN_CMD_REG, EN_STAT_CMD_BIT); rc = smblib_masked_write(chg, MISC_SMB_EN_CMD_REG, EN_STAT_CMD_BIT, EN_STAT_CMD_BIT); if (rc < 0) { dev_err(chg->dev, "Couldn't enable SMB charger rc=%d\n", rc); return rc; } vote(chg->smb_override_votable, PL_SMB_EN_VOTER, false, 0); vote(chg->pl_disable_votable, PL_SMB_EN_VOTER, false, 0); Loading @@ -267,13 +271,7 @@ static int smblib_select_sec_charger_locked(struct smb_charger *chg, vote(chg->pl_disable_votable, PL_SMB_EN_VOTER, true, 0); /* SW override, disabling secondary charger(s) */ rc = smblib_write(chg, MISC_SMB_EN_CMD_REG, SMB_EN_OVERRIDE_BIT); if (rc < 0) { dev_err(chg->dev, "Couldn't disable charging rc=%d\n", rc); return rc; } vote(chg->smb_override_votable, PL_SMB_EN_VOTER, true, 0); break; } Loading Loading @@ -1327,6 +1325,21 @@ int smblib_toggle_smb_en(struct smb_charger *chg, int toggle) /********************* * VOTABLE CALLBACKS * *********************/ static int smblib_smb_disable_override_vote_callback(struct votable *votable, void *data, int disable_smb, const char *client) { struct smb_charger *chg = data; int rc = 0; /* Enable/disable SMB_EN pin */ rc = smblib_masked_write(chg, MISC_SMB_EN_CMD_REG, SMB_EN_OVERRIDE_BIT | SMB_EN_OVERRIDE_VALUE_BIT, disable_smb ? SMB_EN_OVERRIDE_BIT : 0); if (rc < 0) smblib_err(chg, "Couldn't configure SMB_EN, rc=%d\n", rc); return rc; } static int smblib_dc_suspend_vote_callback(struct votable *votable, void *data, int suspend, const char *client) Loading Loading @@ -2465,13 +2478,8 @@ static int smblib_process_thermal_readings(struct smb_charger *chg) if (chg->thermal_status == TEMP_ALERT_LEVEL) goto exit; /* Enable/disable SMB_EN pin */ rc = smblib_masked_write(chg, MISC_SMB_EN_CMD_REG, SMB_EN_OVERRIDE_BIT | SMB_EN_OVERRIDE_VALUE_BIT, (disable_smb ? SMB_EN_OVERRIDE_BIT : (SMB_EN_OVERRIDE_BIT | SMB_EN_OVERRIDE_VALUE_BIT))); if (rc < 0) smblib_err(chg, "Couldn't set SMB_EN, rc=%d\n", rc); vote(chg->smb_override_votable, SW_THERM_REGULATION_VOTER, disable_smb, 0); /* * Enable/disable secondary charger through votables to ensure Loading Loading @@ -5578,6 +5586,15 @@ static int smblib_create_votables(struct smb_charger *chg) vote(chg->pl_disable_votable, PL_DELAY_VOTER, true, 0); chg->smb_override_votable = create_votable("SMB_EN_OVERRIDE", VOTE_SET_ANY, smblib_smb_disable_override_vote_callback, chg); if (IS_ERR(chg->smb_override_votable)) { rc = PTR_ERR(chg->smb_override_votable); chg->smb_override_votable = NULL; return rc; } chg->dc_suspend_votable = create_votable("DC_SUSPEND", VOTE_SET_ANY, smblib_dc_suspend_vote_callback, chg); Loading Loading @@ -5681,6 +5698,7 @@ int smblib_init(struct smb_charger *chg) chg->jeita_configured = false; chg->sec_chg_selected = POWER_SUPPLY_CHARGER_SEC_NONE; chg->cp_reason = POWER_SUPPLY_CP_NONE; chg->thermal_status = TEMP_BELOW_RANGE; switch (chg->mode) { case PARALLEL_MASTER: Loading drivers/power/supply/qcom/smb5-lib.h +1 −0 Original line number Diff line number Diff line Loading @@ -372,6 +372,7 @@ struct smb_charger { struct votable *usb_irq_enable_votable; struct votable *cp_disable_votable; struct votable *wdog_snarl_irq_en_votable; struct votable *smb_override_votable; /* work */ struct work_struct bms_update_work; Loading Loading
drivers/power/supply/qcom/smb5-lib.c +34 −16 Original line number Diff line number Diff line Loading @@ -235,12 +235,14 @@ static int smblib_select_sec_charger_locked(struct smb_charger *chg, return rc; } /* Enable Charge Pump, under HW control */ rc = smblib_write(chg, MISC_SMB_EN_CMD_REG, EN_CP_CMD_BIT); rc = smblib_masked_write(chg, MISC_SMB_EN_CMD_REG, EN_CP_CMD_BIT, EN_CP_CMD_BIT); if (rc < 0) { dev_err(chg->dev, "Couldn't enable SMB charger rc=%d\n", rc); return rc; } vote(chg->smb_override_votable, PL_SMB_EN_VOTER, false, 0); break; case POWER_SUPPLY_CHARGER_SEC_PL: /* select slave charger instead of Charge Pump */ Loading @@ -252,12 +254,14 @@ static int smblib_select_sec_charger_locked(struct smb_charger *chg, return rc; } /* Enable slave charger, under HW control */ rc = smblib_write(chg, MISC_SMB_EN_CMD_REG, EN_STAT_CMD_BIT); rc = smblib_masked_write(chg, MISC_SMB_EN_CMD_REG, EN_STAT_CMD_BIT, EN_STAT_CMD_BIT); if (rc < 0) { dev_err(chg->dev, "Couldn't enable SMB charger rc=%d\n", rc); return rc; } vote(chg->smb_override_votable, PL_SMB_EN_VOTER, false, 0); vote(chg->pl_disable_votable, PL_SMB_EN_VOTER, false, 0); Loading @@ -267,13 +271,7 @@ static int smblib_select_sec_charger_locked(struct smb_charger *chg, vote(chg->pl_disable_votable, PL_SMB_EN_VOTER, true, 0); /* SW override, disabling secondary charger(s) */ rc = smblib_write(chg, MISC_SMB_EN_CMD_REG, SMB_EN_OVERRIDE_BIT); if (rc < 0) { dev_err(chg->dev, "Couldn't disable charging rc=%d\n", rc); return rc; } vote(chg->smb_override_votable, PL_SMB_EN_VOTER, true, 0); break; } Loading Loading @@ -1327,6 +1325,21 @@ int smblib_toggle_smb_en(struct smb_charger *chg, int toggle) /********************* * VOTABLE CALLBACKS * *********************/ static int smblib_smb_disable_override_vote_callback(struct votable *votable, void *data, int disable_smb, const char *client) { struct smb_charger *chg = data; int rc = 0; /* Enable/disable SMB_EN pin */ rc = smblib_masked_write(chg, MISC_SMB_EN_CMD_REG, SMB_EN_OVERRIDE_BIT | SMB_EN_OVERRIDE_VALUE_BIT, disable_smb ? SMB_EN_OVERRIDE_BIT : 0); if (rc < 0) smblib_err(chg, "Couldn't configure SMB_EN, rc=%d\n", rc); return rc; } static int smblib_dc_suspend_vote_callback(struct votable *votable, void *data, int suspend, const char *client) Loading Loading @@ -2465,13 +2478,8 @@ static int smblib_process_thermal_readings(struct smb_charger *chg) if (chg->thermal_status == TEMP_ALERT_LEVEL) goto exit; /* Enable/disable SMB_EN pin */ rc = smblib_masked_write(chg, MISC_SMB_EN_CMD_REG, SMB_EN_OVERRIDE_BIT | SMB_EN_OVERRIDE_VALUE_BIT, (disable_smb ? SMB_EN_OVERRIDE_BIT : (SMB_EN_OVERRIDE_BIT | SMB_EN_OVERRIDE_VALUE_BIT))); if (rc < 0) smblib_err(chg, "Couldn't set SMB_EN, rc=%d\n", rc); vote(chg->smb_override_votable, SW_THERM_REGULATION_VOTER, disable_smb, 0); /* * Enable/disable secondary charger through votables to ensure Loading Loading @@ -5578,6 +5586,15 @@ static int smblib_create_votables(struct smb_charger *chg) vote(chg->pl_disable_votable, PL_DELAY_VOTER, true, 0); chg->smb_override_votable = create_votable("SMB_EN_OVERRIDE", VOTE_SET_ANY, smblib_smb_disable_override_vote_callback, chg); if (IS_ERR(chg->smb_override_votable)) { rc = PTR_ERR(chg->smb_override_votable); chg->smb_override_votable = NULL; return rc; } chg->dc_suspend_votable = create_votable("DC_SUSPEND", VOTE_SET_ANY, smblib_dc_suspend_vote_callback, chg); Loading Loading @@ -5681,6 +5698,7 @@ int smblib_init(struct smb_charger *chg) chg->jeita_configured = false; chg->sec_chg_selected = POWER_SUPPLY_CHARGER_SEC_NONE; chg->cp_reason = POWER_SUPPLY_CP_NONE; chg->thermal_status = TEMP_BELOW_RANGE; switch (chg->mode) { case PARALLEL_MASTER: Loading
drivers/power/supply/qcom/smb5-lib.h +1 −0 Original line number Diff line number Diff line Loading @@ -372,6 +372,7 @@ struct smb_charger { struct votable *usb_irq_enable_votable; struct votable *cp_disable_votable; struct votable *wdog_snarl_irq_en_votable; struct votable *smb_override_votable; /* work */ struct work_struct bms_update_work; Loading