|
@@ -167,28 +167,28 @@ static int koneplus_set_profile_buttons(struct usb_device *usb_dev,
|
|
|
}
|
|
|
|
|
|
/* retval is 0-4 on success, < 0 on error */
|
|
|
-static int koneplus_get_startup_profile(struct usb_device *usb_dev)
|
|
|
+static int koneplus_get_actual_profile(struct usb_device *usb_dev)
|
|
|
{
|
|
|
- struct koneplus_startup_profile buf;
|
|
|
+ struct koneplus_actual_profile buf;
|
|
|
int retval;
|
|
|
|
|
|
- retval = roccat_common_receive(usb_dev, KONEPLUS_USB_COMMAND_STARTUP_PROFILE,
|
|
|
- &buf, sizeof(struct koneplus_startup_profile));
|
|
|
+ retval = roccat_common_receive(usb_dev, KONEPLUS_USB_COMMAND_ACTUAL_PROFILE,
|
|
|
+ &buf, sizeof(struct koneplus_actual_profile));
|
|
|
|
|
|
- return retval ? retval : buf.startup_profile;
|
|
|
+ return retval ? retval : buf.actual_profile;
|
|
|
}
|
|
|
|
|
|
-static int koneplus_set_startup_profile(struct usb_device *usb_dev,
|
|
|
- int startup_profile)
|
|
|
+static int koneplus_set_actual_profile(struct usb_device *usb_dev,
|
|
|
+ int new_profile)
|
|
|
{
|
|
|
- struct koneplus_startup_profile buf;
|
|
|
+ struct koneplus_actual_profile buf;
|
|
|
|
|
|
- buf.command = KONEPLUS_COMMAND_STARTUP_PROFILE;
|
|
|
- buf.size = sizeof(struct koneplus_startup_profile);
|
|
|
- buf.startup_profile = startup_profile;
|
|
|
+ buf.command = KONEPLUS_COMMAND_ACTUAL_PROFILE;
|
|
|
+ buf.size = sizeof(struct koneplus_actual_profile);
|
|
|
+ buf.actual_profile = new_profile;
|
|
|
|
|
|
- return koneplus_send(usb_dev, KONEPLUS_USB_COMMAND_STARTUP_PROFILE,
|
|
|
- &buf, sizeof(struct koneplus_profile_buttons));
|
|
|
+ return koneplus_send(usb_dev, KONEPLUS_USB_COMMAND_ACTUAL_PROFILE,
|
|
|
+ &buf, sizeof(struct koneplus_actual_profile));
|
|
|
}
|
|
|
|
|
|
static ssize_t koneplus_sysfs_read(struct file *fp, struct kobject *kobj,
|
|
@@ -398,21 +398,22 @@ static ssize_t koneplus_sysfs_write_profile_buttons(struct file *fp,
|
|
|
return sizeof(struct koneplus_profile_buttons);
|
|
|
}
|
|
|
|
|
|
-static ssize_t koneplus_sysfs_show_startup_profile(struct device *dev,
|
|
|
+static ssize_t koneplus_sysfs_show_actual_profile(struct device *dev,
|
|
|
struct device_attribute *attr, char *buf)
|
|
|
{
|
|
|
struct koneplus_device *koneplus =
|
|
|
hid_get_drvdata(dev_get_drvdata(dev->parent->parent));
|
|
|
- return snprintf(buf, PAGE_SIZE, "%d\n", koneplus->startup_profile);
|
|
|
+ return snprintf(buf, PAGE_SIZE, "%d\n", koneplus->actual_profile);
|
|
|
}
|
|
|
|
|
|
-static ssize_t koneplus_sysfs_set_startup_profile(struct device *dev,
|
|
|
+static ssize_t koneplus_sysfs_set_actual_profile(struct device *dev,
|
|
|
struct device_attribute *attr, char const *buf, size_t size)
|
|
|
{
|
|
|
struct koneplus_device *koneplus;
|
|
|
struct usb_device *usb_dev;
|
|
|
unsigned long profile;
|
|
|
int retval;
|
|
|
+ struct koneplus_roccat_report roccat_report;
|
|
|
|
|
|
dev = dev->parent->parent;
|
|
|
koneplus = hid_get_drvdata(dev_get_drvdata(dev));
|
|
@@ -423,20 +424,25 @@ static ssize_t koneplus_sysfs_set_startup_profile(struct device *dev,
|
|
|
return retval;
|
|
|
|
|
|
mutex_lock(&koneplus->koneplus_lock);
|
|
|
- retval = koneplus_set_startup_profile(usb_dev, profile);
|
|
|
- mutex_unlock(&koneplus->koneplus_lock);
|
|
|
- if (retval)
|
|
|
+
|
|
|
+ retval = koneplus_set_actual_profile(usb_dev, profile);
|
|
|
+ if (retval) {
|
|
|
+ mutex_unlock(&koneplus->koneplus_lock);
|
|
|
return retval;
|
|
|
+ }
|
|
|
|
|
|
- return size;
|
|
|
-}
|
|
|
+ koneplus->actual_profile = profile;
|
|
|
|
|
|
-static ssize_t koneplus_sysfs_show_actual_profile(struct device *dev,
|
|
|
- struct device_attribute *attr, char *buf)
|
|
|
-{
|
|
|
- struct koneplus_device *koneplus =
|
|
|
- hid_get_drvdata(dev_get_drvdata(dev->parent->parent));
|
|
|
- return snprintf(buf, PAGE_SIZE, "%d\n", koneplus->actual_profile);
|
|
|
+ roccat_report.type = KONEPLUS_MOUSE_REPORT_BUTTON_TYPE_PROFILE;
|
|
|
+ roccat_report.data1 = profile + 1;
|
|
|
+ roccat_report.data2 = 0;
|
|
|
+ roccat_report.profile = profile + 1;
|
|
|
+ roccat_report_event(koneplus->chrdev_minor,
|
|
|
+ (uint8_t const *)&roccat_report);
|
|
|
+
|
|
|
+ mutex_unlock(&koneplus->koneplus_lock);
|
|
|
+
|
|
|
+ return size;
|
|
|
}
|
|
|
|
|
|
static ssize_t koneplus_sysfs_show_firmware_version(struct device *dev,
|
|
@@ -448,11 +454,12 @@ static ssize_t koneplus_sysfs_show_firmware_version(struct device *dev,
|
|
|
}
|
|
|
|
|
|
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_startup_profile,
|
|
|
- koneplus_sysfs_set_startup_profile),
|
|
|
- __ATTR(actual_profile, 0440,
|
|
|
- koneplus_sysfs_show_actual_profile, NULL),
|
|
|
+ koneplus_sysfs_show_actual_profile,
|
|
|
+ koneplus_sysfs_set_actual_profile),
|
|
|
__ATTR(firmware_version, 0440,
|
|
|
koneplus_sysfs_show_firmware_version, NULL),
|
|
|
__ATTR_NULL
|
|
@@ -557,15 +564,10 @@ static int koneplus_init_koneplus_device_struct(struct usb_device *usb_dev,
|
|
|
struct koneplus_device *koneplus)
|
|
|
{
|
|
|
int retval, i;
|
|
|
- static uint wait = 100; /* device will freeze with just 60 */
|
|
|
+ static uint wait = 200;
|
|
|
|
|
|
mutex_init(&koneplus->koneplus_lock);
|
|
|
|
|
|
- koneplus->startup_profile = koneplus_get_startup_profile(usb_dev);
|
|
|
- if (koneplus->startup_profile < 0)
|
|
|
- return koneplus->startup_profile;
|
|
|
-
|
|
|
- msleep(wait);
|
|
|
retval = koneplus_get_info(usb_dev, &koneplus->info);
|
|
|
if (retval)
|
|
|
return retval;
|
|
@@ -584,7 +586,11 @@ static int koneplus_init_koneplus_device_struct(struct usb_device *usb_dev,
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
- koneplus_profile_activated(koneplus, koneplus->startup_profile);
|
|
|
+ msleep(wait);
|
|
|
+ retval = koneplus_get_actual_profile(usb_dev);
|
|
|
+ if (retval < 0)
|
|
|
+ return retval;
|
|
|
+ koneplus_profile_activated(koneplus, retval);
|
|
|
|
|
|
return 0;
|
|
|
}
|