diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2015-07-24 00:42:02 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-07-29 15:50:28 -0400 |
commit | 7726e72b3d6879ee5fc743a230eb6f5afa12844b (patch) | |
tree | c5259947d187da3ee38126b1ac7330e19287caa4 /drivers/gpu | |
parent | d0ea397e22f9ad0113c1dbdaab14eded050472eb (diff) |
drm/radeon: rework audio modeset to handle non-audio hdmi features
Need to setup the deep color and avi packets regardless of
audio setup.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_encoders.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_audio.c | 65 |
2 files changed, 40 insertions, 28 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index dd39f434b4a7..c3872598b85a 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
@@ -2299,8 +2299,7 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
2299 | encoder_mode = atombios_get_encoder_mode(encoder); | 2299 | encoder_mode = atombios_get_encoder_mode(encoder); |
2300 | if (connector && (radeon_audio != 0) && | 2300 | if (connector && (radeon_audio != 0) && |
2301 | ((encoder_mode == ATOM_ENCODER_MODE_HDMI) || | 2301 | ((encoder_mode == ATOM_ENCODER_MODE_HDMI) || |
2302 | (ENCODER_MODE_IS_DP(encoder_mode) && | 2302 | ENCODER_MODE_IS_DP(encoder_mode))) |
2303 | drm_detect_monitor_audio(radeon_connector_edid(connector))))) | ||
2304 | radeon_audio_mode_set(encoder, adjusted_mode); | 2303 | radeon_audio_mode_set(encoder, adjusted_mode); |
2305 | } | 2304 | } |
2306 | 2305 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_audio.c b/drivers/gpu/drm/radeon/radeon_audio.c index 59b3d3221294..fbc8d88d6e5d 100644 --- a/drivers/gpu/drm/radeon/radeon_audio.c +++ b/drivers/gpu/drm/radeon/radeon_audio.c | |||
@@ -696,26 +696,37 @@ static void radeon_audio_hdmi_mode_set(struct drm_encoder *encoder, | |||
696 | { | 696 | { |
697 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 697 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
698 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 698 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
699 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | ||
699 | 700 | ||
700 | if (!dig || !dig->afmt) | 701 | if (!dig || !dig->afmt) |
701 | return; | 702 | return; |
702 | 703 | ||
703 | radeon_audio_set_mute(encoder, true); | 704 | if (!connector) |
705 | return; | ||
704 | 706 | ||
705 | radeon_audio_write_speaker_allocation(encoder); | 707 | if (drm_detect_monitor_audio(radeon_connector_edid(connector))) { |
706 | radeon_audio_write_sad_regs(encoder); | 708 | radeon_audio_set_mute(encoder, true); |
707 | radeon_audio_write_latency_fields(encoder, mode); | ||
708 | radeon_audio_set_dto(encoder, mode->clock); | ||
709 | radeon_audio_set_vbi_packet(encoder); | ||
710 | radeon_hdmi_set_color_depth(encoder); | ||
711 | radeon_audio_update_acr(encoder, mode->clock); | ||
712 | radeon_audio_set_audio_packet(encoder); | ||
713 | radeon_audio_select_pin(encoder); | ||
714 | 709 | ||
715 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) | 710 | radeon_audio_write_speaker_allocation(encoder); |
716 | return; | 711 | radeon_audio_write_sad_regs(encoder); |
712 | radeon_audio_write_latency_fields(encoder, mode); | ||
713 | radeon_audio_set_dto(encoder, mode->clock); | ||
714 | radeon_audio_set_vbi_packet(encoder); | ||
715 | radeon_hdmi_set_color_depth(encoder); | ||
716 | radeon_audio_update_acr(encoder, mode->clock); | ||
717 | radeon_audio_set_audio_packet(encoder); | ||
718 | radeon_audio_select_pin(encoder); | ||
719 | |||
720 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) | ||
721 | return; | ||
722 | |||
723 | radeon_audio_set_mute(encoder, false); | ||
724 | } else { | ||
725 | radeon_hdmi_set_color_depth(encoder); | ||
717 | 726 | ||
718 | radeon_audio_set_mute(encoder, false); | 727 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) |
728 | return; | ||
729 | } | ||
719 | } | 730 | } |
720 | 731 | ||
721 | static void radeon_audio_dp_mode_set(struct drm_encoder *encoder, | 732 | static void radeon_audio_dp_mode_set(struct drm_encoder *encoder, |
@@ -730,24 +741,26 @@ static void radeon_audio_dp_mode_set(struct drm_encoder *encoder, | |||
730 | struct radeon_connector_atom_dig *dig_connector = | 741 | struct radeon_connector_atom_dig *dig_connector = |
731 | radeon_connector->con_priv; | 742 | radeon_connector->con_priv; |
732 | 743 | ||
733 | if (!connector) | 744 | if (!dig || !dig->afmt) |
734 | return; | 745 | return; |
735 | 746 | ||
736 | if (!dig || !dig->afmt) | 747 | if (!connector) |
737 | return; | 748 | return; |
738 | 749 | ||
739 | radeon_audio_write_speaker_allocation(encoder); | 750 | if (drm_detect_monitor_audio(radeon_connector_edid(connector))) { |
740 | radeon_audio_write_sad_regs(encoder); | 751 | radeon_audio_write_speaker_allocation(encoder); |
741 | radeon_audio_write_latency_fields(encoder, mode); | 752 | radeon_audio_write_sad_regs(encoder); |
742 | if (rdev->clock.dp_extclk || ASIC_IS_DCE5(rdev)) | 753 | radeon_audio_write_latency_fields(encoder, mode); |
743 | radeon_audio_set_dto(encoder, rdev->clock.default_dispclk * 10); | 754 | if (rdev->clock.dp_extclk || ASIC_IS_DCE5(rdev)) |
744 | else | 755 | radeon_audio_set_dto(encoder, rdev->clock.default_dispclk * 10); |
745 | radeon_audio_set_dto(encoder, dig_connector->dp_clock); | 756 | else |
746 | radeon_audio_set_audio_packet(encoder); | 757 | radeon_audio_set_dto(encoder, dig_connector->dp_clock); |
747 | radeon_audio_select_pin(encoder); | 758 | radeon_audio_set_audio_packet(encoder); |
759 | radeon_audio_select_pin(encoder); | ||
748 | 760 | ||
749 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) | 761 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) |
750 | return; | 762 | return; |
763 | } | ||
751 | } | 764 | } |
752 | 765 | ||
753 | void radeon_audio_mode_set(struct drm_encoder *encoder, | 766 | void radeon_audio_mode_set(struct drm_encoder *encoder, |