diff options
-rw-r--r-- | drivers/gpu/drm/drm_irq.c | 32 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 6 | ||||
-rw-r--r-- | include/drm/drmP.h | 1 |
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) | |||
1226 | EXPORT_SYMBOL(drm_crtc_vblank_off); | 1226 | EXPORT_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 | */ | ||
1238 | void 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 | } | ||
1258 | EXPORT_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); | |||
922 | extern void drm_vblank_off(struct drm_device *dev, int crtc); | 922 | extern void drm_vblank_off(struct drm_device *dev, int crtc); |
923 | extern void drm_vblank_on(struct drm_device *dev, int crtc); | 923 | extern void drm_vblank_on(struct drm_device *dev, int crtc); |
924 | extern void drm_crtc_vblank_off(struct drm_crtc *crtc); | 924 | extern void drm_crtc_vblank_off(struct drm_crtc *crtc); |
925 | extern void drm_crtc_vblank_reset(struct drm_crtc *crtc); | ||
925 | extern void drm_crtc_vblank_on(struct drm_crtc *crtc); | 926 | extern void drm_crtc_vblank_on(struct drm_crtc *crtc); |
926 | extern void drm_vblank_cleanup(struct drm_device *dev); | 927 | extern void drm_vblank_cleanup(struct drm_device *dev); |
927 | 928 | ||