Hi Milen, Just a small comment: On 13/10/2022 14:12, quic_mmitkov@xxxxxxxxxxx wrote: > From: Milen Mitkov <quic_mmitkov@xxxxxxxxxxx> > > Use the multistream series function video_device_pipeline_alloc_start > to allows multiple clients of the same pipeline. > > If any of the entities in the pipeline doesn't return success at stop > (e.g. if a VFE line remains running), the full pipeline won't be stopped. > This allows for stopping and starting streams at any point without > disrupting the other running streams. > > Signed-off-by: Milen Mitkov <quic_mmitkov@xxxxxxxxxxx> > Reviewed-by: Robert Foss <robert.foss@xxxxxxxxxx> > --- > .../media/platform/qcom/camss/camss-video.c | 21 ++++++++++++++++--- > 1 file changed, 18 insertions(+), 3 deletions(-) > > diff --git a/drivers/media/platform/qcom/camss/camss-video.c b/drivers/media/platform/qcom/camss/camss-video.c > index 81fb3a5bc1d5..094971e2ff02 100644 > --- a/drivers/media/platform/qcom/camss/camss-video.c > +++ b/drivers/media/platform/qcom/camss/camss-video.c > @@ -351,6 +351,7 @@ static int video_get_subdev_format(struct camss_video *video, > if (subdev == NULL) > return -EPIPE; > > + memset(&fmt, 0, sizeof(fmt)); > fmt.pad = pad; > fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; > > @@ -493,9 +494,11 @@ static int video_start_streaming(struct vb2_queue *q, unsigned int count) > struct v4l2_subdev *subdev; > int ret; > > - ret = video_device_pipeline_start(vdev, &video->pipe); > - if (ret < 0) > + ret = video_device_pipeline_alloc_start(vdev); > + if (ret < 0) { > + dev_err(video->camss->dev, "Failed to start media pipeline: %d\n", ret); > return ret; This should be a 'goto flush_buffers;'. Regards, Hans > + } > > ret = video_check_format(video); > if (ret < 0) > @@ -536,6 +539,7 @@ static void video_stop_streaming(struct vb2_queue *q) > struct media_entity *entity; > struct media_pad *pad; > struct v4l2_subdev *subdev; > + int ret; > > entity = &vdev->entity; > while (1) { > @@ -550,7 +554,18 @@ static void video_stop_streaming(struct vb2_queue *q) > entity = pad->entity; > subdev = media_entity_to_v4l2_subdev(entity); > > - v4l2_subdev_call(subdev, video, s_stream, 0); > + ret = v4l2_subdev_call(subdev, video, s_stream, 0); > + > + if (ret == -EBUSY) { > + /* Don't stop if other instances of the pipeline are still running */ > + dev_dbg(video->camss->dev, "Video pipeline still used, don't stop streaming.\n"); > + return; > + } > + > + if (ret) { > + dev_err(video->camss->dev, "Video pipeline stop failed: %d\n", ret); > + return; > + } > } > > video_device_pipeline_stop(vdev);