diff options
| author | Alex Deucher <alexander.deucher@amd.com> | 2012-01-20 15:01:30 -0500 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2012-01-24 12:35:51 -0500 |
| commit | 3a47824d85eeca122895646f027dc63480994199 (patch) | |
| tree | 90e5c901b4426bd8194a1b91c404de02f357236c | |
| parent | 386d4d751e8e0b4b693bb724f09aae064ee5297d (diff) | |
drm/radeon/kms: rework modeset sequence for DCE41 and DCE5
dig transmitter control table only has ENABLE/DISABLE actions
on DCE4.1/DCE5.
Fixes:
https://bugs.freedesktop.org/show_bug.cgi?id=44955
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
Signed-off-by: Dave Airlie <airlied@redhat.com>
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_encoders.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index a3a9166f1ecb..79a4880e8800 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
| @@ -1341,7 +1341,8 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
| 1341 | switch (mode) { | 1341 | switch (mode) { |
| 1342 | case DRM_MODE_DPMS_ON: | 1342 | case DRM_MODE_DPMS_ON: |
| 1343 | /* some early dce3.2 boards have a bug in their transmitter control table */ | 1343 | /* some early dce3.2 boards have a bug in their transmitter control table */ |
| 1344 | if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730)) | 1344 | if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730) || |
| 1345 | ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) | ||
| 1345 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); | 1346 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); |
| 1346 | else | 1347 | else |
| 1347 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | 1348 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); |
| @@ -1351,8 +1352,6 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
| 1351 | ATOM_TRANSMITTER_ACTION_POWER_ON); | 1352 | ATOM_TRANSMITTER_ACTION_POWER_ON); |
| 1352 | radeon_dig_connector->edp_on = true; | 1353 | radeon_dig_connector->edp_on = true; |
| 1353 | } | 1354 | } |
| 1354 | if (ASIC_IS_DCE4(rdev)) | ||
| 1355 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); | ||
| 1356 | radeon_dp_link_train(encoder, connector); | 1355 | radeon_dp_link_train(encoder, connector); |
| 1357 | if (ASIC_IS_DCE4(rdev)) | 1356 | if (ASIC_IS_DCE4(rdev)) |
| 1358 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0); | 1357 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0); |
| @@ -1363,7 +1362,10 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
| 1363 | case DRM_MODE_DPMS_STANDBY: | 1362 | case DRM_MODE_DPMS_STANDBY: |
| 1364 | case DRM_MODE_DPMS_SUSPEND: | 1363 | case DRM_MODE_DPMS_SUSPEND: |
| 1365 | case DRM_MODE_DPMS_OFF: | 1364 | case DRM_MODE_DPMS_OFF: |
| 1366 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0); | 1365 | if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) |
| 1366 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); | ||
| 1367 | else | ||
| 1368 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0); | ||
| 1367 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { | 1369 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { |
| 1368 | if (ASIC_IS_DCE4(rdev)) | 1370 | if (ASIC_IS_DCE4(rdev)) |
| 1369 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); | 1371 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); |
| @@ -1810,7 +1812,7 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
| 1810 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: | 1812 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: |
| 1811 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: | 1813 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: |
| 1812 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: | 1814 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
| 1813 | if (ASIC_IS_DCE4(rdev)) { | 1815 | if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { |
| 1814 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | 1816 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
| 1815 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 1817 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 1816 | 1818 | ||
| @@ -1819,13 +1821,16 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
| 1819 | else | 1821 | else |
| 1820 | dig->panel_mode = radeon_dp_get_panel_mode(encoder, connector); | 1822 | dig->panel_mode = radeon_dp_get_panel_mode(encoder, connector); |
| 1821 | 1823 | ||
| 1822 | /* disable the transmitter */ | ||
| 1823 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); | ||
| 1824 | /* setup and enable the encoder */ | 1824 | /* setup and enable the encoder */ |
| 1825 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); | 1825 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); |
| 1826 | atombios_dig_encoder_setup(encoder, | 1826 | atombios_dig_encoder_setup(encoder, |
| 1827 | ATOM_ENCODER_CMD_SETUP_PANEL_MODE, | 1827 | ATOM_ENCODER_CMD_SETUP_PANEL_MODE, |
| 1828 | dig->panel_mode); | 1828 | dig->panel_mode); |
| 1829 | } else if (ASIC_IS_DCE4(rdev)) { | ||
| 1830 | /* disable the transmitter */ | ||
| 1831 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); | ||
| 1832 | /* setup and enable the encoder */ | ||
| 1833 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); | ||
| 1829 | 1834 | ||
| 1830 | /* enable the transmitter */ | 1835 | /* enable the transmitter */ |
| 1831 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); | 1836 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); |
