Commit f784adb6 authored by Dmitry Torokhov's avatar Dmitry Torokhov

Input: usbtouchscreen - use guard notation when acquiring mutexes

This makes the code more compact and error handling more robust.
Reviewed-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Link: https://lore.kernel.org/r/20240712051851.3463657-7-dmitry.torokhov@gmail.comSigned-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 7f787df1
...@@ -1349,6 +1349,20 @@ static void usbtouch_irq(struct urb *urb) ...@@ -1349,6 +1349,20 @@ static void usbtouch_irq(struct urb *urb)
__func__, retval); __func__, retval);
} }
static int usbtouch_start_io(struct usbtouch_usb *usbtouch)
{
guard(mutex)(&usbtouch->pm_mutex);
if (!usbtouch->type->irq_always)
if (usb_submit_urb(usbtouch->irq, GFP_KERNEL))
return -EIO;
usbtouch->interface->needs_remote_wakeup = 1;
usbtouch->is_open = true;
return 0;
}
static int usbtouch_open(struct input_dev *input) static int usbtouch_open(struct input_dev *input)
{ {
struct usbtouch_usb *usbtouch = input_get_drvdata(input); struct usbtouch_usb *usbtouch = input_get_drvdata(input);
...@@ -1357,23 +1371,12 @@ static int usbtouch_open(struct input_dev *input) ...@@ -1357,23 +1371,12 @@ static int usbtouch_open(struct input_dev *input)
usbtouch->irq->dev = interface_to_usbdev(usbtouch->interface); usbtouch->irq->dev = interface_to_usbdev(usbtouch->interface);
r = usb_autopm_get_interface(usbtouch->interface) ? -EIO : 0; r = usb_autopm_get_interface(usbtouch->interface) ? -EIO : 0;
if (r < 0) if (r)
goto out; return r;
mutex_lock(&usbtouch->pm_mutex); r = usbtouch_start_io(usbtouch);
if (!usbtouch->type->irq_always) {
if (usb_submit_urb(usbtouch->irq, GFP_KERNEL)) {
r = -EIO;
goto out_put;
}
}
usbtouch->interface->needs_remote_wakeup = 1;
usbtouch->is_open = true;
out_put:
mutex_unlock(&usbtouch->pm_mutex);
usb_autopm_put_interface(usbtouch->interface); usb_autopm_put_interface(usbtouch->interface);
out:
return r; return r;
} }
...@@ -1382,11 +1385,11 @@ static void usbtouch_close(struct input_dev *input) ...@@ -1382,11 +1385,11 @@ static void usbtouch_close(struct input_dev *input)
struct usbtouch_usb *usbtouch = input_get_drvdata(input); struct usbtouch_usb *usbtouch = input_get_drvdata(input);
int r; int r;
mutex_lock(&usbtouch->pm_mutex); scoped_guard(mutex, &usbtouch->pm_mutex) {
if (!usbtouch->type->irq_always) if (!usbtouch->type->irq_always)
usb_kill_urb(usbtouch->irq); usb_kill_urb(usbtouch->irq);
usbtouch->is_open = false; usbtouch->is_open = false;
mutex_unlock(&usbtouch->pm_mutex); }
r = usb_autopm_get_interface(usbtouch->interface); r = usb_autopm_get_interface(usbtouch->interface);
usbtouch->interface->needs_remote_wakeup = 0; usbtouch->interface->needs_remote_wakeup = 0;
...@@ -1394,8 +1397,7 @@ static void usbtouch_close(struct input_dev *input) ...@@ -1394,8 +1397,7 @@ static void usbtouch_close(struct input_dev *input)
usb_autopm_put_interface(usbtouch->interface); usb_autopm_put_interface(usbtouch->interface);
} }
static int usbtouch_suspend static int usbtouch_suspend(struct usb_interface *intf, pm_message_t message)
(struct usb_interface *intf, pm_message_t message)
{ {
struct usbtouch_usb *usbtouch = usb_get_intfdata(intf); struct usbtouch_usb *usbtouch = usb_get_intfdata(intf);
...@@ -1407,20 +1409,19 @@ static int usbtouch_suspend ...@@ -1407,20 +1409,19 @@ static int usbtouch_suspend
static int usbtouch_resume(struct usb_interface *intf) static int usbtouch_resume(struct usb_interface *intf)
{ {
struct usbtouch_usb *usbtouch = usb_get_intfdata(intf); struct usbtouch_usb *usbtouch = usb_get_intfdata(intf);
int result = 0;
mutex_lock(&usbtouch->pm_mutex); guard(mutex)(&usbtouch->pm_mutex);
if (usbtouch->is_open || usbtouch->type->irq_always) if (usbtouch->is_open || usbtouch->type->irq_always)
result = usb_submit_urb(usbtouch->irq, GFP_NOIO); return usb_submit_urb(usbtouch->irq, GFP_NOIO);
mutex_unlock(&usbtouch->pm_mutex);
return result; return 0;
} }
static int usbtouch_reset_resume(struct usb_interface *intf) static int usbtouch_reset_resume(struct usb_interface *intf)
{ {
struct usbtouch_usb *usbtouch = usb_get_intfdata(intf); struct usbtouch_usb *usbtouch = usb_get_intfdata(intf);
int err = 0; int err;
/* reinit the device */ /* reinit the device */
if (usbtouch->type->init) { if (usbtouch->type->init) {
...@@ -1434,12 +1435,12 @@ static int usbtouch_reset_resume(struct usb_interface *intf) ...@@ -1434,12 +1435,12 @@ static int usbtouch_reset_resume(struct usb_interface *intf)
} }
/* restart IO if needed */ /* restart IO if needed */
mutex_lock(&usbtouch->pm_mutex); guard(mutex)(&usbtouch->pm_mutex);
if (usbtouch->is_open) if (usbtouch->is_open)
err = usb_submit_urb(usbtouch->irq, GFP_NOIO); return usb_submit_urb(usbtouch->irq, GFP_NOIO);
mutex_unlock(&usbtouch->pm_mutex);
return err; return 0;
} }
static void usbtouch_free_buffers(struct usb_device *udev, static void usbtouch_free_buffers(struct usb_device *udev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment