diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2009-11-05 00:51:11 -0500 |
---|---|---|
committer | Alex Deucher <alexdeucher@gmail.com> | 2009-11-05 00:51:11 -0500 |
commit | 873897c54429e230a23011a9dd2f1069f4eb7752 (patch) | |
tree | 81410aebf8d7bd846af02c20b99551b7fd2ebc5b /src/atombios_output.c | |
parent | 3028374488cc0f34942ac372c8d05cf15898a613 (diff) |
DCE3+: call transmitter init on mode set
Generally this is done at post, but might not always
be done with softboot or for connectors on docking
stations.
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
Diffstat (limited to 'src/atombios_output.c')
-rw-r--r-- | src/atombios_output.c | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/src/atombios_output.c b/src/atombios_output.c index 4db5d0c9..d85c3f6a 100644 --- a/src/atombios_output.c +++ b/src/atombios_output.c @@ -646,15 +646,19 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, int action) disp_data.v1.ucAction = action; if (IS_DCE32_VARIANT) { - if (radeon_output->MonType == MT_DP) { - disp_data.v2.usPixelClock = - cpu_to_le16(dp_link_clock_for_mode_clock(clock)); - disp_data.v2.acConfig.fDPConnector = 1; - } else if (clock > 165000) { - disp_data.v2.usPixelClock = cpu_to_le16((clock / 2) / 10); - disp_data.v2.acConfig.fDualLinkConnector = 1; + if (action == ATOM_TRANSMITTER_ACTION_INIT) { + disp_data.v2.usInitInfo = radeon_output->connector_object_id; } else { - disp_data.v2.usPixelClock = cpu_to_le16(clock / 10); + if (radeon_output->MonType == MT_DP) { + disp_data.v2.usPixelClock = + cpu_to_le16(dp_link_clock_for_mode_clock(clock)); + disp_data.v2.acConfig.fDPConnector = 1; + } else if (clock > 165000) { + disp_data.v2.usPixelClock = cpu_to_le16((clock / 2) / 10); + disp_data.v2.acConfig.fDualLinkConnector = 1; + } else { + disp_data.v2.usPixelClock = cpu_to_le16(clock / 10); + } } if (dig_block) disp_data.v2.acConfig.ucEncoderSel = 1; @@ -684,13 +688,17 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, int action) } else { disp_data.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL; - if (radeon_output->MonType == MT_DP) - disp_data.v1.usPixelClock = - cpu_to_le16(dp_link_clock_for_mode_clock(clock)); - else if (clock > 165000) - disp_data.v1.usPixelClock = cpu_to_le16((clock / 2) / 10); - else - disp_data.v1.usPixelClock = cpu_to_le16(clock / 10); + if (action == ATOM_TRANSMITTER_ACTION_INIT) { + disp_data.v1.usInitInfo = radeon_output->connector_object_id; + } else { + if (radeon_output->MonType == MT_DP) + disp_data.v1.usPixelClock = + cpu_to_le16(dp_link_clock_for_mode_clock(clock)); + else if (clock > 165000) + disp_data.v1.usPixelClock = cpu_to_le16((clock / 2) / 10); + else + disp_data.v1.usPixelClock = cpu_to_le16(clock / 10); + } switch (radeon_encoder->encoder_id) { case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: @@ -1488,7 +1496,7 @@ atombios_output_mode_set(xf86OutputPtr output, radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output); RADEONInfoPtr info = RADEONPTR(output->scrn); if (radeon_encoder == NULL) - return; + return; radeon_output->pixel_clock = adjusted_mode->Clock; radeon_output->dig_block = radeon_crtc->crtc_id; @@ -1520,6 +1528,7 @@ atombios_output_mode_set(xf86OutputPtr output, /* setup and enable the encoder and transmitter */ atombios_output_dig_encoder_setup(output, ATOM_ENABLE); + atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_INIT); atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_SETUP); atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_ENABLE); break; |