Commit 6a709749 authored by Jean-Francois Moine's avatar Jean-Francois Moine Committed by Mauro Carvalho Chehab

V4L/DVB (8718): gspca: suspend/resume added.

Signed-off-by: default avatarJean-Francois Moine <moinejf@free.fr>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 5d05294a
...@@ -1026,6 +1026,10 @@ static struct usb_driver sd_driver = { ...@@ -1026,6 +1026,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -926,6 +926,10 @@ static struct usb_driver sd_driver = { ...@@ -926,6 +926,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -114,7 +114,8 @@ static void fill_frame(struct gspca_dev *gspca_dev, ...@@ -114,7 +114,8 @@ static void fill_frame(struct gspca_dev *gspca_dev,
cam_pkt_op pkt_scan; cam_pkt_op pkt_scan;
if (urb->status != 0) { if (urb->status != 0) {
PDEBUG(D_ERR|D_PACK, "urb status: %d", urb->status); if (!gspca_dev->frozen)
PDEBUG(D_ERR|D_PACK, "urb status: %d", urb->status);
return; /* disconnection ? */ return; /* disconnection ? */
} }
pkt_scan = gspca_dev->sd_desc->pkt_scan; pkt_scan = gspca_dev->sd_desc->pkt_scan;
...@@ -1808,6 +1809,33 @@ void gspca_disconnect(struct usb_interface *intf) ...@@ -1808,6 +1809,33 @@ void gspca_disconnect(struct usb_interface *intf)
} }
EXPORT_SYMBOL(gspca_disconnect); EXPORT_SYMBOL(gspca_disconnect);
#ifdef CONFIG_PM
int gspca_suspend(struct usb_interface *intf, pm_message_t message)
{
struct gspca_dev *gspca_dev = usb_get_intfdata(intf);
if (!gspca_dev->streaming)
return 0;
gspca_dev->frozen = 1; /* avoid urb error messages */
gspca_dev->sd_desc->stopN(gspca_dev);
destroy_urbs(gspca_dev);
gspca_set_alt0(gspca_dev);
gspca_dev->sd_desc->stop0(gspca_dev);
return 0;
}
EXPORT_SYMBOL(gspca_suspend);
int gspca_resume(struct usb_interface *intf)
{
struct gspca_dev *gspca_dev = usb_get_intfdata(intf);
gspca_dev->frozen = 0;
if (!gspca_dev->streaming)
return 0;
return gspca_init_transfer(gspca_dev);
}
EXPORT_SYMBOL(gspca_resume);
#endif
/* -- cam driver utility functions -- */ /* -- cam driver utility functions -- */
/* auto gain and exposure algorithm based on the knee algorithm described here: /* auto gain and exposure algorithm based on the knee algorithm described here:
......
...@@ -154,6 +154,9 @@ struct gspca_dev { ...@@ -154,6 +154,9 @@ struct gspca_dev {
struct mutex queue_lock; /* ISOC queue protection */ struct mutex queue_lock; /* ISOC queue protection */
__u32 sequence; /* frame sequence number */ __u32 sequence; /* frame sequence number */
char streaming; char streaming;
#ifdef CONFIG_PM
char frozen; /* suspend - resume */
#endif
char users; /* number of opens */ char users; /* number of opens */
char present; /* device connected */ char present; /* device connected */
char nbufread; /* number of buffers for read() */ char nbufread; /* number of buffers for read() */
...@@ -173,6 +176,10 @@ struct gspca_frame *gspca_frame_add(struct gspca_dev *gspca_dev, ...@@ -173,6 +176,10 @@ struct gspca_frame *gspca_frame_add(struct gspca_dev *gspca_dev,
struct gspca_frame *frame, struct gspca_frame *frame,
const __u8 *data, const __u8 *data,
int len); int len);
#ifdef CONFIG_PM
int gspca_suspend(struct usb_interface *intf, pm_message_t message);
int gspca_resume(struct usb_interface *intf);
#endif
int gspca_auto_gain_n_exposure(struct gspca_dev *gspca_dev, int avg_lum, int gspca_auto_gain_n_exposure(struct gspca_dev *gspca_dev, int avg_lum,
int desired_avg_lum, int deadzone, int gain_knee, int exposure_knee); int desired_avg_lum, int deadzone, int gain_knee, int exposure_knee);
#endif /* GSPCAV2_H */ #endif /* GSPCAV2_H */
...@@ -439,6 +439,10 @@ static struct usb_driver sd_driver = { ...@@ -439,6 +439,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -2132,6 +2132,10 @@ static struct usb_driver sd_driver = { ...@@ -2132,6 +2132,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -596,6 +596,10 @@ static struct usb_driver sd_driver = { ...@@ -596,6 +596,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -936,6 +936,10 @@ static struct usb_driver sd_driver = { ...@@ -936,6 +936,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -1231,6 +1231,10 @@ static struct usb_driver sd_driver = { ...@@ -1231,6 +1231,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -1617,6 +1617,10 @@ static struct usb_driver sd_driver = { ...@@ -1617,6 +1617,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -1093,6 +1093,10 @@ static struct usb_driver sd_driver = { ...@@ -1093,6 +1093,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -2154,6 +2154,10 @@ static struct usb_driver sd_driver = { ...@@ -2154,6 +2154,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -855,6 +855,10 @@ static struct usb_driver sd_driver = { ...@@ -855,6 +855,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -772,6 +772,10 @@ static struct usb_driver sd_driver = { ...@@ -772,6 +772,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -1667,6 +1667,10 @@ static struct usb_driver sd_driver = { ...@@ -1667,6 +1667,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -1184,6 +1184,10 @@ static struct usb_driver sd_driver = { ...@@ -1184,6 +1184,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -564,6 +564,10 @@ static struct usb_driver sd_driver = { ...@@ -564,6 +564,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -1456,6 +1456,10 @@ static struct usb_driver sd_driver = { ...@@ -1456,6 +1456,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -1014,6 +1014,10 @@ static struct usb_driver sd_driver = { ...@@ -1014,6 +1014,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -644,6 +644,10 @@ static struct usb_driver sd_driver = { ...@@ -644,6 +644,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -1774,6 +1774,10 @@ static struct usb_driver sd_driver = { ...@@ -1774,6 +1774,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
/* -- module insert / remove -- */ /* -- module insert / remove -- */
......
...@@ -7584,6 +7584,10 @@ static struct usb_driver sd_driver = { ...@@ -7584,6 +7584,10 @@ static struct usb_driver sd_driver = {
.id_table = device_table, .id_table = device_table,
.probe = sd_probe, .probe = sd_probe,
.disconnect = gspca_disconnect, .disconnect = gspca_disconnect,
#ifdef CONFIG_PM
.suspend = gspca_suspend,
.resume = gspca_resume,
#endif
}; };
static int __init sd_mod_init(void) static int __init sd_mod_init(void)
......
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