^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef __HID_ROCCAT_COMMON_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define __HID_ROCCAT_COMMON_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (c) 2011 Stefan Achatz <erazor_de@users.sourceforge.net>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) enum roccat_common2_commands {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) ROCCAT_COMMON_COMMAND_CONTROL = 0x4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) struct roccat_common2_control {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) uint8_t command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) uint8_t value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) uint8_t request; /* always 0 on requesting write check */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) int roccat_common2_receive(struct usb_device *usb_dev, uint report_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) void *data, uint size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) int roccat_common2_send(struct usb_device *usb_dev, uint report_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) void const *data, uint size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) int roccat_common2_send_with_status(struct usb_device *usb_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) uint command, void const *buf, uint size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) struct roccat_common2_device {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) int roccat_claimed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) int chrdev_minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct mutex lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) int roccat_common2_device_init_struct(struct usb_device *usb_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) struct roccat_common2_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) ssize_t roccat_common2_sysfs_read(struct file *fp, struct kobject *kobj,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) char *buf, loff_t off, size_t count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) size_t real_size, uint command);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) ssize_t roccat_common2_sysfs_write(struct file *fp, struct kobject *kobj,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) void const *buf, loff_t off, size_t count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) size_t real_size, uint command);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define ROCCAT_COMMON2_SYSFS_W(thingy, COMMAND, SIZE) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) static ssize_t roccat_common2_sysfs_write_ ## thingy(struct file *fp, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct kobject *kobj, struct bin_attribute *attr, char *buf, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) loff_t off, size_t count) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) return roccat_common2_sysfs_write(fp, kobj, buf, off, count, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) SIZE, COMMAND); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define ROCCAT_COMMON2_SYSFS_R(thingy, COMMAND, SIZE) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) static ssize_t roccat_common2_sysfs_read_ ## thingy(struct file *fp, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct kobject *kobj, struct bin_attribute *attr, char *buf, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) loff_t off, size_t count) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) return roccat_common2_sysfs_read(fp, kobj, buf, off, count, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) SIZE, COMMAND); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define ROCCAT_COMMON2_SYSFS_RW(thingy, COMMAND, SIZE) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) ROCCAT_COMMON2_SYSFS_W(thingy, COMMAND, SIZE) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) ROCCAT_COMMON2_SYSFS_R(thingy, COMMAND, SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define ROCCAT_COMMON2_BIN_ATTRIBUTE_RW(thingy, COMMAND, SIZE) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) ROCCAT_COMMON2_SYSFS_RW(thingy, COMMAND, SIZE); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) static struct bin_attribute bin_attr_ ## thingy = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .attr = { .name = #thingy, .mode = 0660 }, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) .size = SIZE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) .read = roccat_common2_sysfs_read_ ## thingy, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) .write = roccat_common2_sysfs_write_ ## thingy \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define ROCCAT_COMMON2_BIN_ATTRIBUTE_R(thingy, COMMAND, SIZE) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) ROCCAT_COMMON2_SYSFS_R(thingy, COMMAND, SIZE); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) static struct bin_attribute bin_attr_ ## thingy = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .attr = { .name = #thingy, .mode = 0440 }, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .size = SIZE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) .read = roccat_common2_sysfs_read_ ## thingy, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define ROCCAT_COMMON2_BIN_ATTRIBUTE_W(thingy, COMMAND, SIZE) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) ROCCAT_COMMON2_SYSFS_W(thingy, COMMAND, SIZE); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) static struct bin_attribute bin_attr_ ## thingy = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) .attr = { .name = #thingy, .mode = 0220 }, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) .size = SIZE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .write = roccat_common2_sysfs_write_ ## thingy \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #endif