Merge branch 'for-4.3/gembird' into for-linus
authorJiri Kosina <jkosina@suse.cz>
Tue, 1 Sep 2015 13:35:24 +0000 (15:35 +0200)
committerJiri Kosina <jkosina@suse.cz>
Tue, 1 Sep 2015 13:35:24 +0000 (15:35 +0200)
drivers/hid/hid-core.c
drivers/hid/hid-ids.h
drivers/hid/hid-input.c
drivers/hid/usbhid/hid-core.c
drivers/hid/usbhid/hid-quirks.c
drivers/hid/wacom_sys.c

index 7d5ed0b5c1c199f4fe7c33b8d7fd3e67773f4d80..d931886dffe8183a16ed2fd7f0e621b479b2fb98 100644 (file)
@@ -427,6 +427,7 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
 {
        __u32 data;
        unsigned n;
+       __u32 count;
 
        data = item_udata(item);
 
@@ -490,6 +491,24 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
                if (item->size <= 2)
                        data = (parser->global.usage_page << 16) + data;
 
+               count = data - parser->local.usage_minimum;
+               if (count + parser->local.usage_index >= HID_MAX_USAGES) {
+                       /*
+                        * We do not warn if the name is not set, we are
+                        * actually pre-scanning the device.
+                        */
+                       if (dev_name(&parser->device->dev))
+                               hid_warn(parser->device,
+                                        "ignoring exceeding usage max\n");
+                       data = HID_MAX_USAGES - parser->local.usage_index +
+                               parser->local.usage_minimum - 1;
+                       if (data <= 0) {
+                               hid_err(parser->device,
+                                       "no more usage index available\n");
+                               return -1;
+                       }
+               }
+
                for (n = parser->local.usage_minimum; n <= data; n++)
                        if (hid_add_usage(parser, n)) {
                                dbg_hid("hid_add_usage failed\n");
index b4d7a084367562eedf9d649374d09cb9f8c6493e..624d916d39d240c1a4bcce195015202b76f3621c 100644 (file)
 #define USB_DEVICE_ID_TOUCHPACK_RTS    0x1688
 
 #define USB_VENDOR_ID_TPV              0x25aa
-#define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN  0x8883
+#define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882     0x8882
+#define USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883     0x8883
 
 #define USB_VENDOR_ID_TURBOX           0x062a
 #define USB_DEVICE_ID_TURBOX_KEYBOARD  0x0201
index e3c63640df737d5527c6d2609622417a4e03c8d3..53aeaf6252c75a039cb94a13af27fffbb0f2bddb 100644 (file)
@@ -1166,8 +1166,11 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
 
        input_event(input, usage->type, usage->code, value);
 
-       if ((field->flags & HID_MAIN_ITEM_RELATIVE) && (usage->type == EV_KEY))
+       if ((field->flags & HID_MAIN_ITEM_RELATIVE) &&
+           usage->type == EV_KEY && value) {
+               input_sync(input);
                input_event(input, usage->type, usage->code, 0);
+       }
 }
 
 void hidinput_report_event(struct hid_device *hid, struct hid_report *report)
index bfbe1bedda7f34396db34e85b79c89ee1a251209..36712e9f56c26d9ae96ddb5cfa4baada0b681f04 100644 (file)
@@ -164,7 +164,7 @@ static void hid_io_error(struct hid_device *hid)
        if (time_after(jiffies, usbhid->stop_retry)) {
 
                /* Retries failed, so do a port reset unless we lack bandwidth*/
-               if (test_bit(HID_NO_BANDWIDTH, &usbhid->iofl)
+               if (!test_bit(HID_NO_BANDWIDTH, &usbhid->iofl)
                     && !test_and_set_bit(HID_RESET_PENDING, &usbhid->iofl)) {
 
                        schedule_work(&usbhid->reset_work);
@@ -710,7 +710,8 @@ int usbhid_open(struct hid_device *hid)
                 * Wait 50 msec for the queue to empty before allowing events
                 * to go through hid.
                 */
-               msleep(50);
+               if (res == 0 && !(hid->quirks & HID_QUIRK_ALWAYS_POLL))
+                       msleep(50);
                clear_bit(HID_RESUME_RUNNING, &usbhid->iofl);
        }
 done:
index 20f9a653444c21d0ef89f4561d4d68544dff4bf0..965432e413c603c7f55b3ace500adc71269b64e3 100644 (file)
@@ -117,7 +117,8 @@ static const struct hid_blacklist {
        { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_1, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_2, HID_QUIRK_NOGET },
-       { USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN, HID_QUIRK_NOGET },
+       { USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882, HID_QUIRK_NOGET },
+       { USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8883, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_KNA5, HID_QUIRK_MULTI_INPUT },
        { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_TWA60, HID_QUIRK_MULTI_INPUT },
index 01b937e63cf37ec1424a1aad9eee0caef682c010..5cdb044720231e0e32a1f2eb79cacfaefe95c4ce 100644 (file)
@@ -335,7 +335,7 @@ static int wacom_set_device_mode(struct hid_device *hdev, int report_id,
                if (error >= 0)
                        error = wacom_get_report(hdev, HID_FEATURE_REPORT,
                                                 rep_data, length, 1);
-       } while ((error < 0 || rep_data[1] != mode) && limit++ < WAC_MSG_RETRIES);
+       } while (error >= 0 && rep_data[1] != mode && limit++ < WAC_MSG_RETRIES);
 
        kfree(rep_data);
 
@@ -1149,12 +1149,9 @@ static void wacom_free_inputs(struct wacom *wacom)
 {
        struct wacom_wac *wacom_wac = &(wacom->wacom_wac);
 
-       if (wacom_wac->pen_input)
-               input_free_device(wacom_wac->pen_input);
-       if (wacom_wac->touch_input)
-               input_free_device(wacom_wac->touch_input);
-       if (wacom_wac->pad_input)
-               input_free_device(wacom_wac->pad_input);
+       input_free_device(wacom_wac->pen_input);
+       input_free_device(wacom_wac->touch_input);
+       input_free_device(wacom_wac->pad_input);
        wacom_wac->pen_input = NULL;
        wacom_wac->touch_input = NULL;
        wacom_wac->pad_input = NULL;