aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorAnssi Hannula <anssi.hannula@iki.fi>2010-12-07 13:56:19 -0500
committerTakashi Iwai <tiwai@suse.de>2010-12-07 14:13:22 -0500
commit3dc86429032910bdf762adeb2969112bb303924c (patch)
treec53f59b064177380d000acfa4b99a28069b27673 /sound
parent4b0dbdb17f846a8887e5f7fbeea2deb0703236bd (diff)
ALSA: hda - Always allow basic audio irrespective of ELD info
Commit bbbe33900d1f3c added functionality to restrict PCM parameters based on ELD info (derived from EDID data) of the audio sink. However, according to CEA-861-D no SAD is needed for basic audio (32/44.1/48kHz stereo 16-bit audio), which is instead indicated with a basic audio flag in the CEA EDID Extension. The flag is not present in ELD. However, as all audio capable sinks are required to support basic audio, we can assume it to be always available. Fix allowed audio formats with sinks that have SADs (Short Audio Descriptors) which do not completely overlap with the basic audio formats (there are no reports of affected devices so far) by always assuming that basic audio is supported. Reported-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi> Cc: stable@kernel.org Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/hda/hda_eld.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c
index 47ef8aa4a84..009031fae2b 100644
--- a/sound/pci/hda/hda_eld.c
+++ b/sound/pci/hda/hda_eld.c
@@ -598,21 +598,19 @@ void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm,
598{ 598{
599 int i; 599 int i;
600 600
601 pcm->rates = 0; 601 /* assume basic audio support (the basic audio flag is not in ELD;
602 pcm->formats = 0; 602 * however, all audio capable sinks are required to support basic
603 pcm->maxbps = 0; 603 * audio) */
604 pcm->channels_max = 0; 604 pcm->rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000;
605 pcm->formats = SNDRV_PCM_FMTBIT_S16_LE;
606 pcm->maxbps = 16;
607 pcm->channels_max = 2;
605 for (i = 0; i < eld->sad_count; i++) { 608 for (i = 0; i < eld->sad_count; i++) {
606 struct cea_sad *a = &eld->sad[i]; 609 struct cea_sad *a = &eld->sad[i];
607 pcm->rates |= a->rates; 610 pcm->rates |= a->rates;
608 if (a->channels > pcm->channels_max) 611 if (a->channels > pcm->channels_max)
609 pcm->channels_max = a->channels; 612 pcm->channels_max = a->channels;
610 if (a->format == AUDIO_CODING_TYPE_LPCM) { 613 if (a->format == AUDIO_CODING_TYPE_LPCM) {
611 if (a->sample_bits & AC_SUPPCM_BITS_16) {
612 pcm->formats |= SNDRV_PCM_FMTBIT_S16_LE;
613 if (pcm->maxbps < 16)
614 pcm->maxbps = 16;
615 }
616 if (a->sample_bits & AC_SUPPCM_BITS_20) { 614 if (a->sample_bits & AC_SUPPCM_BITS_20) {
617 pcm->formats |= SNDRV_PCM_FMTBIT_S32_LE; 615 pcm->formats |= SNDRV_PCM_FMTBIT_S32_LE;
618 if (pcm->maxbps < 20) 616 if (pcm->maxbps < 20)