#include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/of_graph.h>
 #include <linux/pm_runtime.h>
 #include <linux/pm_domain.h>
  */
 static int camss_init_subdevices(struct camss *camss)
 {
-       const struct camss_subdev_resources *csiphy_res;
-       const struct camss_subdev_resources *csid_res;
-       const struct camss_subdev_resources *ispif_res;
-       const struct camss_subdev_resources *vfe_res;
+       const struct camss_resources *res = camss->res;
        unsigned int i;
        int ret;
 
-       if (camss->version == CAMSS_8x16) {
-               csiphy_res = csiphy_res_8x16;
-               csid_res = csid_res_8x16;
-               ispif_res = &ispif_res_8x16;
-               vfe_res = vfe_res_8x16;
-       } else if (camss->version == CAMSS_8x96) {
-               csiphy_res = csiphy_res_8x96;
-               csid_res = csid_res_8x96;
-               ispif_res = &ispif_res_8x96;
-               vfe_res = vfe_res_8x96;
-       } else if (camss->version == CAMSS_660) {
-               csiphy_res = csiphy_res_660;
-               csid_res = csid_res_660;
-               ispif_res = &ispif_res_660;
-               vfe_res = vfe_res_660;
-       }  else if (camss->version == CAMSS_845) {
-               csiphy_res = csiphy_res_845;
-               csid_res = csid_res_845;
-               /* Titan VFEs don't have an ISPIF  */
-               ispif_res = NULL;
-               vfe_res = vfe_res_845;
-       } else if (camss->version == CAMSS_8250) {
-               csiphy_res = csiphy_res_8250;
-               csid_res = csid_res_8250;
-               /* Titan VFEs don't have an ISPIF  */
-               ispif_res = NULL;
-               vfe_res = vfe_res_8250;
-       } else {
-               return -EINVAL;
-       }
-
        for (i = 0; i < camss->csiphy_num; i++) {
                ret = msm_csiphy_subdev_init(camss, &camss->csiphy[i],
-                                            &csiphy_res[i], i);
+                                            &res->csiphy_res[i], i);
                if (ret < 0) {
                        dev_err(camss->dev,
                                "Failed to init csiphy%d sub-device: %d\n",
        /* note: SM8250 requires VFE to be initialized before CSID */
        for (i = 0; i < camss->vfe_num + camss->vfe_lite_num; i++) {
                ret = msm_vfe_subdev_init(camss, &camss->vfe[i],
-                                         &vfe_res[i], i);
+                                         &res->vfe_res[i], i);
                if (ret < 0) {
                        dev_err(camss->dev,
                                "Fail to init vfe%d sub-device: %d\n", i, ret);
 
        for (i = 0; i < camss->csid_num; i++) {
                ret = msm_csid_subdev_init(camss, &camss->csid[i],
-                                          &csid_res[i], i);
+                                          &res->csid_res[i], i);
                if (ret < 0) {
                        dev_err(camss->dev,
                                "Failed to init csid%d sub-device: %d\n",
                }
        }
 
-       ret = msm_ispif_subdev_init(camss, ispif_res);
+       ret = msm_ispif_subdev_init(camss, res->ispif_res);
        if (ret < 0) {
                dev_err(camss->dev, "Failed to init ispif sub-device: %d\n",
                ret);
        if (!camss)
                return -ENOMEM;
 
+       camss->res = of_device_get_match_data(dev);
+
        atomic_set(&camss->ref_count, 0);
        camss->dev = dev;
        platform_set_drvdata(pdev, camss);
        camss_genpd_cleanup(camss);
 }
 
+static const struct camss_resources msm8916_resources = {
+       .csiphy_res = csiphy_res_8x16,
+       .csid_res = csid_res_8x16,
+       .ispif_res = &ispif_res_8x16,
+       .vfe_res = vfe_res_8x16,
+};
+
+static const struct camss_resources msm8996_resources = {
+       .csiphy_res = csiphy_res_8x96,
+       .csid_res = csid_res_8x96,
+       .ispif_res = &ispif_res_8x96,
+       .vfe_res = vfe_res_8x96,
+};
+
+static const struct camss_resources sdm660_resources = {
+       .csiphy_res = csiphy_res_660,
+       .csid_res = csid_res_660,
+       .ispif_res = &ispif_res_660,
+       .vfe_res = vfe_res_660,
+};
+
+static const struct camss_resources sdm845_resources = {
+       .csiphy_res = csiphy_res_845,
+       .csid_res = csid_res_845,
+       .vfe_res = vfe_res_845,
+};
+
+static const struct camss_resources sm8250_resources = {
+       .csiphy_res = csiphy_res_8250,
+       .csid_res = csid_res_8250,
+       .vfe_res = vfe_res_8250,
+};
+
 static const struct of_device_id camss_dt_match[] = {
-       { .compatible = "qcom,msm8916-camss" },
-       { .compatible = "qcom,msm8996-camss" },
-       { .compatible = "qcom,sdm660-camss" },
-       { .compatible = "qcom,sdm845-camss" },
-       { .compatible = "qcom,sm8250-camss" },
+       { .compatible = "qcom,msm8916-camss", .data = &msm8916_resources },
+       { .compatible = "qcom,msm8996-camss", .data = &msm8996_resources },
+       { .compatible = "qcom,sdm660-camss", .data = &sdm660_resources },
+       { .compatible = "qcom,sdm845-camss", .data = &sdm845_resources },
+       { .compatible = "qcom,sm8250-camss", .data = &sm8250_resources },
        { }
 };