|
@@ -103,27 +103,26 @@ static void wacom_sys_irq(struct urb *urb)
|
|
|
static int wacom_open(struct input_dev *dev)
|
|
|
{
|
|
|
struct wacom *wacom = input_get_drvdata(dev);
|
|
|
+ int retval = 0;
|
|
|
|
|
|
- mutex_lock(&wacom->lock);
|
|
|
-
|
|
|
- wacom->irq->dev = wacom->usbdev;
|
|
|
-
|
|
|
- if (usb_autopm_get_interface(wacom->intf) < 0) {
|
|
|
- mutex_unlock(&wacom->lock);
|
|
|
+ if (usb_autopm_get_interface(wacom->intf) < 0)
|
|
|
return -EIO;
|
|
|
- }
|
|
|
+
|
|
|
+ mutex_lock(&wacom->lock);
|
|
|
|
|
|
if (usb_submit_urb(wacom->irq, GFP_KERNEL)) {
|
|
|
- usb_autopm_put_interface(wacom->intf);
|
|
|
- mutex_unlock(&wacom->lock);
|
|
|
- return -EIO;
|
|
|
+ retval = -EIO;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
wacom->open = true;
|
|
|
wacom->intf->needs_remote_wakeup = 1;
|
|
|
|
|
|
+out:
|
|
|
mutex_unlock(&wacom->lock);
|
|
|
- return 0;
|
|
|
+ if (retval)
|
|
|
+ usb_autopm_put_interface(wacom->intf);
|
|
|
+ return retval;
|
|
|
}
|
|
|
|
|
|
static void wacom_close(struct input_dev *dev)
|
|
@@ -135,6 +134,8 @@ static void wacom_close(struct input_dev *dev)
|
|
|
wacom->open = false;
|
|
|
wacom->intf->needs_remote_wakeup = 0;
|
|
|
mutex_unlock(&wacom->lock);
|
|
|
+
|
|
|
+ usb_autopm_put_interface(wacom->intf);
|
|
|
}
|
|
|
|
|
|
static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hid_desc,
|