out:
        i915_params_free(&i915->params);
-       put_device(&i915->drm.pdev->dev);
-       i915->drm.pdev = NULL;
 }
 
 static struct drm_driver mock_driver = {
 #if IS_ENABLED(CONFIG_IOMMU_API) && defined(CONFIG_INTEL_IOMMU)
        struct dev_iommu iommu;
 #endif
-       int err;
 
        pdev = kzalloc(sizeof(*pdev), GFP_KERNEL);
        if (!pdev)
                return NULL;
-       i915 = kzalloc(sizeof(*i915), GFP_KERNEL);
-       if (!i915) {
-               kfree(pdev);
-               return NULL;
-       }
-
        device_initialize(&pdev->dev);
        pdev->class = PCI_BASE_CLASS_DISPLAY << 16;
        pdev->dev.release = release_dev;
        iommu.priv = (void *)-1;
        pdev->dev.iommu = &iommu;
 #endif
+       if (!devres_open_group(&pdev->dev, NULL, GFP_KERNEL)) {
+               put_device(&pdev->dev);
+               return NULL;
+       }
+
+       i915 = devm_drm_dev_alloc(&pdev->dev, &mock_driver,
+                                 struct drm_i915_private, drm);
+       if (IS_ERR(i915)) {
+               pr_err("Failed to allocate mock GEM device: err=%ld\n", PTR_ERR(i915));
+               devres_release_group(&pdev->dev, NULL);
+               put_device(&pdev->dev);
+
+               return NULL;
+       }
 
        pci_set_drvdata(pdev, i915);
+       i915->drm.pdev = pdev;
 
        dev_pm_domain_set(&pdev->dev, &pm_domain);
        pm_runtime_enable(&pdev->dev);
        if (pm_runtime_enabled(&pdev->dev))
                WARN_ON(pm_runtime_get_sync(&pdev->dev));
 
-       err = drm_dev_init(&i915->drm, &mock_driver, &pdev->dev);
-       if (err) {
-               pr_err("Failed to initialise mock GEM device: err=%d\n", err);
-               put_device(&pdev->dev);
-               kfree(i915);
-
-               return NULL;
-       }
-       i915->drm.pdev = pdev;
-       drmm_add_final_kfree(&i915->drm, i915);
 
        i915_params_copy(&i915->params, &i915_modparams);
 
 
 void mock_destroy_device(struct drm_i915_private *i915)
 {
-       drm_dev_put(&i915->drm);
+       struct device *dev = i915->drm.dev;
+
+       devres_release_group(dev, NULL);
+       put_device(dev);
 }