mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-07 04:12:04 -04:00
power: smb1398-charger: Toggle UVLO-config on USB removal and shutdown
To prevent leakage in ship-mode toggle OVP_IGNORE_UVLO after USB-removal and during shutdown. Change-Id: Idb482dd63d4939be5b19594385c642a61531e662 Signed-off-by: Anirudh Ghayal <aghayal@codeaurora.org>
This commit is contained in:
parent
ca8993b29a
commit
ed3ba9ec79
1 changed files with 48 additions and 0 deletions
|
|
@ -180,6 +180,9 @@
|
|||
#define PERPH0_CFG_SDCDC_REG 0x267A
|
||||
#define EN_WIN_UV_BIT BIT(7)
|
||||
|
||||
#define PERPH0_SOVP_CFG0_REG 0x2680
|
||||
#define CFG_OVP_IGNORE_UVLO BIT(5)
|
||||
|
||||
#define PERPH0_SSUPPLY_CFG0_REG 0x2682
|
||||
#define EN_HV_OV_OPTION2_BIT BIT(7)
|
||||
#define EN_MV_OV_OPTION2_BIT BIT(5)
|
||||
|
|
@ -308,6 +311,7 @@ struct smb1398_chip {
|
|||
struct power_supply *pre_regulator_psy;
|
||||
struct power_supply *batt_psy;
|
||||
struct power_supply *dc_psy;
|
||||
struct power_supply *usb_psy;
|
||||
struct notifier_block nb;
|
||||
|
||||
struct votable *awake_votable;
|
||||
|
|
@ -355,6 +359,7 @@ struct smb1398_chip {
|
|||
bool slave_en;
|
||||
bool in_suspend;
|
||||
bool disabled;
|
||||
bool usb_present;
|
||||
};
|
||||
|
||||
struct cp_iio_prop_channels {
|
||||
|
|
@ -1044,6 +1049,23 @@ static char *div2_cp_get_model_name(struct smb1398_chip *chip)
|
|||
return "SMB1398_V1";
|
||||
}
|
||||
|
||||
static int smb1398_toggle_uvlo(struct smb1398_chip *chip)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = smb1398_masked_write(chip, PERPH0_SOVP_CFG0_REG,
|
||||
CFG_OVP_IGNORE_UVLO, CFG_OVP_IGNORE_UVLO);
|
||||
if (rc < 0)
|
||||
dev_err(chip->dev, "Couldn't write IGNORE_UVLO rc=%d\n", rc);
|
||||
|
||||
rc = smb1398_masked_write(chip, PERPH0_SOVP_CFG0_REG,
|
||||
CFG_OVP_IGNORE_UVLO, 0);
|
||||
if (rc < 0)
|
||||
dev_err(chip->dev, "Couldn't write IGNORE_UVLO, rc=%d\n", rc);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static enum power_supply_property div2_cp_master_props[] = {
|
||||
POWER_SUPPLY_PROP_MODEL_NAME,
|
||||
};
|
||||
|
|
@ -1105,6 +1127,14 @@ static bool is_psy_voter_available(struct smb1398_chip *chip)
|
|||
}
|
||||
}
|
||||
|
||||
if (!chip->usb_psy) {
|
||||
chip->usb_psy = power_supply_get_by_name("usb");
|
||||
if (!chip->usb_psy) {
|
||||
dev_dbg(chip->dev, "Couldn't find usb psy\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!chip->dc_psy) {
|
||||
chip->dc_psy = power_supply_get_by_name("dc");
|
||||
if (!chip->dc_psy) {
|
||||
|
|
@ -1590,6 +1620,20 @@ static void smb1398_status_change_work(struct work_struct *work)
|
|||
if (!is_cutoff_soc_reached(chip))
|
||||
vote(chip->div2_cp_disable_votable, CUTOFF_SOC_VOTER, false, 0);
|
||||
|
||||
rc = power_supply_get_property(chip->usb_psy,
|
||||
POWER_SUPPLY_PROP_PRESENT, &pval);
|
||||
if (rc < 0) {
|
||||
dev_err(chip->dev,
|
||||
"Couldn't get USB PRESENT status, rc=%d\n", rc);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (chip->usb_present != !!pval.intval) {
|
||||
chip->usb_present = !!pval.intval;
|
||||
if (!chip->usb_present) /* USB has been removed */
|
||||
smb1398_toggle_uvlo(chip);
|
||||
}
|
||||
|
||||
rc = cp_read_iio_prop(chip, QPNP_SMB5, SMB_EN_MODE, &val);
|
||||
if (rc < 0) {
|
||||
dev_err(chip->dev, "Couldn't get SMB_EN_MODE, rc=%d\n", rc);
|
||||
|
|
@ -2968,6 +3012,10 @@ static void smb1398_shutdown(struct platform_device *pdev)
|
|||
rc = smb1398_div2_cp_switcher_en(chip, 0);
|
||||
if (rc < 0)
|
||||
dev_err(chip->dev, "Couldn't disable chip rc= %d\n", rc);
|
||||
|
||||
rc = smb1398_toggle_uvlo(chip);
|
||||
if (rc < 0)
|
||||
dev_err(chip->dev, "Couldn't toggle uvlo rc= %d\n", rc);
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops smb1398_pm_ops = {
|
||||
|
|
|
|||
Loading…
Reference in a new issue