return ret;
}
+/* Code that should eventually be part of atomic_check() */
+static int __intel_set_mode_checks(struct drm_atomic_state *state)
+{
+ struct drm_device *dev = state->dev;
+ int ret;
+
+ /*
+ * See if the config requires any additional preparation, e.g.
+ * to adjust global state with pipes off. We need to do this
+ * here so we can get the modeset_pipe updated config for the new
+ * mode set on this crtc. For other crtcs we need to use the
+ * adjusted_mode bits in the crtc directly.
+ */
+ if (IS_VALLEYVIEW(dev) || IS_BROXTON(dev)) {
+ ret = valleyview_modeset_global_pipes(state);
+ if (ret)
+ return ret;
+ }
+
+ ret = __intel_set_mode_setup_plls(state);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
static int __intel_set_mode(struct drm_crtc *modeset_crtc,
struct drm_display_mode *mode,
int x, int y, struct drm_framebuffer *fb,
int ret = 0;
int i;
+ ret = __intel_set_mode_checks(state);
+ if (ret < 0)
+ return ret;
+
crtc_state_copy = kmalloc(sizeof(*crtc_state_copy), GFP_KERNEL);
if (!crtc_state_copy) {
ret = -ENOMEM;
goto done;
}
- /*
- * See if the config requires any additional preparation, e.g.
- * to adjust global state with pipes off. We need to do this
- * here so we can get the modeset_pipe updated config for the new
- * mode set on this crtc. For other crtcs we need to use the
- * adjusted_mode bits in the crtc directly.
- */
- if (IS_VALLEYVIEW(dev) || IS_BROXTON(dev)) {
- ret = valleyview_modeset_global_pipes(state);
- if (ret)
- goto done;
- }
-
- ret = __intel_set_mode_setup_plls(state);
- if (ret)
- goto done;
-
for_each_crtc_in_state(state, crtc, crtc_state, i) {
if (!needs_modeset(crtc_state))
continue;