diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-07-09 15:24:25 -0700 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-07-09 15:24:25 -0700 |
| commit | aaf275f945460b5cb5ee6ea9ef95b06db5334461 (patch) | |
| tree | 8dd916f867832927b6cf9e91fbc14340ad8125a6 | |
| parent | 1cfe8e5d3a8ac05c5a39afc11f57ac2c9fdabaa5 (diff) | |
| download | patches-aaf275f945460b5cb5ee6ea9ef95b06db5334461.tar.gz | |
break patch up into proper pieces
25 files changed, 5234 insertions, 3211 deletions
diff --git a/bsr-convert-bsr_class-to-use-dev_groups.patch b/bsr-convert-bsr_class-to-use-dev_groups.patch new file mode 100644 index 00000000000000..e43d9d812375c1 --- /dev/null +++ b/bsr-convert-bsr_class-to-use-dev_groups.patch @@ -0,0 +1,66 @@ +From foo@baz Tue Jul 9 14:47:37 PDT 2013 +Date: Tue, 09 Jul 2013 14:47:37 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: bsr: convert bsr_class to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the bsr bsr_class code to use +the correct field. + +Cc: Arnd Bergmann <arnd@arndb.de> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/char/bsr.c | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +--- a/drivers/char/bsr.c ++++ b/drivers/char/bsr.c +@@ -95,6 +95,7 @@ bsr_size_show(struct device *dev, struct + struct bsr_dev *bsr_dev = dev_get_drvdata(dev); + return sprintf(buf, "%u\n", bsr_dev->bsr_bytes); + } ++static DEVICE_ATTR_RO(bsr_size); + + static ssize_t + bsr_stride_show(struct device *dev, struct device_attribute *attr, char *buf) +@@ -102,20 +103,23 @@ bsr_stride_show(struct device *dev, stru + struct bsr_dev *bsr_dev = dev_get_drvdata(dev); + return sprintf(buf, "%u\n", bsr_dev->bsr_stride); + } ++static DEVICE_ATTR_RO(bsr_stride); + + static ssize_t +-bsr_len_show(struct device *dev, struct device_attribute *attr, char *buf) ++bsr_length_show(struct device *dev, struct device_attribute *attr, char *buf) + { + struct bsr_dev *bsr_dev = dev_get_drvdata(dev); + return sprintf(buf, "%llu\n", bsr_dev->bsr_len); + } ++static DEVICE_ATTR_RO(bsr_length); + +-static struct device_attribute bsr_dev_attrs[] = { +- __ATTR(bsr_size, S_IRUGO, bsr_size_show, NULL), +- __ATTR(bsr_stride, S_IRUGO, bsr_stride_show, NULL), +- __ATTR(bsr_length, S_IRUGO, bsr_len_show, NULL), +- __ATTR_NULL ++static struct attribute *bsr_dev_attrs[] = { ++ &dev_attr_bsr_size.attr, ++ &dev_attr_bsr_stride.attr, ++ &dev_attr_bsr_length.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(bsr_dev); + + static int bsr_mmap(struct file *filp, struct vm_area_struct *vma) + { +@@ -308,7 +312,7 @@ static int __init bsr_init(void) + ret = PTR_ERR(bsr_class); + goto out_err_1; + } +- bsr_class->dev_attrs = bsr_dev_attrs; ++ bsr_class->dev_groups = bsr_dev_groups; + + ret = alloc_chrdev_region(&bsr_dev, 0, BSR_MAX_DEVS, "bsr"); + bsr_major = MAJOR(bsr_dev); diff --git a/c2port-convert-class-code-to-use-dev_groups.patch b/c2port-convert-class-code-to-use-dev_groups.patch new file mode 100644 index 00000000000000..35f65086e635bc --- /dev/null +++ b/c2port-convert-class-code-to-use-dev_groups.patch @@ -0,0 +1,161 @@ +From foo@baz Tue Jul 9 15:10:20 PDT 2013 +Date: Tue, 09 Jul 2013 15:10:20 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: c2port: convert class code to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the c2port class code to use the +correct field. + +Cc: Rodolfo Giometti <giometti@linux.it> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/misc/c2port/core.c | 50 ++++++++++++++++++++++++++------------------- + 1 file changed, 29 insertions(+), 21 deletions(-) + +--- a/drivers/misc/c2port/core.c ++++ b/drivers/misc/c2port/core.c +@@ -311,6 +311,7 @@ static ssize_t c2port_show_name(struct d + + return sprintf(buf, "%s\n", c2dev->name); + } ++static DEVICE_ATTR(name, 0444, c2port_show_name, NULL); + + static ssize_t c2port_show_flash_blocks_num(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -320,6 +321,7 @@ static ssize_t c2port_show_flash_blocks_ + + return sprintf(buf, "%d\n", ops->blocks_num); + } ++static DEVICE_ATTR(flash_blocks_num, 0444, c2port_show_flash_blocks_num, NULL); + + static ssize_t c2port_show_flash_block_size(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -329,6 +331,7 @@ static ssize_t c2port_show_flash_block_s + + return sprintf(buf, "%d\n", ops->block_size); + } ++static DEVICE_ATTR(flash_block_size, 0444, c2port_show_flash_block_size, NULL); + + static ssize_t c2port_show_flash_size(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -338,18 +341,18 @@ static ssize_t c2port_show_flash_size(st + + return sprintf(buf, "%d\n", ops->blocks_num * ops->block_size); + } ++static DEVICE_ATTR(flash_size, 0444, c2port_show_flash_size, NULL); + +-static ssize_t c2port_show_access(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t access_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct c2port_device *c2dev = dev_get_drvdata(dev); + + return sprintf(buf, "%d\n", c2dev->access); + } + +-static ssize_t c2port_store_access(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) ++static ssize_t access_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + struct c2port_device *c2dev = dev_get_drvdata(dev); + struct c2port_ops *ops = c2dev->ops; +@@ -375,6 +378,7 @@ static ssize_t c2port_store_access(struc + + return count; + } ++static DEVICE_ATTR_RW(access); + + static ssize_t c2port_store_reset(struct device *dev, + struct device_attribute *attr, +@@ -395,6 +399,7 @@ static ssize_t c2port_store_reset(struct + + return count; + } ++static DEVICE_ATTR(reset, 0200, NULL, c2port_store_reset); + + static ssize_t __c2port_show_dev_id(struct c2port_device *dev, char *buf) + { +@@ -431,6 +436,7 @@ static ssize_t c2port_show_dev_id(struct + + return ret; + } ++static DEVICE_ATTR(dev_id, 0444, c2port_show_dev_id, NULL); + + static ssize_t __c2port_show_rev_id(struct c2port_device *dev, char *buf) + { +@@ -467,6 +473,7 @@ static ssize_t c2port_show_rev_id(struct + + return ret; + } ++static DEVICE_ATTR(rev_id, 0444, c2port_show_rev_id, NULL); + + static ssize_t c2port_show_flash_access(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -536,6 +543,8 @@ static ssize_t c2port_store_flash_access + + return count; + } ++static DEVICE_ATTR(flash_access, 0644, c2port_show_flash_access, ++ c2port_store_flash_access); + + static ssize_t __c2port_write_flash_erase(struct c2port_device *dev) + { +@@ -616,6 +625,7 @@ static ssize_t c2port_store_flash_erase( + + return count; + } ++static DEVICE_ATTR(flash_erase, 0200, NULL, c2port_store_flash_erase); + + static ssize_t __c2port_read_flash_data(struct c2port_device *dev, + char *buffer, loff_t offset, size_t count) +@@ -850,22 +860,20 @@ static ssize_t c2port_write_flash_data(s + /* + * Class attributes + */ +- +-static struct device_attribute c2port_attrs[] = { +- __ATTR(name, 0444, c2port_show_name, NULL), +- __ATTR(flash_blocks_num, 0444, c2port_show_flash_blocks_num, NULL), +- __ATTR(flash_block_size, 0444, c2port_show_flash_block_size, NULL), +- __ATTR(flash_size, 0444, c2port_show_flash_size, NULL), +- __ATTR(access, 0644, c2port_show_access, c2port_store_access), +- __ATTR(reset, 0200, NULL, c2port_store_reset), +- __ATTR(dev_id, 0444, c2port_show_dev_id, NULL), +- __ATTR(rev_id, 0444, c2port_show_rev_id, NULL), +- +- __ATTR(flash_access, 0644, c2port_show_flash_access, +- c2port_store_flash_access), +- __ATTR(flash_erase, 0200, NULL, c2port_store_flash_erase), +- __ATTR_NULL, ++static struct attribute *c2port_attrs[] = { ++ &dev_attr_name.attr, ++ &dev_attr_flash_blocks_num.attr, ++ &dev_attr_flash_block_size.attr, ++ &dev_attr_flash_size.attr, ++ &dev_attr_access.attr, ++ &dev_attr_reset.attr, ++ &dev_attr_dev_id.attr, ++ &dev_attr_rev_id.attr, ++ &dev_attr_flash_access.attr, ++ &dev_attr_flash_erase.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(c2port); + + static struct bin_attribute c2port_bin_attrs[] = { + { +@@ -979,7 +987,7 @@ static int __init c2port_init(void) + printk(KERN_ERR "c2port: failed to allocate class\n"); + return PTR_ERR(c2port_class); + } +- c2port_class->dev_attrs = c2port_attrs; ++ c2port_class->dev_groups = c2port_groups; + c2port_class->dev_bin_attrs = c2port_bin_attrs; + + return 0; diff --git a/d1.patch b/d1.patch index f4257c7d721b26..6bf4190b627b6f 100644 --- a/d1.patch +++ b/d1.patch @@ -1,2270 +1,7 @@ -Subject: meta-patch of all of the dev_attr conversions - --- - drivers/devfreq/devfreq.c | 76 ++++++++++-------- - drivers/dma/dmaengine.c | 26 +++--- - drivers/extcon/extcon-class.c | 13 +-- - drivers/hid/hid-roccat-arvo.c | 25 +++-- - drivers/hid/hid-roccat-isku.c | 13 +-- - drivers/hid/hid-roccat-kone.c | 30 ++++--- - drivers/hid/hid-roccat-koneplus.c | 26 +++--- - drivers/hid/hid-roccat-kovaplus.c | 33 ++++--- - drivers/hid/hid-roccat-pyra.c | 22 +++-- - drivers/isdn/mISDN/core.c | 62 ++++++++------ - drivers/leds/led-class.c | 38 +++++++-- - drivers/media/v4l2-core/v4l2-dev.c | 30 ++++--- - drivers/misc/c2port/core.c | 50 ++++++----- - drivers/misc/enclosure.c | 29 ++---- - drivers/pci/pci-sysfs.c | 32 +++++-- - drivers/pci/pci.h | 2 - drivers/pci/probe.c | 2 - drivers/platform/x86/wmi.c | 10 +- - drivers/pps/pps.c | 2 - drivers/pps/sysfs.c | 55 ++++++++----- - drivers/ptp/ptp_clock.c | 2 - drivers/ptp/ptp_private.h | 2 - drivers/ptp/ptp_sysfs.c | 51 ++++++------ - drivers/regulator/core.c | 28 +++--- - drivers/rtc/rtc-sysfs.c | 46 +++++----- - drivers/scsi/osd/osd_uld.c | 13 +-- - drivers/scsi/sd.c | 147 +++++++++++++++++------------------ - drivers/scsi/st.c | 25 +++-- - drivers/staging/comedi/comedi_fops.c | 39 ++++----- - drivers/uio/uio.c | 22 +++-- - drivers/video/backlight/backlight.c | 44 +++++----- - drivers/video/backlight/lcd.c | 26 +++--- - drivers/video/output.c | 20 ++-- - fs/fuse/cuse.c | 13 +-- - include/linux/pps_kernel.h | 2 - mm/backing-dev.c | 19 ++-- - net/core/net-sysfs.c | 134 +++++++++++++++++-------------- - net/ieee802154/wpan-class.c | 21 ++--- - net/rfkill/core.c | 88 +++++++++----------- - net/wireless/sysfs.c | 23 +++-- - 40 files changed, 748 insertions(+), 593 deletions(-) + drivers/uio/uio.c | 22 +++++++++++++--------- + 1 file changed, 13 insertions(+), 9 deletions(-) ---- a/drivers/devfreq/devfreq.c -+++ b/drivers/devfreq/devfreq.c -@@ -703,7 +703,7 @@ err_out: - } - EXPORT_SYMBOL(devfreq_remove_governor); - --static ssize_t show_governor(struct device *dev, -+static ssize_t governor_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - if (!to_devfreq(dev)->governor) -@@ -712,7 +712,7 @@ static ssize_t show_governor(struct devi - return sprintf(buf, "%s\n", to_devfreq(dev)->governor->name); - } - --static ssize_t store_governor(struct device *dev, struct device_attribute *attr, -+static ssize_t governor_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) - { - struct devfreq *df = to_devfreq(dev); -@@ -754,9 +754,11 @@ out: - ret = count; - return ret; - } --static ssize_t show_available_governors(struct device *d, -- struct device_attribute *attr, -- char *buf) -+static DEVICE_ATTR_RW(governor); -+ -+static ssize_t available_governors_show(struct device *d, -+ struct device_attribute *attr, -+ char *buf) - { - struct devfreq_governor *tmp_governor; - ssize_t count = 0; -@@ -775,9 +777,10 @@ static ssize_t show_available_governors( - - return count; - } -+static DEVICE_ATTR_RO(available_governors); - --static ssize_t show_freq(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t cur_freq_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - unsigned long freq; - struct devfreq *devfreq = to_devfreq(dev); -@@ -788,20 +791,22 @@ static ssize_t show_freq(struct device * - - return sprintf(buf, "%lu\n", devfreq->previous_freq); - } -+static DEVICE_ATTR_RO(cur_freq); - --static ssize_t show_target_freq(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t target_freq_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - return sprintf(buf, "%lu\n", to_devfreq(dev)->previous_freq); - } -+static DEVICE_ATTR_RO(target_freq); - --static ssize_t show_polling_interval(struct device *dev, -+static ssize_t polling_interval_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - return sprintf(buf, "%d\n", to_devfreq(dev)->profile->polling_ms); - } - --static ssize_t store_polling_interval(struct device *dev, -+static ssize_t polling_interval_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) - { -@@ -821,8 +826,9 @@ static ssize_t store_polling_interval(st - - return ret; - } -+static DEVICE_ATTR_RW(polling_interval); - --static ssize_t store_min_freq(struct device *dev, struct device_attribute *attr, -+static ssize_t min_freq_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) - { - struct devfreq *df = to_devfreq(dev); -@@ -849,13 +855,13 @@ unlock: - return ret; - } - --static ssize_t show_min_freq(struct device *dev, struct device_attribute *attr, -+static ssize_t min_freq_show(struct device *dev, struct device_attribute *attr, - char *buf) - { - return sprintf(buf, "%lu\n", to_devfreq(dev)->min_freq); - } - --static ssize_t store_max_freq(struct device *dev, struct device_attribute *attr, -+static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) - { - struct devfreq *df = to_devfreq(dev); -@@ -881,16 +887,18 @@ unlock: - mutex_unlock(&df->lock); - return ret; - } -+static DEVICE_ATTR_RW(min_freq); - --static ssize_t show_max_freq(struct device *dev, struct device_attribute *attr, -+static ssize_t max_freq_show(struct device *dev, struct device_attribute *attr, - char *buf) - { - return sprintf(buf, "%lu\n", to_devfreq(dev)->max_freq); - } -+static DEVICE_ATTR_RW(max_freq); - --static ssize_t show_available_freqs(struct device *d, -- struct device_attribute *attr, -- char *buf) -+static ssize_t available_frequencies_show(struct device *d, -+ struct device_attribute *attr, -+ char *buf) - { - struct devfreq *df = to_devfreq(d); - struct device *dev = df->dev.parent; -@@ -918,9 +926,10 @@ static ssize_t show_available_freqs(stru - - return count; - } -+static DEVICE_ATTR_RO(available_frequencies); - --static ssize_t show_trans_table(struct device *dev, struct device_attribute *attr, -- char *buf) -+static ssize_t trans_stat_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - struct devfreq *devfreq = to_devfreq(dev); - ssize_t len; -@@ -959,20 +968,21 @@ static ssize_t show_trans_table(struct d - devfreq->total_trans); - return len; - } -+static DEVICE_ATTR_RO(trans_stat); - --static struct device_attribute devfreq_attrs[] = { -- __ATTR(governor, S_IRUGO | S_IWUSR, show_governor, store_governor), -- __ATTR(available_governors, S_IRUGO, show_available_governors, NULL), -- __ATTR(cur_freq, S_IRUGO, show_freq, NULL), -- __ATTR(available_frequencies, S_IRUGO, show_available_freqs, NULL), -- __ATTR(target_freq, S_IRUGO, show_target_freq, NULL), -- __ATTR(polling_interval, S_IRUGO | S_IWUSR, show_polling_interval, -- store_polling_interval), -- __ATTR(min_freq, S_IRUGO | S_IWUSR, show_min_freq, store_min_freq), -- __ATTR(max_freq, S_IRUGO | S_IWUSR, show_max_freq, store_max_freq), -- __ATTR(trans_stat, S_IRUGO, show_trans_table, NULL), -- { }, -+static struct attribute *devfreq_attrs[] = { -+ &dev_attr_governor.attr, -+ &dev_attr_available_governors.attr, -+ &dev_attr_cur_freq.attr, -+ &dev_attr_available_frequencies.attr, -+ &dev_attr_target_freq.attr, -+ &dev_attr_polling_interval.attr, -+ &dev_attr_min_freq.attr, -+ &dev_attr_max_freq.attr, -+ &dev_attr_trans_stat.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(devfreq); - - static int __init devfreq_init(void) - { -@@ -988,7 +998,7 @@ static int __init devfreq_init(void) - pr_err("%s: couldn't create workqueue\n", __FILE__); - return PTR_ERR(devfreq_wq); - } -- devfreq_class->dev_attrs = devfreq_attrs; -+ devfreq_class->dev_groups = devfreq_groups; - - return 0; - } ---- a/drivers/dma/dmaengine.c -+++ b/drivers/dma/dmaengine.c -@@ -87,7 +87,8 @@ static struct dma_chan *dev_to_dma_chan( - return chan_dev->chan; - } - --static ssize_t show_memcpy_count(struct device *dev, struct device_attribute *attr, char *buf) -+static ssize_t memcpy_count_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - struct dma_chan *chan; - unsigned long count = 0; -@@ -106,9 +107,10 @@ static ssize_t show_memcpy_count(struct - - return err; - } -+static DEVICE_ATTR_RO(memcpy_count); - --static ssize_t show_bytes_transferred(struct device *dev, struct device_attribute *attr, -- char *buf) -+static ssize_t bytes_transferred_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - struct dma_chan *chan; - unsigned long count = 0; -@@ -127,8 +129,10 @@ static ssize_t show_bytes_transferred(st - - return err; - } -+static DEVICE_ATTR_RO(bytes_transferred); - --static ssize_t show_in_use(struct device *dev, struct device_attribute *attr, char *buf) -+static ssize_t in_use_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct dma_chan *chan; - int err; -@@ -143,13 +147,15 @@ static ssize_t show_in_use(struct device - - return err; - } -+static DEVICE_ATTR_RO(in_use); - --static struct device_attribute dma_attrs[] = { -- __ATTR(memcpy_count, S_IRUGO, show_memcpy_count, NULL), -- __ATTR(bytes_transferred, S_IRUGO, show_bytes_transferred, NULL), -- __ATTR(in_use, S_IRUGO, show_in_use, NULL), -- __ATTR_NULL -+static struct attribute *dma_dev_attrs[] = { -+ &dev_attr_memcpy_count.attr, -+ &dev_attr_bytes_transferred.attr, -+ &dev_attr_in_use.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(dma_dev); - - static void chan_dev_release(struct device *dev) - { -@@ -167,7 +173,7 @@ static void chan_dev_release(struct devi - - static struct class dma_devclass = { - .name = "dma", -- .dev_attrs = dma_attrs, -+ .dev_groups = dma_dev_groups, - .dev_release = chan_dev_release, - }; - ---- a/drivers/extcon/extcon-class.c -+++ b/drivers/extcon/extcon-class.c -@@ -148,6 +148,7 @@ static ssize_t state_store(struct device - - return count; - } -+static DEVICE_ATTR_RW(state); - - static ssize_t name_show(struct device *dev, struct device_attribute *attr, - char *buf) -@@ -163,6 +164,7 @@ static ssize_t name_show(struct device * - - return sprintf(buf, "%s\n", dev_name(edev->dev)); - } -+static DEVICE_ATTR_RO(name); - - static ssize_t cable_name_show(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -527,11 +529,12 @@ int extcon_unregister_notifier(struct ex - } - EXPORT_SYMBOL_GPL(extcon_unregister_notifier); - --static struct device_attribute extcon_attrs[] = { -- __ATTR(state, S_IRUGO | S_IWUSR, state_show, state_store), -- __ATTR_RO(name), -- __ATTR_NULL, -+static struct attribute *extcon_attrs[] = { -+ &dev_attr_state.attr, -+ &dev_attr_name.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(extcon); - - static int create_extcon_class(void) - { -@@ -539,7 +542,7 @@ static int create_extcon_class(void) - extcon_class = class_create(THIS_MODULE, "extcon"); - if (IS_ERR(extcon_class)) - return PTR_ERR(extcon_class); -- extcon_class->dev_attrs = extcon_attrs; -+ extcon_class->dev_groups = extcon_groups; - - #if defined(CONFIG_ANDROID) - switch_class = class_compat_register("switch"); ---- a/drivers/hid/hid-roccat-arvo.c -+++ b/drivers/hid/hid-roccat-arvo.c -@@ -75,6 +75,8 @@ static ssize_t arvo_sysfs_set_mode_key(s - - return size; - } -+static DEVICE_ATTR(mode_key, 0660, -+ arvo_sysfs_show_mode_key, arvo_sysfs_set_mode_key); - - static ssize_t arvo_sysfs_show_key_mask(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -123,6 +125,8 @@ static ssize_t arvo_sysfs_set_key_mask(s - - return size; - } -+static DEVICE_ATTR(key_mask, 0660, -+ arvo_sysfs_show_key_mask, arvo_sysfs_set_key_mask); - - /* retval is 1-5 on success, < 0 on error */ - static int arvo_get_actual_profile(struct usb_device *usb_dev) -@@ -179,6 +183,9 @@ static ssize_t arvo_sysfs_set_actual_pro - mutex_unlock(&arvo->arvo_lock); - return retval; - } -+static DEVICE_ATTR(actual_profile, 0660, -+ arvo_sysfs_show_actual_profile, -+ arvo_sysfs_set_actual_profile); - - static ssize_t arvo_sysfs_write(struct file *fp, - struct kobject *kobj, void const *buf, -@@ -239,17 +246,13 @@ static ssize_t arvo_sysfs_read_info(stru - sizeof(struct arvo_info), ARVO_COMMAND_INFO); - } - -- --static struct device_attribute arvo_attributes[] = { -- __ATTR(mode_key, 0660, -- arvo_sysfs_show_mode_key, arvo_sysfs_set_mode_key), -- __ATTR(key_mask, 0660, -- arvo_sysfs_show_key_mask, arvo_sysfs_set_key_mask), -- __ATTR(actual_profile, 0660, -- arvo_sysfs_show_actual_profile, -- arvo_sysfs_set_actual_profile), -- __ATTR_NULL -+static struct attribute *arvo_attrs[] = { -+ &dev_attr_mode_key.attr, -+ &dev_attr_key_mask.attr, -+ &dev_attr_actual_profile.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(arvo); - - static struct bin_attribute arvo_bin_attributes[] = { - { -@@ -430,7 +433,7 @@ static int __init arvo_init(void) - arvo_class = class_create(THIS_MODULE, "arvo"); - if (IS_ERR(arvo_class)) - return PTR_ERR(arvo_class); -- arvo_class->dev_attrs = arvo_attributes; -+ arvo_class->dev_groups = arvo_groups; - arvo_class->dev_bin_attrs = arvo_bin_attributes; - - retval = hid_register_driver(&arvo_driver); ---- a/drivers/hid/hid-roccat-isku.c -+++ b/drivers/hid/hid-roccat-isku.c -@@ -109,13 +109,14 @@ static ssize_t isku_sysfs_set_actual_pro - - return size; - } -+static DEVICE_ATTR(actual_profile, 0660, isku_sysfs_show_actual_profile, -+ isku_sysfs_set_actual_profile); - --static struct device_attribute isku_attributes[] = { -- __ATTR(actual_profile, 0660, -- isku_sysfs_show_actual_profile, -- isku_sysfs_set_actual_profile), -- __ATTR_NULL -+static struct attribute *isku_attrs[] = { -+ &dev_attr_actual_profile.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(isku); - - static ssize_t isku_sysfs_read(struct file *fp, struct kobject *kobj, - char *buf, loff_t off, size_t count, -@@ -427,7 +428,7 @@ static int __init isku_init(void) - isku_class = class_create(THIS_MODULE, "isku"); - if (IS_ERR(isku_class)) - return PTR_ERR(isku_class); -- isku_class->dev_attrs = isku_attributes; -+ isku_class->dev_groups = isku_groups; - isku_class->dev_bin_attrs = isku_bin_attributes; - - retval = hid_register_driver(&isku_driver); ---- a/drivers/hid/hid-roccat-kone.c -+++ b/drivers/hid/hid-roccat-kone.c -@@ -386,6 +386,7 @@ static ssize_t kone_sysfs_show_actual_pr - hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); - return snprintf(buf, PAGE_SIZE, "%d\n", kone->actual_profile); - } -+static DEVICE_ATTR(actual_profile, 0440, kone_sysfs_show_actual_profile, NULL); - - static ssize_t kone_sysfs_show_actual_dpi(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -394,6 +395,7 @@ static ssize_t kone_sysfs_show_actual_dp - hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); - return snprintf(buf, PAGE_SIZE, "%d\n", kone->actual_dpi); - } -+static DEVICE_ATTR(actual_dpi, 0440, kone_sysfs_show_actual_dpi, NULL); - - /* weight is read each time, since we don't get informed when it's changed */ - static ssize_t kone_sysfs_show_weight(struct device *dev, -@@ -416,6 +418,7 @@ static ssize_t kone_sysfs_show_weight(st - return retval; - return snprintf(buf, PAGE_SIZE, "%d\n", weight); - } -+static DEVICE_ATTR(weight, 0440, kone_sysfs_show_weight, NULL); - - static ssize_t kone_sysfs_show_firmware_version(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -424,6 +427,8 @@ static ssize_t kone_sysfs_show_firmware_ - hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); - return snprintf(buf, PAGE_SIZE, "%d\n", kone->firmware_version); - } -+static DEVICE_ATTR(firmware_version, 0440, kone_sysfs_show_firmware_version, -+ NULL); - - static ssize_t kone_sysfs_show_tcu(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -524,6 +529,7 @@ exit_unlock: - mutex_unlock(&kone->kone_lock); - return retval; - } -+static DEVICE_ATTR(tcu, 0660, kone_sysfs_show_tcu, kone_sysfs_set_tcu); - - static ssize_t kone_sysfs_show_startup_profile(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -570,15 +576,17 @@ static ssize_t kone_sysfs_set_startup_pr - mutex_unlock(&kone->kone_lock); - return size; - } -+static DEVICE_ATTR(startup_profile, 0660, kone_sysfs_show_startup_profile, -+ kone_sysfs_set_startup_profile); - --static struct device_attribute kone_attributes[] = { -+static struct attribute *kone_attrs[] = { - /* - * Read actual dpi settings. - * Returns raw value for further processing. Refer to enum - * kone_polling_rates to get real value. - */ -- __ATTR(actual_dpi, 0440, kone_sysfs_show_actual_dpi, NULL), -- __ATTR(actual_profile, 0440, kone_sysfs_show_actual_profile, NULL), -+ &dev_attr_actual_dpi.attr, -+ &dev_attr_actual_profile.attr, - - /* - * The mouse can be equipped with one of four supplied weights from 5 -@@ -587,7 +595,7 @@ static struct device_attribute kone_attr - * by software. Refer to enum kone_weights to get corresponding real - * weight. - */ -- __ATTR(weight, 0440, kone_sysfs_show_weight, NULL), -+ &dev_attr_weight.attr, - - /* - * Prints firmware version stored in mouse as integer. -@@ -595,22 +603,20 @@ static struct device_attribute kone_attr - * to get the real version number the decimal point has to be shifted 2 - * positions to the left. E.g. a value of 138 means 1.38. - */ -- __ATTR(firmware_version, 0440, -- kone_sysfs_show_firmware_version, NULL), -+ &dev_attr_firmware_version.attr, - - /* - * Prints state of Tracking Control Unit as number where 0 = off and - * 1 = on. Writing 0 deactivates tcu and writing 1 calibrates and - * activates the tcu - */ -- __ATTR(tcu, 0660, kone_sysfs_show_tcu, kone_sysfs_set_tcu), -+ &dev_attr_tcu.attr, - - /* Prints and takes the number of the profile the mouse starts with */ -- __ATTR(startup_profile, 0660, -- kone_sysfs_show_startup_profile, -- kone_sysfs_set_startup_profile), -- __ATTR_NULL -+ &dev_attr_startup_profile.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(kone); - - static struct bin_attribute kone_bin_attributes[] = { - { -@@ -891,7 +897,7 @@ static int __init kone_init(void) - kone_class = class_create(THIS_MODULE, "kone"); - if (IS_ERR(kone_class)) - return PTR_ERR(kone_class); -- kone_class->dev_attrs = kone_attributes; -+ kone_class->dev_groups = kone_groups; - kone_class->dev_bin_attrs = kone_bin_attributes; - - retval = hid_register_driver(&kone_driver); ---- a/drivers/hid/hid-roccat-koneplus.c -+++ b/drivers/hid/hid-roccat-koneplus.c -@@ -274,6 +274,12 @@ static ssize_t koneplus_sysfs_set_actual - - return size; - } -+static DEVICE_ATTR(actual_profile, 0660, -+ koneplus_sysfs_show_actual_profile, -+ koneplus_sysfs_set_actual_profile); -+static DEVICE_ATTR(startup_profile, 0660, -+ koneplus_sysfs_show_actual_profile, -+ koneplus_sysfs_set_actual_profile); - - static ssize_t koneplus_sysfs_show_firmware_version(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -293,18 +299,16 @@ static ssize_t koneplus_sysfs_show_firmw - - return snprintf(buf, PAGE_SIZE, "%d\n", info.firmware_version); - } -+static DEVICE_ATTR(firmware_version, 0440, -+ koneplus_sysfs_show_firmware_version, NULL); - --static struct device_attribute koneplus_attributes[] = { -- __ATTR(actual_profile, 0660, -- koneplus_sysfs_show_actual_profile, -- koneplus_sysfs_set_actual_profile), -- __ATTR(startup_profile, 0660, -- koneplus_sysfs_show_actual_profile, -- koneplus_sysfs_set_actual_profile), -- __ATTR(firmware_version, 0440, -- koneplus_sysfs_show_firmware_version, NULL), -- __ATTR_NULL -+static struct attribute *koneplus_attrs[] = { -+ &dev_attr_actual_profile.attr, -+ &dev_attr_startup_profile.attr, -+ &dev_attr_firmware_version.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(koneplus); - - static struct bin_attribute koneplus_bin_attributes[] = { - KONEPLUS_BIN_ATTRIBUTE_W(control, CONTROL), -@@ -572,7 +576,7 @@ static int __init koneplus_init(void) - koneplus_class = class_create(THIS_MODULE, "koneplus"); - if (IS_ERR(koneplus_class)) - return PTR_ERR(koneplus_class); -- koneplus_class->dev_attrs = koneplus_attributes; -+ koneplus_class->dev_groups = koneplus_groups; - koneplus_class->dev_bin_attrs = koneplus_bin_attributes; - - retval = hid_register_driver(&koneplus_driver); ---- a/drivers/hid/hid-roccat-kovaplus.c -+++ b/drivers/hid/hid-roccat-kovaplus.c -@@ -310,6 +310,9 @@ static ssize_t kovaplus_sysfs_set_actual - - return size; - } -+static DEVICE_ATTR(actual_profile, 0660, -+ kovaplus_sysfs_show_actual_profile, -+ kovaplus_sysfs_set_actual_profile); - - static ssize_t kovaplus_sysfs_show_actual_cpi(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -318,6 +321,7 @@ static ssize_t kovaplus_sysfs_show_actua - hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); - return snprintf(buf, PAGE_SIZE, "%d\n", kovaplus->actual_cpi); - } -+static DEVICE_ATTR(actual_cpi, 0440, kovaplus_sysfs_show_actual_cpi, NULL); - - static ssize_t kovaplus_sysfs_show_actual_sensitivity_x(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -326,6 +330,8 @@ static ssize_t kovaplus_sysfs_show_actua - hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); - return snprintf(buf, PAGE_SIZE, "%d\n", kovaplus->actual_x_sensitivity); - } -+static DEVICE_ATTR(actual_sensitivity_x, 0440, -+ kovaplus_sysfs_show_actual_sensitivity_x, NULL); - - static ssize_t kovaplus_sysfs_show_actual_sensitivity_y(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -334,6 +340,8 @@ static ssize_t kovaplus_sysfs_show_actua - hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); - return snprintf(buf, PAGE_SIZE, "%d\n", kovaplus->actual_y_sensitivity); - } -+static DEVICE_ATTR(actual_sensitivity_y, 0440, -+ kovaplus_sysfs_show_actual_sensitivity_y, NULL); - - static ssize_t kovaplus_sysfs_show_firmware_version(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -353,21 +361,18 @@ static ssize_t kovaplus_sysfs_show_firmw - - return snprintf(buf, PAGE_SIZE, "%d\n", info.firmware_version); - } -+static DEVICE_ATTR(firmware_version, 0440, -+ kovaplus_sysfs_show_firmware_version, NULL); - --static struct device_attribute kovaplus_attributes[] = { -- __ATTR(actual_cpi, 0440, -- kovaplus_sysfs_show_actual_cpi, NULL), -- __ATTR(firmware_version, 0440, -- kovaplus_sysfs_show_firmware_version, NULL), -- __ATTR(actual_profile, 0660, -- kovaplus_sysfs_show_actual_profile, -- kovaplus_sysfs_set_actual_profile), -- __ATTR(actual_sensitivity_x, 0440, -- kovaplus_sysfs_show_actual_sensitivity_x, NULL), -- __ATTR(actual_sensitivity_y, 0440, -- kovaplus_sysfs_show_actual_sensitivity_y, NULL), -- __ATTR_NULL -+static struct attribute *kovaplus_attrs[] = { -+ &dev_attr_actual_cpi.attr, -+ &dev_attr_firmware_version.attr, -+ &dev_attr_actual_profile.attr, -+ &dev_attr_actual_sensitivity_x.attr, -+ &dev_attr_actual_sensitivity_y.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(kovaplus); - - static struct bin_attribute kovaplus_bin_attributes[] = { - KOVAPLUS_BIN_ATTRIBUTE_W(control, CONTROL), -@@ -662,7 +667,7 @@ static int __init kovaplus_init(void) - kovaplus_class = class_create(THIS_MODULE, "kovaplus"); - if (IS_ERR(kovaplus_class)) - return PTR_ERR(kovaplus_class); -- kovaplus_class->dev_attrs = kovaplus_attributes; -+ kovaplus_class->dev_groups = kovaplus_groups; - kovaplus_class->dev_bin_attrs = kovaplus_bin_attributes; - - retval = hid_register_driver(&kovaplus_driver); ---- a/drivers/hid/hid-roccat-pyra.c -+++ b/drivers/hid/hid-roccat-pyra.c -@@ -266,6 +266,7 @@ static ssize_t pyra_sysfs_show_actual_cp - hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); - return snprintf(buf, PAGE_SIZE, "%d\n", pyra->actual_cpi); - } -+static DEVICE_ATTR(actual_cpi, 0440, pyra_sysfs_show_actual_cpi, NULL); - - static ssize_t pyra_sysfs_show_actual_profile(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -282,6 +283,8 @@ static ssize_t pyra_sysfs_show_actual_pr - - return snprintf(buf, PAGE_SIZE, "%d\n", settings.startup_profile); - } -+static DEVICE_ATTR(actual_profile, 0440, pyra_sysfs_show_actual_profile, NULL); -+static DEVICE_ATTR(startup_profile, 0440, pyra_sysfs_show_actual_profile, NULL); - - static ssize_t pyra_sysfs_show_firmware_version(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -301,16 +304,17 @@ static ssize_t pyra_sysfs_show_firmware_ - - return snprintf(buf, PAGE_SIZE, "%d\n", info.firmware_version); - } -+static DEVICE_ATTR(firmware_version, 0440, pyra_sysfs_show_firmware_version, -+ NULL); - --static struct device_attribute pyra_attributes[] = { -- __ATTR(actual_cpi, 0440, pyra_sysfs_show_actual_cpi, NULL), -- __ATTR(actual_profile, 0440, pyra_sysfs_show_actual_profile, NULL), -- __ATTR(firmware_version, 0440, -- pyra_sysfs_show_firmware_version, NULL), -- __ATTR(startup_profile, 0440, -- pyra_sysfs_show_actual_profile, NULL), -- __ATTR_NULL -+static struct attribute *pyra_attrs[] = { -+ &dev_attr_actual_cpi.attr, -+ &dev_attr_actual_profile.attr, -+ &dev_attr_firmware_version.attr, -+ &dev_attr_startup_profile.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(pyra); - - static struct bin_attribute pyra_bin_attributes[] = { - PYRA_BIN_ATTRIBUTE_W(control, CONTROL), -@@ -600,7 +604,7 @@ static int __init pyra_init(void) - pyra_class = class_create(THIS_MODULE, "pyra"); - if (IS_ERR(pyra_class)) - return PTR_ERR(pyra_class); -- pyra_class->dev_attrs = pyra_attributes; -+ pyra_class->dev_groups = pyra_groups; - pyra_class->dev_bin_attrs = pyra_bin_attributes; - - retval = hid_register_driver(&pyra_driver); ---- a/drivers/isdn/mISDN/core.c -+++ b/drivers/isdn/mISDN/core.c -@@ -37,8 +37,8 @@ static void mISDN_dev_release(struct dev - /* nothing to do: the device is part of its parent's data structure */ - } - --static ssize_t _show_id(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t id_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - struct mISDNdevice *mdev = dev_to_mISDN(dev); - -@@ -46,9 +46,10 @@ static ssize_t _show_id(struct device *d - return -ENODEV; - return sprintf(buf, "%d\n", mdev->id); - } -+static DEVICE_ATTR_RO(id); - --static ssize_t _show_nrbchan(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t nrbchan_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - struct mISDNdevice *mdev = dev_to_mISDN(dev); - -@@ -56,9 +57,10 @@ static ssize_t _show_nrbchan(struct devi - return -ENODEV; - return sprintf(buf, "%d\n", mdev->nrbchan); - } -+static DEVICE_ATTR_RO(nrbchan); - --static ssize_t _show_d_protocols(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t d_protocols_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - struct mISDNdevice *mdev = dev_to_mISDN(dev); - -@@ -66,9 +68,10 @@ static ssize_t _show_d_protocols(struct - return -ENODEV; - return sprintf(buf, "%d\n", mdev->Dprotocols); - } -+static DEVICE_ATTR_RO(d_protocols); - --static ssize_t _show_b_protocols(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t b_protocols_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - struct mISDNdevice *mdev = dev_to_mISDN(dev); - -@@ -76,9 +79,10 @@ static ssize_t _show_b_protocols(struct - return -ENODEV; - return sprintf(buf, "%d\n", mdev->Bprotocols | get_all_Bprotocols()); - } -+static DEVICE_ATTR_RO(b_protocols); - --static ssize_t _show_protocol(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t protocol_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - struct mISDNdevice *mdev = dev_to_mISDN(dev); - -@@ -86,17 +90,19 @@ static ssize_t _show_protocol(struct dev - return -ENODEV; - return sprintf(buf, "%d\n", mdev->D.protocol); - } -+static DEVICE_ATTR_RO(protocol); - --static ssize_t _show_name(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t name_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - strcpy(buf, dev_name(dev)); - return strlen(buf); - } -+static DEVICE_ATTR_RO(name); - - #if 0 /* hangs */ --static ssize_t _set_name(struct device *dev, struct device_attribute *attr, -- const char *buf, size_t count) -+static ssize_t name_set(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) - { - int err = 0; - char *out = kmalloc(count + 1, GFP_KERNEL); -@@ -113,10 +119,11 @@ static ssize_t _set_name(struct device * - - return (err < 0) ? err : count; - } -+static DEVICE_ATTR_RW(name); - #endif - --static ssize_t _show_channelmap(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t channelmap_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - struct mISDNdevice *mdev = dev_to_mISDN(dev); - char *bp = buf; -@@ -127,18 +134,19 @@ static ssize_t _show_channelmap(struct d - - return bp - buf; - } -+static DEVICE_ATTR_RO(channelmap); - --static struct device_attribute mISDN_dev_attrs[] = { -- __ATTR(id, S_IRUGO, _show_id, NULL), -- __ATTR(d_protocols, S_IRUGO, _show_d_protocols, NULL), -- __ATTR(b_protocols, S_IRUGO, _show_b_protocols, NULL), -- __ATTR(protocol, S_IRUGO, _show_protocol, NULL), -- __ATTR(channelmap, S_IRUGO, _show_channelmap, NULL), -- __ATTR(nrbchan, S_IRUGO, _show_nrbchan, NULL), -- __ATTR(name, S_IRUGO, _show_name, NULL), --/* __ATTR(name, S_IRUGO | S_IWUSR, _show_name, _set_name), */ -- {} -+static struct attribute *mISDN_attrs[] = { -+ &dev_attr_id.attr, -+ &dev_attr_d_protocols.attr, -+ &dev_attr_b_protocols.attr, -+ &dev_attr_protocol.attr, -+ &dev_attr_channelmap.attr, -+ &dev_attr_nrbchan.attr, -+ &dev_attr_name.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(mISDN); - - static int mISDN_uevent(struct device *dev, struct kobj_uevent_env *env) - { -@@ -162,7 +170,7 @@ static struct class mISDN_class = { - .name = "mISDN", - .owner = THIS_MODULE, - .dev_uevent = mISDN_uevent, -- .dev_attrs = mISDN_dev_attrs, -+ .dev_groups = mISDN_groups, - .dev_release = mISDN_dev_release, - .class_release = mISDN_class_release, - }; ---- a/drivers/leds/led-class.c -+++ b/drivers/leds/led-class.c -@@ -29,7 +29,7 @@ static void led_update_brightness(struct - led_cdev->brightness = led_cdev->brightness_get(led_cdev); - } - --static ssize_t led_brightness_show(struct device *dev, -+static ssize_t brightness_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - struct led_classdev *led_cdev = dev_get_drvdata(dev); -@@ -40,7 +40,7 @@ static ssize_t led_brightness_show(struc - return sprintf(buf, "%u\n", led_cdev->brightness); - } - --static ssize_t led_brightness_store(struct device *dev, -+static ssize_t brightness_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t size) - { - struct led_classdev *led_cdev = dev_get_drvdata(dev); -@@ -57,6 +57,7 @@ static ssize_t led_brightness_store(stru - - return size; - } -+static DEVICE_ATTR_RW(brightness); - - static ssize_t led_max_brightness_show(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -65,14 +66,35 @@ static ssize_t led_max_brightness_show(s - - return sprintf(buf, "%u\n", led_cdev->max_brightness); - } -+static DEVICE_ATTR(max_brightness, 0444, led_max_brightness_show, NULL); - --static struct device_attribute led_class_attrs[] = { -- __ATTR(brightness, 0644, led_brightness_show, led_brightness_store), -- __ATTR(max_brightness, 0444, led_max_brightness_show, NULL), - #ifdef CONFIG_LEDS_TRIGGERS -- __ATTR(trigger, 0644, led_trigger_show, led_trigger_store), -+static DEVICE_ATTR(trigger, 0644, led_trigger_show, led_trigger_store); -+static struct attribute *led_trigger_attrs[] = { -+ &dev_attr_trigger.attr, -+ NULL, -+}; -+static const struct attribute_group led_trigger_group = { -+ .attrs = led_trigger_attrs, -+}; -+#endif -+ -+static struct attribute *led_class_attrs[] = { -+ &dev_attr_brightness.attr, -+ &dev_attr_max_brightness.attr, -+ NULL, -+}; -+ -+static const struct attribute_group led_group = { -+ .attrs = led_class_attrs, -+}; -+ -+static const struct attribute_group *led_groups[] = { -+ &led_group, -+#ifdef CONFIG_LEDS_TRIGGERS -+ &led_trigger_group, - #endif -- __ATTR_NULL, -+ NULL, - }; - - static void led_timer_function(unsigned long data) -@@ -258,7 +280,7 @@ static int __init leds_init(void) - if (IS_ERR(leds_class)) - return PTR_ERR(leds_class); - leds_class->pm = &leds_class_dev_pm_ops; -- leds_class->dev_attrs = led_class_attrs; -+ leds_class->dev_groups = led_groups; - return 0; - } - ---- a/drivers/media/v4l2-core/v4l2-dev.c -+++ b/drivers/media/v4l2-core/v4l2-dev.c -@@ -38,24 +38,25 @@ - * sysfs stuff - */ - --static ssize_t show_index(struct device *cd, -- struct device_attribute *attr, char *buf) -+static ssize_t index_show(struct device *cd, -+ struct device_attribute *attr, char *buf) - { - struct video_device *vdev = to_video_device(cd); - - return sprintf(buf, "%i\n", vdev->index); - } -+static DEVICE_ATTR_RO(index); - --static ssize_t show_debug(struct device *cd, -- struct device_attribute *attr, char *buf) -+static ssize_t debug_show(struct device *cd, -+ struct device_attribute *attr, char *buf) - { - struct video_device *vdev = to_video_device(cd); - - return sprintf(buf, "%i\n", vdev->debug); - } - --static ssize_t set_debug(struct device *cd, struct device_attribute *attr, -- const char *buf, size_t len) -+static ssize_t debug_store(struct device *cd, struct device_attribute *attr, -+ const char *buf, size_t len) - { - struct video_device *vdev = to_video_device(cd); - int res = 0; -@@ -68,21 +69,24 @@ static ssize_t set_debug(struct device * - vdev->debug = value; - return len; - } -+static DEVICE_ATTR_RW(debug); - --static ssize_t show_name(struct device *cd, -+static ssize_t name_show(struct device *cd, - struct device_attribute *attr, char *buf) - { - struct video_device *vdev = to_video_device(cd); - - return sprintf(buf, "%.*s\n", (int)sizeof(vdev->name), vdev->name); - } -+static DEVICE_ATTR_RO(name); - --static struct device_attribute video_device_attrs[] = { -- __ATTR(name, S_IRUGO, show_name, NULL), -- __ATTR(debug, 0644, show_debug, set_debug), -- __ATTR(index, S_IRUGO, show_index, NULL), -- __ATTR_NULL -+static struct attribute *video_device_attrs[] = { -+ &dev_attr_name.attr, -+ &dev_attr_debug.attr, -+ &dev_attr_index.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(video_device); - - /* - * Active devices -@@ -217,7 +221,7 @@ static void v4l2_device_release(struct d - - static struct class video_class = { - .name = VIDEO_NAME, -- .dev_attrs = video_device_attrs, -+ .dev_groups = video_device_groups, - }; - - struct video_device *video_devdata(struct file *file) ---- a/drivers/misc/c2port/core.c -+++ b/drivers/misc/c2port/core.c -@@ -311,6 +311,7 @@ static ssize_t c2port_show_name(struct d - - return sprintf(buf, "%s\n", c2dev->name); - } -+static DEVICE_ATTR(name, 0444, c2port_show_name, NULL); - - static ssize_t c2port_show_flash_blocks_num(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -320,6 +321,7 @@ static ssize_t c2port_show_flash_blocks_ - - return sprintf(buf, "%d\n", ops->blocks_num); - } -+static DEVICE_ATTR(flash_blocks_num, 0444, c2port_show_flash_blocks_num, NULL); - - static ssize_t c2port_show_flash_block_size(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -329,6 +331,7 @@ static ssize_t c2port_show_flash_block_s - - return sprintf(buf, "%d\n", ops->block_size); - } -+static DEVICE_ATTR(flash_block_size, 0444, c2port_show_flash_block_size, NULL); - - static ssize_t c2port_show_flash_size(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -338,18 +341,18 @@ static ssize_t c2port_show_flash_size(st - - return sprintf(buf, "%d\n", ops->blocks_num * ops->block_size); - } -+static DEVICE_ATTR(flash_size, 0444, c2port_show_flash_size, NULL); - --static ssize_t c2port_show_access(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t access_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct c2port_device *c2dev = dev_get_drvdata(dev); - - return sprintf(buf, "%d\n", c2dev->access); - } - --static ssize_t c2port_store_access(struct device *dev, -- struct device_attribute *attr, -- const char *buf, size_t count) -+static ssize_t access_store(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) - { - struct c2port_device *c2dev = dev_get_drvdata(dev); - struct c2port_ops *ops = c2dev->ops; -@@ -375,6 +378,7 @@ static ssize_t c2port_store_access(struc - - return count; - } -+static DEVICE_ATTR_RW(access); - - static ssize_t c2port_store_reset(struct device *dev, - struct device_attribute *attr, -@@ -395,6 +399,7 @@ static ssize_t c2port_store_reset(struct - - return count; - } -+static DEVICE_ATTR(reset, 0200, NULL, c2port_store_reset); - - static ssize_t __c2port_show_dev_id(struct c2port_device *dev, char *buf) - { -@@ -431,6 +436,7 @@ static ssize_t c2port_show_dev_id(struct - - return ret; - } -+static DEVICE_ATTR(dev_id, 0444, c2port_show_dev_id, NULL); - - static ssize_t __c2port_show_rev_id(struct c2port_device *dev, char *buf) - { -@@ -467,6 +473,7 @@ static ssize_t c2port_show_rev_id(struct - - return ret; - } -+static DEVICE_ATTR(rev_id, 0444, c2port_show_rev_id, NULL); - - static ssize_t c2port_show_flash_access(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -536,6 +543,8 @@ static ssize_t c2port_store_flash_access - - return count; - } -+static DEVICE_ATTR(flash_access, 0644, c2port_show_flash_access, -+ c2port_store_flash_access); - - static ssize_t __c2port_write_flash_erase(struct c2port_device *dev) - { -@@ -616,6 +625,7 @@ static ssize_t c2port_store_flash_erase( - - return count; - } -+static DEVICE_ATTR(flash_erase, 0200, NULL, c2port_store_flash_erase); - - static ssize_t __c2port_read_flash_data(struct c2port_device *dev, - char *buffer, loff_t offset, size_t count) -@@ -850,22 +860,20 @@ static ssize_t c2port_write_flash_data(s - /* - * Class attributes - */ -- --static struct device_attribute c2port_attrs[] = { -- __ATTR(name, 0444, c2port_show_name, NULL), -- __ATTR(flash_blocks_num, 0444, c2port_show_flash_blocks_num, NULL), -- __ATTR(flash_block_size, 0444, c2port_show_flash_block_size, NULL), -- __ATTR(flash_size, 0444, c2port_show_flash_size, NULL), -- __ATTR(access, 0644, c2port_show_access, c2port_store_access), -- __ATTR(reset, 0200, NULL, c2port_store_reset), -- __ATTR(dev_id, 0444, c2port_show_dev_id, NULL), -- __ATTR(rev_id, 0444, c2port_show_rev_id, NULL), -- -- __ATTR(flash_access, 0644, c2port_show_flash_access, -- c2port_store_flash_access), -- __ATTR(flash_erase, 0200, NULL, c2port_store_flash_erase), -- __ATTR_NULL, -+static struct attribute *c2port_attrs[] = { -+ &dev_attr_name.attr, -+ &dev_attr_flash_blocks_num.attr, -+ &dev_attr_flash_block_size.attr, -+ &dev_attr_flash_size.attr, -+ &dev_attr_access.attr, -+ &dev_attr_reset.attr, -+ &dev_attr_dev_id.attr, -+ &dev_attr_rev_id.attr, -+ &dev_attr_flash_access.attr, -+ &dev_attr_flash_erase.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(c2port); - - static struct bin_attribute c2port_bin_attrs[] = { - { -@@ -979,7 +987,7 @@ static int __init c2port_init(void) - printk(KERN_ERR "c2port: failed to allocate class\n"); - return PTR_ERR(c2port_class); - } -- c2port_class->dev_attrs = c2port_attrs; -+ c2port_class->dev_groups = c2port_groups; - c2port_class->dev_bin_attrs = c2port_bin_attrs; - - return 0; ---- a/drivers/misc/enclosure.c -+++ b/drivers/misc/enclosure.c -@@ -239,7 +239,7 @@ static void enclosure_component_release( - put_device(dev->parent); - } - --static const struct attribute_group *enclosure_groups[]; -+static const struct attribute_group *enclosure_component_groups[]; - - /** - * enclosure_component_register - add a particular component to an enclosure -@@ -282,7 +282,7 @@ enclosure_component_register(struct encl - dev_set_name(cdev, "%u", number); - - cdev->release = enclosure_component_release; -- cdev->groups = enclosure_groups; -+ cdev->groups = enclosure_component_groups; - - err = device_register(cdev); - if (err) { -@@ -365,25 +365,26 @@ EXPORT_SYMBOL_GPL(enclosure_remove_devic - * sysfs pieces below - */ - --static ssize_t enclosure_show_components(struct device *cdev, -- struct device_attribute *attr, -- char *buf) -+static ssize_t components_show(struct device *cdev, -+ struct device_attribute *attr, char *buf) - { - struct enclosure_device *edev = to_enclosure_device(cdev); - - return snprintf(buf, 40, "%d\n", edev->components); - } -+static DEVICE_ATTR_RO(components); - --static struct device_attribute enclosure_attrs[] = { -- __ATTR(components, S_IRUGO, enclosure_show_components, NULL), -- __ATTR_NULL -+static struct attribute *enclosure_class_attrs[] = { -+ &dev_attr_components.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(enclosure_class); - - static struct class enclosure_class = { - .name = "enclosure", - .owner = THIS_MODULE, - .dev_release = enclosure_release, -- .dev_attrs = enclosure_attrs, -+ .dev_groups = enclosure_class_groups, - }; - - static const char *const enclosure_status [] = { -@@ -536,15 +537,7 @@ static struct attribute *enclosure_compo - &dev_attr_type.attr, - NULL - }; -- --static struct attribute_group enclosure_group = { -- .attrs = enclosure_component_attrs, --}; -- --static const struct attribute_group *enclosure_groups[] = { -- &enclosure_group, -- NULL --}; -+ATTRIBUTE_GROUPS(enclosure_component); - - static int __init enclosure_init(void) - { ---- a/drivers/pci/pci-sysfs.c -+++ b/drivers/pci/pci-sysfs.c -@@ -131,19 +131,19 @@ static ssize_t pci_bus_show_cpuaffinity( - return ret; - } - --static inline ssize_t pci_bus_show_cpumaskaffinity(struct device *dev, -- struct device_attribute *attr, -- char *buf) -+static ssize_t cpuaffinity_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - return pci_bus_show_cpuaffinity(dev, 0, attr, buf); - } -+static DEVICE_ATTR_RO(cpuaffinity); - --static inline ssize_t pci_bus_show_cpulistaffinity(struct device *dev, -- struct device_attribute *attr, -- char *buf) -+static ssize_t cpulistaffinity_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - return pci_bus_show_cpuaffinity(dev, 1, attr, buf); - } -+static DEVICE_ATTR_RO(cpulistaffinity); - - /* show resources */ - static ssize_t -@@ -379,6 +379,7 @@ dev_bus_rescan_store(struct device *dev, - } - return count; - } -+static DEVICE_ATTR(rescan, (S_IWUSR|S_IWGRP), NULL, dev_bus_rescan_store); - - #if defined(CONFIG_PM_RUNTIME) && defined(CONFIG_ACPI) - static ssize_t d3cold_allowed_store(struct device *dev, -@@ -514,11 +515,20 @@ struct device_attribute pci_dev_attrs[] - __ATTR_NULL, - }; - --struct device_attribute pcibus_dev_attrs[] = { -- __ATTR(rescan, (S_IWUSR|S_IWGRP), NULL, dev_bus_rescan_store), -- __ATTR(cpuaffinity, S_IRUGO, pci_bus_show_cpumaskaffinity, NULL), -- __ATTR(cpulistaffinity, S_IRUGO, pci_bus_show_cpulistaffinity, NULL), -- __ATTR_NULL, -+static struct attribute *pcibus_attrs[] = { -+ &dev_attr_rescan.attr, -+ &dev_attr_cpuaffinity.attr, -+ &dev_attr_cpulistaffinity.attr, -+ NULL, -+}; -+ -+static const struct attribute_group pcibus_group = { -+ .attrs = pcibus_attrs, -+}; -+ -+const struct attribute_group *pcibus_groups[] = { -+ &pcibus_group, -+ NULL, - }; - - static ssize_t ---- a/drivers/pci/pci.h -+++ b/drivers/pci/pci.h -@@ -151,7 +151,7 @@ static inline int pci_no_d1d2(struct pci - - } - extern struct device_attribute pci_dev_attrs[]; --extern struct device_attribute pcibus_dev_attrs[]; -+extern const struct attribute_group *pcibus_groups[]; - extern struct device_type pci_dev_type; - extern struct bus_attribute pci_bus_attrs[]; - ---- a/drivers/pci/probe.c -+++ b/drivers/pci/probe.c -@@ -96,7 +96,7 @@ static void release_pcibus_dev(struct de - static struct class pcibus_class = { - .name = "pci_bus", - .dev_release = &release_pcibus_dev, -- .dev_attrs = pcibus_dev_attrs, -+ .dev_groups = pcibus_groups, - }; - - static int __init pcibus_class_init(void) ---- a/drivers/platform/x86/wmi.c -+++ b/drivers/platform/x86/wmi.c -@@ -693,11 +693,13 @@ static ssize_t modalias_show(struct devi - - return sprintf(buf, "wmi:%s\n", guid_string); - } -+static DEVICE_ATTR_RO(modalias); - --static struct device_attribute wmi_dev_attrs[] = { -- __ATTR_RO(modalias), -- __ATTR_NULL -+static struct attribute *wmi_attrs[] = { -+ &dev_attr_modalias.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(wmi); - - static int wmi_dev_uevent(struct device *dev, struct kobj_uevent_env *env) - { -@@ -732,7 +734,7 @@ static struct class wmi_class = { - .name = "wmi", - .dev_release = wmi_dev_free, - .dev_uevent = wmi_dev_uevent, -- .dev_attrs = wmi_dev_attrs, -+ .dev_groups = wmi_groups, - }; - - static int wmi_create_device(const struct guid_block *gblock, ---- a/drivers/pps/pps.c -+++ b/drivers/pps/pps.c -@@ -406,7 +406,7 @@ static int __init pps_init(void) - pr_err("failed to allocate class\n"); - return PTR_ERR(pps_class); - } -- pps_class->dev_attrs = pps_attrs; -+ pps_class->dev_groups = pps_groups; - - err = alloc_chrdev_region(&pps_devt, 0, PPS_MAX_SOURCES, "pps"); - if (err < 0) { ---- a/drivers/pps/sysfs.c -+++ b/drivers/pps/sysfs.c -@@ -29,8 +29,8 @@ - * Attribute functions - */ - --static ssize_t pps_show_assert(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t assert_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct pps_device *pps = dev_get_drvdata(dev); - -@@ -41,9 +41,10 @@ static ssize_t pps_show_assert(struct de - (long long) pps->assert_tu.sec, pps->assert_tu.nsec, - pps->assert_sequence); - } -+static DEVICE_ATTR_RO(assert); - --static ssize_t pps_show_clear(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t clear_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct pps_device *pps = dev_get_drvdata(dev); - -@@ -54,45 +55,59 @@ static ssize_t pps_show_clear(struct dev - (long long) pps->clear_tu.sec, pps->clear_tu.nsec, - pps->clear_sequence); - } -+static DEVICE_ATTR_RO(clear); - --static ssize_t pps_show_mode(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t mode_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct pps_device *pps = dev_get_drvdata(dev); - - return sprintf(buf, "%4x\n", pps->info.mode); - } -+static DEVICE_ATTR_RO(mode); - --static ssize_t pps_show_echo(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t echo_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct pps_device *pps = dev_get_drvdata(dev); - - return sprintf(buf, "%d\n", !!pps->info.echo); - } -+static DEVICE_ATTR_RO(echo); - --static ssize_t pps_show_name(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t name_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct pps_device *pps = dev_get_drvdata(dev); - - return sprintf(buf, "%s\n", pps->info.name); - } -+static DEVICE_ATTR_RO(name); - --static ssize_t pps_show_path(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t path_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct pps_device *pps = dev_get_drvdata(dev); - - return sprintf(buf, "%s\n", pps->info.path); - } -+static DEVICE_ATTR_RO(path); - --struct device_attribute pps_attrs[] = { -- __ATTR(assert, S_IRUGO, pps_show_assert, NULL), -- __ATTR(clear, S_IRUGO, pps_show_clear, NULL), -- __ATTR(mode, S_IRUGO, pps_show_mode, NULL), -- __ATTR(echo, S_IRUGO, pps_show_echo, NULL), -- __ATTR(name, S_IRUGO, pps_show_name, NULL), -- __ATTR(path, S_IRUGO, pps_show_path, NULL), -- __ATTR_NULL, -+static struct attribute *pps_attrs[] = { -+ &dev_attr_assert.attr, -+ &dev_attr_clear.attr, -+ &dev_attr_mode.attr, -+ &dev_attr_echo.attr, -+ &dev_attr_name.attr, -+ &dev_attr_path.attr, -+ NULL, -+}; -+ -+static const struct attribute_group pps_group = { -+ .attrs = pps_attrs, -+}; -+ -+const struct attribute_group *pps_groups[] = { -+ &pps_group, -+ NULL, - }; ---- a/drivers/ptp/ptp_clock.c -+++ b/drivers/ptp/ptp_clock.c -@@ -330,7 +330,7 @@ static int __init ptp_init(void) - goto no_region; - } - -- ptp_class->dev_attrs = ptp_dev_attrs; -+ ptp_class->dev_groups = ptp_groups; - pr_info("PTP clock support registered\n"); - return 0; - ---- a/drivers/ptp/ptp_private.h -+++ b/drivers/ptp/ptp_private.h -@@ -84,7 +84,7 @@ uint ptp_poll(struct posix_clock *pc, - * see ptp_sysfs.c - */ - --extern struct device_attribute ptp_dev_attrs[]; -+extern const struct attribute_group *ptp_groups[]; - - int ptp_cleanup_sysfs(struct ptp_clock *ptp); - ---- a/drivers/ptp/ptp_sysfs.c -+++ b/drivers/ptp/ptp_sysfs.c -@@ -27,36 +27,43 @@ static ssize_t clock_name_show(struct de - struct ptp_clock *ptp = dev_get_drvdata(dev); - return snprintf(page, PAGE_SIZE-1, "%s\n", ptp->info->name); - } -+static DEVICE_ATTR(clock_name, 0444, clock_name_show, NULL); - --#define PTP_SHOW_INT(name) \ --static ssize_t name##_show(struct device *dev, \ -+#define PTP_SHOW_INT(name, var) \ -+static ssize_t var##_show(struct device *dev, \ - struct device_attribute *attr, char *page) \ - { \ - struct ptp_clock *ptp = dev_get_drvdata(dev); \ -- return snprintf(page, PAGE_SIZE-1, "%d\n", ptp->info->name); \ --} -+ return snprintf(page, PAGE_SIZE-1, "%d\n", ptp->info->var); \ -+} \ -+static DEVICE_ATTR(name, 0444, var##_show, NULL); - --PTP_SHOW_INT(max_adj); --PTP_SHOW_INT(n_alarm); --PTP_SHOW_INT(n_ext_ts); --PTP_SHOW_INT(n_per_out); --PTP_SHOW_INT(pps); -- --#define PTP_RO_ATTR(_var, _name) { \ -- .attr = { .name = __stringify(_name), .mode = 0444 }, \ -- .show = _var##_show, \ --} -+PTP_SHOW_INT(max_adjustment, max_adj); -+PTP_SHOW_INT(n_alarms, n_alarm); -+PTP_SHOW_INT(n_external_timestamps, n_ext_ts); -+PTP_SHOW_INT(n_periodic_outputs, n_per_out); -+PTP_SHOW_INT(pps_available, pps); -+ -+static struct attribute *ptp_attrs[] = { -+ &dev_attr_clock_name.attr, -+ &dev_attr_max_adjustment.attr, -+ &dev_attr_n_alarms.attr, -+ &dev_attr_n_external_timestamps.attr, -+ &dev_attr_n_periodic_outputs.attr, -+ &dev_attr_pps_available.attr, -+ NULL, -+}; - --struct device_attribute ptp_dev_attrs[] = { -- PTP_RO_ATTR(clock_name, clock_name), -- PTP_RO_ATTR(max_adj, max_adjustment), -- PTP_RO_ATTR(n_alarm, n_alarms), -- PTP_RO_ATTR(n_ext_ts, n_external_timestamps), -- PTP_RO_ATTR(n_per_out, n_periodic_outputs), -- PTP_RO_ATTR(pps, pps_available), -- __ATTR_NULL, -+static const struct attribute_group ptp_group = { -+ .attrs = ptp_attrs, - }; - -+const struct attribute_group *ptp_groups[] = { -+ &ptp_group, -+ NULL, -+}; -+ -+ - static ssize_t extts_enable_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) ---- a/drivers/regulator/core.c -+++ b/drivers/regulator/core.c -@@ -323,13 +323,14 @@ static ssize_t regulator_uA_show(struct - } - static DEVICE_ATTR(microamps, 0444, regulator_uA_show, NULL); - --static ssize_t regulator_name_show(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t name_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct regulator_dev *rdev = dev_get_drvdata(dev); - - return sprintf(buf, "%s\n", rdev_get_name(rdev)); - } -+static DEVICE_ATTR_RO(name); - - static ssize_t regulator_print_opmode(char *buf, int mode) - { -@@ -489,15 +490,16 @@ static ssize_t regulator_total_uA_show(s - } - static DEVICE_ATTR(requested_microamps, 0444, regulator_total_uA_show, NULL); - --static ssize_t regulator_num_users_show(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t num_users_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct regulator_dev *rdev = dev_get_drvdata(dev); - return sprintf(buf, "%d\n", rdev->use_count); - } -+static DEVICE_ATTR_RO(num_users); - --static ssize_t regulator_type_show(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t type_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct regulator_dev *rdev = dev_get_drvdata(dev); - -@@ -509,6 +511,7 @@ static ssize_t regulator_type_show(struc - } - return sprintf(buf, "unknown\n"); - } -+static DEVICE_ATTR_RO(type); - - static ssize_t regulator_suspend_mem_uV_show(struct device *dev, - struct device_attribute *attr, char *buf) -@@ -632,12 +635,13 @@ static DEVICE_ATTR(bypass, 0444, - * These are the only attributes are present for all regulators. - * Other attributes are a function of regulator functionality. - */ --static struct device_attribute regulator_dev_attrs[] = { -- __ATTR(name, 0444, regulator_name_show, NULL), -- __ATTR(num_users, 0444, regulator_num_users_show, NULL), -- __ATTR(type, 0444, regulator_type_show, NULL), -- __ATTR_NULL, -+static struct attribute *regulator_dev_attrs[] = { -+ &dev_attr_name.attr, -+ &dev_attr_num_users.attr, -+ &dev_attr_type.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(regulator_dev); - - static void regulator_dev_release(struct device *dev) - { -@@ -648,7 +652,7 @@ static void regulator_dev_release(struct - static struct class regulator_class = { - .name = "regulator", - .dev_release = regulator_dev_release, -- .dev_attrs = regulator_dev_attrs, -+ .dev_groups = regulator_dev_groups, - }; - - /* Calculate the new optimum regulator operating mode based on the new total ---- a/drivers/rtc/rtc-sysfs.c -+++ b/drivers/rtc/rtc-sysfs.c -@@ -25,15 +25,14 @@ - */ - - static ssize_t --rtc_sysfs_show_name(struct device *dev, struct device_attribute *attr, -- char *buf) -+name_show(struct device *dev, struct device_attribute *attr, char *buf) - { - return sprintf(buf, "%s\n", to_rtc_device(dev)->name); - } -+static DEVICE_ATTR_RO(name); - - static ssize_t --rtc_sysfs_show_date(struct device *dev, struct device_attribute *attr, -- char *buf) -+date_show(struct device *dev, struct device_attribute *attr, char *buf) - { - ssize_t retval; - struct rtc_time tm; -@@ -46,10 +45,10 @@ rtc_sysfs_show_date(struct device *dev, - - return retval; - } -+static DEVICE_ATTR_RO(date); - - static ssize_t --rtc_sysfs_show_time(struct device *dev, struct device_attribute *attr, -- char *buf) -+time_show(struct device *dev, struct device_attribute *attr, char *buf) - { - ssize_t retval; - struct rtc_time tm; -@@ -62,10 +61,10 @@ rtc_sysfs_show_time(struct device *dev, - - return retval; - } -+static DEVICE_ATTR_RO(time); - - static ssize_t --rtc_sysfs_show_since_epoch(struct device *dev, struct device_attribute *attr, -- char *buf) -+since_epoch_show(struct device *dev, struct device_attribute *attr, char *buf) - { - ssize_t retval; - struct rtc_time tm; -@@ -79,16 +78,16 @@ rtc_sysfs_show_since_epoch(struct device - - return retval; - } -+static DEVICE_ATTR_RO(since_epoch); - - static ssize_t --rtc_sysfs_show_max_user_freq(struct device *dev, struct device_attribute *attr, -- char *buf) -+max_user_freq_show(struct device *dev, struct device_attribute *attr, char *buf) - { - return sprintf(buf, "%d\n", to_rtc_device(dev)->max_user_freq); - } - - static ssize_t --rtc_sysfs_set_max_user_freq(struct device *dev, struct device_attribute *attr, -+max_user_freq_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t n) - { - struct rtc_device *rtc = to_rtc_device(dev); -@@ -101,6 +100,7 @@ rtc_sysfs_set_max_user_freq(struct devic - - return n; - } -+static DEVICE_ATTR_RW(max_user_freq); - - /** - * rtc_sysfs_show_hctosys - indicate if the given RTC set the system time -@@ -109,8 +109,7 @@ rtc_sysfs_set_max_user_freq(struct devic - * boot or resume event. - */ - static ssize_t --rtc_sysfs_show_hctosys(struct device *dev, struct device_attribute *attr, -- char *buf) -+hctosys_show(struct device *dev, struct device_attribute *attr, char *buf) - { - #ifdef CONFIG_RTC_HCTOSYS_DEVICE - if (rtc_hctosys_ret == 0 && -@@ -121,17 +120,18 @@ rtc_sysfs_show_hctosys(struct device *de - #endif - return sprintf(buf, "0\n"); - } -+static DEVICE_ATTR_RO(hctosys); - --static struct device_attribute rtc_attrs[] = { -- __ATTR(name, S_IRUGO, rtc_sysfs_show_name, NULL), -- __ATTR(date, S_IRUGO, rtc_sysfs_show_date, NULL), -- __ATTR(time, S_IRUGO, rtc_sysfs_show_time, NULL), -- __ATTR(since_epoch, S_IRUGO, rtc_sysfs_show_since_epoch, NULL), -- __ATTR(max_user_freq, S_IRUGO | S_IWUSR, rtc_sysfs_show_max_user_freq, -- rtc_sysfs_set_max_user_freq), -- __ATTR(hctosys, S_IRUGO, rtc_sysfs_show_hctosys, NULL), -- { }, -+static struct attribute *rtc_attrs[] = { -+ &dev_attr_name.attr, -+ &dev_attr_date.attr, -+ &dev_attr_time.attr, -+ &dev_attr_since_epoch.attr, -+ &dev_attr_max_user_freq.attr, -+ &dev_attr_hctosys.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(rtc); - - static ssize_t - rtc_sysfs_show_wakealarm(struct device *dev, struct device_attribute *attr, -@@ -261,5 +261,5 @@ void rtc_sysfs_del_device(struct rtc_dev - - void __init rtc_sysfs_init(struct class *rtc_class) - { -- rtc_class->dev_attrs = rtc_attrs; -+ rtc_class->dev_groups = rtc_groups; - } ---- a/drivers/scsi/osd/osd_uld.c -+++ b/drivers/scsi/osd/osd_uld.c -@@ -107,6 +107,7 @@ static ssize_t osdname_show(struct devic - class_dev); - return sprintf(buf, "%s\n", ould->odi.osdname); - } -+static DEVICE_ATTR_RO(osdname); - - static ssize_t systemid_show(struct device *dev, struct device_attribute *attr, - char *buf) -@@ -117,17 +118,19 @@ static ssize_t systemid_show(struct devi - memcpy(buf, ould->odi.systemid, ould->odi.systemid_len); - return ould->odi.systemid_len; - } -+static DEVICE_ATTR_RO(systemid); - --static struct device_attribute osd_uld_attrs[] = { -- __ATTR(osdname, S_IRUGO, osdname_show, NULL), -- __ATTR(systemid, S_IRUGO, systemid_show, NULL), -- __ATTR_NULL, -+static struct attribute *osd_uld_attrs[] = { -+ &dev_attr_osdname.attr, -+ &dev_attr_systemid.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(osd_uld); - - static struct class osd_uld_class = { - .owner = THIS_MODULE, - .name = "scsi_osd", -- .dev_attrs = osd_uld_attrs, -+ .dev_groups = osd_uld_groups, - }; - - /* ---- a/drivers/scsi/sd.c -+++ b/drivers/scsi/sd.c -@@ -132,8 +132,8 @@ static const char *sd_cache_types[] = { - }; - - static ssize_t --sd_store_cache_type(struct device *dev, struct device_attribute *attr, -- const char *buf, size_t count) -+cache_type_store(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) - { - int i, ct = -1, rcd, wce, sp; - struct scsi_disk *sdkp = to_scsi_disk(dev); -@@ -199,8 +199,18 @@ sd_store_cache_type(struct device *dev, - } - - static ssize_t --sd_store_manage_start_stop(struct device *dev, struct device_attribute *attr, -- const char *buf, size_t count) -+manage_start_stop_show(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct scsi_disk *sdkp = to_scsi_disk(dev); -+ struct scsi_device *sdp = sdkp->device; -+ -+ return snprintf(buf, 20, "%u\n", sdp->manage_start_stop); -+} -+ -+static ssize_t -+manage_start_stop_store(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) - { - struct scsi_disk *sdkp = to_scsi_disk(dev); - struct scsi_device *sdp = sdkp->device; -@@ -212,10 +222,19 @@ sd_store_manage_start_stop(struct device - - return count; - } -+static DEVICE_ATTR_RW(manage_start_stop); -+ -+static ssize_t -+allow_restart_show(struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ struct scsi_disk *sdkp = to_scsi_disk(dev); -+ -+ return snprintf(buf, 40, "%d\n", sdkp->device->allow_restart); -+} - - static ssize_t --sd_store_allow_restart(struct device *dev, struct device_attribute *attr, -- const char *buf, size_t count) -+allow_restart_store(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) - { - struct scsi_disk *sdkp = to_scsi_disk(dev); - struct scsi_device *sdp = sdkp->device; -@@ -230,47 +249,30 @@ sd_store_allow_restart(struct device *de - - return count; - } -+static DEVICE_ATTR_RW(allow_restart); - - static ssize_t --sd_show_cache_type(struct device *dev, struct device_attribute *attr, -- char *buf) -+cache_type_show(struct device *dev, struct device_attribute *attr, char *buf) - { - struct scsi_disk *sdkp = to_scsi_disk(dev); - int ct = sdkp->RCD + 2*sdkp->WCE; - - return snprintf(buf, 40, "%s\n", sd_cache_types[ct]); - } -+static DEVICE_ATTR_RW(cache_type); - - static ssize_t --sd_show_fua(struct device *dev, struct device_attribute *attr, char *buf) -+FUA_show(struct device *dev, struct device_attribute *attr, char *buf) - { - struct scsi_disk *sdkp = to_scsi_disk(dev); - - return snprintf(buf, 20, "%u\n", sdkp->DPOFUA); - } -+static DEVICE_ATTR_RO(FUA); - - static ssize_t --sd_show_manage_start_stop(struct device *dev, struct device_attribute *attr, -- char *buf) --{ -- struct scsi_disk *sdkp = to_scsi_disk(dev); -- struct scsi_device *sdp = sdkp->device; -- -- return snprintf(buf, 20, "%u\n", sdp->manage_start_stop); --} -- --static ssize_t --sd_show_allow_restart(struct device *dev, struct device_attribute *attr, -- char *buf) --{ -- struct scsi_disk *sdkp = to_scsi_disk(dev); -- -- return snprintf(buf, 40, "%d\n", sdkp->device->allow_restart); --} -- --static ssize_t --sd_show_protection_type(struct device *dev, struct device_attribute *attr, -- char *buf) -+protection_type_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct scsi_disk *sdkp = to_scsi_disk(dev); - -@@ -278,8 +280,8 @@ sd_show_protection_type(struct device *d - } - - static ssize_t --sd_store_protection_type(struct device *dev, struct device_attribute *attr, -- const char *buf, size_t count) -+protection_type_store(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) - { - struct scsi_disk *sdkp = to_scsi_disk(dev); - unsigned int val; -@@ -298,10 +300,11 @@ sd_store_protection_type(struct device * - - return count; - } -+static DEVICE_ATTR_RW(protection_type); - - static ssize_t --sd_show_protection_mode(struct device *dev, struct device_attribute *attr, -- char *buf) -+protection_mode_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct scsi_disk *sdkp = to_scsi_disk(dev); - struct scsi_device *sdp = sdkp->device; -@@ -320,24 +323,26 @@ sd_show_protection_mode(struct device *d - - return snprintf(buf, 20, "%s%u\n", dix ? "dix" : "dif", dif); - } -+static DEVICE_ATTR_RO(protection_mode); - - static ssize_t --sd_show_app_tag_own(struct device *dev, struct device_attribute *attr, -- char *buf) -+app_tag_own_show(struct device *dev, struct device_attribute *attr, char *buf) - { - struct scsi_disk *sdkp = to_scsi_disk(dev); - - return snprintf(buf, 20, "%u\n", sdkp->ATO); - } -+static DEVICE_ATTR_RO(app_tag_own); - - static ssize_t --sd_show_thin_provisioning(struct device *dev, struct device_attribute *attr, -- char *buf) -+thin_provisioning_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct scsi_disk *sdkp = to_scsi_disk(dev); - - return snprintf(buf, 20, "%u\n", sdkp->lbpme); - } -+static DEVICE_ATTR_RO(thin_provisioning); - - static const char *lbp_mode[] = { - [SD_LBP_FULL] = "full", -@@ -349,8 +354,8 @@ static const char *lbp_mode[] = { - }; - - static ssize_t --sd_show_provisioning_mode(struct device *dev, struct device_attribute *attr, -- char *buf) -+provisioning_mode_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct scsi_disk *sdkp = to_scsi_disk(dev); - -@@ -358,8 +363,8 @@ sd_show_provisioning_mode(struct device - } - - static ssize_t --sd_store_provisioning_mode(struct device *dev, struct device_attribute *attr, -- const char *buf, size_t count) -+provisioning_mode_store(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) - { - struct scsi_disk *sdkp = to_scsi_disk(dev); - struct scsi_device *sdp = sdkp->device; -@@ -385,10 +390,11 @@ sd_store_provisioning_mode(struct device - - return count; - } -+static DEVICE_ATTR_RW(provisioning_mode); - - static ssize_t --sd_show_max_medium_access_timeouts(struct device *dev, -- struct device_attribute *attr, char *buf) -+max_medium_access_timeouts_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - struct scsi_disk *sdkp = to_scsi_disk(dev); - -@@ -396,9 +402,9 @@ sd_show_max_medium_access_timeouts(struc - } - - static ssize_t --sd_store_max_medium_access_timeouts(struct device *dev, -- struct device_attribute *attr, -- const char *buf, size_t count) -+max_medium_access_timeouts_store(struct device *dev, -+ struct device_attribute *attr, const char *buf, -+ size_t count) - { - struct scsi_disk *sdkp = to_scsi_disk(dev); - int err; -@@ -410,10 +416,11 @@ sd_store_max_medium_access_timeouts(stru - - return err ? err : count; - } -+static DEVICE_ATTR_RW(max_medium_access_timeouts); - - static ssize_t --sd_show_write_same_blocks(struct device *dev, struct device_attribute *attr, -- char *buf) -+max_write_same_blocks_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct scsi_disk *sdkp = to_scsi_disk(dev); - -@@ -421,8 +428,8 @@ sd_show_write_same_blocks(struct device - } - - static ssize_t --sd_store_write_same_blocks(struct device *dev, struct device_attribute *attr, -- const char *buf, size_t count) -+max_write_same_blocks_store(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) - { - struct scsi_disk *sdkp = to_scsi_disk(dev); - struct scsi_device *sdp = sdkp->device; -@@ -451,35 +458,29 @@ sd_store_write_same_blocks(struct device - - return count; - } -+static DEVICE_ATTR_RW(max_write_same_blocks); - --static struct device_attribute sd_disk_attrs[] = { -- __ATTR(cache_type, S_IRUGO|S_IWUSR, sd_show_cache_type, -- sd_store_cache_type), -- __ATTR(FUA, S_IRUGO, sd_show_fua, NULL), -- __ATTR(allow_restart, S_IRUGO|S_IWUSR, sd_show_allow_restart, -- sd_store_allow_restart), -- __ATTR(manage_start_stop, S_IRUGO|S_IWUSR, sd_show_manage_start_stop, -- sd_store_manage_start_stop), -- __ATTR(protection_type, S_IRUGO|S_IWUSR, sd_show_protection_type, -- sd_store_protection_type), -- __ATTR(protection_mode, S_IRUGO, sd_show_protection_mode, NULL), -- __ATTR(app_tag_own, S_IRUGO, sd_show_app_tag_own, NULL), -- __ATTR(thin_provisioning, S_IRUGO, sd_show_thin_provisioning, NULL), -- __ATTR(provisioning_mode, S_IRUGO|S_IWUSR, sd_show_provisioning_mode, -- sd_store_provisioning_mode), -- __ATTR(max_write_same_blocks, S_IRUGO|S_IWUSR, -- sd_show_write_same_blocks, sd_store_write_same_blocks), -- __ATTR(max_medium_access_timeouts, S_IRUGO|S_IWUSR, -- sd_show_max_medium_access_timeouts, -- sd_store_max_medium_access_timeouts), -- __ATTR_NULL, -+static struct attribute *sd_disk_attrs[] = { -+ &dev_attr_cache_type.attr, -+ &dev_attr_FUA.attr, -+ &dev_attr_allow_restart.attr, -+ &dev_attr_manage_start_stop.attr, -+ &dev_attr_protection_type.attr, -+ &dev_attr_protection_mode.attr, -+ &dev_attr_app_tag_own.attr, -+ &dev_attr_thin_provisioning.attr, -+ &dev_attr_provisioning_mode.attr, -+ &dev_attr_max_write_same_blocks.attr, -+ &dev_attr_max_medium_access_timeouts.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(sd_disk); - - static struct class sd_disk_class = { - .name = "scsi_disk", - .owner = THIS_MODULE, - .dev_release = scsi_disk_release, -- .dev_attrs = sd_disk_attrs, -+ .dev_groups = sd_disk_groups, - }; - - static const struct dev_pm_ops sd_pm_ops = { ---- a/drivers/scsi/st.c -+++ b/drivers/scsi/st.c -@@ -82,7 +82,7 @@ static int try_rdio = 1; - static int try_wdio = 1; - - static struct class st_sysfs_class; --static struct device_attribute st_dev_attrs[]; -+static const struct attribute_group *st_dev_groups[]; - - MODULE_AUTHOR("Kai Makisara"); - MODULE_DESCRIPTION("SCSI tape (st) driver"); -@@ -4274,7 +4274,7 @@ static void scsi_tape_release(struct kre - - static struct class st_sysfs_class = { - .name = "scsi_tape", -- .dev_attrs = st_dev_attrs, -+ .dev_groups = st_dev_groups, - }; - - static int __init init_st(void) -@@ -4408,6 +4408,7 @@ defined_show(struct device *dev, struct - l = snprintf(buf, PAGE_SIZE, "%d\n", STm->defined); - return l; - } -+static DEVICE_ATTR_RO(defined); - - static ssize_t - default_blksize_show(struct device *dev, struct device_attribute *attr, -@@ -4419,7 +4420,7 @@ default_blksize_show(struct device *dev, - l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_blksize); - return l; - } -- -+static DEVICE_ATTR_RO(default_blksize); - - static ssize_t - default_density_show(struct device *dev, struct device_attribute *attr, -@@ -4433,6 +4434,7 @@ default_density_show(struct device *dev, - l = snprintf(buf, PAGE_SIZE, fmt, STm->default_density); - return l; - } -+static DEVICE_ATTR_RO(default_density); - - static ssize_t - default_compression_show(struct device *dev, struct device_attribute *attr, -@@ -4444,6 +4446,7 @@ default_compression_show(struct device * - l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_compression - 1); - return l; - } -+static DEVICE_ATTR_RO(default_compression); - - static ssize_t - options_show(struct device *dev, struct device_attribute *attr, char *buf) -@@ -4472,15 +4475,17 @@ options_show(struct device *dev, struct - l = snprintf(buf, PAGE_SIZE, "0x%08x\n", options); - return l; - } -+static DEVICE_ATTR_RO(options); - --static struct device_attribute st_dev_attrs[] = { -- __ATTR_RO(defined), -- __ATTR_RO(default_blksize), -- __ATTR_RO(default_density), -- __ATTR_RO(default_compression), -- __ATTR_RO(options), -- __ATTR_NULL, -+static struct attribute *st_dev_attrs[] = { -+ &dev_attr_defined.attr, -+ &dev_attr_default_blksize.attr, -+ &dev_attr_default_density.attr, -+ &dev_attr_default_compression.attr, -+ &dev_attr_options.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(st_dev); - - /* The following functions may be useful for a larger audience. */ - static int sgl_map_user_pages(struct st_buffer *STbp, ---- a/drivers/staging/comedi/comedi_fops.c -+++ b/drivers/staging/comedi/comedi_fops.c -@@ -262,7 +262,7 @@ static int resize_async_buffer(struct co - - /* sysfs attribute files */ - --static ssize_t show_max_read_buffer_kb(struct device *csdev, -+static ssize_t max_read_buffer_kb_show(struct device *csdev, - struct device_attribute *attr, char *buf) - { - unsigned int minor = MINOR(csdev->devt); -@@ -283,7 +283,7 @@ static ssize_t show_max_read_buffer_kb(s - return snprintf(buf, PAGE_SIZE, "%i\n", size); - } - --static ssize_t store_max_read_buffer_kb(struct device *csdev, -+static ssize_t max_read_buffer_kb_store(struct device *csdev, - struct device_attribute *attr, - const char *buf, size_t count) - { -@@ -314,8 +314,9 @@ static ssize_t store_max_read_buffer_kb( - - return err ? err : count; - } -+static DEVICE_ATTR_RW(max_read_buffer_kb); - --static ssize_t show_read_buffer_kb(struct device *csdev, -+static ssize_t read_buffer_kb_show(struct device *csdev, - struct device_attribute *attr, char *buf) - { - unsigned int minor = MINOR(csdev->devt); -@@ -336,7 +337,7 @@ static ssize_t show_read_buffer_kb(struc - return snprintf(buf, PAGE_SIZE, "%i\n", size); - } - --static ssize_t store_read_buffer_kb(struct device *csdev, -+static ssize_t read_buffer_kb_store(struct device *csdev, - struct device_attribute *attr, - const char *buf, size_t count) - { -@@ -367,8 +368,9 @@ static ssize_t store_read_buffer_kb(stru - - return err ? err : count; - } -+static DEVICE_ATTR_RW(read_buffer_kb); - --static ssize_t show_max_write_buffer_kb(struct device *csdev, -+static ssize_t max_write_buffer_kb_show(struct device *csdev, - struct device_attribute *attr, - char *buf) - { -@@ -390,7 +392,7 @@ static ssize_t show_max_write_buffer_kb( - return snprintf(buf, PAGE_SIZE, "%i\n", size); - } - --static ssize_t store_max_write_buffer_kb(struct device *csdev, -+static ssize_t max_write_buffer_kb_store(struct device *csdev, - struct device_attribute *attr, - const char *buf, size_t count) - { -@@ -421,8 +423,9 @@ static ssize_t store_max_write_buffer_kb - - return err ? err : count; - } -+static DEVICE_ATTR_RW(max_write_buffer_kb); - --static ssize_t show_write_buffer_kb(struct device *csdev, -+static ssize_t write_buffer_kb_show(struct device *csdev, - struct device_attribute *attr, char *buf) - { - unsigned int minor = MINOR(csdev->devt); -@@ -443,7 +446,7 @@ static ssize_t show_write_buffer_kb(stru - return snprintf(buf, PAGE_SIZE, "%i\n", size); - } - --static ssize_t store_write_buffer_kb(struct device *csdev, -+static ssize_t write_buffer_kb_store(struct device *csdev, - struct device_attribute *attr, - const char *buf, size_t count) - { -@@ -474,18 +477,16 @@ static ssize_t store_write_buffer_kb(str - - return err ? err : count; - } -+static DEVICE_ATTR_RW(write_buffer_kb); - --static struct device_attribute comedi_dev_attrs[] = { -- __ATTR(max_read_buffer_kb, S_IRUGO | S_IWUSR, -- show_max_read_buffer_kb, store_max_read_buffer_kb), -- __ATTR(read_buffer_kb, S_IRUGO | S_IWUSR | S_IWGRP, -- show_read_buffer_kb, store_read_buffer_kb), -- __ATTR(max_write_buffer_kb, S_IRUGO | S_IWUSR, -- show_max_write_buffer_kb, store_max_write_buffer_kb), -- __ATTR(write_buffer_kb, S_IRUGO | S_IWUSR | S_IWGRP, -- show_write_buffer_kb, store_write_buffer_kb), -- __ATTR_NULL -+static struct attribute *comedi_dev_attrs[] = { -+ &dev_attr_max_read_buffer_kb.attr, -+ &dev_attr_read_buffer_kb.attr, -+ &dev_attr_max_write_buffer_kb.attr, -+ &dev_attr_write_buffer_kb.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(comedi_dev); - - static void comedi_set_subdevice_runflags(struct comedi_subdevice *s, - unsigned mask, unsigned bits) -@@ -2554,7 +2555,7 @@ static int __init comedi_init(void) - return PTR_ERR(comedi_class); - } - -- comedi_class->dev_attrs = comedi_dev_attrs; -+ comedi_class->dev_groups = comedi_dev_groups; - - /* XXX requires /proc interface */ - comedi_proc_init(); --- a/drivers/uio/uio.c +++ b/drivers/uio/uio.c @@ -224,38 +224,42 @@ static struct kobj_type portio_attr_type @@ -2319,949 +56,3 @@ Subject: meta-patch of all of the dev_attr conversions }; /* ---- a/drivers/video/backlight/backlight.c -+++ b/drivers/video/backlight/backlight.c -@@ -103,16 +103,16 @@ static void backlight_generate_event(str - sysfs_notify(&bd->dev.kobj, NULL, "actual_brightness"); - } - --static ssize_t backlight_show_power(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t bl_power_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct backlight_device *bd = to_backlight_device(dev); - - return sprintf(buf, "%d\n", bd->props.power); - } - --static ssize_t backlight_store_power(struct device *dev, -- struct device_attribute *attr, const char *buf, size_t count) -+static ssize_t bl_power_store(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) - { - int rc; - struct backlight_device *bd = to_backlight_device(dev); -@@ -136,8 +136,9 @@ static ssize_t backlight_store_power(str - - return rc; - } -+static DEVICE_ATTR_RW(bl_power); - --static ssize_t backlight_show_brightness(struct device *dev, -+static ssize_t brightness_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - struct backlight_device *bd = to_backlight_device(dev); -@@ -145,7 +146,7 @@ static ssize_t backlight_show_brightness - return sprintf(buf, "%d\n", bd->props.brightness); - } - --static ssize_t backlight_store_brightness(struct device *dev, -+static ssize_t brightness_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) - { - int rc; -@@ -175,24 +176,27 @@ static ssize_t backlight_store_brightnes - - return rc; - } -+static DEVICE_ATTR_RW(brightness); - --static ssize_t backlight_show_type(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t type_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct backlight_device *bd = to_backlight_device(dev); - - return sprintf(buf, "%s\n", backlight_types[bd->props.type]); - } -+static DEVICE_ATTR_RO(type); - --static ssize_t backlight_show_max_brightness(struct device *dev, -+static ssize_t max_brightness_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - struct backlight_device *bd = to_backlight_device(dev); - - return sprintf(buf, "%d\n", bd->props.max_brightness); - } -+static DEVICE_ATTR_RO(max_brightness); - --static ssize_t backlight_show_actual_brightness(struct device *dev, -+static ssize_t actual_brightness_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - int rc = -ENXIO; -@@ -205,6 +209,7 @@ static ssize_t backlight_show_actual_bri - - return rc; - } -+static DEVICE_ATTR_RO(actual_brightness); - - static struct class *backlight_class; - -@@ -247,16 +252,15 @@ static void bl_device_release(struct dev - kfree(bd); - } - --static struct device_attribute bl_device_attributes[] = { -- __ATTR(bl_power, 0644, backlight_show_power, backlight_store_power), -- __ATTR(brightness, 0644, backlight_show_brightness, -- backlight_store_brightness), -- __ATTR(actual_brightness, 0444, backlight_show_actual_brightness, -- NULL), -- __ATTR(max_brightness, 0444, backlight_show_max_brightness, NULL), -- __ATTR(type, 0444, backlight_show_type, NULL), -- __ATTR_NULL, -+static struct attribute *bl_device_attrs[] = { -+ &dev_attr_bl_power.attr, -+ &dev_attr_brightness.attr, -+ &dev_attr_actual_brightness.attr, -+ &dev_attr_max_brightness.attr, -+ &dev_attr_type.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(bl_device); - - /** - * backlight_force_update - tell the backlight subsystem that hardware state -@@ -493,7 +497,7 @@ static int __init backlight_class_init(v - return PTR_ERR(backlight_class); - } - -- backlight_class->dev_attrs = bl_device_attributes; -+ backlight_class->dev_groups = bl_device_groups; - backlight_class->pm = &backlight_class_dev_pm_ops; - return 0; - } ---- a/drivers/video/backlight/lcd.c -+++ b/drivers/video/backlight/lcd.c -@@ -89,7 +89,7 @@ static inline void lcd_unregister_fb(str - } - #endif /* CONFIG_FB */ - --static ssize_t lcd_show_power(struct device *dev, struct device_attribute *attr, -+static ssize_t lcd_power_show(struct device *dev, struct device_attribute *attr, - char *buf) - { - int rc; -@@ -105,7 +105,7 @@ static ssize_t lcd_show_power(struct dev - return rc; - } - --static ssize_t lcd_store_power(struct device *dev, -+static ssize_t lcd_power_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) - { - int rc; -@@ -128,8 +128,9 @@ static ssize_t lcd_store_power(struct de - - return rc; - } -+static DEVICE_ATTR_RW(lcd_power); - --static ssize_t lcd_show_contrast(struct device *dev, -+static ssize_t contrast_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - int rc = -ENXIO; -@@ -143,7 +144,7 @@ static ssize_t lcd_show_contrast(struct - return rc; - } - --static ssize_t lcd_store_contrast(struct device *dev, -+static ssize_t contrast_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) - { - int rc; -@@ -166,14 +167,16 @@ static ssize_t lcd_store_contrast(struct - - return rc; - } -+static DEVICE_ATTR_RW(contrast); - --static ssize_t lcd_show_max_contrast(struct device *dev, -+static ssize_t max_contrast_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - struct lcd_device *ld = to_lcd_device(dev); - - return sprintf(buf, "%d\n", ld->props.max_contrast); - } -+static DEVICE_ATTR_RO(max_contrast); - - static struct class *lcd_class; - -@@ -183,12 +186,13 @@ static void lcd_device_release(struct de - kfree(ld); - } - --static struct device_attribute lcd_device_attributes[] = { -- __ATTR(lcd_power, 0644, lcd_show_power, lcd_store_power), -- __ATTR(contrast, 0644, lcd_show_contrast, lcd_store_contrast), -- __ATTR(max_contrast, 0444, lcd_show_max_contrast, NULL), -- __ATTR_NULL, -+static struct attribute *lcd_device_attrs[] = { -+ &dev_attr_lcd_power.attr, -+ &dev_attr_contrast.attr, -+ &dev_attr_max_contrast.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(lcd_device); - - /** - * lcd_device_register - register a new object of lcd_device class. -@@ -344,7 +348,7 @@ static int __init lcd_class_init(void) - return PTR_ERR(lcd_class); - } - -- lcd_class->dev_attrs = lcd_device_attributes; -+ lcd_class->dev_groups = lcd_device_groups; - return 0; - } - ---- a/drivers/video/output.c -+++ b/drivers/video/output.c -@@ -32,8 +32,8 @@ MODULE_DESCRIPTION("Display Output Switc - MODULE_LICENSE("GPL"); - MODULE_AUTHOR("Luming Yu <luming.yu@intel.com>"); - --static ssize_t video_output_show_state(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t state_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - ssize_t ret_size = 0; - struct output_device *od = to_output_device(dev); -@@ -42,9 +42,8 @@ static ssize_t video_output_show_state(s - return ret_size; - } - --static ssize_t video_output_store_state(struct device *dev, -- struct device_attribute *attr, -- const char *buf,size_t count) -+static ssize_t state_store(struct device *dev, struct device_attribute *attr, -+ const char *buf,size_t count) - { - char *endp; - struct output_device *od = to_output_device(dev); -@@ -62,6 +61,7 @@ static ssize_t video_output_store_state( - } - return count; - } -+static DEVICE_ATTR_RW(state); - - static void video_output_release(struct device *dev) - { -@@ -69,16 +69,16 @@ static void video_output_release(struct - kfree(od); - } - --static struct device_attribute video_output_attributes[] = { -- __ATTR(state, 0644, video_output_show_state, video_output_store_state), -- __ATTR_NULL, -+static struct attribute *video_output_attrs[] = { -+ &dev_attr_state.attr, -+ NULL, - }; -- -+ATTRIBUTE_GROUPS(video_output); - - static struct class video_output_class = { - .name = "video_output", - .dev_release = video_output_release, -- .dev_attrs = video_output_attributes, -+ .dev_groups = video_output_groups, - }; - - struct output_device *video_output_register(const char *name, ---- a/fs/fuse/cuse.c -+++ b/fs/fuse/cuse.c -@@ -568,6 +568,7 @@ static ssize_t cuse_class_waiting_show(s - - return sprintf(buf, "%d\n", atomic_read(&cc->fc.num_waiting)); - } -+static DEVICE_ATTR(waiting, S_IFREG | 0400, cuse_class_waiting_show, NULL); - - static ssize_t cuse_class_abort_store(struct device *dev, - struct device_attribute *attr, -@@ -578,12 +579,14 @@ static ssize_t cuse_class_abort_store(st - fuse_abort_conn(&cc->fc); - return count; - } -+static DEVICE_ATTR(abort, S_IFREG | 0200, NULL, cuse_class_abort_store); - --static struct device_attribute cuse_class_dev_attrs[] = { -- __ATTR(waiting, S_IFREG | 0400, cuse_class_waiting_show, NULL), -- __ATTR(abort, S_IFREG | 0200, NULL, cuse_class_abort_store), -- { } -+static struct attribute *cuse_class_dev_attrs[] = { -+ &dev_attr_waiting.attr, -+ &dev_attr_abort.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(cuse_class_dev); - - static struct miscdevice cuse_miscdev = { - .minor = MISC_DYNAMIC_MINOR, -@@ -609,7 +612,7 @@ static int __init cuse_init(void) - if (IS_ERR(cuse_class)) - return PTR_ERR(cuse_class); - -- cuse_class->dev_attrs = cuse_class_dev_attrs; -+ cuse_class->dev_groups = cuse_class_dev_groups; - - rc = misc_register(&cuse_miscdev); - if (rc) { ---- a/include/linux/pps_kernel.h -+++ b/include/linux/pps_kernel.h -@@ -80,7 +80,7 @@ struct pps_device { - * Global variables - */ - --extern struct device_attribute pps_attrs[]; -+extern const struct attribute_group *pps_groups[]; - - /* - * Internal functions. ---- a/mm/backing-dev.c -+++ b/mm/backing-dev.c -@@ -180,7 +180,8 @@ static ssize_t name##_show(struct device - struct backing_dev_info *bdi = dev_get_drvdata(dev); \ - \ - return snprintf(page, PAGE_SIZE-1, "%lld\n", (long long)expr); \ --} -+} \ -+static DEVICE_ATTR_RW(name); - - BDI_SHOW(read_ahead_kb, K(bdi->ra_pages)) - -@@ -231,14 +232,16 @@ static ssize_t stable_pages_required_sho - return snprintf(page, PAGE_SIZE-1, "%d\n", - bdi_cap_stable_pages_required(bdi) ? 1 : 0); - } -+static DEVICE_ATTR_RO(stable_pages_required); - --static struct device_attribute bdi_dev_attrs[] = { -- __ATTR_RW(read_ahead_kb), -- __ATTR_RW(min_ratio), -- __ATTR_RW(max_ratio), -- __ATTR_RO(stable_pages_required), -- __ATTR_NULL, -+static struct attribute *bdi_dev_attrs[] = { -+ &dev_attr_read_ahead_kb.attr, -+ &dev_attr_min_ratio.attr, -+ &dev_attr_max_ratio.attr, -+ &dev_attr_stable_pages_required.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(bdi_dev); - - static __init int bdi_class_init(void) - { -@@ -246,7 +249,7 @@ static __init int bdi_class_init(void) - if (IS_ERR(bdi_class)) - return PTR_ERR(bdi_class); - -- bdi_class->dev_attrs = bdi_dev_attrs; -+ bdi_class->dev_groups = bdi_dev_groups; - bdi_debug_init(); - return 0; - } ---- a/net/core/net-sysfs.c -+++ b/net/core/net-sysfs.c -@@ -60,12 +60,19 @@ static ssize_t format_##field(const stru - { \ - return sprintf(buf, format_string, net->field); \ - } \ --static ssize_t show_##field(struct device *dev, \ -+static ssize_t field##_show(struct device *dev, \ - struct device_attribute *attr, char *buf) \ - { \ - return netdev_show(dev, attr, buf, format_##field); \ --} -+} \ - -+#define NETDEVICE_SHOW_RO(field, format_string) \ -+NETDEVICE_SHOW(field, format_string); \ -+static DEVICE_ATTR_RO(field) -+ -+#define NETDEVICE_SHOW_RW(field, format_string) \ -+NETDEVICE_SHOW(field, format_string); \ -+static DEVICE_ATTR_RW(field) - - /* use same locking and permission rules as SIF* ioctl's */ - static ssize_t netdev_store(struct device *dev, struct device_attribute *attr, -@@ -96,16 +103,16 @@ static ssize_t netdev_store(struct devic - return ret; - } - --NETDEVICE_SHOW(dev_id, fmt_hex); --NETDEVICE_SHOW(addr_assign_type, fmt_dec); --NETDEVICE_SHOW(addr_len, fmt_dec); --NETDEVICE_SHOW(iflink, fmt_dec); --NETDEVICE_SHOW(ifindex, fmt_dec); --NETDEVICE_SHOW(type, fmt_dec); --NETDEVICE_SHOW(link_mode, fmt_dec); -+NETDEVICE_SHOW_RO(dev_id, fmt_hex); -+NETDEVICE_SHOW_RO(addr_assign_type, fmt_dec); -+NETDEVICE_SHOW_RO(addr_len, fmt_dec); -+NETDEVICE_SHOW_RO(iflink, fmt_dec); -+NETDEVICE_SHOW_RO(ifindex, fmt_dec); -+NETDEVICE_SHOW_RO(type, fmt_dec); -+NETDEVICE_SHOW_RO(link_mode, fmt_dec); - - /* use same locking rules as GIFHWADDR ioctl's */ --static ssize_t show_address(struct device *dev, struct device_attribute *attr, -+static ssize_t address_show(struct device *dev, struct device_attribute *attr, - char *buf) - { - struct net_device *net = to_net_dev(dev); -@@ -117,15 +124,17 @@ static ssize_t show_address(struct devic - read_unlock(&dev_base_lock); - return ret; - } -+static DEVICE_ATTR_RO(address); - --static ssize_t show_broadcast(struct device *dev, -- struct device_attribute *attr, char *buf) -+static ssize_t broadcast_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - struct net_device *net = to_net_dev(dev); - if (dev_isalive(net)) - return sysfs_format_mac(buf, net->broadcast, net->addr_len); - return -EINVAL; - } -+static DEVICE_ATTR_RO(broadcast); - - static int change_carrier(struct net_device *net, unsigned long new_carrier) - { -@@ -134,13 +143,13 @@ static int change_carrier(struct net_dev - return dev_change_carrier(net, (bool) new_carrier); - } - --static ssize_t store_carrier(struct device *dev, struct device_attribute *attr, -- const char *buf, size_t len) -+static ssize_t carrier_store(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t len) - { - return netdev_store(dev, attr, buf, len, change_carrier); - } - --static ssize_t show_carrier(struct device *dev, -+static ssize_t carrier_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - struct net_device *netdev = to_net_dev(dev); -@@ -149,8 +158,9 @@ static ssize_t show_carrier(struct devic - } - return -EINVAL; - } -+static DEVICE_ATTR_RW(carrier); - --static ssize_t show_speed(struct device *dev, -+static ssize_t speed_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - struct net_device *netdev = to_net_dev(dev); -@@ -167,8 +177,9 @@ static ssize_t show_speed(struct device - rtnl_unlock(); - return ret; - } -+static DEVICE_ATTR_RO(speed); - --static ssize_t show_duplex(struct device *dev, -+static ssize_t duplex_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - struct net_device *netdev = to_net_dev(dev); -@@ -198,8 +209,9 @@ static ssize_t show_duplex(struct device - rtnl_unlock(); - return ret; - } -+static DEVICE_ATTR_RO(duplex); - --static ssize_t show_dormant(struct device *dev, -+static ssize_t dormant_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - struct net_device *netdev = to_net_dev(dev); -@@ -209,6 +221,7 @@ static ssize_t show_dormant(struct devic - - return -EINVAL; - } -+static DEVICE_ATTR_RO(dormant); - - static const char *const operstates[] = { - "unknown", -@@ -220,7 +233,7 @@ static const char *const operstates[] = - "up" - }; - --static ssize_t show_operstate(struct device *dev, -+static ssize_t operstate_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - const struct net_device *netdev = to_net_dev(dev); -@@ -237,35 +250,33 @@ static ssize_t show_operstate(struct dev - - return sprintf(buf, "%s\n", operstates[operstate]); - } -+static DEVICE_ATTR_RO(operstate); - - /* read-write attributes */ --NETDEVICE_SHOW(mtu, fmt_dec); - - static int change_mtu(struct net_device *net, unsigned long new_mtu) - { - return dev_set_mtu(net, (int) new_mtu); - } - --static ssize_t store_mtu(struct device *dev, struct device_attribute *attr, -+static ssize_t mtu_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t len) - { - return netdev_store(dev, attr, buf, len, change_mtu); - } -- --NETDEVICE_SHOW(flags, fmt_hex); -+NETDEVICE_SHOW_RW(mtu, fmt_dec); - - static int change_flags(struct net_device *net, unsigned long new_flags) - { - return dev_change_flags(net, (unsigned int) new_flags); - } - --static ssize_t store_flags(struct device *dev, struct device_attribute *attr, -+static ssize_t flags_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t len) - { - return netdev_store(dev, attr, buf, len, change_flags); - } -- --NETDEVICE_SHOW(tx_queue_len, fmt_ulong); -+NETDEVICE_SHOW_RW(flags, fmt_hex); - - static int change_tx_queue_len(struct net_device *net, unsigned long new_len) - { -@@ -273,7 +284,7 @@ static int change_tx_queue_len(struct ne - return 0; - } - --static ssize_t store_tx_queue_len(struct device *dev, -+static ssize_t tx_queue_len_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) - { -@@ -282,8 +293,9 @@ static ssize_t store_tx_queue_len(struct - - return netdev_store(dev, attr, buf, len, change_tx_queue_len); - } -+NETDEVICE_SHOW_RW(tx_queue_len, fmt_ulong); - --static ssize_t store_ifalias(struct device *dev, struct device_attribute *attr, -+static ssize_t ifalias_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t len) - { - struct net_device *netdev = to_net_dev(dev); -@@ -306,7 +318,7 @@ static ssize_t store_ifalias(struct devi - return ret < 0 ? ret : len; - } - --static ssize_t show_ifalias(struct device *dev, -+static ssize_t ifalias_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - const struct net_device *netdev = to_net_dev(dev); -@@ -319,8 +331,7 @@ static ssize_t show_ifalias(struct devic - rtnl_unlock(); - return ret; - } -- --NETDEVICE_SHOW(group, fmt_dec); -+static DEVICE_ATTR_RW(ifalias); - - static int change_group(struct net_device *net, unsigned long new_group) - { -@@ -328,35 +339,37 @@ static int change_group(struct net_devic - return 0; - } - --static ssize_t store_group(struct device *dev, struct device_attribute *attr, -- const char *buf, size_t len) -+static ssize_t group_store(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t len) - { - return netdev_store(dev, attr, buf, len, change_group); - } -+NETDEVICE_SHOW(group, fmt_dec); -+static DEVICE_ATTR(netdev_group, S_IRUGO | S_IWUSR, group_show, group_store); - --static struct device_attribute net_class_attributes[] = { -- __ATTR(addr_assign_type, S_IRUGO, show_addr_assign_type, NULL), -- __ATTR(addr_len, S_IRUGO, show_addr_len, NULL), -- __ATTR(dev_id, S_IRUGO, show_dev_id, NULL), -- __ATTR(ifalias, S_IRUGO | S_IWUSR, show_ifalias, store_ifalias), -- __ATTR(iflink, S_IRUGO, show_iflink, NULL), -- __ATTR(ifindex, S_IRUGO, show_ifindex, NULL), -- __ATTR(type, S_IRUGO, show_type, NULL), -- __ATTR(link_mode, S_IRUGO, show_link_mode, NULL), -- __ATTR(address, S_IRUGO, show_address, NULL), -- __ATTR(broadcast, S_IRUGO, show_broadcast, NULL), -- __ATTR(carrier, S_IRUGO | S_IWUSR, show_carrier, store_carrier), -- __ATTR(speed, S_IRUGO, show_speed, NULL), -- __ATTR(duplex, S_IRUGO, show_duplex, NULL), -- __ATTR(dormant, S_IRUGO, show_dormant, NULL), -- __ATTR(operstate, S_IRUGO, show_operstate, NULL), -- __ATTR(mtu, S_IRUGO | S_IWUSR, show_mtu, store_mtu), -- __ATTR(flags, S_IRUGO | S_IWUSR, show_flags, store_flags), -- __ATTR(tx_queue_len, S_IRUGO | S_IWUSR, show_tx_queue_len, -- store_tx_queue_len), -- __ATTR(netdev_group, S_IRUGO | S_IWUSR, show_group, store_group), -- {} -+static struct attribute *net_class_attrs[] = { -+ &dev_attr_netdev_group.attr, -+ &dev_attr_type.attr, -+ &dev_attr_dev_id.attr, -+ &dev_attr_iflink.attr, -+ &dev_attr_ifindex.attr, -+ &dev_attr_addr_assign_type.attr, -+ &dev_attr_addr_len.attr, -+ &dev_attr_link_mode.attr, -+ &dev_attr_address.attr, -+ &dev_attr_broadcast.attr, -+ &dev_attr_speed.attr, -+ &dev_attr_duplex.attr, -+ &dev_attr_dormant.attr, -+ &dev_attr_operstate.attr, -+ &dev_attr_ifalias.attr, -+ &dev_attr_carrier.attr, -+ &dev_attr_mtu.attr, -+ &dev_attr_flags.attr, -+ &dev_attr_tx_queue_len.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(net_class); - - /* Show a given an attribute in the statistics group */ - static ssize_t netstat_show(const struct device *d, -@@ -382,13 +395,13 @@ static ssize_t netstat_show(const struct - - /* generate a read-only statistics attribute */ - #define NETSTAT_ENTRY(name) \ --static ssize_t show_##name(struct device *d, \ -+static ssize_t name##_show(struct device *d, \ - struct device_attribute *attr, char *buf) \ - { \ - return netstat_show(d, attr, buf, \ - offsetof(struct rtnl_link_stats64, name)); \ - } \ --static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL) -+static DEVICE_ATTR_RO(name) - - NETSTAT_ENTRY(rx_packets); - NETSTAT_ENTRY(tx_packets); -@@ -457,6 +470,9 @@ static struct attribute_group wireless_g - .attrs = wireless_attrs, - }; - #endif -+ -+#else /* CONFIG_SYSFS */ -+#define net_class_groups NULL - #endif /* CONFIG_SYSFS */ - - #ifdef CONFIG_RPS -@@ -1229,9 +1245,7 @@ static const void *net_namespace(struct - static struct class net_class = { - .name = "net", - .dev_release = netdev_release, --#ifdef CONFIG_SYSFS -- .dev_attrs = net_class_attributes, --#endif /* CONFIG_SYSFS */ -+ .dev_groups = net_class_groups, - .dev_uevent = netdev_uevent, - .ns_type = &net_ns_type_operations, - .namespace = net_namespace, ---- a/net/ieee802154/wpan-class.c -+++ b/net/ieee802154/wpan-class.c -@@ -36,7 +36,8 @@ static ssize_t name ## _show(struct devi - ret = snprintf(buf, PAGE_SIZE, format_string "\n", args); \ - mutex_unlock(&phy->pib_lock); \ - return ret; \ --} -+} \ -+static DEVICE_ATTR_RO(name); - - #define MASTER_SHOW(field, format_string) \ - MASTER_SHOW_COMPLEX(field, format_string, phy->field) -@@ -66,15 +67,17 @@ static ssize_t channels_supported_show(s - mutex_unlock(&phy->pib_lock); - return len; - } -+static DEVICE_ATTR_RO(channels_supported); - --static struct device_attribute pmib_attrs[] = { -- __ATTR_RO(current_channel), -- __ATTR_RO(current_page), -- __ATTR_RO(channels_supported), -- __ATTR_RO(transmit_power), -- __ATTR_RO(cca_mode), -- {}, -+static struct attribute *pmib_attrs[] = { -+ &dev_attr_current_channel.attr, -+ &dev_attr_current_page.attr, -+ &dev_attr_channels_supported.attr, -+ &dev_attr_transmit_power.attr, -+ &dev_attr_cca_mode.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(pmib); - - static void wpan_phy_release(struct device *d) - { -@@ -85,7 +88,7 @@ static void wpan_phy_release(struct devi - static struct class wpan_phy_class = { - .name = "ieee802154", - .dev_release = wpan_phy_release, -- .dev_attrs = pmib_attrs, -+ .dev_groups = pmib_groups, - }; - - static DEFINE_MUTEX(wpan_phy_mutex); ---- a/net/rfkill/core.c -+++ b/net/rfkill/core.c -@@ -576,14 +576,14 @@ void rfkill_set_states(struct rfkill *rf - } - EXPORT_SYMBOL(rfkill_set_states); - --static ssize_t rfkill_name_show(struct device *dev, -- struct device_attribute *attr, -- char *buf) -+static ssize_t name_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct rfkill *rfkill = to_rfkill(dev); - - return sprintf(buf, "%s\n", rfkill->name); - } -+static DEVICE_ATTR_RO(name); - - static const char *rfkill_get_type_str(enum rfkill_type type) - { -@@ -611,54 +611,52 @@ static const char *rfkill_get_type_str(e - } - } - --static ssize_t rfkill_type_show(struct device *dev, -- struct device_attribute *attr, -- char *buf) -+static ssize_t type_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct rfkill *rfkill = to_rfkill(dev); - - return sprintf(buf, "%s\n", rfkill_get_type_str(rfkill->type)); - } -+static DEVICE_ATTR_RO(type); - --static ssize_t rfkill_idx_show(struct device *dev, -- struct device_attribute *attr, -- char *buf) -+static ssize_t index_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct rfkill *rfkill = to_rfkill(dev); - - return sprintf(buf, "%d\n", rfkill->idx); - } -+static DEVICE_ATTR_RO(index); - --static ssize_t rfkill_persistent_show(struct device *dev, -- struct device_attribute *attr, -- char *buf) -+static ssize_t persistent_show(struct device *dev, -+ struct device_attribute *attr, char *buf) - { - struct rfkill *rfkill = to_rfkill(dev); - - return sprintf(buf, "%d\n", rfkill->persistent); - } -+static DEVICE_ATTR_RO(persistent); - --static ssize_t rfkill_hard_show(struct device *dev, -- struct device_attribute *attr, -- char *buf) -+static ssize_t hard_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct rfkill *rfkill = to_rfkill(dev); - - return sprintf(buf, "%d\n", (rfkill->state & RFKILL_BLOCK_HW) ? 1 : 0 ); - } -+static DEVICE_ATTR_RO(hard); - --static ssize_t rfkill_soft_show(struct device *dev, -- struct device_attribute *attr, -- char *buf) -+static ssize_t soft_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct rfkill *rfkill = to_rfkill(dev); - - return sprintf(buf, "%d\n", (rfkill->state & RFKILL_BLOCK_SW) ? 1 : 0 ); - } - --static ssize_t rfkill_soft_store(struct device *dev, -- struct device_attribute *attr, -- const char *buf, size_t count) -+static ssize_t soft_store(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) - { - struct rfkill *rfkill = to_rfkill(dev); - unsigned long state; -@@ -680,6 +678,7 @@ static ssize_t rfkill_soft_store(struct - - return count; - } -+static DEVICE_ATTR_RW(soft); - - static u8 user_state_from_blocked(unsigned long state) - { -@@ -691,18 +690,16 @@ static u8 user_state_from_blocked(unsign - return RFKILL_USER_STATE_UNBLOCKED; - } - --static ssize_t rfkill_state_show(struct device *dev, -- struct device_attribute *attr, -- char *buf) -+static ssize_t state_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct rfkill *rfkill = to_rfkill(dev); - - return sprintf(buf, "%d\n", user_state_from_blocked(rfkill->state)); - } - --static ssize_t rfkill_state_store(struct device *dev, -- struct device_attribute *attr, -- const char *buf, size_t count) -+static ssize_t state_store(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) - { - struct rfkill *rfkill = to_rfkill(dev); - unsigned long state; -@@ -725,32 +722,27 @@ static ssize_t rfkill_state_store(struct - - return count; - } -+static DEVICE_ATTR_RW(state); - --static ssize_t rfkill_claim_show(struct device *dev, -- struct device_attribute *attr, -- char *buf) -+static ssize_t claim_show(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - return sprintf(buf, "%d\n", 0); - } -+static DEVICE_ATTR_RO(claim); - --static ssize_t rfkill_claim_store(struct device *dev, -- struct device_attribute *attr, -- const char *buf, size_t count) --{ -- return -EOPNOTSUPP; --} -- --static struct device_attribute rfkill_dev_attrs[] = { -- __ATTR(name, S_IRUGO, rfkill_name_show, NULL), -- __ATTR(type, S_IRUGO, rfkill_type_show, NULL), -- __ATTR(index, S_IRUGO, rfkill_idx_show, NULL), -- __ATTR(persistent, S_IRUGO, rfkill_persistent_show, NULL), -- __ATTR(state, S_IRUGO|S_IWUSR, rfkill_state_show, rfkill_state_store), -- __ATTR(claim, S_IRUGO|S_IWUSR, rfkill_claim_show, rfkill_claim_store), -- __ATTR(soft, S_IRUGO|S_IWUSR, rfkill_soft_show, rfkill_soft_store), -- __ATTR(hard, S_IRUGO, rfkill_hard_show, NULL), -- __ATTR_NULL -+static struct attribute *rfkill_dev_attrs[] = { -+ &dev_attr_name.attr, -+ &dev_attr_type.attr, -+ &dev_attr_index.attr, -+ &dev_attr_persistent.attr, -+ &dev_attr_state.attr, -+ &dev_attr_claim.attr, -+ &dev_attr_soft.attr, -+ &dev_attr_hard.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(rfkill_dev); - - static void rfkill_release(struct device *dev) - { -@@ -830,7 +822,7 @@ static int rfkill_resume(struct device * - static struct class rfkill_class = { - .name = "rfkill", - .dev_release = rfkill_release, -- .dev_attrs = rfkill_dev_attrs, -+ .dev_groups = rfkill_dev_groups, - .dev_uevent = rfkill_dev_uevent, - .suspend = rfkill_suspend, - .resume = rfkill_resume, ---- a/net/wireless/sysfs.c -+++ b/net/wireless/sysfs.c -@@ -30,7 +30,8 @@ static ssize_t name ## _show(struct devi - char *buf) \ - { \ - return sprintf(buf, fmt "\n", dev_to_rdev(dev)->member); \ --} -+} \ -+static DEVICE_ATTR_RO(name) - - SHOW_FMT(index, "%d", wiphy_idx); - SHOW_FMT(macaddress, "%pM", wiphy.perm_addr); -@@ -42,7 +43,7 @@ static ssize_t name_show(struct device * - struct wiphy *wiphy = &dev_to_rdev(dev)->wiphy; - return sprintf(buf, "%s\n", dev_name(&wiphy->dev)); - } -- -+static DEVICE_ATTR_RO(name); - - static ssize_t addresses_show(struct device *dev, - struct device_attribute *attr, -@@ -60,15 +61,17 @@ static ssize_t addresses_show(struct dev - - return buf - start; - } -+static DEVICE_ATTR_RO(addresses); - --static struct device_attribute ieee80211_dev_attrs[] = { -- __ATTR_RO(index), -- __ATTR_RO(macaddress), -- __ATTR_RO(address_mask), -- __ATTR_RO(addresses), -- __ATTR_RO(name), -- {} -+static struct attribute *ieee80211_attrs[] = { -+ &dev_attr_index.attr, -+ &dev_attr_macaddress.attr, -+ &dev_attr_address_mask.attr, -+ &dev_attr_addresses.attr, -+ &dev_attr_name.attr, -+ NULL, - }; -+ATTRIBUTE_GROUPS(ieee80211); - - static void wiphy_dev_release(struct device *dev) - { -@@ -144,7 +147,7 @@ struct class ieee80211_class = { - .name = "ieee80211", - .owner = THIS_MODULE, - .dev_release = wiphy_dev_release, -- .dev_attrs = ieee80211_dev_attrs, -+ .dev_groups = ieee80211_groups, - .dev_uevent = wiphy_uevent, - .suspend = wiphy_suspend, - .resume = wiphy_resume, diff --git a/d10.patch b/d10.patch new file mode 100644 index 00000000000000..0dea7e687b140e --- /dev/null +++ b/d10.patch @@ -0,0 +1,1528 @@ +--- + drivers/scsi/osd/osd_uld.c | 13 +-- + drivers/scsi/sd.c | 147 +++++++++++++++++------------------ + drivers/scsi/st.c | 25 +++-- + drivers/staging/comedi/comedi_fops.c | 39 ++++----- + drivers/uio/uio.c | 22 +++-- + drivers/video/backlight/backlight.c | 44 +++++----- + drivers/video/backlight/lcd.c | 26 +++--- + drivers/video/output.c | 20 ++-- + fs/fuse/cuse.c | 13 +-- + mm/backing-dev.c | 19 ++-- + net/core/net-sysfs.c | 134 +++++++++++++++++-------------- + net/ieee802154/wpan-class.c | 21 ++--- + net/rfkill/core.c | 88 +++++++++----------- + net/wireless/sysfs.c | 23 +++-- + 14 files changed, 337 insertions(+), 297 deletions(-) + +--- a/drivers/scsi/osd/osd_uld.c ++++ b/drivers/scsi/osd/osd_uld.c +@@ -107,6 +107,7 @@ static ssize_t osdname_show(struct devic + class_dev); + return sprintf(buf, "%s\n", ould->odi.osdname); + } ++static DEVICE_ATTR_RO(osdname); + + static ssize_t systemid_show(struct device *dev, struct device_attribute *attr, + char *buf) +@@ -117,17 +118,19 @@ static ssize_t systemid_show(struct devi + memcpy(buf, ould->odi.systemid, ould->odi.systemid_len); + return ould->odi.systemid_len; + } ++static DEVICE_ATTR_RO(systemid); + +-static struct device_attribute osd_uld_attrs[] = { +- __ATTR(osdname, S_IRUGO, osdname_show, NULL), +- __ATTR(systemid, S_IRUGO, systemid_show, NULL), +- __ATTR_NULL, ++static struct attribute *osd_uld_attrs[] = { ++ &dev_attr_osdname.attr, ++ &dev_attr_systemid.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(osd_uld); + + static struct class osd_uld_class = { + .owner = THIS_MODULE, + .name = "scsi_osd", +- .dev_attrs = osd_uld_attrs, ++ .dev_groups = osd_uld_groups, + }; + + /* +--- a/drivers/scsi/sd.c ++++ b/drivers/scsi/sd.c +@@ -132,8 +132,8 @@ static const char *sd_cache_types[] = { + }; + + static ssize_t +-sd_store_cache_type(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t count) ++cache_type_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + int i, ct = -1, rcd, wce, sp; + struct scsi_disk *sdkp = to_scsi_disk(dev); +@@ -199,8 +199,18 @@ sd_store_cache_type(struct device *dev, + } + + static ssize_t +-sd_store_manage_start_stop(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t count) ++manage_start_stop_show(struct device *dev, struct device_attribute *attr, ++ char *buf) ++{ ++ struct scsi_disk *sdkp = to_scsi_disk(dev); ++ struct scsi_device *sdp = sdkp->device; ++ ++ return snprintf(buf, 20, "%u\n", sdp->manage_start_stop); ++} ++ ++static ssize_t ++manage_start_stop_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + struct scsi_device *sdp = sdkp->device; +@@ -212,10 +222,19 @@ sd_store_manage_start_stop(struct device + + return count; + } ++static DEVICE_ATTR_RW(manage_start_stop); ++ ++static ssize_t ++allow_restart_show(struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ struct scsi_disk *sdkp = to_scsi_disk(dev); ++ ++ return snprintf(buf, 40, "%d\n", sdkp->device->allow_restart); ++} + + static ssize_t +-sd_store_allow_restart(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t count) ++allow_restart_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + struct scsi_device *sdp = sdkp->device; +@@ -230,47 +249,30 @@ sd_store_allow_restart(struct device *de + + return count; + } ++static DEVICE_ATTR_RW(allow_restart); + + static ssize_t +-sd_show_cache_type(struct device *dev, struct device_attribute *attr, +- char *buf) ++cache_type_show(struct device *dev, struct device_attribute *attr, char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + int ct = sdkp->RCD + 2*sdkp->WCE; + + return snprintf(buf, 40, "%s\n", sd_cache_types[ct]); + } ++static DEVICE_ATTR_RW(cache_type); + + static ssize_t +-sd_show_fua(struct device *dev, struct device_attribute *attr, char *buf) ++FUA_show(struct device *dev, struct device_attribute *attr, char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + + return snprintf(buf, 20, "%u\n", sdkp->DPOFUA); + } ++static DEVICE_ATTR_RO(FUA); + + static ssize_t +-sd_show_manage_start_stop(struct device *dev, struct device_attribute *attr, +- char *buf) +-{ +- struct scsi_disk *sdkp = to_scsi_disk(dev); +- struct scsi_device *sdp = sdkp->device; +- +- return snprintf(buf, 20, "%u\n", sdp->manage_start_stop); +-} +- +-static ssize_t +-sd_show_allow_restart(struct device *dev, struct device_attribute *attr, +- char *buf) +-{ +- struct scsi_disk *sdkp = to_scsi_disk(dev); +- +- return snprintf(buf, 40, "%d\n", sdkp->device->allow_restart); +-} +- +-static ssize_t +-sd_show_protection_type(struct device *dev, struct device_attribute *attr, +- char *buf) ++protection_type_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + +@@ -278,8 +280,8 @@ sd_show_protection_type(struct device *d + } + + static ssize_t +-sd_store_protection_type(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t count) ++protection_type_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + unsigned int val; +@@ -298,10 +300,11 @@ sd_store_protection_type(struct device * + + return count; + } ++static DEVICE_ATTR_RW(protection_type); + + static ssize_t +-sd_show_protection_mode(struct device *dev, struct device_attribute *attr, +- char *buf) ++protection_mode_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + struct scsi_device *sdp = sdkp->device; +@@ -320,24 +323,26 @@ sd_show_protection_mode(struct device *d + + return snprintf(buf, 20, "%s%u\n", dix ? "dix" : "dif", dif); + } ++static DEVICE_ATTR_RO(protection_mode); + + static ssize_t +-sd_show_app_tag_own(struct device *dev, struct device_attribute *attr, +- char *buf) ++app_tag_own_show(struct device *dev, struct device_attribute *attr, char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + + return snprintf(buf, 20, "%u\n", sdkp->ATO); + } ++static DEVICE_ATTR_RO(app_tag_own); + + static ssize_t +-sd_show_thin_provisioning(struct device *dev, struct device_attribute *attr, +- char *buf) ++thin_provisioning_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + + return snprintf(buf, 20, "%u\n", sdkp->lbpme); + } ++static DEVICE_ATTR_RO(thin_provisioning); + + static const char *lbp_mode[] = { + [SD_LBP_FULL] = "full", +@@ -349,8 +354,8 @@ static const char *lbp_mode[] = { + }; + + static ssize_t +-sd_show_provisioning_mode(struct device *dev, struct device_attribute *attr, +- char *buf) ++provisioning_mode_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + +@@ -358,8 +363,8 @@ sd_show_provisioning_mode(struct device + } + + static ssize_t +-sd_store_provisioning_mode(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t count) ++provisioning_mode_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + struct scsi_device *sdp = sdkp->device; +@@ -385,10 +390,11 @@ sd_store_provisioning_mode(struct device + + return count; + } ++static DEVICE_ATTR_RW(provisioning_mode); + + static ssize_t +-sd_show_max_medium_access_timeouts(struct device *dev, +- struct device_attribute *attr, char *buf) ++max_medium_access_timeouts_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + +@@ -396,9 +402,9 @@ sd_show_max_medium_access_timeouts(struc + } + + static ssize_t +-sd_store_max_medium_access_timeouts(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) ++max_medium_access_timeouts_store(struct device *dev, ++ struct device_attribute *attr, const char *buf, ++ size_t count) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + int err; +@@ -410,10 +416,11 @@ sd_store_max_medium_access_timeouts(stru + + return err ? err : count; + } ++static DEVICE_ATTR_RW(max_medium_access_timeouts); + + static ssize_t +-sd_show_write_same_blocks(struct device *dev, struct device_attribute *attr, +- char *buf) ++max_write_same_blocks_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + +@@ -421,8 +428,8 @@ sd_show_write_same_blocks(struct device + } + + static ssize_t +-sd_store_write_same_blocks(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t count) ++max_write_same_blocks_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + struct scsi_device *sdp = sdkp->device; +@@ -451,35 +458,29 @@ sd_store_write_same_blocks(struct device + + return count; + } ++static DEVICE_ATTR_RW(max_write_same_blocks); + +-static struct device_attribute sd_disk_attrs[] = { +- __ATTR(cache_type, S_IRUGO|S_IWUSR, sd_show_cache_type, +- sd_store_cache_type), +- __ATTR(FUA, S_IRUGO, sd_show_fua, NULL), +- __ATTR(allow_restart, S_IRUGO|S_IWUSR, sd_show_allow_restart, +- sd_store_allow_restart), +- __ATTR(manage_start_stop, S_IRUGO|S_IWUSR, sd_show_manage_start_stop, +- sd_store_manage_start_stop), +- __ATTR(protection_type, S_IRUGO|S_IWUSR, sd_show_protection_type, +- sd_store_protection_type), +- __ATTR(protection_mode, S_IRUGO, sd_show_protection_mode, NULL), +- __ATTR(app_tag_own, S_IRUGO, sd_show_app_tag_own, NULL), +- __ATTR(thin_provisioning, S_IRUGO, sd_show_thin_provisioning, NULL), +- __ATTR(provisioning_mode, S_IRUGO|S_IWUSR, sd_show_provisioning_mode, +- sd_store_provisioning_mode), +- __ATTR(max_write_same_blocks, S_IRUGO|S_IWUSR, +- sd_show_write_same_blocks, sd_store_write_same_blocks), +- __ATTR(max_medium_access_timeouts, S_IRUGO|S_IWUSR, +- sd_show_max_medium_access_timeouts, +- sd_store_max_medium_access_timeouts), +- __ATTR_NULL, ++static struct attribute *sd_disk_attrs[] = { ++ &dev_attr_cache_type.attr, ++ &dev_attr_FUA.attr, ++ &dev_attr_allow_restart.attr, ++ &dev_attr_manage_start_stop.attr, ++ &dev_attr_protection_type.attr, ++ &dev_attr_protection_mode.attr, ++ &dev_attr_app_tag_own.attr, ++ &dev_attr_thin_provisioning.attr, ++ &dev_attr_provisioning_mode.attr, ++ &dev_attr_max_write_same_blocks.attr, ++ &dev_attr_max_medium_access_timeouts.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(sd_disk); + + static struct class sd_disk_class = { + .name = "scsi_disk", + .owner = THIS_MODULE, + .dev_release = scsi_disk_release, +- .dev_attrs = sd_disk_attrs, ++ .dev_groups = sd_disk_groups, + }; + + static const struct dev_pm_ops sd_pm_ops = { +--- a/drivers/scsi/st.c ++++ b/drivers/scsi/st.c +@@ -82,7 +82,7 @@ static int try_rdio = 1; + static int try_wdio = 1; + + static struct class st_sysfs_class; +-static struct device_attribute st_dev_attrs[]; ++static const struct attribute_group *st_dev_groups[]; + + MODULE_AUTHOR("Kai Makisara"); + MODULE_DESCRIPTION("SCSI tape (st) driver"); +@@ -4274,7 +4274,7 @@ static void scsi_tape_release(struct kre + + static struct class st_sysfs_class = { + .name = "scsi_tape", +- .dev_attrs = st_dev_attrs, ++ .dev_groups = st_dev_groups, + }; + + static int __init init_st(void) +@@ -4408,6 +4408,7 @@ defined_show(struct device *dev, struct + l = snprintf(buf, PAGE_SIZE, "%d\n", STm->defined); + return l; + } ++static DEVICE_ATTR_RO(defined); + + static ssize_t + default_blksize_show(struct device *dev, struct device_attribute *attr, +@@ -4419,7 +4420,7 @@ default_blksize_show(struct device *dev, + l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_blksize); + return l; + } +- ++static DEVICE_ATTR_RO(default_blksize); + + static ssize_t + default_density_show(struct device *dev, struct device_attribute *attr, +@@ -4433,6 +4434,7 @@ default_density_show(struct device *dev, + l = snprintf(buf, PAGE_SIZE, fmt, STm->default_density); + return l; + } ++static DEVICE_ATTR_RO(default_density); + + static ssize_t + default_compression_show(struct device *dev, struct device_attribute *attr, +@@ -4444,6 +4446,7 @@ default_compression_show(struct device * + l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_compression - 1); + return l; + } ++static DEVICE_ATTR_RO(default_compression); + + static ssize_t + options_show(struct device *dev, struct device_attribute *attr, char *buf) +@@ -4472,15 +4475,17 @@ options_show(struct device *dev, struct + l = snprintf(buf, PAGE_SIZE, "0x%08x\n", options); + return l; + } ++static DEVICE_ATTR_RO(options); + +-static struct device_attribute st_dev_attrs[] = { +- __ATTR_RO(defined), +- __ATTR_RO(default_blksize), +- __ATTR_RO(default_density), +- __ATTR_RO(default_compression), +- __ATTR_RO(options), +- __ATTR_NULL, ++static struct attribute *st_dev_attrs[] = { ++ &dev_attr_defined.attr, ++ &dev_attr_default_blksize.attr, ++ &dev_attr_default_density.attr, ++ &dev_attr_default_compression.attr, ++ &dev_attr_options.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(st_dev); + + /* The following functions may be useful for a larger audience. */ + static int sgl_map_user_pages(struct st_buffer *STbp, +--- a/drivers/staging/comedi/comedi_fops.c ++++ b/drivers/staging/comedi/comedi_fops.c +@@ -262,7 +262,7 @@ static int resize_async_buffer(struct co + + /* sysfs attribute files */ + +-static ssize_t show_max_read_buffer_kb(struct device *csdev, ++static ssize_t max_read_buffer_kb_show(struct device *csdev, + struct device_attribute *attr, char *buf) + { + unsigned int minor = MINOR(csdev->devt); +@@ -283,7 +283,7 @@ static ssize_t show_max_read_buffer_kb(s + return snprintf(buf, PAGE_SIZE, "%i\n", size); + } + +-static ssize_t store_max_read_buffer_kb(struct device *csdev, ++static ssize_t max_read_buffer_kb_store(struct device *csdev, + struct device_attribute *attr, + const char *buf, size_t count) + { +@@ -314,8 +314,9 @@ static ssize_t store_max_read_buffer_kb( + + return err ? err : count; + } ++static DEVICE_ATTR_RW(max_read_buffer_kb); + +-static ssize_t show_read_buffer_kb(struct device *csdev, ++static ssize_t read_buffer_kb_show(struct device *csdev, + struct device_attribute *attr, char *buf) + { + unsigned int minor = MINOR(csdev->devt); +@@ -336,7 +337,7 @@ static ssize_t show_read_buffer_kb(struc + return snprintf(buf, PAGE_SIZE, "%i\n", size); + } + +-static ssize_t store_read_buffer_kb(struct device *csdev, ++static ssize_t read_buffer_kb_store(struct device *csdev, + struct device_attribute *attr, + const char *buf, size_t count) + { +@@ -367,8 +368,9 @@ static ssize_t store_read_buffer_kb(stru + + return err ? err : count; + } ++static DEVICE_ATTR_RW(read_buffer_kb); + +-static ssize_t show_max_write_buffer_kb(struct device *csdev, ++static ssize_t max_write_buffer_kb_show(struct device *csdev, + struct device_attribute *attr, + char *buf) + { +@@ -390,7 +392,7 @@ static ssize_t show_max_write_buffer_kb( + return snprintf(buf, PAGE_SIZE, "%i\n", size); + } + +-static ssize_t store_max_write_buffer_kb(struct device *csdev, ++static ssize_t max_write_buffer_kb_store(struct device *csdev, + struct device_attribute *attr, + const char *buf, size_t count) + { +@@ -421,8 +423,9 @@ static ssize_t store_max_write_buffer_kb + + return err ? err : count; + } ++static DEVICE_ATTR_RW(max_write_buffer_kb); + +-static ssize_t show_write_buffer_kb(struct device *csdev, ++static ssize_t write_buffer_kb_show(struct device *csdev, + struct device_attribute *attr, char *buf) + { + unsigned int minor = MINOR(csdev->devt); +@@ -443,7 +446,7 @@ static ssize_t show_write_buffer_kb(stru + return snprintf(buf, PAGE_SIZE, "%i\n", size); + } + +-static ssize_t store_write_buffer_kb(struct device *csdev, ++static ssize_t write_buffer_kb_store(struct device *csdev, + struct device_attribute *attr, + const char *buf, size_t count) + { +@@ -474,18 +477,16 @@ static ssize_t store_write_buffer_kb(str + + return err ? err : count; + } ++static DEVICE_ATTR_RW(write_buffer_kb); + +-static struct device_attribute comedi_dev_attrs[] = { +- __ATTR(max_read_buffer_kb, S_IRUGO | S_IWUSR, +- show_max_read_buffer_kb, store_max_read_buffer_kb), +- __ATTR(read_buffer_kb, S_IRUGO | S_IWUSR | S_IWGRP, +- show_read_buffer_kb, store_read_buffer_kb), +- __ATTR(max_write_buffer_kb, S_IRUGO | S_IWUSR, +- show_max_write_buffer_kb, store_max_write_buffer_kb), +- __ATTR(write_buffer_kb, S_IRUGO | S_IWUSR | S_IWGRP, +- show_write_buffer_kb, store_write_buffer_kb), +- __ATTR_NULL ++static struct attribute *comedi_dev_attrs[] = { ++ &dev_attr_max_read_buffer_kb.attr, ++ &dev_attr_read_buffer_kb.attr, ++ &dev_attr_max_write_buffer_kb.attr, ++ &dev_attr_write_buffer_kb.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(comedi_dev); + + static void comedi_set_subdevice_runflags(struct comedi_subdevice *s, + unsigned mask, unsigned bits) +@@ -2554,7 +2555,7 @@ static int __init comedi_init(void) + return PTR_ERR(comedi_class); + } + +- comedi_class->dev_attrs = comedi_dev_attrs; ++ comedi_class->dev_groups = comedi_dev_groups; + + /* XXX requires /proc interface */ + comedi_proc_init(); +--- a/drivers/uio/uio.c ++++ b/drivers/uio/uio.c +@@ -224,38 +224,42 @@ static struct kobj_type portio_attr_type + .default_attrs = portio_attrs, + }; + +-static ssize_t show_name(struct device *dev, ++static ssize_t name_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct uio_device *idev = dev_get_drvdata(dev); + return sprintf(buf, "%s\n", idev->info->name); + } ++static DEVICE_ATTR_RO(name); + +-static ssize_t show_version(struct device *dev, ++static ssize_t version_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct uio_device *idev = dev_get_drvdata(dev); + return sprintf(buf, "%s\n", idev->info->version); + } ++static DEVICE_ATTR_RO(version); + +-static ssize_t show_event(struct device *dev, ++static ssize_t event_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct uio_device *idev = dev_get_drvdata(dev); + return sprintf(buf, "%u\n", (unsigned int)atomic_read(&idev->event)); + } ++static DEVICE_ATTR_RO(event); + +-static struct device_attribute uio_class_attributes[] = { +- __ATTR(name, S_IRUGO, show_name, NULL), +- __ATTR(version, S_IRUGO, show_version, NULL), +- __ATTR(event, S_IRUGO, show_event, NULL), +- {} ++static struct attribute *uio_attrs[] = { ++ &dev_attr_name.attr, ++ &dev_attr_version.attr, ++ &dev_attr_event.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(uio); + + /* UIO class infrastructure */ + static struct class uio_class = { + .name = "uio", +- .dev_attrs = uio_class_attributes, ++ .dev_groups = uio_groups, + }; + + /* +--- a/drivers/video/backlight/backlight.c ++++ b/drivers/video/backlight/backlight.c +@@ -103,16 +103,16 @@ static void backlight_generate_event(str + sysfs_notify(&bd->dev.kobj, NULL, "actual_brightness"); + } + +-static ssize_t backlight_show_power(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t bl_power_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct backlight_device *bd = to_backlight_device(dev); + + return sprintf(buf, "%d\n", bd->props.power); + } + +-static ssize_t backlight_store_power(struct device *dev, +- struct device_attribute *attr, const char *buf, size_t count) ++static ssize_t bl_power_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + int rc; + struct backlight_device *bd = to_backlight_device(dev); +@@ -136,8 +136,9 @@ static ssize_t backlight_store_power(str + + return rc; + } ++static DEVICE_ATTR_RW(bl_power); + +-static ssize_t backlight_show_brightness(struct device *dev, ++static ssize_t brightness_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct backlight_device *bd = to_backlight_device(dev); +@@ -145,7 +146,7 @@ static ssize_t backlight_show_brightness + return sprintf(buf, "%d\n", bd->props.brightness); + } + +-static ssize_t backlight_store_brightness(struct device *dev, ++static ssize_t brightness_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) + { + int rc; +@@ -175,24 +176,27 @@ static ssize_t backlight_store_brightnes + + return rc; + } ++static DEVICE_ATTR_RW(brightness); + +-static ssize_t backlight_show_type(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t type_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct backlight_device *bd = to_backlight_device(dev); + + return sprintf(buf, "%s\n", backlight_types[bd->props.type]); + } ++static DEVICE_ATTR_RO(type); + +-static ssize_t backlight_show_max_brightness(struct device *dev, ++static ssize_t max_brightness_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct backlight_device *bd = to_backlight_device(dev); + + return sprintf(buf, "%d\n", bd->props.max_brightness); + } ++static DEVICE_ATTR_RO(max_brightness); + +-static ssize_t backlight_show_actual_brightness(struct device *dev, ++static ssize_t actual_brightness_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + int rc = -ENXIO; +@@ -205,6 +209,7 @@ static ssize_t backlight_show_actual_bri + + return rc; + } ++static DEVICE_ATTR_RO(actual_brightness); + + static struct class *backlight_class; + +@@ -247,16 +252,15 @@ static void bl_device_release(struct dev + kfree(bd); + } + +-static struct device_attribute bl_device_attributes[] = { +- __ATTR(bl_power, 0644, backlight_show_power, backlight_store_power), +- __ATTR(brightness, 0644, backlight_show_brightness, +- backlight_store_brightness), +- __ATTR(actual_brightness, 0444, backlight_show_actual_brightness, +- NULL), +- __ATTR(max_brightness, 0444, backlight_show_max_brightness, NULL), +- __ATTR(type, 0444, backlight_show_type, NULL), +- __ATTR_NULL, ++static struct attribute *bl_device_attrs[] = { ++ &dev_attr_bl_power.attr, ++ &dev_attr_brightness.attr, ++ &dev_attr_actual_brightness.attr, ++ &dev_attr_max_brightness.attr, ++ &dev_attr_type.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(bl_device); + + /** + * backlight_force_update - tell the backlight subsystem that hardware state +@@ -493,7 +497,7 @@ static int __init backlight_class_init(v + return PTR_ERR(backlight_class); + } + +- backlight_class->dev_attrs = bl_device_attributes; ++ backlight_class->dev_groups = bl_device_groups; + backlight_class->pm = &backlight_class_dev_pm_ops; + return 0; + } +--- a/drivers/video/backlight/lcd.c ++++ b/drivers/video/backlight/lcd.c +@@ -89,7 +89,7 @@ static inline void lcd_unregister_fb(str + } + #endif /* CONFIG_FB */ + +-static ssize_t lcd_show_power(struct device *dev, struct device_attribute *attr, ++static ssize_t lcd_power_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + int rc; +@@ -105,7 +105,7 @@ static ssize_t lcd_show_power(struct dev + return rc; + } + +-static ssize_t lcd_store_power(struct device *dev, ++static ssize_t lcd_power_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) + { + int rc; +@@ -128,8 +128,9 @@ static ssize_t lcd_store_power(struct de + + return rc; + } ++static DEVICE_ATTR_RW(lcd_power); + +-static ssize_t lcd_show_contrast(struct device *dev, ++static ssize_t contrast_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + int rc = -ENXIO; +@@ -143,7 +144,7 @@ static ssize_t lcd_show_contrast(struct + return rc; + } + +-static ssize_t lcd_store_contrast(struct device *dev, ++static ssize_t contrast_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) + { + int rc; +@@ -166,14 +167,16 @@ static ssize_t lcd_store_contrast(struct + + return rc; + } ++static DEVICE_ATTR_RW(contrast); + +-static ssize_t lcd_show_max_contrast(struct device *dev, ++static ssize_t max_contrast_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct lcd_device *ld = to_lcd_device(dev); + + return sprintf(buf, "%d\n", ld->props.max_contrast); + } ++static DEVICE_ATTR_RO(max_contrast); + + static struct class *lcd_class; + +@@ -183,12 +186,13 @@ static void lcd_device_release(struct de + kfree(ld); + } + +-static struct device_attribute lcd_device_attributes[] = { +- __ATTR(lcd_power, 0644, lcd_show_power, lcd_store_power), +- __ATTR(contrast, 0644, lcd_show_contrast, lcd_store_contrast), +- __ATTR(max_contrast, 0444, lcd_show_max_contrast, NULL), +- __ATTR_NULL, ++static struct attribute *lcd_device_attrs[] = { ++ &dev_attr_lcd_power.attr, ++ &dev_attr_contrast.attr, ++ &dev_attr_max_contrast.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(lcd_device); + + /** + * lcd_device_register - register a new object of lcd_device class. +@@ -344,7 +348,7 @@ static int __init lcd_class_init(void) + return PTR_ERR(lcd_class); + } + +- lcd_class->dev_attrs = lcd_device_attributes; ++ lcd_class->dev_groups = lcd_device_groups; + return 0; + } + +--- a/drivers/video/output.c ++++ b/drivers/video/output.c +@@ -32,8 +32,8 @@ MODULE_DESCRIPTION("Display Output Switc + MODULE_LICENSE("GPL"); + MODULE_AUTHOR("Luming Yu <luming.yu@intel.com>"); + +-static ssize_t video_output_show_state(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t state_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + ssize_t ret_size = 0; + struct output_device *od = to_output_device(dev); +@@ -42,9 +42,8 @@ static ssize_t video_output_show_state(s + return ret_size; + } + +-static ssize_t video_output_store_state(struct device *dev, +- struct device_attribute *attr, +- const char *buf,size_t count) ++static ssize_t state_store(struct device *dev, struct device_attribute *attr, ++ const char *buf,size_t count) + { + char *endp; + struct output_device *od = to_output_device(dev); +@@ -62,6 +61,7 @@ static ssize_t video_output_store_state( + } + return count; + } ++static DEVICE_ATTR_RW(state); + + static void video_output_release(struct device *dev) + { +@@ -69,16 +69,16 @@ static void video_output_release(struct + kfree(od); + } + +-static struct device_attribute video_output_attributes[] = { +- __ATTR(state, 0644, video_output_show_state, video_output_store_state), +- __ATTR_NULL, ++static struct attribute *video_output_attrs[] = { ++ &dev_attr_state.attr, ++ NULL, + }; +- ++ATTRIBUTE_GROUPS(video_output); + + static struct class video_output_class = { + .name = "video_output", + .dev_release = video_output_release, +- .dev_attrs = video_output_attributes, ++ .dev_groups = video_output_groups, + }; + + struct output_device *video_output_register(const char *name, +--- a/fs/fuse/cuse.c ++++ b/fs/fuse/cuse.c +@@ -568,6 +568,7 @@ static ssize_t cuse_class_waiting_show(s + + return sprintf(buf, "%d\n", atomic_read(&cc->fc.num_waiting)); + } ++static DEVICE_ATTR(waiting, S_IFREG | 0400, cuse_class_waiting_show, NULL); + + static ssize_t cuse_class_abort_store(struct device *dev, + struct device_attribute *attr, +@@ -578,12 +579,14 @@ static ssize_t cuse_class_abort_store(st + fuse_abort_conn(&cc->fc); + return count; + } ++static DEVICE_ATTR(abort, S_IFREG | 0200, NULL, cuse_class_abort_store); + +-static struct device_attribute cuse_class_dev_attrs[] = { +- __ATTR(waiting, S_IFREG | 0400, cuse_class_waiting_show, NULL), +- __ATTR(abort, S_IFREG | 0200, NULL, cuse_class_abort_store), +- { } ++static struct attribute *cuse_class_dev_attrs[] = { ++ &dev_attr_waiting.attr, ++ &dev_attr_abort.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(cuse_class_dev); + + static struct miscdevice cuse_miscdev = { + .minor = MISC_DYNAMIC_MINOR, +@@ -609,7 +612,7 @@ static int __init cuse_init(void) + if (IS_ERR(cuse_class)) + return PTR_ERR(cuse_class); + +- cuse_class->dev_attrs = cuse_class_dev_attrs; ++ cuse_class->dev_groups = cuse_class_dev_groups; + + rc = misc_register(&cuse_miscdev); + if (rc) { +--- a/mm/backing-dev.c ++++ b/mm/backing-dev.c +@@ -180,7 +180,8 @@ static ssize_t name##_show(struct device + struct backing_dev_info *bdi = dev_get_drvdata(dev); \ + \ + return snprintf(page, PAGE_SIZE-1, "%lld\n", (long long)expr); \ +-} ++} \ ++static DEVICE_ATTR_RW(name); + + BDI_SHOW(read_ahead_kb, K(bdi->ra_pages)) + +@@ -231,14 +232,16 @@ static ssize_t stable_pages_required_sho + return snprintf(page, PAGE_SIZE-1, "%d\n", + bdi_cap_stable_pages_required(bdi) ? 1 : 0); + } ++static DEVICE_ATTR_RO(stable_pages_required); + +-static struct device_attribute bdi_dev_attrs[] = { +- __ATTR_RW(read_ahead_kb), +- __ATTR_RW(min_ratio), +- __ATTR_RW(max_ratio), +- __ATTR_RO(stable_pages_required), +- __ATTR_NULL, ++static struct attribute *bdi_dev_attrs[] = { ++ &dev_attr_read_ahead_kb.attr, ++ &dev_attr_min_ratio.attr, ++ &dev_attr_max_ratio.attr, ++ &dev_attr_stable_pages_required.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(bdi_dev); + + static __init int bdi_class_init(void) + { +@@ -246,7 +249,7 @@ static __init int bdi_class_init(void) + if (IS_ERR(bdi_class)) + return PTR_ERR(bdi_class); + +- bdi_class->dev_attrs = bdi_dev_attrs; ++ bdi_class->dev_groups = bdi_dev_groups; + bdi_debug_init(); + return 0; + } +--- a/net/core/net-sysfs.c ++++ b/net/core/net-sysfs.c +@@ -60,12 +60,19 @@ static ssize_t format_##field(const stru + { \ + return sprintf(buf, format_string, net->field); \ + } \ +-static ssize_t show_##field(struct device *dev, \ ++static ssize_t field##_show(struct device *dev, \ + struct device_attribute *attr, char *buf) \ + { \ + return netdev_show(dev, attr, buf, format_##field); \ +-} ++} \ + ++#define NETDEVICE_SHOW_RO(field, format_string) \ ++NETDEVICE_SHOW(field, format_string); \ ++static DEVICE_ATTR_RO(field) ++ ++#define NETDEVICE_SHOW_RW(field, format_string) \ ++NETDEVICE_SHOW(field, format_string); \ ++static DEVICE_ATTR_RW(field) + + /* use same locking and permission rules as SIF* ioctl's */ + static ssize_t netdev_store(struct device *dev, struct device_attribute *attr, +@@ -96,16 +103,16 @@ static ssize_t netdev_store(struct devic + return ret; + } + +-NETDEVICE_SHOW(dev_id, fmt_hex); +-NETDEVICE_SHOW(addr_assign_type, fmt_dec); +-NETDEVICE_SHOW(addr_len, fmt_dec); +-NETDEVICE_SHOW(iflink, fmt_dec); +-NETDEVICE_SHOW(ifindex, fmt_dec); +-NETDEVICE_SHOW(type, fmt_dec); +-NETDEVICE_SHOW(link_mode, fmt_dec); ++NETDEVICE_SHOW_RO(dev_id, fmt_hex); ++NETDEVICE_SHOW_RO(addr_assign_type, fmt_dec); ++NETDEVICE_SHOW_RO(addr_len, fmt_dec); ++NETDEVICE_SHOW_RO(iflink, fmt_dec); ++NETDEVICE_SHOW_RO(ifindex, fmt_dec); ++NETDEVICE_SHOW_RO(type, fmt_dec); ++NETDEVICE_SHOW_RO(link_mode, fmt_dec); + + /* use same locking rules as GIFHWADDR ioctl's */ +-static ssize_t show_address(struct device *dev, struct device_attribute *attr, ++static ssize_t address_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + struct net_device *net = to_net_dev(dev); +@@ -117,15 +124,17 @@ static ssize_t show_address(struct devic + read_unlock(&dev_base_lock); + return ret; + } ++static DEVICE_ATTR_RO(address); + +-static ssize_t show_broadcast(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t broadcast_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct net_device *net = to_net_dev(dev); + if (dev_isalive(net)) + return sysfs_format_mac(buf, net->broadcast, net->addr_len); + return -EINVAL; + } ++static DEVICE_ATTR_RO(broadcast); + + static int change_carrier(struct net_device *net, unsigned long new_carrier) + { +@@ -134,13 +143,13 @@ static int change_carrier(struct net_dev + return dev_change_carrier(net, (bool) new_carrier); + } + +-static ssize_t store_carrier(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t len) ++static ssize_t carrier_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t len) + { + return netdev_store(dev, attr, buf, len, change_carrier); + } + +-static ssize_t show_carrier(struct device *dev, ++static ssize_t carrier_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct net_device *netdev = to_net_dev(dev); +@@ -149,8 +158,9 @@ static ssize_t show_carrier(struct devic + } + return -EINVAL; + } ++static DEVICE_ATTR_RW(carrier); + +-static ssize_t show_speed(struct device *dev, ++static ssize_t speed_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct net_device *netdev = to_net_dev(dev); +@@ -167,8 +177,9 @@ static ssize_t show_speed(struct device + rtnl_unlock(); + return ret; + } ++static DEVICE_ATTR_RO(speed); + +-static ssize_t show_duplex(struct device *dev, ++static ssize_t duplex_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct net_device *netdev = to_net_dev(dev); +@@ -198,8 +209,9 @@ static ssize_t show_duplex(struct device + rtnl_unlock(); + return ret; + } ++static DEVICE_ATTR_RO(duplex); + +-static ssize_t show_dormant(struct device *dev, ++static ssize_t dormant_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct net_device *netdev = to_net_dev(dev); +@@ -209,6 +221,7 @@ static ssize_t show_dormant(struct devic + + return -EINVAL; + } ++static DEVICE_ATTR_RO(dormant); + + static const char *const operstates[] = { + "unknown", +@@ -220,7 +233,7 @@ static const char *const operstates[] = + "up" + }; + +-static ssize_t show_operstate(struct device *dev, ++static ssize_t operstate_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + const struct net_device *netdev = to_net_dev(dev); +@@ -237,35 +250,33 @@ static ssize_t show_operstate(struct dev + + return sprintf(buf, "%s\n", operstates[operstate]); + } ++static DEVICE_ATTR_RO(operstate); + + /* read-write attributes */ +-NETDEVICE_SHOW(mtu, fmt_dec); + + static int change_mtu(struct net_device *net, unsigned long new_mtu) + { + return dev_set_mtu(net, (int) new_mtu); + } + +-static ssize_t store_mtu(struct device *dev, struct device_attribute *attr, ++static ssize_t mtu_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t len) + { + return netdev_store(dev, attr, buf, len, change_mtu); + } +- +-NETDEVICE_SHOW(flags, fmt_hex); ++NETDEVICE_SHOW_RW(mtu, fmt_dec); + + static int change_flags(struct net_device *net, unsigned long new_flags) + { + return dev_change_flags(net, (unsigned int) new_flags); + } + +-static ssize_t store_flags(struct device *dev, struct device_attribute *attr, ++static ssize_t flags_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t len) + { + return netdev_store(dev, attr, buf, len, change_flags); + } +- +-NETDEVICE_SHOW(tx_queue_len, fmt_ulong); ++NETDEVICE_SHOW_RW(flags, fmt_hex); + + static int change_tx_queue_len(struct net_device *net, unsigned long new_len) + { +@@ -273,7 +284,7 @@ static int change_tx_queue_len(struct ne + return 0; + } + +-static ssize_t store_tx_queue_len(struct device *dev, ++static ssize_t tx_queue_len_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) + { +@@ -282,8 +293,9 @@ static ssize_t store_tx_queue_len(struct + + return netdev_store(dev, attr, buf, len, change_tx_queue_len); + } ++NETDEVICE_SHOW_RW(tx_queue_len, fmt_ulong); + +-static ssize_t store_ifalias(struct device *dev, struct device_attribute *attr, ++static ssize_t ifalias_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t len) + { + struct net_device *netdev = to_net_dev(dev); +@@ -306,7 +318,7 @@ static ssize_t store_ifalias(struct devi + return ret < 0 ? ret : len; + } + +-static ssize_t show_ifalias(struct device *dev, ++static ssize_t ifalias_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + const struct net_device *netdev = to_net_dev(dev); +@@ -319,8 +331,7 @@ static ssize_t show_ifalias(struct devic + rtnl_unlock(); + return ret; + } +- +-NETDEVICE_SHOW(group, fmt_dec); ++static DEVICE_ATTR_RW(ifalias); + + static int change_group(struct net_device *net, unsigned long new_group) + { +@@ -328,35 +339,37 @@ static int change_group(struct net_devic + return 0; + } + +-static ssize_t store_group(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t len) ++static ssize_t group_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t len) + { + return netdev_store(dev, attr, buf, len, change_group); + } ++NETDEVICE_SHOW(group, fmt_dec); ++static DEVICE_ATTR(netdev_group, S_IRUGO | S_IWUSR, group_show, group_store); + +-static struct device_attribute net_class_attributes[] = { +- __ATTR(addr_assign_type, S_IRUGO, show_addr_assign_type, NULL), +- __ATTR(addr_len, S_IRUGO, show_addr_len, NULL), +- __ATTR(dev_id, S_IRUGO, show_dev_id, NULL), +- __ATTR(ifalias, S_IRUGO | S_IWUSR, show_ifalias, store_ifalias), +- __ATTR(iflink, S_IRUGO, show_iflink, NULL), +- __ATTR(ifindex, S_IRUGO, show_ifindex, NULL), +- __ATTR(type, S_IRUGO, show_type, NULL), +- __ATTR(link_mode, S_IRUGO, show_link_mode, NULL), +- __ATTR(address, S_IRUGO, show_address, NULL), +- __ATTR(broadcast, S_IRUGO, show_broadcast, NULL), +- __ATTR(carrier, S_IRUGO | S_IWUSR, show_carrier, store_carrier), +- __ATTR(speed, S_IRUGO, show_speed, NULL), +- __ATTR(duplex, S_IRUGO, show_duplex, NULL), +- __ATTR(dormant, S_IRUGO, show_dormant, NULL), +- __ATTR(operstate, S_IRUGO, show_operstate, NULL), +- __ATTR(mtu, S_IRUGO | S_IWUSR, show_mtu, store_mtu), +- __ATTR(flags, S_IRUGO | S_IWUSR, show_flags, store_flags), +- __ATTR(tx_queue_len, S_IRUGO | S_IWUSR, show_tx_queue_len, +- store_tx_queue_len), +- __ATTR(netdev_group, S_IRUGO | S_IWUSR, show_group, store_group), +- {} ++static struct attribute *net_class_attrs[] = { ++ &dev_attr_netdev_group.attr, ++ &dev_attr_type.attr, ++ &dev_attr_dev_id.attr, ++ &dev_attr_iflink.attr, ++ &dev_attr_ifindex.attr, ++ &dev_attr_addr_assign_type.attr, ++ &dev_attr_addr_len.attr, ++ &dev_attr_link_mode.attr, ++ &dev_attr_address.attr, ++ &dev_attr_broadcast.attr, ++ &dev_attr_speed.attr, ++ &dev_attr_duplex.attr, ++ &dev_attr_dormant.attr, ++ &dev_attr_operstate.attr, ++ &dev_attr_ifalias.attr, ++ &dev_attr_carrier.attr, ++ &dev_attr_mtu.attr, ++ &dev_attr_flags.attr, ++ &dev_attr_tx_queue_len.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(net_class); + + /* Show a given an attribute in the statistics group */ + static ssize_t netstat_show(const struct device *d, +@@ -382,13 +395,13 @@ static ssize_t netstat_show(const struct + + /* generate a read-only statistics attribute */ + #define NETSTAT_ENTRY(name) \ +-static ssize_t show_##name(struct device *d, \ ++static ssize_t name##_show(struct device *d, \ + struct device_attribute *attr, char *buf) \ + { \ + return netstat_show(d, attr, buf, \ + offsetof(struct rtnl_link_stats64, name)); \ + } \ +-static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL) ++static DEVICE_ATTR_RO(name) + + NETSTAT_ENTRY(rx_packets); + NETSTAT_ENTRY(tx_packets); +@@ -457,6 +470,9 @@ static struct attribute_group wireless_g + .attrs = wireless_attrs, + }; + #endif ++ ++#else /* CONFIG_SYSFS */ ++#define net_class_groups NULL + #endif /* CONFIG_SYSFS */ + + #ifdef CONFIG_RPS +@@ -1229,9 +1245,7 @@ static const void *net_namespace(struct + static struct class net_class = { + .name = "net", + .dev_release = netdev_release, +-#ifdef CONFIG_SYSFS +- .dev_attrs = net_class_attributes, +-#endif /* CONFIG_SYSFS */ ++ .dev_groups = net_class_groups, + .dev_uevent = netdev_uevent, + .ns_type = &net_ns_type_operations, + .namespace = net_namespace, +--- a/net/ieee802154/wpan-class.c ++++ b/net/ieee802154/wpan-class.c +@@ -36,7 +36,8 @@ static ssize_t name ## _show(struct devi + ret = snprintf(buf, PAGE_SIZE, format_string "\n", args); \ + mutex_unlock(&phy->pib_lock); \ + return ret; \ +-} ++} \ ++static DEVICE_ATTR_RO(name); + + #define MASTER_SHOW(field, format_string) \ + MASTER_SHOW_COMPLEX(field, format_string, phy->field) +@@ -66,15 +67,17 @@ static ssize_t channels_supported_show(s + mutex_unlock(&phy->pib_lock); + return len; + } ++static DEVICE_ATTR_RO(channels_supported); + +-static struct device_attribute pmib_attrs[] = { +- __ATTR_RO(current_channel), +- __ATTR_RO(current_page), +- __ATTR_RO(channels_supported), +- __ATTR_RO(transmit_power), +- __ATTR_RO(cca_mode), +- {}, ++static struct attribute *pmib_attrs[] = { ++ &dev_attr_current_channel.attr, ++ &dev_attr_current_page.attr, ++ &dev_attr_channels_supported.attr, ++ &dev_attr_transmit_power.attr, ++ &dev_attr_cca_mode.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(pmib); + + static void wpan_phy_release(struct device *d) + { +@@ -85,7 +88,7 @@ static void wpan_phy_release(struct devi + static struct class wpan_phy_class = { + .name = "ieee802154", + .dev_release = wpan_phy_release, +- .dev_attrs = pmib_attrs, ++ .dev_groups = pmib_groups, + }; + + static DEFINE_MUTEX(wpan_phy_mutex); +--- a/net/rfkill/core.c ++++ b/net/rfkill/core.c +@@ -576,14 +576,14 @@ void rfkill_set_states(struct rfkill *rf + } + EXPORT_SYMBOL(rfkill_set_states); + +-static ssize_t rfkill_name_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t name_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct rfkill *rfkill = to_rfkill(dev); + + return sprintf(buf, "%s\n", rfkill->name); + } ++static DEVICE_ATTR_RO(name); + + static const char *rfkill_get_type_str(enum rfkill_type type) + { +@@ -611,54 +611,52 @@ static const char *rfkill_get_type_str(e + } + } + +-static ssize_t rfkill_type_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t type_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct rfkill *rfkill = to_rfkill(dev); + + return sprintf(buf, "%s\n", rfkill_get_type_str(rfkill->type)); + } ++static DEVICE_ATTR_RO(type); + +-static ssize_t rfkill_idx_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t index_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct rfkill *rfkill = to_rfkill(dev); + + return sprintf(buf, "%d\n", rfkill->idx); + } ++static DEVICE_ATTR_RO(index); + +-static ssize_t rfkill_persistent_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t persistent_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct rfkill *rfkill = to_rfkill(dev); + + return sprintf(buf, "%d\n", rfkill->persistent); + } ++static DEVICE_ATTR_RO(persistent); + +-static ssize_t rfkill_hard_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t hard_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct rfkill *rfkill = to_rfkill(dev); + + return sprintf(buf, "%d\n", (rfkill->state & RFKILL_BLOCK_HW) ? 1 : 0 ); + } ++static DEVICE_ATTR_RO(hard); + +-static ssize_t rfkill_soft_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t soft_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct rfkill *rfkill = to_rfkill(dev); + + return sprintf(buf, "%d\n", (rfkill->state & RFKILL_BLOCK_SW) ? 1 : 0 ); + } + +-static ssize_t rfkill_soft_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) ++static ssize_t soft_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + struct rfkill *rfkill = to_rfkill(dev); + unsigned long state; +@@ -680,6 +678,7 @@ static ssize_t rfkill_soft_store(struct + + return count; + } ++static DEVICE_ATTR_RW(soft); + + static u8 user_state_from_blocked(unsigned long state) + { +@@ -691,18 +690,16 @@ static u8 user_state_from_blocked(unsign + return RFKILL_USER_STATE_UNBLOCKED; + } + +-static ssize_t rfkill_state_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t state_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct rfkill *rfkill = to_rfkill(dev); + + return sprintf(buf, "%d\n", user_state_from_blocked(rfkill->state)); + } + +-static ssize_t rfkill_state_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) ++static ssize_t state_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + struct rfkill *rfkill = to_rfkill(dev); + unsigned long state; +@@ -725,32 +722,27 @@ static ssize_t rfkill_state_store(struct + + return count; + } ++static DEVICE_ATTR_RW(state); + +-static ssize_t rfkill_claim_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t claim_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + return sprintf(buf, "%d\n", 0); + } ++static DEVICE_ATTR_RO(claim); + +-static ssize_t rfkill_claim_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) +-{ +- return -EOPNOTSUPP; +-} +- +-static struct device_attribute rfkill_dev_attrs[] = { +- __ATTR(name, S_IRUGO, rfkill_name_show, NULL), +- __ATTR(type, S_IRUGO, rfkill_type_show, NULL), +- __ATTR(index, S_IRUGO, rfkill_idx_show, NULL), +- __ATTR(persistent, S_IRUGO, rfkill_persistent_show, NULL), +- __ATTR(state, S_IRUGO|S_IWUSR, rfkill_state_show, rfkill_state_store), +- __ATTR(claim, S_IRUGO|S_IWUSR, rfkill_claim_show, rfkill_claim_store), +- __ATTR(soft, S_IRUGO|S_IWUSR, rfkill_soft_show, rfkill_soft_store), +- __ATTR(hard, S_IRUGO, rfkill_hard_show, NULL), +- __ATTR_NULL ++static struct attribute *rfkill_dev_attrs[] = { ++ &dev_attr_name.attr, ++ &dev_attr_type.attr, ++ &dev_attr_index.attr, ++ &dev_attr_persistent.attr, ++ &dev_attr_state.attr, ++ &dev_attr_claim.attr, ++ &dev_attr_soft.attr, ++ &dev_attr_hard.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(rfkill_dev); + + static void rfkill_release(struct device *dev) + { +@@ -830,7 +822,7 @@ static int rfkill_resume(struct device * + static struct class rfkill_class = { + .name = "rfkill", + .dev_release = rfkill_release, +- .dev_attrs = rfkill_dev_attrs, ++ .dev_groups = rfkill_dev_groups, + .dev_uevent = rfkill_dev_uevent, + .suspend = rfkill_suspend, + .resume = rfkill_resume, +--- a/net/wireless/sysfs.c ++++ b/net/wireless/sysfs.c +@@ -30,7 +30,8 @@ static ssize_t name ## _show(struct devi + char *buf) \ + { \ + return sprintf(buf, fmt "\n", dev_to_rdev(dev)->member); \ +-} ++} \ ++static DEVICE_ATTR_RO(name) + + SHOW_FMT(index, "%d", wiphy_idx); + SHOW_FMT(macaddress, "%pM", wiphy.perm_addr); +@@ -42,7 +43,7 @@ static ssize_t name_show(struct device * + struct wiphy *wiphy = &dev_to_rdev(dev)->wiphy; + return sprintf(buf, "%s\n", dev_name(&wiphy->dev)); + } +- ++static DEVICE_ATTR_RO(name); + + static ssize_t addresses_show(struct device *dev, + struct device_attribute *attr, +@@ -60,15 +61,17 @@ static ssize_t addresses_show(struct dev + + return buf - start; + } ++static DEVICE_ATTR_RO(addresses); + +-static struct device_attribute ieee80211_dev_attrs[] = { +- __ATTR_RO(index), +- __ATTR_RO(macaddress), +- __ATTR_RO(address_mask), +- __ATTR_RO(addresses), +- __ATTR_RO(name), +- {} ++static struct attribute *ieee80211_attrs[] = { ++ &dev_attr_index.attr, ++ &dev_attr_macaddress.attr, ++ &dev_attr_address_mask.attr, ++ &dev_attr_addresses.attr, ++ &dev_attr_name.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(ieee80211); + + static void wiphy_dev_release(struct device *dev) + { +@@ -144,7 +147,7 @@ struct class ieee80211_class = { + .name = "ieee80211", + .owner = THIS_MODULE, + .dev_release = wiphy_dev_release, +- .dev_attrs = ieee80211_dev_attrs, ++ .dev_groups = ieee80211_groups, + .dev_uevent = wiphy_uevent, + .suspend = wiphy_suspend, + .resume = wiphy_resume, diff --git a/d2.patch b/d2.patch new file mode 100644 index 00000000000000..509cf6956cdc98 --- /dev/null +++ b/d2.patch @@ -0,0 +1,42 @@ +--- + fs/fuse/cuse.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +--- a/fs/fuse/cuse.c ++++ b/fs/fuse/cuse.c +@@ -568,6 +568,7 @@ static ssize_t cuse_class_waiting_show(s + + return sprintf(buf, "%d\n", atomic_read(&cc->fc.num_waiting)); + } ++static DEVICE_ATTR(waiting, S_IFREG | 0400, cuse_class_waiting_show, NULL); + + static ssize_t cuse_class_abort_store(struct device *dev, + struct device_attribute *attr, +@@ -578,12 +579,14 @@ static ssize_t cuse_class_abort_store(st + fuse_abort_conn(&cc->fc); + return count; + } ++static DEVICE_ATTR(abort, S_IFREG | 0200, NULL, cuse_class_abort_store); + +-static struct device_attribute cuse_class_dev_attrs[] = { +- __ATTR(waiting, S_IFREG | 0400, cuse_class_waiting_show, NULL), +- __ATTR(abort, S_IFREG | 0200, NULL, cuse_class_abort_store), +- { } ++static struct attribute *cuse_class_dev_attrs[] = { ++ &dev_attr_waiting.attr, ++ &dev_attr_abort.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(cuse_class_dev); + + static struct miscdevice cuse_miscdev = { + .minor = MISC_DYNAMIC_MINOR, +@@ -609,7 +612,7 @@ static int __init cuse_init(void) + if (IS_ERR(cuse_class)) + return PTR_ERR(cuse_class); + +- cuse_class->dev_attrs = cuse_class_dev_attrs; ++ cuse_class->dev_groups = cuse_class_dev_groups; + + rc = misc_register(&cuse_miscdev); + if (rc) { diff --git a/d3.patch b/d3.patch new file mode 100644 index 00000000000000..164e7c56c1e4ec --- /dev/null +++ b/d3.patch @@ -0,0 +1,120 @@ +--- + drivers/staging/comedi/comedi_fops.c | 39 +++++++++++++++++------------------ + 1 file changed, 20 insertions(+), 19 deletions(-) + +--- a/drivers/staging/comedi/comedi_fops.c ++++ b/drivers/staging/comedi/comedi_fops.c +@@ -262,7 +262,7 @@ static int resize_async_buffer(struct co + + /* sysfs attribute files */ + +-static ssize_t show_max_read_buffer_kb(struct device *csdev, ++static ssize_t max_read_buffer_kb_show(struct device *csdev, + struct device_attribute *attr, char *buf) + { + unsigned int minor = MINOR(csdev->devt); +@@ -283,7 +283,7 @@ static ssize_t show_max_read_buffer_kb(s + return snprintf(buf, PAGE_SIZE, "%i\n", size); + } + +-static ssize_t store_max_read_buffer_kb(struct device *csdev, ++static ssize_t max_read_buffer_kb_store(struct device *csdev, + struct device_attribute *attr, + const char *buf, size_t count) + { +@@ -314,8 +314,9 @@ static ssize_t store_max_read_buffer_kb( + + return err ? err : count; + } ++static DEVICE_ATTR_RW(max_read_buffer_kb); + +-static ssize_t show_read_buffer_kb(struct device *csdev, ++static ssize_t read_buffer_kb_show(struct device *csdev, + struct device_attribute *attr, char *buf) + { + unsigned int minor = MINOR(csdev->devt); +@@ -336,7 +337,7 @@ static ssize_t show_read_buffer_kb(struc + return snprintf(buf, PAGE_SIZE, "%i\n", size); + } + +-static ssize_t store_read_buffer_kb(struct device *csdev, ++static ssize_t read_buffer_kb_store(struct device *csdev, + struct device_attribute *attr, + const char *buf, size_t count) + { +@@ -367,8 +368,9 @@ static ssize_t store_read_buffer_kb(stru + + return err ? err : count; + } ++static DEVICE_ATTR_RW(read_buffer_kb); + +-static ssize_t show_max_write_buffer_kb(struct device *csdev, ++static ssize_t max_write_buffer_kb_show(struct device *csdev, + struct device_attribute *attr, + char *buf) + { +@@ -390,7 +392,7 @@ static ssize_t show_max_write_buffer_kb( + return snprintf(buf, PAGE_SIZE, "%i\n", size); + } + +-static ssize_t store_max_write_buffer_kb(struct device *csdev, ++static ssize_t max_write_buffer_kb_store(struct device *csdev, + struct device_attribute *attr, + const char *buf, size_t count) + { +@@ -421,8 +423,9 @@ static ssize_t store_max_write_buffer_kb + + return err ? err : count; + } ++static DEVICE_ATTR_RW(max_write_buffer_kb); + +-static ssize_t show_write_buffer_kb(struct device *csdev, ++static ssize_t write_buffer_kb_show(struct device *csdev, + struct device_attribute *attr, char *buf) + { + unsigned int minor = MINOR(csdev->devt); +@@ -443,7 +446,7 @@ static ssize_t show_write_buffer_kb(stru + return snprintf(buf, PAGE_SIZE, "%i\n", size); + } + +-static ssize_t store_write_buffer_kb(struct device *csdev, ++static ssize_t write_buffer_kb_store(struct device *csdev, + struct device_attribute *attr, + const char *buf, size_t count) + { +@@ -474,18 +477,16 @@ static ssize_t store_write_buffer_kb(str + + return err ? err : count; + } ++static DEVICE_ATTR_RW(write_buffer_kb); + +-static struct device_attribute comedi_dev_attrs[] = { +- __ATTR(max_read_buffer_kb, S_IRUGO | S_IWUSR, +- show_max_read_buffer_kb, store_max_read_buffer_kb), +- __ATTR(read_buffer_kb, S_IRUGO | S_IWUSR | S_IWGRP, +- show_read_buffer_kb, store_read_buffer_kb), +- __ATTR(max_write_buffer_kb, S_IRUGO | S_IWUSR, +- show_max_write_buffer_kb, store_max_write_buffer_kb), +- __ATTR(write_buffer_kb, S_IRUGO | S_IWUSR | S_IWGRP, +- show_write_buffer_kb, store_write_buffer_kb), +- __ATTR_NULL ++static struct attribute *comedi_dev_attrs[] = { ++ &dev_attr_max_read_buffer_kb.attr, ++ &dev_attr_read_buffer_kb.attr, ++ &dev_attr_max_write_buffer_kb.attr, ++ &dev_attr_write_buffer_kb.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(comedi_dev); + + static void comedi_set_subdevice_runflags(struct comedi_subdevice *s, + unsigned mask, unsigned bits) +@@ -2554,7 +2555,7 @@ static int __init comedi_init(void) + return PTR_ERR(comedi_class); + } + +- comedi_class->dev_attrs = comedi_dev_attrs; ++ comedi_class->dev_groups = comedi_dev_groups; + + /* XXX requires /proc interface */ + comedi_proc_init(); diff --git a/d4.patch b/d4.patch new file mode 100644 index 00000000000000..68b153f0add2c8 --- /dev/null +++ b/d4.patch @@ -0,0 +1,48 @@ +--- + mm/backing-dev.c | 19 +++++++++++-------- + 1 file changed, 11 insertions(+), 8 deletions(-) + +--- a/mm/backing-dev.c ++++ b/mm/backing-dev.c +@@ -180,7 +180,8 @@ static ssize_t name##_show(struct device + struct backing_dev_info *bdi = dev_get_drvdata(dev); \ + \ + return snprintf(page, PAGE_SIZE-1, "%lld\n", (long long)expr); \ +-} ++} \ ++static DEVICE_ATTR_RW(name); + + BDI_SHOW(read_ahead_kb, K(bdi->ra_pages)) + +@@ -231,14 +232,16 @@ static ssize_t stable_pages_required_sho + return snprintf(page, PAGE_SIZE-1, "%d\n", + bdi_cap_stable_pages_required(bdi) ? 1 : 0); + } ++static DEVICE_ATTR_RO(stable_pages_required); + +-static struct device_attribute bdi_dev_attrs[] = { +- __ATTR_RW(read_ahead_kb), +- __ATTR_RW(min_ratio), +- __ATTR_RW(max_ratio), +- __ATTR_RO(stable_pages_required), +- __ATTR_NULL, ++static struct attribute *bdi_dev_attrs[] = { ++ &dev_attr_read_ahead_kb.attr, ++ &dev_attr_min_ratio.attr, ++ &dev_attr_max_ratio.attr, ++ &dev_attr_stable_pages_required.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(bdi_dev); + + static __init int bdi_class_init(void) + { +@@ -246,7 +249,7 @@ static __init int bdi_class_init(void) + if (IS_ERR(bdi_class)) + return PTR_ERR(bdi_class); + +- bdi_class->dev_attrs = bdi_dev_attrs; ++ bdi_class->dev_groups = bdi_dev_groups; + bdi_debug_init(); + return 0; + } diff --git a/d5.patch b/d5.patch new file mode 100644 index 00000000000000..ae3bd2dd4a842f --- /dev/null +++ b/d5.patch @@ -0,0 +1,1272 @@ +--- + drivers/scsi/osd/osd_uld.c | 13 +-- + drivers/scsi/sd.c | 147 ++++++++++++++++++------------------ + drivers/scsi/st.c | 25 +++--- + drivers/video/backlight/backlight.c | 44 +++++----- + drivers/video/backlight/lcd.c | 26 +++--- + drivers/video/output.c | 20 ++-- + net/core/net-sysfs.c | 134 ++++++++++++++++++-------------- + net/ieee802154/wpan-class.c | 21 ++--- + net/rfkill/core.c | 88 +++++++++------------ + net/wireless/sysfs.c | 23 +++-- + 10 files changed, 285 insertions(+), 256 deletions(-) + +--- a/drivers/scsi/osd/osd_uld.c ++++ b/drivers/scsi/osd/osd_uld.c +@@ -107,6 +107,7 @@ static ssize_t osdname_show(struct devic + class_dev); + return sprintf(buf, "%s\n", ould->odi.osdname); + } ++static DEVICE_ATTR_RO(osdname); + + static ssize_t systemid_show(struct device *dev, struct device_attribute *attr, + char *buf) +@@ -117,17 +118,19 @@ static ssize_t systemid_show(struct devi + memcpy(buf, ould->odi.systemid, ould->odi.systemid_len); + return ould->odi.systemid_len; + } ++static DEVICE_ATTR_RO(systemid); + +-static struct device_attribute osd_uld_attrs[] = { +- __ATTR(osdname, S_IRUGO, osdname_show, NULL), +- __ATTR(systemid, S_IRUGO, systemid_show, NULL), +- __ATTR_NULL, ++static struct attribute *osd_uld_attrs[] = { ++ &dev_attr_osdname.attr, ++ &dev_attr_systemid.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(osd_uld); + + static struct class osd_uld_class = { + .owner = THIS_MODULE, + .name = "scsi_osd", +- .dev_attrs = osd_uld_attrs, ++ .dev_groups = osd_uld_groups, + }; + + /* +--- a/drivers/scsi/sd.c ++++ b/drivers/scsi/sd.c +@@ -132,8 +132,8 @@ static const char *sd_cache_types[] = { + }; + + static ssize_t +-sd_store_cache_type(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t count) ++cache_type_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + int i, ct = -1, rcd, wce, sp; + struct scsi_disk *sdkp = to_scsi_disk(dev); +@@ -199,8 +199,18 @@ sd_store_cache_type(struct device *dev, + } + + static ssize_t +-sd_store_manage_start_stop(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t count) ++manage_start_stop_show(struct device *dev, struct device_attribute *attr, ++ char *buf) ++{ ++ struct scsi_disk *sdkp = to_scsi_disk(dev); ++ struct scsi_device *sdp = sdkp->device; ++ ++ return snprintf(buf, 20, "%u\n", sdp->manage_start_stop); ++} ++ ++static ssize_t ++manage_start_stop_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + struct scsi_device *sdp = sdkp->device; +@@ -212,10 +222,19 @@ sd_store_manage_start_stop(struct device + + return count; + } ++static DEVICE_ATTR_RW(manage_start_stop); ++ ++static ssize_t ++allow_restart_show(struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ struct scsi_disk *sdkp = to_scsi_disk(dev); ++ ++ return snprintf(buf, 40, "%d\n", sdkp->device->allow_restart); ++} + + static ssize_t +-sd_store_allow_restart(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t count) ++allow_restart_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + struct scsi_device *sdp = sdkp->device; +@@ -230,47 +249,30 @@ sd_store_allow_restart(struct device *de + + return count; + } ++static DEVICE_ATTR_RW(allow_restart); + + static ssize_t +-sd_show_cache_type(struct device *dev, struct device_attribute *attr, +- char *buf) ++cache_type_show(struct device *dev, struct device_attribute *attr, char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + int ct = sdkp->RCD + 2*sdkp->WCE; + + return snprintf(buf, 40, "%s\n", sd_cache_types[ct]); + } ++static DEVICE_ATTR_RW(cache_type); + + static ssize_t +-sd_show_fua(struct device *dev, struct device_attribute *attr, char *buf) ++FUA_show(struct device *dev, struct device_attribute *attr, char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + + return snprintf(buf, 20, "%u\n", sdkp->DPOFUA); + } ++static DEVICE_ATTR_RO(FUA); + + static ssize_t +-sd_show_manage_start_stop(struct device *dev, struct device_attribute *attr, +- char *buf) +-{ +- struct scsi_disk *sdkp = to_scsi_disk(dev); +- struct scsi_device *sdp = sdkp->device; +- +- return snprintf(buf, 20, "%u\n", sdp->manage_start_stop); +-} +- +-static ssize_t +-sd_show_allow_restart(struct device *dev, struct device_attribute *attr, +- char *buf) +-{ +- struct scsi_disk *sdkp = to_scsi_disk(dev); +- +- return snprintf(buf, 40, "%d\n", sdkp->device->allow_restart); +-} +- +-static ssize_t +-sd_show_protection_type(struct device *dev, struct device_attribute *attr, +- char *buf) ++protection_type_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + +@@ -278,8 +280,8 @@ sd_show_protection_type(struct device *d + } + + static ssize_t +-sd_store_protection_type(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t count) ++protection_type_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + unsigned int val; +@@ -298,10 +300,11 @@ sd_store_protection_type(struct device * + + return count; + } ++static DEVICE_ATTR_RW(protection_type); + + static ssize_t +-sd_show_protection_mode(struct device *dev, struct device_attribute *attr, +- char *buf) ++protection_mode_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + struct scsi_device *sdp = sdkp->device; +@@ -320,24 +323,26 @@ sd_show_protection_mode(struct device *d + + return snprintf(buf, 20, "%s%u\n", dix ? "dix" : "dif", dif); + } ++static DEVICE_ATTR_RO(protection_mode); + + static ssize_t +-sd_show_app_tag_own(struct device *dev, struct device_attribute *attr, +- char *buf) ++app_tag_own_show(struct device *dev, struct device_attribute *attr, char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + + return snprintf(buf, 20, "%u\n", sdkp->ATO); + } ++static DEVICE_ATTR_RO(app_tag_own); + + static ssize_t +-sd_show_thin_provisioning(struct device *dev, struct device_attribute *attr, +- char *buf) ++thin_provisioning_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + + return snprintf(buf, 20, "%u\n", sdkp->lbpme); + } ++static DEVICE_ATTR_RO(thin_provisioning); + + static const char *lbp_mode[] = { + [SD_LBP_FULL] = "full", +@@ -349,8 +354,8 @@ static const char *lbp_mode[] = { + }; + + static ssize_t +-sd_show_provisioning_mode(struct device *dev, struct device_attribute *attr, +- char *buf) ++provisioning_mode_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + +@@ -358,8 +363,8 @@ sd_show_provisioning_mode(struct device + } + + static ssize_t +-sd_store_provisioning_mode(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t count) ++provisioning_mode_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + struct scsi_device *sdp = sdkp->device; +@@ -385,10 +390,11 @@ sd_store_provisioning_mode(struct device + + return count; + } ++static DEVICE_ATTR_RW(provisioning_mode); + + static ssize_t +-sd_show_max_medium_access_timeouts(struct device *dev, +- struct device_attribute *attr, char *buf) ++max_medium_access_timeouts_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + +@@ -396,9 +402,9 @@ sd_show_max_medium_access_timeouts(struc + } + + static ssize_t +-sd_store_max_medium_access_timeouts(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) ++max_medium_access_timeouts_store(struct device *dev, ++ struct device_attribute *attr, const char *buf, ++ size_t count) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + int err; +@@ -410,10 +416,11 @@ sd_store_max_medium_access_timeouts(stru + + return err ? err : count; + } ++static DEVICE_ATTR_RW(max_medium_access_timeouts); + + static ssize_t +-sd_show_write_same_blocks(struct device *dev, struct device_attribute *attr, +- char *buf) ++max_write_same_blocks_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + +@@ -421,8 +428,8 @@ sd_show_write_same_blocks(struct device + } + + static ssize_t +-sd_store_write_same_blocks(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t count) ++max_write_same_blocks_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + struct scsi_disk *sdkp = to_scsi_disk(dev); + struct scsi_device *sdp = sdkp->device; +@@ -451,35 +458,29 @@ sd_store_write_same_blocks(struct device + + return count; + } ++static DEVICE_ATTR_RW(max_write_same_blocks); + +-static struct device_attribute sd_disk_attrs[] = { +- __ATTR(cache_type, S_IRUGO|S_IWUSR, sd_show_cache_type, +- sd_store_cache_type), +- __ATTR(FUA, S_IRUGO, sd_show_fua, NULL), +- __ATTR(allow_restart, S_IRUGO|S_IWUSR, sd_show_allow_restart, +- sd_store_allow_restart), +- __ATTR(manage_start_stop, S_IRUGO|S_IWUSR, sd_show_manage_start_stop, +- sd_store_manage_start_stop), +- __ATTR(protection_type, S_IRUGO|S_IWUSR, sd_show_protection_type, +- sd_store_protection_type), +- __ATTR(protection_mode, S_IRUGO, sd_show_protection_mode, NULL), +- __ATTR(app_tag_own, S_IRUGO, sd_show_app_tag_own, NULL), +- __ATTR(thin_provisioning, S_IRUGO, sd_show_thin_provisioning, NULL), +- __ATTR(provisioning_mode, S_IRUGO|S_IWUSR, sd_show_provisioning_mode, +- sd_store_provisioning_mode), +- __ATTR(max_write_same_blocks, S_IRUGO|S_IWUSR, +- sd_show_write_same_blocks, sd_store_write_same_blocks), +- __ATTR(max_medium_access_timeouts, S_IRUGO|S_IWUSR, +- sd_show_max_medium_access_timeouts, +- sd_store_max_medium_access_timeouts), +- __ATTR_NULL, ++static struct attribute *sd_disk_attrs[] = { ++ &dev_attr_cache_type.attr, ++ &dev_attr_FUA.attr, ++ &dev_attr_allow_restart.attr, ++ &dev_attr_manage_start_stop.attr, ++ &dev_attr_protection_type.attr, ++ &dev_attr_protection_mode.attr, ++ &dev_attr_app_tag_own.attr, ++ &dev_attr_thin_provisioning.attr, ++ &dev_attr_provisioning_mode.attr, ++ &dev_attr_max_write_same_blocks.attr, ++ &dev_attr_max_medium_access_timeouts.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(sd_disk); + + static struct class sd_disk_class = { + .name = "scsi_disk", + .owner = THIS_MODULE, + .dev_release = scsi_disk_release, +- .dev_attrs = sd_disk_attrs, ++ .dev_groups = sd_disk_groups, + }; + + static const struct dev_pm_ops sd_pm_ops = { +--- a/drivers/scsi/st.c ++++ b/drivers/scsi/st.c +@@ -82,7 +82,7 @@ static int try_rdio = 1; + static int try_wdio = 1; + + static struct class st_sysfs_class; +-static struct device_attribute st_dev_attrs[]; ++static const struct attribute_group *st_dev_groups[]; + + MODULE_AUTHOR("Kai Makisara"); + MODULE_DESCRIPTION("SCSI tape (st) driver"); +@@ -4274,7 +4274,7 @@ static void scsi_tape_release(struct kre + + static struct class st_sysfs_class = { + .name = "scsi_tape", +- .dev_attrs = st_dev_attrs, ++ .dev_groups = st_dev_groups, + }; + + static int __init init_st(void) +@@ -4408,6 +4408,7 @@ defined_show(struct device *dev, struct + l = snprintf(buf, PAGE_SIZE, "%d\n", STm->defined); + return l; + } ++static DEVICE_ATTR_RO(defined); + + static ssize_t + default_blksize_show(struct device *dev, struct device_attribute *attr, +@@ -4419,7 +4420,7 @@ default_blksize_show(struct device *dev, + l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_blksize); + return l; + } +- ++static DEVICE_ATTR_RO(default_blksize); + + static ssize_t + default_density_show(struct device *dev, struct device_attribute *attr, +@@ -4433,6 +4434,7 @@ default_density_show(struct device *dev, + l = snprintf(buf, PAGE_SIZE, fmt, STm->default_density); + return l; + } ++static DEVICE_ATTR_RO(default_density); + + static ssize_t + default_compression_show(struct device *dev, struct device_attribute *attr, +@@ -4444,6 +4446,7 @@ default_compression_show(struct device * + l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_compression - 1); + return l; + } ++static DEVICE_ATTR_RO(default_compression); + + static ssize_t + options_show(struct device *dev, struct device_attribute *attr, char *buf) +@@ -4472,15 +4475,17 @@ options_show(struct device *dev, struct + l = snprintf(buf, PAGE_SIZE, "0x%08x\n", options); + return l; + } ++static DEVICE_ATTR_RO(options); + +-static struct device_attribute st_dev_attrs[] = { +- __ATTR_RO(defined), +- __ATTR_RO(default_blksize), +- __ATTR_RO(default_density), +- __ATTR_RO(default_compression), +- __ATTR_RO(options), +- __ATTR_NULL, ++static struct attribute *st_dev_attrs[] = { ++ &dev_attr_defined.attr, ++ &dev_attr_default_blksize.attr, ++ &dev_attr_default_density.attr, ++ &dev_attr_default_compression.attr, ++ &dev_attr_options.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(st_dev); + + /* The following functions may be useful for a larger audience. */ + static int sgl_map_user_pages(struct st_buffer *STbp, +--- a/drivers/video/backlight/backlight.c ++++ b/drivers/video/backlight/backlight.c +@@ -103,16 +103,16 @@ static void backlight_generate_event(str + sysfs_notify(&bd->dev.kobj, NULL, "actual_brightness"); + } + +-static ssize_t backlight_show_power(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t bl_power_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct backlight_device *bd = to_backlight_device(dev); + + return sprintf(buf, "%d\n", bd->props.power); + } + +-static ssize_t backlight_store_power(struct device *dev, +- struct device_attribute *attr, const char *buf, size_t count) ++static ssize_t bl_power_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + int rc; + struct backlight_device *bd = to_backlight_device(dev); +@@ -136,8 +136,9 @@ static ssize_t backlight_store_power(str + + return rc; + } ++static DEVICE_ATTR_RW(bl_power); + +-static ssize_t backlight_show_brightness(struct device *dev, ++static ssize_t brightness_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct backlight_device *bd = to_backlight_device(dev); +@@ -145,7 +146,7 @@ static ssize_t backlight_show_brightness + return sprintf(buf, "%d\n", bd->props.brightness); + } + +-static ssize_t backlight_store_brightness(struct device *dev, ++static ssize_t brightness_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) + { + int rc; +@@ -175,24 +176,27 @@ static ssize_t backlight_store_brightnes + + return rc; + } ++static DEVICE_ATTR_RW(brightness); + +-static ssize_t backlight_show_type(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t type_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct backlight_device *bd = to_backlight_device(dev); + + return sprintf(buf, "%s\n", backlight_types[bd->props.type]); + } ++static DEVICE_ATTR_RO(type); + +-static ssize_t backlight_show_max_brightness(struct device *dev, ++static ssize_t max_brightness_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct backlight_device *bd = to_backlight_device(dev); + + return sprintf(buf, "%d\n", bd->props.max_brightness); + } ++static DEVICE_ATTR_RO(max_brightness); + +-static ssize_t backlight_show_actual_brightness(struct device *dev, ++static ssize_t actual_brightness_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + int rc = -ENXIO; +@@ -205,6 +209,7 @@ static ssize_t backlight_show_actual_bri + + return rc; + } ++static DEVICE_ATTR_RO(actual_brightness); + + static struct class *backlight_class; + +@@ -247,16 +252,15 @@ static void bl_device_release(struct dev + kfree(bd); + } + +-static struct device_attribute bl_device_attributes[] = { +- __ATTR(bl_power, 0644, backlight_show_power, backlight_store_power), +- __ATTR(brightness, 0644, backlight_show_brightness, +- backlight_store_brightness), +- __ATTR(actual_brightness, 0444, backlight_show_actual_brightness, +- NULL), +- __ATTR(max_brightness, 0444, backlight_show_max_brightness, NULL), +- __ATTR(type, 0444, backlight_show_type, NULL), +- __ATTR_NULL, ++static struct attribute *bl_device_attrs[] = { ++ &dev_attr_bl_power.attr, ++ &dev_attr_brightness.attr, ++ &dev_attr_actual_brightness.attr, ++ &dev_attr_max_brightness.attr, ++ &dev_attr_type.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(bl_device); + + /** + * backlight_force_update - tell the backlight subsystem that hardware state +@@ -493,7 +497,7 @@ static int __init backlight_class_init(v + return PTR_ERR(backlight_class); + } + +- backlight_class->dev_attrs = bl_device_attributes; ++ backlight_class->dev_groups = bl_device_groups; + backlight_class->pm = &backlight_class_dev_pm_ops; + return 0; + } +--- a/drivers/video/backlight/lcd.c ++++ b/drivers/video/backlight/lcd.c +@@ -89,7 +89,7 @@ static inline void lcd_unregister_fb(str + } + #endif /* CONFIG_FB */ + +-static ssize_t lcd_show_power(struct device *dev, struct device_attribute *attr, ++static ssize_t lcd_power_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + int rc; +@@ -105,7 +105,7 @@ static ssize_t lcd_show_power(struct dev + return rc; + } + +-static ssize_t lcd_store_power(struct device *dev, ++static ssize_t lcd_power_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) + { + int rc; +@@ -128,8 +128,9 @@ static ssize_t lcd_store_power(struct de + + return rc; + } ++static DEVICE_ATTR_RW(lcd_power); + +-static ssize_t lcd_show_contrast(struct device *dev, ++static ssize_t contrast_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + int rc = -ENXIO; +@@ -143,7 +144,7 @@ static ssize_t lcd_show_contrast(struct + return rc; + } + +-static ssize_t lcd_store_contrast(struct device *dev, ++static ssize_t contrast_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) + { + int rc; +@@ -166,14 +167,16 @@ static ssize_t lcd_store_contrast(struct + + return rc; + } ++static DEVICE_ATTR_RW(contrast); + +-static ssize_t lcd_show_max_contrast(struct device *dev, ++static ssize_t max_contrast_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct lcd_device *ld = to_lcd_device(dev); + + return sprintf(buf, "%d\n", ld->props.max_contrast); + } ++static DEVICE_ATTR_RO(max_contrast); + + static struct class *lcd_class; + +@@ -183,12 +186,13 @@ static void lcd_device_release(struct de + kfree(ld); + } + +-static struct device_attribute lcd_device_attributes[] = { +- __ATTR(lcd_power, 0644, lcd_show_power, lcd_store_power), +- __ATTR(contrast, 0644, lcd_show_contrast, lcd_store_contrast), +- __ATTR(max_contrast, 0444, lcd_show_max_contrast, NULL), +- __ATTR_NULL, ++static struct attribute *lcd_device_attrs[] = { ++ &dev_attr_lcd_power.attr, ++ &dev_attr_contrast.attr, ++ &dev_attr_max_contrast.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(lcd_device); + + /** + * lcd_device_register - register a new object of lcd_device class. +@@ -344,7 +348,7 @@ static int __init lcd_class_init(void) + return PTR_ERR(lcd_class); + } + +- lcd_class->dev_attrs = lcd_device_attributes; ++ lcd_class->dev_groups = lcd_device_groups; + return 0; + } + +--- a/drivers/video/output.c ++++ b/drivers/video/output.c +@@ -32,8 +32,8 @@ MODULE_DESCRIPTION("Display Output Switc + MODULE_LICENSE("GPL"); + MODULE_AUTHOR("Luming Yu <luming.yu@intel.com>"); + +-static ssize_t video_output_show_state(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t state_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + ssize_t ret_size = 0; + struct output_device *od = to_output_device(dev); +@@ -42,9 +42,8 @@ static ssize_t video_output_show_state(s + return ret_size; + } + +-static ssize_t video_output_store_state(struct device *dev, +- struct device_attribute *attr, +- const char *buf,size_t count) ++static ssize_t state_store(struct device *dev, struct device_attribute *attr, ++ const char *buf,size_t count) + { + char *endp; + struct output_device *od = to_output_device(dev); +@@ -62,6 +61,7 @@ static ssize_t video_output_store_state( + } + return count; + } ++static DEVICE_ATTR_RW(state); + + static void video_output_release(struct device *dev) + { +@@ -69,16 +69,16 @@ static void video_output_release(struct + kfree(od); + } + +-static struct device_attribute video_output_attributes[] = { +- __ATTR(state, 0644, video_output_show_state, video_output_store_state), +- __ATTR_NULL, ++static struct attribute *video_output_attrs[] = { ++ &dev_attr_state.attr, ++ NULL, + }; +- ++ATTRIBUTE_GROUPS(video_output); + + static struct class video_output_class = { + .name = "video_output", + .dev_release = video_output_release, +- .dev_attrs = video_output_attributes, ++ .dev_groups = video_output_groups, + }; + + struct output_device *video_output_register(const char *name, +--- a/net/core/net-sysfs.c ++++ b/net/core/net-sysfs.c +@@ -60,12 +60,19 @@ static ssize_t format_##field(const stru + { \ + return sprintf(buf, format_string, net->field); \ + } \ +-static ssize_t show_##field(struct device *dev, \ ++static ssize_t field##_show(struct device *dev, \ + struct device_attribute *attr, char *buf) \ + { \ + return netdev_show(dev, attr, buf, format_##field); \ +-} ++} \ + ++#define NETDEVICE_SHOW_RO(field, format_string) \ ++NETDEVICE_SHOW(field, format_string); \ ++static DEVICE_ATTR_RO(field) ++ ++#define NETDEVICE_SHOW_RW(field, format_string) \ ++NETDEVICE_SHOW(field, format_string); \ ++static DEVICE_ATTR_RW(field) + + /* use same locking and permission rules as SIF* ioctl's */ + static ssize_t netdev_store(struct device *dev, struct device_attribute *attr, +@@ -96,16 +103,16 @@ static ssize_t netdev_store(struct devic + return ret; + } + +-NETDEVICE_SHOW(dev_id, fmt_hex); +-NETDEVICE_SHOW(addr_assign_type, fmt_dec); +-NETDEVICE_SHOW(addr_len, fmt_dec); +-NETDEVICE_SHOW(iflink, fmt_dec); +-NETDEVICE_SHOW(ifindex, fmt_dec); +-NETDEVICE_SHOW(type, fmt_dec); +-NETDEVICE_SHOW(link_mode, fmt_dec); ++NETDEVICE_SHOW_RO(dev_id, fmt_hex); ++NETDEVICE_SHOW_RO(addr_assign_type, fmt_dec); ++NETDEVICE_SHOW_RO(addr_len, fmt_dec); ++NETDEVICE_SHOW_RO(iflink, fmt_dec); ++NETDEVICE_SHOW_RO(ifindex, fmt_dec); ++NETDEVICE_SHOW_RO(type, fmt_dec); ++NETDEVICE_SHOW_RO(link_mode, fmt_dec); + + /* use same locking rules as GIFHWADDR ioctl's */ +-static ssize_t show_address(struct device *dev, struct device_attribute *attr, ++static ssize_t address_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + struct net_device *net = to_net_dev(dev); +@@ -117,15 +124,17 @@ static ssize_t show_address(struct devic + read_unlock(&dev_base_lock); + return ret; + } ++static DEVICE_ATTR_RO(address); + +-static ssize_t show_broadcast(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t broadcast_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct net_device *net = to_net_dev(dev); + if (dev_isalive(net)) + return sysfs_format_mac(buf, net->broadcast, net->addr_len); + return -EINVAL; + } ++static DEVICE_ATTR_RO(broadcast); + + static int change_carrier(struct net_device *net, unsigned long new_carrier) + { +@@ -134,13 +143,13 @@ static int change_carrier(struct net_dev + return dev_change_carrier(net, (bool) new_carrier); + } + +-static ssize_t store_carrier(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t len) ++static ssize_t carrier_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t len) + { + return netdev_store(dev, attr, buf, len, change_carrier); + } + +-static ssize_t show_carrier(struct device *dev, ++static ssize_t carrier_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct net_device *netdev = to_net_dev(dev); +@@ -149,8 +158,9 @@ static ssize_t show_carrier(struct devic + } + return -EINVAL; + } ++static DEVICE_ATTR_RW(carrier); + +-static ssize_t show_speed(struct device *dev, ++static ssize_t speed_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct net_device *netdev = to_net_dev(dev); +@@ -167,8 +177,9 @@ static ssize_t show_speed(struct device + rtnl_unlock(); + return ret; + } ++static DEVICE_ATTR_RO(speed); + +-static ssize_t show_duplex(struct device *dev, ++static ssize_t duplex_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct net_device *netdev = to_net_dev(dev); +@@ -198,8 +209,9 @@ static ssize_t show_duplex(struct device + rtnl_unlock(); + return ret; + } ++static DEVICE_ATTR_RO(duplex); + +-static ssize_t show_dormant(struct device *dev, ++static ssize_t dormant_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct net_device *netdev = to_net_dev(dev); +@@ -209,6 +221,7 @@ static ssize_t show_dormant(struct devic + + return -EINVAL; + } ++static DEVICE_ATTR_RO(dormant); + + static const char *const operstates[] = { + "unknown", +@@ -220,7 +233,7 @@ static const char *const operstates[] = + "up" + }; + +-static ssize_t show_operstate(struct device *dev, ++static ssize_t operstate_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + const struct net_device *netdev = to_net_dev(dev); +@@ -237,35 +250,33 @@ static ssize_t show_operstate(struct dev + + return sprintf(buf, "%s\n", operstates[operstate]); + } ++static DEVICE_ATTR_RO(operstate); + + /* read-write attributes */ +-NETDEVICE_SHOW(mtu, fmt_dec); + + static int change_mtu(struct net_device *net, unsigned long new_mtu) + { + return dev_set_mtu(net, (int) new_mtu); + } + +-static ssize_t store_mtu(struct device *dev, struct device_attribute *attr, ++static ssize_t mtu_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t len) + { + return netdev_store(dev, attr, buf, len, change_mtu); + } +- +-NETDEVICE_SHOW(flags, fmt_hex); ++NETDEVICE_SHOW_RW(mtu, fmt_dec); + + static int change_flags(struct net_device *net, unsigned long new_flags) + { + return dev_change_flags(net, (unsigned int) new_flags); + } + +-static ssize_t store_flags(struct device *dev, struct device_attribute *attr, ++static ssize_t flags_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t len) + { + return netdev_store(dev, attr, buf, len, change_flags); + } +- +-NETDEVICE_SHOW(tx_queue_len, fmt_ulong); ++NETDEVICE_SHOW_RW(flags, fmt_hex); + + static int change_tx_queue_len(struct net_device *net, unsigned long new_len) + { +@@ -273,7 +284,7 @@ static int change_tx_queue_len(struct ne + return 0; + } + +-static ssize_t store_tx_queue_len(struct device *dev, ++static ssize_t tx_queue_len_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) + { +@@ -282,8 +293,9 @@ static ssize_t store_tx_queue_len(struct + + return netdev_store(dev, attr, buf, len, change_tx_queue_len); + } ++NETDEVICE_SHOW_RW(tx_queue_len, fmt_ulong); + +-static ssize_t store_ifalias(struct device *dev, struct device_attribute *attr, ++static ssize_t ifalias_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t len) + { + struct net_device *netdev = to_net_dev(dev); +@@ -306,7 +318,7 @@ static ssize_t store_ifalias(struct devi + return ret < 0 ? ret : len; + } + +-static ssize_t show_ifalias(struct device *dev, ++static ssize_t ifalias_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + const struct net_device *netdev = to_net_dev(dev); +@@ -319,8 +331,7 @@ static ssize_t show_ifalias(struct devic + rtnl_unlock(); + return ret; + } +- +-NETDEVICE_SHOW(group, fmt_dec); ++static DEVICE_ATTR_RW(ifalias); + + static int change_group(struct net_device *net, unsigned long new_group) + { +@@ -328,35 +339,37 @@ static int change_group(struct net_devic + return 0; + } + +-static ssize_t store_group(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t len) ++static ssize_t group_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t len) + { + return netdev_store(dev, attr, buf, len, change_group); + } ++NETDEVICE_SHOW(group, fmt_dec); ++static DEVICE_ATTR(netdev_group, S_IRUGO | S_IWUSR, group_show, group_store); + +-static struct device_attribute net_class_attributes[] = { +- __ATTR(addr_assign_type, S_IRUGO, show_addr_assign_type, NULL), +- __ATTR(addr_len, S_IRUGO, show_addr_len, NULL), +- __ATTR(dev_id, S_IRUGO, show_dev_id, NULL), +- __ATTR(ifalias, S_IRUGO | S_IWUSR, show_ifalias, store_ifalias), +- __ATTR(iflink, S_IRUGO, show_iflink, NULL), +- __ATTR(ifindex, S_IRUGO, show_ifindex, NULL), +- __ATTR(type, S_IRUGO, show_type, NULL), +- __ATTR(link_mode, S_IRUGO, show_link_mode, NULL), +- __ATTR(address, S_IRUGO, show_address, NULL), +- __ATTR(broadcast, S_IRUGO, show_broadcast, NULL), +- __ATTR(carrier, S_IRUGO | S_IWUSR, show_carrier, store_carrier), +- __ATTR(speed, S_IRUGO, show_speed, NULL), +- __ATTR(duplex, S_IRUGO, show_duplex, NULL), +- __ATTR(dormant, S_IRUGO, show_dormant, NULL), +- __ATTR(operstate, S_IRUGO, show_operstate, NULL), +- __ATTR(mtu, S_IRUGO | S_IWUSR, show_mtu, store_mtu), +- __ATTR(flags, S_IRUGO | S_IWUSR, show_flags, store_flags), +- __ATTR(tx_queue_len, S_IRUGO | S_IWUSR, show_tx_queue_len, +- store_tx_queue_len), +- __ATTR(netdev_group, S_IRUGO | S_IWUSR, show_group, store_group), +- {} ++static struct attribute *net_class_attrs[] = { ++ &dev_attr_netdev_group.attr, ++ &dev_attr_type.attr, ++ &dev_attr_dev_id.attr, ++ &dev_attr_iflink.attr, ++ &dev_attr_ifindex.attr, ++ &dev_attr_addr_assign_type.attr, ++ &dev_attr_addr_len.attr, ++ &dev_attr_link_mode.attr, ++ &dev_attr_address.attr, ++ &dev_attr_broadcast.attr, ++ &dev_attr_speed.attr, ++ &dev_attr_duplex.attr, ++ &dev_attr_dormant.attr, ++ &dev_attr_operstate.attr, ++ &dev_attr_ifalias.attr, ++ &dev_attr_carrier.attr, ++ &dev_attr_mtu.attr, ++ &dev_attr_flags.attr, ++ &dev_attr_tx_queue_len.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(net_class); + + /* Show a given an attribute in the statistics group */ + static ssize_t netstat_show(const struct device *d, +@@ -382,13 +395,13 @@ static ssize_t netstat_show(const struct + + /* generate a read-only statistics attribute */ + #define NETSTAT_ENTRY(name) \ +-static ssize_t show_##name(struct device *d, \ ++static ssize_t name##_show(struct device *d, \ + struct device_attribute *attr, char *buf) \ + { \ + return netstat_show(d, attr, buf, \ + offsetof(struct rtnl_link_stats64, name)); \ + } \ +-static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL) ++static DEVICE_ATTR_RO(name) + + NETSTAT_ENTRY(rx_packets); + NETSTAT_ENTRY(tx_packets); +@@ -457,6 +470,9 @@ static struct attribute_group wireless_g + .attrs = wireless_attrs, + }; + #endif ++ ++#else /* CONFIG_SYSFS */ ++#define net_class_groups NULL + #endif /* CONFIG_SYSFS */ + + #ifdef CONFIG_RPS +@@ -1229,9 +1245,7 @@ static const void *net_namespace(struct + static struct class net_class = { + .name = "net", + .dev_release = netdev_release, +-#ifdef CONFIG_SYSFS +- .dev_attrs = net_class_attributes, +-#endif /* CONFIG_SYSFS */ ++ .dev_groups = net_class_groups, + .dev_uevent = netdev_uevent, + .ns_type = &net_ns_type_operations, + .namespace = net_namespace, +--- a/net/ieee802154/wpan-class.c ++++ b/net/ieee802154/wpan-class.c +@@ -36,7 +36,8 @@ static ssize_t name ## _show(struct devi + ret = snprintf(buf, PAGE_SIZE, format_string "\n", args); \ + mutex_unlock(&phy->pib_lock); \ + return ret; \ +-} ++} \ ++static DEVICE_ATTR_RO(name); + + #define MASTER_SHOW(field, format_string) \ + MASTER_SHOW_COMPLEX(field, format_string, phy->field) +@@ -66,15 +67,17 @@ static ssize_t channels_supported_show(s + mutex_unlock(&phy->pib_lock); + return len; + } ++static DEVICE_ATTR_RO(channels_supported); + +-static struct device_attribute pmib_attrs[] = { +- __ATTR_RO(current_channel), +- __ATTR_RO(current_page), +- __ATTR_RO(channels_supported), +- __ATTR_RO(transmit_power), +- __ATTR_RO(cca_mode), +- {}, ++static struct attribute *pmib_attrs[] = { ++ &dev_attr_current_channel.attr, ++ &dev_attr_current_page.attr, ++ &dev_attr_channels_supported.attr, ++ &dev_attr_transmit_power.attr, ++ &dev_attr_cca_mode.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(pmib); + + static void wpan_phy_release(struct device *d) + { +@@ -85,7 +88,7 @@ static void wpan_phy_release(struct devi + static struct class wpan_phy_class = { + .name = "ieee802154", + .dev_release = wpan_phy_release, +- .dev_attrs = pmib_attrs, ++ .dev_groups = pmib_groups, + }; + + static DEFINE_MUTEX(wpan_phy_mutex); +--- a/net/rfkill/core.c ++++ b/net/rfkill/core.c +@@ -576,14 +576,14 @@ void rfkill_set_states(struct rfkill *rf + } + EXPORT_SYMBOL(rfkill_set_states); + +-static ssize_t rfkill_name_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t name_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct rfkill *rfkill = to_rfkill(dev); + + return sprintf(buf, "%s\n", rfkill->name); + } ++static DEVICE_ATTR_RO(name); + + static const char *rfkill_get_type_str(enum rfkill_type type) + { +@@ -611,54 +611,52 @@ static const char *rfkill_get_type_str(e + } + } + +-static ssize_t rfkill_type_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t type_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct rfkill *rfkill = to_rfkill(dev); + + return sprintf(buf, "%s\n", rfkill_get_type_str(rfkill->type)); + } ++static DEVICE_ATTR_RO(type); + +-static ssize_t rfkill_idx_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t index_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct rfkill *rfkill = to_rfkill(dev); + + return sprintf(buf, "%d\n", rfkill->idx); + } ++static DEVICE_ATTR_RO(index); + +-static ssize_t rfkill_persistent_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t persistent_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct rfkill *rfkill = to_rfkill(dev); + + return sprintf(buf, "%d\n", rfkill->persistent); + } ++static DEVICE_ATTR_RO(persistent); + +-static ssize_t rfkill_hard_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t hard_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct rfkill *rfkill = to_rfkill(dev); + + return sprintf(buf, "%d\n", (rfkill->state & RFKILL_BLOCK_HW) ? 1 : 0 ); + } ++static DEVICE_ATTR_RO(hard); + +-static ssize_t rfkill_soft_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t soft_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct rfkill *rfkill = to_rfkill(dev); + + return sprintf(buf, "%d\n", (rfkill->state & RFKILL_BLOCK_SW) ? 1 : 0 ); + } + +-static ssize_t rfkill_soft_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) ++static ssize_t soft_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + struct rfkill *rfkill = to_rfkill(dev); + unsigned long state; +@@ -680,6 +678,7 @@ static ssize_t rfkill_soft_store(struct + + return count; + } ++static DEVICE_ATTR_RW(soft); + + static u8 user_state_from_blocked(unsigned long state) + { +@@ -691,18 +690,16 @@ static u8 user_state_from_blocked(unsign + return RFKILL_USER_STATE_UNBLOCKED; + } + +-static ssize_t rfkill_state_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t state_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct rfkill *rfkill = to_rfkill(dev); + + return sprintf(buf, "%d\n", user_state_from_blocked(rfkill->state)); + } + +-static ssize_t rfkill_state_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) ++static ssize_t state_store(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + struct rfkill *rfkill = to_rfkill(dev); + unsigned long state; +@@ -725,32 +722,27 @@ static ssize_t rfkill_state_store(struct + + return count; + } ++static DEVICE_ATTR_RW(state); + +-static ssize_t rfkill_claim_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t claim_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + return sprintf(buf, "%d\n", 0); + } ++static DEVICE_ATTR_RO(claim); + +-static ssize_t rfkill_claim_store(struct device *dev, +- struct device_attribute *attr, +- const char *buf, size_t count) +-{ +- return -EOPNOTSUPP; +-} +- +-static struct device_attribute rfkill_dev_attrs[] = { +- __ATTR(name, S_IRUGO, rfkill_name_show, NULL), +- __ATTR(type, S_IRUGO, rfkill_type_show, NULL), +- __ATTR(index, S_IRUGO, rfkill_idx_show, NULL), +- __ATTR(persistent, S_IRUGO, rfkill_persistent_show, NULL), +- __ATTR(state, S_IRUGO|S_IWUSR, rfkill_state_show, rfkill_state_store), +- __ATTR(claim, S_IRUGO|S_IWUSR, rfkill_claim_show, rfkill_claim_store), +- __ATTR(soft, S_IRUGO|S_IWUSR, rfkill_soft_show, rfkill_soft_store), +- __ATTR(hard, S_IRUGO, rfkill_hard_show, NULL), +- __ATTR_NULL ++static struct attribute *rfkill_dev_attrs[] = { ++ &dev_attr_name.attr, ++ &dev_attr_type.attr, ++ &dev_attr_index.attr, ++ &dev_attr_persistent.attr, ++ &dev_attr_state.attr, ++ &dev_attr_claim.attr, ++ &dev_attr_soft.attr, ++ &dev_attr_hard.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(rfkill_dev); + + static void rfkill_release(struct device *dev) + { +@@ -830,7 +822,7 @@ static int rfkill_resume(struct device * + static struct class rfkill_class = { + .name = "rfkill", + .dev_release = rfkill_release, +- .dev_attrs = rfkill_dev_attrs, ++ .dev_groups = rfkill_dev_groups, + .dev_uevent = rfkill_dev_uevent, + .suspend = rfkill_suspend, + .resume = rfkill_resume, +--- a/net/wireless/sysfs.c ++++ b/net/wireless/sysfs.c +@@ -30,7 +30,8 @@ static ssize_t name ## _show(struct devi + char *buf) \ + { \ + return sprintf(buf, fmt "\n", dev_to_rdev(dev)->member); \ +-} ++} \ ++static DEVICE_ATTR_RO(name) + + SHOW_FMT(index, "%d", wiphy_idx); + SHOW_FMT(macaddress, "%pM", wiphy.perm_addr); +@@ -42,7 +43,7 @@ static ssize_t name_show(struct device * + struct wiphy *wiphy = &dev_to_rdev(dev)->wiphy; + return sprintf(buf, "%s\n", dev_name(&wiphy->dev)); + } +- ++static DEVICE_ATTR_RO(name); + + static ssize_t addresses_show(struct device *dev, + struct device_attribute *attr, +@@ -60,15 +61,17 @@ static ssize_t addresses_show(struct dev + + return buf - start; + } ++static DEVICE_ATTR_RO(addresses); + +-static struct device_attribute ieee80211_dev_attrs[] = { +- __ATTR_RO(index), +- __ATTR_RO(macaddress), +- __ATTR_RO(address_mask), +- __ATTR_RO(addresses), +- __ATTR_RO(name), +- {} ++static struct attribute *ieee80211_attrs[] = { ++ &dev_attr_index.attr, ++ &dev_attr_macaddress.attr, ++ &dev_attr_address_mask.attr, ++ &dev_attr_addresses.attr, ++ &dev_attr_name.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(ieee80211); + + static void wiphy_dev_release(struct device *dev) + { +@@ -144,7 +147,7 @@ struct class ieee80211_class = { + .name = "ieee80211", + .owner = THIS_MODULE, + .dev_release = wiphy_dev_release, +- .dev_attrs = ieee80211_dev_attrs, ++ .dev_groups = ieee80211_groups, + .dev_uevent = wiphy_uevent, + .suspend = wiphy_suspend, + .resume = wiphy_resume, diff --git a/devfreq-convert-devfreq_class-to-use-dev_groups.patch b/devfreq-convert-devfreq_class-to-use-dev_groups.patch new file mode 100644 index 00000000000000..13a039626f758f --- /dev/null +++ b/devfreq-convert-devfreq_class-to-use-dev_groups.patch @@ -0,0 +1,199 @@ +From foo@baz Tue Jul 9 14:52:00 PDT 2013 +Date: Tue, 09 Jul 2013 14:52:00 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: devfreq: convert devfreq_class to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the devfreq_class code to use the +correct field. + +Cc: MyungJoo Ham <myungjoo.ham@samsung.com> +Cc: Kyungmin Park <kyungmin.park@samsung.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/devfreq/devfreq.c | 76 ++++++++++++++++++++++++++-------------------- + 1 file changed, 43 insertions(+), 33 deletions(-) + +--- a/drivers/devfreq/devfreq.c ++++ b/drivers/devfreq/devfreq.c +@@ -703,7 +703,7 @@ err_out: + } + EXPORT_SYMBOL(devfreq_remove_governor); + +-static ssize_t show_governor(struct device *dev, ++static ssize_t governor_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + if (!to_devfreq(dev)->governor) +@@ -712,7 +712,7 @@ static ssize_t show_governor(struct devi + return sprintf(buf, "%s\n", to_devfreq(dev)->governor->name); + } + +-static ssize_t store_governor(struct device *dev, struct device_attribute *attr, ++static ssize_t governor_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) + { + struct devfreq *df = to_devfreq(dev); +@@ -754,9 +754,11 @@ out: + ret = count; + return ret; + } +-static ssize_t show_available_governors(struct device *d, +- struct device_attribute *attr, +- char *buf) ++static DEVICE_ATTR_RW(governor); ++ ++static ssize_t available_governors_show(struct device *d, ++ struct device_attribute *attr, ++ char *buf) + { + struct devfreq_governor *tmp_governor; + ssize_t count = 0; +@@ -775,9 +777,10 @@ static ssize_t show_available_governors( + + return count; + } ++static DEVICE_ATTR_RO(available_governors); + +-static ssize_t show_freq(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t cur_freq_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + unsigned long freq; + struct devfreq *devfreq = to_devfreq(dev); +@@ -788,20 +791,22 @@ static ssize_t show_freq(struct device * + + return sprintf(buf, "%lu\n", devfreq->previous_freq); + } ++static DEVICE_ATTR_RO(cur_freq); + +-static ssize_t show_target_freq(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t target_freq_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + return sprintf(buf, "%lu\n", to_devfreq(dev)->previous_freq); + } ++static DEVICE_ATTR_RO(target_freq); + +-static ssize_t show_polling_interval(struct device *dev, ++static ssize_t polling_interval_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + return sprintf(buf, "%d\n", to_devfreq(dev)->profile->polling_ms); + } + +-static ssize_t store_polling_interval(struct device *dev, ++static ssize_t polling_interval_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) + { +@@ -821,8 +826,9 @@ static ssize_t store_polling_interval(st + + return ret; + } ++static DEVICE_ATTR_RW(polling_interval); + +-static ssize_t store_min_freq(struct device *dev, struct device_attribute *attr, ++static ssize_t min_freq_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) + { + struct devfreq *df = to_devfreq(dev); +@@ -849,13 +855,13 @@ unlock: + return ret; + } + +-static ssize_t show_min_freq(struct device *dev, struct device_attribute *attr, ++static ssize_t min_freq_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + return sprintf(buf, "%lu\n", to_devfreq(dev)->min_freq); + } + +-static ssize_t store_max_freq(struct device *dev, struct device_attribute *attr, ++static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) + { + struct devfreq *df = to_devfreq(dev); +@@ -881,16 +887,18 @@ unlock: + mutex_unlock(&df->lock); + return ret; + } ++static DEVICE_ATTR_RW(min_freq); + +-static ssize_t show_max_freq(struct device *dev, struct device_attribute *attr, ++static ssize_t max_freq_show(struct device *dev, struct device_attribute *attr, + char *buf) + { + return sprintf(buf, "%lu\n", to_devfreq(dev)->max_freq); + } ++static DEVICE_ATTR_RW(max_freq); + +-static ssize_t show_available_freqs(struct device *d, +- struct device_attribute *attr, +- char *buf) ++static ssize_t available_frequencies_show(struct device *d, ++ struct device_attribute *attr, ++ char *buf) + { + struct devfreq *df = to_devfreq(d); + struct device *dev = df->dev.parent; +@@ -918,9 +926,10 @@ static ssize_t show_available_freqs(stru + + return count; + } ++static DEVICE_ATTR_RO(available_frequencies); + +-static ssize_t show_trans_table(struct device *dev, struct device_attribute *attr, +- char *buf) ++static ssize_t trans_stat_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct devfreq *devfreq = to_devfreq(dev); + ssize_t len; +@@ -959,20 +968,21 @@ static ssize_t show_trans_table(struct d + devfreq->total_trans); + return len; + } ++static DEVICE_ATTR_RO(trans_stat); + +-static struct device_attribute devfreq_attrs[] = { +- __ATTR(governor, S_IRUGO | S_IWUSR, show_governor, store_governor), +- __ATTR(available_governors, S_IRUGO, show_available_governors, NULL), +- __ATTR(cur_freq, S_IRUGO, show_freq, NULL), +- __ATTR(available_frequencies, S_IRUGO, show_available_freqs, NULL), +- __ATTR(target_freq, S_IRUGO, show_target_freq, NULL), +- __ATTR(polling_interval, S_IRUGO | S_IWUSR, show_polling_interval, +- store_polling_interval), +- __ATTR(min_freq, S_IRUGO | S_IWUSR, show_min_freq, store_min_freq), +- __ATTR(max_freq, S_IRUGO | S_IWUSR, show_max_freq, store_max_freq), +- __ATTR(trans_stat, S_IRUGO, show_trans_table, NULL), +- { }, ++static struct attribute *devfreq_attrs[] = { ++ &dev_attr_governor.attr, ++ &dev_attr_available_governors.attr, ++ &dev_attr_cur_freq.attr, ++ &dev_attr_available_frequencies.attr, ++ &dev_attr_target_freq.attr, ++ &dev_attr_polling_interval.attr, ++ &dev_attr_min_freq.attr, ++ &dev_attr_max_freq.attr, ++ &dev_attr_trans_stat.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(devfreq); + + static int __init devfreq_init(void) + { +@@ -988,7 +998,7 @@ static int __init devfreq_init(void) + pr_err("%s: couldn't create workqueue\n", __FILE__); + return PTR_ERR(devfreq_wq); + } +- devfreq_class->dev_attrs = devfreq_attrs; ++ devfreq_class->dev_groups = devfreq_groups; + + return 0; + } diff --git a/dma-convert-dma_devclass-to-use-dev_groups.patch b/dma-convert-dma_devclass-to-use-dev_groups.patch new file mode 100644 index 00000000000000..759d18025cb647 --- /dev/null +++ b/dma-convert-dma_devclass-to-use-dev_groups.patch @@ -0,0 +1,84 @@ +From foo@baz Tue Jul 9 14:50:40 PDT 2013 +Date: Tue, 09 Jul 2013 14:50:40 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: dma: convert dma_devclass to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the dma dma_devclass code to use +the correct field. + +Cc: Dan Williams <djbw@fb.com> +Cc: Vinod Koul <vinod.koul@intel.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +--- + drivers/dma/dmaengine.c | 26 ++++++++++++++++---------- + 1 file changed, 16 insertions(+), 10 deletions(-) + +--- a/drivers/dma/dmaengine.c ++++ b/drivers/dma/dmaengine.c +@@ -87,7 +87,8 @@ static struct dma_chan *dev_to_dma_chan( + return chan_dev->chan; + } + +-static ssize_t show_memcpy_count(struct device *dev, struct device_attribute *attr, char *buf) ++static ssize_t memcpy_count_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct dma_chan *chan; + unsigned long count = 0; +@@ -106,9 +107,10 @@ static ssize_t show_memcpy_count(struct + + return err; + } ++static DEVICE_ATTR_RO(memcpy_count); + +-static ssize_t show_bytes_transferred(struct device *dev, struct device_attribute *attr, +- char *buf) ++static ssize_t bytes_transferred_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct dma_chan *chan; + unsigned long count = 0; +@@ -127,8 +129,10 @@ static ssize_t show_bytes_transferred(st + + return err; + } ++static DEVICE_ATTR_RO(bytes_transferred); + +-static ssize_t show_in_use(struct device *dev, struct device_attribute *attr, char *buf) ++static ssize_t in_use_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct dma_chan *chan; + int err; +@@ -143,13 +147,15 @@ static ssize_t show_in_use(struct device + + return err; + } ++static DEVICE_ATTR_RO(in_use); + +-static struct device_attribute dma_attrs[] = { +- __ATTR(memcpy_count, S_IRUGO, show_memcpy_count, NULL), +- __ATTR(bytes_transferred, S_IRUGO, show_bytes_transferred, NULL), +- __ATTR(in_use, S_IRUGO, show_in_use, NULL), +- __ATTR_NULL ++static struct attribute *dma_dev_attrs[] = { ++ &dev_attr_memcpy_count.attr, ++ &dev_attr_bytes_transferred.attr, ++ &dev_attr_in_use.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(dma_dev); + + static void chan_dev_release(struct device *dev) + { +@@ -167,7 +173,7 @@ static void chan_dev_release(struct devi + + static struct class dma_devclass = { + .name = "dma", +- .dev_attrs = dma_attrs, ++ .dev_groups = dma_dev_groups, + .dev_release = chan_dev_release, + }; + diff --git a/enclosure-convert-class-code-to-use-dev_groups.patch b/enclosure-convert-class-code-to-use-dev_groups.patch new file mode 100644 index 00000000000000..ac3d0fd0d1e22f --- /dev/null +++ b/enclosure-convert-class-code-to-use-dev_groups.patch @@ -0,0 +1,88 @@ +From foo@baz Tue Jul 9 15:11:14 PDT 2013 +Date: Tue, 09 Jul 2013 15:11:14 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: enclosure: convert class code to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the enclosure class code to use +the correct field. + +Cc: Arnd Bergmann <arnd@arndb.de> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/misc/enclosure.c | 29 +++++++++++------------------ + 1 file changed, 11 insertions(+), 18 deletions(-) + +--- a/drivers/misc/enclosure.c ++++ b/drivers/misc/enclosure.c +@@ -239,7 +239,7 @@ static void enclosure_component_release( + put_device(dev->parent); + } + +-static const struct attribute_group *enclosure_groups[]; ++static const struct attribute_group *enclosure_component_groups[]; + + /** + * enclosure_component_register - add a particular component to an enclosure +@@ -282,7 +282,7 @@ enclosure_component_register(struct encl + dev_set_name(cdev, "%u", number); + + cdev->release = enclosure_component_release; +- cdev->groups = enclosure_groups; ++ cdev->groups = enclosure_component_groups; + + err = device_register(cdev); + if (err) { +@@ -365,25 +365,26 @@ EXPORT_SYMBOL_GPL(enclosure_remove_devic + * sysfs pieces below + */ + +-static ssize_t enclosure_show_components(struct device *cdev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t components_show(struct device *cdev, ++ struct device_attribute *attr, char *buf) + { + struct enclosure_device *edev = to_enclosure_device(cdev); + + return snprintf(buf, 40, "%d\n", edev->components); + } ++static DEVICE_ATTR_RO(components); + +-static struct device_attribute enclosure_attrs[] = { +- __ATTR(components, S_IRUGO, enclosure_show_components, NULL), +- __ATTR_NULL ++static struct attribute *enclosure_class_attrs[] = { ++ &dev_attr_components.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(enclosure_class); + + static struct class enclosure_class = { + .name = "enclosure", + .owner = THIS_MODULE, + .dev_release = enclosure_release, +- .dev_attrs = enclosure_attrs, ++ .dev_groups = enclosure_class_groups, + }; + + static const char *const enclosure_status [] = { +@@ -536,15 +537,7 @@ static struct attribute *enclosure_compo + &dev_attr_type.attr, + NULL + }; +- +-static struct attribute_group enclosure_group = { +- .attrs = enclosure_component_attrs, +-}; +- +-static const struct attribute_group *enclosure_groups[] = { +- &enclosure_group, +- NULL +-}; ++ATTRIBUTE_GROUPS(enclosure_component); + + static int __init enclosure_init(void) + { diff --git a/extcon-convert-extcon_class-to-use-dev_groups.patch b/extcon-convert-extcon_class-to-use-dev_groups.patch new file mode 100644 index 00000000000000..8f4ac940be9cca --- /dev/null +++ b/extcon-convert-extcon_class-to-use-dev_groups.patch @@ -0,0 +1,62 @@ +From foo@baz Tue Jul 9 14:53:12 PDT 2013 +Date: Tue, 09 Jul 2013 14:53:12 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: extcon: convert extcon_class to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the extcon_class code to use the +correct field. + +Cc: MyungJoo Ham <myungjoo.ham@samsung.com> +Cc: Chanwoo Choi <cw00.choi@samsung.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/extcon/extcon-class.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +--- a/drivers/extcon/extcon-class.c ++++ b/drivers/extcon/extcon-class.c +@@ -148,6 +148,7 @@ static ssize_t state_store(struct device + + return count; + } ++static DEVICE_ATTR_RW(state); + + static ssize_t name_show(struct device *dev, struct device_attribute *attr, + char *buf) +@@ -163,6 +164,7 @@ static ssize_t name_show(struct device * + + return sprintf(buf, "%s\n", dev_name(edev->dev)); + } ++static DEVICE_ATTR_RO(name); + + static ssize_t cable_name_show(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -527,11 +529,12 @@ int extcon_unregister_notifier(struct ex + } + EXPORT_SYMBOL_GPL(extcon_unregister_notifier); + +-static struct device_attribute extcon_attrs[] = { +- __ATTR(state, S_IRUGO | S_IWUSR, state_show, state_store), +- __ATTR_RO(name), +- __ATTR_NULL, ++static struct attribute *extcon_attrs[] = { ++ &dev_attr_state.attr, ++ &dev_attr_name.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(extcon); + + static int create_extcon_class(void) + { +@@ -539,7 +542,7 @@ static int create_extcon_class(void) + extcon_class = class_create(THIS_MODULE, "extcon"); + if (IS_ERR(extcon_class)) + return PTR_ERR(extcon_class); +- extcon_class->dev_attrs = extcon_attrs; ++ extcon_class->dev_groups = extcon_groups; + + #if defined(CONFIG_ANDROID) + switch_class = class_compat_register("switch"); diff --git a/hid-roccat-convert-class-code-to-use-dev_groups.patch b/hid-roccat-convert-class-code-to-use-dev_groups.patch new file mode 100644 index 00000000000000..b32e5729c31eb9 --- /dev/null +++ b/hid-roccat-convert-class-code-to-use-dev_groups.patch @@ -0,0 +1,410 @@ +From foo@baz Tue Jul 9 14:54:09 PDT 2013 +Date: Tue, 09 Jul 2013 14:54:09 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: HID: roccat: convert class code to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the roccat class code to use the +correct field. + +Cc: Jiri Kosina <jkosina@suse.cz> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/hid/hid-roccat-arvo.c | 25 ++++++++++++++----------- + drivers/hid/hid-roccat-isku.c | 13 +++++++------ + drivers/hid/hid-roccat-kone.c | 30 ++++++++++++++++++------------ + drivers/hid/hid-roccat-koneplus.c | 26 +++++++++++++++----------- + drivers/hid/hid-roccat-kovaplus.c | 33 +++++++++++++++++++-------------- + drivers/hid/hid-roccat-pyra.c | 22 +++++++++++++--------- + 6 files changed, 86 insertions(+), 63 deletions(-) + +--- a/drivers/hid/hid-roccat-arvo.c ++++ b/drivers/hid/hid-roccat-arvo.c +@@ -75,6 +75,8 @@ static ssize_t arvo_sysfs_set_mode_key(s + + return size; + } ++static DEVICE_ATTR(mode_key, 0660, ++ arvo_sysfs_show_mode_key, arvo_sysfs_set_mode_key); + + static ssize_t arvo_sysfs_show_key_mask(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -123,6 +125,8 @@ static ssize_t arvo_sysfs_set_key_mask(s + + return size; + } ++static DEVICE_ATTR(key_mask, 0660, ++ arvo_sysfs_show_key_mask, arvo_sysfs_set_key_mask); + + /* retval is 1-5 on success, < 0 on error */ + static int arvo_get_actual_profile(struct usb_device *usb_dev) +@@ -179,6 +183,9 @@ static ssize_t arvo_sysfs_set_actual_pro + mutex_unlock(&arvo->arvo_lock); + return retval; + } ++static DEVICE_ATTR(actual_profile, 0660, ++ arvo_sysfs_show_actual_profile, ++ arvo_sysfs_set_actual_profile); + + static ssize_t arvo_sysfs_write(struct file *fp, + struct kobject *kobj, void const *buf, +@@ -239,17 +246,13 @@ static ssize_t arvo_sysfs_read_info(stru + sizeof(struct arvo_info), ARVO_COMMAND_INFO); + } + +- +-static struct device_attribute arvo_attributes[] = { +- __ATTR(mode_key, 0660, +- arvo_sysfs_show_mode_key, arvo_sysfs_set_mode_key), +- __ATTR(key_mask, 0660, +- arvo_sysfs_show_key_mask, arvo_sysfs_set_key_mask), +- __ATTR(actual_profile, 0660, +- arvo_sysfs_show_actual_profile, +- arvo_sysfs_set_actual_profile), +- __ATTR_NULL ++static struct attribute *arvo_attrs[] = { ++ &dev_attr_mode_key.attr, ++ &dev_attr_key_mask.attr, ++ &dev_attr_actual_profile.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(arvo); + + static struct bin_attribute arvo_bin_attributes[] = { + { +@@ -430,7 +433,7 @@ static int __init arvo_init(void) + arvo_class = class_create(THIS_MODULE, "arvo"); + if (IS_ERR(arvo_class)) + return PTR_ERR(arvo_class); +- arvo_class->dev_attrs = arvo_attributes; ++ arvo_class->dev_groups = arvo_groups; + arvo_class->dev_bin_attrs = arvo_bin_attributes; + + retval = hid_register_driver(&arvo_driver); +--- a/drivers/hid/hid-roccat-isku.c ++++ b/drivers/hid/hid-roccat-isku.c +@@ -109,13 +109,14 @@ static ssize_t isku_sysfs_set_actual_pro + + return size; + } ++static DEVICE_ATTR(actual_profile, 0660, isku_sysfs_show_actual_profile, ++ isku_sysfs_set_actual_profile); + +-static struct device_attribute isku_attributes[] = { +- __ATTR(actual_profile, 0660, +- isku_sysfs_show_actual_profile, +- isku_sysfs_set_actual_profile), +- __ATTR_NULL ++static struct attribute *isku_attrs[] = { ++ &dev_attr_actual_profile.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(isku); + + static ssize_t isku_sysfs_read(struct file *fp, struct kobject *kobj, + char *buf, loff_t off, size_t count, +@@ -427,7 +428,7 @@ static int __init isku_init(void) + isku_class = class_create(THIS_MODULE, "isku"); + if (IS_ERR(isku_class)) + return PTR_ERR(isku_class); +- isku_class->dev_attrs = isku_attributes; ++ isku_class->dev_groups = isku_groups; + isku_class->dev_bin_attrs = isku_bin_attributes; + + retval = hid_register_driver(&isku_driver); +--- a/drivers/hid/hid-roccat-kone.c ++++ b/drivers/hid/hid-roccat-kone.c +@@ -386,6 +386,7 @@ static ssize_t kone_sysfs_show_actual_pr + hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); + return snprintf(buf, PAGE_SIZE, "%d\n", kone->actual_profile); + } ++static DEVICE_ATTR(actual_profile, 0440, kone_sysfs_show_actual_profile, NULL); + + static ssize_t kone_sysfs_show_actual_dpi(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -394,6 +395,7 @@ static ssize_t kone_sysfs_show_actual_dp + hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); + return snprintf(buf, PAGE_SIZE, "%d\n", kone->actual_dpi); + } ++static DEVICE_ATTR(actual_dpi, 0440, kone_sysfs_show_actual_dpi, NULL); + + /* weight is read each time, since we don't get informed when it's changed */ + static ssize_t kone_sysfs_show_weight(struct device *dev, +@@ -416,6 +418,7 @@ static ssize_t kone_sysfs_show_weight(st + return retval; + return snprintf(buf, PAGE_SIZE, "%d\n", weight); + } ++static DEVICE_ATTR(weight, 0440, kone_sysfs_show_weight, NULL); + + static ssize_t kone_sysfs_show_firmware_version(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -424,6 +427,8 @@ static ssize_t kone_sysfs_show_firmware_ + hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); + return snprintf(buf, PAGE_SIZE, "%d\n", kone->firmware_version); + } ++static DEVICE_ATTR(firmware_version, 0440, kone_sysfs_show_firmware_version, ++ NULL); + + static ssize_t kone_sysfs_show_tcu(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -524,6 +529,7 @@ exit_unlock: + mutex_unlock(&kone->kone_lock); + return retval; + } ++static DEVICE_ATTR(tcu, 0660, kone_sysfs_show_tcu, kone_sysfs_set_tcu); + + static ssize_t kone_sysfs_show_startup_profile(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -570,15 +576,17 @@ static ssize_t kone_sysfs_set_startup_pr + mutex_unlock(&kone->kone_lock); + return size; + } ++static DEVICE_ATTR(startup_profile, 0660, kone_sysfs_show_startup_profile, ++ kone_sysfs_set_startup_profile); + +-static struct device_attribute kone_attributes[] = { ++static struct attribute *kone_attrs[] = { + /* + * Read actual dpi settings. + * Returns raw value for further processing. Refer to enum + * kone_polling_rates to get real value. + */ +- __ATTR(actual_dpi, 0440, kone_sysfs_show_actual_dpi, NULL), +- __ATTR(actual_profile, 0440, kone_sysfs_show_actual_profile, NULL), ++ &dev_attr_actual_dpi.attr, ++ &dev_attr_actual_profile.attr, + + /* + * The mouse can be equipped with one of four supplied weights from 5 +@@ -587,7 +595,7 @@ static struct device_attribute kone_attr + * by software. Refer to enum kone_weights to get corresponding real + * weight. + */ +- __ATTR(weight, 0440, kone_sysfs_show_weight, NULL), ++ &dev_attr_weight.attr, + + /* + * Prints firmware version stored in mouse as integer. +@@ -595,22 +603,20 @@ static struct device_attribute kone_attr + * to get the real version number the decimal point has to be shifted 2 + * positions to the left. E.g. a value of 138 means 1.38. + */ +- __ATTR(firmware_version, 0440, +- kone_sysfs_show_firmware_version, NULL), ++ &dev_attr_firmware_version.attr, + + /* + * Prints state of Tracking Control Unit as number where 0 = off and + * 1 = on. Writing 0 deactivates tcu and writing 1 calibrates and + * activates the tcu + */ +- __ATTR(tcu, 0660, kone_sysfs_show_tcu, kone_sysfs_set_tcu), ++ &dev_attr_tcu.attr, + + /* Prints and takes the number of the profile the mouse starts with */ +- __ATTR(startup_profile, 0660, +- kone_sysfs_show_startup_profile, +- kone_sysfs_set_startup_profile), +- __ATTR_NULL ++ &dev_attr_startup_profile.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(kone); + + static struct bin_attribute kone_bin_attributes[] = { + { +@@ -891,7 +897,7 @@ static int __init kone_init(void) + kone_class = class_create(THIS_MODULE, "kone"); + if (IS_ERR(kone_class)) + return PTR_ERR(kone_class); +- kone_class->dev_attrs = kone_attributes; ++ kone_class->dev_groups = kone_groups; + kone_class->dev_bin_attrs = kone_bin_attributes; + + retval = hid_register_driver(&kone_driver); +--- a/drivers/hid/hid-roccat-koneplus.c ++++ b/drivers/hid/hid-roccat-koneplus.c +@@ -274,6 +274,12 @@ static ssize_t koneplus_sysfs_set_actual + + return size; + } ++static DEVICE_ATTR(actual_profile, 0660, ++ koneplus_sysfs_show_actual_profile, ++ koneplus_sysfs_set_actual_profile); ++static DEVICE_ATTR(startup_profile, 0660, ++ koneplus_sysfs_show_actual_profile, ++ koneplus_sysfs_set_actual_profile); + + static ssize_t koneplus_sysfs_show_firmware_version(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -293,18 +299,16 @@ static ssize_t koneplus_sysfs_show_firmw + + return snprintf(buf, PAGE_SIZE, "%d\n", info.firmware_version); + } ++static DEVICE_ATTR(firmware_version, 0440, ++ koneplus_sysfs_show_firmware_version, NULL); + +-static struct device_attribute koneplus_attributes[] = { +- __ATTR(actual_profile, 0660, +- koneplus_sysfs_show_actual_profile, +- koneplus_sysfs_set_actual_profile), +- __ATTR(startup_profile, 0660, +- koneplus_sysfs_show_actual_profile, +- koneplus_sysfs_set_actual_profile), +- __ATTR(firmware_version, 0440, +- koneplus_sysfs_show_firmware_version, NULL), +- __ATTR_NULL ++static struct attribute *koneplus_attrs[] = { ++ &dev_attr_actual_profile.attr, ++ &dev_attr_startup_profile.attr, ++ &dev_attr_firmware_version.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(koneplus); + + static struct bin_attribute koneplus_bin_attributes[] = { + KONEPLUS_BIN_ATTRIBUTE_W(control, CONTROL), +@@ -572,7 +576,7 @@ static int __init koneplus_init(void) + koneplus_class = class_create(THIS_MODULE, "koneplus"); + if (IS_ERR(koneplus_class)) + return PTR_ERR(koneplus_class); +- koneplus_class->dev_attrs = koneplus_attributes; ++ koneplus_class->dev_groups = koneplus_groups; + koneplus_class->dev_bin_attrs = koneplus_bin_attributes; + + retval = hid_register_driver(&koneplus_driver); +--- a/drivers/hid/hid-roccat-kovaplus.c ++++ b/drivers/hid/hid-roccat-kovaplus.c +@@ -310,6 +310,9 @@ static ssize_t kovaplus_sysfs_set_actual + + return size; + } ++static DEVICE_ATTR(actual_profile, 0660, ++ kovaplus_sysfs_show_actual_profile, ++ kovaplus_sysfs_set_actual_profile); + + static ssize_t kovaplus_sysfs_show_actual_cpi(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -318,6 +321,7 @@ static ssize_t kovaplus_sysfs_show_actua + hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); + return snprintf(buf, PAGE_SIZE, "%d\n", kovaplus->actual_cpi); + } ++static DEVICE_ATTR(actual_cpi, 0440, kovaplus_sysfs_show_actual_cpi, NULL); + + static ssize_t kovaplus_sysfs_show_actual_sensitivity_x(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -326,6 +330,8 @@ static ssize_t kovaplus_sysfs_show_actua + hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); + return snprintf(buf, PAGE_SIZE, "%d\n", kovaplus->actual_x_sensitivity); + } ++static DEVICE_ATTR(actual_sensitivity_x, 0440, ++ kovaplus_sysfs_show_actual_sensitivity_x, NULL); + + static ssize_t kovaplus_sysfs_show_actual_sensitivity_y(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -334,6 +340,8 @@ static ssize_t kovaplus_sysfs_show_actua + hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); + return snprintf(buf, PAGE_SIZE, "%d\n", kovaplus->actual_y_sensitivity); + } ++static DEVICE_ATTR(actual_sensitivity_y, 0440, ++ kovaplus_sysfs_show_actual_sensitivity_y, NULL); + + static ssize_t kovaplus_sysfs_show_firmware_version(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -353,21 +361,18 @@ static ssize_t kovaplus_sysfs_show_firmw + + return snprintf(buf, PAGE_SIZE, "%d\n", info.firmware_version); + } ++static DEVICE_ATTR(firmware_version, 0440, ++ kovaplus_sysfs_show_firmware_version, NULL); + +-static struct device_attribute kovaplus_attributes[] = { +- __ATTR(actual_cpi, 0440, +- kovaplus_sysfs_show_actual_cpi, NULL), +- __ATTR(firmware_version, 0440, +- kovaplus_sysfs_show_firmware_version, NULL), +- __ATTR(actual_profile, 0660, +- kovaplus_sysfs_show_actual_profile, +- kovaplus_sysfs_set_actual_profile), +- __ATTR(actual_sensitivity_x, 0440, +- kovaplus_sysfs_show_actual_sensitivity_x, NULL), +- __ATTR(actual_sensitivity_y, 0440, +- kovaplus_sysfs_show_actual_sensitivity_y, NULL), +- __ATTR_NULL ++static struct attribute *kovaplus_attrs[] = { ++ &dev_attr_actual_cpi.attr, ++ &dev_attr_firmware_version.attr, ++ &dev_attr_actual_profile.attr, ++ &dev_attr_actual_sensitivity_x.attr, ++ &dev_attr_actual_sensitivity_y.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(kovaplus); + + static struct bin_attribute kovaplus_bin_attributes[] = { + KOVAPLUS_BIN_ATTRIBUTE_W(control, CONTROL), +@@ -662,7 +667,7 @@ static int __init kovaplus_init(void) + kovaplus_class = class_create(THIS_MODULE, "kovaplus"); + if (IS_ERR(kovaplus_class)) + return PTR_ERR(kovaplus_class); +- kovaplus_class->dev_attrs = kovaplus_attributes; ++ kovaplus_class->dev_groups = kovaplus_groups; + kovaplus_class->dev_bin_attrs = kovaplus_bin_attributes; + + retval = hid_register_driver(&kovaplus_driver); +--- a/drivers/hid/hid-roccat-pyra.c ++++ b/drivers/hid/hid-roccat-pyra.c +@@ -266,6 +266,7 @@ static ssize_t pyra_sysfs_show_actual_cp + hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); + return snprintf(buf, PAGE_SIZE, "%d\n", pyra->actual_cpi); + } ++static DEVICE_ATTR(actual_cpi, 0440, pyra_sysfs_show_actual_cpi, NULL); + + static ssize_t pyra_sysfs_show_actual_profile(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -282,6 +283,8 @@ static ssize_t pyra_sysfs_show_actual_pr + + return snprintf(buf, PAGE_SIZE, "%d\n", settings.startup_profile); + } ++static DEVICE_ATTR(actual_profile, 0440, pyra_sysfs_show_actual_profile, NULL); ++static DEVICE_ATTR(startup_profile, 0440, pyra_sysfs_show_actual_profile, NULL); + + static ssize_t pyra_sysfs_show_firmware_version(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -301,16 +304,17 @@ static ssize_t pyra_sysfs_show_firmware_ + + return snprintf(buf, PAGE_SIZE, "%d\n", info.firmware_version); + } ++static DEVICE_ATTR(firmware_version, 0440, pyra_sysfs_show_firmware_version, ++ NULL); + +-static struct device_attribute pyra_attributes[] = { +- __ATTR(actual_cpi, 0440, pyra_sysfs_show_actual_cpi, NULL), +- __ATTR(actual_profile, 0440, pyra_sysfs_show_actual_profile, NULL), +- __ATTR(firmware_version, 0440, +- pyra_sysfs_show_firmware_version, NULL), +- __ATTR(startup_profile, 0440, +- pyra_sysfs_show_actual_profile, NULL), +- __ATTR_NULL ++static struct attribute *pyra_attrs[] = { ++ &dev_attr_actual_cpi.attr, ++ &dev_attr_actual_profile.attr, ++ &dev_attr_firmware_version.attr, ++ &dev_attr_startup_profile.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(pyra); + + static struct bin_attribute pyra_bin_attributes[] = { + PYRA_BIN_ATTRIBUTE_W(control, CONTROL), +@@ -600,7 +604,7 @@ static int __init pyra_init(void) + pyra_class = class_create(THIS_MODULE, "pyra"); + if (IS_ERR(pyra_class)) + return PTR_ERR(pyra_class); +- pyra_class->dev_attrs = pyra_attributes; ++ pyra_class->dev_groups = pyra_groups; + pyra_class->dev_bin_attrs = pyra_bin_attributes; + + retval = hid_register_driver(&pyra_driver); diff --git a/isdn-convert-class-code-to-use-dev_groups.patch b/isdn-convert-class-code-to-use-dev_groups.patch new file mode 100644 index 00000000000000..b5478287095c64 --- /dev/null +++ b/isdn-convert-class-code-to-use-dev_groups.patch @@ -0,0 +1,159 @@ +From foo@baz Tue Jul 9 14:55:31 PDT 2013 +Date: Tue, 09 Jul 2013 14:55:31 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: ISDN: convert class code to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the mISDN class code to use the +correct field. + +Cc: Karsten Keil <isdn@linux-pingi.de> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/isdn/mISDN/core.c | 62 +++++++++++++++++++++++++--------------------- + 1 file changed, 35 insertions(+), 27 deletions(-) + +--- a/drivers/isdn/mISDN/core.c ++++ b/drivers/isdn/mISDN/core.c +@@ -37,8 +37,8 @@ static void mISDN_dev_release(struct dev + /* nothing to do: the device is part of its parent's data structure */ + } + +-static ssize_t _show_id(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t id_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct mISDNdevice *mdev = dev_to_mISDN(dev); + +@@ -46,9 +46,10 @@ static ssize_t _show_id(struct device *d + return -ENODEV; + return sprintf(buf, "%d\n", mdev->id); + } ++static DEVICE_ATTR_RO(id); + +-static ssize_t _show_nrbchan(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t nrbchan_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct mISDNdevice *mdev = dev_to_mISDN(dev); + +@@ -56,9 +57,10 @@ static ssize_t _show_nrbchan(struct devi + return -ENODEV; + return sprintf(buf, "%d\n", mdev->nrbchan); + } ++static DEVICE_ATTR_RO(nrbchan); + +-static ssize_t _show_d_protocols(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t d_protocols_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct mISDNdevice *mdev = dev_to_mISDN(dev); + +@@ -66,9 +68,10 @@ static ssize_t _show_d_protocols(struct + return -ENODEV; + return sprintf(buf, "%d\n", mdev->Dprotocols); + } ++static DEVICE_ATTR_RO(d_protocols); + +-static ssize_t _show_b_protocols(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t b_protocols_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct mISDNdevice *mdev = dev_to_mISDN(dev); + +@@ -76,9 +79,10 @@ static ssize_t _show_b_protocols(struct + return -ENODEV; + return sprintf(buf, "%d\n", mdev->Bprotocols | get_all_Bprotocols()); + } ++static DEVICE_ATTR_RO(b_protocols); + +-static ssize_t _show_protocol(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t protocol_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct mISDNdevice *mdev = dev_to_mISDN(dev); + +@@ -86,17 +90,19 @@ static ssize_t _show_protocol(struct dev + return -ENODEV; + return sprintf(buf, "%d\n", mdev->D.protocol); + } ++static DEVICE_ATTR_RO(protocol); + +-static ssize_t _show_name(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t name_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + strcpy(buf, dev_name(dev)); + return strlen(buf); + } ++static DEVICE_ATTR_RO(name); + + #if 0 /* hangs */ +-static ssize_t _set_name(struct device *dev, struct device_attribute *attr, +- const char *buf, size_t count) ++static ssize_t name_set(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) + { + int err = 0; + char *out = kmalloc(count + 1, GFP_KERNEL); +@@ -113,10 +119,11 @@ static ssize_t _set_name(struct device * + + return (err < 0) ? err : count; + } ++static DEVICE_ATTR_RW(name); + #endif + +-static ssize_t _show_channelmap(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t channelmap_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct mISDNdevice *mdev = dev_to_mISDN(dev); + char *bp = buf; +@@ -127,18 +134,19 @@ static ssize_t _show_channelmap(struct d + + return bp - buf; + } ++static DEVICE_ATTR_RO(channelmap); + +-static struct device_attribute mISDN_dev_attrs[] = { +- __ATTR(id, S_IRUGO, _show_id, NULL), +- __ATTR(d_protocols, S_IRUGO, _show_d_protocols, NULL), +- __ATTR(b_protocols, S_IRUGO, _show_b_protocols, NULL), +- __ATTR(protocol, S_IRUGO, _show_protocol, NULL), +- __ATTR(channelmap, S_IRUGO, _show_channelmap, NULL), +- __ATTR(nrbchan, S_IRUGO, _show_nrbchan, NULL), +- __ATTR(name, S_IRUGO, _show_name, NULL), +-/* __ATTR(name, S_IRUGO | S_IWUSR, _show_name, _set_name), */ +- {} ++static struct attribute *mISDN_attrs[] = { ++ &dev_attr_id.attr, ++ &dev_attr_d_protocols.attr, ++ &dev_attr_b_protocols.attr, ++ &dev_attr_protocol.attr, ++ &dev_attr_channelmap.attr, ++ &dev_attr_nrbchan.attr, ++ &dev_attr_name.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(mISDN); + + static int mISDN_uevent(struct device *dev, struct kobj_uevent_env *env) + { +@@ -162,7 +170,7 @@ static struct class mISDN_class = { + .name = "mISDN", + .owner = THIS_MODULE, + .dev_uevent = mISDN_uevent, +- .dev_attrs = mISDN_dev_attrs, ++ .dev_groups = mISDN_groups, + .dev_release = mISDN_dev_release, + .class_release = mISDN_class_release, + }; diff --git a/leds-convert-class-code-to-use-dev_groups.patch b/leds-convert-class-code-to-use-dev_groups.patch new file mode 100644 index 00000000000000..ace9ceac4fa186 --- /dev/null +++ b/leds-convert-class-code-to-use-dev_groups.patch @@ -0,0 +1,95 @@ +From foo@baz Tue Jul 9 14:58:19 PDT 2013 +Date: Tue, 09 Jul 2013 14:58:19 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: leds: convert class code to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the led class code to use the +correct field. + +Cc: Bryan Wu <cooloney@gmail.com> +Cc: Richard Purdie <rpurdie@rpsys.net> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +--- + drivers/leds/led-class.c | 38 ++++++++++++++++++++++++++++++-------- + 1 file changed, 30 insertions(+), 8 deletions(-) + +--- a/drivers/leds/led-class.c ++++ b/drivers/leds/led-class.c +@@ -29,7 +29,7 @@ static void led_update_brightness(struct + led_cdev->brightness = led_cdev->brightness_get(led_cdev); + } + +-static ssize_t led_brightness_show(struct device *dev, ++static ssize_t brightness_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct led_classdev *led_cdev = dev_get_drvdata(dev); +@@ -40,7 +40,7 @@ static ssize_t led_brightness_show(struc + return sprintf(buf, "%u\n", led_cdev->brightness); + } + +-static ssize_t led_brightness_store(struct device *dev, ++static ssize_t brightness_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) + { + struct led_classdev *led_cdev = dev_get_drvdata(dev); +@@ -57,6 +57,7 @@ static ssize_t led_brightness_store(stru + + return size; + } ++static DEVICE_ATTR_RW(brightness); + + static ssize_t led_max_brightness_show(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -65,14 +66,35 @@ static ssize_t led_max_brightness_show(s + + return sprintf(buf, "%u\n", led_cdev->max_brightness); + } ++static DEVICE_ATTR(max_brightness, 0444, led_max_brightness_show, NULL); + +-static struct device_attribute led_class_attrs[] = { +- __ATTR(brightness, 0644, led_brightness_show, led_brightness_store), +- __ATTR(max_brightness, 0444, led_max_brightness_show, NULL), + #ifdef CONFIG_LEDS_TRIGGERS +- __ATTR(trigger, 0644, led_trigger_show, led_trigger_store), ++static DEVICE_ATTR(trigger, 0644, led_trigger_show, led_trigger_store); ++static struct attribute *led_trigger_attrs[] = { ++ &dev_attr_trigger.attr, ++ NULL, ++}; ++static const struct attribute_group led_trigger_group = { ++ .attrs = led_trigger_attrs, ++}; ++#endif ++ ++static struct attribute *led_class_attrs[] = { ++ &dev_attr_brightness.attr, ++ &dev_attr_max_brightness.attr, ++ NULL, ++}; ++ ++static const struct attribute_group led_group = { ++ .attrs = led_class_attrs, ++}; ++ ++static const struct attribute_group *led_groups[] = { ++ &led_group, ++#ifdef CONFIG_LEDS_TRIGGERS ++ &led_trigger_group, + #endif +- __ATTR_NULL, ++ NULL, + }; + + static void led_timer_function(unsigned long data) +@@ -258,7 +280,7 @@ static int __init leds_init(void) + if (IS_ERR(leds_class)) + return PTR_ERR(leds_class); + leds_class->pm = &leds_class_dev_pm_ops; +- leds_class->dev_attrs = led_class_attrs; ++ leds_class->dev_groups = led_groups; + return 0; + } + diff --git a/mips-convert-vpe_class-to-use-dev_groups.patch b/mips-convert-vpe_class-to-use-dev_groups.patch new file mode 100644 index 00000000000000..e40022b38932d6 --- /dev/null +++ b/mips-convert-vpe_class-to-use-dev_groups.patch @@ -0,0 +1,67 @@ +From foo@baz Tue Jul 9 14:46:12 PDT 2013 +Date: Tue, 09 Jul 2013 14:46:12 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: mips: convert vpe_class to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the MIPS vpe_class code to use +the correct field. + +Cc: Ralf Baechle <ralf@linux-mips.org> +Cc: John Crispin <blogic@openwrt.org> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +--- + arch/mips/kernel/vpe.c | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +--- a/arch/mips/kernel/vpe.c ++++ b/arch/mips/kernel/vpe.c +@@ -1335,8 +1335,9 @@ static ssize_t store_kill(struct device + + return len; + } ++static DEVICE_ATTR(kill, S_IWUSR, NULL, store_kill); + +-static ssize_t show_ntcs(struct device *cd, struct device_attribute *attr, ++static ssize_t ntcs_show(struct device *cd, struct device_attribute *attr, + char *buf) + { + struct vpe *vpe = get_vpe(tclimit); +@@ -1344,7 +1345,7 @@ static ssize_t show_ntcs(struct device * + return sprintf(buf, "%d\n", vpe->ntcs); + } + +-static ssize_t store_ntcs(struct device *dev, struct device_attribute *attr, ++static ssize_t ntcs_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t len) + { + struct vpe *vpe = get_vpe(tclimit); +@@ -1365,12 +1366,14 @@ static ssize_t store_ntcs(struct device + out_einval: + return -EINVAL; + } ++static DEVICE_ATTR_RW(ntcs); + +-static struct device_attribute vpe_class_attributes[] = { +- __ATTR(kill, S_IWUSR, NULL, store_kill), +- __ATTR(ntcs, S_IRUGO | S_IWUSR, show_ntcs, store_ntcs), +- {} ++static struct attribute vpe_attrs[] = { ++ &dev_attr_kill.attr, ++ &dev_attr_ntcs.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(vpe); + + static void vpe_device_release(struct device *cd) + { +@@ -1381,7 +1384,7 @@ struct class vpe_class = { + .name = "vpe", + .owner = THIS_MODULE, + .dev_release = vpe_device_release, +- .dev_attrs = vpe_class_attributes, ++ .dev_groups = vpe_groups, + }; + + struct device vpe_device; diff --git a/pci-convert-class-code-to-use-dev_groups.patch b/pci-convert-class-code-to-use-dev_groups.patch new file mode 100644 index 00000000000000..73f40d843edfee --- /dev/null +++ b/pci-convert-class-code-to-use-dev_groups.patch @@ -0,0 +1,102 @@ +From foo@baz Tue Jul 9 15:12:13 PDT 2013 +Date: Tue, 09 Jul 2013 15:12:13 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: PCI: convert class code to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the PCI class code to use the +correct field. + +Cc: Bjorn Helgaas <bhelgaas@google.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +--- + drivers/pci/pci-sysfs.c | 32 +++++++++++++++++++++----------- + drivers/pci/pci.h | 2 +- + drivers/pci/probe.c | 2 +- + 3 files changed, 23 insertions(+), 13 deletions(-) + +--- a/drivers/pci/pci-sysfs.c ++++ b/drivers/pci/pci-sysfs.c +@@ -131,19 +131,19 @@ static ssize_t pci_bus_show_cpuaffinity( + return ret; + } + +-static inline ssize_t pci_bus_show_cpumaskaffinity(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t cpuaffinity_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + return pci_bus_show_cpuaffinity(dev, 0, attr, buf); + } ++static DEVICE_ATTR_RO(cpuaffinity); + +-static inline ssize_t pci_bus_show_cpulistaffinity(struct device *dev, +- struct device_attribute *attr, +- char *buf) ++static ssize_t cpulistaffinity_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + return pci_bus_show_cpuaffinity(dev, 1, attr, buf); + } ++static DEVICE_ATTR_RO(cpulistaffinity); + + /* show resources */ + static ssize_t +@@ -379,6 +379,7 @@ dev_bus_rescan_store(struct device *dev, + } + return count; + } ++static DEVICE_ATTR(rescan, (S_IWUSR|S_IWGRP), NULL, dev_bus_rescan_store); + + #if defined(CONFIG_PM_RUNTIME) && defined(CONFIG_ACPI) + static ssize_t d3cold_allowed_store(struct device *dev, +@@ -514,11 +515,20 @@ struct device_attribute pci_dev_attrs[] + __ATTR_NULL, + }; + +-struct device_attribute pcibus_dev_attrs[] = { +- __ATTR(rescan, (S_IWUSR|S_IWGRP), NULL, dev_bus_rescan_store), +- __ATTR(cpuaffinity, S_IRUGO, pci_bus_show_cpumaskaffinity, NULL), +- __ATTR(cpulistaffinity, S_IRUGO, pci_bus_show_cpulistaffinity, NULL), +- __ATTR_NULL, ++static struct attribute *pcibus_attrs[] = { ++ &dev_attr_rescan.attr, ++ &dev_attr_cpuaffinity.attr, ++ &dev_attr_cpulistaffinity.attr, ++ NULL, ++}; ++ ++static const struct attribute_group pcibus_group = { ++ .attrs = pcibus_attrs, ++}; ++ ++const struct attribute_group *pcibus_groups[] = { ++ &pcibus_group, ++ NULL, + }; + + static ssize_t +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -151,7 +151,7 @@ static inline int pci_no_d1d2(struct pci + + } + extern struct device_attribute pci_dev_attrs[]; +-extern struct device_attribute pcibus_dev_attrs[]; ++extern const struct attribute_group *pcibus_groups[]; + extern struct device_type pci_dev_type; + extern struct bus_attribute pci_bus_attrs[]; + +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -96,7 +96,7 @@ static void release_pcibus_dev(struct de + static struct class pcibus_class = { + .name = "pci_bus", + .dev_release = &release_pcibus_dev, +- .dev_attrs = pcibus_dev_attrs, ++ .dev_groups = pcibus_groups, + }; + + static int __init pcibus_class_init(void) diff --git a/pps-convert-class-code-to-use-dev_groups.patch b/pps-convert-class-code-to-use-dev_groups.patch new file mode 100644 index 00000000000000..7f8da06fae3ffa --- /dev/null +++ b/pps-convert-class-code-to-use-dev_groups.patch @@ -0,0 +1,143 @@ +From foo@baz Tue Jul 9 15:16:41 PDT 2013 +Date: Tue, 09 Jul 2013 15:16:42 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: PPS: convert class code to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the pps class code to use the +correct field. + +Cc: Rodolfo Giometti <giometti@enneenne.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/pps/pps.c | 2 - + drivers/pps/sysfs.c | 55 ++++++++++++++++++++++++++++----------------- + include/linux/pps_kernel.h | 2 - + 3 files changed, 37 insertions(+), 22 deletions(-) + +--- a/drivers/pps/pps.c ++++ b/drivers/pps/pps.c +@@ -406,7 +406,7 @@ static int __init pps_init(void) + pr_err("failed to allocate class\n"); + return PTR_ERR(pps_class); + } +- pps_class->dev_attrs = pps_attrs; ++ pps_class->dev_groups = pps_groups; + + err = alloc_chrdev_region(&pps_devt, 0, PPS_MAX_SOURCES, "pps"); + if (err < 0) { +--- a/drivers/pps/sysfs.c ++++ b/drivers/pps/sysfs.c +@@ -29,8 +29,8 @@ + * Attribute functions + */ + +-static ssize_t pps_show_assert(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t assert_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct pps_device *pps = dev_get_drvdata(dev); + +@@ -41,9 +41,10 @@ static ssize_t pps_show_assert(struct de + (long long) pps->assert_tu.sec, pps->assert_tu.nsec, + pps->assert_sequence); + } ++static DEVICE_ATTR_RO(assert); + +-static ssize_t pps_show_clear(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t clear_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct pps_device *pps = dev_get_drvdata(dev); + +@@ -54,45 +55,59 @@ static ssize_t pps_show_clear(struct dev + (long long) pps->clear_tu.sec, pps->clear_tu.nsec, + pps->clear_sequence); + } ++static DEVICE_ATTR_RO(clear); + +-static ssize_t pps_show_mode(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t mode_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct pps_device *pps = dev_get_drvdata(dev); + + return sprintf(buf, "%4x\n", pps->info.mode); + } ++static DEVICE_ATTR_RO(mode); + +-static ssize_t pps_show_echo(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t echo_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct pps_device *pps = dev_get_drvdata(dev); + + return sprintf(buf, "%d\n", !!pps->info.echo); + } ++static DEVICE_ATTR_RO(echo); + +-static ssize_t pps_show_name(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t name_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct pps_device *pps = dev_get_drvdata(dev); + + return sprintf(buf, "%s\n", pps->info.name); + } ++static DEVICE_ATTR_RO(name); + +-static ssize_t pps_show_path(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t path_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct pps_device *pps = dev_get_drvdata(dev); + + return sprintf(buf, "%s\n", pps->info.path); + } ++static DEVICE_ATTR_RO(path); + +-struct device_attribute pps_attrs[] = { +- __ATTR(assert, S_IRUGO, pps_show_assert, NULL), +- __ATTR(clear, S_IRUGO, pps_show_clear, NULL), +- __ATTR(mode, S_IRUGO, pps_show_mode, NULL), +- __ATTR(echo, S_IRUGO, pps_show_echo, NULL), +- __ATTR(name, S_IRUGO, pps_show_name, NULL), +- __ATTR(path, S_IRUGO, pps_show_path, NULL), +- __ATTR_NULL, ++static struct attribute *pps_attrs[] = { ++ &dev_attr_assert.attr, ++ &dev_attr_clear.attr, ++ &dev_attr_mode.attr, ++ &dev_attr_echo.attr, ++ &dev_attr_name.attr, ++ &dev_attr_path.attr, ++ NULL, ++}; ++ ++static const struct attribute_group pps_group = { ++ .attrs = pps_attrs, ++}; ++ ++const struct attribute_group *pps_groups[] = { ++ &pps_group, ++ NULL, + }; +--- a/include/linux/pps_kernel.h ++++ b/include/linux/pps_kernel.h +@@ -80,7 +80,7 @@ struct pps_device { + * Global variables + */ + +-extern struct device_attribute pps_attrs[]; ++extern const struct attribute_group *pps_groups[]; + + /* + * Internal functions. diff --git a/ptp-convert-class-code-to-use-dev_groups.patch b/ptp-convert-class-code-to-use-dev_groups.patch new file mode 100644 index 00000000000000..181426831d3ee9 --- /dev/null +++ b/ptp-convert-class-code-to-use-dev_groups.patch @@ -0,0 +1,109 @@ +From foo@baz Tue Jul 9 15:17:24 PDT 2013 +Date: Tue, 09 Jul 2013 15:17:24 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: PTP: convert class code to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the ptp class code to use the +correct field. + +Cc: Richard Cochran <richardcochran@gmail.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/ptp/ptp_clock.c | 2 - + drivers/ptp/ptp_private.h | 2 - + drivers/ptp/ptp_sysfs.c | 51 ++++++++++++++++++++++++++-------------------- + 3 files changed, 31 insertions(+), 24 deletions(-) + +--- a/drivers/ptp/ptp_clock.c ++++ b/drivers/ptp/ptp_clock.c +@@ -330,7 +330,7 @@ static int __init ptp_init(void) + goto no_region; + } + +- ptp_class->dev_attrs = ptp_dev_attrs; ++ ptp_class->dev_groups = ptp_groups; + pr_info("PTP clock support registered\n"); + return 0; + +--- a/drivers/ptp/ptp_private.h ++++ b/drivers/ptp/ptp_private.h +@@ -84,7 +84,7 @@ uint ptp_poll(struct posix_clock *pc, + * see ptp_sysfs.c + */ + +-extern struct device_attribute ptp_dev_attrs[]; ++extern const struct attribute_group *ptp_groups[]; + + int ptp_cleanup_sysfs(struct ptp_clock *ptp); + +--- a/drivers/ptp/ptp_sysfs.c ++++ b/drivers/ptp/ptp_sysfs.c +@@ -27,36 +27,43 @@ static ssize_t clock_name_show(struct de + struct ptp_clock *ptp = dev_get_drvdata(dev); + return snprintf(page, PAGE_SIZE-1, "%s\n", ptp->info->name); + } ++static DEVICE_ATTR(clock_name, 0444, clock_name_show, NULL); + +-#define PTP_SHOW_INT(name) \ +-static ssize_t name##_show(struct device *dev, \ ++#define PTP_SHOW_INT(name, var) \ ++static ssize_t var##_show(struct device *dev, \ + struct device_attribute *attr, char *page) \ + { \ + struct ptp_clock *ptp = dev_get_drvdata(dev); \ +- return snprintf(page, PAGE_SIZE-1, "%d\n", ptp->info->name); \ +-} ++ return snprintf(page, PAGE_SIZE-1, "%d\n", ptp->info->var); \ ++} \ ++static DEVICE_ATTR(name, 0444, var##_show, NULL); + +-PTP_SHOW_INT(max_adj); +-PTP_SHOW_INT(n_alarm); +-PTP_SHOW_INT(n_ext_ts); +-PTP_SHOW_INT(n_per_out); +-PTP_SHOW_INT(pps); +- +-#define PTP_RO_ATTR(_var, _name) { \ +- .attr = { .name = __stringify(_name), .mode = 0444 }, \ +- .show = _var##_show, \ +-} ++PTP_SHOW_INT(max_adjustment, max_adj); ++PTP_SHOW_INT(n_alarms, n_alarm); ++PTP_SHOW_INT(n_external_timestamps, n_ext_ts); ++PTP_SHOW_INT(n_periodic_outputs, n_per_out); ++PTP_SHOW_INT(pps_available, pps); ++ ++static struct attribute *ptp_attrs[] = { ++ &dev_attr_clock_name.attr, ++ &dev_attr_max_adjustment.attr, ++ &dev_attr_n_alarms.attr, ++ &dev_attr_n_external_timestamps.attr, ++ &dev_attr_n_periodic_outputs.attr, ++ &dev_attr_pps_available.attr, ++ NULL, ++}; + +-struct device_attribute ptp_dev_attrs[] = { +- PTP_RO_ATTR(clock_name, clock_name), +- PTP_RO_ATTR(max_adj, max_adjustment), +- PTP_RO_ATTR(n_alarm, n_alarms), +- PTP_RO_ATTR(n_ext_ts, n_external_timestamps), +- PTP_RO_ATTR(n_per_out, n_periodic_outputs), +- PTP_RO_ATTR(pps, pps_available), +- __ATTR_NULL, ++static const struct attribute_group ptp_group = { ++ .attrs = ptp_attrs, + }; + ++const struct attribute_group *ptp_groups[] = { ++ &ptp_group, ++ NULL, ++}; ++ ++ + static ssize_t extts_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) diff --git a/regulator-convert-class-code-to-use-dev_groups.patch b/regulator-convert-class-code-to-use-dev_groups.patch new file mode 100644 index 00000000000000..72e68d60131728 --- /dev/null +++ b/regulator-convert-class-code-to-use-dev_groups.patch @@ -0,0 +1,94 @@ +From foo@baz Tue Jul 9 15:18:23 PDT 2013 +Date: Tue, 09 Jul 2013 15:18:23 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: regulator: convert class code to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the regulator class code to use +the correct field. + +Cc: Liam Girdwood <lgirdwood@gmail.com> +Cc: Mark Brown <broonie@kernel.org> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/regulator/core.c | 28 ++++++++++++++++------------ + 1 file changed, 16 insertions(+), 12 deletions(-) + +--- a/drivers/regulator/core.c ++++ b/drivers/regulator/core.c +@@ -323,13 +323,14 @@ static ssize_t regulator_uA_show(struct + } + static DEVICE_ATTR(microamps, 0444, regulator_uA_show, NULL); + +-static ssize_t regulator_name_show(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t name_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct regulator_dev *rdev = dev_get_drvdata(dev); + + return sprintf(buf, "%s\n", rdev_get_name(rdev)); + } ++static DEVICE_ATTR_RO(name); + + static ssize_t regulator_print_opmode(char *buf, int mode) + { +@@ -489,15 +490,16 @@ static ssize_t regulator_total_uA_show(s + } + static DEVICE_ATTR(requested_microamps, 0444, regulator_total_uA_show, NULL); + +-static ssize_t regulator_num_users_show(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t num_users_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct regulator_dev *rdev = dev_get_drvdata(dev); + return sprintf(buf, "%d\n", rdev->use_count); + } ++static DEVICE_ATTR_RO(num_users); + +-static ssize_t regulator_type_show(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t type_show(struct device *dev, struct device_attribute *attr, ++ char *buf) + { + struct regulator_dev *rdev = dev_get_drvdata(dev); + +@@ -509,6 +511,7 @@ static ssize_t regulator_type_show(struc + } + return sprintf(buf, "unknown\n"); + } ++static DEVICE_ATTR_RO(type); + + static ssize_t regulator_suspend_mem_uV_show(struct device *dev, + struct device_attribute *attr, char *buf) +@@ -632,12 +635,13 @@ static DEVICE_ATTR(bypass, 0444, + * These are the only attributes are present for all regulators. + * Other attributes are a function of regulator functionality. + */ +-static struct device_attribute regulator_dev_attrs[] = { +- __ATTR(name, 0444, regulator_name_show, NULL), +- __ATTR(num_users, 0444, regulator_num_users_show, NULL), +- __ATTR(type, 0444, regulator_type_show, NULL), +- __ATTR_NULL, ++static struct attribute *regulator_dev_attrs[] = { ++ &dev_attr_name.attr, ++ &dev_attr_num_users.attr, ++ &dev_attr_type.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(regulator_dev); + + static void regulator_dev_release(struct device *dev) + { +@@ -648,7 +652,7 @@ static void regulator_dev_release(struct + static struct class regulator_class = { + .name = "regulator", + .dev_release = regulator_dev_release, +- .dev_attrs = regulator_dev_attrs, ++ .dev_groups = regulator_dev_groups, + }; + + /* Calculate the new optimum regulator operating mode based on the new total diff --git a/rtc-convert-class-code-to-use-dev_groups.patch b/rtc-convert-class-code-to-use-dev_groups.patch new file mode 100644 index 00000000000000..422b897ae3e8ef --- /dev/null +++ b/rtc-convert-class-code-to-use-dev_groups.patch @@ -0,0 +1,137 @@ +From foo@baz Tue Jul 9 15:19:10 PDT 2013 +Date: Tue, 09 Jul 2013 15:19:10 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: rtc: convert class code to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the rtc class code to use the +correct field. + +Cc: Alessandro Zummo <a.zummo@towertech.it> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/rtc/rtc-sysfs.c | 46 +++++++++++++++++++++++----------------------- + 1 file changed, 23 insertions(+), 23 deletions(-) + +--- a/drivers/rtc/rtc-sysfs.c ++++ b/drivers/rtc/rtc-sysfs.c +@@ -25,15 +25,14 @@ + */ + + static ssize_t +-rtc_sysfs_show_name(struct device *dev, struct device_attribute *attr, +- char *buf) ++name_show(struct device *dev, struct device_attribute *attr, char *buf) + { + return sprintf(buf, "%s\n", to_rtc_device(dev)->name); + } ++static DEVICE_ATTR_RO(name); + + static ssize_t +-rtc_sysfs_show_date(struct device *dev, struct device_attribute *attr, +- char *buf) ++date_show(struct device *dev, struct device_attribute *attr, char *buf) + { + ssize_t retval; + struct rtc_time tm; +@@ -46,10 +45,10 @@ rtc_sysfs_show_date(struct device *dev, + + return retval; + } ++static DEVICE_ATTR_RO(date); + + static ssize_t +-rtc_sysfs_show_time(struct device *dev, struct device_attribute *attr, +- char *buf) ++time_show(struct device *dev, struct device_attribute *attr, char *buf) + { + ssize_t retval; + struct rtc_time tm; +@@ -62,10 +61,10 @@ rtc_sysfs_show_time(struct device *dev, + + return retval; + } ++static DEVICE_ATTR_RO(time); + + static ssize_t +-rtc_sysfs_show_since_epoch(struct device *dev, struct device_attribute *attr, +- char *buf) ++since_epoch_show(struct device *dev, struct device_attribute *attr, char *buf) + { + ssize_t retval; + struct rtc_time tm; +@@ -79,16 +78,16 @@ rtc_sysfs_show_since_epoch(struct device + + return retval; + } ++static DEVICE_ATTR_RO(since_epoch); + + static ssize_t +-rtc_sysfs_show_max_user_freq(struct device *dev, struct device_attribute *attr, +- char *buf) ++max_user_freq_show(struct device *dev, struct device_attribute *attr, char *buf) + { + return sprintf(buf, "%d\n", to_rtc_device(dev)->max_user_freq); + } + + static ssize_t +-rtc_sysfs_set_max_user_freq(struct device *dev, struct device_attribute *attr, ++max_user_freq_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t n) + { + struct rtc_device *rtc = to_rtc_device(dev); +@@ -101,6 +100,7 @@ rtc_sysfs_set_max_user_freq(struct devic + + return n; + } ++static DEVICE_ATTR_RW(max_user_freq); + + /** + * rtc_sysfs_show_hctosys - indicate if the given RTC set the system time +@@ -109,8 +109,7 @@ rtc_sysfs_set_max_user_freq(struct devic + * boot or resume event. + */ + static ssize_t +-rtc_sysfs_show_hctosys(struct device *dev, struct device_attribute *attr, +- char *buf) ++hctosys_show(struct device *dev, struct device_attribute *attr, char *buf) + { + #ifdef CONFIG_RTC_HCTOSYS_DEVICE + if (rtc_hctosys_ret == 0 && +@@ -121,17 +120,18 @@ rtc_sysfs_show_hctosys(struct device *de + #endif + return sprintf(buf, "0\n"); + } ++static DEVICE_ATTR_RO(hctosys); + +-static struct device_attribute rtc_attrs[] = { +- __ATTR(name, S_IRUGO, rtc_sysfs_show_name, NULL), +- __ATTR(date, S_IRUGO, rtc_sysfs_show_date, NULL), +- __ATTR(time, S_IRUGO, rtc_sysfs_show_time, NULL), +- __ATTR(since_epoch, S_IRUGO, rtc_sysfs_show_since_epoch, NULL), +- __ATTR(max_user_freq, S_IRUGO | S_IWUSR, rtc_sysfs_show_max_user_freq, +- rtc_sysfs_set_max_user_freq), +- __ATTR(hctosys, S_IRUGO, rtc_sysfs_show_hctosys, NULL), +- { }, ++static struct attribute *rtc_attrs[] = { ++ &dev_attr_name.attr, ++ &dev_attr_date.attr, ++ &dev_attr_time.attr, ++ &dev_attr_since_epoch.attr, ++ &dev_attr_max_user_freq.attr, ++ &dev_attr_hctosys.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(rtc); + + static ssize_t + rtc_sysfs_show_wakealarm(struct device *dev, struct device_attribute *attr, +@@ -261,5 +261,5 @@ void rtc_sysfs_del_device(struct rtc_dev + + void __init rtc_sysfs_init(struct class *rtc_class) + { +- rtc_class->dev_attrs = rtc_attrs; ++ rtc_class->dev_groups = rtc_groups; + } @@ -4,9 +4,41 @@ sysfs.h-add-attribute_groups-macro.patch driver-core-add-device_attr_rw-and-device_attr_ro-macros.patch driver-core-add-binary-attributes-to-struct-device.patch misc-c2port-use-dev_bin_attrs-instead-of-hand-coding-it.patch + driver-core-add-default-groups-to-struct-class.patch driver-core-remove-dev_attrs-from-struct-class.patch +mips-convert-vpe_class-to-use-dev_groups.patch +bsr-convert-bsr_class-to-use-dev_groups.patch +tile-srom-convert-srom_class-to-use-dev_groups.patch +dma-convert-dma_devclass-to-use-dev_groups.patch +devfreq-convert-devfreq_class-to-use-dev_groups.patch +extcon-convert-extcon_class-to-use-dev_groups.patch +hid-roccat-convert-class-code-to-use-dev_groups.patch +isdn-convert-class-code-to-use-dev_groups.patch +leds-convert-class-code-to-use-dev_groups.patch +v4l2-convert-class-code-to-use-dev_groups.patch +c2port-convert-class-code-to-use-dev_groups.patch +enclosure-convert-class-code-to-use-dev_groups.patch +pci-convert-class-code-to-use-dev_groups.patch +x86-wmi-convert-class-code-to-use-dev_groups.patch +pps-convert-class-code-to-use-dev_groups.patch +ptp-convert-class-code-to-use-dev_groups.patch +regulator-convert-class-code-to-use-dev_groups.patch +rtc-convert-class-code-to-use-dev_groups.patch + + d1.patch +d2.patch +d3.patch +d4.patch +d5.patch +d6.patch +d7.patch +d8.patch +d9.patch + + + usb-ldusb-remove-custom-dbg_info-macro.patch usb-legotower-remove-unneeded-tracing-macros.patch usb-legousbtower-remove-custom-debug-macro.patch diff --git a/tile-srom-convert-srom_class-to-use-dev_groups.patch b/tile-srom-convert-srom_class-to-use-dev_groups.patch new file mode 100644 index 00000000000000..f924a2e35d296f --- /dev/null +++ b/tile-srom-convert-srom_class-to-use-dev_groups.patch @@ -0,0 +1,77 @@ +From foo@baz Tue Jul 9 14:49:38 PDT 2013 +Date: Tue, 09 Jul 2013 14:49:38 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: tile: srom: convert srom_class to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the tile srom_class code to use +the correct field. + +Cc: Arnd Bergmann <arnd@arndb.de> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/char/tile-srom.c | 28 ++++++++++++++++------------ + 1 file changed, 16 insertions(+), 12 deletions(-) + +--- a/drivers/char/tile-srom.c ++++ b/drivers/char/tile-srom.c +@@ -279,33 +279,37 @@ loff_t srom_llseek(struct file *file, lo + return fixed_size_llseek(file, offset, origin, srom->total_size); + } + +-static ssize_t total_show(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t total_size_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct srom_dev *srom = dev_get_drvdata(dev); + return sprintf(buf, "%u\n", srom->total_size); + } ++static DEVICE_ATTR_RO(total_size); + +-static ssize_t sector_show(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t sector_size_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct srom_dev *srom = dev_get_drvdata(dev); + return sprintf(buf, "%u\n", srom->sector_size); + } ++static DEVICE_ATTR_RO(sector_size); + +-static ssize_t page_show(struct device *dev, +- struct device_attribute *attr, char *buf) ++static ssize_t page_size_show(struct device *dev, ++ struct device_attribute *attr, char *buf) + { + struct srom_dev *srom = dev_get_drvdata(dev); + return sprintf(buf, "%u\n", srom->page_size); + } ++static DEVICE_ATTR_RO(page_size); + +-static struct device_attribute srom_dev_attrs[] = { +- __ATTR(total_size, S_IRUGO, total_show, NULL), +- __ATTR(sector_size, S_IRUGO, sector_show, NULL), +- __ATTR(page_size, S_IRUGO, page_show, NULL), +- __ATTR_NULL ++static struct attribute srom_dev_attrs[] = { ++ &dev_attr_total_size.attr, ++ &dev_attr_sector_size.attr, ++ &dev_attr_page_size.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(srom_dev); + + static char *srom_devnode(struct device *dev, umode_t *mode) + { +@@ -418,7 +422,7 @@ static int srom_init(void) + result = PTR_ERR(srom_class); + goto fail_cdev; + } +- srom_class->dev_attrs = srom_dev_attrs; ++ srom_class->dev_groups = srom_dev_groups; + srom_class->devnode = srom_devnode; + + /* Do per-partition initialization */ diff --git a/v4l2-convert-class-code-to-use-dev_groups.patch b/v4l2-convert-class-code-to-use-dev_groups.patch new file mode 100644 index 00000000000000..484c0de13af77f --- /dev/null +++ b/v4l2-convert-class-code-to-use-dev_groups.patch @@ -0,0 +1,92 @@ +From foo@baz Tue Jul 9 15:07:59 PDT 2013 +Date: Tue, 09 Jul 2013 15:08:00 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: v4l2: convert class code to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the v4l2 class code to use the +correct field. + +Cc: Mauro Carvalho Chehab <mchehab@redhat.com> +Cc: Hans Verkuil <hans.verkuil@cisco.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/media/v4l2-core/v4l2-dev.c | 30 +++++++++++++++++------------- + 1 file changed, 17 insertions(+), 13 deletions(-) + +--- a/drivers/media/v4l2-core/v4l2-dev.c ++++ b/drivers/media/v4l2-core/v4l2-dev.c +@@ -38,24 +38,25 @@ + * sysfs stuff + */ + +-static ssize_t show_index(struct device *cd, +- struct device_attribute *attr, char *buf) ++static ssize_t index_show(struct device *cd, ++ struct device_attribute *attr, char *buf) + { + struct video_device *vdev = to_video_device(cd); + + return sprintf(buf, "%i\n", vdev->index); + } ++static DEVICE_ATTR_RO(index); + +-static ssize_t show_debug(struct device *cd, +- struct device_attribute *attr, char *buf) ++static ssize_t debug_show(struct device *cd, ++ struct device_attribute *attr, char *buf) + { + struct video_device *vdev = to_video_device(cd); + + return sprintf(buf, "%i\n", vdev->debug); + } + +-static ssize_t set_debug(struct device *cd, struct device_attribute *attr, +- const char *buf, size_t len) ++static ssize_t debug_store(struct device *cd, struct device_attribute *attr, ++ const char *buf, size_t len) + { + struct video_device *vdev = to_video_device(cd); + int res = 0; +@@ -68,21 +69,24 @@ static ssize_t set_debug(struct device * + vdev->debug = value; + return len; + } ++static DEVICE_ATTR_RW(debug); + +-static ssize_t show_name(struct device *cd, ++static ssize_t name_show(struct device *cd, + struct device_attribute *attr, char *buf) + { + struct video_device *vdev = to_video_device(cd); + + return sprintf(buf, "%.*s\n", (int)sizeof(vdev->name), vdev->name); + } ++static DEVICE_ATTR_RO(name); + +-static struct device_attribute video_device_attrs[] = { +- __ATTR(name, S_IRUGO, show_name, NULL), +- __ATTR(debug, 0644, show_debug, set_debug), +- __ATTR(index, S_IRUGO, show_index, NULL), +- __ATTR_NULL ++static struct attribute *video_device_attrs[] = { ++ &dev_attr_name.attr, ++ &dev_attr_debug.attr, ++ &dev_attr_index.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(video_device); + + /* + * Active devices +@@ -217,7 +221,7 @@ static void v4l2_device_release(struct d + + static struct class video_class = { + .name = VIDEO_NAME, +- .dev_attrs = video_device_attrs, ++ .dev_groups = video_device_groups, + }; + + struct video_device *video_devdata(struct file *file) diff --git a/x86-wmi-convert-class-code-to-use-dev_groups.patch b/x86-wmi-convert-class-code-to-use-dev_groups.patch new file mode 100644 index 00000000000000..80c4e125d2ab69 --- /dev/null +++ b/x86-wmi-convert-class-code-to-use-dev_groups.patch @@ -0,0 +1,45 @@ +From foo@baz Tue Jul 9 15:15:36 PDT 2013 +Date: Tue, 09 Jul 2013 15:15:36 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: x86: wmi: convert class code to use dev_groups + +The dev_attrs field of struct class is going away soon, dev_groups +should be used instead. This converts the wmi class code to use the +correct field. + +Cc: Matthew Garrett <matthew.garrett@nebula.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/platform/x86/wmi.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +--- a/drivers/platform/x86/wmi.c ++++ b/drivers/platform/x86/wmi.c +@@ -693,11 +693,13 @@ static ssize_t modalias_show(struct devi + + return sprintf(buf, "wmi:%s\n", guid_string); + } ++static DEVICE_ATTR_RO(modalias); + +-static struct device_attribute wmi_dev_attrs[] = { +- __ATTR_RO(modalias), +- __ATTR_NULL ++static struct attribute *wmi_attrs[] = { ++ &dev_attr_modalias.attr, ++ NULL, + }; ++ATTRIBUTE_GROUPS(wmi); + + static int wmi_dev_uevent(struct device *dev, struct kobj_uevent_env *env) + { +@@ -732,7 +734,7 @@ static struct class wmi_class = { + .name = "wmi", + .dev_release = wmi_dev_free, + .dev_uevent = wmi_dev_uevent, +- .dev_attrs = wmi_dev_attrs, ++ .dev_groups = wmi_groups, + }; + + static int wmi_create_device(const struct guid_block *gblock, |
