summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Troast <ntroast@codeaurora.org>2017-02-15 10:15:32 -0800
committerNicholas Troast <ntroast@codeaurora.org>2017-02-23 12:44:23 -0800
commit6c406f35b718c64c3e8ee4bf49945db701b7fac8 (patch)
treed79c170cb40ab7c362c2c8c8faf680efbb0bf233
parentaecaaa7d1c02f94dcd599bbd44f58ed310f8f4a7 (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>
-rw-r--r--drivers/power/supply/qcom/smb-lib.c58
-rw-r--r--drivers/power/supply/qcom/smb-lib.h1
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