Input: pegasus_notetaker - fix usb_autopm calls to be balanced
authorMartin Kepplinger <martink@posteo.de>
Tue, 19 Jul 2016 21:25:00 +0000 (14:25 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 19 Jul 2016 21:33:05 +0000 (14:33 -0700)
We should only "put" the interface if submitting URB or setting tablet mode
in pegasus_open() fails, otherwise leave it to pegasus_close().

Signed-off-by: Martin Kepplinger <martink@posteo.de>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/tablet/pegasus_notetaker.c

index 78dbf39a6fc094f214d2f1514fde7ea8ae3c4435..ef5fd31abaef6ef71ce6915c4b841450729ef5c9 100644 (file)
@@ -209,34 +209,39 @@ static void pegasus_init(struct work_struct *work)
 static int pegasus_open(struct input_dev *dev)
 {
        struct pegasus *pegasus = input_get_drvdata(dev);
-       int retval;
+       int error;
 
-       retval = usb_autopm_get_interface(pegasus->intf);
-       if (retval)
-               return retval;
+       error = usb_autopm_get_interface(pegasus->intf);
+       if (error)
+               return error;
 
        pegasus->irq->dev = pegasus->usbdev;
-       if (usb_submit_urb(pegasus->irq, GFP_KERNEL))
-               retval = -EIO;
+       if (usb_submit_urb(pegasus->irq, GFP_KERNEL)) {
+               error = -EIO;
+               goto err_autopm_put;
+       }
+
+       error = pegasus_set_mode(pegasus, PEN_MODE_XY, NOTETAKER_LED_MOUSE);
+       if (error)
+               goto err_kill_urb;
 
-       retval = pegasus_set_mode(pegasus, PEN_MODE_XY, NOTETAKER_LED_MOUSE);
+       return 0;
 
+err_kill_urb:
+       usb_kill_urb(pegasus->irq);
+       cancel_work_sync(&pegasus->init);
+err_autopm_put:
        usb_autopm_put_interface(pegasus->intf);
-
-       return retval;
+       return error;
 }
 
 static void pegasus_close(struct input_dev *dev)
 {
        struct pegasus *pegasus = input_get_drvdata(dev);
-       int autopm_error;
 
-       autopm_error = usb_autopm_get_interface(pegasus->intf);
        usb_kill_urb(pegasus->irq);
        cancel_work_sync(&pegasus->init);
-
-       if (!autopm_error)
-               usb_autopm_put_interface(pegasus->intf);
+       usb_autopm_put_interface(pegasus->intf);
 }
 
 static int pegasus_probe(struct usb_interface *intf,