lkml.org 
[lkml]   [2010]   [May]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH 1/3] pda_power: add support for writeable properties
Sorry for the resend guys. My clock was skewed again, which might cause
people missing the messages. Fixed some commit logs on the way.

Sent from a tired brain, excuse typos :)


On Fri, May 07, 2010 at 07:52:11PM +0200, Daniel Mack wrote:
> This patch adds support for writeable power supply properties and
> exposes them as writeable to sysfs.
>
> A power supply implementation must implement two new function calls in
> order to use that feature:
>
> int set_property(struct power_supply *psy,
> enum power_supply_property psp,
> const union power_supply_propval *val);
>
> int property_is_writeable(struct power_supply *psy,
> enum power_supply_property psp);
>
> Signed-off-by: Daniel Mack <daniel@caiaq.de>
> Cc: Anton Vorontsov <cbou@mail.ru>
> Cc: David Woodhouse <dwmw2@infradead.org>
> Cc: Andres Salomon <dilinger@collabora.co.uk>
> Cc: Alexey Starikovskiy <astarikovskiy@suse.de>
> Cc: Len Brown <len.brown@intel.com>
> Cc: Mark Brown <broonie@opensource.wolfsonmicro.com>
> Cc: Matt Reimer <mreimer@vpop.net>
> Cc: Evgeniy Polyakov <zbr@ioremap.net>
> Cc: Tejun Heo <tj@kernel.org>
> ---
> drivers/power/power_supply_sysfs.c | 31 +++++++++++++++++++++++++++++--
> include/linux/power_supply.h | 5 +++++
> 2 files changed, 34 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/power/power_supply_sysfs.c b/drivers/power/power_supply_sysfs.c
> index 5b6e352..5cfb410 100644
> --- a/drivers/power/power_supply_sysfs.c
> +++ b/drivers/power/power_supply_sysfs.c
> @@ -31,9 +31,9 @@
>
> #define POWER_SUPPLY_ATTR(_name) \
> { \
> - .attr = { .name = #_name, .mode = 0444 }, \
> + .attr = { .name = #_name }, \
> .show = power_supply_show_property, \
> - .store = NULL, \
> + .store = power_supply_store_property, \
> }
>
> static struct device_attribute power_supply_attrs[];
> @@ -91,6 +91,25 @@ static ssize_t power_supply_show_property(struct device *dev,
> return sprintf(buf, "%d\n", value.intval);
> }
>
> +static ssize_t power_supply_store_property(struct device *dev,
> + struct device_attribute *attr,
> + const char *buf, size_t count) {
> + ssize_t ret;
> + struct power_supply *psy = dev_get_drvdata(dev);
> + const ptrdiff_t off = attr - power_supply_attrs;
> + union power_supply_propval value;
> + long long_val;
> +
> + /* TODO: support other types than int */
> + ret = strict_strtol(buf, 10, &long_val);
> + if (ret < 0)
> + return ret;
> +
> + value.intval = long_val;
> +
> + return psy->set_property(psy, off, &value);
> +}
> +
> /* Must be in the same order as POWER_SUPPLY_PROP_* */
> static struct device_attribute power_supply_attrs[] = {
> /* Properties of type `int' */
> @@ -164,6 +183,14 @@ int power_supply_create_attrs(struct power_supply *psy)
> }
>
> for (j = 0; j < psy->num_properties; j++) {
> + mode_t mode = S_IRUSR | S_IRGRP | S_IROTH;
> +
> + if (psy->property_is_writeable &&
> + psy->property_is_writeable(psy, psy->properties[j]) > 0)
> + mode |= S_IWUSR;
> +
> + power_supply_attrs[psy->properties[j]].attr.mode = mode;
> +
> rc = device_create_file(psy->dev,
> &power_supply_attrs[psy->properties[j]]);
> if (rc)
> diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h
> index ebd2b8f..f02f7fd 100644
> --- a/include/linux/power_supply.h
> +++ b/include/linux/power_supply.h
> @@ -144,6 +144,11 @@ struct power_supply {
> int (*get_property)(struct power_supply *psy,
> enum power_supply_property psp,
> union power_supply_propval *val);
> + int (*set_property)(struct power_supply *psy,
> + enum power_supply_property psp,
> + const union power_supply_propval *val);
> + int (*property_is_writeable)(struct power_supply *psy,
> + enum power_supply_property psp);
> void (*external_power_changed)(struct power_supply *psy);
> void (*set_charged)(struct power_supply *psy);
>
> --
> 1.6.3.3
>


\
 
 \ /
  Last update: 2010-05-07 19:57    [W:0.070 / U:0.372 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site