return ret;
        }
 
+       ret = mutex_lock_interruptible(&dev->struct_mutex);
+       if (ret)
+               return ret;
+
        ret = drm_atomic_helper_prepare_planes(dev, state);
 
+       mutex_unlock(&dev->struct_mutex);
        return ret;
 }
 
        /* FIXME: add subpixel order */
 
        drm_atomic_helper_wait_for_vblanks(dev, state);
+
+       mutex_lock(&dev->struct_mutex);
        drm_atomic_helper_cleanup_planes(dev, state);
+       mutex_unlock(&dev->struct_mutex);
 
        if (any_ms)
                intel_modeset_check_state(dev, state);
  * bits.  Some older platforms need special physical address handling for
  * cursor planes.
  *
+ * Must be called with struct_mutex held.
+ *
  * Returns 0 on success, negative error code on failure.
  */
 int
        if (!obj && !old_obj)
                return 0;
 
-       ret = i915_mutex_lock_interruptible(dev);
-       if (ret)
-               return ret;
-
        if (old_obj) {
                struct drm_crtc_state *crtc_state =
                        drm_atomic_get_existing_crtc_state(new_state->state, plane->state->crtc);
 
                /* Swallow -EIO errors to allow updates during hw lockup. */
                if (ret && ret != -EIO)
-                       goto out;
+                       return ret;
        }
 
        if (!obj) {
        if (ret == 0)
                i915_gem_track_fb(old_obj, obj, intel_plane->frontbuffer_bit);
 
-out:
-       mutex_unlock(&dev->struct_mutex);
-
        return ret;
 }
 
  * @fb: old framebuffer that was on plane
  *
  * Cleans up a framebuffer that has just been removed from a plane.
+ *
+ * Must be called with struct_mutex held.
  */
 void
 intel_cleanup_plane_fb(struct drm_plane *plane,
        if (!obj && !old_obj)
                return;
 
-       mutex_lock(&dev->struct_mutex);
        if (old_obj && (plane->type != DRM_PLANE_TYPE_CURSOR ||
            !INTEL_INFO(dev)->cursor_needs_physical))
                intel_unpin_fb_obj(old_state->fb, old_state);
        if ((old_obj && (old_obj->frontbuffer_bits & intel_plane->frontbuffer_bit)) ||
            (obj && !(obj->frontbuffer_bits & intel_plane->frontbuffer_bit)))
                i915_gem_track_fb(old_obj, obj, intel_plane->frontbuffer_bit);
-       mutex_unlock(&dev->struct_mutex);
 }
 
 int