|
33 | 33 | { \
|
34 | 34 | .attr = { .name = #_name }, \
|
35 | 35 | .show = power_supply_show_property, \
|
36 |
| - .store = NULL, \ |
| 36 | + .store = power_supply_store_property, \ |
37 | 37 | }
|
38 | 38 |
|
39 | 39 | static struct device_attribute power_supply_attrs[];
|
@@ -99,6 +99,29 @@ static ssize_t power_supply_show_property(struct device *dev,
|
99 | 99 | return sprintf(buf, "%d\n", value.intval);
|
100 | 100 | }
|
101 | 101 |
|
| 102 | +static ssize_t power_supply_store_property(struct device *dev, |
| 103 | + struct device_attribute *attr, |
| 104 | + const char *buf, size_t count) { |
| 105 | + ssize_t ret; |
| 106 | + struct power_supply *psy = dev_get_drvdata(dev); |
| 107 | + const ptrdiff_t off = attr - power_supply_attrs; |
| 108 | + union power_supply_propval value; |
| 109 | + long long_val; |
| 110 | + |
| 111 | + /* TODO: support other types than int */ |
| 112 | + ret = strict_strtol(buf, 10, &long_val); |
| 113 | + if (ret < 0) |
| 114 | + return ret; |
| 115 | + |
| 116 | + value.intval = long_val; |
| 117 | + |
| 118 | + ret = psy->set_property(psy, off, &value); |
| 119 | + if (ret < 0) |
| 120 | + return ret; |
| 121 | + |
| 122 | + return count; |
| 123 | +} |
| 124 | + |
102 | 125 | /* Must be in the same order as POWER_SUPPLY_PROP_* */
|
103 | 126 | static struct device_attribute power_supply_attrs[] = {
|
104 | 127 | /* Properties of type `int' */
|
@@ -159,8 +182,17 @@ static mode_t power_supply_attr_is_visible(struct kobject *kobj,
|
159 | 182 | int i;
|
160 | 183 |
|
161 | 184 | for (i = 0; i < psy->num_properties; i++) {
|
162 |
| - if (psy->properties[i] == attrno) |
163 |
| - return 0444; |
| 185 | + int property = psy->properties[i]; |
| 186 | + |
| 187 | + if (property == attrno) { |
| 188 | + mode_t mode = S_IRUSR | S_IRGRP | S_IROTH; |
| 189 | + |
| 190 | + if (psy->property_is_writeable && |
| 191 | + psy->property_is_writeable(psy, property) > 0) |
| 192 | + mode |= S_IWUSR; |
| 193 | + |
| 194 | + return mode; |
| 195 | + } |
164 | 196 | }
|
165 | 197 |
|
166 | 198 | return 0;
|
|
0 commit comments