Merge branch '3.2-without-smb2' of git://git.samba.org/sfrench/cifs-2.6
[pandora-kernel.git] / drivers / gpu / drm / i915 / i915_irq.c
index 944d712..9ee2729 100644 (file)
@@ -383,6 +383,7 @@ static void gen6_pm_rps_work(struct work_struct *work)
        pm_iir = dev_priv->pm_iir;
        dev_priv->pm_iir = 0;
        pm_imr = I915_READ(GEN6_PMIMR);
+       I915_WRITE(GEN6_PMIMR, 0);
        spin_unlock_irq(&dev_priv->rps_lock);
 
        if (!pm_iir)
@@ -420,7 +421,6 @@ static void gen6_pm_rps_work(struct work_struct *work)
         * an *extremely* unlikely race with gen6_rps_enable() that is prevented
         * by holding struct_mutex for the duration of the write.
         */
-       I915_WRITE(GEN6_PMIMR, pm_imr & ~pm_iir);
        mutex_unlock(&dev_priv->dev->struct_mutex);
 }
 
@@ -536,8 +536,9 @@ static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS)
                unsigned long flags;
                spin_lock_irqsave(&dev_priv->rps_lock, flags);
                WARN(dev_priv->pm_iir & pm_iir, "Missed a PM interrupt\n");
-               I915_WRITE(GEN6_PMIMR, pm_iir);
                dev_priv->pm_iir |= pm_iir;
+               I915_WRITE(GEN6_PMIMR, dev_priv->pm_iir);
+               POSTING_READ(GEN6_PMIMR);
                spin_unlock_irqrestore(&dev_priv->rps_lock, flags);
                queue_work(dev_priv->wq, &dev_priv->rps_work);
        }
@@ -649,8 +650,9 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS)
                unsigned long flags;
                spin_lock_irqsave(&dev_priv->rps_lock, flags);
                WARN(dev_priv->pm_iir & pm_iir, "Missed a PM interrupt\n");
-               I915_WRITE(GEN6_PMIMR, pm_iir);
                dev_priv->pm_iir |= pm_iir;
+               I915_WRITE(GEN6_PMIMR, dev_priv->pm_iir);
+               POSTING_READ(GEN6_PMIMR);
                spin_unlock_irqrestore(&dev_priv->rps_lock, flags);
                queue_work(dev_priv->wq, &dev_priv->rps_work);
        }