Merge drm/drm-next into drm-intel-next-queued
[linux-block.git] / drivers / gpu / drm / i915 / i915_drv.c
index da991d1967a2a96d545b13bb17e0cd97d21fd969..67102dc26fcec17180eb34095242c71b5ec5210f 100644 (file)
@@ -43,6 +43,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_ioctl.h>
 #include <drm/drm_irq.h>
+#include <drm/drm_managed.h>
 #include <drm/drm_probe_helper.h>
 
 #include "display/intel_acpi.h"
@@ -907,17 +908,11 @@ i915_driver_create(struct pci_dev *pdev, const struct pci_device_id *ent)
                (struct intel_device_info *)ent->driver_data;
        struct intel_device_info *device_info;
        struct drm_i915_private *i915;
-       int err;
 
-       i915 = kzalloc(sizeof(*i915), GFP_KERNEL);
-       if (!i915)
-               return ERR_PTR(-ENOMEM);
-
-       err = drm_dev_init(&i915->drm, &driver, &pdev->dev);
-       if (err) {
-               kfree(i915);
-               return ERR_PTR(err);
-       }
+       i915 = devm_drm_dev_alloc(&pdev->dev, &driver,
+                                 struct drm_i915_private, drm);
+       if (IS_ERR(i915))
+               return i915;
 
        i915->drm.pdev = pdev;
        pci_set_drvdata(pdev, i915);
@@ -935,17 +930,6 @@ i915_driver_create(struct pci_dev *pdev, const struct pci_device_id *ent)
        return i915;
 }
 
-static void i915_driver_destroy(struct drm_i915_private *i915)
-{
-       struct pci_dev *pdev = i915->drm.pdev;
-
-       drm_dev_fini(&i915->drm);
-       kfree(i915);
-
-       /* And make sure we never chase our dangling pointer from pci_dev */
-       pci_set_drvdata(pdev, NULL);
-}
-
 /**
  * i915_driver_probe - setup chip and create an initial config
  * @pdev: PCI device
@@ -1027,6 +1011,8 @@ int i915_driver_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        i915_welcome_messages(i915);
 
+       i915->do_release = true;
+
        return 0;
 
 out_cleanup_irq:
@@ -1046,7 +1032,6 @@ out_pci_disable:
        pci_disable_device(pdev);
 out_fini:
        i915_probe_error(i915, "Device initialization failed (%d)\n", ret);
-       i915_driver_destroy(i915);
        return ret;
 }
 
@@ -1086,6 +1071,9 @@ static void i915_driver_release(struct drm_device *dev)
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_runtime_pm *rpm = &dev_priv->runtime_pm;
 
+       if (!dev_priv->do_release)
+               return;
+
        disable_rpm_wakeref_asserts(rpm);
 
        i915_gem_driver_release(dev_priv);
@@ -1099,7 +1087,6 @@ static void i915_driver_release(struct drm_device *dev)
        intel_runtime_pm_driver_release(rpm);
 
        i915_driver_late_release(dev_priv);
-       i915_driver_destroy(dev_priv);
 }
 
 static int i915_driver_open(struct drm_device *dev, struct drm_file *file)