diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/atombios_crtc.c')
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index a87990b3ae84..03dd6c41dc19 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include <drm/drmP.h> | 26 | #include <drm/drmP.h> |
27 | #include <drm/drm_crtc_helper.h> | 27 | #include <drm/drm_crtc_helper.h> |
28 | #include <drm/radeon_drm.h> | 28 | #include <drm/radeon_drm.h> |
29 | #include "radeon_fixed.h" | 29 | #include <drm/drm_fixed.h> |
30 | #include "radeon.h" | 30 | #include "radeon.h" |
31 | #include "atom.h" | 31 | #include "atom.h" |
32 | #include "atom-bits.h" | 32 | #include "atom-bits.h" |
@@ -245,25 +245,27 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
245 | 245 | ||
246 | switch (mode) { | 246 | switch (mode) { |
247 | case DRM_MODE_DPMS_ON: | 247 | case DRM_MODE_DPMS_ON: |
248 | radeon_crtc->enabled = true; | ||
249 | /* adjust pm to dpms changes BEFORE enabling crtcs */ | ||
250 | radeon_pm_compute_clocks(rdev); | ||
248 | atombios_enable_crtc(crtc, ATOM_ENABLE); | 251 | atombios_enable_crtc(crtc, ATOM_ENABLE); |
249 | if (ASIC_IS_DCE3(rdev)) | 252 | if (ASIC_IS_DCE3(rdev)) |
250 | atombios_enable_crtc_memreq(crtc, ATOM_ENABLE); | 253 | atombios_enable_crtc_memreq(crtc, ATOM_ENABLE); |
251 | atombios_blank_crtc(crtc, ATOM_DISABLE); | 254 | atombios_blank_crtc(crtc, ATOM_DISABLE); |
252 | /* XXX re-enable when interrupt support is added */ | 255 | drm_vblank_post_modeset(dev, radeon_crtc->crtc_id); |
253 | if (!ASIC_IS_DCE4(rdev)) | ||
254 | drm_vblank_post_modeset(dev, radeon_crtc->crtc_id); | ||
255 | radeon_crtc_load_lut(crtc); | 256 | radeon_crtc_load_lut(crtc); |
256 | break; | 257 | break; |
257 | case DRM_MODE_DPMS_STANDBY: | 258 | case DRM_MODE_DPMS_STANDBY: |
258 | case DRM_MODE_DPMS_SUSPEND: | 259 | case DRM_MODE_DPMS_SUSPEND: |
259 | case DRM_MODE_DPMS_OFF: | 260 | case DRM_MODE_DPMS_OFF: |
260 | /* XXX re-enable when interrupt support is added */ | 261 | drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id); |
261 | if (!ASIC_IS_DCE4(rdev)) | ||
262 | drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id); | ||
263 | atombios_blank_crtc(crtc, ATOM_ENABLE); | 262 | atombios_blank_crtc(crtc, ATOM_ENABLE); |
264 | if (ASIC_IS_DCE3(rdev)) | 263 | if (ASIC_IS_DCE3(rdev)) |
265 | atombios_enable_crtc_memreq(crtc, ATOM_DISABLE); | 264 | atombios_enable_crtc_memreq(crtc, ATOM_DISABLE); |
266 | atombios_enable_crtc(crtc, ATOM_DISABLE); | 265 | atombios_enable_crtc(crtc, ATOM_DISABLE); |
266 | radeon_crtc->enabled = false; | ||
267 | /* adjust pm to dpms changes AFTER disabling crtcs */ | ||
268 | radeon_pm_compute_clocks(rdev); | ||
267 | break; | 269 | break; |
268 | } | 270 | } |
269 | } | 271 | } |
@@ -1160,6 +1162,12 @@ static bool atombios_crtc_mode_fixup(struct drm_crtc *crtc, | |||
1160 | struct drm_display_mode *mode, | 1162 | struct drm_display_mode *mode, |
1161 | struct drm_display_mode *adjusted_mode) | 1163 | struct drm_display_mode *adjusted_mode) |
1162 | { | 1164 | { |
1165 | struct drm_device *dev = crtc->dev; | ||
1166 | struct radeon_device *rdev = dev->dev_private; | ||
1167 | |||
1168 | /* adjust pm to upcoming mode change */ | ||
1169 | radeon_pm_compute_clocks(rdev); | ||
1170 | |||
1163 | if (!radeon_crtc_scaling_mode_fixup(crtc, mode, adjusted_mode)) | 1171 | if (!radeon_crtc_scaling_mode_fixup(crtc, mode, adjusted_mode)) |
1164 | return false; | 1172 | return false; |
1165 | return true; | 1173 | return true; |