return 0;
}
+/*
+ * Turn current pipeline streaming on/off starting from entity.
+ */
+static int imx7_csi_media_pipeline_set_stream(struct imx_media_dev *imxmd,
+ struct media_entity *entity,
+ bool on)
+{
+ struct v4l2_subdev *sd;
+ int ret = 0;
+
+ if (!is_media_entity_v4l2_subdev(entity))
+ return -EINVAL;
+ sd = media_entity_to_v4l2_subdev(entity);
+
+ mutex_lock(&imxmd->md.graph_mutex);
+
+ if (on) {
+ ret = __media_pipeline_start(entity, &imxmd->pipe);
+ if (ret)
+ goto out;
+ ret = v4l2_subdev_call(sd, video, s_stream, 1);
+ if (ret)
+ __media_pipeline_stop(entity);
+ } else {
+ v4l2_subdev_call(sd, video, s_stream, 0);
+ if (entity->pipe)
+ __media_pipeline_stop(entity);
+ }
+
+out:
+ mutex_unlock(&imxmd->md.graph_mutex);
+ return ret;
+}
+
static int imx7_csi_video_start_streaming(struct vb2_queue *vq,
unsigned int count)
{
goto return_bufs;
}
- ret = imx_media_pipeline_set_stream(&csi->imxmd, &csi->sd.entity, true);
+ ret = imx7_csi_media_pipeline_set_stream(&csi->imxmd, &csi->sd.entity,
+ true);
if (ret) {
dev_err(csi->dev, "pipeline start failed with %d\n", ret);
goto return_bufs;
unsigned long flags;
int ret;
- ret = imx_media_pipeline_set_stream(&csi->imxmd, &csi->sd.entity, false);
+ ret = imx7_csi_media_pipeline_set_stream(&csi->imxmd, &csi->sd.entity,
+ false);
if (ret)
dev_warn(csi->dev, "pipeline stop failed with %d\n", ret);