diff options
Diffstat (limited to 'drivers/gpu/drm/qxl/qxl_drv.c')
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_drv.c | 26 | 
1 files changed, 19 insertions, 7 deletions
| diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c index 1d601f57a6ba..4fda3f9b29f4 100644 --- a/drivers/gpu/drm/qxl/qxl_drv.c +++ b/drivers/gpu/drm/qxl/qxl_drv.c @@ -34,6 +34,7 @@  #include <linux/pci.h>  #include <drm/drm.h> +#include <drm/drm_atomic_helper.h>  #include <drm/drm_drv.h>  #include <drm/drm_file.h>  #include <drm/drm_modeset_helper.h> @@ -132,21 +133,30 @@ free_dev:  	return ret;  } +static void qxl_drm_release(struct drm_device *dev) +{ +	struct qxl_device *qdev = dev->dev_private; + +	/* +	 * TODO: qxl_device_fini() call should be in qxl_pci_remove(), +	 * reodering qxl_modeset_fini() + qxl_device_fini() calls is +	 * non-trivial though. +	 */ +	qxl_modeset_fini(qdev); +	qxl_device_fini(qdev); +	dev->dev_private = NULL; +	kfree(qdev); +} +  static void  qxl_pci_remove(struct pci_dev *pdev)  {  	struct drm_device *dev = pci_get_drvdata(pdev); -	struct qxl_device *qdev = dev->dev_private;  	drm_dev_unregister(dev); - -	qxl_modeset_fini(qdev); -	qxl_device_fini(qdev); +	drm_atomic_helper_shutdown(dev);  	if (is_vga(pdev))  		vga_put(pdev, VGA_RSRC_LEGACY_IO); - -	dev->dev_private = NULL; -	kfree(qdev);  	drm_dev_put(dev);  } @@ -279,6 +289,8 @@ static struct drm_driver qxl_driver = {  	.major = 0,  	.minor = 1,  	.patchlevel = 0, + +	.release = qxl_drm_release,  };  static int __init qxl_init(void) |