Merge remote branch 'anholt/drm-intel-next' into drm-linus
[sfrench/cifs-2.6.git] / drivers / gpu / drm / i915 / i915_irq.c
index a1345d78e13889070623ef7b727ec9cff98897b4..85f4c5de97e2d438d3c05bd942ff0deb481e64eb 100644 (file)
@@ -273,10 +273,15 @@ irqreturn_t ironlake_irq_handler(struct drm_device *dev)
 {
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
        int ret = IRQ_NONE;
-       u32 de_iir, gt_iir, pch_iir;
+       u32 de_iir, gt_iir, de_ier, pch_iir;
        u32 new_de_iir, new_gt_iir, new_pch_iir;
        struct drm_i915_master_private *master_priv;
 
+       /* disable master interrupt before clearing iir  */
+       de_ier = I915_READ(DEIER);
+       I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL);
+       (void)I915_READ(DEIER);
+
        de_iir = I915_READ(DEIIR);
        gt_iir = I915_READ(GTIIR);
        pch_iir = I915_READ(SDEIIR);
@@ -324,6 +329,9 @@ irqreturn_t ironlake_irq_handler(struct drm_device *dev)
                pch_iir = new_pch_iir;
        }
 
+       I915_WRITE(DEIER, de_ier);
+       (void)I915_READ(DEIER);
+
        return ret;
 }