diff options
Diffstat (limited to 'drivers/gpu/drm/drm_irq.c')
-rw-r--r-- | drivers/gpu/drm/drm_irq.c | 27 |
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 | ||