diff options
author | Takashi Iwai <tiwai@suse.de> | 2011-05-16 09:45:15 (GMT) |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2011-05-16 09:45:15 (GMT) |
commit | f9759301c68a274302e434daa135926c25ca51ca (patch) | |
tree | a60ab695db1f273ec87471cc0df62b63da5c1434 /sound/pci | |
parent | cf27f29ae2a4a0feed75262361f9f7dff20230b1 (diff) | |
download | linux-f9759301c68a274302e434daa135926c25ca51ca.tar.xz |
ALSA: hda - Don't create multiple same volume/boost controls in Cxt auto-parser
Check the routing more exactly for avoiding the duplicated controls for
the very same effect for multiple capture routes in Conexant auto-parser.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/hda/patch_conexant.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 28664e1..ed983a0 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -109,6 +109,7 @@ struct conexant_spec { struct auto_pin_cfg autocfg; struct hda_input_mux private_imux; int imux_cfg_idx[HDA_MAX_NUM_INPUTS]; /* corresponding autocfg.input */ + hda_nid_t imux_boost_nid[HDA_MAX_NUM_INPUTS]; /* boost widget */ hda_nid_t imux_adcs[HDA_MAX_NUM_INPUTS]; hda_nid_t imux_pins[HDA_MAX_NUM_INPUTS]; hda_nid_t private_adc_nids[HDA_MAX_NUM_INPUTS]; @@ -3651,6 +3652,7 @@ static void cx_auto_parse_input(struct hda_codec *codec) const char *label; label = hda_get_autocfg_input_label(codec, cfg, i); spec->imux_cfg_idx[imux->num_items] = i; + spec->imux_boost_nid[imux->num_items] = 0; spec->imux_adcs[imux->num_items] = adc; spec->imux_pins[imux->num_items] = cfg->inputs[i].pin; @@ -3997,7 +3999,7 @@ static int cx_auto_add_boost_volume(struct hda_codec *codec, int idx, { struct conexant_spec *spec = codec->spec; hda_nid_t mux, nid; - int con; + int i, con; nid = spec->imux_pins[idx]; if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) @@ -4007,9 +4009,16 @@ static int cx_auto_add_boost_volume(struct hda_codec *codec, int idx, false, 0); if (con < 0) return 0; - if (get_wcaps(codec, mux) & AC_WCAP_OUT_AMP) + for (i = 0; i < idx; i++) { + if (spec->imux_boost_nid[i] == mux) + return 0; /* already present */ + } + + if (get_wcaps(codec, mux) & AC_WCAP_OUT_AMP) { + spec->imux_boost_nid[idx] = mux; return cx_auto_add_volume(codec, label, " Boost", 0, mux, HDA_OUTPUT); + } return 0; } @@ -4050,6 +4059,8 @@ static int cx_auto_build_input_controls(struct hda_codec *codec) return err; if (!multi_connection) { + if (i > 0) + continue; err = cx_auto_add_capture_volume(codec, nid, "Capture", "", cidx); } else { |