[media] v4l: vsp1: Make pipeline inputs array index by RPF index
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Wed, 5 Aug 2015 19:40:31 +0000 (16:40 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Fri, 19 Feb 2016 11:22:38 +0000 (09:22 -0200)
The pipeline inputs array stores pointers to all RPFs contained in the
pipeline. It's currently indexed contiguously by adding RPFs in the
order they are found during graph walk. This can't easily support
dynamic addition and removal of RPFs while streaming, which will be
required for combined VSP+DU support.

Make the array indexed by RPF index instead and skip NULL elements when
iterating over RPFs.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/platform/vsp1/vsp1_pipe.c
drivers/media/platform/vsp1/vsp1_pipe.h
drivers/media/platform/vsp1/vsp1_video.c
drivers/media/platform/vsp1/vsp1_wpf.c

index b850aeb885bf73906c529fc92b6259b8064ca634..05d4c3870cff3d8fe64b8bb53b48d990da6a8522 100644 (file)
@@ -161,14 +161,18 @@ const struct vsp1_format_info *vsp1_get_format_info(u32 fourcc)
 
 void vsp1_pipeline_reset(struct vsp1_pipeline *pipe)
 {
+       unsigned int i;
+
        if (pipe->bru) {
                struct vsp1_bru *bru = to_bru(&pipe->bru->subdev);
-               unsigned int i;
 
                for (i = 0; i < ARRAY_SIZE(bru->inputs); ++i)
                        bru->inputs[i].rpf = NULL;
        }
 
+       for (i = 0; i < ARRAY_SIZE(pipe->inputs); ++i)
+               pipe->inputs[i] = NULL;
+
        INIT_LIST_HEAD(&pipe->entities);
        pipe->state = VSP1_PIPELINE_STOPPED;
        pipe->buffers_ready = 0;
index f9035c739e9a8866c9173253754843d8e375eba0..c4c300561c5c0f6421f7d78bfb66f5269a10d3fe 100644 (file)
@@ -66,7 +66,7 @@ enum vsp1_pipeline_state {
  * @stream_count: number of streaming video nodes
  * @buffers_ready: bitmask of RPFs and WPFs with at least one buffer available
  * @num_inputs: number of RPFs
- * @inputs: array of RPFs in the pipeline
+ * @inputs: array of RPFs in the pipeline (indexed by RPF index)
  * @output: WPF at the output of the pipeline
  * @bru: BRU entity, if present
  * @lif: LIF entity, if present
index 92eb39c509df601e25afd3a6840bd3b837765788..b2eecabdc399e18a9579b57bc9e4e7dd4c9b7d8b 100644 (file)
@@ -298,8 +298,8 @@ static int vsp1_video_pipeline_validate(struct vsp1_pipeline *pipe,
 
                if (e->type == VSP1_ENTITY_RPF) {
                        rwpf = to_rwpf(subdev);
-                       pipe->inputs[pipe->num_inputs++] = rwpf;
-                       rwpf->video->pipe_index = pipe->num_inputs;
+                       pipe->inputs[rwpf->entity.index] = rwpf;
+                       rwpf->video->pipe_index = ++pipe->num_inputs;
                } else if (e->type == VSP1_ENTITY_WPF) {
                        rwpf = to_rwpf(subdev);
                        pipe->output = rwpf;
@@ -324,7 +324,10 @@ static int vsp1_video_pipeline_validate(struct vsp1_pipeline *pipe,
        /* Follow links downstream for each input and make sure the graph
         * contains no loop and that all branches end at the output WPF.
         */
-       for (i = 0; i < pipe->num_inputs; ++i) {
+       for (i = 0; i < video->vsp1->pdata.rpf_count; ++i) {
+               if (!pipe->inputs[i])
+                       continue;
+
                ret = vsp1_video_pipeline_validate_branch(pipe, pipe->inputs[i],
                                                          pipe->output);
                if (ret < 0)
@@ -449,11 +452,16 @@ static void vsp1_video_frame_end(struct vsp1_pipeline *pipe,
 
 static void vsp1_video_pipeline_frame_end(struct vsp1_pipeline *pipe)
 {
+       struct vsp1_device *vsp1 = pipe->output->entity.vsp1;
        unsigned int i;
 
        /* Complete buffers on all video nodes. */
-       for (i = 0; i < pipe->num_inputs; ++i)
+       for (i = 0; i < vsp1->pdata.rpf_count; ++i) {
+               if (!pipe->inputs[i])
+                       continue;
+
                vsp1_video_frame_end(pipe, pipe->inputs[i]);
+       }
 
        if (!pipe->lif)
                vsp1_video_frame_end(pipe, pipe->output);
index 184a7e01aad525401ca812949ffe202b9b1cc563..d0edcde721bd7443cc759085bd2de1c923413801 100644 (file)
@@ -97,9 +97,12 @@ static int wpf_s_stream(struct v4l2_subdev *subdev, int enable)
         * inputs as sub-layers and select the virtual RPF as the master
         * layer.
         */
-       for (i = 0; i < pipe->num_inputs; ++i) {
+       for (i = 0; i < vsp1->pdata.rpf_count; ++i) {
                struct vsp1_rwpf *input = pipe->inputs[i];
 
+               if (!input)
+                       continue;
+
                srcrpf |= (!pipe->bru && pipe->num_inputs == 1)
                        ? VI6_WPF_SRCRPF_RPF_ACT_MST(input->entity.index)
                        : VI6_WPF_SRCRPF_RPF_ACT_SUB(input->entity.index);