瀏覽代碼

Input: pegasus_notetaker - fix usb_autopm calls to be balanced

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>
Martin Kepplinger 9 年之前
父節點
當前提交
9d3bef0be5
共有 1 個文件被更改,包括 19 次插入14 次删除
  1. 19 14
      drivers/input/tablet/pegasus_notetaker.c

+ 19 - 14
drivers/input/tablet/pegasus_notetaker.c

@@ -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,