Skip to content

Commit

Permalink
power_supply: Add support for writeable properties
Browse files Browse the repository at this point in the history
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: David Woodhouse <dwmw2@infradead.org>
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>
Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
  • Loading branch information
Daniel Mack authored and Anton Vorontsov committed May 19, 2010
1 parent 5f487cd commit 0011d2d
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 3 deletions.
38 changes: 35 additions & 3 deletions drivers/power/power_supply_sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
{ \
.attr = { .name = #_name }, \
.show = power_supply_show_property, \
.store = NULL, \
.store = power_supply_store_property, \
}

static struct device_attribute power_supply_attrs[];
Expand Down Expand Up @@ -99,6 +99,29 @@ 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;

ret = psy->set_property(psy, off, &value);
if (ret < 0)
return ret;

return count;
}

/* Must be in the same order as POWER_SUPPLY_PROP_* */
static struct device_attribute power_supply_attrs[] = {
/* Properties of type `int' */
Expand Down Expand Up @@ -159,8 +182,17 @@ static mode_t power_supply_attr_is_visible(struct kobject *kobj,
int i;

for (i = 0; i < psy->num_properties; i++) {
if (psy->properties[i] == attrno)
return 0444;
int property = psy->properties[i];

if (property == attrno) {
mode_t mode = S_IRUSR | S_IRGRP | S_IROTH;

if (psy->property_is_writeable &&
psy->property_is_writeable(psy, property) > 0)
mode |= S_IWUSR;

return mode;
}
}

return 0;
Expand Down
5 changes: 5 additions & 0 deletions include/linux/power_supply.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,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);

Expand Down

0 comments on commit 0011d2d

Please sign in to comment.