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)
__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)
{
struct usbtouch_usb *usbtouch = input_get_drvdata(input);
......@@ -1357,23 +1371,12 @@ static int usbtouch_open(struct input_dev *input)
usbtouch->irq->dev = interface_to_usbdev(usbtouch->interface);
r = usb_autopm_get_interface(usbtouch->interface) ? -EIO : 0;
if (r < 0)
goto out;
mutex_lock(&usbtouch->pm_mutex);
if (!usbtouch->type->irq_always) {
if (usb_submit_urb(usbtouch->irq, GFP_KERNEL)) {
r = -EIO;
goto out_put;
}
}
if (r)
return r;
r = usbtouch_start_io(usbtouch);
usbtouch->interface->needs_remote_wakeup = 1;
usbtouch->is_open = true;
out_put:
mutex_unlock(&usbtouch->pm_mutex);
usb_autopm_put_interface(usbtouch->interface);
out:
return r;
}
......@@ -1382,11 +1385,11 @@ static void usbtouch_close(struct input_dev *input)
struct usbtouch_usb *usbtouch = input_get_drvdata(input);
int r;
mutex_lock(&usbtouch->pm_mutex);
if (!usbtouch->type->irq_always)
usb_kill_urb(usbtouch->irq);
usbtouch->is_open = false;
mutex_unlock(&usbtouch->pm_mutex);
scoped_guard(mutex, &usbtouch->pm_mutex) {
if (!usbtouch->type->irq_always)
usb_kill_urb(usbtouch->irq);
usbtouch->is_open = false;
}
r = usb_autopm_get_interface(usbtouch->interface);
usbtouch->interface->needs_remote_wakeup = 0;
......@@ -1394,8 +1397,7 @@ static void usbtouch_close(struct input_dev *input)
usb_autopm_put_interface(usbtouch->interface);
}
static int usbtouch_suspend
(struct usb_interface *intf, pm_message_t message)
static int usbtouch_suspend(struct usb_interface *intf, pm_message_t message)
{
struct usbtouch_usb *usbtouch = usb_get_intfdata(intf);
......@@ -1407,20 +1409,19 @@ static int usbtouch_suspend
static int usbtouch_resume(struct usb_interface *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)
result = usb_submit_urb(usbtouch->irq, GFP_NOIO);
mutex_unlock(&usbtouch->pm_mutex);
return usb_submit_urb(usbtouch->irq, GFP_NOIO);
return result;
return 0;
}
static int usbtouch_reset_resume(struct usb_interface *intf)
{
struct usbtouch_usb *usbtouch = usb_get_intfdata(intf);
int err = 0;
int err;
/* reinit the device */
if (usbtouch->type->init) {
......@@ -1434,12 +1435,12 @@ static int usbtouch_reset_resume(struct usb_interface *intf)
}
/* restart IO if needed */
mutex_lock(&usbtouch->pm_mutex);
guard(mutex)(&usbtouch->pm_mutex);
if (usbtouch->is_open)
err = usb_submit_urb(usbtouch->irq, GFP_NOIO);
mutex_unlock(&usbtouch->pm_mutex);
return usb_submit_urb(usbtouch->irq, GFP_NOIO);
return err;
return 0;
}
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