diff options
Diffstat (limited to 'drivers/gpu/drm/drm_irq.c')
| -rw-r--r-- | drivers/gpu/drm/drm_irq.c | 27 | 
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index f85aaf21e78..0a6f0b3bdc7 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c @@ -37,6 +37,7 @@  #include <linux/interrupt.h>	/* For task queue support */ +#include <linux/vgaarb.h>  /**   * Get interrupt from bus id.   * @@ -171,6 +172,26 @@ err:  }  EXPORT_SYMBOL(drm_vblank_init); +static void drm_irq_vgaarb_nokms(void *cookie, bool state) +{ +	struct drm_device *dev = cookie; + +	if (dev->driver->vgaarb_irq) { +		dev->driver->vgaarb_irq(dev, state); +		return; +	} + +	if (!dev->irq_enabled) +		return; + +	if (state) +		dev->driver->irq_uninstall(dev); +	else { +		dev->driver->irq_preinstall(dev); +		dev->driver->irq_postinstall(dev); +	} +} +  /**   * Install IRQ handler.   * @@ -231,6 +252,9 @@ int drm_irq_install(struct drm_device *dev)  		return ret;  	} +	if (!drm_core_check_feature(dev, DRIVER_MODESET)) +		vga_client_register(dev->pdev, (void *)dev, drm_irq_vgaarb_nokms, NULL); +  	/* After installing handler */  	ret = dev->driver->irq_postinstall(dev);  	if (ret < 0) { @@ -279,6 +303,9 @@ int drm_irq_uninstall(struct drm_device * dev)  	DRM_DEBUG("irq=%d\n", dev->pdev->irq); +	if (!drm_core_check_feature(dev, DRIVER_MODESET)) +		vga_client_register(dev->pdev, NULL, NULL, NULL); +  	dev->driver->irq_uninstall(dev);  	free_irq(dev->pdev->irq, dev);  | 
