mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-28 21:26:49 +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