aboutsummaryrefslogtreecommitdiffstats
path: root/hid-roccat-convert-class-code-to-use-bin_attrs-in-groups.patch
diff options
Diffstat (limited to 'hid-roccat-convert-class-code-to-use-bin_attrs-in-groups.patch')
-rw-r--r--hid-roccat-convert-class-code-to-use-bin_attrs-in-groups.patch1081
1 files changed, 0 insertions, 1081 deletions
diff --git a/hid-roccat-convert-class-code-to-use-bin_attrs-in-groups.patch b/hid-roccat-convert-class-code-to-use-bin_attrs-in-groups.patch
deleted file mode 100644
index b96010eabf3322..00000000000000
--- a/hid-roccat-convert-class-code-to-use-bin_attrs-in-groups.patch
+++ /dev/null
@@ -1,1081 +0,0 @@
-From foo@baz Wed Jul 10 12:22:35 PDT 2013
-Date: Wed, 10 Jul 2013 12:22:35 -0700
-To: Greg KH <gregkh@linuxfoundation.org>
-From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Subject: hid: roccat: convert class code to use bin_attrs in groups
-
-Now that attribute groups support binary attributes, use them instead of
-the dev_bin_attrs field in struct class, as that is going away soon.
-
-Note, there is now a compiler warning about an unused function in the
-hid-roccat-pyra.c file with this patch:
-drivers/hid/hid-roccat-pyra.c:246:16: warning: ‘pyra_sysfs_write_settings’ defined but not used [-Wunused-function]
-
-That is because the settings binary sysfs file was previously setting
-the write field to be able to call this function on a write, yet the
-sysfs file was always marked read-only, so it was never being called. I
-left the sysfs file the same permissions, but didn't hook up the write
-function as that makes no sense. If wanted, I can just delete the
-function, but I'm not quite sure what is going on here with it.
-
-Cc: Jiri Kosina <jkosina@suse.cz>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/hid/hid-roccat-arvo.c | 32 ++++----
- drivers/hid/hid-roccat-isku.c | 87 ++++++++++++---------
- drivers/hid/hid-roccat-kone.c | 78 ++++++++-----------
- drivers/hid/hid-roccat-koneplus.c | 151 ++++++++++++++++----------------------
- drivers/hid/hid-roccat-konepure.c | 67 ++++++++++------
- drivers/hid/hid-roccat-kovaplus.c | 135 +++++++++++++--------------------
- drivers/hid/hid-roccat-pyra.c | 134 ++++++++++++++-------------------
- drivers/hid/hid-roccat-savu.c | 58 +++++++-------
- 8 files changed, 346 insertions(+), 396 deletions(-)
-
---- a/drivers/hid/hid-roccat-arvo.c
-+++ b/drivers/hid/hid-roccat-arvo.c
-@@ -237,6 +237,8 @@ static ssize_t arvo_sysfs_write_button(s
- return arvo_sysfs_write(fp, kobj, buf, off, count,
- sizeof(struct arvo_button), ARVO_COMMAND_BUTTON);
- }
-+static BIN_ATTR(button, 0220, NULL, arvo_sysfs_write_button,
-+ sizeof(struct arvo_button));
-
- static ssize_t arvo_sysfs_read_info(struct file *fp,
- struct kobject *kobj, struct bin_attribute *attr, char *buf,
-@@ -245,6 +247,8 @@ static ssize_t arvo_sysfs_read_info(stru
- return arvo_sysfs_read(fp, kobj, buf, off, count,
- sizeof(struct arvo_info), ARVO_COMMAND_INFO);
- }
-+static BIN_ATTR(info, 0440, arvo_sysfs_read_info, NULL,
-+ sizeof(struct arvo_info));
-
- static struct attribute *arvo_attrs[] = {
- &dev_attr_mode_key.attr,
-@@ -252,20 +256,21 @@ static struct attribute *arvo_attrs[] =
- &dev_attr_actual_profile.attr,
- NULL,
- };
--ATTRIBUTE_GROUPS(arvo);
-
--static struct bin_attribute arvo_bin_attributes[] = {
-- {
-- .attr = { .name = "button", .mode = 0220 },
-- .size = sizeof(struct arvo_button),
-- .write = arvo_sysfs_write_button
-- },
-- {
-- .attr = { .name = "info", .mode = 0440 },
-- .size = sizeof(struct arvo_info),
-- .read = arvo_sysfs_read_info
-- },
-- __ATTR_NULL
-+static struct bin_attribute *arvo_bin_attributes[] = {
-+ &bin_attr_button,
-+ &bin_attr_info,
-+ NULL,
-+};
-+
-+static const struct attribute_group arvo_group = {
-+ .attrs = arvo_attrs,
-+ .bin_attrs = arvo_bin_attributes,
-+};
-+
-+static const struct attribute_group *arvo_groups[] = {
-+ &arvo_group,
-+ NULL,
- };
-
- static int arvo_init_arvo_device_struct(struct usb_device *usb_dev,
-@@ -434,7 +439,6 @@ static int __init arvo_init(void)
- if (IS_ERR(arvo_class))
- return PTR_ERR(arvo_class);
- arvo_class->dev_groups = arvo_groups;
-- arvo_class->dev_bin_attrs = arvo_bin_attributes;
-
- retval = hid_register_driver(&arvo_driver);
- if (retval)
---- a/drivers/hid/hid-roccat-isku.c
-+++ b/drivers/hid/hid-roccat-isku.c
-@@ -116,7 +116,6 @@ 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,
-@@ -185,7 +184,8 @@ ISKU_SYSFS_R(thingy, THINGY) \
- ISKU_SYSFS_W(thingy, THINGY)
-
- #define ISKU_BIN_ATTR_RW(thingy, THINGY) \
--{ \
-+ISKU_SYSFS_RW(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0660 }, \
- .size = ISKU_SIZE_ ## THINGY, \
- .read = isku_sysfs_read_ ## thingy, \
-@@ -193,52 +193,64 @@ ISKU_SYSFS_W(thingy, THINGY)
- }
-
- #define ISKU_BIN_ATTR_R(thingy, THINGY) \
--{ \
-+ISKU_SYSFS_R(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0440 }, \
- .size = ISKU_SIZE_ ## THINGY, \
- .read = isku_sysfs_read_ ## thingy, \
- }
-
- #define ISKU_BIN_ATTR_W(thingy, THINGY) \
--{ \
-+ISKU_SYSFS_W(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0220 }, \
- .size = ISKU_SIZE_ ## THINGY, \
- .write = isku_sysfs_write_ ## thingy \
- }
-
--ISKU_SYSFS_RW(macro, MACRO)
--ISKU_SYSFS_RW(keys_function, KEYS_FUNCTION)
--ISKU_SYSFS_RW(keys_easyzone, KEYS_EASYZONE)
--ISKU_SYSFS_RW(keys_media, KEYS_MEDIA)
--ISKU_SYSFS_RW(keys_thumbster, KEYS_THUMBSTER)
--ISKU_SYSFS_RW(keys_macro, KEYS_MACRO)
--ISKU_SYSFS_RW(keys_capslock, KEYS_CAPSLOCK)
--ISKU_SYSFS_RW(light, LIGHT)
--ISKU_SYSFS_RW(key_mask, KEY_MASK)
--ISKU_SYSFS_RW(last_set, LAST_SET)
--ISKU_SYSFS_W(talk, TALK)
--ISKU_SYSFS_W(talkfx, TALKFX)
--ISKU_SYSFS_R(info, INFO)
--ISKU_SYSFS_W(control, CONTROL)
--ISKU_SYSFS_W(reset, RESET)
--
--static struct bin_attribute isku_bin_attributes[] = {
-- ISKU_BIN_ATTR_RW(macro, MACRO),
-- ISKU_BIN_ATTR_RW(keys_function, KEYS_FUNCTION),
-- ISKU_BIN_ATTR_RW(keys_easyzone, KEYS_EASYZONE),
-- ISKU_BIN_ATTR_RW(keys_media, KEYS_MEDIA),
-- ISKU_BIN_ATTR_RW(keys_thumbster, KEYS_THUMBSTER),
-- ISKU_BIN_ATTR_RW(keys_macro, KEYS_MACRO),
-- ISKU_BIN_ATTR_RW(keys_capslock, KEYS_CAPSLOCK),
-- ISKU_BIN_ATTR_RW(light, LIGHT),
-- ISKU_BIN_ATTR_RW(key_mask, KEY_MASK),
-- ISKU_BIN_ATTR_RW(last_set, LAST_SET),
-- ISKU_BIN_ATTR_W(talk, TALK),
-- ISKU_BIN_ATTR_W(talkfx, TALKFX),
-- ISKU_BIN_ATTR_R(info, INFO),
-- ISKU_BIN_ATTR_W(control, CONTROL),
-- ISKU_BIN_ATTR_W(reset, RESET),
-- __ATTR_NULL
-+ISKU_BIN_ATTR_RW(macro, MACRO);
-+ISKU_BIN_ATTR_RW(keys_function, KEYS_FUNCTION);
-+ISKU_BIN_ATTR_RW(keys_easyzone, KEYS_EASYZONE);
-+ISKU_BIN_ATTR_RW(keys_media, KEYS_MEDIA);
-+ISKU_BIN_ATTR_RW(keys_thumbster, KEYS_THUMBSTER);
-+ISKU_BIN_ATTR_RW(keys_macro, KEYS_MACRO);
-+ISKU_BIN_ATTR_RW(keys_capslock, KEYS_CAPSLOCK);
-+ISKU_BIN_ATTR_RW(light, LIGHT);
-+ISKU_BIN_ATTR_RW(key_mask, KEY_MASK);
-+ISKU_BIN_ATTR_RW(last_set, LAST_SET);
-+ISKU_BIN_ATTR_W(talk, TALK);
-+ISKU_BIN_ATTR_W(talkfx, TALKFX);
-+ISKU_BIN_ATTR_W(control, CONTROL);
-+ISKU_BIN_ATTR_W(reset, RESET);
-+ISKU_BIN_ATTR_R(info, INFO);
-+
-+static struct bin_attribute *isku_bin_attributes[] = {
-+ &bin_attr_macro,
-+ &bin_attr_keys_function,
-+ &bin_attr_keys_easyzone,
-+ &bin_attr_keys_media,
-+ &bin_attr_keys_thumbster,
-+ &bin_attr_keys_macro,
-+ &bin_attr_keys_capslock,
-+ &bin_attr_light,
-+ &bin_attr_key_mask,
-+ &bin_attr_last_set,
-+ &bin_attr_talk,
-+ &bin_attr_talkfx,
-+ &bin_attr_control,
-+ &bin_attr_reset,
-+ &bin_attr_info,
-+ NULL,
-+};
-+
-+static const struct attribute_group isku_group = {
-+ .attrs = isku_attrs,
-+ .bin_attrs = isku_bin_attributes,
-+};
-+
-+static const struct attribute_group *isku_groups[] = {
-+ &isku_group,
-+ NULL,
- };
-
- static int isku_init_isku_device_struct(struct usb_device *usb_dev,
-@@ -429,7 +441,6 @@ static int __init isku_init(void)
- if (IS_ERR(isku_class))
- return PTR_ERR(isku_class);
- isku_class->dev_groups = isku_groups;
-- isku_class->dev_bin_attrs = isku_bin_attributes;
-
- retval = hid_register_driver(&isku_driver);
- if (retval)
---- a/drivers/hid/hid-roccat-kone.c
-+++ b/drivers/hid/hid-roccat-kone.c
-@@ -324,6 +324,8 @@ static ssize_t kone_sysfs_write_settings
-
- return sizeof(struct kone_settings);
- }
-+static BIN_ATTR(settings, 0660, kone_sysfs_read_settings,
-+ kone_sysfs_write_settings, sizeof(struct kone_settings));
-
- static ssize_t kone_sysfs_read_profilex(struct file *fp,
- struct kobject *kobj, struct bin_attribute *attr,
-@@ -378,6 +380,19 @@ static ssize_t kone_sysfs_write_profilex
-
- return sizeof(struct kone_profile);
- }
-+#define PROFILE_ATTR(number) \
-+static struct bin_attribute bin_attr_profile##number = { \
-+ .attr = { .name = "profile##number", .mode = 0660 }, \
-+ .size = sizeof(struct kone_profile), \
-+ .read = kone_sysfs_read_profilex, \
-+ .write = kone_sysfs_write_profilex, \
-+ .private = &profile_numbers[number], \
-+};
-+PROFILE_ATTR(1);
-+PROFILE_ATTR(2);
-+PROFILE_ATTR(3);
-+PROFILE_ATTR(4);
-+PROFILE_ATTR(5);
-
- static ssize_t kone_sysfs_show_actual_profile(struct device *dev,
- struct device_attribute *attr, char *buf)
-@@ -616,51 +631,25 @@ static struct attribute *kone_attrs[] =
- &dev_attr_startup_profile.attr,
- NULL,
- };
--ATTRIBUTE_GROUPS(kone);
-
--static struct bin_attribute kone_bin_attributes[] = {
-- {
-- .attr = { .name = "settings", .mode = 0660 },
-- .size = sizeof(struct kone_settings),
-- .read = kone_sysfs_read_settings,
-- .write = kone_sysfs_write_settings
-- },
-- {
-- .attr = { .name = "profile1", .mode = 0660 },
-- .size = sizeof(struct kone_profile),
-- .read = kone_sysfs_read_profilex,
-- .write = kone_sysfs_write_profilex,
-- .private = &profile_numbers[0]
-- },
-- {
-- .attr = { .name = "profile2", .mode = 0660 },
-- .size = sizeof(struct kone_profile),
-- .read = kone_sysfs_read_profilex,
-- .write = kone_sysfs_write_profilex,
-- .private = &profile_numbers[1]
-- },
-- {
-- .attr = { .name = "profile3", .mode = 0660 },
-- .size = sizeof(struct kone_profile),
-- .read = kone_sysfs_read_profilex,
-- .write = kone_sysfs_write_profilex,
-- .private = &profile_numbers[2]
-- },
-- {
-- .attr = { .name = "profile4", .mode = 0660 },
-- .size = sizeof(struct kone_profile),
-- .read = kone_sysfs_read_profilex,
-- .write = kone_sysfs_write_profilex,
-- .private = &profile_numbers[3]
-- },
-- {
-- .attr = { .name = "profile5", .mode = 0660 },
-- .size = sizeof(struct kone_profile),
-- .read = kone_sysfs_read_profilex,
-- .write = kone_sysfs_write_profilex,
-- .private = &profile_numbers[4]
-- },
-- __ATTR_NULL
-+static struct bin_attribute *kone_bin_attributes[] = {
-+ &bin_attr_settings,
-+ &bin_attr_profile1,
-+ &bin_attr_profile2,
-+ &bin_attr_profile3,
-+ &bin_attr_profile4,
-+ &bin_attr_profile5,
-+ NULL,
-+};
-+
-+static const struct attribute_group kone_group = {
-+ .attrs = kone_attrs,
-+ .bin_attrs = kone_bin_attributes,
-+};
-+
-+static const struct attribute_group *kone_groups[] = {
-+ &kone_group,
-+ NULL,
- };
-
- static int kone_init_kone_device_struct(struct usb_device *usb_dev,
-@@ -898,7 +887,6 @@ static int __init kone_init(void)
- if (IS_ERR(kone_class))
- return PTR_ERR(kone_class);
- kone_class->dev_groups = kone_groups;
-- kone_class->dev_bin_attrs = kone_bin_attributes;
-
- retval = hid_register_driver(&kone_driver);
- if (retval)
---- a/drivers/hid/hid-roccat-koneplus.c
-+++ b/drivers/hid/hid-roccat-koneplus.c
-@@ -156,7 +156,8 @@ KONEPLUS_SYSFS_W(thingy, THINGY) \
- KONEPLUS_SYSFS_R(thingy, THINGY)
-
- #define KONEPLUS_BIN_ATTRIBUTE_RW(thingy, THINGY) \
--{ \
-+KONEPLUS_SYSFS_RW(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0660 }, \
- .size = KONEPLUS_SIZE_ ## THINGY, \
- .read = koneplus_sysfs_read_ ## thingy, \
-@@ -164,28 +165,29 @@ KONEPLUS_SYSFS_R(thingy, THINGY)
- }
-
- #define KONEPLUS_BIN_ATTRIBUTE_R(thingy, THINGY) \
--{ \
-+KONEPLUS_SYSFS_R(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0440 }, \
- .size = KONEPLUS_SIZE_ ## THINGY, \
- .read = koneplus_sysfs_read_ ## thingy, \
- }
-
- #define KONEPLUS_BIN_ATTRIBUTE_W(thingy, THINGY) \
--{ \
-+KONEPLUS_SYSFS_W(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0220 }, \
- .size = KONEPLUS_SIZE_ ## THINGY, \
- .write = koneplus_sysfs_write_ ## thingy \
- }
--
--KONEPLUS_SYSFS_W(control, CONTROL)
--KONEPLUS_SYSFS_RW(info, INFO)
--KONEPLUS_SYSFS_W(talk, TALK)
--KONEPLUS_SYSFS_W(macro, MACRO)
--KONEPLUS_SYSFS_RW(sensor, SENSOR)
--KONEPLUS_SYSFS_RW(tcu, TCU)
--KONEPLUS_SYSFS_R(tcu_image, TCU_IMAGE)
--KONEPLUS_SYSFS_RW(profile_settings, PROFILE_SETTINGS)
--KONEPLUS_SYSFS_RW(profile_buttons, PROFILE_BUTTONS)
-+KONEPLUS_BIN_ATTRIBUTE_W(control, CONTROL);
-+KONEPLUS_BIN_ATTRIBUTE_W(talk, TALK);
-+KONEPLUS_BIN_ATTRIBUTE_W(macro, MACRO);
-+KONEPLUS_BIN_ATTRIBUTE_R(tcu_image, TCU_IMAGE);
-+KONEPLUS_BIN_ATTRIBUTE_RW(info, INFO);
-+KONEPLUS_BIN_ATTRIBUTE_RW(sensor, SENSOR);
-+KONEPLUS_BIN_ATTRIBUTE_RW(tcu, TCU);
-+KONEPLUS_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS);
-+KONEPLUS_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS);
-
- static ssize_t koneplus_sysfs_read_profilex_settings(struct file *fp,
- struct kobject *kobj, struct bin_attribute *attr, char *buf,
-@@ -225,6 +227,25 @@ static ssize_t koneplus_sysfs_read_profi
- KONEPLUS_COMMAND_PROFILE_BUTTONS);
- }
-
-+#define PROFILE_ATTR(number) \
-+static struct bin_attribute bin_attr_profile##number##_settings = { \
-+ .attr = { .name = "profile##number##_settings", .mode = 0440 }, \
-+ .size = KONEPLUS_SIZE_PROFILE_SETTINGS, \
-+ .read = koneplus_sysfs_read_profilex_settings, \
-+ .private = &profile_numbers[number-1], \
-+}; \
-+static struct bin_attribute bin_attr_profile##number##_buttons = { \
-+ .attr = { .name = "profile##number##_buttons", .mode = 0440 }, \
-+ .size = KONEPLUS_SIZE_PROFILE_BUTTONS, \
-+ .read = koneplus_sysfs_read_profilex_buttons, \
-+ .private = &profile_numbers[number-1], \
-+};
-+PROFILE_ATTR(1);
-+PROFILE_ATTR(2);
-+PROFILE_ATTR(3);
-+PROFILE_ATTR(4);
-+PROFILE_ATTR(5);
-+
- static ssize_t koneplus_sysfs_show_actual_profile(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
-@@ -308,79 +329,38 @@ static struct attribute *koneplus_attrs[
- &dev_attr_firmware_version.attr,
- NULL,
- };
--ATTRIBUTE_GROUPS(koneplus);
-
--static struct bin_attribute koneplus_bin_attributes[] = {
-- KONEPLUS_BIN_ATTRIBUTE_W(control, CONTROL),
-- KONEPLUS_BIN_ATTRIBUTE_RW(info, INFO),
-- KONEPLUS_BIN_ATTRIBUTE_W(talk, TALK),
-- KONEPLUS_BIN_ATTRIBUTE_W(macro, MACRO),
-- KONEPLUS_BIN_ATTRIBUTE_RW(sensor, SENSOR),
-- KONEPLUS_BIN_ATTRIBUTE_RW(tcu, TCU),
-- KONEPLUS_BIN_ATTRIBUTE_R(tcu_image, TCU_IMAGE),
-- KONEPLUS_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS),
-- KONEPLUS_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS),
-- {
-- .attr = { .name = "profile1_settings", .mode = 0440 },
-- .size = KONEPLUS_SIZE_PROFILE_SETTINGS,
-- .read = koneplus_sysfs_read_profilex_settings,
-- .private = &profile_numbers[0]
-- },
-- {
-- .attr = { .name = "profile2_settings", .mode = 0440 },
-- .size = KONEPLUS_SIZE_PROFILE_SETTINGS,
-- .read = koneplus_sysfs_read_profilex_settings,
-- .private = &profile_numbers[1]
-- },
-- {
-- .attr = { .name = "profile3_settings", .mode = 0440 },
-- .size = KONEPLUS_SIZE_PROFILE_SETTINGS,
-- .read = koneplus_sysfs_read_profilex_settings,
-- .private = &profile_numbers[2]
-- },
-- {
-- .attr = { .name = "profile4_settings", .mode = 0440 },
-- .size = KONEPLUS_SIZE_PROFILE_SETTINGS,
-- .read = koneplus_sysfs_read_profilex_settings,
-- .private = &profile_numbers[3]
-- },
-- {
-- .attr = { .name = "profile5_settings", .mode = 0440 },
-- .size = KONEPLUS_SIZE_PROFILE_SETTINGS,
-- .read = koneplus_sysfs_read_profilex_settings,
-- .private = &profile_numbers[4]
-- },
-- {
-- .attr = { .name = "profile1_buttons", .mode = 0440 },
-- .size = KONEPLUS_SIZE_PROFILE_BUTTONS,
-- .read = koneplus_sysfs_read_profilex_buttons,
-- .private = &profile_numbers[0]
-- },
-- {
-- .attr = { .name = "profile2_buttons", .mode = 0440 },
-- .size = KONEPLUS_SIZE_PROFILE_BUTTONS,
-- .read = koneplus_sysfs_read_profilex_buttons,
-- .private = &profile_numbers[1]
-- },
-- {
-- .attr = { .name = "profile3_buttons", .mode = 0440 },
-- .size = KONEPLUS_SIZE_PROFILE_BUTTONS,
-- .read = koneplus_sysfs_read_profilex_buttons,
-- .private = &profile_numbers[2]
-- },
-- {
-- .attr = { .name = "profile4_buttons", .mode = 0440 },
-- .size = KONEPLUS_SIZE_PROFILE_BUTTONS,
-- .read = koneplus_sysfs_read_profilex_buttons,
-- .private = &profile_numbers[3]
-- },
-- {
-- .attr = { .name = "profile5_buttons", .mode = 0440 },
-- .size = KONEPLUS_SIZE_PROFILE_BUTTONS,
-- .read = koneplus_sysfs_read_profilex_buttons,
-- .private = &profile_numbers[4]
-- },
-- __ATTR_NULL
-+static struct bin_attribute *koneplus_bin_attributes[] = {
-+ &bin_attr_control,
-+ &bin_attr_talk,
-+ &bin_attr_macro,
-+ &bin_attr_tcu_image,
-+ &bin_attr_info,
-+ &bin_attr_sensor,
-+ &bin_attr_tcu,
-+ &bin_attr_profile_settings,
-+ &bin_attr_profile_buttons,
-+ &bin_attr_profile1_settings,
-+ &bin_attr_profile2_settings,
-+ &bin_attr_profile3_settings,
-+ &bin_attr_profile4_settings,
-+ &bin_attr_profile5_settings,
-+ &bin_attr_profile1_buttons,
-+ &bin_attr_profile2_buttons,
-+ &bin_attr_profile3_buttons,
-+ &bin_attr_profile4_buttons,
-+ &bin_attr_profile5_buttons,
-+ NULL,
-+};
-+
-+static const struct attribute_group koneplus_group = {
-+ .attrs = koneplus_attrs,
-+ .bin_attrs = koneplus_bin_attributes,
-+};
-+
-+static const struct attribute_group *koneplus_groups[] = {
-+ &koneplus_group,
-+ NULL,
- };
-
- static int koneplus_init_koneplus_device_struct(struct usb_device *usb_dev,
-@@ -577,7 +557,6 @@ static int __init koneplus_init(void)
- if (IS_ERR(koneplus_class))
- return PTR_ERR(koneplus_class);
- koneplus_class->dev_groups = koneplus_groups;
-- koneplus_class->dev_bin_attrs = koneplus_bin_attributes;
-
- retval = hid_register_driver(&koneplus_driver);
- if (retval)
---- a/drivers/hid/hid-roccat-konepure.c
-+++ b/drivers/hid/hid-roccat-konepure.c
-@@ -94,7 +94,8 @@ KONEPURE_SYSFS_W(thingy, THINGY) \
- KONEPURE_SYSFS_R(thingy, THINGY)
-
- #define KONEPURE_BIN_ATTRIBUTE_RW(thingy, THINGY) \
--{ \
-+KONEPURE_SYSFS_RW(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0660 }, \
- .size = KONEPURE_SIZE_ ## THINGY, \
- .read = konepure_sysfs_read_ ## thingy, \
-@@ -102,44 +103,56 @@ KONEPURE_SYSFS_R(thingy, THINGY)
- }
-
- #define KONEPURE_BIN_ATTRIBUTE_R(thingy, THINGY) \
--{ \
-+KONEPURE_SYSFS_R(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0440 }, \
- .size = KONEPURE_SIZE_ ## THINGY, \
- .read = konepure_sysfs_read_ ## thingy, \
- }
-
- #define KONEPURE_BIN_ATTRIBUTE_W(thingy, THINGY) \
--{ \
-+KONEPURE_SYSFS_W(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0220 }, \
- .size = KONEPURE_SIZE_ ## THINGY, \
- .write = konepure_sysfs_write_ ## thingy \
- }
-
--KONEPURE_SYSFS_RW(actual_profile, ACTUAL_PROFILE)
--KONEPURE_SYSFS_W(control, CONTROL)
--KONEPURE_SYSFS_RW(info, INFO)
--KONEPURE_SYSFS_W(talk, TALK)
--KONEPURE_SYSFS_W(macro, MACRO)
--KONEPURE_SYSFS_RW(sensor, SENSOR)
--KONEPURE_SYSFS_RW(tcu, TCU)
--KONEPURE_SYSFS_R(tcu_image, TCU_IMAGE)
--KONEPURE_SYSFS_RW(profile_settings, PROFILE_SETTINGS)
--KONEPURE_SYSFS_RW(profile_buttons, PROFILE_BUTTONS)
--
--static struct bin_attribute konepure_bin_attributes[] = {
-- KONEPURE_BIN_ATTRIBUTE_RW(actual_profile, ACTUAL_PROFILE),
-- KONEPURE_BIN_ATTRIBUTE_W(control, CONTROL),
-- KONEPURE_BIN_ATTRIBUTE_RW(info, INFO),
-- KONEPURE_BIN_ATTRIBUTE_W(talk, TALK),
-- KONEPURE_BIN_ATTRIBUTE_W(macro, MACRO),
-- KONEPURE_BIN_ATTRIBUTE_RW(sensor, SENSOR),
-- KONEPURE_BIN_ATTRIBUTE_RW(tcu, TCU),
-- KONEPURE_BIN_ATTRIBUTE_R(tcu_image, TCU_IMAGE),
-- KONEPURE_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS),
-- KONEPURE_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS),
-- __ATTR_NULL
-+KONEPURE_BIN_ATTRIBUTE_RW(actual_profile, ACTUAL_PROFILE);
-+KONEPURE_BIN_ATTRIBUTE_RW(info, INFO);
-+KONEPURE_BIN_ATTRIBUTE_RW(sensor, SENSOR);
-+KONEPURE_BIN_ATTRIBUTE_RW(tcu, TCU);
-+KONEPURE_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS);
-+KONEPURE_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS);
-+KONEPURE_BIN_ATTRIBUTE_W(control, CONTROL);
-+KONEPURE_BIN_ATTRIBUTE_W(talk, TALK);
-+KONEPURE_BIN_ATTRIBUTE_W(macro, MACRO);
-+KONEPURE_BIN_ATTRIBUTE_R(tcu_image, TCU_IMAGE);
-+
-+static struct bin_attribute *konepure_bin_attributes[] = {
-+ &bin_attr_actual_profile,
-+ &bin_attr_info,
-+ &bin_attr_sensor,
-+ &bin_attr_tcu,
-+ &bin_attr_profile_settings,
-+ &bin_attr_profile_buttons,
-+ &bin_attr_control,
-+ &bin_attr_talk,
-+ &bin_attr_macro,
-+ &bin_attr_tcu_image,
-+ NULL,
- };
-
-+static const struct attribute_group konepure_group = {
-+ .bin_attrs = konepure_bin_attributes,
-+};
-+
-+static const struct attribute_group *konepure_groups[] = {
-+ &konepure_group,
-+ NULL,
-+};
-+
-+
- static int konepure_init_konepure_device_struct(struct usb_device *usb_dev,
- struct konepure_device *konepure)
- {
-@@ -282,7 +295,7 @@ static int __init konepure_init(void)
- konepure_class = class_create(THIS_MODULE, "konepure");
- if (IS_ERR(konepure_class))
- return PTR_ERR(konepure_class);
-- konepure_class->dev_bin_attrs = konepure_bin_attributes;
-+ konepure_class->dev_groups = konepure_groups;
-
- retval = hid_register_driver(&konepure_driver);
- if (retval)
---- a/drivers/hid/hid-roccat-kovaplus.c
-+++ b/drivers/hid/hid-roccat-kovaplus.c
-@@ -197,31 +197,25 @@ KOVAPLUS_SYSFS_W(thingy, THINGY) \
- KOVAPLUS_SYSFS_R(thingy, THINGY)
-
- #define KOVAPLUS_BIN_ATTRIBUTE_RW(thingy, THINGY) \
--{ \
-+KOVAPLUS_SYSFS_RW(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0660 }, \
- .size = KOVAPLUS_SIZE_ ## THINGY, \
- .read = kovaplus_sysfs_read_ ## thingy, \
- .write = kovaplus_sysfs_write_ ## thingy \
- }
-
--#define KOVAPLUS_BIN_ATTRIBUTE_R(thingy, THINGY) \
--{ \
-- .attr = { .name = #thingy, .mode = 0440 }, \
-- .size = KOVAPLUS_SIZE_ ## THINGY, \
-- .read = kovaplus_sysfs_read_ ## thingy, \
--}
--
- #define KOVAPLUS_BIN_ATTRIBUTE_W(thingy, THINGY) \
--{ \
-+KOVAPLUS_SYSFS_W(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0220 }, \
- .size = KOVAPLUS_SIZE_ ## THINGY, \
- .write = kovaplus_sysfs_write_ ## thingy \
- }
--
--KOVAPLUS_SYSFS_W(control, CONTROL)
--KOVAPLUS_SYSFS_RW(info, INFO)
--KOVAPLUS_SYSFS_RW(profile_settings, PROFILE_SETTINGS)
--KOVAPLUS_SYSFS_RW(profile_buttons, PROFILE_BUTTONS)
-+KOVAPLUS_BIN_ATTRIBUTE_W(control, CONTROL);
-+KOVAPLUS_BIN_ATTRIBUTE_RW(info, INFO);
-+KOVAPLUS_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS);
-+KOVAPLUS_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS);
-
- static ssize_t kovaplus_sysfs_read_profilex_settings(struct file *fp,
- struct kobject *kobj, struct bin_attribute *attr, char *buf,
-@@ -261,6 +255,25 @@ static ssize_t kovaplus_sysfs_read_profi
- KOVAPLUS_COMMAND_PROFILE_BUTTONS);
- }
-
-+#define PROFILE_ATTR(number) \
-+static struct bin_attribute bin_attr_profile##number##_settings = { \
-+ .attr = { .name = "profile##number##_settings", .mode = 0440 }, \
-+ .size = KOVAPLUS_SIZE_PROFILE_SETTINGS, \
-+ .read = kovaplus_sysfs_read_profilex_settings, \
-+ .private = &profile_numbers[number-1], \
-+}; \
-+static struct bin_attribute bin_attr_profile##number##_buttons = { \
-+ .attr = { .name = "profile##number##_buttons", .mode = 0440 }, \
-+ .size = KOVAPLUS_SIZE_PROFILE_BUTTONS, \
-+ .read = kovaplus_sysfs_read_profilex_buttons, \
-+ .private = &profile_numbers[number-1], \
-+};
-+PROFILE_ATTR(1);
-+PROFILE_ATTR(2);
-+PROFILE_ATTR(3);
-+PROFILE_ATTR(4);
-+PROFILE_ATTR(5);
-+
- static ssize_t kovaplus_sysfs_show_actual_profile(struct device *dev,
- struct device_attribute *attr, char *buf)
- {
-@@ -372,74 +385,33 @@ static struct attribute *kovaplus_attrs[
- &dev_attr_actual_sensitivity_y.attr,
- NULL,
- };
--ATTRIBUTE_GROUPS(kovaplus);
-
--static struct bin_attribute kovaplus_bin_attributes[] = {
-- KOVAPLUS_BIN_ATTRIBUTE_W(control, CONTROL),
-- KOVAPLUS_BIN_ATTRIBUTE_RW(info, INFO),
-- KOVAPLUS_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS),
-- KOVAPLUS_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS),
-- {
-- .attr = { .name = "profile1_settings", .mode = 0440 },
-- .size = KOVAPLUS_SIZE_PROFILE_SETTINGS,
-- .read = kovaplus_sysfs_read_profilex_settings,
-- .private = &profile_numbers[0]
-- },
-- {
-- .attr = { .name = "profile2_settings", .mode = 0440 },
-- .size = KOVAPLUS_SIZE_PROFILE_SETTINGS,
-- .read = kovaplus_sysfs_read_profilex_settings,
-- .private = &profile_numbers[1]
-- },
-- {
-- .attr = { .name = "profile3_settings", .mode = 0440 },
-- .size = KOVAPLUS_SIZE_PROFILE_SETTINGS,
-- .read = kovaplus_sysfs_read_profilex_settings,
-- .private = &profile_numbers[2]
-- },
-- {
-- .attr = { .name = "profile4_settings", .mode = 0440 },
-- .size = KOVAPLUS_SIZE_PROFILE_SETTINGS,
-- .read = kovaplus_sysfs_read_profilex_settings,
-- .private = &profile_numbers[3]
-- },
-- {
-- .attr = { .name = "profile5_settings", .mode = 0440 },
-- .size = KOVAPLUS_SIZE_PROFILE_SETTINGS,
-- .read = kovaplus_sysfs_read_profilex_settings,
-- .private = &profile_numbers[4]
-- },
-- {
-- .attr = { .name = "profile1_buttons", .mode = 0440 },
-- .size = KOVAPLUS_SIZE_PROFILE_BUTTONS,
-- .read = kovaplus_sysfs_read_profilex_buttons,
-- .private = &profile_numbers[0]
-- },
-- {
-- .attr = { .name = "profile2_buttons", .mode = 0440 },
-- .size = KOVAPLUS_SIZE_PROFILE_BUTTONS,
-- .read = kovaplus_sysfs_read_profilex_buttons,
-- .private = &profile_numbers[1]
-- },
-- {
-- .attr = { .name = "profile3_buttons", .mode = 0440 },
-- .size = KOVAPLUS_SIZE_PROFILE_BUTTONS,
-- .read = kovaplus_sysfs_read_profilex_buttons,
-- .private = &profile_numbers[2]
-- },
-- {
-- .attr = { .name = "profile4_buttons", .mode = 0440 },
-- .size = KOVAPLUS_SIZE_PROFILE_BUTTONS,
-- .read = kovaplus_sysfs_read_profilex_buttons,
-- .private = &profile_numbers[3]
-- },
-- {
-- .attr = { .name = "profile5_buttons", .mode = 0440 },
-- .size = KOVAPLUS_SIZE_PROFILE_BUTTONS,
-- .read = kovaplus_sysfs_read_profilex_buttons,
-- .private = &profile_numbers[4]
-- },
-- __ATTR_NULL
-+static struct bin_attribute *kovaplus_bin_attributes[] = {
-+ &bin_attr_control,
-+ &bin_attr_info,
-+ &bin_attr_profile_settings,
-+ &bin_attr_profile_buttons,
-+ &bin_attr_profile1_settings,
-+ &bin_attr_profile2_settings,
-+ &bin_attr_profile3_settings,
-+ &bin_attr_profile4_settings,
-+ &bin_attr_profile5_settings,
-+ &bin_attr_profile1_buttons,
-+ &bin_attr_profile2_buttons,
-+ &bin_attr_profile3_buttons,
-+ &bin_attr_profile4_buttons,
-+ &bin_attr_profile5_buttons,
-+ NULL,
-+};
-+
-+static const struct attribute_group kovaplus_group = {
-+ .attrs = kovaplus_attrs,
-+ .bin_attrs = kovaplus_bin_attributes,
-+};
-+
-+static const struct attribute_group *kovaplus_groups[] = {
-+ &kovaplus_group,
-+ NULL,
- };
-
- static int kovaplus_init_kovaplus_device_struct(struct usb_device *usb_dev,
-@@ -668,7 +640,6 @@ static int __init kovaplus_init(void)
- if (IS_ERR(kovaplus_class))
- return PTR_ERR(kovaplus_class);
- kovaplus_class->dev_groups = kovaplus_groups;
-- kovaplus_class->dev_bin_attrs = kovaplus_bin_attributes;
-
- retval = hid_register_driver(&kovaplus_driver);
- if (retval)
---- a/drivers/hid/hid-roccat-pyra.c
-+++ b/drivers/hid/hid-roccat-pyra.c
-@@ -156,7 +156,8 @@ PYRA_SYSFS_W(thingy, THINGY) \
- PYRA_SYSFS_R(thingy, THINGY)
-
- #define PYRA_BIN_ATTRIBUTE_RW(thingy, THINGY) \
--{ \
-+PYRA_SYSFS_RW(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0660 }, \
- .size = PYRA_SIZE_ ## THINGY, \
- .read = pyra_sysfs_read_ ## thingy, \
-@@ -164,24 +165,26 @@ PYRA_SYSFS_R(thingy, THINGY)
- }
-
- #define PYRA_BIN_ATTRIBUTE_R(thingy, THINGY) \
--{ \
-+PYRA_SYSFS_R(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0440 }, \
- .size = PYRA_SIZE_ ## THINGY, \
- .read = pyra_sysfs_read_ ## thingy, \
- }
-
- #define PYRA_BIN_ATTRIBUTE_W(thingy, THINGY) \
--{ \
-+PYRA_SYSFS_W(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0220 }, \
- .size = PYRA_SIZE_ ## THINGY, \
- .write = pyra_sysfs_write_ ## thingy \
- }
-
--PYRA_SYSFS_W(control, CONTROL)
--PYRA_SYSFS_RW(info, INFO)
--PYRA_SYSFS_RW(profile_settings, PROFILE_SETTINGS)
--PYRA_SYSFS_RW(profile_buttons, PROFILE_BUTTONS)
--PYRA_SYSFS_R(settings, SETTINGS)
-+PYRA_BIN_ATTRIBUTE_W(control, CONTROL);
-+PYRA_BIN_ATTRIBUTE_RW(info, INFO);
-+PYRA_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS);
-+PYRA_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS);
-+PYRA_BIN_ATTRIBUTE_R(settings, SETTINGS);
-
- static ssize_t pyra_sysfs_read_profilex_settings(struct file *fp,
- struct kobject *kobj, struct bin_attribute *attr, char *buf,
-@@ -221,6 +224,25 @@ static ssize_t pyra_sysfs_read_profilex_
- PYRA_COMMAND_PROFILE_BUTTONS);
- }
-
-+#define PROFILE_ATTR(number) \
-+static struct bin_attribute bin_attr_profile##number##_settings = { \
-+ .attr = { .name = "profile##number##_settings", .mode = 0440 }, \
-+ .size = PYRA_SIZE_PROFILE_SETTINGS, \
-+ .read = pyra_sysfs_read_profilex_settings, \
-+ .private = &profile_numbers[number-1], \
-+}; \
-+static struct bin_attribute bin_attr_profile##number##_buttons = { \
-+ .attr = { .name = "profile##number##_buttons", .mode = 0440 }, \
-+ .size = PYRA_SIZE_PROFILE_BUTTONS, \
-+ .read = pyra_sysfs_read_profilex_buttons, \
-+ .private = &profile_numbers[number-1], \
-+};
-+PROFILE_ATTR(1);
-+PROFILE_ATTR(2);
-+PROFILE_ATTR(3);
-+PROFILE_ATTR(4);
-+PROFILE_ATTR(5);
-+
- static ssize_t pyra_sysfs_write_settings(struct file *fp,
- struct kobject *kobj, struct bin_attribute *attr, char *buf,
- loff_t off, size_t count)
-@@ -314,75 +336,34 @@ static struct attribute *pyra_attrs[] =
- &dev_attr_startup_profile.attr,
- NULL,
- };
--ATTRIBUTE_GROUPS(pyra);
-
--static struct bin_attribute pyra_bin_attributes[] = {
-- PYRA_BIN_ATTRIBUTE_W(control, CONTROL),
-- PYRA_BIN_ATTRIBUTE_RW(info, INFO),
-- PYRA_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS),
-- PYRA_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS),
-- PYRA_BIN_ATTRIBUTE_RW(settings, SETTINGS),
-- {
-- .attr = { .name = "profile1_settings", .mode = 0440 },
-- .size = PYRA_SIZE_PROFILE_SETTINGS,
-- .read = pyra_sysfs_read_profilex_settings,
-- .private = &profile_numbers[0]
-- },
-- {
-- .attr = { .name = "profile2_settings", .mode = 0440 },
-- .size = PYRA_SIZE_PROFILE_SETTINGS,
-- .read = pyra_sysfs_read_profilex_settings,
-- .private = &profile_numbers[1]
-- },
-- {
-- .attr = { .name = "profile3_settings", .mode = 0440 },
-- .size = PYRA_SIZE_PROFILE_SETTINGS,
-- .read = pyra_sysfs_read_profilex_settings,
-- .private = &profile_numbers[2]
-- },
-- {
-- .attr = { .name = "profile4_settings", .mode = 0440 },
-- .size = PYRA_SIZE_PROFILE_SETTINGS,
-- .read = pyra_sysfs_read_profilex_settings,
-- .private = &profile_numbers[3]
-- },
-- {
-- .attr = { .name = "profile5_settings", .mode = 0440 },
-- .size = PYRA_SIZE_PROFILE_SETTINGS,
-- .read = pyra_sysfs_read_profilex_settings,
-- .private = &profile_numbers[4]
-- },
-- {
-- .attr = { .name = "profile1_buttons", .mode = 0440 },
-- .size = PYRA_SIZE_PROFILE_BUTTONS,
-- .read = pyra_sysfs_read_profilex_buttons,
-- .private = &profile_numbers[0]
-- },
-- {
-- .attr = { .name = "profile2_buttons", .mode = 0440 },
-- .size = PYRA_SIZE_PROFILE_BUTTONS,
-- .read = pyra_sysfs_read_profilex_buttons,
-- .private = &profile_numbers[1]
-- },
-- {
-- .attr = { .name = "profile3_buttons", .mode = 0440 },
-- .size = PYRA_SIZE_PROFILE_BUTTONS,
-- .read = pyra_sysfs_read_profilex_buttons,
-- .private = &profile_numbers[2]
-- },
-- {
-- .attr = { .name = "profile4_buttons", .mode = 0440 },
-- .size = PYRA_SIZE_PROFILE_BUTTONS,
-- .read = pyra_sysfs_read_profilex_buttons,
-- .private = &profile_numbers[3]
-- },
-- {
-- .attr = { .name = "profile5_buttons", .mode = 0440 },
-- .size = PYRA_SIZE_PROFILE_BUTTONS,
-- .read = pyra_sysfs_read_profilex_buttons,
-- .private = &profile_numbers[4]
-- },
-- __ATTR_NULL
-+static struct bin_attribute *pyra_bin_attributes[] = {
-+ &bin_attr_control,
-+ &bin_attr_info,
-+ &bin_attr_profile_settings,
-+ &bin_attr_profile_buttons,
-+ &bin_attr_settings,
-+ &bin_attr_profile1_settings,
-+ &bin_attr_profile2_settings,
-+ &bin_attr_profile3_settings,
-+ &bin_attr_profile4_settings,
-+ &bin_attr_profile5_settings,
-+ &bin_attr_profile1_buttons,
-+ &bin_attr_profile2_buttons,
-+ &bin_attr_profile3_buttons,
-+ &bin_attr_profile4_buttons,
-+ &bin_attr_profile5_buttons,
-+ NULL,
-+};
-+
-+static const struct attribute_group pyra_group = {
-+ .attrs = pyra_attrs,
-+ .bin_attrs = pyra_bin_attributes,
-+};
-+
-+static const struct attribute_group *pyra_groups[] = {
-+ &pyra_group,
-+ NULL,
- };
-
- static int pyra_init_pyra_device_struct(struct usb_device *usb_dev,
-@@ -605,7 +586,6 @@ static int __init pyra_init(void)
- if (IS_ERR(pyra_class))
- return PTR_ERR(pyra_class);
- pyra_class->dev_groups = pyra_groups;
-- pyra_class->dev_bin_attrs = pyra_bin_attributes;
-
- retval = hid_register_driver(&pyra_driver);
- if (retval)
---- a/drivers/hid/hid-roccat-savu.c
-+++ b/drivers/hid/hid-roccat-savu.c
-@@ -94,44 +94,48 @@ SAVU_SYSFS_W(thingy, THINGY) \
- SAVU_SYSFS_R(thingy, THINGY)
-
- #define SAVU_BIN_ATTRIBUTE_RW(thingy, THINGY) \
--{ \
-+SAVU_SYSFS_RW(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0660 }, \
- .size = SAVU_SIZE_ ## THINGY, \
- .read = savu_sysfs_read_ ## thingy, \
- .write = savu_sysfs_write_ ## thingy \
- }
-
--#define SAVU_BIN_ATTRIBUTE_R(thingy, THINGY) \
--{ \
-- .attr = { .name = #thingy, .mode = 0440 }, \
-- .size = SAVU_SIZE_ ## THINGY, \
-- .read = savu_sysfs_read_ ## thingy, \
--}
--
- #define SAVU_BIN_ATTRIBUTE_W(thingy, THINGY) \
--{ \
-+SAVU_SYSFS_W(thingy, THINGY); \
-+static struct bin_attribute bin_attr_##thingy = { \
- .attr = { .name = #thingy, .mode = 0220 }, \
- .size = SAVU_SIZE_ ## THINGY, \
- .write = savu_sysfs_write_ ## thingy \
- }
-
--SAVU_SYSFS_W(control, CONTROL)
--SAVU_SYSFS_RW(profile, PROFILE)
--SAVU_SYSFS_RW(general, GENERAL)
--SAVU_SYSFS_RW(buttons, BUTTONS)
--SAVU_SYSFS_RW(macro, MACRO)
--SAVU_SYSFS_RW(info, INFO)
--SAVU_SYSFS_RW(sensor, SENSOR)
--
--static struct bin_attribute savu_bin_attributes[] = {
-- SAVU_BIN_ATTRIBUTE_W(control, CONTROL),
-- SAVU_BIN_ATTRIBUTE_RW(profile, PROFILE),
-- SAVU_BIN_ATTRIBUTE_RW(general, GENERAL),
-- SAVU_BIN_ATTRIBUTE_RW(buttons, BUTTONS),
-- SAVU_BIN_ATTRIBUTE_RW(macro, MACRO),
-- SAVU_BIN_ATTRIBUTE_RW(info, INFO),
-- SAVU_BIN_ATTRIBUTE_RW(sensor, SENSOR),
-- __ATTR_NULL
-+SAVU_BIN_ATTRIBUTE_W(control, CONTROL);
-+SAVU_BIN_ATTRIBUTE_RW(profile, PROFILE);
-+SAVU_BIN_ATTRIBUTE_RW(general, GENERAL);
-+SAVU_BIN_ATTRIBUTE_RW(buttons, BUTTONS);
-+SAVU_BIN_ATTRIBUTE_RW(macro, MACRO);
-+SAVU_BIN_ATTRIBUTE_RW(info, INFO);
-+SAVU_BIN_ATTRIBUTE_RW(sensor, SENSOR);
-+
-+static struct bin_attribute *savu_bin_attributes[] = {
-+ &bin_attr_control,
-+ &bin_attr_profile,
-+ &bin_attr_general,
-+ &bin_attr_buttons,
-+ &bin_attr_macro,
-+ &bin_attr_info,
-+ &bin_attr_sensor,
-+ NULL,
-+};
-+
-+static const struct attribute_group savu_group = {
-+ .bin_attrs = savu_bin_attributes,
-+};
-+
-+static const struct attribute_group *savu_groups[] = {
-+ &savu_group,
-+ NULL,
- };
-
- static int savu_init_savu_device_struct(struct usb_device *usb_dev,
-@@ -294,7 +298,7 @@ static int __init savu_init(void)
- savu_class = class_create(THIS_MODULE, "savu");
- if (IS_ERR(savu_class))
- return PTR_ERR(savu_class);
-- savu_class->dev_bin_attrs = savu_bin_attributes;
-+ savu_class->dev_groups = savu_groups;
-
- retval = hid_register_driver(&savu_driver);
- if (retval)