aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/drm_pci.c2
-rw-r--r--drivers/gpu/drm/drm_platform.c2
-rw-r--r--drivers/gpu/drm/drm_stub.c35
-rw-r--r--drivers/gpu/drm/drm_usb.c2
4 files changed, 28 insertions, 13 deletions
diff --git a/drivers/gpu/drm/drm_pci.c b/drivers/gpu/drm/drm_pci.c
index 743589dc47ce..cabe2bd702ae 100644
--- a/drivers/gpu/drm/drm_pci.c
+++ b/drivers/gpu/drm/drm_pci.c
@@ -354,7 +354,7 @@ int drm_get_pci_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
354err_pci: 354err_pci:
355 pci_disable_device(pdev); 355 pci_disable_device(pdev);
356err_free: 356err_free:
357 kfree(dev); 357 drm_dev_free(dev);
358 return ret; 358 return ret;
359} 359}
360EXPORT_SYMBOL(drm_get_pci_dev); 360EXPORT_SYMBOL(drm_get_pci_dev);
diff --git a/drivers/gpu/drm/drm_platform.c b/drivers/gpu/drm/drm_platform.c
index a0f91f85651f..fc24fee8ec83 100644
--- a/drivers/gpu/drm/drm_platform.c
+++ b/drivers/gpu/drm/drm_platform.c
@@ -64,7 +64,7 @@ static int drm_get_platform_dev(struct platform_device *platdev,
64 return 0; 64 return 0;
65 65
66err_free: 66err_free:
67 kfree(dev); 67 drm_dev_free(dev);
68 return ret; 68 return ret;
69} 69}
70 70
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
index 432994aafc3b..3b5b07482de8 100644
--- a/drivers/gpu/drm/drm_stub.c
+++ b/drivers/gpu/drm/drm_stub.c
@@ -363,7 +363,6 @@ static void drm_unplug_minor(struct drm_minor *minor)
363 */ 363 */
364void drm_put_dev(struct drm_device *dev) 364void drm_put_dev(struct drm_device *dev)
365{ 365{
366 struct drm_driver *driver;
367 struct drm_map_list *r_list, *list_temp; 366 struct drm_map_list *r_list, *list_temp;
368 367
369 DRM_DEBUG("\n"); 368 DRM_DEBUG("\n");
@@ -372,7 +371,6 @@ void drm_put_dev(struct drm_device *dev)
372 DRM_ERROR("cleanup called no dev\n"); 371 DRM_ERROR("cleanup called no dev\n");
373 return; 372 return;
374 } 373 }
375 driver = dev->driver;
376 374
377 drm_lastclose(dev); 375 drm_lastclose(dev);
378 376
@@ -386,9 +384,6 @@ void drm_put_dev(struct drm_device *dev)
386 384
387 list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) 385 list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head)
388 drm_rmmap(dev, r_list->map); 386 drm_rmmap(dev, r_list->map);
389 drm_ht_remove(&dev->map_hash);
390
391 drm_ctxbitmap_cleanup(dev);
392 387
393 if (drm_core_check_feature(dev, DRIVER_MODESET)) 388 if (drm_core_check_feature(dev, DRIVER_MODESET))
394 drm_put_minor(&dev->control); 389 drm_put_minor(&dev->control);
@@ -396,14 +391,11 @@ void drm_put_dev(struct drm_device *dev)
396 if (dev->render) 391 if (dev->render)
397 drm_put_minor(&dev->render); 392 drm_put_minor(&dev->render);
398 393
399 if (driver->driver_features & DRIVER_GEM)
400 drm_gem_destroy(dev);
401
402 drm_put_minor(&dev->primary); 394 drm_put_minor(&dev->primary);
403 395
404 list_del(&dev->driver_item); 396 list_del(&dev->driver_item);
405 kfree(dev->devname); 397
406 kfree(dev); 398 drm_dev_free(dev);
407} 399}
408EXPORT_SYMBOL(drm_put_dev); 400EXPORT_SYMBOL(drm_put_dev);
409 401
@@ -502,6 +494,29 @@ err_free:
502EXPORT_SYMBOL(drm_dev_alloc); 494EXPORT_SYMBOL(drm_dev_alloc);
503 495
504/** 496/**
497 * drm_dev_free - Free DRM device
498 * @dev: DRM device to free
499 *
500 * Free a DRM device that has previously been allocated via drm_dev_alloc().
501 * You must not use kfree() instead or you will leak memory.
502 *
503 * This must not be called once the device got registered. Use drm_put_dev()
504 * instead, which then calls drm_dev_free().
505 */
506void drm_dev_free(struct drm_device *dev)
507{
508 if (dev->driver->driver_features & DRIVER_GEM)
509 drm_gem_destroy(dev);
510
511 drm_ctxbitmap_cleanup(dev);
512 drm_ht_remove(&dev->map_hash);
513
514 kfree(dev->devname);
515 kfree(dev);
516}
517EXPORT_SYMBOL(drm_dev_free);
518
519/**
505 * drm_dev_register - Register DRM device 520 * drm_dev_register - Register DRM device
506 * @dev: Device to register 521 * @dev: Device to register
507 * 522 *
diff --git a/drivers/gpu/drm/drm_usb.c b/drivers/gpu/drm/drm_usb.c
index 5ef353f77b5a..b179b70e7853 100644
--- a/drivers/gpu/drm/drm_usb.c
+++ b/drivers/gpu/drm/drm_usb.c
@@ -29,7 +29,7 @@ int drm_get_usb_dev(struct usb_interface *interface,
29 return 0; 29 return 0;
30 30
31err_free: 31err_free:
32 kfree(dev); 32 drm_dev_free(dev);
33 return ret; 33 return ret;
34 34
35} 35}