aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2015-07-24 00:42:02 -0400
committerAlex Deucher <alexander.deucher@amd.com>2015-07-29 15:50:28 -0400
commit7726e72b3d6879ee5fc743a230eb6f5afa12844b (patch)
treec5259947d187da3ee38126b1ac7330e19287caa4 /drivers/gpu
parentd0ea397e22f9ad0113c1dbdaab14eded050472eb (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.c3
-rw-r--r--drivers/gpu/drm/radeon/radeon_audio.c65
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
721static void radeon_audio_dp_mode_set(struct drm_encoder *encoder, 732static 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
753void radeon_audio_mode_set(struct drm_encoder *encoder, 766void radeon_audio_mode_set(struct drm_encoder *encoder,