mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
Driver core patches for 3.12-rc1
Here's the big driver core pull request for 3.12-rc1. Lots of tiny changes here fixing up the way sysfs attributes are created, to try to make drivers simpler, and fix a whole class race conditions with creations of device attributes after the device was announced to userspace. All the various pieces are acked by the different subsystem maintainers. Signed-off-by: Greg Kroah-Hartman <[email protected]> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.21 (GNU/Linux) iEYEABECAAYFAlIlIPcACgkQMUfUDdst+ynUMwCaAnITsxyDXYQ4DqEsz8EcOtMk 718AoLrgnUZs3B+70AT34DVktg4HSThk =USl9 -----END PGP SIGNATURE----- Merge tag 'driver-core-3.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core Pull driver core patches from Greg KH: "Here's the big driver core pull request for 3.12-rc1. Lots of tiny changes here fixing up the way sysfs attributes are created, to try to make drivers simpler, and fix a whole class race conditions with creations of device attributes after the device was announced to userspace. All the various pieces are acked by the different subsystem maintainers" * tag 'driver-core-3.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: (119 commits) firmware loader: fix pending_fw_head list corruption drivers/base/memory.c: introduce help macro to_memory_block dynamic debug: line queries failing due to uninitialized local variable sysfs: sysfs_create_groups returns a value. debugfs: provide debugfs_create_x64() when disabled rbd: convert bus code to use bus_groups firmware: dcdbas: use binary attribute groups sysfs: add sysfs_create/remove_groups for when SYSFS is not enabled driver core: add #include <linux/sysfs.h> to core files. HID: convert bus code to use dev_groups Input: serio: convert bus code to use drv_groups Input: gameport: convert bus code to use drv_groups driver core: firmware: use __ATTR_RW() driver core: core: use DEVICE_ATTR_RO driver core: bus: use DRIVER_ATTR_WO() driver core: create write-only attribute macros for devices and drivers sysfs: create __ATTR_WO() driver-core: platform: convert bus code to use dev_groups workqueue: convert bus code to use dev_groups MEI: convert bus code to use dev_groups ...
This commit is contained in:
commit
542a086ac7
99 changed files with 1958 additions and 1915 deletions
|
|
@ -1917,11 +1917,13 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
|
|||
|
||||
return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
|
||||
}
|
||||
static DEVICE_ATTR_RO(modalias);
|
||||
|
||||
static struct device_attribute hid_dev_attrs[] = {
|
||||
__ATTR_RO(modalias),
|
||||
__ATTR_NULL,
|
||||
static struct attribute *hid_dev_attrs[] = {
|
||||
&dev_attr_modalias.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(hid_dev);
|
||||
|
||||
static int hid_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||
{
|
||||
|
|
@ -1949,7 +1951,7 @@ static int hid_uevent(struct device *dev, struct kobj_uevent_env *env)
|
|||
|
||||
static struct bus_type hid_bus_type = {
|
||||
.name = "hid",
|
||||
.dev_attrs = hid_dev_attrs,
|
||||
.dev_groups = hid_dev_groups,
|
||||
.match = hid_bus_match,
|
||||
.probe = hid_device_probe,
|
||||
.remove = hid_device_remove,
|
||||
|
|
|
|||
|
|
@ -75,6 +75,8 @@ static ssize_t arvo_sysfs_set_mode_key(struct device *dev,
|
|||
|
||||
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(struct device *dev,
|
|||
|
||||
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_profile(struct device *dev,
|
|||
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,
|
||||
|
|
@ -230,6 +237,8 @@ static ssize_t arvo_sysfs_write_button(struct file *fp,
|
|||
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,
|
||||
|
|
@ -238,31 +247,30 @@ static ssize_t arvo_sysfs_read_info(struct file *fp,
|
|||
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 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,
|
||||
};
|
||||
|
||||
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,
|
||||
|
|
@ -430,8 +438,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_bin_attrs = arvo_bin_attributes;
|
||||
arvo_class->dev_groups = arvo_groups;
|
||||
|
||||
retval = hid_register_driver(&arvo_driver);
|
||||
if (retval)
|
||||
|
|
|
|||
|
|
@ -109,12 +109,12 @@ static ssize_t isku_sysfs_set_actual_profile(struct device *dev,
|
|||
|
||||
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,
|
||||
};
|
||||
|
||||
static ssize_t isku_sysfs_read(struct file *fp, struct kobject *kobj,
|
||||
|
|
@ -184,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, \
|
||||
|
|
@ -192,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)
|
||||
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[] = {
|
||||
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
|
||||
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,
|
||||
|
|
@ -427,8 +440,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_bin_attrs = isku_bin_attributes;
|
||||
isku_class->dev_groups = isku_groups;
|
||||
|
||||
retval = hid_register_driver(&isku_driver);
|
||||
if (retval)
|
||||
|
|
|
|||
|
|
@ -324,6 +324,8 @@ static ssize_t kone_sysfs_write_settings(struct file *fp, struct kobject *kobj,
|
|||
|
||||
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(struct file *fp,
|
|||
|
||||
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-1], \
|
||||
};
|
||||
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)
|
||||
|
|
@ -386,6 +401,7 @@ static ssize_t kone_sysfs_show_actual_profile(struct device *dev,
|
|||
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 +410,7 @@ static ssize_t kone_sysfs_show_actual_dpi(struct device *dev,
|
|||
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 +433,7 @@ static ssize_t kone_sysfs_show_weight(struct device *dev,
|
|||
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 +442,8 @@ static ssize_t kone_sysfs_show_firmware_version(struct device *dev,
|
|||
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 +544,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 +591,17 @@ static ssize_t kone_sysfs_set_startup_profile(struct device *dev,
|
|||
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 +610,7 @@ static struct device_attribute kone_attributes[] = {
|
|||
* 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,66 +618,38 @@ static struct device_attribute kone_attributes[] = {
|
|||
* 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,
|
||||
};
|
||||
|
||||
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,
|
||||
|
|
@ -891,8 +886,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_bin_attrs = kone_bin_attributes;
|
||||
kone_class->dev_groups = kone_groups;
|
||||
|
||||
retval = hid_register_driver(&kone_driver);
|
||||
if (retval)
|
||||
|
|
|
|||
|
|
@ -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_profilex_buttons(struct file *fp,
|
|||
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)
|
||||
{
|
||||
|
|
@ -274,6 +295,12 @@ static ssize_t koneplus_sysfs_set_actual_profile(struct device *dev,
|
|||
|
||||
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,90 +320,47 @@ static ssize_t koneplus_sysfs_show_firmware_version(struct device *dev,
|
|||
|
||||
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,
|
||||
};
|
||||
|
||||
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,
|
||||
|
|
@ -572,8 +556,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_bin_attrs = koneplus_bin_attributes;
|
||||
koneplus_class->dev_groups = koneplus_groups;
|
||||
|
||||
retval = hid_register_driver(&koneplus_driver);
|
||||
if (retval)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
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[] = {
|
||||
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
|
||||
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)
|
||||
|
|
|
|||
|
|
@ -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_profilex_buttons(struct file *fp,
|
|||
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)
|
||||
{
|
||||
|
|
@ -310,6 +323,9 @@ static ssize_t kovaplus_sysfs_set_actual_profile(struct device *dev,
|
|||
|
||||
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 +334,7 @@ static ssize_t kovaplus_sysfs_show_actual_cpi(struct device *dev,
|
|||
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 +343,8 @@ static ssize_t kovaplus_sysfs_show_actual_sensitivity_x(struct device *dev,
|
|||
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 +353,8 @@ static ssize_t kovaplus_sysfs_show_actual_sensitivity_y(struct device *dev,
|
|||
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,88 +374,44 @@ static ssize_t kovaplus_sysfs_show_firmware_version(struct device *dev,
|
|||
|
||||
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,
|
||||
};
|
||||
|
||||
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,
|
||||
|
|
@ -662,8 +639,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_bin_attrs = kovaplus_bin_attributes;
|
||||
kovaplus_class->dev_groups = kovaplus_groups;
|
||||
|
||||
retval = hid_register_driver(&kovaplus_driver);
|
||||
if (retval)
|
||||
|
|
|
|||
|
|
@ -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,25 @@ 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);
|
||||
|
||||
static ssize_t pyra_sysfs_read_profilex_settings(struct file *fp,
|
||||
struct kobject *kobj, struct bin_attribute *attr, char *buf,
|
||||
|
|
@ -221,6 +223,25 @@ static ssize_t pyra_sysfs_read_profilex_buttons(struct file *fp,
|
|||
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)
|
||||
|
|
@ -258,6 +279,11 @@ static ssize_t pyra_sysfs_write_settings(struct file *fp,
|
|||
return PYRA_SIZE_SETTINGS;
|
||||
}
|
||||
|
||||
PYRA_SYSFS_R(settings, SETTINGS);
|
||||
static struct bin_attribute bin_attr_settings =
|
||||
__BIN_ATTR(settings, (S_IWUSR | S_IRUGO),
|
||||
pyra_sysfs_read_settings, pyra_sysfs_write_settings,
|
||||
PYRA_SIZE_SETTINGS);
|
||||
|
||||
static ssize_t pyra_sysfs_show_actual_cpi(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
|
|
@ -266,6 +292,7 @@ static ssize_t pyra_sysfs_show_actual_cpi(struct device *dev,
|
|||
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 +309,8 @@ static ssize_t pyra_sysfs_show_actual_profile(struct device *dev,
|
|||
|
||||
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,84 +330,44 @@ static ssize_t pyra_sysfs_show_firmware_version(struct device *dev,
|
|||
|
||||
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,
|
||||
};
|
||||
|
||||
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,
|
||||
|
|
@ -600,8 +589,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_bin_attrs = pyra_bin_attributes;
|
||||
pyra_class->dev_groups = pyra_groups;
|
||||
|
||||
retval = hid_register_driver(&pyra_driver);
|
||||
if (retval)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
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[] = {
|
||||
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
|
||||
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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue