Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e3805385 authored by Rhyland Klein's avatar Rhyland Klein Committed by Sebastian Reichel
Browse files

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.

Signed-off-by: default avatarRhyland Klein <rklein@nvidia.com>
Signed-off-by: default avatarSebastian Reichel <sre@kernel.org>
parent eee1d077
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -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);
}
@@ -780,6 +783,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,
+1 −1
Original line number Diff line number Diff line
@@ -83,7 +83,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;
+1 −0
Original line number Diff line number Diff line
@@ -248,6 +248,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;