From e342aa46661c34dbc7c81f16de5d74703f7f2029 Mon Sep 17 00:00:00 2001 From: Rhyland Klein Date: Wed, 22 Jun 2016 11:45:52 -0400 Subject: [PATCH] UPSTREAM: power_supply: fix return value of get_property power_supply_get_property() should ideally return -EAGAIN if it is called while the power_supply is being registered. There was no way previously to determine if use_cnt == 0 meant that the power_supply wasn't fully registered yet, or if it had already been unregistered. Add a new boolean to the power_supply struct to simply show if registration is completed. Lastly, modify the check in power_supply_show_property() to also ignore -EAGAIN when so it doesn't complain about not returning the property. Change-Id: I8a710802534c033d64589d8d213eeaa36d9cc7d7 Signed-off-by: Rhyland Klein Signed-off-by: Sebastian Reichel Signed-off-by: Caesar Wang (cherry picked from commit e380538529e83c5d3fd27e8cbfcc1f9799cb6bbb) --- drivers/power/power_supply_core.c | 6 +++++- drivers/power/power_supply_sysfs.c | 2 +- include/linux/power_supply.h | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c index b13cd074c52a..a74d8ca383a1 100644 --- a/drivers/power/power_supply_core.c +++ b/drivers/power/power_supply_core.c @@ -491,8 +491,11 @@ int power_supply_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val) { - if (atomic_read(&psy->use_cnt) <= 0) + if (atomic_read(&psy->use_cnt) <= 0) { + if (!psy->initialized) + return -EAGAIN; return -ENODEV; + } return psy->desc->get_property(psy, psp, val); } @@ -785,6 +788,7 @@ __power_supply_register(struct device *parent, * after calling power_supply_register()). */ atomic_inc(&psy->use_cnt); + psy->initialized = true; queue_delayed_work(system_power_efficient_wq, &psy->deferred_register_work, diff --git a/drivers/power/power_supply_sysfs.c b/drivers/power/power_supply_sysfs.c index 280018d59d5a..f94054dd2f2c 100644 --- a/drivers/power/power_supply_sysfs.c +++ b/drivers/power/power_supply_sysfs.c @@ -82,7 +82,7 @@ static ssize_t power_supply_show_property(struct device *dev, if (ret == -ENODATA) dev_dbg(dev, "driver has no data for `%s' property\n", attr->attr.name); - else if (ret != -ENODEV) + else if (ret != -ENODEV && ret != -EAGAIN) dev_err(dev, "driver failed to report `%s' property: %zd\n", attr->attr.name, ret); return ret; diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index d43778bd6a07..3241026e49f6 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -254,6 +254,7 @@ struct power_supply { struct delayed_work deferred_register_work; spinlock_t changed_lock; bool changed; + bool initialized; atomic_t use_cnt; #ifdef CONFIG_THERMAL struct thermal_zone_device *tzd; -- 2.34.1