diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_legacy_crtc.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_legacy_encoders.c | 7 |
2 files changed, 18 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c index 5677a424b58..6857cb4efb7 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c | |||
| @@ -295,6 +295,7 @@ static void radeon_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 295 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | 295 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); |
| 296 | struct drm_device *dev = crtc->dev; | 296 | struct drm_device *dev = crtc->dev; |
| 297 | struct radeon_device *rdev = dev->dev_private; | 297 | struct radeon_device *rdev = dev->dev_private; |
| 298 | uint32_t crtc_ext_cntl = 0; | ||
| 298 | uint32_t mask; | 299 | uint32_t mask; |
| 299 | 300 | ||
| 300 | if (radeon_crtc->crtc_id) | 301 | if (radeon_crtc->crtc_id) |
| @@ -307,6 +308,16 @@ static void radeon_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 307 | RADEON_CRTC_VSYNC_DIS | | 308 | RADEON_CRTC_VSYNC_DIS | |
| 308 | RADEON_CRTC_HSYNC_DIS); | 309 | RADEON_CRTC_HSYNC_DIS); |
| 309 | 310 | ||
| 311 | /* | ||
| 312 | * On all dual CRTC GPUs this bit controls the CRTC of the primary DAC. | ||
| 313 | * Therefore it is set in the DAC DMPS function. | ||
| 314 | * This is different for GPU's with a single CRTC but a primary and a | ||
| 315 | * TV DAC: here it controls the single CRTC no matter where it is | ||
| 316 | * routed. Therefore we set it here. | ||
| 317 | */ | ||
| 318 | if (rdev->flags & RADEON_SINGLE_CRTC) | ||
| 319 | crtc_ext_cntl = RADEON_CRTC_CRT_ON; | ||
| 320 | |||
| 310 | switch (mode) { | 321 | switch (mode) { |
| 311 | case DRM_MODE_DPMS_ON: | 322 | case DRM_MODE_DPMS_ON: |
| 312 | radeon_crtc->enabled = true; | 323 | radeon_crtc->enabled = true; |
| @@ -317,7 +328,7 @@ static void radeon_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 317 | else { | 328 | else { |
| 318 | WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_EN, ~(RADEON_CRTC_EN | | 329 | WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_EN, ~(RADEON_CRTC_EN | |
| 319 | RADEON_CRTC_DISP_REQ_EN_B)); | 330 | RADEON_CRTC_DISP_REQ_EN_B)); |
| 320 | WREG32_P(RADEON_CRTC_EXT_CNTL, 0, ~mask); | 331 | WREG32_P(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl, ~(mask | crtc_ext_cntl)); |
| 321 | } | 332 | } |
| 322 | drm_vblank_post_modeset(dev, radeon_crtc->crtc_id); | 333 | drm_vblank_post_modeset(dev, radeon_crtc->crtc_id); |
| 323 | radeon_crtc_load_lut(crtc); | 334 | radeon_crtc_load_lut(crtc); |
| @@ -331,7 +342,7 @@ static void radeon_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 331 | else { | 342 | else { |
| 332 | WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_DISP_REQ_EN_B, ~(RADEON_CRTC_EN | | 343 | WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_DISP_REQ_EN_B, ~(RADEON_CRTC_EN | |
| 333 | RADEON_CRTC_DISP_REQ_EN_B)); | 344 | RADEON_CRTC_DISP_REQ_EN_B)); |
| 334 | WREG32_P(RADEON_CRTC_EXT_CNTL, mask, ~mask); | 345 | WREG32_P(RADEON_CRTC_EXT_CNTL, mask, ~(mask | crtc_ext_cntl)); |
| 335 | } | 346 | } |
| 336 | radeon_crtc->enabled = false; | 347 | radeon_crtc->enabled = false; |
| 337 | /* adjust pm to dpms changes AFTER disabling crtcs */ | 348 | /* adjust pm to dpms changes AFTER disabling crtcs */ |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c index 3afed70306d..817392fc2d0 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | |||
| @@ -537,7 +537,9 @@ static void radeon_legacy_primary_dac_dpms(struct drm_encoder *encoder, int mode | |||
| 537 | break; | 537 | break; |
| 538 | } | 538 | } |
| 539 | 539 | ||
| 540 | WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl); | 540 | /* handled in radeon_crtc_dpms() */ |
| 541 | if (!(rdev->flags & RADEON_SINGLE_CRTC)) | ||
| 542 | WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl); | ||
| 541 | WREG32(RADEON_DAC_CNTL, dac_cntl); | 543 | WREG32(RADEON_DAC_CNTL, dac_cntl); |
| 542 | WREG32(RADEON_DAC_MACRO_CNTL, dac_macro_cntl); | 544 | WREG32(RADEON_DAC_MACRO_CNTL, dac_macro_cntl); |
| 543 | 545 | ||
| @@ -1095,7 +1097,8 @@ static void radeon_legacy_tv_dac_dpms(struct drm_encoder *encoder, int mode) | |||
| 1095 | } else { | 1097 | } else { |
| 1096 | if (is_tv) | 1098 | if (is_tv) |
| 1097 | WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl); | 1099 | WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl); |
| 1098 | else | 1100 | /* handled in radeon_crtc_dpms() */ |
| 1101 | else if (!(rdev->flags & RADEON_SINGLE_CRTC)) | ||
| 1099 | WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); | 1102 | WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); |
| 1100 | WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl); | 1103 | WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl); |
| 1101 | } | 1104 | } |
