diff options
author | Takashi Iwai <tiwai@suse.de> | 2009-03-02 08:26:25 -0500 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-03-02 11:30:00 -0500 |
commit | d78d7a90adf793943cc29a414b6f4364a700aad5 (patch) | |
tree | 25d528df4b6a830a1c1a6001277bf9bd8f0827ea /sound/pci | |
parent | ab1726f920275b52991b2eff7538ac6d313bf9a2 (diff) |
ALSA: hda - Create "Analog Loopback" controls optionally
Don't create "Analog Loopback" controls as default since these controls
are usually more harmful than useful for normal users.
Only created when "loopback = yes" hint is given.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 56 |
1 files changed, 43 insertions, 13 deletions
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 13056429aa64..7381325b98ff 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -190,6 +190,7 @@ struct sigmatel_spec { | |||
190 | unsigned int stream_delay; | 190 | unsigned int stream_delay; |
191 | 191 | ||
192 | /* analog loopback */ | 192 | /* analog loopback */ |
193 | struct snd_kcontrol_new *aloopback_ctl; | ||
193 | unsigned char aloopback_mask; | 194 | unsigned char aloopback_mask; |
194 | unsigned char aloopback_shift; | 195 | unsigned char aloopback_shift; |
195 | 196 | ||
@@ -1013,8 +1014,6 @@ static struct snd_kcontrol_new stac92hd73xx_6ch_mixer[] = { | |||
1013 | HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT), | 1014 | HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT), |
1014 | HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT), | 1015 | HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT), |
1015 | 1016 | ||
1016 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3), | ||
1017 | |||
1018 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT), | 1017 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT), |
1019 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT), | 1018 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT), |
1020 | 1019 | ||
@@ -1024,9 +1023,22 @@ static struct snd_kcontrol_new stac92hd73xx_6ch_mixer[] = { | |||
1024 | { } /* end */ | 1023 | { } /* end */ |
1025 | }; | 1024 | }; |
1026 | 1025 | ||
1027 | static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = { | 1026 | static struct snd_kcontrol_new stac92hd73xx_6ch_loopback[] = { |
1027 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3), | ||
1028 | {} | ||
1029 | }; | ||
1030 | |||
1031 | static struct snd_kcontrol_new stac92hd73xx_8ch_loopback[] = { | ||
1028 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4), | 1032 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4), |
1033 | {} | ||
1034 | }; | ||
1029 | 1035 | ||
1036 | static struct snd_kcontrol_new stac92hd73xx_10ch_loopback[] = { | ||
1037 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5), | ||
1038 | {} | ||
1039 | }; | ||
1040 | |||
1041 | static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = { | ||
1030 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT), | 1042 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT), |
1031 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT), | 1043 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT), |
1032 | 1044 | ||
@@ -1051,8 +1063,6 @@ static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = { | |||
1051 | }; | 1063 | }; |
1052 | 1064 | ||
1053 | static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = { | 1065 | static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = { |
1054 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5), | ||
1055 | |||
1056 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT), | 1066 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT), |
1057 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT), | 1067 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT), |
1058 | 1068 | ||
@@ -1104,8 +1114,6 @@ static struct snd_kcontrol_new stac92hd83xxx_mixer[] = { | |||
1104 | }; | 1114 | }; |
1105 | 1115 | ||
1106 | static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = { | 1116 | static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = { |
1107 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2), | ||
1108 | |||
1109 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT), | 1117 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT), |
1110 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT), | 1118 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT), |
1111 | 1119 | ||
@@ -1131,9 +1139,11 @@ static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = { | |||
1131 | { } /* end */ | 1139 | { } /* end */ |
1132 | }; | 1140 | }; |
1133 | 1141 | ||
1134 | static struct snd_kcontrol_new stac92hd71bxx_mixer[] = { | 1142 | static struct snd_kcontrol_new stac92hd71bxx_loopback[] = { |
1135 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2), | 1143 | STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2) |
1144 | }; | ||
1136 | 1145 | ||
1146 | static struct snd_kcontrol_new stac92hd71bxx_mixer[] = { | ||
1137 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT), | 1147 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT), |
1138 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT), | 1148 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT), |
1139 | 1149 | ||
@@ -1151,8 +1161,6 @@ static struct snd_kcontrol_new stac925x_mixer[] = { | |||
1151 | }; | 1161 | }; |
1152 | 1162 | ||
1153 | static struct snd_kcontrol_new stac9205_mixer[] = { | 1163 | static struct snd_kcontrol_new stac9205_mixer[] = { |
1154 | STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1), | ||
1155 | |||
1156 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1b, 0x0, HDA_INPUT), | 1164 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1b, 0x0, HDA_INPUT), |
1157 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1d, 0x0, HDA_OUTPUT), | 1165 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1d, 0x0, HDA_OUTPUT), |
1158 | 1166 | ||
@@ -1161,6 +1169,11 @@ static struct snd_kcontrol_new stac9205_mixer[] = { | |||
1161 | { } /* end */ | 1169 | { } /* end */ |
1162 | }; | 1170 | }; |
1163 | 1171 | ||
1172 | static struct snd_kcontrol_new stac9205_loopback[] = { | ||
1173 | STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1), | ||
1174 | {} | ||
1175 | }; | ||
1176 | |||
1164 | /* This needs to be generated dynamically based on sequence */ | 1177 | /* This needs to be generated dynamically based on sequence */ |
1165 | static struct snd_kcontrol_new stac922x_mixer[] = { | 1178 | static struct snd_kcontrol_new stac922x_mixer[] = { |
1166 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x17, 0x0, HDA_INPUT), | 1179 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x17, 0x0, HDA_INPUT), |
@@ -1173,8 +1186,6 @@ static struct snd_kcontrol_new stac922x_mixer[] = { | |||
1173 | 1186 | ||
1174 | 1187 | ||
1175 | static struct snd_kcontrol_new stac927x_mixer[] = { | 1188 | static struct snd_kcontrol_new stac927x_mixer[] = { |
1176 | STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1), | ||
1177 | |||
1178 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x18, 0x0, HDA_INPUT), | 1189 | HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x18, 0x0, HDA_INPUT), |
1179 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1b, 0x0, HDA_OUTPUT), | 1190 | HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1b, 0x0, HDA_OUTPUT), |
1180 | 1191 | ||
@@ -1186,6 +1197,11 @@ static struct snd_kcontrol_new stac927x_mixer[] = { | |||
1186 | { } /* end */ | 1197 | { } /* end */ |
1187 | }; | 1198 | }; |
1188 | 1199 | ||
1200 | static struct snd_kcontrol_new stac927x_loopback[] = { | ||
1201 | STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1), | ||
1202 | {} | ||
1203 | }; | ||
1204 | |||
1189 | static struct snd_kcontrol_new stac_dmux_mixer = { | 1205 | static struct snd_kcontrol_new stac_dmux_mixer = { |
1190 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 1206 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
1191 | .name = "Digital Input Source", | 1207 | .name = "Digital Input Source", |
@@ -1312,6 +1328,13 @@ static int stac92xx_build_controls(struct hda_codec *codec) | |||
1312 | return err; | 1328 | return err; |
1313 | } | 1329 | } |
1314 | 1330 | ||
1331 | if (spec->aloopback_ctl && | ||
1332 | snd_hda_get_bool_hint(codec, "loopback") == 1) { | ||
1333 | err = snd_hda_add_new_ctls(codec, spec->aloopback_ctl); | ||
1334 | if (err < 0) | ||
1335 | return err; | ||
1336 | } | ||
1337 | |||
1315 | stac92xx_free_kctls(codec); /* no longer needed */ | 1338 | stac92xx_free_kctls(codec); /* no longer needed */ |
1316 | 1339 | ||
1317 | /* create jack input elements */ | 1340 | /* create jack input elements */ |
@@ -4618,14 +4641,18 @@ again: | |||
4618 | case 0x3: /* 6 Channel */ | 4641 | case 0x3: /* 6 Channel */ |
4619 | spec->mixer = stac92hd73xx_6ch_mixer; | 4642 | spec->mixer = stac92hd73xx_6ch_mixer; |
4620 | spec->init = stac92hd73xx_6ch_core_init; | 4643 | spec->init = stac92hd73xx_6ch_core_init; |
4644 | spec->aloopback_ctl = stac92hd73xx_6ch_loopback; | ||
4621 | break; | 4645 | break; |
4622 | case 0x4: /* 8 Channel */ | 4646 | case 0x4: /* 8 Channel */ |
4623 | spec->mixer = stac92hd73xx_8ch_mixer; | 4647 | spec->mixer = stac92hd73xx_8ch_mixer; |
4624 | spec->init = stac92hd73xx_8ch_core_init; | 4648 | spec->init = stac92hd73xx_8ch_core_init; |
4649 | spec->aloopback_ctl = stac92hd73xx_8ch_loopback; | ||
4625 | break; | 4650 | break; |
4626 | case 0x5: /* 10 Channel */ | 4651 | case 0x5: /* 10 Channel */ |
4627 | spec->mixer = stac92hd73xx_10ch_mixer; | 4652 | spec->mixer = stac92hd73xx_10ch_mixer; |
4628 | spec->init = stac92hd73xx_10ch_core_init; | 4653 | spec->init = stac92hd73xx_10ch_core_init; |
4654 | spec->aloopback_ctl = stac92hd73xx_10ch_loopback; | ||
4655 | break; | ||
4629 | } | 4656 | } |
4630 | spec->multiout.dac_nids = spec->dac_nids; | 4657 | spec->multiout.dac_nids = spec->dac_nids; |
4631 | 4658 | ||
@@ -5036,6 +5063,7 @@ again: | |||
5036 | if (get_wcaps(codec, 0xa) & AC_WCAP_IN_AMP) | 5063 | if (get_wcaps(codec, 0xa) & AC_WCAP_IN_AMP) |
5037 | snd_hda_sequence_write_cache(codec, unmute_init); | 5064 | snd_hda_sequence_write_cache(codec, unmute_init); |
5038 | 5065 | ||
5066 | spec->aloopback_ctl = stac92hd71bxx_loopback; | ||
5039 | spec->aloopback_mask = 0x50; | 5067 | spec->aloopback_mask = 0x50; |
5040 | spec->aloopback_shift = 0; | 5068 | spec->aloopback_shift = 0; |
5041 | 5069 | ||
@@ -5285,6 +5313,7 @@ static int patch_stac927x(struct hda_codec *codec) | |||
5285 | } | 5313 | } |
5286 | 5314 | ||
5287 | spec->num_pwrs = 0; | 5315 | spec->num_pwrs = 0; |
5316 | spec->aloopback_ctl = stac927x_loopback; | ||
5288 | spec->aloopback_mask = 0x40; | 5317 | spec->aloopback_mask = 0x40; |
5289 | spec->aloopback_shift = 0; | 5318 | spec->aloopback_shift = 0; |
5290 | spec->eapd_switch = 1; | 5319 | spec->eapd_switch = 1; |
@@ -5364,6 +5393,7 @@ static int patch_stac9205(struct hda_codec *codec) | |||
5364 | 5393 | ||
5365 | spec->init = stac9205_core_init; | 5394 | spec->init = stac9205_core_init; |
5366 | spec->mixer = stac9205_mixer; | 5395 | spec->mixer = stac9205_mixer; |
5396 | spec->aloopback_ctl = stac9205_loopback; | ||
5367 | 5397 | ||
5368 | spec->aloopback_mask = 0x40; | 5398 | spec->aloopback_mask = 0x40; |
5369 | spec->aloopback_shift = 0; | 5399 | spec->aloopback_shift = 0; |