return NULL;
 }
 
-static int intel_plane_atomic_check(struct drm_plane *_plane,
-                                   struct drm_plane_state *_new_plane_state)
+int intel_plane_atomic_check(struct intel_atomic_state *state,
+                            struct intel_plane *plane)
 {
-       struct intel_plane *plane = to_intel_plane(_plane);
-       struct intel_atomic_state *state =
-               to_intel_atomic_state(_new_plane_state->state);
        struct intel_plane_state *new_plane_state =
-               to_intel_plane_state(_new_plane_state);
+               intel_atomic_get_new_plane_state(state, plane);
        const struct intel_plane_state *old_plane_state =
                intel_atomic_get_old_plane_state(state, plane);
        struct intel_crtc *crtc =
 const struct drm_plane_helper_funcs intel_plane_helper_funcs = {
        .prepare_fb = intel_prepare_plane_fb,
        .cleanup_fb = intel_cleanup_plane_fb,
-       .atomic_check = intel_plane_atomic_check,
 };
 
                                        struct intel_crtc_state *crtc_state,
                                        const struct intel_plane_state *old_plane_state,
                                        struct intel_plane_state *intel_state);
+int intel_plane_atomic_check(struct intel_atomic_state *state,
+                            struct intel_plane *plane);
 int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_state,
                                    struct intel_crtc_state *crtc_state,
                                    const struct intel_plane_state *old_plane_state,
 
        return !old_crtc_state->c8_planes != !new_crtc_state->c8_planes;
 }
 
-static int intel_crtc_atomic_check(struct drm_crtc *_crtc,
-                                  struct drm_crtc_state *_crtc_state)
+static int intel_crtc_atomic_check(struct intel_atomic_state *state,
+                                  struct intel_crtc *crtc)
 {
-       struct intel_crtc *crtc = to_intel_crtc(_crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
        struct intel_crtc_state *crtc_state =
-               to_intel_crtc_state(_crtc_state);
-       int ret;
+               intel_atomic_get_new_crtc_state(state, crtc);
        bool mode_changed = needs_modeset(crtc_state);
+       int ret;
 
        if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv) &&
            mode_changed && !crtc_state->base.active)
        return ret;
 }
 
-static const struct drm_crtc_helper_funcs intel_helper_funcs = {
-       .atomic_check = intel_crtc_atomic_check,
-};
-
 static void intel_modeset_update_connector_atomic_state(struct drm_device *dev)
 {
        struct intel_connector *connector;
        new_crtc_state->has_drrs = old_crtc_state->has_drrs;
 }
 
+static int intel_atomic_check_planes(struct intel_atomic_state *state)
+{
+       struct intel_plane_state *plane_state;
+       struct intel_plane *plane;
+       int i, ret;
+
+       for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
+               ret = intel_plane_atomic_check(state, plane);
+               if (ret) {
+                       DRM_DEBUG_ATOMIC("[PLANE:%d:%s] atomic driver check failed\n",
+                                        plane->base.base.id, plane->base.name);
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
+static int intel_atomic_check_crtcs(struct intel_atomic_state *state)
+{
+       struct intel_crtc_state *crtc_state;
+       struct intel_crtc *crtc;
+       int i;
+
+       for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
+               int ret = intel_crtc_atomic_check(state, crtc);
+               if (ret) {
+                       DRM_DEBUG_ATOMIC("[CRTC:%d:%s] atomic driver check failed\n",
+                                        crtc->base.base.id, crtc->base.name);
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
 /**
  * intel_atomic_check - validate state object
  * @dev: drm device
        if (ret)
                goto fail;
 
-       ret = drm_atomic_helper_check_planes(dev, &state->base);
+       ret = intel_atomic_check_planes(state);
+       if (ret)
+               goto fail;
+
+       ret = intel_atomic_check_crtcs(state);
        if (ret)
                goto fail;
 
                dev_priv->plane_to_crtc_mapping[i9xx_plane] = intel_crtc;
        }
 
-       drm_crtc_helper_add(&intel_crtc->base, &intel_helper_funcs);
-
        intel_color_init(intel_crtc);
 
        WARN_ON(drm_crtc_index(&intel_crtc->base) != intel_crtc->pipe);