Merge branch 'master' into upstream.
[pandora-kernel.git] / drivers / hid / hid-roccat-koneplus.c
index 33eec74..5b640a7 100644 (file)
@@ -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;
 }