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 f85aaf21e783..0a6f0b3bdc78 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
@@ -37,6 +37,7 @@ | |||
37 | 37 | ||
38 | #include <linux/interrupt.h> /* For task queue support */ | 38 | #include <linux/interrupt.h> /* For task queue support */ |
39 | 39 | ||
40 | #include <linux/vgaarb.h> | ||
40 | /** | 41 | /** |
41 | * Get interrupt from bus id. | 42 | * Get interrupt from bus id. |
42 | * | 43 | * |
@@ -171,6 +172,26 @@ err: | |||
171 | } | 172 | } |
172 | EXPORT_SYMBOL(drm_vblank_init); | 173 | EXPORT_SYMBOL(drm_vblank_init); |
173 | 174 | ||
175 | static void drm_irq_vgaarb_nokms(void *cookie, bool state) | ||
176 | { | ||
177 | struct drm_device *dev = cookie; | ||
178 | |||
179 | if (dev->driver->vgaarb_irq) { | ||
180 | dev->driver->vgaarb_irq(dev, state); | ||
181 | return; | ||
182 | } | ||
183 | |||
184 | if (!dev->irq_enabled) | ||
185 | return; | ||
186 | |||
187 | if (state) | ||
188 | dev->driver->irq_uninstall(dev); | ||
189 | else { | ||
190 | dev->driver->irq_preinstall(dev); | ||
191 | dev->driver->irq_postinstall(dev); | ||
192 | } | ||
193 | } | ||
194 | |||
174 | /** | 195 | /** |
175 | * Install IRQ handler. | 196 | * Install IRQ handler. |
176 | * | 197 | * |
@@ -231,6 +252,9 @@ int drm_irq_install(struct drm_device *dev) | |||
231 | return ret; | 252 | return ret; |
232 | } | 253 | } |
233 | 254 | ||
255 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
256 | vga_client_register(dev->pdev, (void *)dev, drm_irq_vgaarb_nokms, NULL); | ||
257 | |||
234 | /* After installing handler */ | 258 | /* After installing handler */ |
235 | ret = dev->driver->irq_postinstall(dev); | 259 | ret = dev->driver->irq_postinstall(dev); |
236 | if (ret < 0) { | 260 | if (ret < 0) { |
@@ -279,6 +303,9 @@ int drm_irq_uninstall(struct drm_device * dev) | |||
279 | 303 | ||
280 | DRM_DEBUG("irq=%d\n", dev->pdev->irq); | 304 | DRM_DEBUG("irq=%d\n", dev->pdev->irq); |
281 | 305 | ||
306 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
307 | vga_client_register(dev->pdev, NULL, NULL, NULL); | ||
308 | |||
282 | dev->driver->irq_uninstall(dev); | 309 | dev->driver->irq_uninstall(dev); |
283 | 310 | ||
284 | free_irq(dev->pdev->irq, dev); | 311 | free_irq(dev->pdev->irq, dev); |