aboutsummaryrefslogtreecommitdiffstats
diff options
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-07-09 15:24:25 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-07-09 15:24:25 -0700
commitaaf275f945460b5cb5ee6ea9ef95b06db5334461 (patch)
tree8dd916f867832927b6cf9e91fbc14340ad8125a6
parent1cfe8e5d3a8ac05c5a39afc11f57ac2c9fdabaa5 (diff)
downloadpatches-aaf275f945460b5cb5ee6ea9ef95b06db5334461.tar.gz
break patch up into proper pieces
-rw-r--r--bsr-convert-bsr_class-to-use-dev_groups.patch66
-rw-r--r--c2port-convert-class-code-to-use-dev_groups.patch161
-rw-r--r--d1.patch3213
-rw-r--r--d10.patch1528
-rw-r--r--d2.patch42
-rw-r--r--d3.patch120
-rw-r--r--d4.patch48
-rw-r--r--d5.patch1272
-rw-r--r--devfreq-convert-devfreq_class-to-use-dev_groups.patch199
-rw-r--r--dma-convert-dma_devclass-to-use-dev_groups.patch84
-rw-r--r--enclosure-convert-class-code-to-use-dev_groups.patch88
-rw-r--r--extcon-convert-extcon_class-to-use-dev_groups.patch62
-rw-r--r--hid-roccat-convert-class-code-to-use-dev_groups.patch410
-rw-r--r--isdn-convert-class-code-to-use-dev_groups.patch159
-rw-r--r--leds-convert-class-code-to-use-dev_groups.patch95
-rw-r--r--mips-convert-vpe_class-to-use-dev_groups.patch67
-rw-r--r--pci-convert-class-code-to-use-dev_groups.patch102
-rw-r--r--pps-convert-class-code-to-use-dev_groups.patch143
-rw-r--r--ptp-convert-class-code-to-use-dev_groups.patch109
-rw-r--r--regulator-convert-class-code-to-use-dev_groups.patch94
-rw-r--r--rtc-convert-class-code-to-use-dev_groups.patch137
-rw-r--r--series32
-rw-r--r--tile-srom-convert-srom_class-to-use-dev_groups.patch77
-rw-r--r--v4l2-convert-class-code-to-use-dev_groups.patch92
-rw-r--r--x86-wmi-convert-class-code-to-use-dev_groups.patch45
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;
+ }
diff --git a/series b/series
index f4bf9dd982d9c0..4e50121bc538e7 100644
--- a/series
+++ b/series
@@ -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,