Merge branch 'master' into upstream.
authorJiri Kosina <jkosina@suse.cz>
Wed, 18 May 2011 15:06:31 +0000 (17:06 +0200)
committerJiri Kosina <jkosina@suse.cz>
Wed, 18 May 2011 15:06:49 +0000 (17:06 +0200)
This is sync with Linus' tree to receive KEY_IMAGES definition
that went in through input tree.

Documentation/ABI/obsolete/sysfs-driver-hid-roccat-koneplus [new file with mode: 0644]
Documentation/ABI/testing/sysfs-driver-hid-roccat-koneplus
drivers/hid/hid-picolcd.c
drivers/hid/hid-roccat-koneplus.c
drivers/hid/hid-roccat-koneplus.h
drivers/hid/hidraw.c
drivers/hid/usbhid/hiddev.c
net/bluetooth/hidp/hidp.h

diff --git a/Documentation/ABI/obsolete/sysfs-driver-hid-roccat-koneplus b/Documentation/ABI/obsolete/sysfs-driver-hid-roccat-koneplus
new file mode 100644 (file)
index 0000000..c2a270b
--- /dev/null
@@ -0,0 +1,10 @@
+What:          /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/startup_profile
+Date:          October 2010
+Contact:       Stefan Achatz <erazor_de@users.sourceforge.net>
+Description:   The integer value of this attribute ranges from 0-4.
+                When read, this attribute returns the number of the actual
+                profile. This value is persistent, so its equivalent to the
+                profile that's active when the mouse is powered on next time.
+               When written, this file sets the number of the startup profile
+               and the mouse activates this profile immediately.
+               Please use actual_profile, it does the same thing.
index 326e054..c1b53b8 100644 (file)
@@ -1,9 +1,12 @@
 What:          /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/actual_profile
 Date:          October 2010
 Contact:       Stefan Achatz <erazor_de@users.sourceforge.net>
-Description:   When read, this file returns the number of the actual profile in
-               range 0-4.
-               This file is readonly.
+Description:   The integer value of this attribute ranges from 0-4.
+                When read, this attribute returns the number of the actual
+                profile. This value is persistent, so its equivalent to the
+                profile that's active when the mouse is powered on next time.
+               When written, this file sets the number of the startup profile
+               and the mouse activates this profile immediately.
 Users:         http://roccat.sourceforge.net
 
 What:          /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/firmware_version
@@ -89,16 +92,6 @@ Description: The mouse has a tracking- and a distance-control-unit. These
                This file is writeonly.
 Users:         http://roccat.sourceforge.net
 
-What:          /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/startup_profile
-Date:          October 2010
-Contact:       Stefan Achatz <erazor_de@users.sourceforge.net>
-Description:   The integer value of this attribute ranges from 0-4.
-                When read, this attribute returns the number of the profile
-                that's active when the mouse is powered on.
-               When written, this file sets the number of the startup profile
-               and the mouse activates this profile immediately.
-Users:         http://roccat.sourceforge.net
-
 What:          /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/tcu
 Date:          October 2010
 Contact:       Stefan Achatz <erazor_de@users.sourceforge.net>
index b2f56a1..9d8710f 100644 (file)
@@ -1585,11 +1585,11 @@ static ssize_t picolcd_debug_eeprom_write(struct file *f, const char __user *u,
        memset(raw_data, 0, sizeof(raw_data));
        raw_data[0] = *off & 0xff;
        raw_data[1] = (*off >> 8) & 0xff;
-       raw_data[2] = s < 20 ? s : 20;
+       raw_data[2] = min((size_t)20, s);
        if (*off + raw_data[2] > 0xff)
                raw_data[2] = 0x100 - *off;
 
-       if (copy_from_user(raw_data+3, u, raw_data[2]))
+       if (copy_from_user(raw_data+3, u, min((u8)20, raw_data[2])))
                return -EFAULT;
        resp = picolcd_send_and_wait(data->hdev, REPORT_EE_WRITE, raw_data,
                        sizeof(raw_data));
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;
 }
index 57a5c1a..c57a376 100644 (file)
@@ -40,10 +40,10 @@ enum koneplus_control_values {
        KONEPLUS_CONTROL_REQUEST_STATUS_WAIT = 3,
 };
 
-struct koneplus_startup_profile {
-       uint8_t command; /* KONEPLUS_COMMAND_STARTUP_PROFILE */
+struct koneplus_actual_profile {
+       uint8_t command; /* KONEPLUS_COMMAND_ACTUAL_PROFILE */
        uint8_t size; /* always 3 */
-       uint8_t startup_profile; /* Range 0-4! */
+       uint8_t actual_profile; /* Range 0-4! */
 } __attribute__ ((__packed__));
 
 struct koneplus_profile_settings {
@@ -132,7 +132,7 @@ struct koneplus_tcu_image {
 
 enum koneplus_commands {
        KONEPLUS_COMMAND_CONTROL = 0x4,
-       KONEPLUS_COMMAND_STARTUP_PROFILE = 0x5,
+       KONEPLUS_COMMAND_ACTUAL_PROFILE = 0x5,
        KONEPLUS_COMMAND_PROFILE_SETTINGS = 0x6,
        KONEPLUS_COMMAND_PROFILE_BUTTONS = 0x7,
        KONEPLUS_COMMAND_MACRO = 0x8,
@@ -145,7 +145,7 @@ enum koneplus_commands {
 
 enum koneplus_usb_commands {
        KONEPLUS_USB_COMMAND_CONTROL = 0x304,
-       KONEPLUS_USB_COMMAND_STARTUP_PROFILE = 0x305,
+       KONEPLUS_USB_COMMAND_ACTUAL_PROFILE = 0x305,
        KONEPLUS_USB_COMMAND_PROFILE_SETTINGS = 0x306,
        KONEPLUS_USB_COMMAND_PROFILE_BUTTONS = 0x307,
        KONEPLUS_USB_COMMAND_MACRO = 0x308,
@@ -215,7 +215,6 @@ struct koneplus_device {
 
        struct mutex koneplus_lock;
 
-       int startup_profile;
        struct koneplus_info info;
        struct koneplus_profile_settings profile_settings[5];
        struct koneplus_profile_buttons profile_buttons[5];
index 54409cb..c79578b 100644 (file)
@@ -101,8 +101,8 @@ out:
        return ret;
 }
 
-/* the first byte is expected to be a report number */
-/* This function is to be called with the minors_lock mutex held */
+/* The first byte is expected to be a report number.
+ * This function is to be called with the minors_lock mutex held */
 static ssize_t hidraw_send_report(struct file *file, const char __user *buffer, size_t count, unsigned char report_type)
 {
        unsigned int minor = iminor(file->f_path.dentry->d_inode);
@@ -166,11 +166,11 @@ static ssize_t hidraw_write(struct file *file, const char __user *buffer, size_t
 
 
 /* This function performs a Get_Report transfer over the control endpoint
  per section 7.2.1 of the HID specification, version 1.1.  The first byte
  of buffer is the report number to request, or 0x0 if the defice does not
  use numbered reports. The report_type parameter can be HID_FEATURE_REPORT
  or HID_INPUT_REPORT.  This function is to be called with the minors_lock
  mutex held.  */
* per section 7.2.1 of the HID specification, version 1.1.  The first byte
* of buffer is the report number to request, or 0x0 if the defice does not
* use numbered reports. The report_type parameter can be HID_FEATURE_REPORT
* or HID_INPUT_REPORT.  This function is to be called with the minors_lock
*  mutex held. */
 static ssize_t hidraw_get_report(struct file *file, char __user *buffer, size_t count, unsigned char report_type)
 {
        unsigned int minor = iminor(file->f_path.dentry->d_inode);
@@ -207,7 +207,7 @@ static ssize_t hidraw_get_report(struct file *file, char __user *buffer, size_t
        }
 
        /* Read the first byte from the user. This is the report number,
-          which is passed to dev->hid_get_raw_report(). */
+        * which is passed to dev->hid_get_raw_report(). */
        if (copy_from_user(&report_number, buffer, 1)) {
                ret = -EFAULT;
                goto out_free;
@@ -395,12 +395,7 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd,
                                }
 
                                if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWNAME(0))) {
-                                       int len;
-                                       if (!hid->name) {
-                                               ret = 0;
-                                               break;
-                                       }
-                                       len = strlen(hid->name) + 1;
+                                       int len = strlen(hid->name) + 1;
                                        if (len > _IOC_SIZE(cmd))
                                                len = _IOC_SIZE(cmd);
                                        ret = copy_to_user(user_arg, hid->name, len) ?
@@ -409,12 +404,7 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd,
                                }
 
                                if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWPHYS(0))) {
-                                       int len;
-                                       if (!hid->phys) {
-                                               ret = 0;
-                                               break;
-                                       }
-                                       len = strlen(hid->phys) + 1;
+                                       int len = strlen(hid->phys) + 1;
                                        if (len > _IOC_SIZE(cmd))
                                                len = _IOC_SIZE(cmd);
                                        ret = copy_to_user(user_arg, hid->phys, len) ?
index af0a7c1..2baa71e 100644 (file)
@@ -509,7 +509,7 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
                                 (uref_multi->num_values > HID_MAX_MULTI_USAGES ||
                                  uref->usage_index + uref_multi->num_values > field->report_count))
                                goto inval;
-                       }
+               }
 
                switch (cmd) {
                case HIDIOCGUSAGE:
@@ -801,14 +801,7 @@ static long hiddev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
                        break;
 
                if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGNAME(0))) {
-                       int len;
-
-                       if (!hid->name) {
-                               r = 0;
-                               break;
-                       }
-
-                       len = strlen(hid->name) + 1;
+                       int len = strlen(hid->name) + 1;
                        if (len > _IOC_SIZE(cmd))
                                 len = _IOC_SIZE(cmd);
                        r = copy_to_user(user_arg, hid->name, len) ?
@@ -817,14 +810,7 @@ static long hiddev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
                }
 
                if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGPHYS(0))) {
-                       int len;
-
-                       if (!hid->phys) {
-                               r = 0;
-                               break;
-                       }
-
-                       len = strlen(hid->phys) + 1;
+                       int len = strlen(hid->phys) + 1;
                        if (len > _IOC_SIZE(cmd))
                                len = _IOC_SIZE(cmd);
                        r = copy_to_user(user_arg, hid->phys, len) ?
index 13de5fa..c9be803 100644 (file)
@@ -80,7 +80,7 @@
 #define HIDP_VIRTUAL_CABLE_UNPLUG      0
 #define HIDP_BOOT_PROTOCOL_MODE                1
 #define HIDP_BLUETOOTH_VENDOR_ID       9
-#define        HIDP_WAITING_FOR_RETURN         10
+#define HIDP_WAITING_FOR_RETURN                10
 #define HIDP_WAITING_FOR_SEND_ACK      11
 
 struct hidp_connadd_req {