Merge branches 'for-3.18/upstream-fixes' and 'for-3.19/upstream' into for-linus
authorJiri Kosina <jkosina@suse.cz>
Fri, 12 Dec 2014 10:09:23 +0000 (11:09 +0100)
committerJiri Kosina <jkosina@suse.cz>
Fri, 12 Dec 2014 10:09:23 +0000 (11:09 +0100)
Conflicts:
drivers/hid/hid-input.c

12 files changed:
drivers/hid/Kconfig
drivers/hid/hid-core.c
drivers/hid/hid-ids.h
drivers/hid/hid-input.c
drivers/hid/hid-roccat-kone.c
drivers/hid/hid-saitek.c
drivers/hid/i2c-hid/i2c-hid.c
drivers/hid/usbhid/hid-core.c
drivers/hid/usbhid/usbhid.h
drivers/hid/wacom_sys.c
drivers/hid/wacom_wac.c
include/linux/hid.h

index f42df4d..3a3f29c 100644 (file)
@@ -629,7 +629,7 @@ config HID_ROCCAT
        support for its special functionalities.
 
 config HID_SAITEK
-       tristate "Saitek non-fully HID-compliant devices"
+       tristate "Saitek (Mad Catz) non-fully HID-compliant devices"
        depends on HID
        ---help---
        Support for Saitek devices that are not fully compliant with the
@@ -637,6 +637,7 @@ config HID_SAITEK
 
        Supported devices:
        - PS1000 Dual Analog Pad
+       - R.A.T.9 Gaming Mouse
        - R.A.T.7 Gaming Mouse
        - M.M.O.7 Gaming Mouse
 
index 3402033..bae74af 100644 (file)
@@ -779,16 +779,6 @@ static int hid_scan_report(struct hid_device *hid)
            (hid->group == HID_GROUP_MULTITOUCH))
                hid->group = HID_GROUP_MULTITOUCH_WIN_8;
 
-       /*
-       * Vendor specific handlings
-       */
-       if ((hid->vendor == USB_VENDOR_ID_SYNAPTICS) &&
-           (hid->group == HID_GROUP_GENERIC) &&
-           /* only bind to the mouse interface of composite USB devices */
-           (hid->bus != BUS_USB || hid->type == HID_TYPE_USBMOUSE))
-               /* hid-rmi should take care of them, not hid-generic */
-               hid->group = HID_GROUP_RMI;
-
        /*
         * Vendor specific handlings
         */
@@ -796,6 +786,13 @@ static int hid_scan_report(struct hid_device *hid)
        case USB_VENDOR_ID_WACOM:
                hid->group = HID_GROUP_WACOM;
                break;
+       case USB_VENDOR_ID_SYNAPTICS:
+               if ((hid->group == HID_GROUP_GENERIC) &&
+                   (hid->bus != BUS_USB || hid->type == HID_TYPE_USBMOUSE))
+                       /* hid-rmi should only bind to the mouse interface of
+                        * composite USB devices */
+                       hid->group = HID_GROUP_RMI;
+               break;
        }
 
        vfree(parser);
@@ -1910,6 +1907,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_PS1000) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RAT7) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_MMO7) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_RAT9) },
 #endif
        { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) },
@@ -2539,7 +2537,8 @@ int hid_add_device(struct hid_device *hdev)
         * Scan generic devices for group information
         */
        if (hid_ignore_special_drivers ||
-           !hid_match_id(hdev, hid_have_special_driver)) {
+           (!hdev->group &&
+            !hid_match_id(hdev, hid_have_special_driver))) {
                ret = hid_scan_report(hdev);
                if (ret)
                        hid_warn(hdev, "bad device descriptor (%d)\n", ret);
index a7c1c1d..40627c7 100644 (file)
 
 #define USB_VENDOR_ID_MADCATZ          0x0738
 #define USB_DEVICE_ID_MADCATZ_BEATPAD  0x4540
+#define USB_DEVICE_ID_MADCATZ_RAT9     0x1709
 
 #define USB_VENDOR_ID_MCC              0x09db
 #define USB_DEVICE_ID_MCC_PMD1024LS    0x0076
index 725f22c..be3eba8 100644 (file)
@@ -872,7 +872,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
                case 0x2cb: map_key_clear(KEY_KBDINPUTASSIST_ACCEPT);   break;
                case 0x2cc: map_key_clear(KEY_KBDINPUTASSIST_CANCEL);   break;
 
-               default:    goto ignore;
+               default: map_key_clear(KEY_UNKNOWN);
                }
                break;
 
index 6101816..c292650 100644 (file)
@@ -46,6 +46,7 @@ static void kone_profile_activated(struct kone_device *kone, uint new_profile)
 static void kone_profile_report(struct kone_device *kone, uint new_profile)
 {
        struct kone_roccat_report roccat_report;
+
        roccat_report.event = kone_mouse_event_switch_profile;
        roccat_report.value = new_profile;
        roccat_report.key = 0;
@@ -163,6 +164,7 @@ static int kone_set_settings(struct usb_device *usb_dev,
                struct kone_settings const *settings)
 {
        int retval;
+
        retval = kone_send(usb_dev, kone_command_settings,
                        settings, sizeof(struct kone_settings));
        if (retval)
@@ -387,7 +389,7 @@ static struct bin_attribute bin_attr_profile##number = {    \
        .read = kone_sysfs_read_profilex,                       \
        .write = kone_sysfs_write_profilex,                     \
        .private = &profile_numbers[number-1],                  \
-};
+}
 PROFILE_ATTR(1);
 PROFILE_ATTR(2);
 PROFILE_ATTR(3);
@@ -456,6 +458,7 @@ static ssize_t kone_sysfs_show_tcu(struct device *dev,
 static int kone_tcu_command(struct usb_device *usb_dev, int number)
 {
        unsigned char value;
+
        value = number;
        return kone_send(usb_dev, kone_command_calibrate, &value, 1);
 }
@@ -697,10 +700,8 @@ static int kone_init_specials(struct hid_device *hdev)
                        == USB_INTERFACE_PROTOCOL_MOUSE) {
 
                kone = kzalloc(sizeof(*kone), GFP_KERNEL);
-               if (!kone) {
-                       hid_err(hdev, "can't alloc device descriptor\n");
+               if (!kone)
                        return -ENOMEM;
-               }
                hid_set_drvdata(hdev, kone);
 
                retval = kone_init_kone_device_struct(usb_dev, kone);
index 69cca14..5632c54 100644 (file)
@@ -7,7 +7,7 @@
  *  (This module is based on "hid-ortek".)
  *  Copyright (c) 2012 Andreas Hübner
  *
- *  R.A.T.7, M.M.O.7 (USB gaming mice):
+ *  R.A.T.7, R.A.T.9, M.M.O.7 (USB gaming mice):
  *  Fixes the mode button which cycles through three constantly pressed
  *  buttons. All three press events are mapped to one button and the
  *  missing release event is generated immediately.
@@ -179,6 +179,8 @@ static const struct hid_device_id saitek_devices[] = {
                .driver_data = SAITEK_FIX_PS1000 },
        { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RAT7),
                .driver_data = SAITEK_RELEASE_MODE_RAT7 },
+       { HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_RAT9),
+               .driver_data = SAITEK_RELEASE_MODE_RAT7 },
        { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_MMO7),
                .driver_data = SAITEK_RELEASE_MODE_MMO7 },
        { }
index 747d544..9c01480 100644 (file)
@@ -369,7 +369,7 @@ static int i2c_hid_hwreset(struct i2c_client *client)
 static void i2c_hid_get_input(struct i2c_hid *ihid)
 {
        int ret, ret_size;
-       int size = le16_to_cpu(ihid->hdesc.wMaxInputLength);
+       int size = ihid->bufsize;
 
        ret = i2c_master_recv(ihid->client, ihid->inbuf, size);
        if (ret != size) {
index ca6849a..04e34b9 100644 (file)
@@ -278,18 +278,20 @@ static void hid_irq_in(struct urb *urb)
                usbhid->retry_delay = 0;
                if ((hid->quirks & HID_QUIRK_ALWAYS_POLL) && !hid->open)
                        break;
-               hid_input_report(urb->context, HID_INPUT_REPORT,
-                                urb->transfer_buffer,
-                                urb->actual_length, 1);
-               /*
-                * autosuspend refused while keys are pressed
-                * because most keyboards don't wake up when
-                * a key is released
-                */
-               if (hid_check_keys_pressed(hid))
-                       set_bit(HID_KEYS_PRESSED, &usbhid->iofl);
-               else
-                       clear_bit(HID_KEYS_PRESSED, &usbhid->iofl);
+               if (!test_bit(HID_RESUME_RUNNING, &usbhid->iofl)) {
+                       hid_input_report(urb->context, HID_INPUT_REPORT,
+                                        urb->transfer_buffer,
+                                        urb->actual_length, 1);
+                       /*
+                        * autosuspend refused while keys are pressed
+                        * because most keyboards don't wake up when
+                        * a key is released
+                        */
+                       if (hid_check_keys_pressed(hid))
+                               set_bit(HID_KEYS_PRESSED, &usbhid->iofl);
+                       else
+                               clear_bit(HID_KEYS_PRESSED, &usbhid->iofl);
+               }
                break;
        case -EPIPE:            /* stall */
                usbhid_mark_busy(usbhid);
@@ -688,6 +690,7 @@ int usbhid_open(struct hid_device *hid)
                        goto done;
                }
                usbhid->intf->needs_remote_wakeup = 1;
+               set_bit(HID_RESUME_RUNNING, &usbhid->iofl);
                res = hid_start_in(hid);
                if (res) {
                        if (res != -ENOSPC) {
@@ -701,6 +704,15 @@ int usbhid_open(struct hid_device *hid)
                        }
                }
                usb_autopm_put_interface(usbhid->intf);
+
+               /*
+                * In case events are generated while nobody was listening,
+                * some are released when the device is re-opened.
+                * Wait 50 msec for the queue to empty before allowing events
+                * to go through hid.
+                */
+               msleep(50);
+               clear_bit(HID_RESUME_RUNNING, &usbhid->iofl);
        }
 done:
        mutex_unlock(&hid_open_mut);
index f633c24..807922b 100644 (file)
@@ -52,6 +52,7 @@ struct usb_interface *usbhid_find_interface(int minor);
 #define HID_STARTED            8
 #define HID_KEYS_PRESSED       10
 #define HID_NO_BANDWIDTH       11
+#define HID_RESUME_RUNNING     12
 
 /*
  * USB-specific HID struct, to be pointed to
index 8593047..b6bcd25 100644 (file)
@@ -70,22 +70,15 @@ static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report,
 static int wacom_open(struct input_dev *dev)
 {
        struct wacom *wacom = input_get_drvdata(dev);
-       int retval;
-
-       mutex_lock(&wacom->lock);
-       retval = hid_hw_open(wacom->hdev);
-       mutex_unlock(&wacom->lock);
 
-       return retval;
+       return hid_hw_open(wacom->hdev);
 }
 
 static void wacom_close(struct input_dev *dev)
 {
        struct wacom *wacom = input_get_drvdata(dev);
 
-       mutex_lock(&wacom->lock);
        hid_hw_close(wacom->hdev);
-       mutex_unlock(&wacom->lock);
 }
 
 /*
index 586b240..7cf998c 100644 (file)
@@ -3026,6 +3026,7 @@ const struct hid_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0x4004) },
        { USB_DEVICE_WACOM(0x5000) },
        { USB_DEVICE_WACOM(0x5002) },
+       { USB_DEVICE_LENOVO(0x6004) },
 
        { USB_DEVICE_WACOM(HID_ANY_ID) },
        { }
index 78ea9bf..5b1ff61 100644 (file)
@@ -312,10 +312,6 @@ struct hid_item {
  * Vendor specific HID device groups
  */
 #define HID_GROUP_RMI                          0x0100
-
-/*
- * Vendor specific HID device groups
- */
 #define HID_GROUP_WACOM                                0x0101
 
 /*