diff options
| author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2016-12-14 05:41:24 -0500 |
|---|---|---|
| committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2016-12-19 04:25:05 -0500 |
| commit | e57e17cc40d3297fbb279c6c0e9613bdc81ef893 (patch) | |
| tree | a5173ccd8a251f85f80d2e652fd22e1c1691c7ef /drivers/gpu | |
| parent | d501b12999eb9cdfc488127fabaf794171dd9bbf (diff) | |
drm: Move vblank cleanup from unregister to release
Calling drm_vblank_cleanup() in drm_dev_unregister() causes issues with
drivers that have moved away from the .load() and .unload() midlayer.
Those drivers call drm_dev_unregister() as the first operation at unbind
time, before shutting down the device. This results in warnings due to
drm_vblank_cleanup() being called with vblank interrupts still active,
and then to vblank events being sent after cleanup.
Fix the problem by moving vblank cleanup from drm_dev_unregister() to
drm_dev_release() that is guaranteed to be called after drivers shut
down the device.
Suggested-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Lucas Stach <l.stach@pengutronix.de>
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/drm_drv.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index a525751b4559..a899daf54ac3 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c | |||
| @@ -595,6 +595,8 @@ static void drm_dev_release(struct kref *ref) | |||
| 595 | { | 595 | { |
| 596 | struct drm_device *dev = container_of(ref, struct drm_device, ref); | 596 | struct drm_device *dev = container_of(ref, struct drm_device, ref); |
| 597 | 597 | ||
| 598 | drm_vblank_cleanup(dev); | ||
| 599 | |||
| 598 | if (drm_core_check_feature(dev, DRIVER_GEM)) | 600 | if (drm_core_check_feature(dev, DRIVER_GEM)) |
| 599 | drm_gem_destroy(dev); | 601 | drm_gem_destroy(dev); |
| 600 | 602 | ||
| @@ -794,8 +796,6 @@ void drm_dev_unregister(struct drm_device *dev) | |||
| 794 | if (dev->agp) | 796 | if (dev->agp) |
| 795 | drm_pci_agp_destroy(dev); | 797 | drm_pci_agp_destroy(dev); |
| 796 | 798 | ||
| 797 | drm_vblank_cleanup(dev); | ||
| 798 | |||
| 799 | list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) | 799 | list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) |
| 800 | drm_legacy_rmmap(dev, r_list->map); | 800 | drm_legacy_rmmap(dev, r_list->map); |
| 801 | 801 | ||
