radeon: Disable both CRTCs during mode switch Reconfiguring one CRTC whilst the other is running can cause a hang under some circumstances. Unfortunately we haven't pinpointed exactly what those circumstances are, so disable both CRTCs for every mode switch. Signed-off-by: Pierre Ossman --- diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c index 8d0b7aa..6a7b82f 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c -1042,12 +1052,29 @@ static int radeon_crtc_mode_set(struct drm_crtc *crtc, static void radeon_crtc_prepare(struct drm_crtc *crtc) { - radeon_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); + struct drm_device *dev = crtc->dev; + struct radeon_device *rdev = dev->dev_private; + + /* + * The hardware wedges sometimes if you reconfigure one CRTC + * whilst the other is running (see fdo bug #24611). + */ + radeon_crtc_dpms(&rdev->mode_info.crtcs[0]->base, DRM_MODE_DPMS_OFF); + radeon_crtc_dpms(&rdev->mode_info.crtcs[1]->base, DRM_MODE_DPMS_OFF); } static void radeon_crtc_commit(struct drm_crtc *crtc) { - radeon_crtc_dpms(crtc, DRM_MODE_DPMS_ON); + struct drm_device *dev = crtc->dev; + struct radeon_device *rdev = dev->dev_private; + + /* + * Reenable the CRTCs that should be running. + */ + if (rdev->mode_info.crtcs[0]->base.enabled) + radeon_crtc_dpms(&rdev->mode_info.crtcs[0]->base, DRM_MODE_DPMS_ON); + if (rdev->mode_info.crtcs[1]->base.enabled) + radeon_crtc_dpms(&rdev->mode_info.crtcs[1]->base, DRM_MODE_DPMS_ON); } static const struct drm_crtc_helper_funcs legacy_helper_funcs = {