diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2017-04-10 17:23:57 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-04-10 17:23:56 -0700 |
| commit | 583095e81a68c6201b0d4ce34b9543832c8a0505 (patch) | |
| tree | d4392b03ba8f37ade0a87683c983c984948649c7 /drivers/power | |
| parent | b5149e3db646b3676eb82441332e71612fbc0b27 (diff) | |
| parent | e9b329a7e2b30a7a89aa14aa4cfe1388b3d4c5e4 (diff) | |
Merge "battery: fix 0mA ICL not suspending charger"
Diffstat (limited to 'drivers/power')
| -rw-r--r-- | drivers/power/supply/qcom/battery.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/drivers/power/supply/qcom/battery.c b/drivers/power/supply/qcom/battery.c index 914a6e4eae64..67f9d4fafeb8 100644 --- a/drivers/power/supply/qcom/battery.c +++ b/drivers/power/supply/qcom/battery.c @@ -511,13 +511,14 @@ static int pl_fv_vote_callback(struct votable *votable, void *data, return 0; } -#define ICL_STEP_UV 25000 +#define ICL_STEP_UA 25000 static int usb_icl_vote_callback(struct votable *votable, void *data, int icl_ua, const char *client) { int rc; struct pl_data *chip = data; union power_supply_propval pval = {0, }; + bool rerun_aicl = false; if (!chip->main_psy) return 0; @@ -543,22 +544,28 @@ static int usb_icl_vote_callback(struct votable *votable, void *data, } /* rerun AICL if new ICL is above settled ICL */ - if (icl_ua > pval.intval) { + if (icl_ua > pval.intval) + rerun_aicl = true; + + if (rerun_aicl) { /* set a lower ICL */ - pval.intval = max(pval.intval - ICL_STEP_UV, ICL_STEP_UV); + pval.intval = max(pval.intval - ICL_STEP_UA, ICL_STEP_UA); power_supply_set_property(chip->main_psy, POWER_SUPPLY_PROP_CURRENT_MAX, &pval); /* wait for ICL change */ msleep(100); + } - pval.intval = icl_ua; - power_supply_set_property(chip->main_psy, - POWER_SUPPLY_PROP_CURRENT_MAX, - &pval); + /* set the effective ICL */ + pval.intval = icl_ua; + power_supply_set_property(chip->main_psy, + POWER_SUPPLY_PROP_CURRENT_MAX, + &pval); + if (rerun_aicl) /* wait for ICL change */ msleep(100); - } + vote(chip->pl_disable_votable, ICL_CHANGE_VOTER, false, 0); return 0; |
