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;
 
  * @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
 
 
                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;
        /* 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)
 
 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);
 
         * 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);