power: supply: Make power_supply_am_i_supplied return -ENODEV if there are no suppliers
It is sensible to assume that the hardware actually always has a way of charging the battery so when power_supply_am_i_supplied does not find any suppliers, that does not mean that there are none, but simply that no power_supply-drivers are registered / bound for any suppliers for the supply calling power_supply_am_i_supplied. At which point a fuel-gauge driver calling power_supply_am_i_supplied() cannot determine whether the battery is being charged or not. Allow a caller of power_supply_am_i_supplied to differentiate between there not being any suppliers, vs no suppliers being online by returning -ENODEV if there are no suppliers matching supplied_to / supplied_from, which allows fuel-gauge drivers to return POWER_SUPPLY_STATUS_UNKNOWN rather then POWER_SUPPLY_STATUS_DISCHARGING if there are no suppliers. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
This commit is contained in:
Родитель
19a2ee69c2
Коммит
2848e039c5
|
@ -280,13 +280,19 @@ static inline int power_supply_check_supplies(struct power_supply *psy)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int __power_supply_am_i_supplied(struct device *dev, void *data)
|
struct psy_am_i_supplied_data {
|
||||||
|
struct power_supply *psy;
|
||||||
|
unsigned int count;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __power_supply_am_i_supplied(struct device *dev, void *_data)
|
||||||
{
|
{
|
||||||
union power_supply_propval ret = {0,};
|
union power_supply_propval ret = {0,};
|
||||||
struct power_supply *psy = data;
|
|
||||||
struct power_supply *epsy = dev_get_drvdata(dev);
|
struct power_supply *epsy = dev_get_drvdata(dev);
|
||||||
|
struct psy_am_i_supplied_data *data = _data;
|
||||||
|
|
||||||
if (__power_supply_is_supplied_by(epsy, psy))
|
data->count++;
|
||||||
|
if (__power_supply_is_supplied_by(epsy, data->psy))
|
||||||
if (!epsy->desc->get_property(epsy, POWER_SUPPLY_PROP_ONLINE,
|
if (!epsy->desc->get_property(epsy, POWER_SUPPLY_PROP_ONLINE,
|
||||||
&ret))
|
&ret))
|
||||||
return ret.intval;
|
return ret.intval;
|
||||||
|
@ -296,12 +302,16 @@ static int __power_supply_am_i_supplied(struct device *dev, void *data)
|
||||||
|
|
||||||
int power_supply_am_i_supplied(struct power_supply *psy)
|
int power_supply_am_i_supplied(struct power_supply *psy)
|
||||||
{
|
{
|
||||||
|
struct psy_am_i_supplied_data data = { psy, 0 };
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
error = class_for_each_device(power_supply_class, NULL, psy,
|
error = class_for_each_device(power_supply_class, NULL, &data,
|
||||||
__power_supply_am_i_supplied);
|
__power_supply_am_i_supplied);
|
||||||
|
|
||||||
dev_dbg(&psy->dev, "%s %d\n", __func__, error);
|
dev_dbg(&psy->dev, "%s count %u err %d\n", __func__, data.count, error);
|
||||||
|
|
||||||
|
if (data.count == 0)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче