diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-08-21 18:44:55 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-08-22 14:05:42 -0400 |
commit | 36c27a655a531f16b5567066600f0ea7fcb973b4 (patch) | |
tree | 70ba9e1c4ca5c0b02fb9ab94f3fa54fdca040ccb | |
parent | 5b187b3c0edf9aae6ebbad61b9fbb4ec1795e18b (diff) |
w1: add attribute groups to struct w1_family_ops
This lets w1 slave drivers declare an attribute group, and not have to
create/destroy sysfs files directly. All w1 slave drivers will be fixed
to use this field up in follow-on patches to this one.
Acked-by: Evgeniy Polyakov <zbr@ioremap.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/w1/w1.c | 73 | ||||
-rw-r--r-- | drivers/w1/w1_family.h | 1 |
2 files changed, 42 insertions, 32 deletions
diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c index 52b6c2f02f7a..22013ca2119c 100644 --- a/drivers/w1/w1.c +++ b/drivers/w1/w1.c | |||
@@ -124,9 +124,9 @@ ATTRIBUTE_GROUPS(w1_slave); | |||
124 | 124 | ||
125 | /* Default family */ | 125 | /* Default family */ |
126 | 126 | ||
127 | static ssize_t w1_default_write(struct file *filp, struct kobject *kobj, | 127 | static ssize_t rw_write(struct file *filp, struct kobject *kobj, |
128 | struct bin_attribute *bin_attr, | 128 | struct bin_attribute *bin_attr, char *buf, loff_t off, |
129 | char *buf, loff_t off, size_t count) | 129 | size_t count) |
130 | { | 130 | { |
131 | struct w1_slave *sl = kobj_to_w1_slave(kobj); | 131 | struct w1_slave *sl = kobj_to_w1_slave(kobj); |
132 | 132 | ||
@@ -143,9 +143,9 @@ out_up: | |||
143 | return count; | 143 | return count; |
144 | } | 144 | } |
145 | 145 | ||
146 | static ssize_t w1_default_read(struct file *filp, struct kobject *kobj, | 146 | static ssize_t rw_read(struct file *filp, struct kobject *kobj, |
147 | struct bin_attribute *bin_attr, | 147 | struct bin_attribute *bin_attr, char *buf, loff_t off, |
148 | char *buf, loff_t off, size_t count) | 148 | size_t count) |
149 | { | 149 | { |
150 | struct w1_slave *sl = kobj_to_w1_slave(kobj); | 150 | struct w1_slave *sl = kobj_to_w1_slave(kobj); |
151 | 151 | ||
@@ -155,29 +155,24 @@ static ssize_t w1_default_read(struct file *filp, struct kobject *kobj, | |||
155 | return count; | 155 | return count; |
156 | } | 156 | } |
157 | 157 | ||
158 | static struct bin_attribute w1_default_attr = { | 158 | static BIN_ATTR_RW(rw, PAGE_SIZE); |
159 | .attr = { | 159 | |
160 | .name = "rw", | 160 | static struct bin_attribute *w1_slave_bin_attrs[] = { |
161 | .mode = S_IRUGO | S_IWUSR, | 161 | &bin_attr_rw, |
162 | }, | 162 | NULL, |
163 | .size = PAGE_SIZE, | ||
164 | .read = w1_default_read, | ||
165 | .write = w1_default_write, | ||
166 | }; | 163 | }; |
167 | 164 | ||
168 | static int w1_default_add_slave(struct w1_slave *sl) | 165 | static const struct attribute_group w1_slave_default_group = { |
169 | { | 166 | .bin_attrs = w1_slave_bin_attrs, |
170 | return sysfs_create_bin_file(&sl->dev.kobj, &w1_default_attr); | 167 | }; |
171 | } | ||
172 | 168 | ||
173 | static void w1_default_remove_slave(struct w1_slave *sl) | 169 | static const struct attribute_group *w1_slave_default_groups[] = { |
174 | { | 170 | &w1_slave_default_group, |
175 | sysfs_remove_bin_file(&sl->dev.kobj, &w1_default_attr); | 171 | NULL, |
176 | } | 172 | }; |
177 | 173 | ||
178 | static struct w1_family_ops w1_default_fops = { | 174 | static struct w1_family_ops w1_default_fops = { |
179 | .add_slave = w1_default_add_slave, | 175 | .groups = w1_slave_default_groups, |
180 | .remove_slave = w1_default_remove_slave, | ||
181 | }; | 176 | }; |
182 | 177 | ||
183 | static struct w1_family w1_default_family = { | 178 | static struct w1_family w1_default_family = { |
@@ -600,6 +595,7 @@ static int w1_bus_notify(struct notifier_block *nb, unsigned long action, | |||
600 | { | 595 | { |
601 | struct device *dev = data; | 596 | struct device *dev = data; |
602 | struct w1_slave *sl; | 597 | struct w1_slave *sl; |
598 | struct w1_family_ops *fops; | ||
603 | int err; | 599 | int err; |
604 | 600 | ||
605 | /* | 601 | /* |
@@ -611,23 +607,36 @@ static int w1_bus_notify(struct notifier_block *nb, unsigned long action, | |||
611 | return 0; | 607 | return 0; |
612 | 608 | ||
613 | sl = dev_to_w1_slave(dev); | 609 | sl = dev_to_w1_slave(dev); |
610 | fops = sl->family->fops; | ||
614 | 611 | ||
615 | switch (action) { | 612 | switch (action) { |
616 | case BUS_NOTIFY_ADD_DEVICE: | 613 | case BUS_NOTIFY_ADD_DEVICE: |
617 | /* if the family driver needs to initialize something... */ | 614 | /* if the family driver needs to initialize something... */ |
618 | if (sl->family->fops && sl->family->fops->add_slave && | 615 | if (fops->add_slave) { |
619 | ((err = sl->family->fops->add_slave(sl)) < 0)) { | 616 | err = fops->add_slave(sl); |
620 | dev_err(&sl->dev, | 617 | if (err < 0) { |
621 | "sysfs file creation for [%s] failed. err=%d\n", | 618 | dev_err(&sl->dev, |
622 | dev_name(&sl->dev), err); | 619 | "add_slave() call failed. err=%d\n", |
623 | return err; | 620 | err); |
621 | return err; | ||
622 | } | ||
623 | } | ||
624 | if (fops->groups) { | ||
625 | err = sysfs_create_groups(&sl->dev.kobj, fops->groups); | ||
626 | if (err) { | ||
627 | dev_err(&sl->dev, | ||
628 | "sysfs group creation failed. err=%d\n", | ||
629 | err); | ||
630 | return err; | ||
631 | } | ||
624 | } | 632 | } |
625 | 633 | ||
626 | break; | 634 | break; |
627 | case BUS_NOTIFY_DEL_DEVICE: | 635 | case BUS_NOTIFY_DEL_DEVICE: |
628 | /* Remove our sysfs files */ | 636 | if (fops->remove_slave) |
629 | if (sl->family->fops && sl->family->fops->remove_slave) | ||
630 | sl->family->fops->remove_slave(sl); | 637 | sl->family->fops->remove_slave(sl); |
638 | if (fops->groups) | ||
639 | sysfs_remove_groups(&sl->dev.kobj, fops->groups); | ||
631 | break; | 640 | break; |
632 | } | 641 | } |
633 | return 0; | 642 | return 0; |
diff --git a/drivers/w1/w1_family.h b/drivers/w1/w1_family.h index 625dd08f775f..4ad0e81b6404 100644 --- a/drivers/w1/w1_family.h +++ b/drivers/w1/w1_family.h | |||
@@ -52,6 +52,7 @@ struct w1_family_ops | |||
52 | { | 52 | { |
53 | int (* add_slave)(struct w1_slave *); | 53 | int (* add_slave)(struct w1_slave *); |
54 | void (* remove_slave)(struct w1_slave *); | 54 | void (* remove_slave)(struct w1_slave *); |
55 | const struct attribute_group **groups; | ||
55 | }; | 56 | }; |
56 | 57 | ||
57 | struct w1_family | 58 | struct w1_family |