diff options
author | Takashi Iwai <tiwai@suse.de> | 2009-12-08 06:52:47 -0500 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-12-08 06:52:47 -0500 |
commit | d11f74c62fb4a1fefd39085570fb6dfa7b9ab2bb (patch) | |
tree | cbedcef6ffb162f9b8e054a983b20ad80f3ca5cd /sound | |
parent | 23033b2bce4361f2859ee0331f97c9056dae7091 (diff) |
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')
-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 0fbcbeef1418..2a96bc78964d 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) | |||
10021 | spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */ | 10021 | spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */ |
10022 | 10022 | ||
10023 | if (!spec->adc_nids && spec->input_mux) { | 10023 | if (!spec->adc_nids && spec->input_mux) { |
10024 | int i; | 10024 | int i, j; |
10025 | spec->num_adc_nids = 0; | 10025 | spec->num_adc_nids = 0; |
10026 | for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) { | 10026 | for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) { |
10027 | const struct hda_input_mux *imux = spec->input_mux; | ||
10027 | hda_nid_t cap; | 10028 | hda_nid_t cap; |
10029 | hda_nid_t items[16]; | ||
10028 | hda_nid_t nid = alc882_adc_nids[i]; | 10030 | hda_nid_t nid = alc882_adc_nids[i]; |
10029 | unsigned int wcap = get_wcaps(codec, nid); | 10031 | unsigned int wcap = get_wcaps(codec, nid); |
10030 | /* get type */ | 10032 | /* get type */ |
@@ -10035,6 +10037,15 @@ static int patch_alc882(struct hda_codec *codec) | |||
10035 | err = snd_hda_get_connections(codec, nid, &cap, 1); | 10037 | err = snd_hda_get_connections(codec, nid, &cap, 1); |
10036 | if (err < 0) | 10038 | if (err < 0) |
10037 | continue; | 10039 | continue; |
10040 | err = snd_hda_get_connections(codec, cap, items, | ||
10041 | ARRAY_SIZE(items)); | ||
10042 | if (err < 0) | ||
10043 | continue; | ||
10044 | for (j = 0; j < imux->num_items; j++) | ||
10045 | if (imux->items[j].index >= err) | ||
10046 | break; | ||
10047 | if (j < imux->num_items) | ||
10048 | continue; | ||
10038 | spec->private_capsrc_nids[spec->num_adc_nids] = cap; | 10049 | spec->private_capsrc_nids[spec->num_adc_nids] = cap; |
10039 | spec->num_adc_nids++; | 10050 | spec->num_adc_nids++; |
10040 | } | 10051 | } |