Commit 9b0ae867 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (8754): uvcvideo: Implement the USB power management reset_resume method.



When a suspended device has been reset instead of being resumed, USB core
calls the reset_resume method if available instead of unbinding and rebinding
the device.

This patch implements reset_resume by reusing the current resume
implementation and simplifies the resume method by skipping the controls
restore stage. Resuming from autosuspend should be faster.

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@skynet.be>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 14d96260
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -1663,7 +1663,7 @@ static int uvc_suspend(struct usb_interface *intf, pm_message_t message)
	return uvc_video_suspend(&dev->video);
}

static int uvc_resume(struct usb_interface *intf)
static int __uvc_resume(struct usb_interface *intf, int reset)
{
	struct uvc_device *dev = usb_get_intfdata(intf);
	int ret;
@@ -1672,7 +1672,7 @@ static int uvc_resume(struct usb_interface *intf)
		intf->cur_altsetting->desc.bInterfaceNumber);

	if (intf->cur_altsetting->desc.bInterfaceSubClass == SC_VIDEOCONTROL) {
		if ((ret = uvc_ctrl_resume_device(dev)) < 0)
		if (reset && (ret = uvc_ctrl_resume_device(dev)) < 0)
			return ret;

		return uvc_status_resume(dev);
@@ -1687,6 +1687,16 @@ static int uvc_resume(struct usb_interface *intf)
	return uvc_video_resume(&dev->video);
}

static int uvc_resume(struct usb_interface *intf)
{
	return __uvc_resume(intf, 0);
}

static int uvc_reset_resume(struct usb_interface *intf)
{
	return __uvc_resume(intf, 1);
}

/* ------------------------------------------------------------------------
 * Driver initialization and cleanup
 */
@@ -1952,6 +1962,7 @@ struct uvc_driver uvc_driver = {
		.disconnect	= uvc_disconnect,
		.suspend	= uvc_suspend,
		.resume		= uvc_resume,
		.reset_resume	= uvc_reset_resume,
		.id_table	= uvc_ids,
		.supports_autosuspend = 1,
	},