From de26d7b51c8751b476a91c98ef01814e468a5e00 Mon Sep 17 00:00:00 2001 From: fritsch Date: Tue, 5 Nov 2013 14:37:59 +0100 Subject: [PATCH] Fix missing multichannel SAD in some cases (done by Anssi) --- ...g-multichannel-PCM-SAD-in-some-cases.patch | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 packages/linux/patches/3.12/linux-990.15-Fix-missing-multichannel-PCM-SAD-in-some-cases.patch diff --git a/packages/linux/patches/3.12/linux-990.15-Fix-missing-multichannel-PCM-SAD-in-some-cases.patch b/packages/linux/patches/3.12/linux-990.15-Fix-missing-multichannel-PCM-SAD-in-some-cases.patch new file mode 100644 index 0000000000..29da19ecf4 --- /dev/null +++ b/packages/linux/patches/3.12/linux-990.15-Fix-missing-multichannel-PCM-SAD-in-some-cases.patch @@ -0,0 +1,126 @@ +commit 231a66ad6542801caf6a0e624f744d2218f6a6fe +Author: fritsch +Date: Tue Oct 29 07:48:53 2013 +0100 + + drm/radeon/audio: fix missing multichannel PCM SAD in some cases + +diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c +index ab92620..85c4993 100644 +--- a/drivers/gpu/drm/radeon/dce6_afmt.c ++++ b/drivers/gpu/drm/radeon/dce6_afmt.c +@@ -244,20 +244,30 @@ void dce6_afmt_write_sad_regs(struct drm_encoder *encoder) + + for (i = 0; i < ARRAY_SIZE(eld_reg_to_type); i++) { + u32 value = 0; ++ u8 stereo_freqs = 0; ++ int max_channels = -1; + int j; + + for (j = 0; j < sad_count; j++) { + struct cea_sad *sad = &sads[j]; + + if (sad->format == eld_reg_to_type[i][1]) { +- value = MAX_CHANNELS(sad->channels) | +- DESCRIPTOR_BYTE_2(sad->byte2) | +- SUPPORTED_FREQUENCIES(sad->freq); ++ if (sad->channels > max_channels) { ++ value = MAX_CHANNELS(sad->channels) | ++ DESCRIPTOR_BYTE_2(sad->byte2) | ++ SUPPORTED_FREQUENCIES(sad->freq); ++ max_channels = sad->channels; ++ } ++ + if (sad->format == HDMI_AUDIO_CODING_TYPE_PCM) +- value |= SUPPORTED_FREQUENCIES_STEREO(sad->freq); +- break; ++ stereo_freqs |= sad->freq; ++ else ++ break; + } + } ++ ++ value |= SUPPORTED_FREQUENCIES_STEREO(stereo_freqs); ++ + WREG32_ENDPOINT(offset, eld_reg_to_type[i][0], value); + } + +diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c +index e98b0f3..aa2f4da 100644 +--- a/drivers/gpu/drm/radeon/evergreen_hdmi.c ++++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c +@@ -180,20 +180,30 @@ static void evergreen_hdmi_write_sad_regs(struct drm_encoder *encoder) + + for (i = 0; i < ARRAY_SIZE(eld_reg_to_type); i++) { + u32 value = 0; ++ u8 stereo_freqs = 0; ++ int max_channels = -1; + int j; + + for (j = 0; j < sad_count; j++) { + struct cea_sad *sad = &sads[j]; + + if (sad->format == eld_reg_to_type[i][1]) { +- value = MAX_CHANNELS(sad->channels) | +- DESCRIPTOR_BYTE_2(sad->byte2) | +- SUPPORTED_FREQUENCIES(sad->freq); ++ if (sad->channels > max_channels) { ++ value = MAX_CHANNELS(sad->channels) | ++ DESCRIPTOR_BYTE_2(sad->byte2) | ++ SUPPORTED_FREQUENCIES(sad->freq); ++ max_channels = sad->channels; ++ } ++ + if (sad->format == HDMI_AUDIO_CODING_TYPE_PCM) +- value |= SUPPORTED_FREQUENCIES_STEREO(sad->freq); +- break; ++ stereo_freqs |= sad->freq; ++ else ++ break; + } + } ++ ++ value |= SUPPORTED_FREQUENCIES_STEREO(stereo_freqs); ++ + WREG32(eld_reg_to_type[i][0], value); + } + +diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c +index 06022e3..b90112f 100644 +--- a/drivers/gpu/drm/radeon/r600_hdmi.c ++++ b/drivers/gpu/drm/radeon/r600_hdmi.c +@@ -384,20 +384,30 @@ static void dce3_2_afmt_write_sad_regs(struct drm_encoder *encoder) + + for (i = 0; i < ARRAY_SIZE(eld_reg_to_type); i++) { + u32 value = 0; ++ u8 stereo_freqs = 0; ++ int max_channels = -1; + int j; + + for (j = 0; j < sad_count; j++) { + struct cea_sad *sad = &sads[j]; + + if (sad->format == eld_reg_to_type[i][1]) { +- value = MAX_CHANNELS(sad->channels) | +- DESCRIPTOR_BYTE_2(sad->byte2) | +- SUPPORTED_FREQUENCIES(sad->freq); ++ if (sad->channels > max_channels) { ++ value = MAX_CHANNELS(sad->channels) | ++ DESCRIPTOR_BYTE_2(sad->byte2) | ++ SUPPORTED_FREQUENCIES(sad->freq); ++ max_channels = sad->channels; ++ } ++ + if (sad->format == HDMI_AUDIO_CODING_TYPE_PCM) +- value |= SUPPORTED_FREQUENCIES_STEREO(sad->freq); +- break; ++ stereo_freqs |= sad->freq; ++ else ++ break; + } + } ++ ++ value |= SUPPORTED_FREQUENCIES_STEREO(stereo_freqs); ++ + WREG32(eld_reg_to_type[i][0], value); + } +