aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-08-21 18:44:55 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-08-22 14:05:42 -0400
commit36c27a655a531f16b5567066600f0ea7fcb973b4 (patch)
tree70ba9e1c4ca5c0b02fb9ab94f3fa54fdca040ccb
parent5b187b3c0edf9aae6ebbad61b9fbb4ec1795e18b (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.c73
-rw-r--r--drivers/w1/w1_family.h1
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
127static ssize_t w1_default_write(struct file *filp, struct kobject *kobj, 127static 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
146static ssize_t w1_default_read(struct file *filp, struct kobject *kobj, 146static 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
158static struct bin_attribute w1_default_attr = { 158static BIN_ATTR_RW(rw, PAGE_SIZE);
159 .attr = { 159
160 .name = "rw", 160static 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
168static int w1_default_add_slave(struct w1_slave *sl) 165static 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
173static void w1_default_remove_slave(struct w1_slave *sl) 169static 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
178static struct w1_family_ops w1_default_fops = { 174static 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
183static struct w1_family w1_default_family = { 178static 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
57struct w1_family 58struct w1_family