summaryrefslogtreecommitdiff
path: root/drivers/power/qcom-charger
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-08-13 23:13:09 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-08-13 23:13:08 -0700
commitd7363955655d0b6f8af2242b6b5b0401b3cb245f (patch)
tree32bbecaee1c6b27946dfff0a7199a12f1e1b3a7f /drivers/power/qcom-charger
parent6ece03e7b95e548ab4a412ef922e04ad08bfe52e (diff)
parentad3847ae4298a1b0641c0cfa5a75ef7cd8198982 (diff)
Merge "qcom-charger: smblib: update batt capacity status from bms"
Diffstat (limited to 'drivers/power/qcom-charger')
-rw-r--r--drivers/power/qcom-charger/smb-lib.c53
-rw-r--r--drivers/power/qcom-charger/smb-lib.h6
2 files changed, 40 insertions, 19 deletions
diff --git a/drivers/power/qcom-charger/smb-lib.c b/drivers/power/qcom-charger/smb-lib.c
index 8c7cd6e0cdd2..18b02fbde5a6 100644
--- a/drivers/power/qcom-charger/smb-lib.c
+++ b/drivers/power/qcom-charger/smb-lib.c
@@ -349,13 +349,20 @@ static int smblib_detach_usb(struct smb_charger *chg)
return rc;
}
-static int pl_notifier_call(struct notifier_block *nb,
+static int smblib_notifier_call(struct notifier_block *nb,
unsigned long ev, void *v)
{
struct power_supply *psy = v;
- struct smb_charger *chg = container_of(nb, struct smb_charger, pl.nb);
+ struct smb_charger *chg = container_of(nb, struct smb_charger, nb);
- if (strcmp(psy->desc->name, "parallel") == 0) {
+ if (!strcmp(psy->desc->name, "bms")) {
+ if (!chg->bms_psy)
+ chg->bms_psy = psy;
+ if (ev == PSY_EVENT_PROP_CHANGED && chg->batt_psy)
+ schedule_work(&chg->bms_update_work);
+ }
+
+ if (!chg->pl.psy && !strcmp(psy->desc->name, "parallel")) {
chg->pl.psy = psy;
schedule_work(&chg->pl_detect_work);
}
@@ -363,12 +370,12 @@ static int pl_notifier_call(struct notifier_block *nb,
return NOTIFY_OK;
}
-static int register_pl_notifier(struct smb_charger *chg)
+static int smblib_register_notifier(struct smb_charger *chg)
{
int rc;
- chg->pl.nb.notifier_call = pl_notifier_call;
- rc = power_supply_reg_notifier(&chg->pl.nb);
+ chg->nb.notifier_call = smblib_notifier_call;
+ rc = power_supply_reg_notifier(&chg->nb);
if (rc < 0) {
pr_err("Couldn't register psy notifier rc = %d\n", rc);
return rc;
@@ -740,8 +747,12 @@ int smblib_get_prop_batt_present(struct smb_charger *chg,
int smblib_get_prop_batt_capacity(struct smb_charger *chg,
union power_supply_propval *val)
{
- val->intval = 50;
- return 0;
+ int rc = -EINVAL;
+
+ if (chg->bms_psy)
+ rc = power_supply_get_property(chg->bms_psy,
+ POWER_SUPPLY_PROP_CAPACITY, val);
+ return rc;
}
int smblib_get_prop_batt_status(struct smb_charger *chg,
@@ -1738,13 +1749,18 @@ static void smblib_hvdcp_detect_work(struct work_struct *work)
}
}
+static void smblib_bms_update_work(struct work_struct *work)
+{
+ struct smb_charger *chg = container_of(work, struct smb_charger,
+ bms_update_work);
+ power_supply_changed(chg->batt_psy);
+}
+
static void smblib_pl_detect_work(struct work_struct *work)
{
struct smb_charger *chg = container_of(work, struct smb_charger,
pl_detect_work);
- power_supply_unreg_notifier(&chg->pl.nb);
-
if (!get_effective_result_locked(chg->pl_disable_votable))
rerun_election(chg->pl_disable_votable);
}
@@ -1887,6 +1903,7 @@ int smblib_init(struct smb_charger *chg)
int rc = 0;
mutex_init(&chg->write_lock);
+ INIT_WORK(&chg->bms_update_work, smblib_bms_update_work);
INIT_WORK(&chg->pl_detect_work, smblib_pl_detect_work);
INIT_DELAYED_WORK(&chg->hvdcp_detect_work, smblib_hvdcp_detect_work);
INIT_DELAYED_WORK(&chg->pl_taper_work, smblib_pl_taper_work);
@@ -1901,14 +1918,12 @@ int smblib_init(struct smb_charger *chg)
}
chg->pl.psy = power_supply_get_by_name("parallel");
- if (!chg->pl.psy) {
- rc = register_pl_notifier(chg);
- if (rc < 0) {
- dev_err(chg->dev,
- "Couldn't register notifier rc=%d\n",
- rc);
- return rc;
- }
+
+ rc = smblib_register_notifier(chg);
+ if (rc < 0) {
+ dev_err(chg->dev,
+ "Couldn't register notifier rc=%d\n", rc);
+ return rc;
}
break;
@@ -1935,5 +1950,7 @@ int smblib_deinit(struct smb_charger *chg)
destroy_votable(chg->awake_votable);
destroy_votable(chg->pl_disable_votable);
+ power_supply_unreg_notifier(&chg->nb);
+
return 0;
}
diff --git a/drivers/power/qcom-charger/smb-lib.h b/drivers/power/qcom-charger/smb-lib.h
index 1521fdb3fccf..47839074b724 100644
--- a/drivers/power/qcom-charger/smb-lib.h
+++ b/drivers/power/qcom-charger/smb-lib.h
@@ -74,7 +74,6 @@ struct smb_params {
};
struct parallel_params {
- struct notifier_block nb;
struct power_supply *psy;
int *master_percent;
int taper_percent;
@@ -96,8 +95,12 @@ struct smb_charger {
struct power_supply *batt_psy;
struct power_supply *usb_psy;
struct power_supply *dc_psy;
+ struct power_supply *bms_psy;
struct power_supply_desc usb_psy_desc;
+ /* notifiers */
+ struct notifier_block nb;
+
/* parallel charging */
struct parallel_params pl;
@@ -120,6 +123,7 @@ struct smb_charger {
struct votable *chg_disable_votable;
/* work */
+ struct work_struct bms_update_work;
struct work_struct pl_detect_work;
struct delayed_work hvdcp_detect_work;
struct delayed_work ps_change_timeout_work;