@@ -1269,16 +1269,26 @@ exit:
static int usbtouch_open(struct input_dev *input)
{
struct usbtouch_usb *usbtouch = input_get_drvdata(input);
+ int r;
usbtouch->irq->dev = interface_to_usbdev(usbtouch->interface);
+
+ r = usb_autopm_get_interface(usbtouch->interface);
+ if (r < 0)
+ goto err_out;
if (!usbtouch->type->irq_always) {
if (usb_submit_urb(usbtouch->irq, GFP_KERNEL))
- return -EIO;
+ goto err_out_revert;
usbtouch->submitted = true;
}
return 0;
+
+err_out_revert:
+ usb_autopm_put_interface(usbtouch->interface);
+err_out:
+ return -EIO;
}
static void usbtouch_close(struct input_dev *input)
@@ -1288,6 +1298,7 @@ static void usbtouch_close(struct input_dev *input)
usbtouch->submitted = false;
if (!usbtouch->type->irq_always)
usb_kill_urb(usbtouch->irq);
+ usb_autopm_put_interface(usbtouch->interface);
}
static int usbtouch_suspend(struct usb_interface *intf, pm_message_t message)
@@ -1475,6 +1486,14 @@ static int usbtouch_probe(struct usb_interface *intf,
}
}
+ /*
+ * if the interrupt URB must be kept running
+ * we assume the device asserts remote wakeup
+ * if it has data to be retrieved through
+ * the interrupt endpoint
+ */
+ intf->needs_remote_wakeup = usbtouch->type->irq_always;
+
return 0;
out_unregister_input:
@@ -1523,6 +1542,7 @@ static struct usb_driver usbtouch_driver = {
.resume = usbtouch_resume,
.reset_resume = usbtouch_reset_resume,
.id_table = usbtouch_devices,
+ .supports_autosuspend = 1,
};
static int __init usbtouch_init(void)