aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2009-03-02 08:26:25 -0500
committerTakashi Iwai <tiwai@suse.de>2009-03-02 11:30:00 -0500
commitd78d7a90adf793943cc29a414b6f4364a700aad5 (patch)
tree25d528df4b6a830a1c1a6001277bf9bd8f0827ea /sound/pci
parentab1726f920275b52991b2eff7538ac6d313bf9a2 (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.c56
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
1027static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = { 1026static struct snd_kcontrol_new stac92hd73xx_6ch_loopback[] = {
1027 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3),
1028 {}
1029};
1030
1031static 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
1036static struct snd_kcontrol_new stac92hd73xx_10ch_loopback[] = {
1037 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5),
1038 {}
1039};
1040
1041static 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
1053static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = { 1065static 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
1106static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = { 1116static 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
1134static struct snd_kcontrol_new stac92hd71bxx_mixer[] = { 1142static struct snd_kcontrol_new stac92hd71bxx_loopback[] = {
1135 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2), 1143 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2)
1144};
1136 1145
1146static 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
1153static struct snd_kcontrol_new stac9205_mixer[] = { 1163static 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
1172static 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 */
1165static struct snd_kcontrol_new stac922x_mixer[] = { 1178static 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
1175static struct snd_kcontrol_new stac927x_mixer[] = { 1188static 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
1200static struct snd_kcontrol_new stac927x_loopback[] = {
1201 STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1),
1202 {}
1203};
1204
1189static struct snd_kcontrol_new stac_dmux_mixer = { 1205static 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;