power: qcom: smb-lib: enable HVDCP auth IRQ before APSD rerun

Currently the HVDCP auth IRQ is only enabled upon USB removal. When APSD
is rerun the USB type is not updated to HVDCP_3 since the IRQ was
disabled.

Fix this by enabling the HVDCP auth IRQ before APSD is rerun.

Change-Id: Ic9ec2dca5915651864582abea9165ca8c4290169
Signed-off-by: Nicholas Troast <ntroast@codeaurora.org>
This commit is contained in:
Nicholas Troast 2017-03-01 10:17:13 -08:00
parent 660ab6c3a2
commit e573d8b6b0

View file

@ -518,6 +518,26 @@ static int smblib_set_usb_pd_allowed_voltage(struct smb_charger *chg,
* HELPER FUNCTIONS *
********************/
static void smblib_rerun_apsd(struct smb_charger *chg)
{
int rc;
smblib_dbg(chg, PR_MISC, "re-running APSD\n");
if (chg->wa_flags & QC_AUTH_INTERRUPT_WA_BIT) {
rc = smblib_masked_write(chg,
USBIN_SOURCE_CHANGE_INTRPT_ENB_REG,
AUTH_IRQ_EN_CFG_BIT, AUTH_IRQ_EN_CFG_BIT);
if (rc < 0)
smblib_err(chg, "Couldn't enable HVDCP auth IRQ rc=%d\n",
rc);
}
rc = smblib_masked_write(chg, CMD_APSD_REG,
APSD_RERUN_BIT, APSD_RERUN_BIT);
if (rc < 0)
smblib_err(chg, "Couldn't re-run APSD rc=%d\n", rc);
}
static int try_rerun_apsd_for_hvdcp(struct smb_charger *chg)
{
const struct apsd_result *apsd_result;
@ -535,11 +555,7 @@ static int try_rerun_apsd_for_hvdcp(struct smb_charger *chg)
chg->hvdcp_disable_votable_indirect)) {
apsd_result = smblib_get_apsd_result(chg);
if (apsd_result->bit & (QC_2P0_BIT | QC_3P0_BIT)) {
/* rerun APSD */
smblib_dbg(chg, PR_MISC, "rerun APSD\n");
smblib_masked_write(chg, CMD_APSD_REG,
APSD_RERUN_BIT,
APSD_RERUN_BIT);
smblib_rerun_apsd(chg);
}
}
}
@ -551,12 +567,13 @@ static const struct apsd_result *smblib_update_usb_type(struct smb_charger *chg)
const struct apsd_result *apsd_result = smblib_get_apsd_result(chg);
/* if PD is active, APSD is disabled so won't have a valid result */
if (chg->pd_active) {
if (chg->pd_active)
chg->usb_psy_desc.type = POWER_SUPPLY_TYPE_USB_PD;
return apsd_result;
}
else
chg->usb_psy_desc.type = apsd_result->pst;
chg->usb_psy_desc.type = apsd_result->pst;
smblib_dbg(chg, PR_MISC, "APSD=%s PD=%d\n",
apsd_result->name, chg->pd_active);
return apsd_result;
}
@ -734,16 +751,7 @@ int smblib_rerun_apsd_if_required(struct smb_charger *chg)
apsd_result = smblib_get_apsd_result(chg);
if ((apsd_result->pst == POWER_SUPPLY_TYPE_UNKNOWN)
|| (apsd_result->pst == POWER_SUPPLY_TYPE_USB)) {
/* rerun APSD */
pr_info("Reruning APSD type = %s at bootup\n",
apsd_result->name);
rc = smblib_masked_write(chg, CMD_APSD_REG,
APSD_RERUN_BIT,
APSD_RERUN_BIT);
if (rc < 0) {
smblib_err(chg, "Couldn't rerun APSD rc = %d\n", rc);
return rc;
}
smblib_rerun_apsd(chg);
}
return 0;