if (!res->line_num)
                return -EINVAL;
 
-       if (res->has_pd) {
+       /* Power domain */
+
+       if (res->pd_name) {
+               vfe->genpd = dev_pm_domain_attach_by_name(camss->dev,
+                                                         res->pd_name);
+               if (IS_ERR(vfe->genpd)) {
+                       ret = PTR_ERR(vfe->genpd);
+                       return ret;
+               }
+       }
+
+       if (!vfe->genpd && res->has_pd) {
+               /*
+                * Legacy magic index.
+                * Requires
+                * power-domain = <VFE_X>,
+                *                <VFE_Y>,
+                *                <TITAN_TOP>
+                * id must correspondng to the index of the VFE which must
+                * come before the TOP GDSC. VFE Lite has no individually
+                * collapasible domain which is why id < vfe_num is a valid
+                * check.
+                */
                vfe->genpd = dev_pm_domain_attach_by_id(camss->dev, id);
                if (IS_ERR(vfe->genpd))
                        return PTR_ERR(vfe->genpd);
 
                return 0;
 
        /*
-        * VFE power domains are in the beginning of the list, and while all
-        * power domains should be attached, only if TITAN_TOP power domain is
-        * found in the list, it should be linked over here.
+        * If a power-domain name is defined try to use it.
+        * It is possible we are running a new kernel with an old dtb so
+        * fallback to indexes even if a pd_name is defined but not found.
         */
-       camss->genpd = dev_pm_domain_attach_by_id(camss->dev, camss->genpd_num - 1);
-       if (IS_ERR(camss->genpd)) {
-               ret = PTR_ERR(camss->genpd);
+       if (camss->res->pd_name) {
+               camss->genpd = dev_pm_domain_attach_by_name(camss->dev,
+                                                           camss->res->pd_name);
+               if (IS_ERR(camss->genpd)) {
+                       ret = PTR_ERR(camss->genpd);
+                       goto fail_pm;
+               }
+       }
+
+       if (!camss->genpd) {
+               /*
+                * Legacy magic index. TITAN_TOP GDSC must be the last
+                * item in the power-domain list.
+                */
+               camss->genpd = dev_pm_domain_attach_by_id(camss->dev,
+                                                         camss->genpd_num - 1);
+       }
+       if (IS_ERR_OR_NULL(camss->genpd)) {
+               if (!camss->genpd)
+                       ret = -ENODEV;
+               else
+                       ret = PTR_ERR(camss->genpd);
                goto fail_pm;
        }
        camss->genpd_link = device_link_add(camss->dev, camss->genpd,
 
        u32 clock_rate[CAMSS_RES_MAX][CAMSS_RES_MAX];
        char *reg[CAMSS_RES_MAX];
        char *interrupt[CAMSS_RES_MAX];
+       char *pd_name;
        u8 line_num;
        bool has_pd;
        const void *ops;
 
 struct camss_resources {
        enum camss_version version;
+       const char *pd_name;
        const struct camss_subdev_resources *csiphy_res;
        const struct camss_subdev_resources *csid_res;
        const struct camss_subdev_resources *ispif_res;