]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/staging/media/imx/imx-ic-prpencvf.c
media: imx: prpencvf: Stop upstream before disabling IDMA channel
[linux.git] / drivers / staging / media / imx / imx-ic-prpencvf.c
index 053a911d477aa6ec1d7ac4fec204ae2be8cf33cb..3637693c2bc88f27e2cd94808e9433e66e3722a4 100644 (file)
@@ -706,12 +706,23 @@ static int prp_start(struct prp_priv *priv)
                goto out_free_nfb4eof_irq;
        }
 
+       /* start upstream */
+       ret = v4l2_subdev_call(priv->src_sd, video, s_stream, 1);
+       ret = (ret && ret != -ENOIOCTLCMD) ? ret : 0;
+       if (ret) {
+               v4l2_err(&ic_priv->sd,
+                        "upstream stream on failed: %d\n", ret);
+               goto out_free_eof_irq;
+       }
+
        /* start the EOF timeout timer */
        mod_timer(&priv->eof_timeout_timer,
                  jiffies + msecs_to_jiffies(IMX_MEDIA_EOF_TIMEOUT));
 
        return 0;
 
+out_free_eof_irq:
+       devm_free_irq(ic_priv->dev, priv->eof_irq, priv);
 out_free_nfb4eof_irq:
        devm_free_irq(ic_priv->dev, priv->nfb4eof_irq, priv);
 out_unsetup:
@@ -743,6 +754,12 @@ static void prp_stop(struct prp_priv *priv)
        if (ret == 0)
                v4l2_warn(&ic_priv->sd, "wait last EOF timeout\n");
 
+       /* stop upstream */
+       ret = v4l2_subdev_call(priv->src_sd, video, s_stream, 0);
+       if (ret && ret != -ENOIOCTLCMD)
+               v4l2_warn(&ic_priv->sd,
+                         "upstream stream off failed: %d\n", ret);
+
        devm_free_irq(ic_priv->dev, priv->eof_irq, priv);
        devm_free_irq(ic_priv->dev, priv->nfb4eof_irq, priv);
 
@@ -1173,15 +1190,6 @@ static int prp_s_stream(struct v4l2_subdev *sd, int enable)
        if (ret)
                goto out;
 
-       /* start/stop upstream */
-       ret = v4l2_subdev_call(priv->src_sd, video, s_stream, enable);
-       ret = (ret && ret != -ENOIOCTLCMD) ? ret : 0;
-       if (ret) {
-               if (enable)
-                       prp_stop(priv);
-               goto out;
-       }
-
 update_count:
        priv->stream_count += enable ? 1 : -1;
        if (priv->stream_count < 0)