Commit ef81e9eb authored by Antti Palosaari's avatar Antti Palosaari Committed by Mauro Carvalho Chehab

[media] dvb_usb_v2: suspend/resume stop/start USB streaming

Stop remote polling and USB streaming before suspend and resume
those when back to normal operation.

It is far away from complete implementation, but at least it does
not hang system anymore on suspend while streaming is ongoing.
Signed-off-by: default avatarAntti Palosaari <crope@iki.fi>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 5b6a63cc
...@@ -356,6 +356,8 @@ struct dvb_usb_device { ...@@ -356,6 +356,8 @@ struct dvb_usb_device {
extern int dvb_usbv2_probe(struct usb_interface *, extern int dvb_usbv2_probe(struct usb_interface *,
const struct usb_device_id *); const struct usb_device_id *);
extern void dvb_usbv2_disconnect(struct usb_interface *); extern void dvb_usbv2_disconnect(struct usb_interface *);
extern int dvb_usbv2_suspend(struct usb_interface *, pm_message_t);
extern int dvb_usbv2_resume(struct usb_interface *);
/* the generic read/write method for device control */ /* the generic read/write method for device control */
extern int dvb_usbv2_generic_rw(struct dvb_usb_device *, u8 *, u16, u8 *, u16, extern int dvb_usbv2_generic_rw(struct dvb_usb_device *, u8 *, u16, u8 *, u16,
......
...@@ -439,6 +439,49 @@ void dvb_usbv2_disconnect(struct usb_interface *intf) ...@@ -439,6 +439,49 @@ void dvb_usbv2_disconnect(struct usb_interface *intf)
} }
EXPORT_SYMBOL(dvb_usbv2_disconnect); EXPORT_SYMBOL(dvb_usbv2_disconnect);
int dvb_usbv2_suspend(struct usb_interface *intf, pm_message_t msg)
{
struct dvb_usb_device *d = usb_get_intfdata(intf);
int i;
pr_debug("%s:\n", __func__);
/* stop remote controller poll */
if (d->rc.query && !d->rc.bulk_mode)
cancel_delayed_work_sync(&d->rc_query_work);
/* stop streaming */
for (i = d->num_adapters_initialized - 1; i >= 0; i--) {
if (d->adapter[i].active_fe != -1)
usb_urb_killv2(&d->adapter[i].stream);
}
return 0;
}
EXPORT_SYMBOL(dvb_usbv2_suspend);
int dvb_usbv2_resume(struct usb_interface *intf)
{
struct dvb_usb_device *d = usb_get_intfdata(intf);
int i;
pr_debug("%s:\n", __func__);
/* start streaming */
for (i = 0; i < d->num_adapters_initialized; i++) {
if (d->adapter[i].active_fe != -1)
usb_urb_submitv2(&d->adapter[i].stream, NULL);
}
/* start remote controller poll */
if (d->rc.query && !d->rc.bulk_mode)
schedule_delayed_work(&d->rc_query_work,
msecs_to_jiffies(d->rc.interval));
return 0;
}
EXPORT_SYMBOL(dvb_usbv2_resume);
MODULE_VERSION("1.0"); MODULE_VERSION("1.0");
MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>"); MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");
MODULE_DESCRIPTION("A library module containing commonly used USB and DVB function USB DVB devices"); MODULE_DESCRIPTION("A library module containing commonly used USB and DVB function USB DVB devices");
......
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