aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlija Hadzic <ihadzic@research.bell-labs.com>2013-10-29 11:09:44 -0400
committerDave Airlie <airlied@redhat.com>2013-11-05 23:27:50 -0500
commit7e99acdcab6b3ea0c0b87445b179c7140ff9a81d (patch)
treef86d9ed4a6760e6ea5179e41b4fdc6121a1e8e17
parentfbce40641b6d8df6171775986d5aa4cce30b4e28 (diff)
drm: fix error recovery path in drm_crtc_helper_set_mode
There is no need to save or restore hwmode field, because by the time this function sets this field, it cannot fail any more. However, we should save old enabled field because if the function fails, we want to return with unchanged CRTC. Signed-off-by: Ilija Hadzic <ihadzic@research.bell-labs.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/drm_crtc_helper.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
index acc9c36614df..0ebaa6d79afa 100644
--- a/drivers/gpu/drm/drm_crtc_helper.c
+++ b/drivers/gpu/drm/drm_crtc_helper.c
@@ -405,22 +405,25 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
405 struct drm_framebuffer *old_fb) 405 struct drm_framebuffer *old_fb)
406{ 406{
407 struct drm_device *dev = crtc->dev; 407 struct drm_device *dev = crtc->dev;
408 struct drm_display_mode *adjusted_mode, saved_mode, saved_hwmode; 408 struct drm_display_mode *adjusted_mode, saved_mode;
409 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 409 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
410 struct drm_encoder_helper_funcs *encoder_funcs; 410 struct drm_encoder_helper_funcs *encoder_funcs;
411 int saved_x, saved_y; 411 int saved_x, saved_y;
412 bool saved_enabled;
412 struct drm_encoder *encoder; 413 struct drm_encoder *encoder;
413 bool ret = true; 414 bool ret = true;
414 415
416 saved_enabled = crtc->enabled;
415 crtc->enabled = drm_helper_crtc_in_use(crtc); 417 crtc->enabled = drm_helper_crtc_in_use(crtc);
416 if (!crtc->enabled) 418 if (!crtc->enabled)
417 return true; 419 return true;
418 420
419 adjusted_mode = drm_mode_duplicate(dev, mode); 421 adjusted_mode = drm_mode_duplicate(dev, mode);
420 if (!adjusted_mode) 422 if (!adjusted_mode) {
423 crtc->enabled = saved_enabled;
421 return false; 424 return false;
425 }
422 426
423 saved_hwmode = crtc->hwmode;
424 saved_mode = crtc->mode; 427 saved_mode = crtc->mode;
425 saved_x = crtc->x; 428 saved_x = crtc->x;
426 saved_y = crtc->y; 429 saved_y = crtc->y;
@@ -539,7 +542,7 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
539done: 542done:
540 drm_mode_destroy(dev, adjusted_mode); 543 drm_mode_destroy(dev, adjusted_mode);
541 if (!ret) { 544 if (!ret) {
542 crtc->hwmode = saved_hwmode; 545 crtc->enabled = saved_enabled;
543 crtc->mode = saved_mode; 546 crtc->mode = saved_mode;
544 crtc->x = saved_x; 547 crtc->x = saved_x;
545 crtc->y = saved_y; 548 crtc->y = saved_y;