aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2009-08-28 18:49:36 -0400
committerTakashi Iwai <tiwai@suse.de>2009-08-28 18:49:36 -0400
commit96f845de89be6be12112d7b388cdf366dccfe12d (patch)
tree1ffdc69dc114152a3944f67fab43a483aa9596df /sound
parent286f5875ca5c4e58432e3e6ca386ea4294275d84 (diff)
ALSA: hda - Create "Digital Mic Capture Volume" correctly for IDT codecs
So far, the digital mic capture volume wasn't created. This is because IDT codecs have output amps for digital mics, not input amps, while input amps should be used for other analog pins. Thus the automatic capture volume creation should check both directions for digital mics. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-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