static irqreturn_t ispif_isr_8x96(int irq, void *dev)
 {
        struct ispif_device *ispif = dev;
+       struct camss *camss = ispif->camss;
        u32 value0, value1, value2, value3, value4, value5;
 
        value0 = readl_relaxed(ispif->base + ISPIF_VFE_m_IRQ_STATUS_0(0));
                complete(&ispif->reset_complete[1]);
 
        if (unlikely(value0 & ISPIF_VFE_m_IRQ_STATUS_0_PIX0_OVERFLOW))
-               dev_err_ratelimited(to_device(ispif), "VFE0 pix0 overflow\n");
+               dev_err_ratelimited(camss->dev, "VFE0 pix0 overflow\n");
 
        if (unlikely(value0 & ISPIF_VFE_m_IRQ_STATUS_0_RDI0_OVERFLOW))
-               dev_err_ratelimited(to_device(ispif), "VFE0 rdi0 overflow\n");
+               dev_err_ratelimited(camss->dev, "VFE0 rdi0 overflow\n");
 
        if (unlikely(value1 & ISPIF_VFE_m_IRQ_STATUS_1_PIX1_OVERFLOW))
-               dev_err_ratelimited(to_device(ispif), "VFE0 pix1 overflow\n");
+               dev_err_ratelimited(camss->dev, "VFE0 pix1 overflow\n");
 
        if (unlikely(value1 & ISPIF_VFE_m_IRQ_STATUS_1_RDI1_OVERFLOW))
-               dev_err_ratelimited(to_device(ispif), "VFE0 rdi1 overflow\n");
+               dev_err_ratelimited(camss->dev, "VFE0 rdi1 overflow\n");
 
        if (unlikely(value2 & ISPIF_VFE_m_IRQ_STATUS_2_RDI2_OVERFLOW))
-               dev_err_ratelimited(to_device(ispif), "VFE0 rdi2 overflow\n");
+               dev_err_ratelimited(camss->dev, "VFE0 rdi2 overflow\n");
 
        if (unlikely(value3 & ISPIF_VFE_m_IRQ_STATUS_0_PIX0_OVERFLOW))
-               dev_err_ratelimited(to_device(ispif), "VFE1 pix0 overflow\n");
+               dev_err_ratelimited(camss->dev, "VFE1 pix0 overflow\n");
 
        if (unlikely(value3 & ISPIF_VFE_m_IRQ_STATUS_0_RDI0_OVERFLOW))
-               dev_err_ratelimited(to_device(ispif), "VFE1 rdi0 overflow\n");
+               dev_err_ratelimited(camss->dev, "VFE1 rdi0 overflow\n");
 
        if (unlikely(value4 & ISPIF_VFE_m_IRQ_STATUS_1_PIX1_OVERFLOW))
-               dev_err_ratelimited(to_device(ispif), "VFE1 pix1 overflow\n");
+               dev_err_ratelimited(camss->dev, "VFE1 pix1 overflow\n");
 
        if (unlikely(value4 & ISPIF_VFE_m_IRQ_STATUS_1_RDI1_OVERFLOW))
-               dev_err_ratelimited(to_device(ispif), "VFE1 rdi1 overflow\n");
+               dev_err_ratelimited(camss->dev, "VFE1 rdi1 overflow\n");
 
        if (unlikely(value5 & ISPIF_VFE_m_IRQ_STATUS_2_RDI2_OVERFLOW))
-               dev_err_ratelimited(to_device(ispif), "VFE1 rdi2 overflow\n");
+               dev_err_ratelimited(camss->dev, "VFE1 rdi2 overflow\n");
 
        return IRQ_HANDLED;
 }
 static irqreturn_t ispif_isr_8x16(int irq, void *dev)
 {
        struct ispif_device *ispif = dev;
+       struct camss *camss = ispif->camss;
        u32 value0, value1, value2;
 
        value0 = readl_relaxed(ispif->base + ISPIF_VFE_m_IRQ_STATUS_0(0));
                complete(&ispif->reset_complete[0]);
 
        if (unlikely(value0 & ISPIF_VFE_m_IRQ_STATUS_0_PIX0_OVERFLOW))
-               dev_err_ratelimited(to_device(ispif), "VFE0 pix0 overflow\n");
+               dev_err_ratelimited(camss->dev, "VFE0 pix0 overflow\n");
 
        if (unlikely(value0 & ISPIF_VFE_m_IRQ_STATUS_0_RDI0_OVERFLOW))
-               dev_err_ratelimited(to_device(ispif), "VFE0 rdi0 overflow\n");
+               dev_err_ratelimited(camss->dev, "VFE0 rdi0 overflow\n");
 
        if (unlikely(value1 & ISPIF_VFE_m_IRQ_STATUS_1_PIX1_OVERFLOW))
-               dev_err_ratelimited(to_device(ispif), "VFE0 pix1 overflow\n");
+               dev_err_ratelimited(camss->dev, "VFE0 pix1 overflow\n");
 
        if (unlikely(value1 & ISPIF_VFE_m_IRQ_STATUS_1_RDI1_OVERFLOW))
-               dev_err_ratelimited(to_device(ispif), "VFE0 rdi1 overflow\n");
+               dev_err_ratelimited(camss->dev, "VFE0 rdi1 overflow\n");
 
        if (unlikely(value2 & ISPIF_VFE_m_IRQ_STATUS_2_RDI2_OVERFLOW))
-               dev_err_ratelimited(to_device(ispif), "VFE0 rdi2 overflow\n");
+               dev_err_ratelimited(camss->dev, "VFE0 rdi2 overflow\n");
 
        return IRQ_HANDLED;
 }
 
 static int ispif_vfe_reset(struct ispif_device *ispif, u8 vfe_id)
 {
+       struct camss *camss = ispif->camss;
+
        unsigned long time;
        u32 val;
 
-       if (vfe_id > (to_camss(ispif)->vfe_num - 1)) {
-               dev_err(to_device(ispif),
+       if (vfe_id > (camss->vfe_num - 1)) {
+               dev_err(camss->dev,
                        "Error: asked reset for invalid VFE%d\n", vfe_id);
                return -ENOENT;
        }
        time = wait_for_completion_timeout(&ispif->reset_complete[vfe_id],
                msecs_to_jiffies(ISPIF_RESET_TIMEOUT_MS));
        if (!time) {
-               dev_err(to_device(ispif),
+               dev_err(camss->dev,
                        "ISPIF for VFE%d reset timeout\n", vfe_id);
                return -EIO;
        }
  */
 static int ispif_reset(struct ispif_device *ispif, u8 vfe_id)
 {
+       struct camss *camss = ispif->camss;
        int ret;
 
-       ret = camss_pm_domain_on(to_camss(ispif), PM_DOMAIN_VFE0);
+       ret = camss_pm_domain_on(camss, PM_DOMAIN_VFE0);
        if (ret < 0)
                return ret;
 
-       ret = camss_pm_domain_on(to_camss(ispif), PM_DOMAIN_VFE1);
+       ret = camss_pm_domain_on(camss, PM_DOMAIN_VFE1);
        if (ret < 0)
                return ret;
 
        ret = camss_enable_clocks(ispif->nclocks_for_reset,
                                  ispif->clock_for_reset,
-                                 to_device(ispif));
+                                 camss->dev);
        if (ret < 0)
                return ret;
 
        ret = ispif_vfe_reset(ispif, vfe_id);
        if (ret)
-               dev_dbg(to_device(ispif), "ISPIF Reset failed\n");
+               dev_dbg(camss->dev, "ISPIF Reset failed\n");
 
        camss_disable_clocks(ispif->nclocks_for_reset, ispif->clock_for_reset);
 
-       camss_pm_domain_off(to_camss(ispif), PM_DOMAIN_VFE0);
-       camss_pm_domain_off(to_camss(ispif), PM_DOMAIN_VFE1);
+       camss_pm_domain_off(camss, PM_DOMAIN_VFE0);
+       camss_pm_domain_off(camss, PM_DOMAIN_VFE1);
 
        return ret;
 }
 {
        struct ispif_line *line = v4l2_get_subdevdata(sd);
        struct ispif_device *ispif = line->ispif;
-       struct device *dev = to_device(ispif);
+       struct device *dev = ispif->camss->dev;
        int ret = 0;
 
        mutex_lock(&ispif->power_lock);
        }
 
        if ((val & 0xf) != 0xf) {
-               dev_err(to_device(ispif), "%s: ispif is busy: 0x%x\n",
+               dev_err(ispif->camss->dev, "%s: ispif is busy: 0x%x\n",
                        __func__, val);
                ret = -EBUSY;
        }
                                 ISPIF_TIMEOUT_SLEEP_US,
                                 ISPIF_TIMEOUT_ALL_US);
        if (ret < 0)
-               dev_err(to_device(ispif), "%s: ispif stop timeout\n",
+               dev_err(ispif->camss->dev, "%s: ispif stop timeout\n",
                        __func__);
 
        return ret;
 {
        struct ispif_line *line = v4l2_get_subdevdata(sd);
        struct ispif_device *ispif = line->ispif;
+       struct camss *camss = ispif->camss;
        enum ispif_intf intf = line->interface;
        u8 csid = line->csid_id;
        u8 vfe = line->vfe_id;
                ispif_select_csid(ispif, intf, csid, vfe, 1);
                ispif_select_cid(ispif, intf, cid, vfe, 1);
                ispif_config_irq(ispif, intf, vfe, 1);
-               if (to_camss(ispif)->version == CAMSS_8x96 ||
-                   to_camss(ispif)->version == CAMSS_660)
+               if (camss->version == CAMSS_8x96 ||
+                   camss->version == CAMSS_660)
                        ispif_config_pack(ispif,
                                          line->fmt[MSM_ISPIF_PAD_SINK].code,
                                          intf, cid, vfe, 1);
                        return ret;
 
                mutex_lock(&ispif->config_lock);
-               if (to_camss(ispif)->version == CAMSS_8x96 ||
-                   to_camss(ispif)->version == CAMSS_660)
+               if (camss->version == CAMSS_8x96 ||
+                   camss->version == CAMSS_660)
                        ispif_config_pack(ispif,
                                          line->fmt[MSM_ISPIF_PAD_SINK].code,
                                          intf, cid, vfe, 0);
  *
  * Return 0 on success or a negative error code otherwise
  */
-int msm_ispif_subdev_init(struct ispif_device *ispif,
+int msm_ispif_subdev_init(struct camss *camss,
                          const struct resources_ispif *res)
 {
-       struct device *dev = to_device(ispif);
+       struct device *dev = camss->dev;
+       struct ispif_device *ispif = camss->ispif;
        struct platform_device *pdev = to_platform_device(dev);
        struct resource *r;
        int i;
        int ret;
 
+       if (!camss->ispif)
+               return 0;
+
+       ispif->camss = camss;
+
        /* Number of ISPIF lines - same as number of CSID hardware modules */
-       if (to_camss(ispif)->version == CAMSS_8x16)
+       if (camss->version == CAMSS_8x16)
                ispif->line_num = 2;
-       else if (to_camss(ispif)->version == CAMSS_8x96 ||
-                to_camss(ispif)->version == CAMSS_660)
+       else if (camss->version == CAMSS_8x96 ||
+                camss->version == CAMSS_660)
                ispif->line_num = 4;
        else
                return -EINVAL;
 
-       ispif->line = devm_kcalloc(dev, ispif->line_num, sizeof(*ispif->line),
-                                  GFP_KERNEL);
+       ispif->line = devm_kcalloc(dev, ispif->line_num,
+                                  sizeof(*ispif->line), GFP_KERNEL);
        if (!ispif->line)
                return -ENOMEM;
 
                ispif->line[i].ispif = ispif;
                ispif->line[i].id = i;
 
-               if (to_camss(ispif)->version == CAMSS_8x16) {
+               if (camss->version == CAMSS_8x16) {
                        ispif->line[i].formats = ispif_formats_8x16;
                        ispif->line[i].nformats =
                                        ARRAY_SIZE(ispif_formats_8x16);
-               } else if (to_camss(ispif)->version == CAMSS_8x96 ||
-                          to_camss(ispif)->version == CAMSS_660) {
+               } else if (camss->version == CAMSS_8x96 ||
+                          camss->version == CAMSS_660) {
                        ispif->line[i].formats = ispif_formats_8x96;
                        ispif->line[i].nformats =
                                        ARRAY_SIZE(ispif_formats_8x96);
        ispif->irq = r->start;
        snprintf(ispif->irq_name, sizeof(ispif->irq_name), "%s_%s",
                 dev_name(dev), MSM_ISPIF_NAME);
-       if (to_camss(ispif)->version == CAMSS_8x16)
+       if (camss->version == CAMSS_8x16)
                ret = devm_request_irq(dev, ispif->irq, ispif_isr_8x16,
                               IRQF_TRIGGER_RISING, ispif->irq_name, ispif);
-       else if (to_camss(ispif)->version == CAMSS_8x96 ||
-                to_camss(ispif)->version == CAMSS_660)
+       else if (camss->version == CAMSS_8x96 ||
+                camss->version == CAMSS_660)
                ret = devm_request_irq(dev, ispif->irq, ispif_isr_8x96,
                               IRQF_TRIGGER_RISING, ispif->irq_name, ispif);
        else
                ret = -EINVAL;
+
        if (ret < 0) {
                dev_err(dev, "request_irq failed: %d\n", ret);
                return ret;
 int msm_ispif_register_entities(struct ispif_device *ispif,
                                struct v4l2_device *v4l2_dev)
 {
-       struct device *dev = to_device(ispif);
+       struct camss *camss;
        int ret;
        int i;
 
+       if (!ispif)
+               return 0;
+
+       camss = ispif->camss;
+
        for (i = 0; i < ispif->line_num; i++) {
                struct v4l2_subdev *sd = &ispif->line[i].subdev;
                struct media_pad *pads = ispif->line[i].pads;
 
                ret = ispif_init_formats(sd, NULL);
                if (ret < 0) {
-                       dev_err(dev, "Failed to init format: %d\n", ret);
+                       dev_err(camss->dev, "Failed to init format: %d\n", ret);
                        goto error;
                }
 
                ret = media_entity_pads_init(&sd->entity, MSM_ISPIF_PADS_NUM,
                                             pads);
                if (ret < 0) {
-                       dev_err(dev, "Failed to init media entity: %d\n", ret);
+                       dev_err(camss->dev, "Failed to init media entity: %d\n",
+                               ret);
                        goto error;
                }
 
                ret = v4l2_device_register_subdev(v4l2_dev, sd);
                if (ret < 0) {
-                       dev_err(dev, "Failed to register subdev: %d\n", ret);
+                       dev_err(camss->dev, "Failed to register subdev: %d\n",
+                               ret);
                        media_entity_cleanup(&sd->entity);
                        goto error;
                }
 {
        int i;
 
+       if (!ispif)
+               return;
+
        mutex_destroy(&ispif->power_lock);
        mutex_destroy(&ispif->config_lock);
 
 
                }
        }
 
-       ret = msm_ispif_subdev_init(&camss->ispif, ispif_res);
+       ret = msm_ispif_subdev_init(camss, ispif_res);
        if (ret < 0) {
                dev_err(camss->dev, "Failed to init ispif sub-device: %d\n",
-                       ret);
+               ret);
                return ret;
        }
 
                }
        }
 
-       ret = msm_ispif_register_entities(&camss->ispif, &camss->v4l2_dev);
+       ret = msm_ispif_register_entities(camss->ispif,
+                                         &camss->v4l2_dev);
        if (ret < 0) {
                dev_err(camss->dev, "Failed to register ispif entities: %d\n",
-                       ret);
+               ret);
                goto err_reg_ispif;
        }
 
                }
        }
 
-       for (i = 0; i < camss->csid_num; i++) {
-               for (j = 0; j < camss->ispif.line_num; j++) {
-                       ret = media_create_pad_link(
-                               &camss->csid[i].subdev.entity,
-                               MSM_CSID_PAD_SRC,
-                               &camss->ispif.line[j].subdev.entity,
-                               MSM_ISPIF_PAD_SINK,
-                               0);
-                       if (ret < 0) {
-                               dev_err(camss->dev,
-                                       "Failed to link %s->%s entities: %d\n",
-                                       camss->csid[i].subdev.entity.name,
-                                       camss->ispif.line[j].subdev.entity.name,
-                                       ret);
-                               goto err_link;
-                       }
-               }
-       }
-
-       for (i = 0; i < camss->ispif.line_num; i++)
-               for (k = 0; k < camss->vfe_num; k++)
-                       for (j = 0; j < ARRAY_SIZE(camss->vfe[k].line); j++) {
+       if (camss->ispif) {
+               for (i = 0; i < camss->csid_num; i++) {
+                       for (j = 0; j < camss->ispif->line_num; j++) {
                                ret = media_create_pad_link(
-                                       &camss->ispif.line[i].subdev.entity,
-                                       MSM_ISPIF_PAD_SRC,
-                                       &camss->vfe[k].line[j].subdev.entity,
-                                       MSM_VFE_PAD_SINK,
+                                       &camss->csid[i].subdev.entity,
+                                       MSM_CSID_PAD_SRC,
+                                       &camss->ispif->line[j].subdev.entity,
+                                       MSM_ISPIF_PAD_SINK,
                                        0);
                                if (ret < 0) {
                                        dev_err(camss->dev,
                                                "Failed to link %s->%s entities: %d\n",
-                                               camss->ispif.line[i].subdev.entity.name,
-                                               camss->vfe[k].line[j].subdev.entity.name,
+                                               camss->csid[i].subdev.entity.name,
+                                               camss->ispif->line[j].subdev.entity.name,
                                                ret);
                                        goto err_link;
                                }
                        }
+               }
+
+               for (i = 0; i < camss->ispif->line_num; i++)
+                       for (k = 0; k < camss->vfe_num; k++)
+                               for (j = 0; j < ARRAY_SIZE(camss->vfe[k].line); j++) {
+                                       struct v4l2_subdev *ispif = &camss->ispif->line[i].subdev;
+                                       struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev;
+
+                                       ret = media_create_pad_link(&ispif->entity,
+                                                                   MSM_ISPIF_PAD_SRC,
+                                                                   &vfe->entity,
+                                                                   MSM_VFE_PAD_SINK,
+                                                                   0);
+                                       if (ret < 0) {
+                                               dev_err(camss->dev,
+                                                       "Failed to link %s->%s entities: %d\n",
+                                                       ispif->entity.name,
+                                                       vfe->entity.name,
+                                                       ret);
+                                               goto err_link;
+                                       }
+                               }
+       } else {
+               for (i = 0; i < camss->csid_num; i++)
+                       for (k = 0; k < camss->vfe_num; k++)
+                               for (j = 0; j < ARRAY_SIZE(camss->vfe[k].line); j++) {
+                                       struct v4l2_subdev *csid = &camss->csid[i].subdev;
+                                       struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev;
+
+                                       ret = media_create_pad_link(&csid->entity,
+                                                                   MSM_CSID_PAD_SRC,
+                                                                   &vfe->entity,
+                                                                   MSM_VFE_PAD_SINK,
+                                                                   0);
+                                       if (ret < 0) {
+                                               dev_err(camss->dev,
+                                                       "Failed to link %s->%s entities: %d\n",
+                                                       csid->entity.name,
+                                                       vfe->entity.name,
+                                                       ret);
+                                               goto err_link;
+                                       }
+                               }
+       }
 
        return 0;
 
        for (i--; i >= 0; i--)
                msm_vfe_unregister_entities(&camss->vfe[i]);
 
-       msm_ispif_unregister_entities(&camss->ispif);
 err_reg_ispif:
+       msm_ispif_unregister_entities(camss->ispif);
 
        i = camss->csid_num;
 err_reg_csid:
        for (i = 0; i < camss->csid_num; i++)
                msm_csid_unregister_entity(&camss->csid[i]);
 
-       msm_ispif_unregister_entities(&camss->ispif);
+       msm_ispif_unregister_entities(camss->ispif);
 
        for (i = 0; i < camss->vfe_num; i++)
                msm_vfe_unregister_entities(&camss->vfe[i]);
                goto err_free;
        }
 
+       if (camss->version == CAMSS_8x16 ||
+           camss->version == CAMSS_8x96) {
+               camss->ispif = devm_kcalloc(dev, 1, sizeof(*camss->ispif), GFP_KERNEL);
+               if (!camss->ispif) {
+                       ret = -ENOMEM;
+                       goto err_free;
+               }
+       }
+
        camss->vfe = devm_kcalloc(dev, camss->vfe_num, sizeof(*camss->vfe),
                                  GFP_KERNEL);
        if (!camss->vfe) {