aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 1dddd2f4f929..5dd7fc582e6f 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1355,6 +1355,17 @@ i915_driver_create(struct pci_dev *pdev, const struct pci_device_id *ent)
1355 return i915; 1355 return i915;
1356} 1356}
1357 1357
1358static void i915_driver_destroy(struct drm_i915_private *i915)
1359{
1360 struct pci_dev *pdev = i915->drm.pdev;
1361
1362 drm_dev_fini(&i915->drm);
1363 kfree(i915);
1364
1365 /* And make sure we never chase our dangling pointer from pci_dev */
1366 pci_set_drvdata(pdev, NULL);
1367}
1368
1358/** 1369/**
1359 * i915_driver_load - setup chip and create an initial config 1370 * i915_driver_load - setup chip and create an initial config
1360 * @pdev: PCI device 1371 * @pdev: PCI device
@@ -1436,9 +1447,7 @@ out_pci_disable:
1436 pci_disable_device(pdev); 1447 pci_disable_device(pdev);
1437out_fini: 1448out_fini:
1438 i915_load_error(dev_priv, "Device initialization failed (%d)\n", ret); 1449 i915_load_error(dev_priv, "Device initialization failed (%d)\n", ret);
1439 drm_dev_fini(&dev_priv->drm); 1450 i915_driver_destroy(dev_priv);
1440 kfree(dev_priv);
1441 pci_set_drvdata(pdev, NULL);
1442 return ret; 1451 return ret;
1443} 1452}
1444 1453
@@ -1489,9 +1498,7 @@ static void i915_driver_release(struct drm_device *dev)
1489 struct drm_i915_private *dev_priv = to_i915(dev); 1498 struct drm_i915_private *dev_priv = to_i915(dev);
1490 1499
1491 i915_driver_cleanup_early(dev_priv); 1500 i915_driver_cleanup_early(dev_priv);
1492 drm_dev_fini(&dev_priv->drm); 1501 i915_driver_destroy(dev_priv);
1493
1494 kfree(dev_priv);
1495} 1502}
1496 1503
1497static int i915_driver_open(struct drm_device *dev, struct drm_file *file) 1504static int i915_driver_open(struct drm_device *dev, struct drm_file *file)