[media] au0828: Add suspend code for DVB
authorMauro Carvalho Chehab <m.chehab@samsung.com>
Sun, 10 Aug 2014 00:47:13 +0000 (21:47 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Thu, 21 Aug 2014 20:25:07 +0000 (15:25 -0500)
The scheduled work should be cancelled during suspend.

At resume time, we need to set the frontend again. So,
add such logic to the driver.

Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
drivers/media/usb/au0828/au0828-core.c
drivers/media/usb/au0828/au0828-dvb.c [changed mode: 0644->0755]
drivers/media/usb/au0828/au0828.h

index 87340a8af7d7a6c44024720fd972e613c73531d2..26ec50539dc4da87e569b4dd10fa612df4a3833a 100644 (file)
@@ -290,6 +290,7 @@ static int au0828_suspend(struct usb_interface *interface,
                return 0;
 
        au0828_rc_suspend(dev);
+       au0828_dvb_suspend(dev);
 
        /* FIXME: should suspend also ATV/DTV */
 
@@ -309,6 +310,7 @@ static int au0828_resume(struct usb_interface *interface)
        au0828_gpio_setup(dev);
 
        au0828_rc_resume(dev);
+       au0828_dvb_resume(dev);
 
        /* FIXME: should resume also ATV/DTV */
 
old mode 100644 (file)
new mode 100755 (executable)
index d8b5d94..7b6e710
@@ -23,7 +23,6 @@
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/device.h>
-#include <linux/suspend.h>
 #include <media/v4l2-common.h>
 #include <media/tuner.h>
 
@@ -618,3 +617,33 @@ int au0828_dvb_register(struct au0828_dev *dev)
 
        return 0;
 }
+
+void au0828_dvb_suspend(struct au0828_dev *dev)
+{
+       struct au0828_dvb *dvb = &dev->dvb;
+
+       if (dvb && dev->urb_streaming) {
+               cancel_work_sync(&dev->restart_streaming);
+
+               /* Stop transport */
+               mutex_lock(&dvb->lock);
+               stop_urb_transfer(dev);
+               au0828_stop_transport(dev, 1);
+               mutex_unlock(&dvb->lock);
+       }
+}
+
+void au0828_dvb_resume(struct au0828_dev *dev)
+{
+       struct au0828_dvb *dvb = &dev->dvb;
+
+       if (dvb && dev->urb_streaming) {
+               au0828_set_frontend(dvb->frontend);
+
+               /* Start transport */
+               mutex_lock(&dvb->lock);
+               au0828_start_transport(dev);
+               start_urb_transfer(dev);
+               mutex_unlock(&dvb->lock);
+       }
+}
index fd0916e20323135ae6e13750b7ca3eb04ca59d2c..d32234353096730a28c42aa20d6db333d71e0b5f 100644 (file)
@@ -316,6 +316,8 @@ void au0828_analog_unregister(struct au0828_dev *dev);
 /* au0828-dvb.c */
 extern int au0828_dvb_register(struct au0828_dev *dev);
 extern void au0828_dvb_unregister(struct au0828_dev *dev);
+void au0828_dvb_suspend(struct au0828_dev *dev);
+void au0828_dvb_resume(struct au0828_dev *dev);
 
 /* au0828-vbi.c */
 extern struct videobuf_queue_ops au0828_vbi_qops;
This page took 0.03033 seconds and 5 git commands to generate.