diff options
author | Nicholas Troast <ntroast@codeaurora.org> | 2017-02-15 10:15:32 -0800 |
---|---|---|
committer | Nicholas Troast <ntroast@codeaurora.org> | 2017-02-23 12:44:23 -0800 |
commit | 6c406f35b718c64c3e8ee4bf49945db701b7fac8 (patch) | |
tree | d79c170cb40ab7c362c2c8c8faf680efbb0bf233 /drivers/power | |
parent | aecaaa7d1c02f94dcd599bbd44f58ed310f8f4a7 (diff) |
smb-lib: rerun AICL when PD voltage changes
When the PD voltage changes AICL needs to be rerun to increase the input
current. Do it.
Change-Id: Ifa49547037d17c3ec2f01b6ac70faa310585825a
Signed-off-by: Nicholas Troast <ntroast@codeaurora.org>
Diffstat (limited to 'drivers/power')
-rw-r--r-- | drivers/power/supply/qcom/smb-lib.c | 58 | ||||
-rw-r--r-- | drivers/power/supply/qcom/smb-lib.h | 1 |
2 files changed, 42 insertions, 17 deletions
diff --git a/drivers/power/supply/qcom/smb-lib.c b/drivers/power/supply/qcom/smb-lib.c index ce2e077c4f07..f9784630c327 100644 --- a/drivers/power/supply/qcom/smb-lib.c +++ b/drivers/power/supply/qcom/smb-lib.c @@ -921,7 +921,6 @@ override_suspend_config: enable_icl_changed_interrupt: enable_irq(chg->irq_info[USBIN_ICL_CHANGE_IRQ].irq); - return rc; } @@ -1720,33 +1719,54 @@ int smblib_set_prop_system_temp_level(struct smb_charger *chg, int smblib_rerun_aicl(struct smb_charger *chg) { - int rc = 0; - u8 val; + int rc, settled_icl_ua; + u8 stat; - /* - * Use restart_AICL instead of trigger_AICL as it runs the - * complete AICL instead of starting from the last settled value. - * - * 8998 only supports trigger_AICL return error for 8998 - */ + rc = smblib_read(chg, POWER_PATH_STATUS_REG, &stat); + if (rc < 0) { + smblib_err(chg, "Couldn't read POWER_PATH_STATUS rc=%d\n", + rc); + return rc; + } + + /* USB is suspended so skip re-running AICL */ + if (stat & USBIN_SUSPEND_STS_BIT) + return rc; + + smblib_dbg(chg, PR_MISC, "re-running AICL\n"); switch (chg->smb_version) { case PMI8998_SUBTYPE: - smblib_dbg(chg, PR_PARALLEL, "AICL rerun not supported\n"); - return -EINVAL; + rc = smblib_get_charge_param(chg, &chg->param.icl_stat, + &settled_icl_ua); + if (rc < 0) { + smblib_err(chg, "Couldn't get settled ICL rc=%d\n", rc); + return rc; + } + + vote(chg->usb_icl_votable, AICL_RERUN_VOTER, true, + max(settled_icl_ua - chg->param.usb_icl.step_u, + chg->param.usb_icl.step_u)); + vote(chg->usb_icl_votable, AICL_RERUN_VOTER, false, 0); + break; case PM660_SUBTYPE: - val = RESTART_AICL_BIT; + /* + * Use restart_AICL instead of trigger_AICL as it runs the + * complete AICL instead of starting from the last settled + * value. + */ + rc = smblib_masked_write(chg, CMD_HVDCP_2_REG, + RESTART_AICL_BIT, RESTART_AICL_BIT); + if (rc < 0) + smblib_err(chg, "Couldn't write to CMD_HVDCP_2_REG rc=%d\n", + rc); break; default: smblib_dbg(chg, PR_PARALLEL, "unknown SMB chip %d\n", chg->smb_version); return -EINVAL; } - rc = smblib_masked_write(chg, CMD_HVDCP_2_REG, val, val); - if (rc < 0) - smblib_err(chg, "Couldn't write to CMD_HVDCP_2_REG rc=%d\n", - rc); - return rc; + return 0; } static int smblib_dp_pulse(struct smb_charger *chg) @@ -2403,6 +2423,10 @@ int smblib_set_prop_usb_voltage_max(struct smb_charger *chg, } chg->voltage_max_uv = max_uv; + rc = smblib_rerun_aicl(chg); + if (rc < 0) + smblib_err(chg, "Couldn't re-run AICL rc=%d\n", rc); + return rc; } diff --git a/drivers/power/supply/qcom/smb-lib.h b/drivers/power/supply/qcom/smb-lib.h index fa6fd3eb310d..21ccd3ce57c7 100644 --- a/drivers/power/supply/qcom/smb-lib.h +++ b/drivers/power/supply/qcom/smb-lib.h @@ -57,6 +57,7 @@ enum print_reason { #define PL_DELAY_HVDCP_VOTER "PL_DELAY_HVDCP_VOTER" #define CTM_VOTER "CTM_VOTER" #define SW_QC3_VOTER "SW_QC3_VOTER" +#define AICL_RERUN_VOTER "AICL_RERUN_VOTER" #define VCONN_MAX_ATTEMPTS 3 #define OTG_MAX_ATTEMPTS 3 |