Checking for tuner availability from frontend thread start
disrupts video stream. Change to check for tuner and start
pipeline from frontend open instead and stop pipeline from
frontend release.

Signed-off-by: Shuah Khan <shua...@osg.samsung.com>
---
 drivers/media/dvb-core/dvb_frontend.c | 43 ++++++++++++++++-------------------
 1 file changed, 19 insertions(+), 24 deletions(-)

diff --git a/drivers/media/dvb-core/dvb_frontend.c 
b/drivers/media/dvb-core/dvb_frontend.c
index 842b9c8..b394e1e 100644
--- a/drivers/media/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb-core/dvb_frontend.c
@@ -694,10 +694,6 @@ static int dvb_frontend_thread(void *data)
        struct dvb_frontend_private *fepriv = fe->frontend_priv;
        enum fe_status s;
        enum dvbfe_algo algo;
-#ifdef CONFIG_MEDIA_CONTROLLER_DVB
-       int ret;
-#endif
-
        bool re_tune = false;
        bool semheld = false;
 
@@ -710,20 +706,6 @@ static int dvb_frontend_thread(void *data)
        fepriv->wakeup = 0;
        fepriv->reinitialise = 0;
 
-#ifdef CONFIG_MEDIA_CONTROLLER_DVB
-       ret = dvb_enable_media_tuner(fe);
-       if (ret) {
-               /* FIXME: return an error if it fails */
-               dev_info(fe->dvb->device,
-                       "proceeding with FE task\n");
-       } else if (fepriv->pipe_start_entity) {
-               ret = media_entity_pipeline_start(fepriv->pipe_start_entity,
-                                                 &fepriv->pipe);
-               if (ret)
-                       return ret;
-       }
-#endif
-
        dvb_frontend_init(fe);
 
        set_freezable();
@@ -833,12 +815,6 @@ restart:
                }
        }
 
-#ifdef CONFIG_MEDIA_CONTROLLER_DVB
-       if (fepriv->pipe_start_entity)
-               media_entity_pipeline_stop(fepriv->pipe_start_entity);
-       fepriv->pipe_start_entity = NULL;
-#endif
-
        if (dvb_powerdown_on_sleep) {
                if (fe->ops.set_voltage)
                        fe->ops.set_voltage(fe, SEC_VOLTAGE_OFF);
@@ -2616,6 +2592,20 @@ static int dvb_frontend_open(struct inode *inode, struct 
file *file)
                fepriv->tone = -1;
                fepriv->voltage = -1;
 
+#ifdef CONFIG_MEDIA_CONTROLLER_DVB
+               ret = dvb_enable_media_tuner(fe);
+               if (ret) {
+                       dev_err(fe->dvb->device,
+                               "Tuner is busy. Error %d\n", ret);
+                       goto err1;
+               } else if (fepriv->pipe_start_entity) {
+                       ret = media_entity_pipeline_start(
+                                               fepriv->pipe_start_entity,
+                                               &fepriv->pipe);
+                       if (ret)
+                               goto err1;
+               }
+#endif
                ret = dvb_frontend_start (fe);
                if (ret)
                        goto err2;
@@ -2659,6 +2649,11 @@ static int dvb_frontend_release(struct inode *inode, 
struct file *file)
                wake_up(&fepriv->wait_queue);
                if (fe->exit != DVB_FE_NO_EXIT)
                        wake_up(&dvbdev->wait_queue);
+#ifdef CONFIG_MEDIA_CONTROLLER_DVB
+               if (fepriv->pipe_start_entity)
+                       media_entity_pipeline_stop(fepriv->pipe_start_entity);
+               fepriv->pipe_start_entity = NULL;
+#endif
                if (fe->ops.ts_bus_ctrl)
                        fe->ops.ts_bus_ctrl(fe, 0);
        }
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to