static void ironlake_enable_drps(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       u32 rgvmodectl = I915_READ(MEMMODECTL);
+       u32 rgvmodectl;
        u8 fmax, fmin, fstart, vstart;
 
        spin_lock_irq(&mchdev_lock);
 
+       rgvmodectl = I915_READ(MEMMODECTL);
+
        /* Enable temp reporting */
        I915_WRITE16(PMMISC, I915_READ(PMMISC) | MCPPCE_EN);
        I915_WRITE16(TSC1, I915_READ(TSC1) | TSE);
                return;
 
        if (IS_IRONLAKE_M(dev)) {
-               mutex_lock(&dev->struct_mutex);
                ironlake_enable_drps(dev);
+               mutex_lock(&dev->struct_mutex);
                intel_init_emon(dev);
                mutex_unlock(&dev->struct_mutex);
        } else if (INTEL_INFO(dev)->gen >= 6) {