|
@@ -7916,9 +7916,9 @@ intel_modeset_check_state(struct drm_device *dev)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-int intel_set_mode(struct drm_crtc *crtc,
|
|
|
- struct drm_display_mode *mode,
|
|
|
- int x, int y, struct drm_framebuffer *fb)
|
|
|
+static int __intel_set_mode(struct drm_crtc *crtc,
|
|
|
+ struct drm_display_mode *mode,
|
|
|
+ int x, int y, struct drm_framebuffer *fb)
|
|
|
{
|
|
|
struct drm_device *dev = crtc->dev;
|
|
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
|
@@ -8012,8 +8012,6 @@ done:
|
|
|
if (ret && crtc->enabled) {
|
|
|
crtc->hwmode = *saved_hwmode;
|
|
|
crtc->mode = *saved_mode;
|
|
|
- } else {
|
|
|
- intel_modeset_check_state(dev);
|
|
|
}
|
|
|
|
|
|
out:
|
|
@@ -8022,6 +8020,20 @@ out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+int intel_set_mode(struct drm_crtc *crtc,
|
|
|
+ struct drm_display_mode *mode,
|
|
|
+ int x, int y, struct drm_framebuffer *fb)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = __intel_set_mode(crtc, mode, x, y, fb);
|
|
|
+
|
|
|
+ if (ret == 0)
|
|
|
+ intel_modeset_check_state(crtc->dev);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
void intel_crtc_restore_mode(struct drm_crtc *crtc)
|
|
|
{
|
|
|
intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y, crtc->fb);
|
|
@@ -9333,10 +9345,16 @@ setup_pipes:
|
|
|
}
|
|
|
|
|
|
if (force_restore) {
|
|
|
+ /*
|
|
|
+ * We need to use raw interfaces for restoring state to avoid
|
|
|
+ * checking (bogus) intermediate states.
|
|
|
+ */
|
|
|
for_each_pipe(pipe) {
|
|
|
struct drm_crtc *crtc =
|
|
|
dev_priv->pipe_to_crtc_mapping[pipe];
|
|
|
- intel_crtc_restore_mode(crtc);
|
|
|
+
|
|
|
+ __intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y,
|
|
|
+ crtc->fb);
|
|
|
}
|
|
|
list_for_each_entry(plane, &dev->mode_config.plane_list, head)
|
|
|
intel_plane_restore(plane);
|