diff options
Diffstat (limited to 'sound/pci/hda/patch_analog.c')
-rw-r--r-- | sound/pci/hda/patch_analog.c | 265 |
1 files changed, 177 insertions, 88 deletions
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 2e7371ec2e23..84cc49ca9148 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
@@ -27,11 +27,12 @@ | |||
27 | #include <sound/core.h> | 27 | #include <sound/core.h> |
28 | #include "hda_codec.h" | 28 | #include "hda_codec.h" |
29 | #include "hda_local.h" | 29 | #include "hda_local.h" |
30 | #include "hda_beep.h" | ||
30 | 31 | ||
31 | struct ad198x_spec { | 32 | struct ad198x_spec { |
32 | struct snd_kcontrol_new *mixers[5]; | 33 | struct snd_kcontrol_new *mixers[5]; |
33 | int num_mixers; | 34 | int num_mixers; |
34 | 35 | unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */ | |
35 | const struct hda_verb *init_verbs[5]; /* initialization verbs | 36 | const struct hda_verb *init_verbs[5]; /* initialization verbs |
36 | * don't forget NULL termination! | 37 | * don't forget NULL termination! |
37 | */ | 38 | */ |
@@ -154,6 +155,16 @@ static const char *ad_slave_sws[] = { | |||
154 | 155 | ||
155 | static void ad198x_free_kctls(struct hda_codec *codec); | 156 | static void ad198x_free_kctls(struct hda_codec *codec); |
156 | 157 | ||
158 | /* additional beep mixers; the actual parameters are overwritten at build */ | ||
159 | static struct snd_kcontrol_new ad_beep_mixer[] = { | ||
160 | HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_OUTPUT), | ||
161 | HDA_CODEC_MUTE("Beep Playback Switch", 0, 0, HDA_OUTPUT), | ||
162 | { } /* end */ | ||
163 | }; | ||
164 | |||
165 | #define set_beep_amp(spec, nid, idx, dir) \ | ||
166 | ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 1, idx, dir)) /* mono */ | ||
167 | |||
157 | static int ad198x_build_controls(struct hda_codec *codec) | 168 | static int ad198x_build_controls(struct hda_codec *codec) |
158 | { | 169 | { |
159 | struct ad198x_spec *spec = codec->spec; | 170 | struct ad198x_spec *spec = codec->spec; |
@@ -181,6 +192,21 @@ static int ad198x_build_controls(struct hda_codec *codec) | |||
181 | return err; | 192 | return err; |
182 | } | 193 | } |
183 | 194 | ||
195 | /* create beep controls if needed */ | ||
196 | if (spec->beep_amp) { | ||
197 | struct snd_kcontrol_new *knew; | ||
198 | for (knew = ad_beep_mixer; knew->name; knew++) { | ||
199 | struct snd_kcontrol *kctl; | ||
200 | kctl = snd_ctl_new1(knew, codec); | ||
201 | if (!kctl) | ||
202 | return -ENOMEM; | ||
203 | kctl->private_value = spec->beep_amp; | ||
204 | err = snd_hda_ctl_add(codec, kctl); | ||
205 | if (err < 0) | ||
206 | return err; | ||
207 | } | ||
208 | } | ||
209 | |||
184 | /* if we have no master control, let's create it */ | 210 | /* if we have no master control, let's create it */ |
185 | if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) { | 211 | if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) { |
186 | unsigned int vmaster_tlv[4]; | 212 | unsigned int vmaster_tlv[4]; |
@@ -275,6 +301,14 @@ static int ad198x_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo, | |||
275 | format, substream); | 301 | format, substream); |
276 | } | 302 | } |
277 | 303 | ||
304 | static int ad198x_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, | ||
305 | struct hda_codec *codec, | ||
306 | struct snd_pcm_substream *substream) | ||
307 | { | ||
308 | struct ad198x_spec *spec = codec->spec; | ||
309 | return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout); | ||
310 | } | ||
311 | |||
278 | /* | 312 | /* |
279 | * Analog capture | 313 | * Analog capture |
280 | */ | 314 | */ |
@@ -333,7 +367,8 @@ static struct hda_pcm_stream ad198x_pcm_digital_playback = { | |||
333 | .ops = { | 367 | .ops = { |
334 | .open = ad198x_dig_playback_pcm_open, | 368 | .open = ad198x_dig_playback_pcm_open, |
335 | .close = ad198x_dig_playback_pcm_close, | 369 | .close = ad198x_dig_playback_pcm_close, |
336 | .prepare = ad198x_dig_playback_pcm_prepare | 370 | .prepare = ad198x_dig_playback_pcm_prepare, |
371 | .cleanup = ad198x_dig_playback_pcm_cleanup | ||
337 | }, | 372 | }, |
338 | }; | 373 | }; |
339 | 374 | ||
@@ -397,7 +432,8 @@ static void ad198x_free(struct hda_codec *codec) | |||
397 | return; | 432 | return; |
398 | 433 | ||
399 | ad198x_free_kctls(codec); | 434 | ad198x_free_kctls(codec); |
400 | kfree(codec->spec); | 435 | kfree(spec); |
436 | snd_hda_detach_beep_device(codec); | ||
401 | } | 437 | } |
402 | 438 | ||
403 | static struct hda_codec_ops ad198x_patch_ops = { | 439 | static struct hda_codec_ops ad198x_patch_ops = { |
@@ -536,8 +572,6 @@ static struct snd_kcontrol_new ad1986a_mixers[] = { | |||
536 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), | 572 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), |
537 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), | 573 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), |
538 | HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), | 574 | HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), |
539 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x18, 0x0, HDA_OUTPUT), | ||
540 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x18, 0x0, HDA_OUTPUT), | ||
541 | HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT), | 575 | HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT), |
542 | HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), | 576 | HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), |
543 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), | 577 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), |
@@ -601,8 +635,7 @@ static struct snd_kcontrol_new ad1986a_laptop_mixers[] = { | |||
601 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), | 635 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), |
602 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), | 636 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), |
603 | HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), | 637 | HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), |
604 | /* HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x18, 0x0, HDA_OUTPUT), | 638 | /* |
605 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x18, 0x0, HDA_OUTPUT), | ||
606 | HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT), | 639 | HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT), |
607 | HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), */ | 640 | HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), */ |
608 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), | 641 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), |
@@ -800,8 +833,6 @@ static struct snd_kcontrol_new ad1986a_laptop_automute_mixers[] = { | |||
800 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), | 833 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), |
801 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), | 834 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), |
802 | HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), | 835 | HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), |
803 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x18, 0x0, HDA_OUTPUT), | ||
804 | HDA_CODEC_MUTE("Beep Playback Switch", 0x18, 0x0, HDA_OUTPUT), | ||
805 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), | 836 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), |
806 | HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT), | 837 | HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT), |
807 | { | 838 | { |
@@ -993,10 +1024,8 @@ static struct snd_pci_quirk ad1986a_cfg_tbl[] = { | |||
993 | SND_PCI_QUIRK(0x1179, 0xff40, "Toshiba", AD1986A_LAPTOP_EAPD), | 1024 | SND_PCI_QUIRK(0x1179, 0xff40, "Toshiba", AD1986A_LAPTOP_EAPD), |
994 | SND_PCI_QUIRK(0x144d, 0xb03c, "Samsung R55", AD1986A_3STACK), | 1025 | SND_PCI_QUIRK(0x144d, 0xb03c, "Samsung R55", AD1986A_3STACK), |
995 | SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_LAPTOP), | 1026 | SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_LAPTOP), |
996 | SND_PCI_QUIRK(0x144d, 0xc023, "Samsung X60", AD1986A_SAMSUNG), | ||
997 | SND_PCI_QUIRK(0x144d, 0xc024, "Samsung R65", AD1986A_SAMSUNG), | ||
998 | SND_PCI_QUIRK(0x144d, 0xc026, "Samsung X11", AD1986A_SAMSUNG), | ||
999 | SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_ULTRA), | 1027 | SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_ULTRA), |
1028 | SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc000, "Samsung", AD1986A_SAMSUNG), | ||
1000 | SND_PCI_QUIRK(0x144d, 0xc504, "Samsung Q35", AD1986A_3STACK), | 1029 | SND_PCI_QUIRK(0x144d, 0xc504, "Samsung Q35", AD1986A_3STACK), |
1001 | SND_PCI_QUIRK(0x17aa, 0x1011, "Lenovo M55", AD1986A_LAPTOP), | 1030 | SND_PCI_QUIRK(0x17aa, 0x1011, "Lenovo M55", AD1986A_LAPTOP), |
1002 | SND_PCI_QUIRK(0x17aa, 0x1017, "Lenovo A60", AD1986A_3STACK), | 1031 | SND_PCI_QUIRK(0x17aa, 0x1017, "Lenovo A60", AD1986A_3STACK), |
@@ -1018,15 +1047,14 @@ static struct hda_amp_list ad1986a_loopbacks[] = { | |||
1018 | 1047 | ||
1019 | static int is_jack_available(struct hda_codec *codec, hda_nid_t nid) | 1048 | static int is_jack_available(struct hda_codec *codec, hda_nid_t nid) |
1020 | { | 1049 | { |
1021 | unsigned int conf = snd_hda_codec_read(codec, nid, 0, | 1050 | unsigned int conf = snd_hda_codec_get_pincfg(codec, nid); |
1022 | AC_VERB_GET_CONFIG_DEFAULT, 0); | ||
1023 | return get_defcfg_connect(conf) != AC_JACK_PORT_NONE; | 1051 | return get_defcfg_connect(conf) != AC_JACK_PORT_NONE; |
1024 | } | 1052 | } |
1025 | 1053 | ||
1026 | static int patch_ad1986a(struct hda_codec *codec) | 1054 | static int patch_ad1986a(struct hda_codec *codec) |
1027 | { | 1055 | { |
1028 | struct ad198x_spec *spec; | 1056 | struct ad198x_spec *spec; |
1029 | int board_config; | 1057 | int err, board_config; |
1030 | 1058 | ||
1031 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 1059 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
1032 | if (spec == NULL) | 1060 | if (spec == NULL) |
@@ -1034,6 +1062,13 @@ static int patch_ad1986a(struct hda_codec *codec) | |||
1034 | 1062 | ||
1035 | codec->spec = spec; | 1063 | codec->spec = spec; |
1036 | 1064 | ||
1065 | err = snd_hda_attach_beep_device(codec, 0x19); | ||
1066 | if (err < 0) { | ||
1067 | ad198x_free(codec); | ||
1068 | return err; | ||
1069 | } | ||
1070 | set_beep_amp(spec, 0x18, 0, HDA_OUTPUT); | ||
1071 | |||
1037 | spec->multiout.max_channels = 6; | 1072 | spec->multiout.max_channels = 6; |
1038 | spec->multiout.num_dacs = ARRAY_SIZE(ad1986a_dac_nids); | 1073 | spec->multiout.num_dacs = ARRAY_SIZE(ad1986a_dac_nids); |
1039 | spec->multiout.dac_nids = ad1986a_dac_nids; | 1074 | spec->multiout.dac_nids = ad1986a_dac_nids; |
@@ -1213,8 +1248,6 @@ static struct snd_kcontrol_new ad1983_mixers[] = { | |||
1213 | HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT), | 1248 | HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT), |
1214 | HDA_CODEC_VOLUME("Line Playback Volume", 0x13, 0x0, HDA_OUTPUT), | 1249 | HDA_CODEC_VOLUME("Line Playback Volume", 0x13, 0x0, HDA_OUTPUT), |
1215 | HDA_CODEC_MUTE("Line Playback Switch", 0x13, 0x0, HDA_OUTPUT), | 1250 | HDA_CODEC_MUTE("Line Playback Switch", 0x13, 0x0, HDA_OUTPUT), |
1216 | HDA_CODEC_VOLUME_MONO("PC Speaker Playback Volume", 0x10, 1, 0x0, HDA_OUTPUT), | ||
1217 | HDA_CODEC_MUTE_MONO("PC Speaker Playback Switch", 0x10, 1, 0x0, HDA_OUTPUT), | ||
1218 | HDA_CODEC_VOLUME("Mic Boost", 0x0c, 0x0, HDA_OUTPUT), | 1251 | HDA_CODEC_VOLUME("Mic Boost", 0x0c, 0x0, HDA_OUTPUT), |
1219 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), | 1252 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), |
1220 | HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT), | 1253 | HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT), |
@@ -1285,6 +1318,7 @@ static struct hda_amp_list ad1983_loopbacks[] = { | |||
1285 | static int patch_ad1983(struct hda_codec *codec) | 1318 | static int patch_ad1983(struct hda_codec *codec) |
1286 | { | 1319 | { |
1287 | struct ad198x_spec *spec; | 1320 | struct ad198x_spec *spec; |
1321 | int err; | ||
1288 | 1322 | ||
1289 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 1323 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
1290 | if (spec == NULL) | 1324 | if (spec == NULL) |
@@ -1292,6 +1326,13 @@ static int patch_ad1983(struct hda_codec *codec) | |||
1292 | 1326 | ||
1293 | codec->spec = spec; | 1327 | codec->spec = spec; |
1294 | 1328 | ||
1329 | err = snd_hda_attach_beep_device(codec, 0x10); | ||
1330 | if (err < 0) { | ||
1331 | ad198x_free(codec); | ||
1332 | return err; | ||
1333 | } | ||
1334 | set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); | ||
1335 | |||
1295 | spec->multiout.max_channels = 2; | 1336 | spec->multiout.max_channels = 2; |
1296 | spec->multiout.num_dacs = ARRAY_SIZE(ad1983_dac_nids); | 1337 | spec->multiout.num_dacs = ARRAY_SIZE(ad1983_dac_nids); |
1297 | spec->multiout.dac_nids = ad1983_dac_nids; | 1338 | spec->multiout.dac_nids = ad1983_dac_nids; |
@@ -1361,8 +1402,6 @@ static struct snd_kcontrol_new ad1981_mixers[] = { | |||
1361 | HDA_CODEC_MUTE("Mic Playback Switch", 0x1c, 0x0, HDA_OUTPUT), | 1402 | HDA_CODEC_MUTE("Mic Playback Switch", 0x1c, 0x0, HDA_OUTPUT), |
1362 | HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT), | 1403 | HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT), |
1363 | HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT), | 1404 | HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT), |
1364 | HDA_CODEC_VOLUME_MONO("PC Speaker Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT), | ||
1365 | HDA_CODEC_MUTE_MONO("PC Speaker Playback Switch", 0x0d, 1, 0x0, HDA_OUTPUT), | ||
1366 | HDA_CODEC_VOLUME("Front Mic Boost", 0x08, 0x0, HDA_INPUT), | 1405 | HDA_CODEC_VOLUME("Front Mic Boost", 0x08, 0x0, HDA_INPUT), |
1367 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x0, HDA_INPUT), | 1406 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x0, HDA_INPUT), |
1368 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), | 1407 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), |
@@ -1407,8 +1446,8 @@ static struct hda_verb ad1981_init_verbs[] = { | |||
1407 | {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, | 1446 | {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, |
1408 | {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, | 1447 | {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, |
1409 | /* Mic boost: 0dB */ | 1448 | /* Mic boost: 0dB */ |
1410 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, | 1449 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
1411 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, | 1450 | {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
1412 | /* Record selector: Front mic */ | 1451 | /* Record selector: Front mic */ |
1413 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x0}, | 1452 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x0}, |
1414 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, | 1453 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, |
@@ -1673,10 +1712,10 @@ static struct snd_pci_quirk ad1981_cfg_tbl[] = { | |||
1673 | SND_PCI_QUIRK(0x1014, 0x0597, "Lenovo Z60", AD1981_THINKPAD), | 1712 | SND_PCI_QUIRK(0x1014, 0x0597, "Lenovo Z60", AD1981_THINKPAD), |
1674 | SND_PCI_QUIRK(0x1014, 0x05b7, "Lenovo Z60m", AD1981_THINKPAD), | 1713 | SND_PCI_QUIRK(0x1014, 0x05b7, "Lenovo Z60m", AD1981_THINKPAD), |
1675 | /* All HP models */ | 1714 | /* All HP models */ |
1676 | SND_PCI_QUIRK(0x103c, 0, "HP nx", AD1981_HP), | 1715 | SND_PCI_QUIRK_VENDOR(0x103c, "HP nx", AD1981_HP), |
1677 | SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba U205", AD1981_TOSHIBA), | 1716 | SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba U205", AD1981_TOSHIBA), |
1678 | /* Lenovo Thinkpad T60/X60/Z6xx */ | 1717 | /* Lenovo Thinkpad T60/X60/Z6xx */ |
1679 | SND_PCI_QUIRK(0x17aa, 0, "Lenovo Thinkpad", AD1981_THINKPAD), | 1718 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1981_THINKPAD), |
1680 | /* HP nx6320 (reversed SSID, H/W bug) */ | 1719 | /* HP nx6320 (reversed SSID, H/W bug) */ |
1681 | SND_PCI_QUIRK(0x30b0, 0x103c, "HP nx6320", AD1981_HP), | 1720 | SND_PCI_QUIRK(0x30b0, 0x103c, "HP nx6320", AD1981_HP), |
1682 | {} | 1721 | {} |
@@ -1685,7 +1724,7 @@ static struct snd_pci_quirk ad1981_cfg_tbl[] = { | |||
1685 | static int patch_ad1981(struct hda_codec *codec) | 1724 | static int patch_ad1981(struct hda_codec *codec) |
1686 | { | 1725 | { |
1687 | struct ad198x_spec *spec; | 1726 | struct ad198x_spec *spec; |
1688 | int board_config; | 1727 | int err, board_config; |
1689 | 1728 | ||
1690 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 1729 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
1691 | if (spec == NULL) | 1730 | if (spec == NULL) |
@@ -1693,6 +1732,13 @@ static int patch_ad1981(struct hda_codec *codec) | |||
1693 | 1732 | ||
1694 | codec->spec = spec; | 1733 | codec->spec = spec; |
1695 | 1734 | ||
1735 | err = snd_hda_attach_beep_device(codec, 0x10); | ||
1736 | if (err < 0) { | ||
1737 | ad198x_free(codec); | ||
1738 | return err; | ||
1739 | } | ||
1740 | set_beep_amp(spec, 0x0d, 0, HDA_OUTPUT); | ||
1741 | |||
1696 | spec->multiout.max_channels = 2; | 1742 | spec->multiout.max_channels = 2; |
1697 | spec->multiout.num_dacs = ARRAY_SIZE(ad1981_dac_nids); | 1743 | spec->multiout.num_dacs = ARRAY_SIZE(ad1981_dac_nids); |
1698 | spec->multiout.dac_nids = ad1981_dac_nids; | 1744 | spec->multiout.dac_nids = ad1981_dac_nids; |
@@ -1885,8 +1931,8 @@ static hda_nid_t ad1988_capsrc_nids[3] = { | |||
1885 | #define AD1988_SPDIF_OUT_HDMI 0x0b | 1931 | #define AD1988_SPDIF_OUT_HDMI 0x0b |
1886 | #define AD1988_SPDIF_IN 0x07 | 1932 | #define AD1988_SPDIF_IN 0x07 |
1887 | 1933 | ||
1888 | static hda_nid_t ad1989b_slave_dig_outs[2] = { | 1934 | static hda_nid_t ad1989b_slave_dig_outs[] = { |
1889 | AD1988_SPDIF_OUT, AD1988_SPDIF_OUT_HDMI | 1935 | AD1988_SPDIF_OUT, AD1988_SPDIF_OUT_HDMI, 0 |
1890 | }; | 1936 | }; |
1891 | 1937 | ||
1892 | static struct hda_input_mux ad1988_6stack_capture_source = { | 1938 | static struct hda_input_mux ad1988_6stack_capture_source = { |
@@ -1979,9 +2025,6 @@ static struct snd_kcontrol_new ad1988_6stack_mixers2[] = { | |||
1979 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT), | 2025 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT), |
1980 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT), | 2026 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT), |
1981 | 2027 | ||
1982 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT), | ||
1983 | HDA_CODEC_MUTE("Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT), | ||
1984 | |||
1985 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), | 2028 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), |
1986 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), | 2029 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), |
1987 | 2030 | ||
@@ -2025,9 +2068,6 @@ static struct snd_kcontrol_new ad1988_3stack_mixers2[] = { | |||
2025 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT), | 2068 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x4, HDA_INPUT), |
2026 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT), | 2069 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x4, HDA_INPUT), |
2027 | 2070 | ||
2028 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT), | ||
2029 | HDA_CODEC_MUTE("Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT), | ||
2030 | |||
2031 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), | 2071 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), |
2032 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), | 2072 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), |
2033 | 2073 | ||
@@ -2057,9 +2097,6 @@ static struct snd_kcontrol_new ad1988_laptop_mixers[] = { | |||
2057 | HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT), | 2097 | HDA_CODEC_VOLUME("Line Playback Volume", 0x20, 0x1, HDA_INPUT), |
2058 | HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT), | 2098 | HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x1, HDA_INPUT), |
2059 | 2099 | ||
2060 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT), | ||
2061 | HDA_CODEC_MUTE("Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT), | ||
2062 | |||
2063 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), | 2100 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), |
2064 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), | 2101 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), |
2065 | 2102 | ||
@@ -2288,10 +2325,6 @@ static struct hda_verb ad1988_capture_init_verbs[] = { | |||
2288 | {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2325 | {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2289 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2326 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2290 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2327 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2291 | /* ADCs; muted */ | ||
2292 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2293 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2294 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2295 | 2328 | ||
2296 | { } | 2329 | { } |
2297 | }; | 2330 | }; |
@@ -2399,10 +2432,6 @@ static struct hda_verb ad1988_3stack_init_verbs[] = { | |||
2399 | {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2432 | {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2400 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2433 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2401 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2434 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2402 | /* ADCs; muted */ | ||
2403 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2404 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2405 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2406 | /* Analog Mix output amp */ | 2435 | /* Analog Mix output amp */ |
2407 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */ | 2436 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */ |
2408 | { } | 2437 | { } |
@@ -2474,10 +2503,6 @@ static struct hda_verb ad1988_laptop_init_verbs[] = { | |||
2474 | {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2503 | {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2475 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2504 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2476 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, | 2505 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, |
2477 | /* ADCs; muted */ | ||
2478 | {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2479 | {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2480 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
2481 | /* Analog Mix output amp */ | 2506 | /* Analog Mix output amp */ |
2482 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */ | 2507 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */ |
2483 | { } | 2508 | { } |
@@ -2881,7 +2906,7 @@ static int ad1988_parse_auto_config(struct hda_codec *codec) | |||
2881 | 2906 | ||
2882 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; | 2907 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
2883 | 2908 | ||
2884 | if (spec->autocfg.dig_out_pin) | 2909 | if (spec->autocfg.dig_outs) |
2885 | spec->multiout.dig_out_nid = AD1988_SPDIF_OUT; | 2910 | spec->multiout.dig_out_nid = AD1988_SPDIF_OUT; |
2886 | if (spec->autocfg.dig_in_pin) | 2911 | if (spec->autocfg.dig_in_pin) |
2887 | spec->dig_in_nid = AD1988_SPDIF_IN; | 2912 | spec->dig_in_nid = AD1988_SPDIF_IN; |
@@ -2931,7 +2956,7 @@ static struct snd_pci_quirk ad1988_cfg_tbl[] = { | |||
2931 | static int patch_ad1988(struct hda_codec *codec) | 2956 | static int patch_ad1988(struct hda_codec *codec) |
2932 | { | 2957 | { |
2933 | struct ad198x_spec *spec; | 2958 | struct ad198x_spec *spec; |
2934 | int board_config; | 2959 | int err, board_config; |
2935 | 2960 | ||
2936 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 2961 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
2937 | if (spec == NULL) | 2962 | if (spec == NULL) |
@@ -2951,7 +2976,7 @@ static int patch_ad1988(struct hda_codec *codec) | |||
2951 | 2976 | ||
2952 | if (board_config == AD1988_AUTO) { | 2977 | if (board_config == AD1988_AUTO) { |
2953 | /* automatic parse from the BIOS config */ | 2978 | /* automatic parse from the BIOS config */ |
2954 | int err = ad1988_parse_auto_config(codec); | 2979 | err = ad1988_parse_auto_config(codec); |
2955 | if (err < 0) { | 2980 | if (err < 0) { |
2956 | ad198x_free(codec); | 2981 | ad198x_free(codec); |
2957 | return err; | 2982 | return err; |
@@ -2961,6 +2986,13 @@ static int patch_ad1988(struct hda_codec *codec) | |||
2961 | } | 2986 | } |
2962 | } | 2987 | } |
2963 | 2988 | ||
2989 | err = snd_hda_attach_beep_device(codec, 0x10); | ||
2990 | if (err < 0) { | ||
2991 | ad198x_free(codec); | ||
2992 | return err; | ||
2993 | } | ||
2994 | set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); | ||
2995 | |||
2964 | switch (board_config) { | 2996 | switch (board_config) { |
2965 | case AD1988_6STACK: | 2997 | case AD1988_6STACK: |
2966 | case AD1988_6STACK_DIG: | 2998 | case AD1988_6STACK_DIG: |
@@ -3117,12 +3149,6 @@ static struct snd_kcontrol_new ad1884_base_mixers[] = { | |||
3117 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x01, HDA_INPUT), | 3149 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x01, HDA_INPUT), |
3118 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT), | 3150 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT), |
3119 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT), | 3151 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT), |
3120 | /* | ||
3121 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x20, 0x03, HDA_INPUT), | ||
3122 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x20, 0x03, HDA_INPUT), | ||
3123 | HDA_CODEC_VOLUME("Digital Beep Playback Volume", 0x10, 0x0, HDA_OUTPUT), | ||
3124 | HDA_CODEC_MUTE("Digital Beep Playback Switch", 0x10, 0x0, HDA_OUTPUT), | ||
3125 | */ | ||
3126 | HDA_CODEC_VOLUME("Mic Boost", 0x15, 0x0, HDA_INPUT), | 3152 | HDA_CODEC_VOLUME("Mic Boost", 0x15, 0x0, HDA_INPUT), |
3127 | HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT), | 3153 | HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT), |
3128 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 3154 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
@@ -3195,10 +3221,10 @@ static struct hda_verb ad1884_init_verbs[] = { | |||
3195 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, | 3221 | {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1}, |
3196 | /* Port-B (front mic) pin */ | 3222 | /* Port-B (front mic) pin */ |
3197 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 3223 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
3198 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3224 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
3199 | /* Port-C (rear mic) pin */ | 3225 | /* Port-C (rear mic) pin */ |
3200 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 3226 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
3201 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3227 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
3202 | /* Analog mixer; mute as default */ | 3228 | /* Analog mixer; mute as default */ |
3203 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 3229 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
3204 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | 3230 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, |
@@ -3230,8 +3256,8 @@ static const char *ad1884_slave_vols[] = { | |||
3230 | "Mic Playback Volume", | 3256 | "Mic Playback Volume", |
3231 | "CD Playback Volume", | 3257 | "CD Playback Volume", |
3232 | "Internal Mic Playback Volume", | 3258 | "Internal Mic Playback Volume", |
3233 | "Docking Mic Playback Volume" | 3259 | "Docking Mic Playback Volume", |
3234 | "Beep Playback Volume", | 3260 | /* "Beep Playback Volume", */ |
3235 | "IEC958 Playback Volume", | 3261 | "IEC958 Playback Volume", |
3236 | NULL | 3262 | NULL |
3237 | }; | 3263 | }; |
@@ -3239,6 +3265,7 @@ static const char *ad1884_slave_vols[] = { | |||
3239 | static int patch_ad1884(struct hda_codec *codec) | 3265 | static int patch_ad1884(struct hda_codec *codec) |
3240 | { | 3266 | { |
3241 | struct ad198x_spec *spec; | 3267 | struct ad198x_spec *spec; |
3268 | int err; | ||
3242 | 3269 | ||
3243 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 3270 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
3244 | if (spec == NULL) | 3271 | if (spec == NULL) |
@@ -3246,6 +3273,13 @@ static int patch_ad1884(struct hda_codec *codec) | |||
3246 | 3273 | ||
3247 | codec->spec = spec; | 3274 | codec->spec = spec; |
3248 | 3275 | ||
3276 | err = snd_hda_attach_beep_device(codec, 0x10); | ||
3277 | if (err < 0) { | ||
3278 | ad198x_free(codec); | ||
3279 | return err; | ||
3280 | } | ||
3281 | set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); | ||
3282 | |||
3249 | spec->multiout.max_channels = 2; | 3283 | spec->multiout.max_channels = 2; |
3250 | spec->multiout.num_dacs = ARRAY_SIZE(ad1884_dac_nids); | 3284 | spec->multiout.num_dacs = ARRAY_SIZE(ad1884_dac_nids); |
3251 | spec->multiout.dac_nids = ad1884_dac_nids; | 3285 | spec->multiout.dac_nids = ad1884_dac_nids; |
@@ -3312,8 +3346,6 @@ static struct snd_kcontrol_new ad1984_thinkpad_mixers[] = { | |||
3312 | HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT), | 3346 | HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT), |
3313 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x15, 0x0, HDA_INPUT), | 3347 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x15, 0x0, HDA_INPUT), |
3314 | HDA_CODEC_VOLUME("Docking Mic Boost", 0x25, 0x0, HDA_OUTPUT), | 3348 | HDA_CODEC_VOLUME("Docking Mic Boost", 0x25, 0x0, HDA_OUTPUT), |
3315 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x03, HDA_INPUT), | ||
3316 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT), | ||
3317 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 3349 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
3318 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), | 3350 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), |
3319 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), | 3351 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), |
@@ -3349,7 +3381,7 @@ static struct hda_verb ad1984_thinkpad_init_verbs[] = { | |||
3349 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 3381 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
3350 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3382 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
3351 | /* docking mic boost */ | 3383 | /* docking mic boost */ |
3352 | {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3384 | {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, |
3353 | /* Analog mixer - docking mic; mute as default */ | 3385 | /* Analog mixer - docking mic; mute as default */ |
3354 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | 3386 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, |
3355 | /* enable EAPD bit */ | 3387 | /* enable EAPD bit */ |
@@ -3370,10 +3402,6 @@ static struct snd_kcontrol_new ad1984_dell_desktop_mixers[] = { | |||
3370 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT), | 3402 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT), |
3371 | HDA_CODEC_VOLUME("Line-In Playback Volume", 0x20, 0x01, HDA_INPUT), | 3403 | HDA_CODEC_VOLUME("Line-In Playback Volume", 0x20, 0x01, HDA_INPUT), |
3372 | HDA_CODEC_MUTE("Line-In Playback Switch", 0x20, 0x01, HDA_INPUT), | 3404 | HDA_CODEC_MUTE("Line-In Playback Switch", 0x20, 0x01, HDA_INPUT), |
3373 | /* | ||
3374 | HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x20, 0x03, HDA_INPUT), | ||
3375 | HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x20, 0x03, HDA_INPUT), | ||
3376 | */ | ||
3377 | HDA_CODEC_VOLUME("Line-In Boost", 0x15, 0x0, HDA_INPUT), | 3405 | HDA_CODEC_VOLUME("Line-In Boost", 0x15, 0x0, HDA_INPUT), |
3378 | HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT), | 3406 | HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT), |
3379 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 3407 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
@@ -3459,7 +3487,7 @@ static const char *ad1984_models[AD1984_MODELS] = { | |||
3459 | 3487 | ||
3460 | static struct snd_pci_quirk ad1984_cfg_tbl[] = { | 3488 | static struct snd_pci_quirk ad1984_cfg_tbl[] = { |
3461 | /* Lenovo Thinkpad T61/X61 */ | 3489 | /* Lenovo Thinkpad T61/X61 */ |
3462 | SND_PCI_QUIRK(0x17aa, 0, "Lenovo Thinkpad", AD1984_THINKPAD), | 3490 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1984_THINKPAD), |
3463 | SND_PCI_QUIRK(0x1028, 0x0214, "Dell T3400", AD1984_DELL_DESKTOP), | 3491 | SND_PCI_QUIRK(0x1028, 0x0214, "Dell T3400", AD1984_DELL_DESKTOP), |
3464 | {} | 3492 | {} |
3465 | }; | 3493 | }; |
@@ -3552,8 +3580,6 @@ static struct snd_kcontrol_new ad1884a_base_mixers[] = { | |||
3552 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x04, HDA_INPUT), | 3580 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x04, HDA_INPUT), |
3553 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT), | 3581 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT), |
3554 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT), | 3582 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT), |
3555 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x03, HDA_INPUT), | ||
3556 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT), | ||
3557 | HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT), | 3583 | HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT), |
3558 | HDA_CODEC_VOLUME("Line Boost", 0x15, 0x0, HDA_INPUT), | 3584 | HDA_CODEC_VOLUME("Line Boost", 0x15, 0x0, HDA_INPUT), |
3559 | HDA_CODEC_VOLUME("Mic Boost", 0x25, 0x0, HDA_OUTPUT), | 3585 | HDA_CODEC_VOLUME("Mic Boost", 0x25, 0x0, HDA_OUTPUT), |
@@ -3613,10 +3639,10 @@ static struct hda_verb ad1884a_init_verbs[] = { | |||
3613 | {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3639 | {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
3614 | /* Port-B (front mic) pin */ | 3640 | /* Port-B (front mic) pin */ |
3615 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 3641 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
3616 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3642 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
3617 | /* Port-C (rear line-in) pin */ | 3643 | /* Port-C (rear line-in) pin */ |
3618 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | 3644 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, |
3619 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3645 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
3620 | /* Port-E (rear mic) pin */ | 3646 | /* Port-E (rear mic) pin */ |
3621 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 3647 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
3622 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3648 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
@@ -3686,8 +3712,6 @@ static struct snd_kcontrol_new ad1884a_laptop_mixers[] = { | |||
3686 | HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x20, 0x01, HDA_INPUT), | 3712 | HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x20, 0x01, HDA_INPUT), |
3687 | HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x20, 0x04, HDA_INPUT), | 3713 | HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x20, 0x04, HDA_INPUT), |
3688 | HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x20, 0x04, HDA_INPUT), | 3714 | HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x20, 0x04, HDA_INPUT), |
3689 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x03, HDA_INPUT), | ||
3690 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT), | ||
3691 | HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT), | 3715 | HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT), |
3692 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x15, 0x0, HDA_INPUT), | 3716 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x15, 0x0, HDA_INPUT), |
3693 | HDA_CODEC_VOLUME("Dock Mic Boost", 0x25, 0x0, HDA_OUTPUT), | 3717 | HDA_CODEC_VOLUME("Dock Mic Boost", 0x25, 0x0, HDA_OUTPUT), |
@@ -3715,8 +3739,6 @@ static struct snd_kcontrol_new ad1884a_mobile_mixers[] = { | |||
3715 | HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT), | 3739 | HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT), |
3716 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT), | 3740 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT), |
3717 | HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), | 3741 | HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), |
3718 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x03, HDA_INPUT), | ||
3719 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT), | ||
3720 | HDA_CODEC_VOLUME("Mic Capture Volume", 0x14, 0x0, HDA_INPUT), | 3742 | HDA_CODEC_VOLUME("Mic Capture Volume", 0x14, 0x0, HDA_INPUT), |
3721 | HDA_CODEC_VOLUME("Internal Mic Capture Volume", 0x15, 0x0, HDA_INPUT), | 3743 | HDA_CODEC_VOLUME("Internal Mic Capture Volume", 0x15, 0x0, HDA_INPUT), |
3722 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 3744 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
@@ -3795,6 +3817,49 @@ static struct hda_verb ad1884a_laptop_verbs[] = { | |||
3795 | { } /* end */ | 3817 | { } /* end */ |
3796 | }; | 3818 | }; |
3797 | 3819 | ||
3820 | static struct hda_verb ad1884a_mobile_verbs[] = { | ||
3821 | /* DACs; unmute as default */ | ||
3822 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ | ||
3823 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ | ||
3824 | /* Port-A (HP) mixer - route only from analog mixer */ | ||
3825 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
3826 | {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
3827 | /* Port-A pin */ | ||
3828 | {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
3829 | /* Port-A (HP) pin - always unmuted */ | ||
3830 | {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
3831 | /* Port-B (mic jack) pin */ | ||
3832 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
3833 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */ | ||
3834 | /* Port-C (int mic) pin */ | ||
3835 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
3836 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */ | ||
3837 | /* Port-F (int speaker) mixer - route only from analog mixer */ | ||
3838 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
3839 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
3840 | /* Port-F pin */ | ||
3841 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
3842 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
3843 | /* Analog mixer; mute as default */ | ||
3844 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
3845 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
3846 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
3847 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
3848 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
3849 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, | ||
3850 | /* Analog Mix output amp */ | ||
3851 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
3852 | /* capture sources */ | ||
3853 | /* {0x0c, AC_VERB_SET_CONNECT_SEL, 0x0}, */ /* set via unsol */ | ||
3854 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
3855 | {0x0d, AC_VERB_SET_CONNECT_SEL, 0x0}, | ||
3856 | {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | ||
3857 | /* unsolicited event for pin-sense */ | ||
3858 | {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT}, | ||
3859 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT}, | ||
3860 | { } /* end */ | ||
3861 | }; | ||
3862 | |||
3798 | /* | 3863 | /* |
3799 | * Thinkpad X300 | 3864 | * Thinkpad X300 |
3800 | * 0x11 - HP | 3865 | * 0x11 - HP |
@@ -3827,8 +3892,6 @@ static struct snd_kcontrol_new ad1984a_thinkpad_mixers[] = { | |||
3827 | HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), | 3892 | HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), |
3828 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x00, HDA_INPUT), | 3893 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x00, HDA_INPUT), |
3829 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x00, HDA_INPUT), | 3894 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x00, HDA_INPUT), |
3830 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x03, HDA_INPUT), | ||
3831 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT), | ||
3832 | HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT), | 3895 | HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT), |
3833 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x17, 0x0, HDA_INPUT), | 3896 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x17, 0x0, HDA_INPUT), |
3834 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 3897 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
@@ -3902,9 +3965,9 @@ static struct snd_pci_quirk ad1884a_cfg_tbl[] = { | |||
3902 | SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE), | 3965 | SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE), |
3903 | SND_PCI_QUIRK(0x103c, 0x3037, "HP 2230s", AD1884A_LAPTOP), | 3966 | SND_PCI_QUIRK(0x103c, 0x3037, "HP 2230s", AD1884A_LAPTOP), |
3904 | SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE), | 3967 | SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE), |
3905 | SND_PCI_QUIRK(0x103c, 0x30e6, "HP 6730b", AD1884A_LAPTOP), | 3968 | SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x3070, "HP", AD1884A_MOBILE), |
3906 | SND_PCI_QUIRK(0x103c, 0x30e7, "HP EliteBook 8530p", AD1884A_LAPTOP), | 3969 | SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30e0, "HP laptop", AD1884A_LAPTOP), |
3907 | SND_PCI_QUIRK(0x103c, 0x3614, "HP 6730s", AD1884A_LAPTOP), | 3970 | SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3600, "HP laptop", AD1884A_LAPTOP), |
3908 | SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD), | 3971 | SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD), |
3909 | {} | 3972 | {} |
3910 | }; | 3973 | }; |
@@ -3912,7 +3975,7 @@ static struct snd_pci_quirk ad1884a_cfg_tbl[] = { | |||
3912 | static int patch_ad1884a(struct hda_codec *codec) | 3975 | static int patch_ad1884a(struct hda_codec *codec) |
3913 | { | 3976 | { |
3914 | struct ad198x_spec *spec; | 3977 | struct ad198x_spec *spec; |
3915 | int board_config; | 3978 | int err, board_config; |
3916 | 3979 | ||
3917 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 3980 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
3918 | if (spec == NULL) | 3981 | if (spec == NULL) |
@@ -3920,6 +3983,13 @@ static int patch_ad1884a(struct hda_codec *codec) | |||
3920 | 3983 | ||
3921 | codec->spec = spec; | 3984 | codec->spec = spec; |
3922 | 3985 | ||
3986 | err = snd_hda_attach_beep_device(codec, 0x10); | ||
3987 | if (err < 0) { | ||
3988 | ad198x_free(codec); | ||
3989 | return err; | ||
3990 | } | ||
3991 | set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); | ||
3992 | |||
3923 | spec->multiout.max_channels = 2; | 3993 | spec->multiout.max_channels = 2; |
3924 | spec->multiout.num_dacs = ARRAY_SIZE(ad1884a_dac_nids); | 3994 | spec->multiout.num_dacs = ARRAY_SIZE(ad1884a_dac_nids); |
3925 | spec->multiout.dac_nids = ad1884a_dac_nids; | 3995 | spec->multiout.dac_nids = ad1884a_dac_nids; |
@@ -3950,13 +4020,29 @@ static int patch_ad1884a(struct hda_codec *codec) | |||
3950 | spec->input_mux = &ad1884a_laptop_capture_source; | 4020 | spec->input_mux = &ad1884a_laptop_capture_source; |
3951 | codec->patch_ops.unsol_event = ad1884a_hp_unsol_event; | 4021 | codec->patch_ops.unsol_event = ad1884a_hp_unsol_event; |
3952 | codec->patch_ops.init = ad1884a_hp_init; | 4022 | codec->patch_ops.init = ad1884a_hp_init; |
4023 | /* set the upper-limit for mixer amp to 0dB for avoiding the | ||
4024 | * possible damage by overloading | ||
4025 | */ | ||
4026 | snd_hda_override_amp_caps(codec, 0x20, HDA_INPUT, | ||
4027 | (0x17 << AC_AMPCAP_OFFSET_SHIFT) | | ||
4028 | (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) | | ||
4029 | (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) | | ||
4030 | (1 << AC_AMPCAP_MUTE_SHIFT)); | ||
3953 | break; | 4031 | break; |
3954 | case AD1884A_MOBILE: | 4032 | case AD1884A_MOBILE: |
3955 | spec->mixers[0] = ad1884a_mobile_mixers; | 4033 | spec->mixers[0] = ad1884a_mobile_mixers; |
3956 | spec->init_verbs[spec->num_init_verbs++] = ad1884a_laptop_verbs; | 4034 | spec->init_verbs[0] = ad1884a_mobile_verbs; |
3957 | spec->multiout.dig_out_nid = 0; | 4035 | spec->multiout.dig_out_nid = 0; |
3958 | codec->patch_ops.unsol_event = ad1884a_hp_unsol_event; | 4036 | codec->patch_ops.unsol_event = ad1884a_hp_unsol_event; |
3959 | codec->patch_ops.init = ad1884a_hp_init; | 4037 | codec->patch_ops.init = ad1884a_hp_init; |
4038 | /* set the upper-limit for mixer amp to 0dB for avoiding the | ||
4039 | * possible damage by overloading | ||
4040 | */ | ||
4041 | snd_hda_override_amp_caps(codec, 0x20, HDA_INPUT, | ||
4042 | (0x17 << AC_AMPCAP_OFFSET_SHIFT) | | ||
4043 | (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) | | ||
4044 | (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) | | ||
4045 | (1 << AC_AMPCAP_MUTE_SHIFT)); | ||
3960 | break; | 4046 | break; |
3961 | case AD1884A_THINKPAD: | 4047 | case AD1884A_THINKPAD: |
3962 | spec->mixers[0] = ad1984a_thinkpad_mixers; | 4048 | spec->mixers[0] = ad1984a_thinkpad_mixers; |
@@ -4074,8 +4160,6 @@ static struct snd_kcontrol_new ad1882_loopback_mixers[] = { | |||
4074 | HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x04, HDA_INPUT), | 4160 | HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x04, HDA_INPUT), |
4075 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x06, HDA_INPUT), | 4161 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x06, HDA_INPUT), |
4076 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x06, HDA_INPUT), | 4162 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x06, HDA_INPUT), |
4077 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x07, HDA_INPUT), | ||
4078 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x07, HDA_INPUT), | ||
4079 | { } /* end */ | 4163 | { } /* end */ |
4080 | }; | 4164 | }; |
4081 | 4165 | ||
@@ -4088,8 +4172,6 @@ static struct snd_kcontrol_new ad1882a_loopback_mixers[] = { | |||
4088 | HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x01, HDA_INPUT), | 4172 | HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x01, HDA_INPUT), |
4089 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x06, HDA_INPUT), | 4173 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x06, HDA_INPUT), |
4090 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x06, HDA_INPUT), | 4174 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x06, HDA_INPUT), |
4091 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x07, HDA_INPUT), | ||
4092 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x07, HDA_INPUT), | ||
4093 | HDA_CODEC_VOLUME("Digital Mic Boost", 0x1f, 0x0, HDA_INPUT), | 4175 | HDA_CODEC_VOLUME("Digital Mic Boost", 0x1f, 0x0, HDA_INPUT), |
4094 | { } /* end */ | 4176 | { } /* end */ |
4095 | }; | 4177 | }; |
@@ -4248,7 +4330,7 @@ static const char *ad1882_models[AD1986A_MODELS] = { | |||
4248 | static int patch_ad1882(struct hda_codec *codec) | 4330 | static int patch_ad1882(struct hda_codec *codec) |
4249 | { | 4331 | { |
4250 | struct ad198x_spec *spec; | 4332 | struct ad198x_spec *spec; |
4251 | int board_config; | 4333 | int err, board_config; |
4252 | 4334 | ||
4253 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | 4335 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); |
4254 | if (spec == NULL) | 4336 | if (spec == NULL) |
@@ -4256,6 +4338,13 @@ static int patch_ad1882(struct hda_codec *codec) | |||
4256 | 4338 | ||
4257 | codec->spec = spec; | 4339 | codec->spec = spec; |
4258 | 4340 | ||
4341 | err = snd_hda_attach_beep_device(codec, 0x10); | ||
4342 | if (err < 0) { | ||
4343 | ad198x_free(codec); | ||
4344 | return err; | ||
4345 | } | ||
4346 | set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); | ||
4347 | |||
4259 | spec->multiout.max_channels = 6; | 4348 | spec->multiout.max_channels = 6; |
4260 | spec->multiout.num_dacs = 3; | 4349 | spec->multiout.num_dacs = 3; |
4261 | spec->multiout.dac_nids = ad1882_dac_nids; | 4350 | spec->multiout.dac_nids = ad1882_dac_nids; |