diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-28 08:53:36 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-28 08:53:36 -0800 |
commit | 3c512b193a3f8c24045b809db91b03f463f72105 (patch) | |
tree | 124b158a151f749ee2c04c131476fe1a6a2cfdb2 /sound/pci/hda/patch_realtek.c | |
parent | c28800a9c3caaf387d85ac665a25ebe99e480295 (diff) | |
parent | f339240dd89b920a6a686a0358ea53fc584622fe (diff) | |
download | linux-3c512b193a3f8c24045b809db91b03f463f72105.tar.bz2 |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (28 commits)
ALSA: hda - Fix jack-detection control of VT1708
ALSA: hda - cut and paste typo in cs420x_models[]
ALSA: hda/realtek - Minor cleanup
ALSA: hda/realtek - Fix missing inits of item indices for auto-mic
ALSA: hda - Fix invalid pin and GPIO for Apple laptops with CS codecs
ALSA: hda - Check subdevice mask in snd_hda_check_board_codec_sid_config()
ALSA: hda - fail ELD reading early
ALSA: lx6464es - fix device communication via command bus
ALSA: lx6464es - command buffer API cleanup
ALSA: hda - repoll ELD content for multiple times
ALSA: hdspm - Fix PCI ID for PCIe RME MADI cards
ASoC: Ensure WM8731 register cache is synced when resuming from disabled
ALSA: cs5535 - Fix an endianness conversion
ASoC: cs4271: Fix wrong mask parameter in some snd_soc_update_bits calls
ASoC: wm_hubs: fix DB_RANGE size
ASoC: wm9090: fix DB_RANGE size
ASoC: wm8993: fix DB_RANGE size
ASoC: wm8962: fix DB_RANGE size
ASoC: sgtl5000: fix DB_RANGE size
ASoC: rt5631: fix DB_RANGE size
...
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 336d14eb72af..cbde019d3d52 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -277,6 +277,12 @@ static bool alc_dyn_adc_pcm_resetup(struct hda_codec *codec, int cur) return false; } +static inline hda_nid_t get_capsrc(struct alc_spec *spec, int idx) +{ + return spec->capsrc_nids ? + spec->capsrc_nids[idx] : spec->adc_nids[idx]; +} + /* select the given imux item; either unmute exclusively or select the route */ static int alc_mux_select(struct hda_codec *codec, unsigned int adc_idx, unsigned int idx, bool force) @@ -303,8 +309,7 @@ static int alc_mux_select(struct hda_codec *codec, unsigned int adc_idx, adc_idx = spec->dyn_adc_idx[idx]; } - nid = spec->capsrc_nids ? - spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx]; + nid = get_capsrc(spec, adc_idx); /* no selection? */ num_conns = snd_hda_get_conn_list(codec, nid, NULL); @@ -1054,8 +1059,19 @@ static bool alc_rebuild_imux_for_auto_mic(struct hda_codec *codec) spec->imux_pins[2] = spec->dock_mic_pin; for (i = 0; i < 3; i++) { strcpy(imux->items[i].label, texts[i]); - if (spec->imux_pins[i]) + if (spec->imux_pins[i]) { + hda_nid_t pin = spec->imux_pins[i]; + int c; + for (c = 0; c < spec->num_adc_nids; c++) { + hda_nid_t cap = get_capsrc(spec, c); + int idx = get_connection_index(codec, cap, pin); + if (idx >= 0) { + imux->items[i].index = idx; + break; + } + } imux->num_items = i + 1; + } } spec->num_mux_defs = 1; spec->input_mux = imux; @@ -1957,10 +1973,8 @@ static int alc_build_controls(struct hda_codec *codec) if (!kctl) kctl = snd_hda_find_mixer_ctl(codec, "Input Source"); for (i = 0; kctl && i < kctl->count; i++) { - const hda_nid_t *nids = spec->capsrc_nids; - if (!nids) - nids = spec->adc_nids; - err = snd_hda_add_nid(codec, kctl, i, nids[i]); + err = snd_hda_add_nid(codec, kctl, i, + get_capsrc(spec, i)); if (err < 0) return err; } @@ -2747,8 +2761,7 @@ static int alc_auto_create_input_ctls(struct hda_codec *codec) } for (c = 0; c < num_adcs; c++) { - hda_nid_t cap = spec->capsrc_nids ? - spec->capsrc_nids[c] : spec->adc_nids[c]; + hda_nid_t cap = get_capsrc(spec, c); idx = get_connection_index(codec, cap, pin); if (idx >= 0) { spec->imux_pins[imux->num_items] = pin; @@ -3694,8 +3707,7 @@ static int init_capsrc_for_pin(struct hda_codec *codec, hda_nid_t pin) if (!pin) return 0; for (i = 0; i < spec->num_adc_nids; i++) { - hda_nid_t cap = spec->capsrc_nids ? - spec->capsrc_nids[i] : spec->adc_nids[i]; + hda_nid_t cap = get_capsrc(spec, i); int idx; idx = get_connection_index(codec, cap, pin); |