]>
Commit | Line | Data |
---|---|---|
00e5a55c BS |
1 | From 9b0ae867a6fd3035e97e6c33bc07a5bfd7c0f96c Mon Sep 17 00:00:00 2001 |
2 | From: Laurent Pinchart <laurent.pinchart@skynet.be> | |
3 | Date: Fri, 22 Aug 2008 17:25:10 -0300 | |
4 | Subject: [PATCH] V4L/DVB (8754): uvcvideo: Implement the USB power management reset_resume method. | |
5 | References: bnc#486331 | |
6 | ||
7 | When a suspended device has been reset instead of being resumed, USB core | |
8 | calls the reset_resume method if available instead of unbinding and rebinding | |
9 | the device. | |
10 | ||
11 | This patch implements reset_resume by reusing the current resume | |
12 | implementation and simplifies the resume method by skipping the controls | |
13 | restore stage. Resuming from autosuspend should be faster. | |
14 | ||
15 | Signed-off-by: Laurent Pinchart <laurent.pinchart@skynet.be> | |
16 | Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> | |
17 | Signed-off-by: Brandon Philips <bphilips@suse.de> | |
18 | --- | |
19 | drivers/media/video/uvc/uvc_driver.c | 15 +++++++++++++-- | |
20 | 1 files changed, 13 insertions(+), 2 deletions(-) | |
21 | ||
22 | diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c | |
23 | index 7e10203..4a2d099 100644 | |
24 | --- a/drivers/media/video/uvc/uvc_driver.c | |
25 | +++ b/drivers/media/video/uvc/uvc_driver.c | |
26 | @@ -1663,7 +1663,7 @@ static int uvc_suspend(struct usb_interface *intf, pm_message_t message) | |
27 | return uvc_video_suspend(&dev->video); | |
28 | } | |
29 | ||
30 | -static int uvc_resume(struct usb_interface *intf) | |
31 | +static int __uvc_resume(struct usb_interface *intf, int reset) | |
32 | { | |
33 | struct uvc_device *dev = usb_get_intfdata(intf); | |
34 | int ret; | |
35 | @@ -1672,7 +1672,7 @@ static int uvc_resume(struct usb_interface *intf) | |
36 | intf->cur_altsetting->desc.bInterfaceNumber); | |
37 | ||
38 | if (intf->cur_altsetting->desc.bInterfaceSubClass == SC_VIDEOCONTROL) { | |
39 | - if ((ret = uvc_ctrl_resume_device(dev)) < 0) | |
40 | + if (reset && (ret = uvc_ctrl_resume_device(dev)) < 0) | |
41 | return ret; | |
42 | ||
43 | return uvc_status_resume(dev); | |
44 | @@ -1687,6 +1687,16 @@ static int uvc_resume(struct usb_interface *intf) | |
45 | return uvc_video_resume(&dev->video); | |
46 | } | |
47 | ||
48 | +static int uvc_resume(struct usb_interface *intf) | |
49 | +{ | |
50 | + return __uvc_resume(intf, 0); | |
51 | +} | |
52 | + | |
53 | +static int uvc_reset_resume(struct usb_interface *intf) | |
54 | +{ | |
55 | + return __uvc_resume(intf, 1); | |
56 | +} | |
57 | + | |
58 | /* ------------------------------------------------------------------------ | |
59 | * Driver initialization and cleanup | |
60 | */ | |
61 | @@ -1952,6 +1962,7 @@ struct uvc_driver uvc_driver = { | |
62 | .disconnect = uvc_disconnect, | |
63 | .suspend = uvc_suspend, | |
64 | .resume = uvc_resume, | |
65 | + .reset_resume = uvc_reset_resume, | |
66 | .id_table = uvc_ids, | |
67 | .supports_autosuspend = 1, | |
68 | }, | |
69 | -- | |
70 | 1.6.2 | |
71 |