diff options
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 742b9c8b25e..c878dfa369b 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -3580,21 +3580,30 @@ static int get_connection_index(struct hda_codec *codec, hda_nid_t mux, } /* create a volume assigned to the given pin (only if supported) */ +/* return 1 if the volume control is created */ static int create_elem_capture_vol(struct hda_codec *codec, hda_nid_t nid, - const char *label) + const char *label, int direction) { unsigned int caps, nums; char name[32]; + int err; - if (!(get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) + if (direction == HDA_OUTPUT) + caps = AC_WCAP_OUT_AMP; + else + caps = AC_WCAP_IN_AMP; + if (!(get_wcaps(codec, nid) & caps)) return 0; - caps = query_amp_caps(codec, nid, HDA_OUTPUT); + caps = query_amp_caps(codec, nid, direction); nums = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT; if (!nums) return 0; snprintf(name, sizeof(name), "%s Capture Volume", label); - return stac92xx_add_control(codec->spec, STAC_CTL_WIDGET_VOL, name, - HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT)); + err = stac92xx_add_control(codec->spec, STAC_CTL_WIDGET_VOL, name, + HDA_COMPOSE_AMP_VAL(nid, 3, 0, direction)); + if (err < 0) + return err; + return 1; } /* create playback/capture controls for input pins on dmic capable codecs */ @@ -3643,9 +3652,15 @@ static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec, else label = stac92xx_dmic_labels[dimux->num_items]; - err = create_elem_capture_vol(codec, nid, label); + err = create_elem_capture_vol(codec, nid, label, HDA_INPUT); if (err < 0) return err; + if (!err) { + err = create_elem_capture_vol(codec, nid, label, + HDA_OUTPUT); + if (err < 0) + return err; + } dimux->items[dimux->num_items].label = label; dimux->items[dimux->num_items].index = index; @@ -3766,7 +3781,8 @@ static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const continue; err = create_elem_capture_vol(codec, nid, - auto_pin_cfg_labels[i]); + auto_pin_cfg_labels[i], + HDA_INPUT); if (err < 0) return err; |