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

Commit 443cad92 authored by Dave Young's avatar Dave Young Committed by Greg Kroah-Hartman
Browse files

power supply : use class iteration api



Convert to use the class iteration api.

Signed-off-by: default avatarDave Young <hidave.darkstar@gmail.com>
Cc: Anton Vorontsov <cbou@mail.ru>
Cc: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 73cf6023
Loading
Loading
Loading
Loading
+68 −48
Original line number Original line Diff line number Diff line
@@ -13,6 +13,7 @@
#include <linux/power_supply.h>
#include <linux/power_supply.h>
#include <linux/apm-emulation.h>
#include <linux/apm-emulation.h>


static DEFINE_MUTEX(apm_mutex);
#define PSY_PROP(psy, prop, val) psy->get_property(psy, \
#define PSY_PROP(psy, prop, val) psy->get_property(psy, \
			 POWER_SUPPLY_PROP_##prop, val)
			 POWER_SUPPLY_PROP_##prop, val)


@@ -23,67 +24,86 @@


static struct power_supply *main_battery;
static struct power_supply *main_battery;


static void find_main_battery(void)
struct find_bat_param {
{
	struct power_supply *main;
	struct device *dev;
	struct power_supply *bat;
	struct power_supply *bat = NULL;
	struct power_supply *max_charge_bat;
	struct power_supply *max_charge_bat = NULL;
	struct power_supply *max_energy_bat;
	struct power_supply *max_energy_bat = NULL;
	union power_supply_propval full;
	union power_supply_propval full;
	int max_charge = 0;
	int max_charge;
	int max_energy = 0;
	int max_energy;
};


	main_battery = NULL;
static int __find_main_battery(struct device *dev, void *data)
{
	struct find_bat_param *bp = (struct find_bat_param *)data;


	list_for_each_entry(dev, &power_supply_class->devices, node) {
	bp->bat = dev_get_drvdata(dev);
		bat = dev_get_drvdata(dev);


		if (bat->use_for_apm) {
	if (bp->bat->use_for_apm) {
		/* nice, we explicitly asked to report this battery. */
		/* nice, we explicitly asked to report this battery. */
			main_battery = bat;
		bp->main = bp->bat;
			return;
		return 1;
	}
	}


		if (!PSY_PROP(bat, CHARGE_FULL_DESIGN, &full) ||
	if (!PSY_PROP(bp->bat, CHARGE_FULL_DESIGN, &bp->full) ||
				!PSY_PROP(bat, CHARGE_FULL, &full)) {
			!PSY_PROP(bp->bat, CHARGE_FULL, &bp->full)) {
			if (full.intval > max_charge) {
		if (bp->full.intval > bp->max_charge) {
				max_charge_bat = bat;
			bp->max_charge_bat = bp->bat;
				max_charge = full.intval;
			bp->max_charge = bp->full.intval;
		}
	} else if (!PSY_PROP(bp->bat, ENERGY_FULL_DESIGN, &bp->full) ||
			!PSY_PROP(bp->bat, ENERGY_FULL, &bp->full)) {
		if (bp->full.intval > bp->max_energy) {
			bp->max_energy_bat = bp->bat;
			bp->max_energy = bp->full.intval;
		}
		}
		} else if (!PSY_PROP(bat, ENERGY_FULL_DESIGN, &full) ||
				!PSY_PROP(bat, ENERGY_FULL, &full)) {
			if (full.intval > max_energy) {
				max_energy_bat = bat;
				max_energy = full.intval;
	}
	}
	return 0;
}
}

static void find_main_battery(void)
{
	struct find_bat_param bp;
	int error;

	memset(&bp, 0, sizeof(struct find_bat_param));
	main_battery = NULL;
	bp.main = main_battery;

	error = class_for_each_device(power_supply_class, &bp,
				      __find_main_battery);
	if (error) {
		main_battery = bp.main;
		return;
	}
	}


	if ((max_energy_bat && max_charge_bat) &&
	if ((bp.max_energy_bat && bp.max_charge_bat) &&
			(max_energy_bat != max_charge_bat)) {
			(bp.max_energy_bat != bp.max_charge_bat)) {
		/* try guess battery with more capacity */
		/* try guess battery with more capacity */
		if (!PSY_PROP(max_charge_bat, VOLTAGE_MAX_DESIGN, &full)) {
		if (!PSY_PROP(bp.max_charge_bat, VOLTAGE_MAX_DESIGN,
			if (max_energy > max_charge * full.intval)
			      &bp.full)) {
				main_battery = max_energy_bat;
			if (bp.max_energy > bp.max_charge * bp.full.intval)
				main_battery = bp.max_energy_bat;
			else
			else
				main_battery = max_charge_bat;
				main_battery = bp.max_charge_bat;
		} else if (!PSY_PROP(max_energy_bat, VOLTAGE_MAX_DESIGN,
		} else if (!PSY_PROP(bp.max_energy_bat, VOLTAGE_MAX_DESIGN,
								  &full)) {
								  &bp.full)) {
			if (max_charge > max_energy / full.intval)
			if (bp.max_charge > bp.max_energy / bp.full.intval)
				main_battery = max_charge_bat;
				main_battery = bp.max_charge_bat;
			else
			else
				main_battery = max_energy_bat;
				main_battery = bp.max_energy_bat;
		} else {
		} else {
			/* give up, choice any */
			/* give up, choice any */
			main_battery = max_energy_bat;
			main_battery = bp.max_energy_bat;
		}
		}
	} else if (max_charge_bat) {
	} else if (bp.max_charge_bat) {
		main_battery = max_charge_bat;
		main_battery = bp.max_charge_bat;
	} else if (max_energy_bat) {
	} else if (bp.max_energy_bat) {
		main_battery = max_energy_bat;
		main_battery = bp.max_energy_bat;
	} else {
	} else {
		/* give up, try the last if any */
		/* give up, try the last if any */
		main_battery = bat;
		main_battery = bp.bat;
	}
	}
}
}


@@ -207,10 +227,10 @@ static void apm_battery_apm_get_power_status(struct apm_power_info *info)
	union power_supply_propval status;
	union power_supply_propval status;
	union power_supply_propval capacity, time_to_full, time_to_empty;
	union power_supply_propval capacity, time_to_full, time_to_empty;


	down(&power_supply_class->sem);
	mutex_lock(&apm_mutex);
	find_main_battery();
	find_main_battery();
	if (!main_battery) {
	if (!main_battery) {
		up(&power_supply_class->sem);
		mutex_unlock(&apm_mutex);
		return;
		return;
	}
	}


@@ -278,7 +298,7 @@ static void apm_battery_apm_get_power_status(struct apm_power_info *info)
		}
		}
	}
	}


	up(&power_supply_class->sem);
	mutex_unlock(&apm_mutex);
}
}


static int __init apm_battery_init(void)
static int __init apm_battery_init(void)
+39 −35
Original line number Original line Diff line number Diff line
@@ -20,28 +20,29 @@


struct class *power_supply_class;
struct class *power_supply_class;


static void power_supply_changed_work(struct work_struct *work)
static int __power_supply_changed_work(struct device *dev, void *data)
{
{
	struct power_supply *psy = container_of(work, struct power_supply,
	struct power_supply *psy = (struct power_supply *)data;
						changed_work);
	int i;

	dev_dbg(psy->dev, "%s\n", __FUNCTION__);

	for (i = 0; i < psy->num_supplicants; i++) {
		struct device *dev;

		down(&power_supply_class->sem);
		list_for_each_entry(dev, &power_supply_class->devices, node) {
	struct power_supply *pst = dev_get_drvdata(dev);
	struct power_supply *pst = dev_get_drvdata(dev);
	int i;


	for (i = 0; i < psy->num_supplicants; i++)
		if (!strcmp(psy->supplied_to[i], pst->name)) {
		if (!strcmp(psy->supplied_to[i], pst->name)) {
			if (pst->external_power_changed)
			if (pst->external_power_changed)
				pst->external_power_changed(pst);
				pst->external_power_changed(pst);
		}
		}
	return 0;
}
}
		up(&power_supply_class->sem);

	}
static void power_supply_changed_work(struct work_struct *work)
{
	struct power_supply *psy = container_of(work, struct power_supply,
						changed_work);

	dev_dbg(psy->dev, "%s\n", __FUNCTION__);

	class_for_each_device(power_supply_class, psy,
			      __power_supply_changed_work);


	power_supply_update_leds(psy);
	power_supply_update_leds(psy);


@@ -55,13 +56,10 @@ void power_supply_changed(struct power_supply *psy)
	schedule_work(&psy->changed_work);
	schedule_work(&psy->changed_work);
}
}


int power_supply_am_i_supplied(struct power_supply *psy)
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 device *dev;
	struct power_supply *psy = (struct power_supply *)data;

	down(&power_supply_class->sem);
	list_for_each_entry(dev, &power_supply_class->devices, node) {
	struct power_supply *epsy = dev_get_drvdata(dev);
	struct power_supply *epsy = dev_get_drvdata(dev);
	int i;
	int i;


@@ -71,16 +69,22 @@ int power_supply_am_i_supplied(struct power_supply *psy)
				  POWER_SUPPLY_PROP_ONLINE, &ret))
				  POWER_SUPPLY_PROP_ONLINE, &ret))
				continue;
				continue;
			if (ret.intval)
			if (ret.intval)
					goto out;
				return ret.intval;
		}
		}
	}
	}
	return 0;
}
}
out:
	up(&power_supply_class->sem);


	dev_dbg(psy->dev, "%s %d\n", __FUNCTION__, ret.intval);
int power_supply_am_i_supplied(struct power_supply *psy)
{
	int error;


	return ret.intval;
	error = class_for_each_device(power_supply_class, psy,
				      __power_supply_am_i_supplied);

	dev_dbg(psy->dev, "%s %d\n", __FUNCTION__, error);

	return error;
}
}


int power_supply_register(struct device *parent, struct power_supply *psy)
int power_supply_register(struct device *parent, struct power_supply *psy)