diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_encoders.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_encoders.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index b4f23ec93201..0d1d908e5225 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
@@ -438,6 +438,7 @@ atombios_digital_setup(struct drm_encoder *encoder, int action) | |||
438 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 438 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
439 | union lvds_encoder_control args; | 439 | union lvds_encoder_control args; |
440 | int index = 0; | 440 | int index = 0; |
441 | int hdmi_detected = 0; | ||
441 | uint8_t frev, crev; | 442 | uint8_t frev, crev; |
442 | struct radeon_encoder_atom_dig *dig; | 443 | struct radeon_encoder_atom_dig *dig; |
443 | struct drm_connector *connector; | 444 | struct drm_connector *connector; |
@@ -458,6 +459,9 @@ atombios_digital_setup(struct drm_encoder *encoder, int action) | |||
458 | if (!radeon_connector->con_priv) | 459 | if (!radeon_connector->con_priv) |
459 | return; | 460 | return; |
460 | 461 | ||
462 | if (drm_detect_hdmi_monitor(radeon_connector->edid)) | ||
463 | hdmi_detected = 1; | ||
464 | |||
461 | dig_connector = radeon_connector->con_priv; | 465 | dig_connector = radeon_connector->con_priv; |
462 | 466 | ||
463 | memset(&args, 0, sizeof(args)); | 467 | memset(&args, 0, sizeof(args)); |
@@ -487,7 +491,7 @@ atombios_digital_setup(struct drm_encoder *encoder, int action) | |||
487 | case 1: | 491 | case 1: |
488 | args.v1.ucMisc = 0; | 492 | args.v1.ucMisc = 0; |
489 | args.v1.ucAction = action; | 493 | args.v1.ucAction = action; |
490 | if (drm_detect_hdmi_monitor(radeon_connector->edid)) | 494 | if (hdmi_detected) |
491 | args.v1.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE; | 495 | args.v1.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE; |
492 | args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); | 496 | args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); |
493 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { | 497 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { |
@@ -512,7 +516,7 @@ atombios_digital_setup(struct drm_encoder *encoder, int action) | |||
512 | if (dig->coherent_mode) | 516 | if (dig->coherent_mode) |
513 | args.v2.ucMisc |= PANEL_ENCODER_MISC_COHERENT; | 517 | args.v2.ucMisc |= PANEL_ENCODER_MISC_COHERENT; |
514 | } | 518 | } |
515 | if (drm_detect_hdmi_monitor(radeon_connector->edid)) | 519 | if (hdmi_detected) |
516 | args.v2.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE; | 520 | args.v2.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE; |
517 | args.v2.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); | 521 | args.v2.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); |
518 | args.v2.ucTruncate = 0; | 522 | args.v2.ucTruncate = 0; |
@@ -552,7 +556,7 @@ atombios_digital_setup(struct drm_encoder *encoder, int action) | |||
552 | } | 556 | } |
553 | 557 | ||
554 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 558 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); |
555 | 559 | r600_hdmi_enable(encoder, hdmi_detected); | |
556 | } | 560 | } |
557 | 561 | ||
558 | int | 562 | int |
@@ -893,7 +897,6 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
893 | } | 897 | } |
894 | 898 | ||
895 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 899 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); |
896 | |||
897 | } | 900 | } |
898 | 901 | ||
899 | static void | 902 | static void |
@@ -1162,7 +1165,6 @@ atombios_set_encoder_crtc_source(struct drm_encoder *encoder) | |||
1162 | } | 1165 | } |
1163 | 1166 | ||
1164 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 1167 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); |
1165 | |||
1166 | } | 1168 | } |
1167 | 1169 | ||
1168 | static void | 1170 | static void |
@@ -1265,6 +1267,8 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
1265 | break; | 1267 | break; |
1266 | } | 1268 | } |
1267 | atombios_apply_encoder_quirks(encoder, adjusted_mode); | 1269 | atombios_apply_encoder_quirks(encoder, adjusted_mode); |
1270 | |||
1271 | r600_hdmi_setmode(encoder, adjusted_mode); | ||
1268 | } | 1272 | } |
1269 | 1273 | ||
1270 | static bool | 1274 | static bool |
@@ -1510,4 +1514,6 @@ radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t su | |||
1510 | drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs); | 1514 | drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs); |
1511 | break; | 1515 | break; |
1512 | } | 1516 | } |
1517 | |||
1518 | r600_hdmi_init(encoder); | ||
1513 | } | 1519 | } |