diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-07-25 11:49:00 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-07-25 11:49:00 -0400 |
| commit | a9d0683e0b62b46c7a5d0ebd8f642d8f9a4b7b32 (patch) | |
| tree | 27a59cfa771518cccd3bea1c32e956c768887e7e | |
| parent | eeb7c41d9d7c0902accb1d481fe78d84d30c69cc (diff) | |
| parent | c228352dc67ea8fa5770c83e2d9c2fbafb3e700a (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
Pull HID fixes from Jiri Kosina:
- regression fix (missing IRQs) for devices that require 'always poll'
quirk, from Dmitry Torokhov
- new device ID addition to Ortek driver, from Benjamin Tissoires
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid:
HID: ortek: add one more buggy device
HID: usbhid: fix "always poll" quirk
| -rw-r--r-- | drivers/hid/hid-core.c | 1 | ||||
| -rw-r--r-- | drivers/hid/hid-ids.h | 1 | ||||
| -rw-r--r-- | drivers/hid/hid-ortek.c | 6 | ||||
| -rw-r--r-- | drivers/hid/usbhid/hid-core.c | 16 |
4 files changed, 16 insertions, 8 deletions
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 6fd01a692197..9017dcc14502 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
| @@ -2216,6 +2216,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
| 2216 | #if IS_ENABLED(CONFIG_HID_ORTEK) | 2216 | #if IS_ENABLED(CONFIG_HID_ORTEK) |
| 2217 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_PKB1700) }, | 2217 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_PKB1700) }, |
| 2218 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) }, | 2218 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) }, |
| 2219 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S) }, | ||
| 2219 | { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, | 2220 | { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, |
| 2220 | #endif | 2221 | #endif |
| 2221 | #if IS_ENABLED(CONFIG_HID_PANTHERLORD) | 2222 | #if IS_ENABLED(CONFIG_HID_PANTHERLORD) |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 3d911bfd91cf..c9ba4c6db74c 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
| @@ -824,6 +824,7 @@ | |||
| 824 | #define USB_VENDOR_ID_ORTEK 0x05a4 | 824 | #define USB_VENDOR_ID_ORTEK 0x05a4 |
| 825 | #define USB_DEVICE_ID_ORTEK_PKB1700 0x1700 | 825 | #define USB_DEVICE_ID_ORTEK_PKB1700 0x1700 |
| 826 | #define USB_DEVICE_ID_ORTEK_WKB2000 0x2000 | 826 | #define USB_DEVICE_ID_ORTEK_WKB2000 0x2000 |
| 827 | #define USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S 0x8003 | ||
| 827 | 828 | ||
| 828 | #define USB_VENDOR_ID_PLANTRONICS 0x047f | 829 | #define USB_VENDOR_ID_PLANTRONICS 0x047f |
| 829 | 830 | ||
diff --git a/drivers/hid/hid-ortek.c b/drivers/hid/hid-ortek.c index 6620f15fec22..8783a064cdcf 100644 --- a/drivers/hid/hid-ortek.c +++ b/drivers/hid/hid-ortek.c | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | * | 5 | * |
| 6 | * Ortek PKB-1700 | 6 | * Ortek PKB-1700 |
| 7 | * Ortek WKB-2000 | 7 | * Ortek WKB-2000 |
| 8 | * iHome IMAC-A210S | ||
| 8 | * Skycable wireless presenter | 9 | * Skycable wireless presenter |
| 9 | * | 10 | * |
| 10 | * Copyright (c) 2010 Johnathon Harris <jmharris@gmail.com> | 11 | * Copyright (c) 2010 Johnathon Harris <jmharris@gmail.com> |
| @@ -28,10 +29,10 @@ static __u8 *ortek_report_fixup(struct hid_device *hdev, __u8 *rdesc, | |||
| 28 | unsigned int *rsize) | 29 | unsigned int *rsize) |
| 29 | { | 30 | { |
| 30 | if (*rsize >= 56 && rdesc[54] == 0x25 && rdesc[55] == 0x01) { | 31 | if (*rsize >= 56 && rdesc[54] == 0x25 && rdesc[55] == 0x01) { |
| 31 | hid_info(hdev, "Fixing up logical minimum in report descriptor (Ortek)\n"); | 32 | hid_info(hdev, "Fixing up logical maximum in report descriptor (Ortek)\n"); |
| 32 | rdesc[55] = 0x92; | 33 | rdesc[55] = 0x92; |
| 33 | } else if (*rsize >= 54 && rdesc[52] == 0x25 && rdesc[53] == 0x01) { | 34 | } else if (*rsize >= 54 && rdesc[52] == 0x25 && rdesc[53] == 0x01) { |
| 34 | hid_info(hdev, "Fixing up logical minimum in report descriptor (Skycable)\n"); | 35 | hid_info(hdev, "Fixing up logical maximum in report descriptor (Skycable)\n"); |
| 35 | rdesc[53] = 0x65; | 36 | rdesc[53] = 0x65; |
| 36 | } | 37 | } |
| 37 | return rdesc; | 38 | return rdesc; |
| @@ -40,6 +41,7 @@ static __u8 *ortek_report_fixup(struct hid_device *hdev, __u8 *rdesc, | |||
| 40 | static const struct hid_device_id ortek_devices[] = { | 41 | static const struct hid_device_id ortek_devices[] = { |
| 41 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_PKB1700) }, | 42 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_PKB1700) }, |
| 42 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) }, | 43 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) }, |
| 44 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S) }, | ||
| 43 | { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, | 45 | { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, |
| 44 | { } | 46 | { } |
| 45 | }; | 47 | }; |
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 76013eb5cb7f..c008847e0b20 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c | |||
| @@ -680,18 +680,21 @@ static int usbhid_open(struct hid_device *hid) | |||
| 680 | struct usbhid_device *usbhid = hid->driver_data; | 680 | struct usbhid_device *usbhid = hid->driver_data; |
| 681 | int res; | 681 | int res; |
| 682 | 682 | ||
| 683 | set_bit(HID_OPENED, &usbhid->iofl); | ||
| 684 | |||
| 683 | if (hid->quirks & HID_QUIRK_ALWAYS_POLL) | 685 | if (hid->quirks & HID_QUIRK_ALWAYS_POLL) |
| 684 | return 0; | 686 | return 0; |
| 685 | 687 | ||
| 686 | res = usb_autopm_get_interface(usbhid->intf); | 688 | res = usb_autopm_get_interface(usbhid->intf); |
| 687 | /* the device must be awake to reliably request remote wakeup */ | 689 | /* the device must be awake to reliably request remote wakeup */ |
| 688 | if (res < 0) | 690 | if (res < 0) { |
| 691 | clear_bit(HID_OPENED, &usbhid->iofl); | ||
| 689 | return -EIO; | 692 | return -EIO; |
| 693 | } | ||
| 690 | 694 | ||
| 691 | usbhid->intf->needs_remote_wakeup = 1; | 695 | usbhid->intf->needs_remote_wakeup = 1; |
| 692 | 696 | ||
| 693 | set_bit(HID_RESUME_RUNNING, &usbhid->iofl); | 697 | set_bit(HID_RESUME_RUNNING, &usbhid->iofl); |
| 694 | set_bit(HID_OPENED, &usbhid->iofl); | ||
| 695 | set_bit(HID_IN_POLLING, &usbhid->iofl); | 698 | set_bit(HID_IN_POLLING, &usbhid->iofl); |
| 696 | 699 | ||
| 697 | res = hid_start_in(hid); | 700 | res = hid_start_in(hid); |
| @@ -727,19 +730,20 @@ static void usbhid_close(struct hid_device *hid) | |||
| 727 | { | 730 | { |
| 728 | struct usbhid_device *usbhid = hid->driver_data; | 731 | struct usbhid_device *usbhid = hid->driver_data; |
| 729 | 732 | ||
| 730 | if (hid->quirks & HID_QUIRK_ALWAYS_POLL) | ||
| 731 | return; | ||
| 732 | |||
| 733 | /* | 733 | /* |
| 734 | * Make sure we don't restart data acquisition due to | 734 | * Make sure we don't restart data acquisition due to |
| 735 | * a resumption we no longer care about by avoiding racing | 735 | * a resumption we no longer care about by avoiding racing |
| 736 | * with hid_start_in(). | 736 | * with hid_start_in(). |
| 737 | */ | 737 | */ |
| 738 | spin_lock_irq(&usbhid->lock); | 738 | spin_lock_irq(&usbhid->lock); |
| 739 | clear_bit(HID_IN_POLLING, &usbhid->iofl); | ||
| 740 | clear_bit(HID_OPENED, &usbhid->iofl); | 739 | clear_bit(HID_OPENED, &usbhid->iofl); |
| 740 | if (!(hid->quirks & HID_QUIRK_ALWAYS_POLL)) | ||
| 741 | clear_bit(HID_IN_POLLING, &usbhid->iofl); | ||
| 741 | spin_unlock_irq(&usbhid->lock); | 742 | spin_unlock_irq(&usbhid->lock); |
| 742 | 743 | ||
| 744 | if (hid->quirks & HID_QUIRK_ALWAYS_POLL) | ||
| 745 | return; | ||
| 746 | |||
| 743 | hid_cancel_delayed_stuff(usbhid); | 747 | hid_cancel_delayed_stuff(usbhid); |
| 744 | usb_kill_urb(usbhid->urbin); | 748 | usb_kill_urb(usbhid->urbin); |
| 745 | usbhid->intf->needs_remote_wakeup = 0; | 749 | usbhid->intf->needs_remote_wakeup = 0; |
