diff options
Diffstat (limited to 'sound/pci/hda/hda_proc.c')
| -rw-r--r-- | sound/pci/hda/hda_proc.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c index ce5a6da83419..05e19f78b4cb 100644 --- a/sound/pci/hda/hda_proc.c +++ b/sound/pci/hda/hda_proc.c | |||
| @@ -134,13 +134,38 @@ static void print_amp_caps(struct snd_info_buffer *buffer, | |||
| 134 | (caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT); | 134 | (caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT); |
| 135 | } | 135 | } |
| 136 | 136 | ||
| 137 | /* is this a stereo widget or a stereo-to-mono mix? */ | ||
| 138 | static bool is_stereo_amps(struct hda_codec *codec, hda_nid_t nid, | ||
| 139 | int dir, unsigned int wcaps, int indices) | ||
| 140 | { | ||
| 141 | hda_nid_t conn; | ||
| 142 | |||
| 143 | if (wcaps & AC_WCAP_STEREO) | ||
| 144 | return true; | ||
| 145 | /* check for a stereo-to-mono mix; it must be: | ||
| 146 | * only a single connection, only for input, and only a mixer widget | ||
| 147 | */ | ||
| 148 | if (indices != 1 || dir != HDA_INPUT || | ||
| 149 | get_wcaps_type(wcaps) != AC_WID_AUD_MIX) | ||
| 150 | return false; | ||
| 151 | |||
| 152 | if (snd_hda_get_raw_connections(codec, nid, &conn, 1) < 0) | ||
| 153 | return false; | ||
| 154 | /* the connection source is a stereo? */ | ||
| 155 | wcaps = snd_hda_param_read(codec, conn, AC_PAR_AUDIO_WIDGET_CAP); | ||
| 156 | return !!(wcaps & AC_WCAP_STEREO); | ||
| 157 | } | ||
| 158 | |||
| 137 | static void print_amp_vals(struct snd_info_buffer *buffer, | 159 | static void print_amp_vals(struct snd_info_buffer *buffer, |
| 138 | struct hda_codec *codec, hda_nid_t nid, | 160 | struct hda_codec *codec, hda_nid_t nid, |
| 139 | int dir, int stereo, int indices) | 161 | int dir, unsigned int wcaps, int indices) |
| 140 | { | 162 | { |
| 141 | unsigned int val; | 163 | unsigned int val; |
| 164 | bool stereo; | ||
| 142 | int i; | 165 | int i; |
| 143 | 166 | ||
| 167 | stereo = is_stereo_amps(codec, nid, dir, wcaps, indices); | ||
| 168 | |||
| 144 | dir = dir == HDA_OUTPUT ? AC_AMP_GET_OUTPUT : AC_AMP_GET_INPUT; | 169 | dir = dir == HDA_OUTPUT ? AC_AMP_GET_OUTPUT : AC_AMP_GET_INPUT; |
| 145 | for (i = 0; i < indices; i++) { | 170 | for (i = 0; i < indices; i++) { |
| 146 | snd_iprintf(buffer, " ["); | 171 | snd_iprintf(buffer, " ["); |
| @@ -757,12 +782,10 @@ static void print_codec_info(struct snd_info_entry *entry, | |||
| 757 | (codec->single_adc_amp && | 782 | (codec->single_adc_amp && |
| 758 | wid_type == AC_WID_AUD_IN)) | 783 | wid_type == AC_WID_AUD_IN)) |
| 759 | print_amp_vals(buffer, codec, nid, HDA_INPUT, | 784 | print_amp_vals(buffer, codec, nid, HDA_INPUT, |
| 760 | wid_caps & AC_WCAP_STEREO, | 785 | wid_caps, 1); |
| 761 | 1); | ||
| 762 | else | 786 | else |
| 763 | print_amp_vals(buffer, codec, nid, HDA_INPUT, | 787 | print_amp_vals(buffer, codec, nid, HDA_INPUT, |
| 764 | wid_caps & AC_WCAP_STEREO, | 788 | wid_caps, conn_len); |
| 765 | conn_len); | ||
| 766 | } | 789 | } |
| 767 | if (wid_caps & AC_WCAP_OUT_AMP) { | 790 | if (wid_caps & AC_WCAP_OUT_AMP) { |
| 768 | snd_iprintf(buffer, " Amp-Out caps: "); | 791 | snd_iprintf(buffer, " Amp-Out caps: "); |
| @@ -771,11 +794,10 @@ static void print_codec_info(struct snd_info_entry *entry, | |||
| 771 | if (wid_type == AC_WID_PIN && | 794 | if (wid_type == AC_WID_PIN && |
| 772 | codec->pin_amp_workaround) | 795 | codec->pin_amp_workaround) |
| 773 | print_amp_vals(buffer, codec, nid, HDA_OUTPUT, | 796 | print_amp_vals(buffer, codec, nid, HDA_OUTPUT, |
| 774 | wid_caps & AC_WCAP_STEREO, | 797 | wid_caps, conn_len); |
| 775 | conn_len); | ||
| 776 | else | 798 | else |
| 777 | print_amp_vals(buffer, codec, nid, HDA_OUTPUT, | 799 | print_amp_vals(buffer, codec, nid, HDA_OUTPUT, |
| 778 | wid_caps & AC_WCAP_STEREO, 1); | 800 | wid_caps, 1); |
| 779 | } | 801 | } |
| 780 | 802 | ||
| 781 | switch (wid_type) { | 803 | switch (wid_type) { |
