Merge branch 'master' into upstream.
Jiri Kosina [Wed, 18 May 2011 15:06:31 +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 {