aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2015-01-28 18:09:24 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-01-29 06:50:03 -0500
commiteb2ed66fe56f30c6ea841ac11681a2f51049b221 (patch)
treeda1a79716c856c224be5813b07f6dbe5138e4d36 /drivers/gpu
parentb7703726251191cd9f3ef3a80b2d9667901eec95 (diff)
drm/irq: Don't disable vblank interrupts when already disabled
The .enable_vblank() operation is only called when vblank interrupts are disabled, but no similar check exists when disabling vblank interrupts. This leads to .disable_vblank() being called with vblank interrupts already disabled and the device possibly runtime suspended. As the operation is called with a spinlock held drivers can't runtime resume the device there and thus must avoid touching device registers in that case, requiring vblank refcounting. As the DRM core tracks whether vblank interrupts are enabled just skip the .disable_vblank() call when the interrupts are already disabled. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Michel Dänzer <michel.daenzer@amd.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/drm_irq.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index 75647e7f012b..10574a0c3a55 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -185,8 +185,15 @@ static void vblank_disable_and_save(struct drm_device *dev, int crtc)
185 return; 185 return;
186 } 186 }
187 187
188 dev->driver->disable_vblank(dev, crtc); 188 /*
189 vblank->enabled = false; 189 * Only disable vblank interrupts if they're enabled. This avoids
190 * calling the ->disable_vblank() operation in atomic context with the
191 * hardware potentially runtime suspended.
192 */
193 if (vblank->enabled) {
194 dev->driver->disable_vblank(dev, crtc);
195 vblank->enabled = false;
196 }
190 197
191 /* No further vblank irq's will be processed after 198 /* No further vblank irq's will be processed after
192 * this point. Get current hardware vblank count and 199 * this point. Get current hardware vblank count and