summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-03-21 13:28:41 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-03-21 13:28:41 -0700
commit8049821ec18cddf73e79ec79ff9792b3bd4e4d64 (patch)
tree5066756230dffbe26e72d1b05055129007d57fbc
parent4b7986eaba0e39361c27e2e1ee92223fc303b283 (diff)
parent5ff9ae6d013ef9bb302ae8334f722b32b3172ffc (diff)
Merge "qcom: smb-lib: float D+/D- before running APSD at init"
-rw-r--r--drivers/power/supply/qcom/qpnp-smb2.c4
-rw-r--r--drivers/power/supply/qcom/smb-lib.c27
2 files changed, 26 insertions, 5 deletions
diff --git a/drivers/power/supply/qcom/qpnp-smb2.c b/drivers/power/supply/qcom/qpnp-smb2.c
index 771d1cd32714..5f51406f29b7 100644
--- a/drivers/power/supply/qcom/qpnp-smb2.c
+++ b/drivers/power/supply/qcom/qpnp-smb2.c
@@ -1428,10 +1428,10 @@ static int smb2_init_hw(struct smb2 *chip)
DEFAULT_VOTER, true, chip->dt.fv_uv);
vote(chg->dc_icl_votable,
DEFAULT_VOTER, true, chip->dt.dc_icl_ua);
- vote(chg->hvdcp_disable_votable_indirect, DEFAULT_VOTER,
- chip->dt.hvdcp_disable, 0);
vote(chg->hvdcp_disable_votable_indirect, PD_INACTIVE_VOTER,
true, 0);
+ vote(chg->hvdcp_disable_votable_indirect, DEFAULT_VOTER,
+ chip->dt.hvdcp_disable, 0);
vote(chg->pd_disallowed_votable_indirect, CC_DETACHED_VOTER,
true, 0);
vote(chg->pd_disallowed_votable_indirect, HVDCP_TIMEOUT_VOTER,
diff --git a/drivers/power/supply/qcom/smb-lib.c b/drivers/power/supply/qcom/smb-lib.c
index 7d2e00dc934b..53bba35033a3 100644
--- a/drivers/power/supply/qcom/smb-lib.c
+++ b/drivers/power/supply/qcom/smb-lib.c
@@ -739,11 +739,32 @@ int smblib_rerun_apsd_if_required(struct smb_charger *chg)
return 0;
apsd_result = smblib_get_apsd_result(chg);
- if ((apsd_result->pst == POWER_SUPPLY_TYPE_UNKNOWN)
- || (apsd_result->pst == POWER_SUPPLY_TYPE_USB)) {
- smblib_rerun_apsd(chg);
+ if ((apsd_result->pst != POWER_SUPPLY_TYPE_UNKNOWN)
+ && (apsd_result->pst != POWER_SUPPLY_TYPE_USB))
+ /* if type is not usb or unknown no need to rerun apsd */
+ return 0;
+
+ /* fetch the DPDM regulator */
+ if (!chg->dpdm_reg && of_get_property(chg->dev->of_node,
+ "dpdm-supply", NULL)) {
+ chg->dpdm_reg = devm_regulator_get(chg->dev, "dpdm");
+ if (IS_ERR(chg->dpdm_reg)) {
+ smblib_err(chg, "Couldn't get dpdm regulator rc=%ld\n",
+ PTR_ERR(chg->dpdm_reg));
+ chg->dpdm_reg = NULL;
+ }
+ }
+
+ if (chg->dpdm_reg && !regulator_is_enabled(chg->dpdm_reg)) {
+ smblib_dbg(chg, PR_MISC, "enabling DPDM regulator\n");
+ rc = regulator_enable(chg->dpdm_reg);
+ if (rc < 0)
+ smblib_err(chg, "Couldn't enable dpdm regulator rc=%d\n",
+ rc);
}
+ smblib_rerun_apsd(chg);
+
return 0;
}