diff options
| author | Harry Yang <harryy@codeaurora.org> | 2017-07-27 12:38:29 -0700 |
|---|---|---|
| committer | Harry Yang <harryy@codeaurora.org> | 2017-07-28 16:32:53 -0700 |
| commit | 4e6b3d37f5aea2bb5389392236f8a926e110c4cf (patch) | |
| tree | d94f800bb1478b5628812f804fbed0c507949918 | |
| parent | 0a57938d144e24ea7ef6b56ae6b2d4d732060f00 (diff) | |
qcom: smb138x: supsend USBIN and disable OTG before shutdown
SMB138X does not get reset when device restarts, so USBIN and OTG settings
will not be cleared. Reset them on PMIC shutdown, and restore in probe.
Disable OTG in early driver probe, because device may restart from WDOG
bite with OTG enabled.
CRs-Fixed: 2083638
Change-Id: I451d3e861ea28f89029fe8759599ac0e133baf11
Signed-off-by: Harry Yang <harryy@codeaurora.org>
| -rw-r--r-- | drivers/power/supply/qcom/smb138x-charger.c | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/drivers/power/supply/qcom/smb138x-charger.c b/drivers/power/supply/qcom/smb138x-charger.c index ec74e3825dd5..6e4a3b8a4bdf 100644 --- a/drivers/power/supply/qcom/smb138x-charger.c +++ b/drivers/power/supply/qcom/smb138x-charger.c @@ -871,6 +871,13 @@ static int smb138x_init_slave_hw(struct smb138x *chip) return rc; } + /* Disable OTG */ + rc = smblib_masked_write(chg, CMD_OTG_REG, OTG_EN_BIT, 0); + if (rc < 0) { + pr_err("Couldn't disable OTG rc=%d\n", rc); + return rc; + } + /* suspend parallel charging */ rc = smb138x_set_parallel_suspend(chip, true); if (rc < 0) { @@ -968,6 +975,20 @@ static int smb138x_init_hw(struct smb138x *chip) chg->dcp_icl_ua = chip->dt.usb_icl_ua; + /* Disable OTG */ + rc = smblib_masked_write(chg, CMD_OTG_REG, OTG_EN_BIT, 0); + if (rc < 0) { + pr_err("Couldn't disable OTG rc=%d\n", rc); + return rc; + } + + /* Unsuspend USB input */ + rc = smblib_masked_write(chg, USBIN_CMD_IL_REG, USBIN_SUSPEND_BIT, 0); + if (rc < 0) { + pr_err("Couldn't unsuspend USB, rc=%d\n", rc); + return rc; + } + /* configure to a fixed 700khz freq to avoid tdie errors */ rc = smblib_set_charge_param(chg, &chg->param.freq_buck, 700); if (rc < 0) { @@ -1608,14 +1629,33 @@ static int smb138x_remove(struct platform_device *pdev) return 0; } +static void smb138x_shutdown(struct platform_device *pdev) +{ + struct smb138x *chip = platform_get_drvdata(pdev); + struct smb_charger *chg = &chip->chg; + int rc; + + /* Suspend charging */ + rc = smb138x_set_parallel_suspend(chip, true); + if (rc < 0) + pr_err("Couldn't suspend charging rc=%d\n", rc); + + /* Disable OTG */ + rc = smblib_masked_write(chg, CMD_OTG_REG, OTG_EN_BIT, 0); + if (rc < 0) + pr_err("Couldn't disable OTG rc=%d\n", rc); + +} + static struct platform_driver smb138x_driver = { .driver = { .name = "qcom,smb138x-charger", .owner = THIS_MODULE, .of_match_table = match_table, }, - .probe = smb138x_probe, - .remove = smb138x_remove, + .probe = smb138x_probe, + .remove = smb138x_remove, + .shutdown = smb138x_shutdown, }; module_platform_driver(smb138x_driver); |
