struct vsp1_sru;
 struct vsp1_uds;
 
+#define VSP1_MAX_LIF           2
 #define VSP1_MAX_RPF           5
 #define VSP1_MAX_UDS           3
 #define VSP1_MAX_WPF           4
 
-#define VSP1_HAS_LIF           (1 << 0)
 #define VSP1_HAS_LUT           (1 << 1)
 #define VSP1_HAS_SRU           (1 << 2)
 #define VSP1_HAS_BRU           (1 << 3)
        const char *model;
        unsigned int gen;
        unsigned int features;
+       unsigned int lif_count;
        unsigned int rpf_count;
        unsigned int uds_count;
        unsigned int wpf_count;
        struct vsp1_hgt *hgt;
        struct vsp1_hsit *hsi;
        struct vsp1_hsit *hst;
-       struct vsp1_lif *lif;
+       struct vsp1_lif *lif[VSP1_MAX_LIF];
        struct vsp1_lut *lut;
        struct vsp1_rwpf *rpf[VSP1_MAX_RPF];
        struct vsp1_sru *sru;
 
                format.format.code);
 
        format.pad = LIF_PAD_SINK;
-       ret = v4l2_subdev_call(&vsp1->lif->entity.subdev, pad, set_fmt, NULL,
+       ret = v4l2_subdev_call(&vsp1->lif[0]->entity.subdev, pad, set_fmt, NULL,
                               &format);
        if (ret < 0)
                return ret;
 
        vsp1->bru->entity.sink = &vsp1->wpf[0]->entity;
        vsp1->bru->entity.sink_pad = 0;
-       vsp1->wpf[0]->entity.sink = &vsp1->lif->entity;
+       vsp1->wpf[0]->entity.sink = &vsp1->lif[0]->entity;
        vsp1->wpf[0]->entity.sink_pad = 0;
 
        list_add_tail(&vsp1->bru->entity.list_pipe, &pipe->entities);
        list_add_tail(&vsp1->wpf[0]->entity.list_pipe, &pipe->entities);
-       list_add_tail(&vsp1->lif->entity.list_pipe, &pipe->entities);
+       list_add_tail(&vsp1->lif[0]->entity.list_pipe, &pipe->entities);
 
        pipe->bru = &vsp1->bru->entity;
-       pipe->lif = &vsp1->lif->entity;
+       pipe->lif = &vsp1->lif[0]->entity;
        pipe->output = vsp1->wpf[0];
        pipe->output->pipe = pipe;
        pipe->frame_end = vsp1_du_pipeline_frame_end;
 
                        return ret;
        }
 
-       if (vsp1->lif) {
-               ret = media_create_pad_link(&vsp1->wpf[0]->entity.subdev.entity,
+       for (i = 0; i < vsp1->info->lif_count; ++i) {
+               if (!vsp1->lif[i])
+                       continue;
+
+               ret = media_create_pad_link(&vsp1->wpf[i]->entity.subdev.entity,
                                            RWPF_PAD_SOURCE,
-                                           &vsp1->lif->entity.subdev.entity,
+                                           &vsp1->lif[i]->entity.subdev.entity,
                                            LIF_PAD_SINK, 0);
                if (ret < 0)
                        return ret;
        }
 
        /*
-        * The LIF is only supported when used in conjunction with the DU, in
+        * The LIFs are only supported when used in conjunction with the DU, in
         * which case the userspace API is disabled. If the userspace API is
-        * enabled skip the LIF, even when present.
+        * enabled skip the LIFs, even when present.
         */
-       if (vsp1->info->features & VSP1_HAS_LIF && !vsp1->info->uapi) {
-               vsp1->lif = vsp1_lif_create(vsp1);
-               if (IS_ERR(vsp1->lif)) {
-                       ret = PTR_ERR(vsp1->lif);
-                       goto done;
-               }
+       if (!vsp1->info->uapi) {
+               for (i = 0; i < vsp1->info->lif_count; ++i) {
+                       struct vsp1_lif *lif;
+
+                       lif = vsp1_lif_create(vsp1, i);
+                       if (IS_ERR(lif)) {
+                               ret = PTR_ERR(lif);
+                               goto done;
+                       }
 
-               list_add_tail(&vsp1->lif->entity.list_dev, &vsp1->entities);
+                       vsp1->lif[i] = lif;
+                       list_add_tail(&lif->entity.list_dev, &vsp1->entities);
+               }
        }
 
        if (vsp1->info->features & VSP1_HAS_LUT) {
                .version = VI6_IP_VERSION_MODEL_VSPD_GEN2,
                .model = "VSP1-D",
                .gen = 2,
-               .features = VSP1_HAS_BRU | VSP1_HAS_HGO | VSP1_HAS_LIF
-                         | VSP1_HAS_LUT,
+               .features = VSP1_HAS_BRU | VSP1_HAS_HGO | VSP1_HAS_LUT,
+               .lif_count = 1,
                .rpf_count = 4,
                .uds_count = 1,
                .wpf_count = 1,
                .version = VI6_IP_VERSION_MODEL_VSPD_V2H,
                .model = "VSP1V-D",
                .gen = 2,
-               .features = VSP1_HAS_BRU | VSP1_HAS_CLU | VSP1_HAS_LUT
-                         | VSP1_HAS_LIF,
+               .features = VSP1_HAS_BRU | VSP1_HAS_CLU | VSP1_HAS_LUT,
+               .lif_count = 1,
                .rpf_count = 4,
                .uds_count = 1,
                .wpf_count = 1,
                .version = VI6_IP_VERSION_MODEL_VSPD_GEN3,
                .model = "VSP2-D",
                .gen = 3,
-               .features = VSP1_HAS_BRU | VSP1_HAS_LIF | VSP1_HAS_WPF_VFLIP,
+               .features = VSP1_HAS_BRU | VSP1_HAS_WPF_VFLIP,
+               .lif_count = 1,
                .rpf_count = 5,
                .wpf_count = 2,
                .num_bru_inputs = 5,
                .version = VI6_IP_VERSION_MODEL_VSPD_V3,
                .model = "VSP2-D",
                .gen = 3,
-               .features = VSP1_HAS_BRS | VSP1_HAS_BRU | VSP1_HAS_LIF,
+               .features = VSP1_HAS_BRS | VSP1_HAS_BRU,
+               .lif_count = 1,
                .rpf_count = 5,
                .wpf_count = 1,
                .num_bru_inputs = 5,
                .version = VI6_IP_VERSION_MODEL_VSPDL_GEN3,
                .model = "VSP2-DL",
                .gen = 3,
-               .features = VSP1_HAS_BRS | VSP1_HAS_BRU | VSP1_HAS_LIF,
+               .features = VSP1_HAS_BRS | VSP1_HAS_BRU,
+               .lif_count = 2,
                .rpf_count = 5,
                .wpf_count = 2,
                .num_bru_inputs = 5,
 
        { VSP1_ENTITY_HGT, 0, 0, { 0, }, 0 },
        VSP1_ENTITY_ROUTE(HSI),
        VSP1_ENTITY_ROUTE(HST),
-       { VSP1_ENTITY_LIF, 0, 0, { VI6_DPR_NODE_LIF, }, VI6_DPR_NODE_LIF },
+       { VSP1_ENTITY_LIF, 0, 0, { 0, }, 0 },
+       { VSP1_ENTITY_LIF, 1, 0, { 0, }, 0 },
        VSP1_ENTITY_ROUTE(LUT),
        VSP1_ENTITY_ROUTE_RPF(0),
        VSP1_ENTITY_ROUTE_RPF(1),
 
 static inline void vsp1_lif_write(struct vsp1_lif *lif, struct vsp1_dl_list *dl,
                                  u32 reg, u32 data)
 {
-       vsp1_dl_list_write(dl, reg, data);
+       vsp1_dl_list_write(dl, reg + lif->entity.index * VI6_LIF_OFFSET, data);
 }
 
 /* -----------------------------------------------------------------------------
  * Initialization and Cleanup
  */
 
-struct vsp1_lif *vsp1_lif_create(struct vsp1_device *vsp1)
+struct vsp1_lif *vsp1_lif_create(struct vsp1_device *vsp1, unsigned int index)
 {
        struct vsp1_lif *lif;
        int ret;
 
        lif->entity.ops = &lif_entity_ops;
        lif->entity.type = VSP1_ENTITY_LIF;
+       lif->entity.index = index;
 
        /*
         * The LIF is never exposed to userspace, but media entity registration
 
        return container_of(subdev, struct vsp1_lif, entity.subdev);
 }
 
-struct vsp1_lif *vsp1_lif_create(struct vsp1_device *vsp1);
+struct vsp1_lif *vsp1_lif_create(struct vsp1_device *vsp1, unsigned int index);
 
 #endif /* __VSP1_LIF_H__ */
 
 #define VI6_DPR_NODE_HST               30
 #define VI6_DPR_NODE_HSI               31
 #define VI6_DPR_NODE_BRS_IN(n)         (38 + (n))
-#define VI6_DPR_NODE_LIF               55
+#define VI6_DPR_NODE_LIF               55              /* Gen2 only */
 #define VI6_DPR_NODE_WPF(n)            (56 + (n))
 #define VI6_DPR_NODE_UNUSED            63
 
  * LIF Control Registers
  */
 
+#define VI6_LIF_OFFSET                 (-0x100)
+
 #define VI6_LIF_CTRL                   0x3b00
 #define VI6_LIF_CTRL_OBTH_MASK         (0x7ff << 16)
 #define VI6_LIF_CTRL_OBTH_SHIFT                16