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:
        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);
 
        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)