aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/pci/hda/patch_sigmatel.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
index 742b9c8b25e7..c878dfa369b7 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,
3580} 3580}
3581 3581
3582/* create a volume assigned to the given pin (only if supported) */ 3582/* create a volume assigned to the given pin (only if supported) */
3583/* return 1 if the volume control is created */
3583static int create_elem_capture_vol(struct hda_codec *codec, hda_nid_t nid, 3584static int create_elem_capture_vol(struct hda_codec *codec, hda_nid_t nid,
3584 const char *label) 3585 const char *label, int direction)
3585{ 3586{
3586 unsigned int caps, nums; 3587 unsigned int caps, nums;
3587 char name[32]; 3588 char name[32];
3589 int err;
3588 3590
3589 if (!(get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) 3591 if (direction == HDA_OUTPUT)
3592 caps = AC_WCAP_OUT_AMP;
3593 else
3594 caps = AC_WCAP_IN_AMP;
3595 if (!(get_wcaps(codec, nid) & caps))
3590 return 0; 3596 return 0;
3591 caps = query_amp_caps(codec, nid, HDA_OUTPUT); 3597 caps = query_amp_caps(codec, nid, direction);
3592 nums = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT; 3598 nums = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT;
3593 if (!nums) 3599 if (!nums)
3594 return 0; 3600 return 0;
3595 snprintf(name, sizeof(name), "%s Capture Volume", label); 3601 snprintf(name, sizeof(name), "%s Capture Volume", label);
3596 return stac92xx_add_control(codec->spec, STAC_CTL_WIDGET_VOL, name, 3602 err = stac92xx_add_control(codec->spec, STAC_CTL_WIDGET_VOL, name,
3597 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT)); 3603 HDA_COMPOSE_AMP_VAL(nid, 3, 0, direction));
3604 if (err < 0)
3605 return err;
3606 return 1;
3598} 3607}
3599 3608
3600/* create playback/capture controls for input pins on dmic capable codecs */ 3609/* 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,
3643 else 3652 else
3644 label = stac92xx_dmic_labels[dimux->num_items]; 3653 label = stac92xx_dmic_labels[dimux->num_items];
3645 3654
3646 err = create_elem_capture_vol(codec, nid, label); 3655 err = create_elem_capture_vol(codec, nid, label, HDA_INPUT);
3647 if (err < 0) 3656 if (err < 0)
3648 return err; 3657 return err;
3658 if (!err) {
3659 err = create_elem_capture_vol(codec, nid, label,
3660 HDA_OUTPUT);
3661 if (err < 0)
3662 return err;
3663 }
3649 3664
3650 dimux->items[dimux->num_items].label = label; 3665 dimux->items[dimux->num_items].label = label;
3651 dimux->items[dimux->num_items].index = index; 3666 dimux->items[dimux->num_items].index = index;
@@ -3766,7 +3781,8 @@ static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const
3766 continue; 3781 continue;
3767 3782
3768 err = create_elem_capture_vol(codec, nid, 3783 err = create_elem_capture_vol(codec, nid,
3769 auto_pin_cfg_labels[i]); 3784 auto_pin_cfg_labels[i],
3785 HDA_INPUT);
3770 if (err < 0) 3786 if (err < 0)
3771 return err; 3787 return err;
3772 3788