diff options
Diffstat (limited to 'drivers/gpu/drm/drm_crtc_helper.c')
| -rw-r--r-- | drivers/gpu/drm/drm_crtc_helper.c | 13 | 
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c index 2957636161e..3969f7553fe 100644 --- a/drivers/gpu/drm/drm_crtc_helper.c +++ b/drivers/gpu/drm/drm_crtc_helper.c @@ -484,6 +484,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)  	struct drm_connector *save_connectors, *connector;  	int count = 0, ro, fail = 0;  	struct drm_crtc_helper_funcs *crtc_funcs; +	struct drm_mode_set save_set;  	int ret = 0;  	int i; @@ -556,6 +557,12 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)  		save_connectors[count++] = *connector;  	} +	save_set.crtc = set->crtc; +	save_set.mode = &set->crtc->mode; +	save_set.x = set->crtc->x; +	save_set.y = set->crtc->y; +	save_set.fb = set->crtc->fb; +  	/* We should be able to check here if the fb has the same properties  	 * and then just flip_or_move it */  	if (set->crtc->fb != set->fb) { @@ -721,6 +728,12 @@ fail:  		*connector = save_connectors[count++];  	} +	/* Try to restore the config */ +	if (mode_changed && +	    !drm_crtc_helper_set_mode(save_set.crtc, save_set.mode, save_set.x, +				      save_set.y, save_set.fb)) +		DRM_ERROR("failed to restore config after modeset failure\n"); +  	kfree(save_connectors);  	kfree(save_encoders);  	kfree(save_crtcs);  |