summaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-04-10 17:23:57 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-04-10 17:23:56 -0700
commit583095e81a68c6201b0d4ce34b9543832c8a0505 (patch)
treed4392b03ba8f37ade0a87683c983c984948649c7 /drivers/power
parentb5149e3db646b3676eb82441332e71612fbc0b27 (diff)
parente9b329a7e2b30a7a89aa14aa4cfe1388b3d4c5e4 (diff)
Merge "battery: fix 0mA ICL not suspending charger"
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/supply/qcom/battery.c23
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;