diff options
author | Takashi Iwai <tiwai@suse.de> | 2009-12-08 12:52:47 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-12-08 12:52:47 +0100 |
commit | d11f74c62fb4a1fefd39085570fb6dfa7b9ab2bb (patch) | |
tree | cbedcef6ffb162f9b8e054a983b20ad80f3ca5cd /sound/pci | |
parent | 23033b2bce4361f2859ee0331f97c9056dae7091 (diff) | |
download | kernel_samsung_aries-d11f74c62fb4a1fefd39085570fb6dfa7b9ab2bb.zip kernel_samsung_aries-d11f74c62fb4a1fefd39085570fb6dfa7b9ab2bb.tar.gz kernel_samsung_aries-d11f74c62fb4a1fefd39085570fb6dfa7b9ab2bb.tar.bz2 |
ALSA: hda - Exclude unusable ADCs for ALC88x
On Realtek codecs, a digital mic pin is connected often only to a single
ADC. But the parser tries to set up all ADCs no matter whether the
digital mic is available, and results in non-selectable input source.
This patch adds a check of input-source availability of each ADC, and
excludes ones that don't support all input sources.
Reference: Novell bnc#561235
http://bugzilla.novell.com/show_bug.cgi?id=561235
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 0fbcbee..2a96bc7 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -10021,10 +10021,12 @@ static int patch_alc882(struct hda_codec *codec) spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */ if (!spec->adc_nids && spec->input_mux) { - int i; + int i, j; spec->num_adc_nids = 0; for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) { + const struct hda_input_mux *imux = spec->input_mux; hda_nid_t cap; + hda_nid_t items[16]; hda_nid_t nid = alc882_adc_nids[i]; unsigned int wcap = get_wcaps(codec, nid); /* get type */ @@ -10035,6 +10037,15 @@ static int patch_alc882(struct hda_codec *codec) err = snd_hda_get_connections(codec, nid, &cap, 1); if (err < 0) continue; + err = snd_hda_get_connections(codec, cap, items, + ARRAY_SIZE(items)); + if (err < 0) + continue; + for (j = 0; j < imux->num_items; j++) + if (imux->items[j].index >= err) + break; + if (j < imux->num_items) + continue; spec->private_capsrc_nids[spec->num_adc_nids] = cap; spec->num_adc_nids++; } |