|
@@ -1216,6 +1216,9 @@ atombios_set_encoder_crtc_source(struct drm_encoder *encoder)
|
|
}
|
|
}
|
|
|
|
|
|
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
|
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
|
|
|
+
|
|
|
|
+ /* update scratch regs with new routing */
|
|
|
|
+ radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
static void
|
|
@@ -1326,19 +1329,9 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
|
|
struct drm_device *dev = encoder->dev;
|
|
struct drm_device *dev = encoder->dev;
|
|
struct radeon_device *rdev = dev->dev_private;
|
|
struct radeon_device *rdev = dev->dev_private;
|
|
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
|
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
|
- struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
|
|
|
|
|
|
|
|
- if (radeon_encoder->active_device &
|
|
|
|
- (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) {
|
|
|
|
- struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
|
|
|
|
- if (dig)
|
|
|
|
- dig->dig_encoder = radeon_atom_pick_dig_encoder(encoder);
|
|
|
|
- }
|
|
|
|
radeon_encoder->pixel_clock = adjusted_mode->clock;
|
|
radeon_encoder->pixel_clock = adjusted_mode->clock;
|
|
|
|
|
|
- radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
|
|
|
|
- atombios_set_encoder_crtc_source(encoder);
|
|
|
|
-
|
|
|
|
if (ASIC_IS_AVIVO(rdev)) {
|
|
if (ASIC_IS_AVIVO(rdev)) {
|
|
if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT | ATOM_DEVICE_TV_SUPPORT))
|
|
if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT | ATOM_DEVICE_TV_SUPPORT))
|
|
atombios_yuv_setup(encoder, true);
|
|
atombios_yuv_setup(encoder, true);
|
|
@@ -1492,8 +1485,20 @@ radeon_atom_dac_detect(struct drm_encoder *encoder, struct drm_connector *connec
|
|
|
|
|
|
static void radeon_atom_encoder_prepare(struct drm_encoder *encoder)
|
|
static void radeon_atom_encoder_prepare(struct drm_encoder *encoder)
|
|
{
|
|
{
|
|
|
|
+ struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
|
|
|
+
|
|
|
|
+ if (radeon_encoder->active_device &
|
|
|
|
+ (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) {
|
|
|
|
+ struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
|
|
|
|
+ if (dig)
|
|
|
|
+ dig->dig_encoder = radeon_atom_pick_dig_encoder(encoder);
|
|
|
|
+ }
|
|
|
|
+
|
|
radeon_atom_output_lock(encoder, true);
|
|
radeon_atom_output_lock(encoder, true);
|
|
radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
|
|
radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
|
|
|
|
+
|
|
|
|
+ /* this is needed for the pll/ss setup to work correctly in some cases */
|
|
|
|
+ atombios_set_encoder_crtc_source(encoder);
|
|
}
|
|
}
|
|
|
|
|
|
static void radeon_atom_encoder_commit(struct drm_encoder *encoder)
|
|
static void radeon_atom_encoder_commit(struct drm_encoder *encoder)
|