mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-28 13:16:41 +00:00
Fix missing multichannel SAD in some cases (done by Anssi)
This commit is contained in:
parent
f949c8e81b
commit
de26d7b51c
126
packages/linux/patches/3.12/linux-990.15-Fix-missing-multichannel-PCM-SAD-in-some-cases.patch
vendored
Normal file
126
packages/linux/patches/3.12/linux-990.15-Fix-missing-multichannel-PCM-SAD-in-some-cases.patch
vendored
Normal file
@ -0,0 +1,126 @@
|
||||
commit 231a66ad6542801caf6a0e624f744d2218f6a6fe
|
||||
Author: fritsch <peter.fruehberger@gmail.com>
|
||||
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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user