Prev: [PATCH 3/3] perf symbols: allow forcing use of cplus_demangle
Next: [PATCH 3/3] power/ds2760_battery: use factor of 20 for rated_capacity
From: Daniel Mack on 11 May 2010 12:40 For userspace tools and daemons, it might be necessary to adjust the charge_now and charge_full properties of the ds2760 battery monitor, for example for unavoidable corrections due to aging batteries. For better readbility and to avoid magic numbers in conversion calculations, RATED_CAPACITY_FACTOR is introduced. Signed-off-by: Daniel Mack <daniel(a)caiaq.de> Cc: Anton Vorontsov <avorontsov(a)ru.mvista.com> Cc: Matt Reimer <mreimer(a)vpop.net> Cc: Evgeniy Polyakov <zbr(a)ioremap.net> Cc: Tejun Heo <tj(a)kernel.org> Cc: David Woodhouse <dwmw2(a)infradead.org> Cc: Andres Salomon <dilinger(a)collabora.co.uk> Cc: Alexey Starikovskiy <astarikovskiy(a)suse.de> Cc: Len Brown <len.brown(a)intel.com> Cc: Mark Brown <broonie(a)opensource.wolfsonmicro.com> --- drivers/power/ds2760_battery.c | 60 ++++++++++++++++++++++++++++++++++++++-- 1 files changed, 57 insertions(+), 3 deletions(-) diff --git a/drivers/power/ds2760_battery.c b/drivers/power/ds2760_battery.c index 3bf8d1f..b82bf92 100644 --- a/drivers/power/ds2760_battery.c +++ b/drivers/power/ds2760_battery.c @@ -78,6 +78,7 @@ MODULE_PARM_DESC(current_accum, "current accumulator value"); /* Some batteries have their rated capacity stored a N * 10 mAh, while * others use an index into this table. */ +#define RATED_CAPACITY_FACTOR 10 static int rated_capacities[] = { 0, 920, /* Samsung */ @@ -170,7 +171,8 @@ static int ds2760_battery_read_status(struct ds2760_device_info *di) di->rated_capacity = rated_capacities[ (unsigned int)di->raw[DS2760_RATED_CAPACITY]]; else - di->rated_capacity = di->raw[DS2760_RATED_CAPACITY] * 10; + di->rated_capacity = di->raw[DS2760_RATED_CAPACITY] * + RATED_CAPACITY_FACTOR; di->rated_capacity *= 1000; /* convert to µAh */ @@ -426,6 +428,54 @@ static int ds2760_battery_get_property(struct power_supply *psy, return 0; } +static int ds2760_battery_set_property(struct power_supply *psy, + enum power_supply_property psp, + const union power_supply_propval *val) +{ + int ret = -EPERM; + unsigned char tmp; + struct ds2760_device_info *di = to_ds2760_device_info(psy); + + switch (psp) { + case POWER_SUPPLY_PROP_CHARGE_FULL: + /* the interface counts in uAh, convert the value */ + ds2760_battery_write_rated_capacity(di, (val->intval / 1000L) / + RATED_CAPACITY_FACTOR); + break; + + case POWER_SUPPLY_PROP_CHARGE_NOW: + tmp = val->intval & 0xff; + ret = w1_ds2760_write(di->w1_dev, &tmp, DS2760_CURRENT_ACCUM_LSB, 1); + if (ret) + break; + + tmp = val->intval >> 8; + ret = w1_ds2760_write(di->w1_dev, &tmp, DS2760_CURRENT_ACCUM_MSB, 1); + + break; + + default: + break; + } + + return ret; +} + +static int ds2760_battery_property_is_writeable(struct power_supply *psy, + enum power_supply_property psp) +{ + switch (psp) { + case POWER_SUPPLY_PROP_CHARGE_FULL: + case POWER_SUPPLY_PROP_CHARGE_NOW: + return 1; + + default: + break; + } + + return 0; +} + static enum power_supply_property ds2760_battery_props[] = { POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_PROP_VOLTAGE_NOW, @@ -460,6 +510,9 @@ static int ds2760_battery_probe(struct platform_device *pdev) di->bat.properties = ds2760_battery_props; di->bat.num_properties = ARRAY_SIZE(ds2760_battery_props); di->bat.get_property = ds2760_battery_get_property; + di->bat.set_property = ds2760_battery_set_property; + di->bat.property_is_writeable = + ds2760_battery_property_is_writeable; di->bat.set_charged = ds2760_battery_set_charged; di->bat.external_power_changed = ds2760_battery_external_power_changed; @@ -476,9 +529,10 @@ static int ds2760_battery_probe(struct platform_device *pdev) ds2760_battery_write_status(di, status); - /* set rated capacity from module param */ + /* set rated capacity from module param (given in 10 * mAh) */ if (rated_capacity) - ds2760_battery_write_rated_capacity(di, rated_capacity); + ds2760_battery_write_rated_capacity(di, + (rated_capacity * 10) / RATED_CAPACITY_FACTOR); /* set current accumulator if given as parameter. * this should only be done for bootstrapping the value */ -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |