struct device *pd_dev = NULL;
        int ret, i, num_pds = 0;
        bool by_id = true;
+       size_t size;
        u32 pd_flags = data ? data->pd_flags : 0;
        u32 link_flags = pd_flags & PD_FLAG_NO_DEV_LINK ? 0 :
                        DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME;
        if (num_pds <= 0)
                return 0;
 
-       pds = devm_kzalloc(dev, sizeof(*pds), GFP_KERNEL);
+       pds = kzalloc(sizeof(*pds), GFP_KERNEL);
        if (!pds)
                return -ENOMEM;
 
-       pds->pd_devs = devm_kcalloc(dev, num_pds, sizeof(*pds->pd_devs),
-                                   GFP_KERNEL);
-       if (!pds->pd_devs)
-               return -ENOMEM;
-
-       pds->pd_links = devm_kcalloc(dev, num_pds, sizeof(*pds->pd_links),
-                                    GFP_KERNEL);
-       if (!pds->pd_links)
-               return -ENOMEM;
+       size = sizeof(*pds->pd_devs) + sizeof(*pds->pd_links);
+       pds->pd_devs = kcalloc(num_pds, size, GFP_KERNEL);
+       if (!pds->pd_devs) {
+               ret = -ENOMEM;
+               goto free_pds;
+       }
+       pds->pd_links = (void *)(pds->pd_devs + num_pds);
 
        if (link_flags && pd_flags & PD_FLAG_DEV_LINK_ON)
                link_flags |= DL_FLAG_RPM_ACTIVE;
                        device_link_del(pds->pd_links[i]);
                dev_pm_domain_detach(pds->pd_devs[i], true);
        }
+       kfree(pds->pd_devs);
+free_pds:
+       kfree(pds);
        return ret;
 }
 EXPORT_SYMBOL_GPL(dev_pm_domain_attach_list);
                        device_link_del(list->pd_links[i]);
                dev_pm_domain_detach(list->pd_devs[i], true);
        }
+
+       kfree(list->pd_devs);
+       kfree(list);
 }
 EXPORT_SYMBOL_GPL(dev_pm_domain_detach_list);