aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/drm_irq.c32
-rw-r--r--drivers/gpu/drm/i915/intel_display.c6
-rw-r--r--include/drm/drmP.h1
3 files changed, 36 insertions, 3 deletions
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index 75647e7f012b..e78a1f5cad9c 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -1226,6 +1226,38 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
1226EXPORT_SYMBOL(drm_crtc_vblank_off); 1226EXPORT_SYMBOL(drm_crtc_vblank_off);
1227 1227
1228/** 1228/**
1229 * drm_crtc_vblank_reset - reset vblank state to off on a CRTC
1230 * @crtc: CRTC in question
1231 *
1232 * Drivers can use this function to reset the vblank state to off at load time.
1233 * Drivers should use this together with the drm_crtc_vblank_off() and
1234 * drm_crtc_vblank_on() functions. The difference compared to
1235 * drm_crtc_vblank_off() is that this function doesn't save the vblank counter
1236 * and hence doesn't need to call any driver hooks.
1237 */
1238void drm_crtc_vblank_reset(struct drm_crtc *drm_crtc)
1239{
1240 struct drm_device *dev = drm_crtc->dev;
1241 unsigned long irqflags;
1242 int crtc = drm_crtc_index(drm_crtc);
1243 struct drm_vblank_crtc *vblank = &dev->vblank[crtc];
1244
1245 spin_lock_irqsave(&dev->vbl_lock, irqflags);
1246 /*
1247 * Prevent subsequent drm_vblank_get() from enabling the vblank
1248 * interrupt by bumping the refcount.
1249 */
1250 if (!vblank->inmodeset) {
1251 atomic_inc(&vblank->refcount);
1252 vblank->inmodeset = 1;
1253 }
1254 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
1255
1256 WARN_ON(!list_empty(&dev->vblank_event_list));
1257}
1258EXPORT_SYMBOL(drm_crtc_vblank_reset);
1259
1260/**
1229 * drm_vblank_on - enable vblank events on a CRTC 1261 * drm_vblank_on - enable vblank events on a CRTC
1230 * @dev: DRM device 1262 * @dev: DRM device
1231 * @crtc: CRTC in question 1263 * @crtc: CRTC in question
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 3b0fe9f1f3c9..b901b00a8f2e 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -13316,11 +13316,11 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
13316 I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK); 13316 I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK);
13317 13317
13318 /* restore vblank interrupts to correct state */ 13318 /* restore vblank interrupts to correct state */
13319 drm_crtc_vblank_reset(&crtc->base);
13319 if (crtc->active) { 13320 if (crtc->active) {
13320 update_scanline_offset(crtc); 13321 update_scanline_offset(crtc);
13321 drm_vblank_on(dev, crtc->pipe); 13322 drm_crtc_vblank_on(&crtc->base);
13322 } else 13323 }
13323 drm_vblank_off(dev, crtc->pipe);
13324 13324
13325 /* We need to sanitize the plane -> pipe mapping first because this will 13325 /* We need to sanitize the plane -> pipe mapping first because this will
13326 * disable the crtc (and hence change the state) if it is wrong. Note 13326 * disable the crtc (and hence change the state) if it is wrong. Note
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index e928625a9da0..54c6ea1e5866 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -922,6 +922,7 @@ extern void drm_crtc_wait_one_vblank(struct drm_crtc *crtc);
922extern void drm_vblank_off(struct drm_device *dev, int crtc); 922extern void drm_vblank_off(struct drm_device *dev, int crtc);
923extern void drm_vblank_on(struct drm_device *dev, int crtc); 923extern void drm_vblank_on(struct drm_device *dev, int crtc);
924extern void drm_crtc_vblank_off(struct drm_crtc *crtc); 924extern void drm_crtc_vblank_off(struct drm_crtc *crtc);
925extern void drm_crtc_vblank_reset(struct drm_crtc *crtc);
925extern void drm_crtc_vblank_on(struct drm_crtc *crtc); 926extern void drm_crtc_vblank_on(struct drm_crtc *crtc);
926extern void drm_vblank_cleanup(struct drm_device *dev); 927extern void drm_vblank_cleanup(struct drm_device *dev);
927 928