Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+42 -30
+1 -2
drivers/gpu/drm/radeon/atombios_encoders.c
··· 2299 2299 encoder_mode = atombios_get_encoder_mode(encoder); 2300 2300 if (connector && (radeon_audio != 0) && 2301 2301 ((encoder_mode == ATOM_ENCODER_MODE_HDMI) || 2302 - (ENCODER_MODE_IS_DP(encoder_mode) && 2303 - drm_detect_monitor_audio(radeon_connector_edid(connector))))) 2302 + ENCODER_MODE_IS_DP(encoder_mode))) 2304 2303 radeon_audio_mode_set(encoder, adjusted_mode); 2305 2304 } 2306 2305
+41 -28
drivers/gpu/drm/radeon/radeon_audio.c
··· 696 696 { 697 697 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 698 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 701 if (!dig || !dig->afmt) 701 702 return; 702 703 703 - radeon_audio_set_mute(encoder, true); 704 - 705 - radeon_audio_write_speaker_allocation(encoder); 706 - radeon_audio_write_sad_regs(encoder); 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 - 715 - if (radeon_audio_set_avi_packet(encoder, mode) < 0) 704 + if (!connector) 716 705 return; 717 706 718 - radeon_audio_set_mute(encoder, false); 707 + if (drm_detect_monitor_audio(radeon_connector_edid(connector))) { 708 + radeon_audio_set_mute(encoder, true); 709 + 710 + radeon_audio_write_speaker_allocation(encoder); 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); 726 + 727 + if (radeon_audio_set_avi_packet(encoder, mode) < 0) 728 + return; 729 + } 719 730 } 720 731 721 732 static void radeon_audio_dp_mode_set(struct drm_encoder *encoder, ··· 741 730 struct radeon_connector_atom_dig *dig_connector = 742 731 radeon_connector->con_priv; 743 732 744 - if (!connector) 745 - return; 746 - 747 733 if (!dig || !dig->afmt) 748 734 return; 749 735 750 - radeon_audio_write_speaker_allocation(encoder); 751 - radeon_audio_write_sad_regs(encoder); 752 - radeon_audio_write_latency_fields(encoder, mode); 753 - if (rdev->clock.dp_extclk || ASIC_IS_DCE5(rdev)) 754 - radeon_audio_set_dto(encoder, rdev->clock.default_dispclk * 10); 755 - else 756 - radeon_audio_set_dto(encoder, dig_connector->dp_clock); 757 - radeon_audio_set_audio_packet(encoder); 758 - radeon_audio_select_pin(encoder); 759 - 760 - if (radeon_audio_set_avi_packet(encoder, mode) < 0) 736 + if (!connector) 761 737 return; 738 + 739 + if (drm_detect_monitor_audio(radeon_connector_edid(connector))) { 740 + radeon_audio_write_speaker_allocation(encoder); 741 + radeon_audio_write_sad_regs(encoder); 742 + radeon_audio_write_latency_fields(encoder, mode); 743 + if (rdev->clock.dp_extclk || ASIC_IS_DCE5(rdev)) 744 + radeon_audio_set_dto(encoder, rdev->clock.default_dispclk * 10); 745 + else 746 + radeon_audio_set_dto(encoder, dig_connector->dp_clock); 747 + radeon_audio_set_audio_packet(encoder); 748 + radeon_audio_select_pin(encoder); 749 + 750 + if (radeon_audio_set_avi_packet(encoder, mode) < 0) 751 + return; 752 + } 762 753 } 763 754 764 755 void radeon_audio_mode_set(struct drm_encoder *encoder,