aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/drm_irq.c')
-rw-r--r--drivers/gpu/drm/drm_irq.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index 2022a5c966bb..cb3794a00f98 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -40,6 +40,7 @@
40#include <linux/slab.h> 40#include <linux/slab.h>
41 41
42#include <linux/vgaarb.h> 42#include <linux/vgaarb.h>
43#include <linux/export.h>
43 44
44/* Access macro for slots in vblank timestamp ringbuffer. */ 45/* Access macro for slots in vblank timestamp ringbuffer. */
45#define vblanktimestamp(dev, crtc, count) ( \ 46#define vblanktimestamp(dev, crtc, count) ( \
@@ -291,11 +292,14 @@ static void drm_irq_vgaarb_nokms(void *cookie, bool state)
291 if (!dev->irq_enabled) 292 if (!dev->irq_enabled)
292 return; 293 return;
293 294
294 if (state) 295 if (state) {
295 dev->driver->irq_uninstall(dev); 296 if (dev->driver->irq_uninstall)
296 else { 297 dev->driver->irq_uninstall(dev);
297 dev->driver->irq_preinstall(dev); 298 } else {
298 dev->driver->irq_postinstall(dev); 299 if (dev->driver->irq_preinstall)
300 dev->driver->irq_preinstall(dev);
301 if (dev->driver->irq_postinstall)
302 dev->driver->irq_postinstall(dev);
299 } 303 }
300} 304}
301 305
@@ -338,7 +342,8 @@ int drm_irq_install(struct drm_device *dev)
338 DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev)); 342 DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev));
339 343
340 /* Before installing handler */ 344 /* Before installing handler */
341 dev->driver->irq_preinstall(dev); 345 if (dev->driver->irq_preinstall)
346 dev->driver->irq_preinstall(dev);
342 347
343 /* Install handler */ 348 /* Install handler */
344 if (drm_core_check_feature(dev, DRIVER_IRQ_SHARED)) 349 if (drm_core_check_feature(dev, DRIVER_IRQ_SHARED))
@@ -363,11 +368,16 @@ int drm_irq_install(struct drm_device *dev)
363 vga_client_register(dev->pdev, (void *)dev, drm_irq_vgaarb_nokms, NULL); 368 vga_client_register(dev->pdev, (void *)dev, drm_irq_vgaarb_nokms, NULL);
364 369
365 /* After installing handler */ 370 /* After installing handler */
366 ret = dev->driver->irq_postinstall(dev); 371 if (dev->driver->irq_postinstall)
372 ret = dev->driver->irq_postinstall(dev);
373
367 if (ret < 0) { 374 if (ret < 0) {
368 mutex_lock(&dev->struct_mutex); 375 mutex_lock(&dev->struct_mutex);
369 dev->irq_enabled = 0; 376 dev->irq_enabled = 0;
370 mutex_unlock(&dev->struct_mutex); 377 mutex_unlock(&dev->struct_mutex);
378 if (!drm_core_check_feature(dev, DRIVER_MODESET))
379 vga_client_register(dev->pdev, NULL, NULL, NULL);
380 free_irq(drm_dev_to_irq(dev), dev);
371 } 381 }
372 382
373 return ret; 383 return ret;
@@ -413,7 +423,8 @@ int drm_irq_uninstall(struct drm_device *dev)
413 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 423 if (!drm_core_check_feature(dev, DRIVER_MODESET))
414 vga_client_register(dev->pdev, NULL, NULL, NULL); 424 vga_client_register(dev->pdev, NULL, NULL, NULL);
415 425
416 dev->driver->irq_uninstall(dev); 426 if (dev->driver->irq_uninstall)
427 dev->driver->irq_uninstall(dev);
417 428
418 free_irq(drm_dev_to_irq(dev), dev); 429 free_irq(drm_dev_to_irq(dev), dev);
419 430