}
 
        csi_chan->pg_mode = chan->pg_mode;
+
+       /*
+        * Tegra CSI receiver can detect the first LP to HS transition.
+        * So, start the CSI stream-on prior to sensor stream-on and
+        * vice-versa for stream-off.
+        */
        ret = csi->ops->csi_start_streaming(csi_chan);
        if (ret < 0)
                goto finish_calibration;
 
+       if (csi_chan->mipi) {
+               struct v4l2_subdev *src_subdev;
+               /*
+                * TRM has incorrectly documented to wait for done status from
+                * calibration logic after CSI interface power on.
+                * As per the design, calibration results are latched and applied
+                * to the pads only when the link is in LP11 state which will happen
+                * during the sensor stream-on.
+                * CSI subdev stream-on triggers start of MIPI pads calibration.
+                * Wait for calibration to finish here after sensor subdev stream-on.
+                */
+               src_subdev = tegra_channel_get_remote_source_subdev(chan);
+               ret = v4l2_subdev_call(src_subdev, video, s_stream, true);
+
+               if (ret < 0 && ret != -ENOIOCTLCMD)
+                       goto disable_csi_stream;
+
+               err = tegra_mipi_finish_calibration(csi_chan->mipi);
+               if (err < 0)
+                       dev_warn(csi->dev, "MIPI calibration failed: %d\n", err);
+       }
+
        return 0;
 
+disable_csi_stream:
+       csi->ops->csi_stop_streaming(csi_chan);
 finish_calibration:
        if (csi_chan->mipi)
                tegra_mipi_finish_calibration(csi_chan->mipi);
 
 static int tegra_csi_disable_stream(struct v4l2_subdev *subdev)
 {
+       struct tegra_vi_channel *chan = v4l2_get_subdev_hostdata(subdev);
        struct tegra_csi_channel *csi_chan = to_csi_chan(subdev);
        struct tegra_csi *csi = csi_chan->csi;
        int err;
 
+       /*
+        * Stream-off subdevices in reverse order to stream-on.
+        * Remote source subdev in TPG mode is same as CSI subdev.
+        */
+       if (csi_chan->mipi) {
+               struct v4l2_subdev *src_subdev;
+
+               src_subdev = tegra_channel_get_remote_source_subdev(chan);
+               err = v4l2_subdev_call(src_subdev, video, s_stream, false);
+               if (err < 0 && err != -ENOIOCTLCMD)
+                       dev_err_probe(csi->dev, err, "source subdev stream off failed\n");
+       }
+
        csi->ops->csi_stop_streaming(csi_chan);
 
        if (csi_chan->mipi) {
 
 
 static int tegra_channel_enable_stream(struct tegra_vi_channel *chan)
 {
-       struct v4l2_subdev *csi_subdev, *src_subdev;
-       struct tegra_csi_channel *csi_chan;
-       int ret, err;
+       struct v4l2_subdev *subdev;
+       int ret;
 
-       /*
-        * Tegra CSI receiver can detect the first LP to HS transition.
-        * So, start the CSI stream-on prior to sensor stream-on and
-        * vice-versa for stream-off.
-        */
-       csi_subdev = tegra_channel_get_remote_csi_subdev(chan);
-       ret = v4l2_subdev_call(csi_subdev, video, s_stream, true);
+       subdev = tegra_channel_get_remote_csi_subdev(chan);
+       ret = v4l2_subdev_call(subdev, video, s_stream, true);
        if (ret < 0 && ret != -ENOIOCTLCMD)
                return ret;
 
-       if (IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG))
-               return 0;
-
-       csi_chan = v4l2_get_subdevdata(csi_subdev);
-       /*
-        * TRM has incorrectly documented to wait for done status from
-        * calibration logic after CSI interface power on.
-        * As per the design, calibration results are latched and applied
-        * to the pads only when the link is in LP11 state which will happen
-        * during the sensor stream-on.
-        * CSI subdev stream-on triggers start of MIPI pads calibration.
-        * Wait for calibration to finish here after sensor subdev stream-on.
-        */
-       src_subdev = tegra_channel_get_remote_source_subdev(chan);
-       ret = v4l2_subdev_call(src_subdev, video, s_stream, true);
-       err = tegra_mipi_finish_calibration(csi_chan->mipi);
-
-       if (ret < 0 && ret != -ENOIOCTLCMD)
-               goto err_disable_csi_stream;
-
-       if (err < 0)
-               dev_warn(csi_chan->csi->dev,
-                        "MIPI calibration failed: %d\n", err);
-
        return 0;
-
-err_disable_csi_stream:
-       v4l2_subdev_call(csi_subdev, video, s_stream, false);
-       return ret;
 }
 
 static int tegra_channel_disable_stream(struct tegra_vi_channel *chan)
        struct v4l2_subdev *subdev;
        int ret;
 
-       /*
-        * Stream-off subdevices in reverse order to stream-on.
-        * Remote source subdev in TPG mode is same as CSI subdev.
-        */
-       subdev = tegra_channel_get_remote_source_subdev(chan);
-       ret = v4l2_subdev_call(subdev, video, s_stream, false);
-       if (ret < 0 && ret != -ENOIOCTLCMD)
-               return ret;
-
-       if (IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG))
-               return 0;
-
        subdev = tegra_channel_get_remote_csi_subdev(chan);
        ret = v4l2_subdev_call(subdev, video, s_stream, false);
        if (ret < 0 && ret != -ENOIOCTLCMD)