|
@@ -82,7 +82,7 @@ static int hid_start_in(struct hid_device *hid)
|
|
|
struct usbhid_device *usbhid = hid->driver_data;
|
|
|
|
|
|
spin_lock_irqsave(&usbhid->lock, flags);
|
|
|
- if (hid->open > 0 &&
|
|
|
+ if ((hid->open > 0 || hid->quirks & HID_QUIRK_ALWAYS_POLL) &&
|
|
|
!test_bit(HID_DISCONNECTED, &usbhid->iofl) &&
|
|
|
!test_bit(HID_SUSPENDED, &usbhid->iofl) &&
|
|
|
!test_and_set_bit(HID_IN_RUNNING, &usbhid->iofl)) {
|
|
@@ -292,6 +292,8 @@ static void hid_irq_in(struct urb *urb)
|
|
|
case 0: /* success */
|
|
|
usbhid_mark_busy(usbhid);
|
|
|
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);
|
|
@@ -735,8 +737,10 @@ void usbhid_close(struct hid_device *hid)
|
|
|
if (!--hid->open) {
|
|
|
spin_unlock_irq(&usbhid->lock);
|
|
|
hid_cancel_delayed_stuff(usbhid);
|
|
|
- usb_kill_urb(usbhid->urbin);
|
|
|
- usbhid->intf->needs_remote_wakeup = 0;
|
|
|
+ if (!(hid->quirks & HID_QUIRK_ALWAYS_POLL)) {
|
|
|
+ usb_kill_urb(usbhid->urbin);
|
|
|
+ usbhid->intf->needs_remote_wakeup = 0;
|
|
|
+ }
|
|
|
} else {
|
|
|
spin_unlock_irq(&usbhid->lock);
|
|
|
}
|
|
@@ -1134,6 +1138,19 @@ static int usbhid_start(struct hid_device *hid)
|
|
|
|
|
|
set_bit(HID_STARTED, &usbhid->iofl);
|
|
|
|
|
|
+ if (hid->quirks & HID_QUIRK_ALWAYS_POLL) {
|
|
|
+ ret = usb_autopm_get_interface(usbhid->intf);
|
|
|
+ if (ret)
|
|
|
+ goto fail;
|
|
|
+ usbhid->intf->needs_remote_wakeup = 1;
|
|
|
+ ret = hid_start_in(hid);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(&hid->dev,
|
|
|
+ "failed to start in urb: %d\n", ret);
|
|
|
+ }
|
|
|
+ usb_autopm_put_interface(usbhid->intf);
|
|
|
+ }
|
|
|
+
|
|
|
/* Some keyboards don't work until their LEDs have been set.
|
|
|
* Since BIOSes do set the LEDs, it must be safe for any device
|
|
|
* that supports the keyboard boot protocol.
|
|
@@ -1166,6 +1183,9 @@ static void usbhid_stop(struct hid_device *hid)
|
|
|
if (WARN_ON(!usbhid))
|
|
|
return;
|
|
|
|
|
|
+ if (hid->quirks & HID_QUIRK_ALWAYS_POLL)
|
|
|
+ usbhid->intf->needs_remote_wakeup = 0;
|
|
|
+
|
|
|
clear_bit(HID_STARTED, &usbhid->iofl);
|
|
|
spin_lock_irq(&usbhid->lock); /* Sync with error and led handlers */
|
|
|
set_bit(HID_DISCONNECTED, &usbhid->iofl);
|