diff options
Diffstat (limited to 'sound/pci/hda/patch_analog.c')
-rw-r--r-- | sound/pci/hda/patch_analog.c | 662 |
1 files changed, 420 insertions, 242 deletions
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 10bbbaf6ebc3..d694e9d4921d 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
@@ -30,10 +30,10 @@ | |||
30 | #include "hda_beep.h" | 30 | #include "hda_beep.h" |
31 | 31 | ||
32 | struct ad198x_spec { | 32 | struct ad198x_spec { |
33 | struct snd_kcontrol_new *mixers[5]; | 33 | const struct snd_kcontrol_new *mixers[6]; |
34 | int num_mixers; | 34 | int num_mixers; |
35 | unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */ | 35 | unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */ |
36 | const struct hda_verb *init_verbs[5]; /* initialization verbs | 36 | const struct hda_verb *init_verbs[6]; /* initialization verbs |
37 | * don't forget NULL termination! | 37 | * don't forget NULL termination! |
38 | */ | 38 | */ |
39 | unsigned int num_init_verbs; | 39 | unsigned int num_init_verbs; |
@@ -46,14 +46,17 @@ struct ad198x_spec { | |||
46 | unsigned int cur_eapd; | 46 | unsigned int cur_eapd; |
47 | unsigned int need_dac_fix; | 47 | unsigned int need_dac_fix; |
48 | 48 | ||
49 | const hda_nid_t *alt_dac_nid; | ||
50 | const struct hda_pcm_stream *stream_analog_alt_playback; | ||
51 | |||
49 | /* capture */ | 52 | /* capture */ |
50 | unsigned int num_adc_nids; | 53 | unsigned int num_adc_nids; |
51 | hda_nid_t *adc_nids; | 54 | const hda_nid_t *adc_nids; |
52 | hda_nid_t dig_in_nid; /* digital-in NID; optional */ | 55 | hda_nid_t dig_in_nid; /* digital-in NID; optional */ |
53 | 56 | ||
54 | /* capture source */ | 57 | /* capture source */ |
55 | const struct hda_input_mux *input_mux; | 58 | const struct hda_input_mux *input_mux; |
56 | hda_nid_t *capsrc_nids; | 59 | const hda_nid_t *capsrc_nids; |
57 | unsigned int cur_mux[3]; | 60 | unsigned int cur_mux[3]; |
58 | 61 | ||
59 | /* channel model */ | 62 | /* channel model */ |
@@ -81,8 +84,8 @@ struct ad198x_spec { | |||
81 | #endif | 84 | #endif |
82 | /* for virtual master */ | 85 | /* for virtual master */ |
83 | hda_nid_t vmaster_nid; | 86 | hda_nid_t vmaster_nid; |
84 | const char **slave_vols; | 87 | const char * const *slave_vols; |
85 | const char **slave_sws; | 88 | const char * const *slave_sws; |
86 | }; | 89 | }; |
87 | 90 | ||
88 | /* | 91 | /* |
@@ -130,7 +133,7 @@ static int ad198x_init(struct hda_codec *codec) | |||
130 | return 0; | 133 | return 0; |
131 | } | 134 | } |
132 | 135 | ||
133 | static const char *ad_slave_vols[] = { | 136 | static const char * const ad_slave_vols[] = { |
134 | "Front Playback Volume", | 137 | "Front Playback Volume", |
135 | "Surround Playback Volume", | 138 | "Surround Playback Volume", |
136 | "Center Playback Volume", | 139 | "Center Playback Volume", |
@@ -143,7 +146,7 @@ static const char *ad_slave_vols[] = { | |||
143 | NULL | 146 | NULL |
144 | }; | 147 | }; |
145 | 148 | ||
146 | static const char *ad_slave_sws[] = { | 149 | static const char * const ad_slave_sws[] = { |
147 | "Front Playback Switch", | 150 | "Front Playback Switch", |
148 | "Surround Playback Switch", | 151 | "Surround Playback Switch", |
149 | "Center Playback Switch", | 152 | "Center Playback Switch", |
@@ -156,17 +159,36 @@ static const char *ad_slave_sws[] = { | |||
156 | NULL | 159 | NULL |
157 | }; | 160 | }; |
158 | 161 | ||
162 | static const char * const ad1988_6stack_fp_slave_vols[] = { | ||
163 | "Front Playback Volume", | ||
164 | "Surround Playback Volume", | ||
165 | "Center Playback Volume", | ||
166 | "LFE Playback Volume", | ||
167 | "Side Playback Volume", | ||
168 | "IEC958 Playback Volume", | ||
169 | NULL | ||
170 | }; | ||
171 | |||
172 | static const char * const ad1988_6stack_fp_slave_sws[] = { | ||
173 | "Front Playback Switch", | ||
174 | "Surround Playback Switch", | ||
175 | "Center Playback Switch", | ||
176 | "LFE Playback Switch", | ||
177 | "Side Playback Switch", | ||
178 | "IEC958 Playback Switch", | ||
179 | NULL | ||
180 | }; | ||
159 | static void ad198x_free_kctls(struct hda_codec *codec); | 181 | static void ad198x_free_kctls(struct hda_codec *codec); |
160 | 182 | ||
161 | #ifdef CONFIG_SND_HDA_INPUT_BEEP | 183 | #ifdef CONFIG_SND_HDA_INPUT_BEEP |
162 | /* additional beep mixers; the actual parameters are overwritten at build */ | 184 | /* additional beep mixers; the actual parameters are overwritten at build */ |
163 | static struct snd_kcontrol_new ad_beep_mixer[] = { | 185 | static const struct snd_kcontrol_new ad_beep_mixer[] = { |
164 | HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_OUTPUT), | 186 | HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_OUTPUT), |
165 | HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_OUTPUT), | 187 | HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_OUTPUT), |
166 | { } /* end */ | 188 | { } /* end */ |
167 | }; | 189 | }; |
168 | 190 | ||
169 | static struct snd_kcontrol_new ad_beep2_mixer[] = { | 191 | static const struct snd_kcontrol_new ad_beep2_mixer[] = { |
170 | HDA_CODEC_VOLUME("Digital Beep Playback Volume", 0, 0, HDA_OUTPUT), | 192 | HDA_CODEC_VOLUME("Digital Beep Playback Volume", 0, 0, HDA_OUTPUT), |
171 | HDA_CODEC_MUTE_BEEP("Digital Beep Playback Switch", 0, 0, HDA_OUTPUT), | 193 | HDA_CODEC_MUTE_BEEP("Digital Beep Playback Switch", 0, 0, HDA_OUTPUT), |
172 | { } /* end */ | 194 | { } /* end */ |
@@ -209,7 +231,7 @@ static int ad198x_build_controls(struct hda_codec *codec) | |||
209 | /* create beep controls if needed */ | 231 | /* create beep controls if needed */ |
210 | #ifdef CONFIG_SND_HDA_INPUT_BEEP | 232 | #ifdef CONFIG_SND_HDA_INPUT_BEEP |
211 | if (spec->beep_amp) { | 233 | if (spec->beep_amp) { |
212 | struct snd_kcontrol_new *knew; | 234 | const struct snd_kcontrol_new *knew; |
213 | knew = spec->analog_beep ? ad_beep2_mixer : ad_beep_mixer; | 235 | knew = spec->analog_beep ? ad_beep2_mixer : ad_beep_mixer; |
214 | for ( ; knew->name; knew++) { | 236 | for ( ; knew->name; knew++) { |
215 | struct snd_kcontrol *kctl; | 237 | struct snd_kcontrol *kctl; |
@@ -309,6 +331,13 @@ static int ad198x_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, | |||
309 | return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout); | 331 | return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout); |
310 | } | 332 | } |
311 | 333 | ||
334 | static const struct hda_pcm_stream ad198x_pcm_analog_alt_playback = { | ||
335 | .substreams = 1, | ||
336 | .channels_min = 2, | ||
337 | .channels_max = 2, | ||
338 | /* NID is set in ad198x_build_pcms */ | ||
339 | }; | ||
340 | |||
312 | /* | 341 | /* |
313 | * Digital out | 342 | * Digital out |
314 | */ | 343 | */ |
@@ -374,7 +403,7 @@ static int ad198x_capture_pcm_cleanup(struct hda_pcm_stream *hinfo, | |||
374 | 403 | ||
375 | /* | 404 | /* |
376 | */ | 405 | */ |
377 | static struct hda_pcm_stream ad198x_pcm_analog_playback = { | 406 | static const struct hda_pcm_stream ad198x_pcm_analog_playback = { |
378 | .substreams = 1, | 407 | .substreams = 1, |
379 | .channels_min = 2, | 408 | .channels_min = 2, |
380 | .channels_max = 6, /* changed later */ | 409 | .channels_max = 6, /* changed later */ |
@@ -386,7 +415,7 @@ static struct hda_pcm_stream ad198x_pcm_analog_playback = { | |||
386 | }, | 415 | }, |
387 | }; | 416 | }; |
388 | 417 | ||
389 | static struct hda_pcm_stream ad198x_pcm_analog_capture = { | 418 | static const struct hda_pcm_stream ad198x_pcm_analog_capture = { |
390 | .substreams = 1, | 419 | .substreams = 1, |
391 | .channels_min = 2, | 420 | .channels_min = 2, |
392 | .channels_max = 2, | 421 | .channels_max = 2, |
@@ -397,7 +426,7 @@ static struct hda_pcm_stream ad198x_pcm_analog_capture = { | |||
397 | }, | 426 | }, |
398 | }; | 427 | }; |
399 | 428 | ||
400 | static struct hda_pcm_stream ad198x_pcm_digital_playback = { | 429 | static const struct hda_pcm_stream ad198x_pcm_digital_playback = { |
401 | .substreams = 1, | 430 | .substreams = 1, |
402 | .channels_min = 2, | 431 | .channels_min = 2, |
403 | .channels_max = 2, | 432 | .channels_max = 2, |
@@ -410,7 +439,7 @@ static struct hda_pcm_stream ad198x_pcm_digital_playback = { | |||
410 | }, | 439 | }, |
411 | }; | 440 | }; |
412 | 441 | ||
413 | static struct hda_pcm_stream ad198x_pcm_digital_capture = { | 442 | static const struct hda_pcm_stream ad198x_pcm_digital_capture = { |
414 | .substreams = 1, | 443 | .substreams = 1, |
415 | .channels_min = 2, | 444 | .channels_min = 2, |
416 | .channels_max = 2, | 445 | .channels_max = 2, |
@@ -446,12 +475,18 @@ static int ad198x_build_pcms(struct hda_codec *codec) | |||
446 | } | 475 | } |
447 | } | 476 | } |
448 | 477 | ||
449 | return 0; | 478 | if (spec->alt_dac_nid && spec->stream_analog_alt_playback) { |
450 | } | 479 | codec->num_pcms++; |
480 | info = spec->pcm_rec + 2; | ||
481 | info->name = "AD198x Headphone"; | ||
482 | info->pcm_type = HDA_PCM_TYPE_AUDIO; | ||
483 | info->stream[SNDRV_PCM_STREAM_PLAYBACK] = | ||
484 | *spec->stream_analog_alt_playback; | ||
485 | info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = | ||
486 | spec->alt_dac_nid[0]; | ||
487 | } | ||
451 | 488 | ||
452 | static inline void ad198x_shutup(struct hda_codec *codec) | 489 | return 0; |
453 | { | ||
454 | snd_hda_shutup_pins(codec); | ||
455 | } | 490 | } |
456 | 491 | ||
457 | static void ad198x_free_kctls(struct hda_codec *codec) | 492 | static void ad198x_free_kctls(struct hda_codec *codec) |
@@ -471,9 +506,11 @@ static void ad198x_power_eapd_write(struct hda_codec *codec, hda_nid_t front, | |||
471 | hda_nid_t hp) | 506 | hda_nid_t hp) |
472 | { | 507 | { |
473 | struct ad198x_spec *spec = codec->spec; | 508 | struct ad198x_spec *spec = codec->spec; |
474 | snd_hda_codec_write(codec, front, 0, AC_VERB_SET_EAPD_BTLENABLE, | 509 | if (snd_hda_query_pin_caps(codec, front) & AC_PINCAP_EAPD) |
510 | snd_hda_codec_write(codec, front, 0, AC_VERB_SET_EAPD_BTLENABLE, | ||
475 | !spec->inv_eapd ? 0x00 : 0x02); | 511 | !spec->inv_eapd ? 0x00 : 0x02); |
476 | snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_EAPD_BTLENABLE, | 512 | if (snd_hda_query_pin_caps(codec, hp) & AC_PINCAP_EAPD) |
513 | snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_EAPD_BTLENABLE, | ||
477 | !spec->inv_eapd ? 0x00 : 0x02); | 514 | !spec->inv_eapd ? 0x00 : 0x02); |
478 | } | 515 | } |
479 | 516 | ||
@@ -489,6 +526,10 @@ static void ad198x_power_eapd(struct hda_codec *codec) | |||
489 | case 0x11d4184a: | 526 | case 0x11d4184a: |
490 | case 0x11d4194a: | 527 | case 0x11d4194a: |
491 | case 0x11d4194b: | 528 | case 0x11d4194b: |
529 | case 0x11d41988: | ||
530 | case 0x11d4198b: | ||
531 | case 0x11d4989a: | ||
532 | case 0x11d4989b: | ||
492 | ad198x_power_eapd_write(codec, 0x12, 0x11); | 533 | ad198x_power_eapd_write(codec, 0x12, 0x11); |
493 | break; | 534 | break; |
494 | case 0x11d41981: | 535 | case 0x11d41981: |
@@ -498,15 +539,15 @@ static void ad198x_power_eapd(struct hda_codec *codec) | |||
498 | case 0x11d41986: | 539 | case 0x11d41986: |
499 | ad198x_power_eapd_write(codec, 0x1b, 0x1a); | 540 | ad198x_power_eapd_write(codec, 0x1b, 0x1a); |
500 | break; | 541 | break; |
501 | case 0x11d41988: | ||
502 | case 0x11d4198b: | ||
503 | case 0x11d4989a: | ||
504 | case 0x11d4989b: | ||
505 | ad198x_power_eapd_write(codec, 0x29, 0x22); | ||
506 | break; | ||
507 | } | 542 | } |
508 | } | 543 | } |
509 | 544 | ||
545 | static void ad198x_shutup(struct hda_codec *codec) | ||
546 | { | ||
547 | snd_hda_shutup_pins(codec); | ||
548 | ad198x_power_eapd(codec); | ||
549 | } | ||
550 | |||
510 | static void ad198x_free(struct hda_codec *codec) | 551 | static void ad198x_free(struct hda_codec *codec) |
511 | { | 552 | { |
512 | struct ad198x_spec *spec = codec->spec; | 553 | struct ad198x_spec *spec = codec->spec; |
@@ -524,12 +565,11 @@ static void ad198x_free(struct hda_codec *codec) | |||
524 | static int ad198x_suspend(struct hda_codec *codec, pm_message_t state) | 565 | static int ad198x_suspend(struct hda_codec *codec, pm_message_t state) |
525 | { | 566 | { |
526 | ad198x_shutup(codec); | 567 | ad198x_shutup(codec); |
527 | ad198x_power_eapd(codec); | ||
528 | return 0; | 568 | return 0; |
529 | } | 569 | } |
530 | #endif | 570 | #endif |
531 | 571 | ||
532 | static struct hda_codec_ops ad198x_patch_ops = { | 572 | static const struct hda_codec_ops ad198x_patch_ops = { |
533 | .build_controls = ad198x_build_controls, | 573 | .build_controls = ad198x_build_controls, |
534 | .build_pcms = ad198x_build_pcms, | 574 | .build_pcms = ad198x_build_pcms, |
535 | .init = ad198x_init, | 575 | .init = ad198x_init, |
@@ -599,13 +639,13 @@ static int ad198x_ch_mode_put(struct snd_kcontrol *kcontrol, | |||
599 | #define AD1986A_CLFE_DAC 0x05 | 639 | #define AD1986A_CLFE_DAC 0x05 |
600 | #define AD1986A_ADC 0x06 | 640 | #define AD1986A_ADC 0x06 |
601 | 641 | ||
602 | static hda_nid_t ad1986a_dac_nids[3] = { | 642 | static const hda_nid_t ad1986a_dac_nids[3] = { |
603 | AD1986A_FRONT_DAC, AD1986A_SURR_DAC, AD1986A_CLFE_DAC | 643 | AD1986A_FRONT_DAC, AD1986A_SURR_DAC, AD1986A_CLFE_DAC |
604 | }; | 644 | }; |
605 | static hda_nid_t ad1986a_adc_nids[1] = { AD1986A_ADC }; | 645 | static const hda_nid_t ad1986a_adc_nids[1] = { AD1986A_ADC }; |
606 | static hda_nid_t ad1986a_capsrc_nids[1] = { 0x12 }; | 646 | static const hda_nid_t ad1986a_capsrc_nids[1] = { 0x12 }; |
607 | 647 | ||
608 | static struct hda_input_mux ad1986a_capture_source = { | 648 | static const struct hda_input_mux ad1986a_capture_source = { |
609 | .num_items = 7, | 649 | .num_items = 7, |
610 | .items = { | 650 | .items = { |
611 | { "Mic", 0x0 }, | 651 | { "Mic", 0x0 }, |
@@ -619,7 +659,7 @@ static struct hda_input_mux ad1986a_capture_source = { | |||
619 | }; | 659 | }; |
620 | 660 | ||
621 | 661 | ||
622 | static struct hda_bind_ctls ad1986a_bind_pcm_vol = { | 662 | static const struct hda_bind_ctls ad1986a_bind_pcm_vol = { |
623 | .ops = &snd_hda_bind_vol, | 663 | .ops = &snd_hda_bind_vol, |
624 | .values = { | 664 | .values = { |
625 | HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT), | 665 | HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT), |
@@ -629,7 +669,7 @@ static struct hda_bind_ctls ad1986a_bind_pcm_vol = { | |||
629 | }, | 669 | }, |
630 | }; | 670 | }; |
631 | 671 | ||
632 | static struct hda_bind_ctls ad1986a_bind_pcm_sw = { | 672 | static const struct hda_bind_ctls ad1986a_bind_pcm_sw = { |
633 | .ops = &snd_hda_bind_sw, | 673 | .ops = &snd_hda_bind_sw, |
634 | .values = { | 674 | .values = { |
635 | HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT), | 675 | HDA_COMPOSE_AMP_VAL(AD1986A_FRONT_DAC, 3, 0, HDA_OUTPUT), |
@@ -642,7 +682,7 @@ static struct hda_bind_ctls ad1986a_bind_pcm_sw = { | |||
642 | /* | 682 | /* |
643 | * mixers | 683 | * mixers |
644 | */ | 684 | */ |
645 | static struct snd_kcontrol_new ad1986a_mixers[] = { | 685 | static const struct snd_kcontrol_new ad1986a_mixers[] = { |
646 | /* | 686 | /* |
647 | * bind volumes/mutes of 3 DACs as a single PCM control for simplicity | 687 | * bind volumes/mutes of 3 DACs as a single PCM control for simplicity |
648 | */ | 688 | */ |
@@ -666,7 +706,7 @@ static struct snd_kcontrol_new ad1986a_mixers[] = { | |||
666 | HDA_CODEC_MUTE("Aux Playback Switch", 0x16, 0x0, HDA_OUTPUT), | 706 | HDA_CODEC_MUTE("Aux Playback Switch", 0x16, 0x0, HDA_OUTPUT), |
667 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), | 707 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), |
668 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), | 708 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), |
669 | HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), | 709 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x0f, 0x0, HDA_OUTPUT), |
670 | HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT), | 710 | HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT), |
671 | HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), | 711 | HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), |
672 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), | 712 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), |
@@ -683,7 +723,7 @@ static struct snd_kcontrol_new ad1986a_mixers[] = { | |||
683 | }; | 723 | }; |
684 | 724 | ||
685 | /* additional mixers for 3stack mode */ | 725 | /* additional mixers for 3stack mode */ |
686 | static struct snd_kcontrol_new ad1986a_3st_mixers[] = { | 726 | static const struct snd_kcontrol_new ad1986a_3st_mixers[] = { |
687 | { | 727 | { |
688 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 728 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
689 | .name = "Channel Mode", | 729 | .name = "Channel Mode", |
@@ -695,10 +735,10 @@ static struct snd_kcontrol_new ad1986a_3st_mixers[] = { | |||
695 | }; | 735 | }; |
696 | 736 | ||
697 | /* laptop model - 2ch only */ | 737 | /* laptop model - 2ch only */ |
698 | static hda_nid_t ad1986a_laptop_dac_nids[1] = { AD1986A_FRONT_DAC }; | 738 | static const hda_nid_t ad1986a_laptop_dac_nids[1] = { AD1986A_FRONT_DAC }; |
699 | 739 | ||
700 | /* master controls both pins 0x1a and 0x1b */ | 740 | /* master controls both pins 0x1a and 0x1b */ |
701 | static struct hda_bind_ctls ad1986a_laptop_master_vol = { | 741 | static const struct hda_bind_ctls ad1986a_laptop_master_vol = { |
702 | .ops = &snd_hda_bind_vol, | 742 | .ops = &snd_hda_bind_vol, |
703 | .values = { | 743 | .values = { |
704 | HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT), | 744 | HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT), |
@@ -707,7 +747,7 @@ static struct hda_bind_ctls ad1986a_laptop_master_vol = { | |||
707 | }, | 747 | }, |
708 | }; | 748 | }; |
709 | 749 | ||
710 | static struct hda_bind_ctls ad1986a_laptop_master_sw = { | 750 | static const struct hda_bind_ctls ad1986a_laptop_master_sw = { |
711 | .ops = &snd_hda_bind_sw, | 751 | .ops = &snd_hda_bind_sw, |
712 | .values = { | 752 | .values = { |
713 | HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT), | 753 | HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT), |
@@ -716,7 +756,7 @@ static struct hda_bind_ctls ad1986a_laptop_master_sw = { | |||
716 | }, | 756 | }, |
717 | }; | 757 | }; |
718 | 758 | ||
719 | static struct snd_kcontrol_new ad1986a_laptop_mixers[] = { | 759 | static const struct snd_kcontrol_new ad1986a_laptop_mixers[] = { |
720 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT), | 760 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT), |
721 | HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT), | 761 | HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT), |
722 | HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol), | 762 | HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol), |
@@ -729,7 +769,7 @@ static struct snd_kcontrol_new ad1986a_laptop_mixers[] = { | |||
729 | HDA_CODEC_MUTE("Aux Playback Switch", 0x16, 0x0, HDA_OUTPUT), | 769 | HDA_CODEC_MUTE("Aux Playback Switch", 0x16, 0x0, HDA_OUTPUT), |
730 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), | 770 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), |
731 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), | 771 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), |
732 | HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), | 772 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x0f, 0x0, HDA_OUTPUT), |
733 | /* | 773 | /* |
734 | HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT), | 774 | HDA_CODEC_VOLUME("Mono Playback Volume", 0x1e, 0x0, HDA_OUTPUT), |
735 | HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), */ | 775 | HDA_CODEC_MUTE("Mono Playback Switch", 0x1e, 0x0, HDA_OUTPUT), */ |
@@ -747,7 +787,7 @@ static struct snd_kcontrol_new ad1986a_laptop_mixers[] = { | |||
747 | 787 | ||
748 | /* laptop-eapd model - 2ch only */ | 788 | /* laptop-eapd model - 2ch only */ |
749 | 789 | ||
750 | static struct hda_input_mux ad1986a_laptop_eapd_capture_source = { | 790 | static const struct hda_input_mux ad1986a_laptop_eapd_capture_source = { |
751 | .num_items = 3, | 791 | .num_items = 3, |
752 | .items = { | 792 | .items = { |
753 | { "Mic", 0x0 }, | 793 | { "Mic", 0x0 }, |
@@ -756,7 +796,7 @@ static struct hda_input_mux ad1986a_laptop_eapd_capture_source = { | |||
756 | }, | 796 | }, |
757 | }; | 797 | }; |
758 | 798 | ||
759 | static struct hda_input_mux ad1986a_automic_capture_source = { | 799 | static const struct hda_input_mux ad1986a_automic_capture_source = { |
760 | .num_items = 2, | 800 | .num_items = 2, |
761 | .items = { | 801 | .items = { |
762 | { "Mic", 0x0 }, | 802 | { "Mic", 0x0 }, |
@@ -764,18 +804,18 @@ static struct hda_input_mux ad1986a_automic_capture_source = { | |||
764 | }, | 804 | }, |
765 | }; | 805 | }; |
766 | 806 | ||
767 | static struct snd_kcontrol_new ad1986a_laptop_master_mixers[] = { | 807 | static const struct snd_kcontrol_new ad1986a_laptop_master_mixers[] = { |
768 | HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol), | 808 | HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol), |
769 | HDA_BIND_SW("Master Playback Switch", &ad1986a_laptop_master_sw), | 809 | HDA_BIND_SW("Master Playback Switch", &ad1986a_laptop_master_sw), |
770 | { } /* end */ | 810 | { } /* end */ |
771 | }; | 811 | }; |
772 | 812 | ||
773 | static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = { | 813 | static const struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = { |
774 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT), | 814 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT), |
775 | HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT), | 815 | HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT), |
776 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), | 816 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), |
777 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), | 817 | HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), |
778 | HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), | 818 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x0f, 0x0, HDA_OUTPUT), |
779 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), | 819 | HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), |
780 | HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT), | 820 | HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT), |
781 | { | 821 | { |
@@ -797,7 +837,7 @@ static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = { | |||
797 | { } /* end */ | 837 | { } /* end */ |
798 | }; | 838 | }; |
799 | 839 | ||
800 | static struct snd_kcontrol_new ad1986a_laptop_intmic_mixers[] = { | 840 | static const struct snd_kcontrol_new ad1986a_laptop_intmic_mixers[] = { |
801 | HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0, HDA_OUTPUT), | 841 | HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0, HDA_OUTPUT), |
802 | HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0, HDA_OUTPUT), | 842 | HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0, HDA_OUTPUT), |
803 | { } /* end */ | 843 | { } /* end */ |
@@ -891,7 +931,7 @@ static int ad1986a_hp_master_sw_put(struct snd_kcontrol *kcontrol, | |||
891 | return change; | 931 | return change; |
892 | } | 932 | } |
893 | 933 | ||
894 | static struct snd_kcontrol_new ad1986a_automute_master_mixers[] = { | 934 | static const struct snd_kcontrol_new ad1986a_automute_master_mixers[] = { |
895 | HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol), | 935 | HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol), |
896 | { | 936 | { |
897 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 937 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
@@ -909,7 +949,7 @@ static struct snd_kcontrol_new ad1986a_automute_master_mixers[] = { | |||
909 | /* | 949 | /* |
910 | * initialization verbs | 950 | * initialization verbs |
911 | */ | 951 | */ |
912 | static struct hda_verb ad1986a_init_verbs[] = { | 952 | static const struct hda_verb ad1986a_init_verbs[] = { |
913 | /* Front, Surround, CLFE DAC; mute as default */ | 953 | /* Front, Surround, CLFE DAC; mute as default */ |
914 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, | 954 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, |
915 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, | 955 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, |
@@ -964,7 +1004,7 @@ static struct hda_verb ad1986a_init_verbs[] = { | |||
964 | { } /* end */ | 1004 | { } /* end */ |
965 | }; | 1005 | }; |
966 | 1006 | ||
967 | static struct hda_verb ad1986a_ch2_init[] = { | 1007 | static const struct hda_verb ad1986a_ch2_init[] = { |
968 | /* Surround out -> Line In */ | 1008 | /* Surround out -> Line In */ |
969 | { 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, | 1009 | { 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, |
970 | /* Line-in selectors */ | 1010 | /* Line-in selectors */ |
@@ -976,7 +1016,7 @@ static struct hda_verb ad1986a_ch2_init[] = { | |||
976 | { } /* end */ | 1016 | { } /* end */ |
977 | }; | 1017 | }; |
978 | 1018 | ||
979 | static struct hda_verb ad1986a_ch4_init[] = { | 1019 | static const struct hda_verb ad1986a_ch4_init[] = { |
980 | /* Surround out -> Surround */ | 1020 | /* Surround out -> Surround */ |
981 | { 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | 1021 | { 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, |
982 | { 0x10, AC_VERB_SET_CONNECT_SEL, 0x0 }, | 1022 | { 0x10, AC_VERB_SET_CONNECT_SEL, 0x0 }, |
@@ -986,7 +1026,7 @@ static struct hda_verb ad1986a_ch4_init[] = { | |||
986 | { } /* end */ | 1026 | { } /* end */ |
987 | }; | 1027 | }; |
988 | 1028 | ||
989 | static struct hda_verb ad1986a_ch6_init[] = { | 1029 | static const struct hda_verb ad1986a_ch6_init[] = { |
990 | /* Surround out -> Surround out */ | 1030 | /* Surround out -> Surround out */ |
991 | { 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | 1031 | { 0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, |
992 | { 0x10, AC_VERB_SET_CONNECT_SEL, 0x0 }, | 1032 | { 0x10, AC_VERB_SET_CONNECT_SEL, 0x0 }, |
@@ -996,19 +1036,19 @@ static struct hda_verb ad1986a_ch6_init[] = { | |||
996 | { } /* end */ | 1036 | { } /* end */ |
997 | }; | 1037 | }; |
998 | 1038 | ||
999 | static struct hda_channel_mode ad1986a_modes[3] = { | 1039 | static const struct hda_channel_mode ad1986a_modes[3] = { |
1000 | { 2, ad1986a_ch2_init }, | 1040 | { 2, ad1986a_ch2_init }, |
1001 | { 4, ad1986a_ch4_init }, | 1041 | { 4, ad1986a_ch4_init }, |
1002 | { 6, ad1986a_ch6_init }, | 1042 | { 6, ad1986a_ch6_init }, |
1003 | }; | 1043 | }; |
1004 | 1044 | ||
1005 | /* eapd initialization */ | 1045 | /* eapd initialization */ |
1006 | static struct hda_verb ad1986a_eapd_init_verbs[] = { | 1046 | static const struct hda_verb ad1986a_eapd_init_verbs[] = { |
1007 | {0x1b, AC_VERB_SET_EAPD_BTLENABLE, 0x00 }, | 1047 | {0x1b, AC_VERB_SET_EAPD_BTLENABLE, 0x00 }, |
1008 | {} | 1048 | {} |
1009 | }; | 1049 | }; |
1010 | 1050 | ||
1011 | static struct hda_verb ad1986a_automic_verbs[] = { | 1051 | static const struct hda_verb ad1986a_automic_verbs[] = { |
1012 | {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 1052 | {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
1013 | {0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 1053 | {0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
1014 | /*{0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},*/ | 1054 | /*{0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},*/ |
@@ -1018,7 +1058,7 @@ static struct hda_verb ad1986a_automic_verbs[] = { | |||
1018 | }; | 1058 | }; |
1019 | 1059 | ||
1020 | /* Ultra initialization */ | 1060 | /* Ultra initialization */ |
1021 | static struct hda_verb ad1986a_ultra_init[] = { | 1061 | static const struct hda_verb ad1986a_ultra_init[] = { |
1022 | /* eapd initialization */ | 1062 | /* eapd initialization */ |
1023 | { 0x1b, AC_VERB_SET_EAPD_BTLENABLE, 0x00 }, | 1063 | { 0x1b, AC_VERB_SET_EAPD_BTLENABLE, 0x00 }, |
1024 | /* CLFE -> Mic in */ | 1064 | /* CLFE -> Mic in */ |
@@ -1029,7 +1069,7 @@ static struct hda_verb ad1986a_ultra_init[] = { | |||
1029 | }; | 1069 | }; |
1030 | 1070 | ||
1031 | /* pin sensing on HP jack */ | 1071 | /* pin sensing on HP jack */ |
1032 | static struct hda_verb ad1986a_hp_init_verbs[] = { | 1072 | static const struct hda_verb ad1986a_hp_init_verbs[] = { |
1033 | {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1986A_HP_EVENT}, | 1073 | {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1986A_HP_EVENT}, |
1034 | {} | 1074 | {} |
1035 | }; | 1075 | }; |
@@ -1069,7 +1109,7 @@ enum { | |||
1069 | AD1986A_MODELS | 1109 | AD1986A_MODELS |
1070 | }; | 1110 | }; |
1071 | 1111 | ||
1072 | static const char *ad1986a_models[AD1986A_MODELS] = { | 1112 | static const char * const ad1986a_models[AD1986A_MODELS] = { |
1073 | [AD1986A_6STACK] = "6stack", | 1113 | [AD1986A_6STACK] = "6stack", |
1074 | [AD1986A_3STACK] = "3stack", | 1114 | [AD1986A_3STACK] = "3stack", |
1075 | [AD1986A_LAPTOP] = "laptop", | 1115 | [AD1986A_LAPTOP] = "laptop", |
@@ -1080,7 +1120,7 @@ static const char *ad1986a_models[AD1986A_MODELS] = { | |||
1080 | [AD1986A_SAMSUNG_P50] = "samsung-p50", | 1120 | [AD1986A_SAMSUNG_P50] = "samsung-p50", |
1081 | }; | 1121 | }; |
1082 | 1122 | ||
1083 | static struct snd_pci_quirk ad1986a_cfg_tbl[] = { | 1123 | static const struct snd_pci_quirk ad1986a_cfg_tbl[] = { |
1084 | SND_PCI_QUIRK(0x103c, 0x30af, "HP B2800", AD1986A_LAPTOP_EAPD), | 1124 | SND_PCI_QUIRK(0x103c, 0x30af, "HP B2800", AD1986A_LAPTOP_EAPD), |
1085 | SND_PCI_QUIRK(0x1043, 0x1153, "ASUS M9", AD1986A_LAPTOP_EAPD), | 1125 | SND_PCI_QUIRK(0x1043, 0x1153, "ASUS M9", AD1986A_LAPTOP_EAPD), |
1086 | SND_PCI_QUIRK(0x1043, 0x11f7, "ASUS U5A", AD1986A_LAPTOP_EAPD), | 1126 | SND_PCI_QUIRK(0x1043, 0x11f7, "ASUS U5A", AD1986A_LAPTOP_EAPD), |
@@ -1112,7 +1152,7 @@ static struct snd_pci_quirk ad1986a_cfg_tbl[] = { | |||
1112 | }; | 1152 | }; |
1113 | 1153 | ||
1114 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 1154 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
1115 | static struct hda_amp_list ad1986a_loopbacks[] = { | 1155 | static const struct hda_amp_list ad1986a_loopbacks[] = { |
1116 | { 0x13, HDA_OUTPUT, 0 }, /* Mic */ | 1156 | { 0x13, HDA_OUTPUT, 0 }, /* Mic */ |
1117 | { 0x14, HDA_OUTPUT, 0 }, /* Phone */ | 1157 | { 0x14, HDA_OUTPUT, 0 }, /* Phone */ |
1118 | { 0x15, HDA_OUTPUT, 0 }, /* CD */ | 1158 | { 0x15, HDA_OUTPUT, 0 }, /* CD */ |
@@ -1276,6 +1316,7 @@ static int patch_ad1986a(struct hda_codec *codec) | |||
1276 | spec->multiout.no_share_stream = 1; | 1316 | spec->multiout.no_share_stream = 1; |
1277 | 1317 | ||
1278 | codec->no_trigger_sense = 1; | 1318 | codec->no_trigger_sense = 1; |
1319 | codec->no_sticky_stream = 1; | ||
1279 | 1320 | ||
1280 | return 0; | 1321 | return 0; |
1281 | } | 1322 | } |
@@ -1288,11 +1329,11 @@ static int patch_ad1986a(struct hda_codec *codec) | |||
1288 | #define AD1983_DAC 0x03 | 1329 | #define AD1983_DAC 0x03 |
1289 | #define AD1983_ADC 0x04 | 1330 | #define AD1983_ADC 0x04 |
1290 | 1331 | ||
1291 | static hda_nid_t ad1983_dac_nids[1] = { AD1983_DAC }; | 1332 | static const hda_nid_t ad1983_dac_nids[1] = { AD1983_DAC }; |
1292 | static hda_nid_t ad1983_adc_nids[1] = { AD1983_ADC }; | 1333 | static const hda_nid_t ad1983_adc_nids[1] = { AD1983_ADC }; |
1293 | static hda_nid_t ad1983_capsrc_nids[1] = { 0x15 }; | 1334 | static const hda_nid_t ad1983_capsrc_nids[1] = { 0x15 }; |
1294 | 1335 | ||
1295 | static struct hda_input_mux ad1983_capture_source = { | 1336 | static const struct hda_input_mux ad1983_capture_source = { |
1296 | .num_items = 4, | 1337 | .num_items = 4, |
1297 | .items = { | 1338 | .items = { |
1298 | { "Mic", 0x0 }, | 1339 | { "Mic", 0x0 }, |
@@ -1307,7 +1348,7 @@ static struct hda_input_mux ad1983_capture_source = { | |||
1307 | */ | 1348 | */ |
1308 | static int ad1983_spdif_route_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) | 1349 | static int ad1983_spdif_route_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) |
1309 | { | 1350 | { |
1310 | static char *texts[] = { "PCM", "ADC" }; | 1351 | static const char * const texts[] = { "PCM", "ADC" }; |
1311 | 1352 | ||
1312 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 1353 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
1313 | uinfo->count = 1; | 1354 | uinfo->count = 1; |
@@ -1344,7 +1385,7 @@ static int ad1983_spdif_route_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ | |||
1344 | return 0; | 1385 | return 0; |
1345 | } | 1386 | } |
1346 | 1387 | ||
1347 | static struct snd_kcontrol_new ad1983_mixers[] = { | 1388 | static const struct snd_kcontrol_new ad1983_mixers[] = { |
1348 | HDA_CODEC_VOLUME("Front Playback Volume", 0x05, 0x0, HDA_OUTPUT), | 1389 | HDA_CODEC_VOLUME("Front Playback Volume", 0x05, 0x0, HDA_OUTPUT), |
1349 | HDA_CODEC_MUTE("Front Playback Switch", 0x05, 0x0, HDA_OUTPUT), | 1390 | HDA_CODEC_MUTE("Front Playback Switch", 0x05, 0x0, HDA_OUTPUT), |
1350 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x06, 0x0, HDA_OUTPUT), | 1391 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x06, 0x0, HDA_OUTPUT), |
@@ -1357,7 +1398,7 @@ static struct snd_kcontrol_new ad1983_mixers[] = { | |||
1357 | HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT), | 1398 | HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT), |
1358 | HDA_CODEC_VOLUME("Line Playback Volume", 0x13, 0x0, HDA_OUTPUT), | 1399 | HDA_CODEC_VOLUME("Line Playback Volume", 0x13, 0x0, HDA_OUTPUT), |
1359 | HDA_CODEC_MUTE("Line Playback Switch", 0x13, 0x0, HDA_OUTPUT), | 1400 | HDA_CODEC_MUTE("Line Playback Switch", 0x13, 0x0, HDA_OUTPUT), |
1360 | HDA_CODEC_VOLUME("Mic Boost", 0x0c, 0x0, HDA_OUTPUT), | 1401 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x0c, 0x0, HDA_OUTPUT), |
1361 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), | 1402 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), |
1362 | HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT), | 1403 | HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT), |
1363 | { | 1404 | { |
@@ -1377,7 +1418,7 @@ static struct snd_kcontrol_new ad1983_mixers[] = { | |||
1377 | { } /* end */ | 1418 | { } /* end */ |
1378 | }; | 1419 | }; |
1379 | 1420 | ||
1380 | static struct hda_verb ad1983_init_verbs[] = { | 1421 | static const struct hda_verb ad1983_init_verbs[] = { |
1381 | /* Front, HP, Mono; mute as default */ | 1422 | /* Front, HP, Mono; mute as default */ |
1382 | {0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, | 1423 | {0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, |
1383 | {0x06, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, | 1424 | {0x06, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, |
@@ -1417,7 +1458,7 @@ static struct hda_verb ad1983_init_verbs[] = { | |||
1417 | }; | 1458 | }; |
1418 | 1459 | ||
1419 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 1460 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
1420 | static struct hda_amp_list ad1983_loopbacks[] = { | 1461 | static const struct hda_amp_list ad1983_loopbacks[] = { |
1421 | { 0x12, HDA_OUTPUT, 0 }, /* Mic */ | 1462 | { 0x12, HDA_OUTPUT, 0 }, /* Mic */ |
1422 | { 0x13, HDA_OUTPUT, 0 }, /* Line */ | 1463 | { 0x13, HDA_OUTPUT, 0 }, /* Line */ |
1423 | { } /* end */ | 1464 | { } /* end */ |
@@ -1463,6 +1504,7 @@ static int patch_ad1983(struct hda_codec *codec) | |||
1463 | codec->patch_ops = ad198x_patch_ops; | 1504 | codec->patch_ops = ad198x_patch_ops; |
1464 | 1505 | ||
1465 | codec->no_trigger_sense = 1; | 1506 | codec->no_trigger_sense = 1; |
1507 | codec->no_sticky_stream = 1; | ||
1466 | 1508 | ||
1467 | return 0; | 1509 | return 0; |
1468 | } | 1510 | } |
@@ -1476,12 +1518,12 @@ static int patch_ad1983(struct hda_codec *codec) | |||
1476 | #define AD1981_DAC 0x03 | 1518 | #define AD1981_DAC 0x03 |
1477 | #define AD1981_ADC 0x04 | 1519 | #define AD1981_ADC 0x04 |
1478 | 1520 | ||
1479 | static hda_nid_t ad1981_dac_nids[1] = { AD1981_DAC }; | 1521 | static const hda_nid_t ad1981_dac_nids[1] = { AD1981_DAC }; |
1480 | static hda_nid_t ad1981_adc_nids[1] = { AD1981_ADC }; | 1522 | static const hda_nid_t ad1981_adc_nids[1] = { AD1981_ADC }; |
1481 | static hda_nid_t ad1981_capsrc_nids[1] = { 0x15 }; | 1523 | static const hda_nid_t ad1981_capsrc_nids[1] = { 0x15 }; |
1482 | 1524 | ||
1483 | /* 0x0c, 0x09, 0x0e, 0x0f, 0x19, 0x05, 0x18, 0x17 */ | 1525 | /* 0x0c, 0x09, 0x0e, 0x0f, 0x19, 0x05, 0x18, 0x17 */ |
1484 | static struct hda_input_mux ad1981_capture_source = { | 1526 | static const struct hda_input_mux ad1981_capture_source = { |
1485 | .num_items = 7, | 1527 | .num_items = 7, |
1486 | .items = { | 1528 | .items = { |
1487 | { "Front Mic", 0x0 }, | 1529 | { "Front Mic", 0x0 }, |
@@ -1494,7 +1536,7 @@ static struct hda_input_mux ad1981_capture_source = { | |||
1494 | }, | 1536 | }, |
1495 | }; | 1537 | }; |
1496 | 1538 | ||
1497 | static struct snd_kcontrol_new ad1981_mixers[] = { | 1539 | static const struct snd_kcontrol_new ad1981_mixers[] = { |
1498 | HDA_CODEC_VOLUME("Front Playback Volume", 0x05, 0x0, HDA_OUTPUT), | 1540 | HDA_CODEC_VOLUME("Front Playback Volume", 0x05, 0x0, HDA_OUTPUT), |
1499 | HDA_CODEC_MUTE("Front Playback Switch", 0x05, 0x0, HDA_OUTPUT), | 1541 | HDA_CODEC_MUTE("Front Playback Switch", 0x05, 0x0, HDA_OUTPUT), |
1500 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x06, 0x0, HDA_OUTPUT), | 1542 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x06, 0x0, HDA_OUTPUT), |
@@ -1513,8 +1555,8 @@ static struct snd_kcontrol_new ad1981_mixers[] = { | |||
1513 | HDA_CODEC_MUTE("Mic Playback Switch", 0x1c, 0x0, HDA_OUTPUT), | 1555 | HDA_CODEC_MUTE("Mic Playback Switch", 0x1c, 0x0, HDA_OUTPUT), |
1514 | HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT), | 1556 | HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT), |
1515 | HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT), | 1557 | HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT), |
1516 | HDA_CODEC_VOLUME("Front Mic Boost", 0x08, 0x0, HDA_INPUT), | 1558 | HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x08, 0x0, HDA_INPUT), |
1517 | HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x0, HDA_INPUT), | 1559 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0x0, HDA_INPUT), |
1518 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), | 1560 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), |
1519 | HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT), | 1561 | HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT), |
1520 | { | 1562 | { |
@@ -1535,7 +1577,7 @@ static struct snd_kcontrol_new ad1981_mixers[] = { | |||
1535 | { } /* end */ | 1577 | { } /* end */ |
1536 | }; | 1578 | }; |
1537 | 1579 | ||
1538 | static struct hda_verb ad1981_init_verbs[] = { | 1580 | static const struct hda_verb ad1981_init_verbs[] = { |
1539 | /* Front, HP, Mono; mute as default */ | 1581 | /* Front, HP, Mono; mute as default */ |
1540 | {0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, | 1582 | {0x05, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, |
1541 | {0x06, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, | 1583 | {0x06, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, |
@@ -1583,7 +1625,7 @@ static struct hda_verb ad1981_init_verbs[] = { | |||
1583 | }; | 1625 | }; |
1584 | 1626 | ||
1585 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 1627 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
1586 | static struct hda_amp_list ad1981_loopbacks[] = { | 1628 | static const struct hda_amp_list ad1981_loopbacks[] = { |
1587 | { 0x12, HDA_OUTPUT, 0 }, /* Front Mic */ | 1629 | { 0x12, HDA_OUTPUT, 0 }, /* Front Mic */ |
1588 | { 0x13, HDA_OUTPUT, 0 }, /* Line */ | 1630 | { 0x13, HDA_OUTPUT, 0 }, /* Line */ |
1589 | { 0x1b, HDA_OUTPUT, 0 }, /* Aux */ | 1631 | { 0x1b, HDA_OUTPUT, 0 }, /* Aux */ |
@@ -1603,7 +1645,7 @@ static struct hda_amp_list ad1981_loopbacks[] = { | |||
1603 | #define AD1981_HP_EVENT 0x37 | 1645 | #define AD1981_HP_EVENT 0x37 |
1604 | #define AD1981_MIC_EVENT 0x38 | 1646 | #define AD1981_MIC_EVENT 0x38 |
1605 | 1647 | ||
1606 | static struct hda_verb ad1981_hp_init_verbs[] = { | 1648 | static const struct hda_verb ad1981_hp_init_verbs[] = { |
1607 | {0x05, AC_VERB_SET_EAPD_BTLENABLE, 0x00 }, /* default off */ | 1649 | {0x05, AC_VERB_SET_EAPD_BTLENABLE, 0x00 }, /* default off */ |
1608 | /* pin sensing on HP and Mic jacks */ | 1650 | /* pin sensing on HP and Mic jacks */ |
1609 | {0x06, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_HP_EVENT}, | 1651 | {0x06, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_HP_EVENT}, |
@@ -1632,7 +1674,7 @@ static int ad1981_hp_master_sw_put(struct snd_kcontrol *kcontrol, | |||
1632 | } | 1674 | } |
1633 | 1675 | ||
1634 | /* bind volumes of both NID 0x05 and 0x06 */ | 1676 | /* bind volumes of both NID 0x05 and 0x06 */ |
1635 | static struct hda_bind_ctls ad1981_hp_bind_master_vol = { | 1677 | static const struct hda_bind_ctls ad1981_hp_bind_master_vol = { |
1636 | .ops = &snd_hda_bind_vol, | 1678 | .ops = &snd_hda_bind_vol, |
1637 | .values = { | 1679 | .values = { |
1638 | HDA_COMPOSE_AMP_VAL(0x05, 3, 0, HDA_OUTPUT), | 1680 | HDA_COMPOSE_AMP_VAL(0x05, 3, 0, HDA_OUTPUT), |
@@ -1654,12 +1696,12 @@ static void ad1981_hp_automute(struct hda_codec *codec) | |||
1654 | /* toggle input of built-in and mic jack appropriately */ | 1696 | /* toggle input of built-in and mic jack appropriately */ |
1655 | static void ad1981_hp_automic(struct hda_codec *codec) | 1697 | static void ad1981_hp_automic(struct hda_codec *codec) |
1656 | { | 1698 | { |
1657 | static struct hda_verb mic_jack_on[] = { | 1699 | static const struct hda_verb mic_jack_on[] = { |
1658 | {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, | 1700 | {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, |
1659 | {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, | 1701 | {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, |
1660 | {} | 1702 | {} |
1661 | }; | 1703 | }; |
1662 | static struct hda_verb mic_jack_off[] = { | 1704 | static const struct hda_verb mic_jack_off[] = { |
1663 | {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, | 1705 | {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080}, |
1664 | {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, | 1706 | {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000}, |
1665 | {} | 1707 | {} |
@@ -1688,7 +1730,7 @@ static void ad1981_hp_unsol_event(struct hda_codec *codec, | |||
1688 | } | 1730 | } |
1689 | } | 1731 | } |
1690 | 1732 | ||
1691 | static struct hda_input_mux ad1981_hp_capture_source = { | 1733 | static const struct hda_input_mux ad1981_hp_capture_source = { |
1692 | .num_items = 3, | 1734 | .num_items = 3, |
1693 | .items = { | 1735 | .items = { |
1694 | { "Mic", 0x0 }, | 1736 | { "Mic", 0x0 }, |
@@ -1697,7 +1739,7 @@ static struct hda_input_mux ad1981_hp_capture_source = { | |||
1697 | }, | 1739 | }, |
1698 | }; | 1740 | }; |
1699 | 1741 | ||
1700 | static struct snd_kcontrol_new ad1981_hp_mixers[] = { | 1742 | static const struct snd_kcontrol_new ad1981_hp_mixers[] = { |
1701 | HDA_BIND_VOL("Master Playback Volume", &ad1981_hp_bind_master_vol), | 1743 | HDA_BIND_VOL("Master Playback Volume", &ad1981_hp_bind_master_vol), |
1702 | { | 1744 | { |
1703 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 1745 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
@@ -1724,8 +1766,8 @@ static struct snd_kcontrol_new ad1981_hp_mixers[] = { | |||
1724 | HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT), | 1766 | HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT), |
1725 | HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT), | 1767 | HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT), |
1726 | #endif | 1768 | #endif |
1727 | HDA_CODEC_VOLUME("Mic Boost", 0x08, 0x0, HDA_INPUT), | 1769 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x08, 0x0, HDA_INPUT), |
1728 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x18, 0x0, HDA_INPUT), | 1770 | HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x18, 0x0, HDA_INPUT), |
1729 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), | 1771 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), |
1730 | HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT), | 1772 | HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT), |
1731 | { | 1773 | { |
@@ -1748,7 +1790,7 @@ static int ad1981_hp_init(struct hda_codec *codec) | |||
1748 | } | 1790 | } |
1749 | 1791 | ||
1750 | /* configuration for Toshiba Laptops */ | 1792 | /* configuration for Toshiba Laptops */ |
1751 | static struct hda_verb ad1981_toshiba_init_verbs[] = { | 1793 | static const struct hda_verb ad1981_toshiba_init_verbs[] = { |
1752 | {0x05, AC_VERB_SET_EAPD_BTLENABLE, 0x01 }, /* default on */ | 1794 | {0x05, AC_VERB_SET_EAPD_BTLENABLE, 0x01 }, /* default on */ |
1753 | /* pin sensing on HP and Mic jacks */ | 1795 | /* pin sensing on HP and Mic jacks */ |
1754 | {0x06, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_HP_EVENT}, | 1796 | {0x06, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1981_HP_EVENT}, |
@@ -1756,14 +1798,14 @@ static struct hda_verb ad1981_toshiba_init_verbs[] = { | |||
1756 | {} | 1798 | {} |
1757 | }; | 1799 | }; |
1758 | 1800 | ||
1759 | static struct snd_kcontrol_new ad1981_toshiba_mixers[] = { | 1801 | static const struct snd_kcontrol_new ad1981_toshiba_mixers[] = { |
1760 | HDA_CODEC_VOLUME("Amp Volume", 0x1a, 0x0, HDA_OUTPUT), | 1802 | HDA_CODEC_VOLUME("Amp Volume", 0x1a, 0x0, HDA_OUTPUT), |
1761 | HDA_CODEC_MUTE("Amp Switch", 0x1a, 0x0, HDA_OUTPUT), | 1803 | HDA_CODEC_MUTE("Amp Switch", 0x1a, 0x0, HDA_OUTPUT), |
1762 | { } | 1804 | { } |
1763 | }; | 1805 | }; |
1764 | 1806 | ||
1765 | /* configuration for Lenovo Thinkpad T60 */ | 1807 | /* configuration for Lenovo Thinkpad T60 */ |
1766 | static struct snd_kcontrol_new ad1981_thinkpad_mixers[] = { | 1808 | static const struct snd_kcontrol_new ad1981_thinkpad_mixers[] = { |
1767 | HDA_CODEC_VOLUME("Master Playback Volume", 0x05, 0x0, HDA_OUTPUT), | 1809 | HDA_CODEC_VOLUME("Master Playback Volume", 0x05, 0x0, HDA_OUTPUT), |
1768 | HDA_CODEC_MUTE("Master Playback Switch", 0x05, 0x0, HDA_OUTPUT), | 1810 | HDA_CODEC_MUTE("Master Playback Switch", 0x05, 0x0, HDA_OUTPUT), |
1769 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT), | 1811 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x11, 0x0, HDA_OUTPUT), |
@@ -1772,7 +1814,7 @@ static struct snd_kcontrol_new ad1981_thinkpad_mixers[] = { | |||
1772 | HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT), | 1814 | HDA_CODEC_MUTE("Mic Playback Switch", 0x12, 0x0, HDA_OUTPUT), |
1773 | HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT), | 1815 | HDA_CODEC_VOLUME("CD Playback Volume", 0x1d, 0x0, HDA_OUTPUT), |
1774 | HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT), | 1816 | HDA_CODEC_MUTE("CD Playback Switch", 0x1d, 0x0, HDA_OUTPUT), |
1775 | HDA_CODEC_VOLUME("Mic Boost", 0x08, 0x0, HDA_INPUT), | 1817 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x08, 0x0, HDA_INPUT), |
1776 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), | 1818 | HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT), |
1777 | HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT), | 1819 | HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_OUTPUT), |
1778 | { | 1820 | { |
@@ -1793,7 +1835,7 @@ static struct snd_kcontrol_new ad1981_thinkpad_mixers[] = { | |||
1793 | { } /* end */ | 1835 | { } /* end */ |
1794 | }; | 1836 | }; |
1795 | 1837 | ||
1796 | static struct hda_input_mux ad1981_thinkpad_capture_source = { | 1838 | static const struct hda_input_mux ad1981_thinkpad_capture_source = { |
1797 | .num_items = 3, | 1839 | .num_items = 3, |
1798 | .items = { | 1840 | .items = { |
1799 | { "Mic", 0x0 }, | 1841 | { "Mic", 0x0 }, |
@@ -1811,14 +1853,14 @@ enum { | |||
1811 | AD1981_MODELS | 1853 | AD1981_MODELS |
1812 | }; | 1854 | }; |
1813 | 1855 | ||
1814 | static const char *ad1981_models[AD1981_MODELS] = { | 1856 | static const char * const ad1981_models[AD1981_MODELS] = { |
1815 | [AD1981_HP] = "hp", | 1857 | [AD1981_HP] = "hp", |
1816 | [AD1981_THINKPAD] = "thinkpad", | 1858 | [AD1981_THINKPAD] = "thinkpad", |
1817 | [AD1981_BASIC] = "basic", | 1859 | [AD1981_BASIC] = "basic", |
1818 | [AD1981_TOSHIBA] = "toshiba" | 1860 | [AD1981_TOSHIBA] = "toshiba" |
1819 | }; | 1861 | }; |
1820 | 1862 | ||
1821 | static struct snd_pci_quirk ad1981_cfg_tbl[] = { | 1863 | static const struct snd_pci_quirk ad1981_cfg_tbl[] = { |
1822 | SND_PCI_QUIRK(0x1014, 0x0597, "Lenovo Z60", AD1981_THINKPAD), | 1864 | SND_PCI_QUIRK(0x1014, 0x0597, "Lenovo Z60", AD1981_THINKPAD), |
1823 | SND_PCI_QUIRK(0x1014, 0x05b7, "Lenovo Z60m", AD1981_THINKPAD), | 1865 | SND_PCI_QUIRK(0x1014, 0x05b7, "Lenovo Z60m", AD1981_THINKPAD), |
1824 | /* All HP models */ | 1866 | /* All HP models */ |
@@ -1917,6 +1959,7 @@ static int patch_ad1981(struct hda_codec *codec) | |||
1917 | } | 1959 | } |
1918 | 1960 | ||
1919 | codec->no_trigger_sense = 1; | 1961 | codec->no_trigger_sense = 1; |
1962 | codec->no_sticky_stream = 1; | ||
1920 | 1963 | ||
1921 | return 0; | 1964 | return 0; |
1922 | } | 1965 | } |
@@ -2012,6 +2055,7 @@ static int patch_ad1981(struct hda_codec *codec) | |||
2012 | enum { | 2055 | enum { |
2013 | AD1988_6STACK, | 2056 | AD1988_6STACK, |
2014 | AD1988_6STACK_DIG, | 2057 | AD1988_6STACK_DIG, |
2058 | AD1988_6STACK_DIG_FP, | ||
2015 | AD1988_3STACK, | 2059 | AD1988_3STACK, |
2016 | AD1988_3STACK_DIG, | 2060 | AD1988_3STACK_DIG, |
2017 | AD1988_LAPTOP, | 2061 | AD1988_LAPTOP, |
@@ -2031,28 +2075,32 @@ enum { | |||
2031 | * mixers | 2075 | * mixers |
2032 | */ | 2076 | */ |
2033 | 2077 | ||
2034 | static hda_nid_t ad1988_6stack_dac_nids[4] = { | 2078 | static const hda_nid_t ad1988_6stack_dac_nids[4] = { |
2035 | 0x04, 0x06, 0x05, 0x0a | 2079 | 0x04, 0x06, 0x05, 0x0a |
2036 | }; | 2080 | }; |
2037 | 2081 | ||
2038 | static hda_nid_t ad1988_3stack_dac_nids[3] = { | 2082 | static const hda_nid_t ad1988_3stack_dac_nids[3] = { |
2039 | 0x04, 0x05, 0x0a | 2083 | 0x04, 0x05, 0x0a |
2040 | }; | 2084 | }; |
2041 | 2085 | ||
2042 | /* for AD1988A revision-2, DAC2-4 are swapped */ | 2086 | /* for AD1988A revision-2, DAC2-4 are swapped */ |
2043 | static hda_nid_t ad1988_6stack_dac_nids_rev2[4] = { | 2087 | static const hda_nid_t ad1988_6stack_dac_nids_rev2[4] = { |
2044 | 0x04, 0x05, 0x0a, 0x06 | 2088 | 0x04, 0x05, 0x0a, 0x06 |
2045 | }; | 2089 | }; |
2046 | 2090 | ||
2047 | static hda_nid_t ad1988_3stack_dac_nids_rev2[3] = { | 2091 | static const hda_nid_t ad1988_alt_dac_nid[1] = { |
2092 | 0x03 | ||
2093 | }; | ||
2094 | |||
2095 | static const hda_nid_t ad1988_3stack_dac_nids_rev2[3] = { | ||
2048 | 0x04, 0x0a, 0x06 | 2096 | 0x04, 0x0a, 0x06 |
2049 | }; | 2097 | }; |
2050 | 2098 | ||
2051 | static hda_nid_t ad1988_adc_nids[3] = { | 2099 | static const hda_nid_t ad1988_adc_nids[3] = { |
2052 | 0x08, 0x09, 0x0f | 2100 | 0x08, 0x09, 0x0f |
2053 | }; | 2101 | }; |
2054 | 2102 | ||
2055 | static hda_nid_t ad1988_capsrc_nids[3] = { | 2103 | static const hda_nid_t ad1988_capsrc_nids[3] = { |
2056 | 0x0c, 0x0d, 0x0e | 2104 | 0x0c, 0x0d, 0x0e |
2057 | }; | 2105 | }; |
2058 | 2106 | ||
@@ -2060,11 +2108,11 @@ static hda_nid_t ad1988_capsrc_nids[3] = { | |||
2060 | #define AD1988_SPDIF_OUT_HDMI 0x0b | 2108 | #define AD1988_SPDIF_OUT_HDMI 0x0b |
2061 | #define AD1988_SPDIF_IN 0x07 | 2109 | #define AD1988_SPDIF_IN 0x07 |
2062 | 2110 | ||
2063 | static hda_nid_t ad1989b_slave_dig_outs[] = { | 2111 | static const hda_nid_t ad1989b_slave_dig_outs[] = { |
2064 | AD1988_SPDIF_OUT, AD1988_SPDIF_OUT_HDMI, 0 | 2112 | AD1988_SPDIF_OUT, AD1988_SPDIF_OUT_HDMI, 0 |
2065 | }; | 2113 | }; |
2066 | 2114 | ||
2067 | static struct hda_input_mux ad1988_6stack_capture_source = { | 2115 | static const struct hda_input_mux ad1988_6stack_capture_source = { |
2068 | .num_items = 5, | 2116 | .num_items = 5, |
2069 | .items = { | 2117 | .items = { |
2070 | { "Front Mic", 0x1 }, /* port-B */ | 2118 | { "Front Mic", 0x1 }, /* port-B */ |
@@ -2075,7 +2123,7 @@ static struct hda_input_mux ad1988_6stack_capture_source = { | |||
2075 | }, | 2123 | }, |
2076 | }; | 2124 | }; |
2077 | 2125 | ||
2078 | static struct hda_input_mux ad1988_laptop_capture_source = { | 2126 | static const struct hda_input_mux ad1988_laptop_capture_source = { |
2079 | .num_items = 3, | 2127 | .num_items = 3, |
2080 | .items = { | 2128 | .items = { |
2081 | { "Mic/Line", 0x1 }, /* port-B */ | 2129 | { "Mic/Line", 0x1 }, /* port-B */ |
@@ -2118,7 +2166,7 @@ static int ad198x_ch_mode_put(struct snd_kcontrol *kcontrol, | |||
2118 | } | 2166 | } |
2119 | 2167 | ||
2120 | /* 6-stack mode */ | 2168 | /* 6-stack mode */ |
2121 | static struct snd_kcontrol_new ad1988_6stack_mixers1[] = { | 2169 | static const struct snd_kcontrol_new ad1988_6stack_mixers1[] = { |
2122 | HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT), | 2170 | HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT), |
2123 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x06, 0x0, HDA_OUTPUT), | 2171 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x06, 0x0, HDA_OUTPUT), |
2124 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT), | 2172 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT), |
@@ -2127,7 +2175,7 @@ static struct snd_kcontrol_new ad1988_6stack_mixers1[] = { | |||
2127 | { } /* end */ | 2175 | { } /* end */ |
2128 | }; | 2176 | }; |
2129 | 2177 | ||
2130 | static struct snd_kcontrol_new ad1988_6stack_mixers1_rev2[] = { | 2178 | static const struct snd_kcontrol_new ad1988_6stack_mixers1_rev2[] = { |
2131 | HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT), | 2179 | HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT), |
2132 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x05, 0x0, HDA_OUTPUT), | 2180 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x05, 0x0, HDA_OUTPUT), |
2133 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT), | 2181 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT), |
@@ -2136,7 +2184,7 @@ static struct snd_kcontrol_new ad1988_6stack_mixers1_rev2[] = { | |||
2136 | { } /* end */ | 2184 | { } /* end */ |
2137 | }; | 2185 | }; |
2138 | 2186 | ||
2139 | static struct snd_kcontrol_new ad1988_6stack_mixers2[] = { | 2187 | static const struct snd_kcontrol_new ad1988_6stack_mixers2[] = { |
2140 | HDA_BIND_MUTE("Front Playback Switch", 0x29, 2, HDA_INPUT), | 2188 | HDA_BIND_MUTE("Front Playback Switch", 0x29, 2, HDA_INPUT), |
2141 | HDA_BIND_MUTE("Surround Playback Switch", 0x2a, 2, HDA_INPUT), | 2189 | HDA_BIND_MUTE("Surround Playback Switch", 0x2a, 2, HDA_INPUT), |
2142 | HDA_BIND_MUTE_MONO("Center Playback Switch", 0x27, 1, 2, HDA_INPUT), | 2190 | HDA_BIND_MUTE_MONO("Center Playback Switch", 0x27, 1, 2, HDA_INPUT), |
@@ -2157,14 +2205,20 @@ static struct snd_kcontrol_new ad1988_6stack_mixers2[] = { | |||
2157 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), | 2205 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), |
2158 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), | 2206 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), |
2159 | 2207 | ||
2160 | HDA_CODEC_VOLUME("Front Mic Boost", 0x39, 0x0, HDA_OUTPUT), | 2208 | HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x39, 0x0, HDA_OUTPUT), |
2161 | HDA_CODEC_VOLUME("Mic Boost", 0x3c, 0x0, HDA_OUTPUT), | 2209 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x3c, 0x0, HDA_OUTPUT), |
2210 | |||
2211 | { } /* end */ | ||
2212 | }; | ||
2213 | |||
2214 | static const struct snd_kcontrol_new ad1988_6stack_fp_mixers[] = { | ||
2215 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), | ||
2162 | 2216 | ||
2163 | { } /* end */ | 2217 | { } /* end */ |
2164 | }; | 2218 | }; |
2165 | 2219 | ||
2166 | /* 3-stack mode */ | 2220 | /* 3-stack mode */ |
2167 | static struct snd_kcontrol_new ad1988_3stack_mixers1[] = { | 2221 | static const struct snd_kcontrol_new ad1988_3stack_mixers1[] = { |
2168 | HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT), | 2222 | HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT), |
2169 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0a, 0x0, HDA_OUTPUT), | 2223 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0a, 0x0, HDA_OUTPUT), |
2170 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT), | 2224 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT), |
@@ -2172,7 +2226,7 @@ static struct snd_kcontrol_new ad1988_3stack_mixers1[] = { | |||
2172 | { } /* end */ | 2226 | { } /* end */ |
2173 | }; | 2227 | }; |
2174 | 2228 | ||
2175 | static struct snd_kcontrol_new ad1988_3stack_mixers1_rev2[] = { | 2229 | static const struct snd_kcontrol_new ad1988_3stack_mixers1_rev2[] = { |
2176 | HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT), | 2230 | HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT), |
2177 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0a, 0x0, HDA_OUTPUT), | 2231 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0a, 0x0, HDA_OUTPUT), |
2178 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x06, 1, 0x0, HDA_OUTPUT), | 2232 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x06, 1, 0x0, HDA_OUTPUT), |
@@ -2180,7 +2234,7 @@ static struct snd_kcontrol_new ad1988_3stack_mixers1_rev2[] = { | |||
2180 | { } /* end */ | 2234 | { } /* end */ |
2181 | }; | 2235 | }; |
2182 | 2236 | ||
2183 | static struct snd_kcontrol_new ad1988_3stack_mixers2[] = { | 2237 | static const struct snd_kcontrol_new ad1988_3stack_mixers2[] = { |
2184 | HDA_BIND_MUTE("Front Playback Switch", 0x29, 2, HDA_INPUT), | 2238 | HDA_BIND_MUTE("Front Playback Switch", 0x29, 2, HDA_INPUT), |
2185 | HDA_BIND_MUTE("Surround Playback Switch", 0x2c, 2, HDA_INPUT), | 2239 | HDA_BIND_MUTE("Surround Playback Switch", 0x2c, 2, HDA_INPUT), |
2186 | HDA_BIND_MUTE_MONO("Center Playback Switch", 0x26, 1, 2, HDA_INPUT), | 2240 | HDA_BIND_MUTE_MONO("Center Playback Switch", 0x26, 1, 2, HDA_INPUT), |
@@ -2200,8 +2254,8 @@ static struct snd_kcontrol_new ad1988_3stack_mixers2[] = { | |||
2200 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), | 2254 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), |
2201 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), | 2255 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), |
2202 | 2256 | ||
2203 | HDA_CODEC_VOLUME("Front Mic Boost", 0x39, 0x0, HDA_OUTPUT), | 2257 | HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x39, 0x0, HDA_OUTPUT), |
2204 | HDA_CODEC_VOLUME("Mic Boost", 0x3c, 0x0, HDA_OUTPUT), | 2258 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x3c, 0x0, HDA_OUTPUT), |
2205 | { | 2259 | { |
2206 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 2260 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
2207 | .name = "Channel Mode", | 2261 | .name = "Channel Mode", |
@@ -2214,7 +2268,7 @@ static struct snd_kcontrol_new ad1988_3stack_mixers2[] = { | |||
2214 | }; | 2268 | }; |
2215 | 2269 | ||
2216 | /* laptop mode */ | 2270 | /* laptop mode */ |
2217 | static struct snd_kcontrol_new ad1988_laptop_mixers[] = { | 2271 | static const struct snd_kcontrol_new ad1988_laptop_mixers[] = { |
2218 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT), | 2272 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT), |
2219 | HDA_CODEC_MUTE("PCM Playback Switch", 0x29, 0x0, HDA_INPUT), | 2273 | HDA_CODEC_MUTE("PCM Playback Switch", 0x29, 0x0, HDA_INPUT), |
2220 | HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT), | 2274 | HDA_BIND_MUTE("Mono Playback Switch", 0x1e, 2, HDA_INPUT), |
@@ -2229,7 +2283,7 @@ static struct snd_kcontrol_new ad1988_laptop_mixers[] = { | |||
2229 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), | 2283 | HDA_CODEC_VOLUME("Analog Mix Playback Volume", 0x21, 0x0, HDA_OUTPUT), |
2230 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), | 2284 | HDA_CODEC_MUTE("Analog Mix Playback Switch", 0x21, 0x0, HDA_OUTPUT), |
2231 | 2285 | ||
2232 | HDA_CODEC_VOLUME("Mic Boost", 0x39, 0x0, HDA_OUTPUT), | 2286 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x39, 0x0, HDA_OUTPUT), |
2233 | 2287 | ||
2234 | { | 2288 | { |
2235 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 2289 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
@@ -2245,7 +2299,7 @@ static struct snd_kcontrol_new ad1988_laptop_mixers[] = { | |||
2245 | }; | 2299 | }; |
2246 | 2300 | ||
2247 | /* capture */ | 2301 | /* capture */ |
2248 | static struct snd_kcontrol_new ad1988_capture_mixers[] = { | 2302 | static const struct snd_kcontrol_new ad1988_capture_mixers[] = { |
2249 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 2303 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
2250 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), | 2304 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), |
2251 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), | 2305 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), |
@@ -2270,7 +2324,7 @@ static struct snd_kcontrol_new ad1988_capture_mixers[] = { | |||
2270 | static int ad1988_spdif_playback_source_info(struct snd_kcontrol *kcontrol, | 2324 | static int ad1988_spdif_playback_source_info(struct snd_kcontrol *kcontrol, |
2271 | struct snd_ctl_elem_info *uinfo) | 2325 | struct snd_ctl_elem_info *uinfo) |
2272 | { | 2326 | { |
2273 | static char *texts[] = { | 2327 | static const char * const texts[] = { |
2274 | "PCM", "ADC1", "ADC2", "ADC3" | 2328 | "PCM", "ADC1", "ADC2", "ADC3" |
2275 | }; | 2329 | }; |
2276 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 2330 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
@@ -2351,7 +2405,7 @@ static int ad1988_spdif_playback_source_put(struct snd_kcontrol *kcontrol, | |||
2351 | return change; | 2405 | return change; |
2352 | } | 2406 | } |
2353 | 2407 | ||
2354 | static struct snd_kcontrol_new ad1988_spdif_out_mixers[] = { | 2408 | static const struct snd_kcontrol_new ad1988_spdif_out_mixers[] = { |
2355 | HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT), | 2409 | HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT), |
2356 | { | 2410 | { |
2357 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 2411 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
@@ -2364,12 +2418,12 @@ static struct snd_kcontrol_new ad1988_spdif_out_mixers[] = { | |||
2364 | { } /* end */ | 2418 | { } /* end */ |
2365 | }; | 2419 | }; |
2366 | 2420 | ||
2367 | static struct snd_kcontrol_new ad1988_spdif_in_mixers[] = { | 2421 | static const struct snd_kcontrol_new ad1988_spdif_in_mixers[] = { |
2368 | HDA_CODEC_VOLUME("IEC958 Capture Volume", 0x1c, 0x0, HDA_INPUT), | 2422 | HDA_CODEC_VOLUME("IEC958 Capture Volume", 0x1c, 0x0, HDA_INPUT), |
2369 | { } /* end */ | 2423 | { } /* end */ |
2370 | }; | 2424 | }; |
2371 | 2425 | ||
2372 | static struct snd_kcontrol_new ad1989_spdif_out_mixers[] = { | 2426 | static const struct snd_kcontrol_new ad1989_spdif_out_mixers[] = { |
2373 | HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT), | 2427 | HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT), |
2374 | HDA_CODEC_VOLUME("HDMI Playback Volume", 0x1d, 0x0, HDA_OUTPUT), | 2428 | HDA_CODEC_VOLUME("HDMI Playback Volume", 0x1d, 0x0, HDA_OUTPUT), |
2375 | { } /* end */ | 2429 | { } /* end */ |
@@ -2382,7 +2436,7 @@ static struct snd_kcontrol_new ad1989_spdif_out_mixers[] = { | |||
2382 | /* | 2436 | /* |
2383 | * for 6-stack (+dig) | 2437 | * for 6-stack (+dig) |
2384 | */ | 2438 | */ |
2385 | static struct hda_verb ad1988_6stack_init_verbs[] = { | 2439 | static const struct hda_verb ad1988_6stack_init_verbs[] = { |
2386 | /* Front, Surround, CLFE, side DAC; unmute as default */ | 2440 | /* Front, Surround, CLFE, side DAC; unmute as default */ |
2387 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 2441 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
2388 | {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 2442 | {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
@@ -2442,7 +2496,20 @@ static struct hda_verb ad1988_6stack_init_verbs[] = { | |||
2442 | { } | 2496 | { } |
2443 | }; | 2497 | }; |
2444 | 2498 | ||
2445 | static struct hda_verb ad1988_capture_init_verbs[] = { | 2499 | static const struct hda_verb ad1988_6stack_fp_init_verbs[] = { |
2500 | /* Headphone; unmute as default */ | ||
2501 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2502 | /* Port-A front headphon path */ | ||
2503 | {0x37, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC0:03h */ | ||
2504 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
2505 | {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
2506 | {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
2507 | {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
2508 | |||
2509 | { } | ||
2510 | }; | ||
2511 | |||
2512 | static const struct hda_verb ad1988_capture_init_verbs[] = { | ||
2446 | /* mute analog mix */ | 2513 | /* mute analog mix */ |
2447 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 2514 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
2448 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | 2515 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, |
@@ -2460,7 +2527,7 @@ static struct hda_verb ad1988_capture_init_verbs[] = { | |||
2460 | { } | 2527 | { } |
2461 | }; | 2528 | }; |
2462 | 2529 | ||
2463 | static struct hda_verb ad1988_spdif_init_verbs[] = { | 2530 | static const struct hda_verb ad1988_spdif_init_verbs[] = { |
2464 | /* SPDIF out sel */ | 2531 | /* SPDIF out sel */ |
2465 | {0x02, AC_VERB_SET_CONNECT_SEL, 0x0}, /* PCM */ | 2532 | {0x02, AC_VERB_SET_CONNECT_SEL, 0x0}, /* PCM */ |
2466 | {0x0b, AC_VERB_SET_CONNECT_SEL, 0x0}, /* ADC1 */ | 2533 | {0x0b, AC_VERB_SET_CONNECT_SEL, 0x0}, /* ADC1 */ |
@@ -2472,14 +2539,14 @@ static struct hda_verb ad1988_spdif_init_verbs[] = { | |||
2472 | { } | 2539 | { } |
2473 | }; | 2540 | }; |
2474 | 2541 | ||
2475 | static struct hda_verb ad1988_spdif_in_init_verbs[] = { | 2542 | static const struct hda_verb ad1988_spdif_in_init_verbs[] = { |
2476 | /* unmute SPDIF input pin */ | 2543 | /* unmute SPDIF input pin */ |
2477 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 2544 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
2478 | { } | 2545 | { } |
2479 | }; | 2546 | }; |
2480 | 2547 | ||
2481 | /* AD1989 has no ADC -> SPDIF route */ | 2548 | /* AD1989 has no ADC -> SPDIF route */ |
2482 | static struct hda_verb ad1989_spdif_init_verbs[] = { | 2549 | static const struct hda_verb ad1989_spdif_init_verbs[] = { |
2483 | /* SPDIF-1 out pin */ | 2550 | /* SPDIF-1 out pin */ |
2484 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | 2551 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, |
2485 | {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */ | 2552 | {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */ |
@@ -2492,7 +2559,7 @@ static struct hda_verb ad1989_spdif_init_verbs[] = { | |||
2492 | /* | 2559 | /* |
2493 | * verbs for 3stack (+dig) | 2560 | * verbs for 3stack (+dig) |
2494 | */ | 2561 | */ |
2495 | static struct hda_verb ad1988_3stack_ch2_init[] = { | 2562 | static const struct hda_verb ad1988_3stack_ch2_init[] = { |
2496 | /* set port-C to line-in */ | 2563 | /* set port-C to line-in */ |
2497 | { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, | 2564 | { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, |
2498 | { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, | 2565 | { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, |
@@ -2502,7 +2569,7 @@ static struct hda_verb ad1988_3stack_ch2_init[] = { | |||
2502 | { } /* end */ | 2569 | { } /* end */ |
2503 | }; | 2570 | }; |
2504 | 2571 | ||
2505 | static struct hda_verb ad1988_3stack_ch6_init[] = { | 2572 | static const struct hda_verb ad1988_3stack_ch6_init[] = { |
2506 | /* set port-C to surround out */ | 2573 | /* set port-C to surround out */ |
2507 | { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, | 2574 | { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, |
2508 | { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | 2575 | { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, |
@@ -2512,12 +2579,12 @@ static struct hda_verb ad1988_3stack_ch6_init[] = { | |||
2512 | { } /* end */ | 2579 | { } /* end */ |
2513 | }; | 2580 | }; |
2514 | 2581 | ||
2515 | static struct hda_channel_mode ad1988_3stack_modes[2] = { | 2582 | static const struct hda_channel_mode ad1988_3stack_modes[2] = { |
2516 | { 2, ad1988_3stack_ch2_init }, | 2583 | { 2, ad1988_3stack_ch2_init }, |
2517 | { 6, ad1988_3stack_ch6_init }, | 2584 | { 6, ad1988_3stack_ch6_init }, |
2518 | }; | 2585 | }; |
2519 | 2586 | ||
2520 | static struct hda_verb ad1988_3stack_init_verbs[] = { | 2587 | static const struct hda_verb ad1988_3stack_init_verbs[] = { |
2521 | /* Front, Surround, CLFE, side DAC; unmute as default */ | 2588 | /* Front, Surround, CLFE, side DAC; unmute as default */ |
2522 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 2589 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
2523 | {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 2590 | {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
@@ -2577,13 +2644,13 @@ static struct hda_verb ad1988_3stack_init_verbs[] = { | |||
2577 | /* | 2644 | /* |
2578 | * verbs for laptop mode (+dig) | 2645 | * verbs for laptop mode (+dig) |
2579 | */ | 2646 | */ |
2580 | static struct hda_verb ad1988_laptop_hp_on[] = { | 2647 | static const struct hda_verb ad1988_laptop_hp_on[] = { |
2581 | /* unmute port-A and mute port-D */ | 2648 | /* unmute port-A and mute port-D */ |
2582 | { 0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | 2649 | { 0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, |
2583 | { 0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, | 2650 | { 0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, |
2584 | { } /* end */ | 2651 | { } /* end */ |
2585 | }; | 2652 | }; |
2586 | static struct hda_verb ad1988_laptop_hp_off[] = { | 2653 | static const struct hda_verb ad1988_laptop_hp_off[] = { |
2587 | /* mute port-A and unmute port-D */ | 2654 | /* mute port-A and unmute port-D */ |
2588 | { 0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, | 2655 | { 0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, |
2589 | { 0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, | 2656 | { 0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, |
@@ -2592,7 +2659,7 @@ static struct hda_verb ad1988_laptop_hp_off[] = { | |||
2592 | 2659 | ||
2593 | #define AD1988_HP_EVENT 0x01 | 2660 | #define AD1988_HP_EVENT 0x01 |
2594 | 2661 | ||
2595 | static struct hda_verb ad1988_laptop_init_verbs[] = { | 2662 | static const struct hda_verb ad1988_laptop_init_verbs[] = { |
2596 | /* Front, Surround, CLFE, side DAC; unmute as default */ | 2663 | /* Front, Surround, CLFE, side DAC; unmute as default */ |
2597 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 2664 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
2598 | {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 2665 | {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
@@ -2656,7 +2723,7 @@ static void ad1988_laptop_unsol_event(struct hda_codec *codec, unsigned int res) | |||
2656 | } | 2723 | } |
2657 | 2724 | ||
2658 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 2725 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
2659 | static struct hda_amp_list ad1988_loopbacks[] = { | 2726 | static const struct hda_amp_list ad1988_loopbacks[] = { |
2660 | { 0x20, HDA_INPUT, 0 }, /* Front Mic */ | 2727 | { 0x20, HDA_INPUT, 0 }, /* Front Mic */ |
2661 | { 0x20, HDA_INPUT, 1 }, /* Line */ | 2728 | { 0x20, HDA_INPUT, 1 }, /* Line */ |
2662 | { 0x20, HDA_INPUT, 4 }, /* Mic */ | 2729 | { 0x20, HDA_INPUT, 4 }, /* Mic */ |
@@ -2674,7 +2741,7 @@ enum { | |||
2674 | AD_CTL_WIDGET_MUTE, | 2741 | AD_CTL_WIDGET_MUTE, |
2675 | AD_CTL_BIND_MUTE, | 2742 | AD_CTL_BIND_MUTE, |
2676 | }; | 2743 | }; |
2677 | static struct snd_kcontrol_new ad1988_control_templates[] = { | 2744 | static const struct snd_kcontrol_new ad1988_control_templates[] = { |
2678 | HDA_CODEC_VOLUME(NULL, 0, 0, 0), | 2745 | HDA_CODEC_VOLUME(NULL, 0, 0, 0), |
2679 | HDA_CODEC_MUTE(NULL, 0, 0, 0), | 2746 | HDA_CODEC_MUTE(NULL, 0, 0, 0), |
2680 | HDA_BIND_MUTE(NULL, 0, 0, 0), | 2747 | HDA_BIND_MUTE(NULL, 0, 0, 0), |
@@ -2703,18 +2770,18 @@ static int add_control(struct ad198x_spec *spec, int type, const char *name, | |||
2703 | #define AD1988_PIN_CD_NID 0x18 | 2770 | #define AD1988_PIN_CD_NID 0x18 |
2704 | #define AD1988_PIN_BEEP_NID 0x10 | 2771 | #define AD1988_PIN_BEEP_NID 0x10 |
2705 | 2772 | ||
2706 | static hda_nid_t ad1988_mixer_nids[8] = { | 2773 | static const hda_nid_t ad1988_mixer_nids[8] = { |
2707 | /* A B C D E F G H */ | 2774 | /* A B C D E F G H */ |
2708 | 0x22, 0x2b, 0x2c, 0x29, 0x26, 0x2a, 0x27, 0x28 | 2775 | 0x22, 0x2b, 0x2c, 0x29, 0x26, 0x2a, 0x27, 0x28 |
2709 | }; | 2776 | }; |
2710 | 2777 | ||
2711 | static inline hda_nid_t ad1988_idx_to_dac(struct hda_codec *codec, int idx) | 2778 | static inline hda_nid_t ad1988_idx_to_dac(struct hda_codec *codec, int idx) |
2712 | { | 2779 | { |
2713 | static hda_nid_t idx_to_dac[8] = { | 2780 | static const hda_nid_t idx_to_dac[8] = { |
2714 | /* A B C D E F G H */ | 2781 | /* A B C D E F G H */ |
2715 | 0x04, 0x06, 0x05, 0x04, 0x0a, 0x06, 0x05, 0x0a | 2782 | 0x04, 0x06, 0x05, 0x04, 0x0a, 0x06, 0x05, 0x0a |
2716 | }; | 2783 | }; |
2717 | static hda_nid_t idx_to_dac_rev2[8] = { | 2784 | static const hda_nid_t idx_to_dac_rev2[8] = { |
2718 | /* A B C D E F G H */ | 2785 | /* A B C D E F G H */ |
2719 | 0x04, 0x05, 0x0a, 0x04, 0x06, 0x05, 0x0a, 0x06 | 2786 | 0x04, 0x05, 0x0a, 0x04, 0x06, 0x05, 0x0a, 0x06 |
2720 | }; | 2787 | }; |
@@ -2724,13 +2791,13 @@ static inline hda_nid_t ad1988_idx_to_dac(struct hda_codec *codec, int idx) | |||
2724 | return idx_to_dac[idx]; | 2791 | return idx_to_dac[idx]; |
2725 | } | 2792 | } |
2726 | 2793 | ||
2727 | static hda_nid_t ad1988_boost_nids[8] = { | 2794 | static const hda_nid_t ad1988_boost_nids[8] = { |
2728 | 0x38, 0x39, 0x3a, 0x3d, 0x3c, 0x3b, 0, 0 | 2795 | 0x38, 0x39, 0x3a, 0x3d, 0x3c, 0x3b, 0, 0 |
2729 | }; | 2796 | }; |
2730 | 2797 | ||
2731 | static int ad1988_pin_idx(hda_nid_t nid) | 2798 | static int ad1988_pin_idx(hda_nid_t nid) |
2732 | { | 2799 | { |
2733 | static hda_nid_t ad1988_io_pins[8] = { | 2800 | static const hda_nid_t ad1988_io_pins[8] = { |
2734 | 0x11, 0x14, 0x15, 0x12, 0x17, 0x16, 0x24, 0x25 | 2801 | 0x11, 0x14, 0x15, 0x12, 0x17, 0x16, 0x24, 0x25 |
2735 | }; | 2802 | }; |
2736 | int i; | 2803 | int i; |
@@ -2742,7 +2809,7 @@ static int ad1988_pin_idx(hda_nid_t nid) | |||
2742 | 2809 | ||
2743 | static int ad1988_pin_to_loopback_idx(hda_nid_t nid) | 2810 | static int ad1988_pin_to_loopback_idx(hda_nid_t nid) |
2744 | { | 2811 | { |
2745 | static int loopback_idx[8] = { | 2812 | static const int loopback_idx[8] = { |
2746 | 2, 0, 1, 3, 4, 5, 1, 4 | 2813 | 2, 0, 1, 3, 4, 5, 1, 4 |
2747 | }; | 2814 | }; |
2748 | switch (nid) { | 2815 | switch (nid) { |
@@ -2755,7 +2822,7 @@ static int ad1988_pin_to_loopback_idx(hda_nid_t nid) | |||
2755 | 2822 | ||
2756 | static int ad1988_pin_to_adc_idx(hda_nid_t nid) | 2823 | static int ad1988_pin_to_adc_idx(hda_nid_t nid) |
2757 | { | 2824 | { |
2758 | static int adc_idx[8] = { | 2825 | static const int adc_idx[8] = { |
2759 | 0, 1, 2, 8, 4, 3, 6, 7 | 2826 | 0, 1, 2, 8, 4, 3, 6, 7 |
2760 | }; | 2827 | }; |
2761 | switch (nid) { | 2828 | switch (nid) { |
@@ -2778,7 +2845,7 @@ static int ad1988_auto_fill_dac_nids(struct hda_codec *codec, | |||
2778 | /* check the pins hardwired to audio widget */ | 2845 | /* check the pins hardwired to audio widget */ |
2779 | for (i = 0; i < cfg->line_outs; i++) { | 2846 | for (i = 0; i < cfg->line_outs; i++) { |
2780 | idx = ad1988_pin_idx(cfg->line_out_pins[i]); | 2847 | idx = ad1988_pin_idx(cfg->line_out_pins[i]); |
2781 | spec->multiout.dac_nids[i] = ad1988_idx_to_dac(codec, idx); | 2848 | spec->private_dac_nids[i] = ad1988_idx_to_dac(codec, idx); |
2782 | } | 2849 | } |
2783 | spec->multiout.num_dacs = cfg->line_outs; | 2850 | spec->multiout.num_dacs = cfg->line_outs; |
2784 | return 0; | 2851 | return 0; |
@@ -2789,7 +2856,9 @@ static int ad1988_auto_create_multi_out_ctls(struct ad198x_spec *spec, | |||
2789 | const struct auto_pin_cfg *cfg) | 2856 | const struct auto_pin_cfg *cfg) |
2790 | { | 2857 | { |
2791 | char name[32]; | 2858 | char name[32]; |
2792 | static const char *chname[4] = { "Front", "Surround", NULL /*CLFE*/, "Side" }; | 2859 | static const char * const chname[4] = { |
2860 | "Front", "Surround", NULL /*CLFE*/, "Side" | ||
2861 | }; | ||
2793 | hda_nid_t nid; | 2862 | hda_nid_t nid; |
2794 | int i, err; | 2863 | int i, err; |
2795 | 2864 | ||
@@ -2880,7 +2949,7 @@ static int ad1988_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin, | |||
2880 | 2949 | ||
2881 | /* create input playback/capture controls for the given pin */ | 2950 | /* create input playback/capture controls for the given pin */ |
2882 | static int new_analog_input(struct ad198x_spec *spec, hda_nid_t pin, | 2951 | static int new_analog_input(struct ad198x_spec *spec, hda_nid_t pin, |
2883 | const char *ctlname, int boost) | 2952 | const char *ctlname, int ctlidx, int boost) |
2884 | { | 2953 | { |
2885 | char name[32]; | 2954 | char name[32]; |
2886 | int err, idx; | 2955 | int err, idx; |
@@ -2899,7 +2968,7 @@ static int new_analog_input(struct ad198x_spec *spec, hda_nid_t pin, | |||
2899 | idx = ad1988_pin_idx(pin); | 2968 | idx = ad1988_pin_idx(pin); |
2900 | bnid = ad1988_boost_nids[idx]; | 2969 | bnid = ad1988_boost_nids[idx]; |
2901 | if (bnid) { | 2970 | if (bnid) { |
2902 | sprintf(name, "%s Boost", ctlname); | 2971 | sprintf(name, "%s Boost Volume", ctlname); |
2903 | return add_control(spec, AD_CTL_WIDGET_VOL, name, | 2972 | return add_control(spec, AD_CTL_WIDGET_VOL, name, |
2904 | HDA_COMPOSE_AMP_VAL(bnid, 3, idx, HDA_OUTPUT)); | 2973 | HDA_COMPOSE_AMP_VAL(bnid, 3, idx, HDA_OUTPUT)); |
2905 | 2974 | ||
@@ -2909,25 +2978,27 @@ static int new_analog_input(struct ad198x_spec *spec, hda_nid_t pin, | |||
2909 | } | 2978 | } |
2910 | 2979 | ||
2911 | /* create playback/capture controls for input pins */ | 2980 | /* create playback/capture controls for input pins */ |
2912 | static int ad1988_auto_create_analog_input_ctls(struct ad198x_spec *spec, | 2981 | static int ad1988_auto_create_analog_input_ctls(struct hda_codec *codec, |
2913 | const struct auto_pin_cfg *cfg) | 2982 | const struct auto_pin_cfg *cfg) |
2914 | { | 2983 | { |
2984 | struct ad198x_spec *spec = codec->spec; | ||
2915 | struct hda_input_mux *imux = &spec->private_imux; | 2985 | struct hda_input_mux *imux = &spec->private_imux; |
2916 | int i, err; | 2986 | int i, err, type, type_idx; |
2917 | 2987 | ||
2918 | for (i = 0; i < AUTO_PIN_LAST; i++) { | 2988 | for (i = 0; i < cfg->num_inputs; i++) { |
2919 | err = new_analog_input(spec, cfg->input_pins[i], | 2989 | const char *label; |
2920 | auto_pin_cfg_labels[i], | 2990 | type = cfg->inputs[i].type; |
2921 | i <= AUTO_PIN_FRONT_MIC); | 2991 | label = hda_get_autocfg_input_label(codec, cfg, i); |
2992 | snd_hda_add_imux_item(imux, label, | ||
2993 | ad1988_pin_to_adc_idx(cfg->inputs[i].pin), | ||
2994 | &type_idx); | ||
2995 | err = new_analog_input(spec, cfg->inputs[i].pin, | ||
2996 | label, type_idx, | ||
2997 | type == AUTO_PIN_MIC); | ||
2922 | if (err < 0) | 2998 | if (err < 0) |
2923 | return err; | 2999 | return err; |
2924 | imux->items[imux->num_items].label = auto_pin_cfg_labels[i]; | ||
2925 | imux->items[imux->num_items].index = ad1988_pin_to_adc_idx(cfg->input_pins[i]); | ||
2926 | imux->num_items++; | ||
2927 | } | 3000 | } |
2928 | imux->items[imux->num_items].label = "Mix"; | 3001 | snd_hda_add_imux_item(imux, "Mix", 9, NULL); |
2929 | imux->items[imux->num_items].index = 9; | ||
2930 | imux->num_items++; | ||
2931 | 3002 | ||
2932 | if ((err = add_control(spec, AD_CTL_WIDGET_VOL, | 3003 | if ((err = add_control(spec, AD_CTL_WIDGET_VOL, |
2933 | "Analog Mix Playback Volume", | 3004 | "Analog Mix Playback Volume", |
@@ -2994,12 +3065,12 @@ static void ad1988_auto_init_extra_out(struct hda_codec *codec) | |||
2994 | static void ad1988_auto_init_analog_input(struct hda_codec *codec) | 3065 | static void ad1988_auto_init_analog_input(struct hda_codec *codec) |
2995 | { | 3066 | { |
2996 | struct ad198x_spec *spec = codec->spec; | 3067 | struct ad198x_spec *spec = codec->spec; |
3068 | const struct auto_pin_cfg *cfg = &spec->autocfg; | ||
2997 | int i, idx; | 3069 | int i, idx; |
2998 | 3070 | ||
2999 | for (i = 0; i < AUTO_PIN_LAST; i++) { | 3071 | for (i = 0; i < cfg->num_inputs; i++) { |
3000 | hda_nid_t nid = spec->autocfg.input_pins[i]; | 3072 | hda_nid_t nid = cfg->inputs[i].pin; |
3001 | if (! nid) | 3073 | int type = cfg->inputs[i].type; |
3002 | continue; | ||
3003 | switch (nid) { | 3074 | switch (nid) { |
3004 | case 0x15: /* port-C */ | 3075 | case 0x15: /* port-C */ |
3005 | snd_hda_codec_write(codec, 0x33, 0, AC_VERB_SET_CONNECT_SEL, 0x0); | 3076 | snd_hda_codec_write(codec, 0x33, 0, AC_VERB_SET_CONNECT_SEL, 0x0); |
@@ -3009,7 +3080,7 @@ static void ad1988_auto_init_analog_input(struct hda_codec *codec) | |||
3009 | break; | 3080 | break; |
3010 | } | 3081 | } |
3011 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, | 3082 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, |
3012 | i <= AUTO_PIN_FRONT_MIC ? PIN_VREF80 : PIN_IN); | 3083 | type == AUTO_PIN_MIC ? PIN_VREF80 : PIN_IN); |
3013 | if (nid != AD1988_PIN_CD_NID) | 3084 | if (nid != AD1988_PIN_CD_NID) |
3014 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, | 3085 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, |
3015 | AMP_OUT_MUTE); | 3086 | AMP_OUT_MUTE); |
@@ -3040,7 +3111,7 @@ static int ad1988_parse_auto_config(struct hda_codec *codec) | |||
3040 | "Speaker")) < 0 || | 3111 | "Speaker")) < 0 || |
3041 | (err = ad1988_auto_create_extra_out(codec, spec->autocfg.hp_pins[0], | 3112 | (err = ad1988_auto_create_extra_out(codec, spec->autocfg.hp_pins[0], |
3042 | "Headphone")) < 0 || | 3113 | "Headphone")) < 0 || |
3043 | (err = ad1988_auto_create_analog_input_ctls(spec, &spec->autocfg)) < 0) | 3114 | (err = ad1988_auto_create_analog_input_ctls(codec, &spec->autocfg)) < 0) |
3044 | return err; | 3115 | return err; |
3045 | 3116 | ||
3046 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; | 3117 | spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
@@ -3070,13 +3141,13 @@ static int ad1988_auto_init(struct hda_codec *codec) | |||
3070 | return 0; | 3141 | return 0; |
3071 | } | 3142 | } |
3072 | 3143 | ||
3073 | |||
3074 | /* | 3144 | /* |
3075 | */ | 3145 | */ |
3076 | 3146 | ||
3077 | static const char *ad1988_models[AD1988_MODEL_LAST] = { | 3147 | static const char * const ad1988_models[AD1988_MODEL_LAST] = { |
3078 | [AD1988_6STACK] = "6stack", | 3148 | [AD1988_6STACK] = "6stack", |
3079 | [AD1988_6STACK_DIG] = "6stack-dig", | 3149 | [AD1988_6STACK_DIG] = "6stack-dig", |
3150 | [AD1988_6STACK_DIG_FP] = "6stack-dig-fp", | ||
3080 | [AD1988_3STACK] = "3stack", | 3151 | [AD1988_3STACK] = "3stack", |
3081 | [AD1988_3STACK_DIG] = "3stack-dig", | 3152 | [AD1988_3STACK_DIG] = "3stack-dig", |
3082 | [AD1988_LAPTOP] = "laptop", | 3153 | [AD1988_LAPTOP] = "laptop", |
@@ -3084,10 +3155,11 @@ static const char *ad1988_models[AD1988_MODEL_LAST] = { | |||
3084 | [AD1988_AUTO] = "auto", | 3155 | [AD1988_AUTO] = "auto", |
3085 | }; | 3156 | }; |
3086 | 3157 | ||
3087 | static struct snd_pci_quirk ad1988_cfg_tbl[] = { | 3158 | static const struct snd_pci_quirk ad1988_cfg_tbl[] = { |
3088 | SND_PCI_QUIRK(0x1043, 0x81ec, "Asus P5B-DLX", AD1988_6STACK_DIG), | 3159 | SND_PCI_QUIRK(0x1043, 0x81ec, "Asus P5B-DLX", AD1988_6STACK_DIG), |
3089 | SND_PCI_QUIRK(0x1043, 0x81f6, "Asus M2N-SLI", AD1988_6STACK_DIG), | 3160 | SND_PCI_QUIRK(0x1043, 0x81f6, "Asus M2N-SLI", AD1988_6STACK_DIG), |
3090 | SND_PCI_QUIRK(0x1043, 0x8277, "Asus P5K-E/WIFI-AP", AD1988_6STACK_DIG), | 3161 | SND_PCI_QUIRK(0x1043, 0x8277, "Asus P5K-E/WIFI-AP", AD1988_6STACK_DIG), |
3162 | SND_PCI_QUIRK(0x1043, 0x82c0, "Asus M3N-HT Deluxe", AD1988_6STACK_DIG), | ||
3091 | SND_PCI_QUIRK(0x1043, 0x8311, "Asus P5Q-Premium/Pro", AD1988_6STACK_DIG), | 3163 | SND_PCI_QUIRK(0x1043, 0x8311, "Asus P5Q-Premium/Pro", AD1988_6STACK_DIG), |
3092 | {} | 3164 | {} |
3093 | }; | 3165 | }; |
@@ -3136,6 +3208,7 @@ static int patch_ad1988(struct hda_codec *codec) | |||
3136 | switch (board_config) { | 3208 | switch (board_config) { |
3137 | case AD1988_6STACK: | 3209 | case AD1988_6STACK: |
3138 | case AD1988_6STACK_DIG: | 3210 | case AD1988_6STACK_DIG: |
3211 | case AD1988_6STACK_DIG_FP: | ||
3139 | spec->multiout.max_channels = 8; | 3212 | spec->multiout.max_channels = 8; |
3140 | spec->multiout.num_dacs = 4; | 3213 | spec->multiout.num_dacs = 4; |
3141 | if (is_rev2(codec)) | 3214 | if (is_rev2(codec)) |
@@ -3151,7 +3224,19 @@ static int patch_ad1988(struct hda_codec *codec) | |||
3151 | spec->mixers[1] = ad1988_6stack_mixers2; | 3224 | spec->mixers[1] = ad1988_6stack_mixers2; |
3152 | spec->num_init_verbs = 1; | 3225 | spec->num_init_verbs = 1; |
3153 | spec->init_verbs[0] = ad1988_6stack_init_verbs; | 3226 | spec->init_verbs[0] = ad1988_6stack_init_verbs; |
3154 | if (board_config == AD1988_6STACK_DIG) { | 3227 | if (board_config == AD1988_6STACK_DIG_FP) { |
3228 | spec->num_mixers++; | ||
3229 | spec->mixers[2] = ad1988_6stack_fp_mixers; | ||
3230 | spec->num_init_verbs++; | ||
3231 | spec->init_verbs[1] = ad1988_6stack_fp_init_verbs; | ||
3232 | spec->slave_vols = ad1988_6stack_fp_slave_vols; | ||
3233 | spec->slave_sws = ad1988_6stack_fp_slave_sws; | ||
3234 | spec->alt_dac_nid = ad1988_alt_dac_nid; | ||
3235 | spec->stream_analog_alt_playback = | ||
3236 | &ad198x_pcm_analog_alt_playback; | ||
3237 | } | ||
3238 | if ((board_config == AD1988_6STACK_DIG) || | ||
3239 | (board_config == AD1988_6STACK_DIG_FP)) { | ||
3155 | spec->multiout.dig_out_nid = AD1988_SPDIF_OUT; | 3240 | spec->multiout.dig_out_nid = AD1988_SPDIF_OUT; |
3156 | spec->dig_in_nid = AD1988_SPDIF_IN; | 3241 | spec->dig_in_nid = AD1988_SPDIF_IN; |
3157 | } | 3242 | } |
@@ -3235,6 +3320,7 @@ static int patch_ad1988(struct hda_codec *codec) | |||
3235 | spec->vmaster_nid = 0x04; | 3320 | spec->vmaster_nid = 0x04; |
3236 | 3321 | ||
3237 | codec->no_trigger_sense = 1; | 3322 | codec->no_trigger_sense = 1; |
3323 | codec->no_sticky_stream = 1; | ||
3238 | 3324 | ||
3239 | return 0; | 3325 | return 0; |
3240 | } | 3326 | } |
@@ -3258,21 +3344,21 @@ static int patch_ad1988(struct hda_codec *codec) | |||
3258 | * but no build-up framework is given, so far. | 3344 | * but no build-up framework is given, so far. |
3259 | */ | 3345 | */ |
3260 | 3346 | ||
3261 | static hda_nid_t ad1884_dac_nids[1] = { | 3347 | static const hda_nid_t ad1884_dac_nids[1] = { |
3262 | 0x04, | 3348 | 0x04, |
3263 | }; | 3349 | }; |
3264 | 3350 | ||
3265 | static hda_nid_t ad1884_adc_nids[2] = { | 3351 | static const hda_nid_t ad1884_adc_nids[2] = { |
3266 | 0x08, 0x09, | 3352 | 0x08, 0x09, |
3267 | }; | 3353 | }; |
3268 | 3354 | ||
3269 | static hda_nid_t ad1884_capsrc_nids[2] = { | 3355 | static const hda_nid_t ad1884_capsrc_nids[2] = { |
3270 | 0x0c, 0x0d, | 3356 | 0x0c, 0x0d, |
3271 | }; | 3357 | }; |
3272 | 3358 | ||
3273 | #define AD1884_SPDIF_OUT 0x02 | 3359 | #define AD1884_SPDIF_OUT 0x02 |
3274 | 3360 | ||
3275 | static struct hda_input_mux ad1884_capture_source = { | 3361 | static const struct hda_input_mux ad1884_capture_source = { |
3276 | .num_items = 4, | 3362 | .num_items = 4, |
3277 | .items = { | 3363 | .items = { |
3278 | { "Front Mic", 0x0 }, | 3364 | { "Front Mic", 0x0 }, |
@@ -3282,7 +3368,7 @@ static struct hda_input_mux ad1884_capture_source = { | |||
3282 | }, | 3368 | }, |
3283 | }; | 3369 | }; |
3284 | 3370 | ||
3285 | static struct snd_kcontrol_new ad1884_base_mixers[] = { | 3371 | static const struct snd_kcontrol_new ad1884_base_mixers[] = { |
3286 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT), | 3372 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT), |
3287 | /* HDA_CODEC_VOLUME_IDX("PCM Playback Volume", 1, 0x03, 0x0, HDA_OUTPUT), */ | 3373 | /* HDA_CODEC_VOLUME_IDX("PCM Playback Volume", 1, 0x03, 0x0, HDA_OUTPUT), */ |
3288 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT), | 3374 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT), |
@@ -3295,8 +3381,8 @@ static struct snd_kcontrol_new ad1884_base_mixers[] = { | |||
3295 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x01, HDA_INPUT), | 3381 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x01, HDA_INPUT), |
3296 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT), | 3382 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT), |
3297 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT), | 3383 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT), |
3298 | HDA_CODEC_VOLUME("Mic Boost", 0x15, 0x0, HDA_INPUT), | 3384 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x15, 0x0, HDA_INPUT), |
3299 | HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT), | 3385 | HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x14, 0x0, HDA_INPUT), |
3300 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 3386 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
3301 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), | 3387 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), |
3302 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), | 3388 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), |
@@ -3326,7 +3412,7 @@ static struct snd_kcontrol_new ad1884_base_mixers[] = { | |||
3326 | { } /* end */ | 3412 | { } /* end */ |
3327 | }; | 3413 | }; |
3328 | 3414 | ||
3329 | static struct snd_kcontrol_new ad1984_dmic_mixers[] = { | 3415 | static const struct snd_kcontrol_new ad1984_dmic_mixers[] = { |
3330 | HDA_CODEC_VOLUME("Digital Mic Capture Volume", 0x05, 0x0, HDA_INPUT), | 3416 | HDA_CODEC_VOLUME("Digital Mic Capture Volume", 0x05, 0x0, HDA_INPUT), |
3331 | HDA_CODEC_MUTE("Digital Mic Capture Switch", 0x05, 0x0, HDA_INPUT), | 3417 | HDA_CODEC_MUTE("Digital Mic Capture Switch", 0x05, 0x0, HDA_INPUT), |
3332 | HDA_CODEC_VOLUME_IDX("Digital Mic Capture Volume", 1, 0x06, 0x0, | 3418 | HDA_CODEC_VOLUME_IDX("Digital Mic Capture Volume", 1, 0x06, 0x0, |
@@ -3339,7 +3425,7 @@ static struct snd_kcontrol_new ad1984_dmic_mixers[] = { | |||
3339 | /* | 3425 | /* |
3340 | * initialization verbs | 3426 | * initialization verbs |
3341 | */ | 3427 | */ |
3342 | static struct hda_verb ad1884_init_verbs[] = { | 3428 | static const struct hda_verb ad1884_init_verbs[] = { |
3343 | /* DACs; mute as default */ | 3429 | /* DACs; mute as default */ |
3344 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 3430 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, |
3345 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 3431 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, |
@@ -3385,7 +3471,7 @@ static struct hda_verb ad1884_init_verbs[] = { | |||
3385 | }; | 3471 | }; |
3386 | 3472 | ||
3387 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 3473 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
3388 | static struct hda_amp_list ad1884_loopbacks[] = { | 3474 | static const struct hda_amp_list ad1884_loopbacks[] = { |
3389 | { 0x20, HDA_INPUT, 0 }, /* Front Mic */ | 3475 | { 0x20, HDA_INPUT, 0 }, /* Front Mic */ |
3390 | { 0x20, HDA_INPUT, 1 }, /* Mic */ | 3476 | { 0x20, HDA_INPUT, 1 }, /* Mic */ |
3391 | { 0x20, HDA_INPUT, 2 }, /* CD */ | 3477 | { 0x20, HDA_INPUT, 2 }, /* CD */ |
@@ -3394,7 +3480,7 @@ static struct hda_amp_list ad1884_loopbacks[] = { | |||
3394 | }; | 3480 | }; |
3395 | #endif | 3481 | #endif |
3396 | 3482 | ||
3397 | static const char *ad1884_slave_vols[] = { | 3483 | static const char * const ad1884_slave_vols[] = { |
3398 | "PCM Playback Volume", | 3484 | "PCM Playback Volume", |
3399 | "Mic Playback Volume", | 3485 | "Mic Playback Volume", |
3400 | "Mono Playback Volume", | 3486 | "Mono Playback Volume", |
@@ -3449,6 +3535,7 @@ static int patch_ad1884(struct hda_codec *codec) | |||
3449 | codec->patch_ops = ad198x_patch_ops; | 3535 | codec->patch_ops = ad198x_patch_ops; |
3450 | 3536 | ||
3451 | codec->no_trigger_sense = 1; | 3537 | codec->no_trigger_sense = 1; |
3538 | codec->no_sticky_stream = 1; | ||
3452 | 3539 | ||
3453 | return 0; | 3540 | return 0; |
3454 | } | 3541 | } |
@@ -3456,7 +3543,7 @@ static int patch_ad1884(struct hda_codec *codec) | |||
3456 | /* | 3543 | /* |
3457 | * Lenovo Thinkpad T61/X61 | 3544 | * Lenovo Thinkpad T61/X61 |
3458 | */ | 3545 | */ |
3459 | static struct hda_input_mux ad1984_thinkpad_capture_source = { | 3546 | static const struct hda_input_mux ad1984_thinkpad_capture_source = { |
3460 | .num_items = 4, | 3547 | .num_items = 4, |
3461 | .items = { | 3548 | .items = { |
3462 | { "Mic", 0x0 }, | 3549 | { "Mic", 0x0 }, |
@@ -3470,7 +3557,7 @@ static struct hda_input_mux ad1984_thinkpad_capture_source = { | |||
3470 | /* | 3557 | /* |
3471 | * Dell Precision T3400 | 3558 | * Dell Precision T3400 |
3472 | */ | 3559 | */ |
3473 | static struct hda_input_mux ad1984_dell_desktop_capture_source = { | 3560 | static const struct hda_input_mux ad1984_dell_desktop_capture_source = { |
3474 | .num_items = 3, | 3561 | .num_items = 3, |
3475 | .items = { | 3562 | .items = { |
3476 | { "Front Mic", 0x0 }, | 3563 | { "Front Mic", 0x0 }, |
@@ -3480,7 +3567,7 @@ static struct hda_input_mux ad1984_dell_desktop_capture_source = { | |||
3480 | }; | 3567 | }; |
3481 | 3568 | ||
3482 | 3569 | ||
3483 | static struct snd_kcontrol_new ad1984_thinkpad_mixers[] = { | 3570 | static const struct snd_kcontrol_new ad1984_thinkpad_mixers[] = { |
3484 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT), | 3571 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT), |
3485 | /* HDA_CODEC_VOLUME_IDX("PCM Playback Volume", 1, 0x03, 0x0, HDA_OUTPUT), */ | 3572 | /* HDA_CODEC_VOLUME_IDX("PCM Playback Volume", 1, 0x03, 0x0, HDA_OUTPUT), */ |
3486 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT), | 3573 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT), |
@@ -3493,9 +3580,9 @@ static struct snd_kcontrol_new ad1984_thinkpad_mixers[] = { | |||
3493 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT), | 3580 | HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT), |
3494 | HDA_CODEC_VOLUME("Docking Mic Playback Volume", 0x20, 0x04, HDA_INPUT), | 3581 | HDA_CODEC_VOLUME("Docking Mic Playback Volume", 0x20, 0x04, HDA_INPUT), |
3495 | HDA_CODEC_MUTE("Docking Mic Playback Switch", 0x20, 0x04, HDA_INPUT), | 3582 | HDA_CODEC_MUTE("Docking Mic Playback Switch", 0x20, 0x04, HDA_INPUT), |
3496 | HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT), | 3583 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x14, 0x0, HDA_INPUT), |
3497 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x15, 0x0, HDA_INPUT), | 3584 | HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x15, 0x0, HDA_INPUT), |
3498 | HDA_CODEC_VOLUME("Docking Mic Boost", 0x25, 0x0, HDA_OUTPUT), | 3585 | HDA_CODEC_VOLUME("Dock Mic Boost Volume", 0x25, 0x0, HDA_OUTPUT), |
3499 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 3586 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
3500 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), | 3587 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), |
3501 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), | 3588 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), |
@@ -3526,7 +3613,7 @@ static struct snd_kcontrol_new ad1984_thinkpad_mixers[] = { | |||
3526 | }; | 3613 | }; |
3527 | 3614 | ||
3528 | /* additional verbs */ | 3615 | /* additional verbs */ |
3529 | static struct hda_verb ad1984_thinkpad_init_verbs[] = { | 3616 | static const struct hda_verb ad1984_thinkpad_init_verbs[] = { |
3530 | /* Port-E (docking station mic) pin */ | 3617 | /* Port-E (docking station mic) pin */ |
3531 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 3618 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
3532 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3619 | {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
@@ -3544,7 +3631,7 @@ static struct hda_verb ad1984_thinkpad_init_verbs[] = { | |||
3544 | /* | 3631 | /* |
3545 | * Dell Precision T3400 | 3632 | * Dell Precision T3400 |
3546 | */ | 3633 | */ |
3547 | static struct snd_kcontrol_new ad1984_dell_desktop_mixers[] = { | 3634 | static const struct snd_kcontrol_new ad1984_dell_desktop_mixers[] = { |
3548 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT), | 3635 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x04, 0x0, HDA_OUTPUT), |
3549 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT), | 3636 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT), |
3550 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x12, 0x0, HDA_OUTPUT), | 3637 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x12, 0x0, HDA_OUTPUT), |
@@ -3554,8 +3641,8 @@ static struct snd_kcontrol_new ad1984_dell_desktop_mixers[] = { | |||
3554 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT), | 3641 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT), |
3555 | HDA_CODEC_VOLUME("Line-In Playback Volume", 0x20, 0x01, HDA_INPUT), | 3642 | HDA_CODEC_VOLUME("Line-In Playback Volume", 0x20, 0x01, HDA_INPUT), |
3556 | HDA_CODEC_MUTE("Line-In Playback Switch", 0x20, 0x01, HDA_INPUT), | 3643 | HDA_CODEC_MUTE("Line-In Playback Switch", 0x20, 0x01, HDA_INPUT), |
3557 | HDA_CODEC_VOLUME("Line-In Boost", 0x15, 0x0, HDA_INPUT), | 3644 | HDA_CODEC_VOLUME("Line-In Boost Volume", 0x15, 0x0, HDA_INPUT), |
3558 | HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT), | 3645 | HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x14, 0x0, HDA_INPUT), |
3559 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 3646 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
3560 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), | 3647 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), |
3561 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), | 3648 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), |
@@ -3595,7 +3682,7 @@ static int ad1984_pcm_dmic_cleanup(struct hda_pcm_stream *hinfo, | |||
3595 | return 0; | 3682 | return 0; |
3596 | } | 3683 | } |
3597 | 3684 | ||
3598 | static struct hda_pcm_stream ad1984_pcm_dmic_capture = { | 3685 | static const struct hda_pcm_stream ad1984_pcm_dmic_capture = { |
3599 | .substreams = 2, | 3686 | .substreams = 2, |
3600 | .channels_min = 2, | 3687 | .channels_min = 2, |
3601 | .channels_max = 2, | 3688 | .channels_max = 2, |
@@ -3631,13 +3718,13 @@ enum { | |||
3631 | AD1984_MODELS | 3718 | AD1984_MODELS |
3632 | }; | 3719 | }; |
3633 | 3720 | ||
3634 | static const char *ad1984_models[AD1984_MODELS] = { | 3721 | static const char * const ad1984_models[AD1984_MODELS] = { |
3635 | [AD1984_BASIC] = "basic", | 3722 | [AD1984_BASIC] = "basic", |
3636 | [AD1984_THINKPAD] = "thinkpad", | 3723 | [AD1984_THINKPAD] = "thinkpad", |
3637 | [AD1984_DELL_DESKTOP] = "dell_desktop", | 3724 | [AD1984_DELL_DESKTOP] = "dell_desktop", |
3638 | }; | 3725 | }; |
3639 | 3726 | ||
3640 | static struct snd_pci_quirk ad1984_cfg_tbl[] = { | 3727 | static const struct snd_pci_quirk ad1984_cfg_tbl[] = { |
3641 | /* Lenovo Thinkpad T61/X61 */ | 3728 | /* Lenovo Thinkpad T61/X61 */ |
3642 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1984_THINKPAD), | 3729 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1984_THINKPAD), |
3643 | SND_PCI_QUIRK(0x1028, 0x0214, "Dell T3400", AD1984_DELL_DESKTOP), | 3730 | SND_PCI_QUIRK(0x1028, 0x0214, "Dell T3400", AD1984_DELL_DESKTOP), |
@@ -3702,7 +3789,7 @@ static int patch_ad1984(struct hda_codec *codec) | |||
3702 | * We share the single DAC for both HP and line-outs (see AD1884/1984). | 3789 | * We share the single DAC for both HP and line-outs (see AD1884/1984). |
3703 | */ | 3790 | */ |
3704 | 3791 | ||
3705 | static hda_nid_t ad1884a_dac_nids[1] = { | 3792 | static const hda_nid_t ad1884a_dac_nids[1] = { |
3706 | 0x03, | 3793 | 0x03, |
3707 | }; | 3794 | }; |
3708 | 3795 | ||
@@ -3711,7 +3798,7 @@ static hda_nid_t ad1884a_dac_nids[1] = { | |||
3711 | 3798 | ||
3712 | #define AD1884A_SPDIF_OUT 0x02 | 3799 | #define AD1884A_SPDIF_OUT 0x02 |
3713 | 3800 | ||
3714 | static struct hda_input_mux ad1884a_capture_source = { | 3801 | static const struct hda_input_mux ad1884a_capture_source = { |
3715 | .num_items = 5, | 3802 | .num_items = 5, |
3716 | .items = { | 3803 | .items = { |
3717 | { "Front Mic", 0x0 }, | 3804 | { "Front Mic", 0x0 }, |
@@ -3722,7 +3809,7 @@ static struct hda_input_mux ad1884a_capture_source = { | |||
3722 | }, | 3809 | }, |
3723 | }; | 3810 | }; |
3724 | 3811 | ||
3725 | static struct snd_kcontrol_new ad1884a_base_mixers[] = { | 3812 | static const struct snd_kcontrol_new ad1884a_base_mixers[] = { |
3726 | HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), | 3813 | HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), |
3727 | HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT), | 3814 | HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT), |
3728 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT), | 3815 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT), |
@@ -3739,9 +3826,9 @@ static struct snd_kcontrol_new ad1884a_base_mixers[] = { | |||
3739 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x04, HDA_INPUT), | 3826 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x04, HDA_INPUT), |
3740 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT), | 3827 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x02, HDA_INPUT), |
3741 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT), | 3828 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x02, HDA_INPUT), |
3742 | HDA_CODEC_VOLUME("Front Mic Boost", 0x14, 0x0, HDA_INPUT), | 3829 | HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x14, 0x0, HDA_INPUT), |
3743 | HDA_CODEC_VOLUME("Line Boost", 0x15, 0x0, HDA_INPUT), | 3830 | HDA_CODEC_VOLUME("Line Boost Volume", 0x15, 0x0, HDA_INPUT), |
3744 | HDA_CODEC_VOLUME("Mic Boost", 0x25, 0x0, HDA_OUTPUT), | 3831 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x25, 0x0, HDA_OUTPUT), |
3745 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 3832 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
3746 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), | 3833 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), |
3747 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), | 3834 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), |
@@ -3774,7 +3861,7 @@ static struct snd_kcontrol_new ad1884a_base_mixers[] = { | |||
3774 | /* | 3861 | /* |
3775 | * initialization verbs | 3862 | * initialization verbs |
3776 | */ | 3863 | */ |
3777 | static struct hda_verb ad1884a_init_verbs[] = { | 3864 | static const struct hda_verb ad1884a_init_verbs[] = { |
3778 | /* DACs; unmute as default */ | 3865 | /* DACs; unmute as default */ |
3779 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ | 3866 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ |
3780 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ | 3867 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ |
@@ -3829,7 +3916,7 @@ static struct hda_verb ad1884a_init_verbs[] = { | |||
3829 | }; | 3916 | }; |
3830 | 3917 | ||
3831 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 3918 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
3832 | static struct hda_amp_list ad1884a_loopbacks[] = { | 3919 | static const struct hda_amp_list ad1884a_loopbacks[] = { |
3833 | { 0x20, HDA_INPUT, 0 }, /* Front Mic */ | 3920 | { 0x20, HDA_INPUT, 0 }, /* Front Mic */ |
3834 | { 0x20, HDA_INPUT, 1 }, /* Mic */ | 3921 | { 0x20, HDA_INPUT, 1 }, /* Mic */ |
3835 | { 0x20, HDA_INPUT, 2 }, /* CD */ | 3922 | { 0x20, HDA_INPUT, 2 }, /* CD */ |
@@ -3862,7 +3949,7 @@ static int ad1884a_mobile_master_sw_put(struct snd_kcontrol *kcontrol, | |||
3862 | return ret; | 3949 | return ret; |
3863 | } | 3950 | } |
3864 | 3951 | ||
3865 | static struct snd_kcontrol_new ad1884a_laptop_mixers[] = { | 3952 | static const struct snd_kcontrol_new ad1884a_laptop_mixers[] = { |
3866 | HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), | 3953 | HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), |
3867 | { | 3954 | { |
3868 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 3955 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
@@ -3882,15 +3969,15 @@ static struct snd_kcontrol_new ad1884a_laptop_mixers[] = { | |||
3882 | HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x20, 0x01, HDA_INPUT), | 3969 | HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x20, 0x01, HDA_INPUT), |
3883 | HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x20, 0x04, HDA_INPUT), | 3970 | HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x20, 0x04, HDA_INPUT), |
3884 | HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x20, 0x04, HDA_INPUT), | 3971 | HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x20, 0x04, HDA_INPUT), |
3885 | HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT), | 3972 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x14, 0x0, HDA_INPUT), |
3886 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x15, 0x0, HDA_INPUT), | 3973 | HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x15, 0x0, HDA_INPUT), |
3887 | HDA_CODEC_VOLUME("Dock Mic Boost", 0x25, 0x0, HDA_OUTPUT), | 3974 | HDA_CODEC_VOLUME("Dock Mic Boost Volume", 0x25, 0x0, HDA_OUTPUT), |
3888 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 3975 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
3889 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), | 3976 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), |
3890 | { } /* end */ | 3977 | { } /* end */ |
3891 | }; | 3978 | }; |
3892 | 3979 | ||
3893 | static struct snd_kcontrol_new ad1884a_mobile_mixers[] = { | 3980 | static const struct snd_kcontrol_new ad1884a_mobile_mixers[] = { |
3894 | HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), | 3981 | HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), |
3895 | /*HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),*/ | 3982 | /*HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),*/ |
3896 | { | 3983 | { |
@@ -4010,7 +4097,7 @@ static int ad1884a_laptop_init(struct hda_codec *codec) | |||
4010 | } | 4097 | } |
4011 | 4098 | ||
4012 | /* additional verbs for laptop model */ | 4099 | /* additional verbs for laptop model */ |
4013 | static struct hda_verb ad1884a_laptop_verbs[] = { | 4100 | static const struct hda_verb ad1884a_laptop_verbs[] = { |
4014 | /* Port-A (HP) pin - always unmuted */ | 4101 | /* Port-A (HP) pin - always unmuted */ |
4015 | {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 4102 | {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
4016 | /* Port-F (int speaker) mixer - route only from analog mixer */ | 4103 | /* Port-F (int speaker) mixer - route only from analog mixer */ |
@@ -4041,7 +4128,7 @@ static struct hda_verb ad1884a_laptop_verbs[] = { | |||
4041 | { } /* end */ | 4128 | { } /* end */ |
4042 | }; | 4129 | }; |
4043 | 4130 | ||
4044 | static struct hda_verb ad1884a_mobile_verbs[] = { | 4131 | static const struct hda_verb ad1884a_mobile_verbs[] = { |
4045 | /* DACs; unmute as default */ | 4132 | /* DACs; unmute as default */ |
4046 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ | 4133 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ |
4047 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ | 4134 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ |
@@ -4096,7 +4183,7 @@ static struct hda_verb ad1884a_mobile_verbs[] = { | |||
4096 | * 0x17 - built-in mic | 4183 | * 0x17 - built-in mic |
4097 | */ | 4184 | */ |
4098 | 4185 | ||
4099 | static struct hda_verb ad1984a_thinkpad_verbs[] = { | 4186 | static const struct hda_verb ad1984a_thinkpad_verbs[] = { |
4100 | /* HP unmute */ | 4187 | /* HP unmute */ |
4101 | {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 4188 | {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
4102 | /* analog mix */ | 4189 | /* analog mix */ |
@@ -4113,15 +4200,15 @@ static struct hda_verb ad1984a_thinkpad_verbs[] = { | |||
4113 | { } /* end */ | 4200 | { } /* end */ |
4114 | }; | 4201 | }; |
4115 | 4202 | ||
4116 | static struct snd_kcontrol_new ad1984a_thinkpad_mixers[] = { | 4203 | static const struct snd_kcontrol_new ad1984a_thinkpad_mixers[] = { |
4117 | HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), | 4204 | HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), |
4118 | HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT), | 4205 | HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT), |
4119 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT), | 4206 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT), |
4120 | HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), | 4207 | HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), |
4121 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x00, HDA_INPUT), | 4208 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x00, HDA_INPUT), |
4122 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x00, HDA_INPUT), | 4209 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x00, HDA_INPUT), |
4123 | HDA_CODEC_VOLUME("Mic Boost", 0x14, 0x0, HDA_INPUT), | 4210 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x14, 0x0, HDA_INPUT), |
4124 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x17, 0x0, HDA_INPUT), | 4211 | HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x17, 0x0, HDA_INPUT), |
4125 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 4212 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
4126 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), | 4213 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), |
4127 | { | 4214 | { |
@@ -4134,7 +4221,7 @@ static struct snd_kcontrol_new ad1984a_thinkpad_mixers[] = { | |||
4134 | { } /* end */ | 4221 | { } /* end */ |
4135 | }; | 4222 | }; |
4136 | 4223 | ||
4137 | static struct hda_input_mux ad1984a_thinkpad_capture_source = { | 4224 | static const struct hda_input_mux ad1984a_thinkpad_capture_source = { |
4138 | .num_items = 3, | 4225 | .num_items = 3, |
4139 | .items = { | 4226 | .items = { |
4140 | { "Mic", 0x0 }, | 4227 | { "Mic", 0x0 }, |
@@ -4171,6 +4258,84 @@ static int ad1984a_thinkpad_init(struct hda_codec *codec) | |||
4171 | } | 4258 | } |
4172 | 4259 | ||
4173 | /* | 4260 | /* |
4261 | * Precision R5500 | ||
4262 | * 0x12 - HP/line-out | ||
4263 | * 0x13 - speaker (mono) | ||
4264 | * 0x15 - mic-in | ||
4265 | */ | ||
4266 | |||
4267 | static const struct hda_verb ad1984a_precision_verbs[] = { | ||
4268 | /* Unmute main output path */ | ||
4269 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ | ||
4270 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE + 0x1f}, /* 0dB */ | ||
4271 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) + 0x17}, /* 0dB */ | ||
4272 | /* Analog mixer; mute as default */ | ||
4273 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | ||
4274 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | ||
4275 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, | ||
4276 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, | ||
4277 | {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, | ||
4278 | /* Select mic as input */ | ||
4279 | {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1}, | ||
4280 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE + 0x27}, /* 0dB */ | ||
4281 | /* Configure as mic */ | ||
4282 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | ||
4283 | {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */ | ||
4284 | /* HP unmute */ | ||
4285 | {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
4286 | /* turn on EAPD */ | ||
4287 | {0x13, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, | ||
4288 | /* unsolicited event for pin-sense */ | ||
4289 | {0x12, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT}, | ||
4290 | { } /* end */ | ||
4291 | }; | ||
4292 | |||
4293 | static const struct snd_kcontrol_new ad1984a_precision_mixers[] = { | ||
4294 | HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), | ||
4295 | HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT), | ||
4296 | HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT), | ||
4297 | HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), | ||
4298 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x01, HDA_INPUT), | ||
4299 | HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x01, HDA_INPUT), | ||
4300 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x15, 0x0, HDA_INPUT), | ||
4301 | HDA_CODEC_MUTE("Front Playback Switch", 0x12, 0x0, HDA_OUTPUT), | ||
4302 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x13, 0x0, HDA_OUTPUT), | ||
4303 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | ||
4304 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), | ||
4305 | { } /* end */ | ||
4306 | }; | ||
4307 | |||
4308 | |||
4309 | /* mute internal speaker if HP is plugged */ | ||
4310 | static void ad1984a_precision_automute(struct hda_codec *codec) | ||
4311 | { | ||
4312 | unsigned int present; | ||
4313 | |||
4314 | present = snd_hda_jack_detect(codec, 0x12); | ||
4315 | snd_hda_codec_amp_stereo(codec, 0x13, HDA_OUTPUT, 0, | ||
4316 | HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); | ||
4317 | } | ||
4318 | |||
4319 | |||
4320 | /* unsolicited event for HP jack sensing */ | ||
4321 | static void ad1984a_precision_unsol_event(struct hda_codec *codec, | ||
4322 | unsigned int res) | ||
4323 | { | ||
4324 | if ((res >> 26) != AD1884A_HP_EVENT) | ||
4325 | return; | ||
4326 | ad1984a_precision_automute(codec); | ||
4327 | } | ||
4328 | |||
4329 | /* initialize jack-sensing, too */ | ||
4330 | static int ad1984a_precision_init(struct hda_codec *codec) | ||
4331 | { | ||
4332 | ad198x_init(codec); | ||
4333 | ad1984a_precision_automute(codec); | ||
4334 | return 0; | ||
4335 | } | ||
4336 | |||
4337 | |||
4338 | /* | ||
4174 | * HP Touchsmart | 4339 | * HP Touchsmart |
4175 | * port-A (0x11) - front hp-out | 4340 | * port-A (0x11) - front hp-out |
4176 | * port-B (0x14) - unused | 4341 | * port-B (0x14) - unused |
@@ -4181,7 +4346,7 @@ static int ad1984a_thinkpad_init(struct hda_codec *codec) | |||
4181 | * digital-mic (0x17) - Internal mic | 4346 | * digital-mic (0x17) - Internal mic |
4182 | */ | 4347 | */ |
4183 | 4348 | ||
4184 | static struct hda_verb ad1984a_touchsmart_verbs[] = { | 4349 | static const struct hda_verb ad1984a_touchsmart_verbs[] = { |
4185 | /* DACs; unmute as default */ | 4350 | /* DACs; unmute as default */ |
4186 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ | 4351 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ |
4187 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ | 4352 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x27}, /* 0dB */ |
@@ -4233,7 +4398,7 @@ static struct hda_verb ad1984a_touchsmart_verbs[] = { | |||
4233 | { } /* end */ | 4398 | { } /* end */ |
4234 | }; | 4399 | }; |
4235 | 4400 | ||
4236 | static struct snd_kcontrol_new ad1984a_touchsmart_mixers[] = { | 4401 | static const struct snd_kcontrol_new ad1984a_touchsmart_mixers[] = { |
4237 | HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), | 4402 | HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), |
4238 | /* HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),*/ | 4403 | /* HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),*/ |
4239 | { | 4404 | { |
@@ -4249,8 +4414,8 @@ static struct snd_kcontrol_new ad1984a_touchsmart_mixers[] = { | |||
4249 | HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), | 4414 | HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), |
4250 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 4415 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
4251 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), | 4416 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), |
4252 | HDA_CODEC_VOLUME("Mic Boost", 0x25, 0x0, HDA_OUTPUT), | 4417 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x25, 0x0, HDA_OUTPUT), |
4253 | HDA_CODEC_VOLUME("Internal Mic Boost", 0x17, 0x0, HDA_INPUT), | 4418 | HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x17, 0x0, HDA_INPUT), |
4254 | { } /* end */ | 4419 | { } /* end */ |
4255 | }; | 4420 | }; |
4256 | 4421 | ||
@@ -4299,18 +4464,21 @@ enum { | |||
4299 | AD1884A_MOBILE, | 4464 | AD1884A_MOBILE, |
4300 | AD1884A_THINKPAD, | 4465 | AD1884A_THINKPAD, |
4301 | AD1984A_TOUCHSMART, | 4466 | AD1984A_TOUCHSMART, |
4467 | AD1984A_PRECISION, | ||
4302 | AD1884A_MODELS | 4468 | AD1884A_MODELS |
4303 | }; | 4469 | }; |
4304 | 4470 | ||
4305 | static const char *ad1884a_models[AD1884A_MODELS] = { | 4471 | static const char * const ad1884a_models[AD1884A_MODELS] = { |
4306 | [AD1884A_DESKTOP] = "desktop", | 4472 | [AD1884A_DESKTOP] = "desktop", |
4307 | [AD1884A_LAPTOP] = "laptop", | 4473 | [AD1884A_LAPTOP] = "laptop", |
4308 | [AD1884A_MOBILE] = "mobile", | 4474 | [AD1884A_MOBILE] = "mobile", |
4309 | [AD1884A_THINKPAD] = "thinkpad", | 4475 | [AD1884A_THINKPAD] = "thinkpad", |
4310 | [AD1984A_TOUCHSMART] = "touchsmart", | 4476 | [AD1984A_TOUCHSMART] = "touchsmart", |
4477 | [AD1984A_PRECISION] = "precision", | ||
4311 | }; | 4478 | }; |
4312 | 4479 | ||
4313 | static struct snd_pci_quirk ad1884a_cfg_tbl[] = { | 4480 | static const struct snd_pci_quirk ad1884a_cfg_tbl[] = { |
4481 | SND_PCI_QUIRK(0x1028, 0x04ac, "Precision R5500", AD1984A_PRECISION), | ||
4314 | SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE), | 4482 | SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE), |
4315 | SND_PCI_QUIRK(0x103c, 0x3037, "HP 2230s", AD1884A_LAPTOP), | 4483 | SND_PCI_QUIRK(0x103c, 0x3037, "HP 2230s", AD1884A_LAPTOP), |
4316 | SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE), | 4484 | SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE), |
@@ -4404,6 +4572,14 @@ static int patch_ad1884a(struct hda_codec *codec) | |||
4404 | codec->patch_ops.unsol_event = ad1984a_thinkpad_unsol_event; | 4572 | codec->patch_ops.unsol_event = ad1984a_thinkpad_unsol_event; |
4405 | codec->patch_ops.init = ad1984a_thinkpad_init; | 4573 | codec->patch_ops.init = ad1984a_thinkpad_init; |
4406 | break; | 4574 | break; |
4575 | case AD1984A_PRECISION: | ||
4576 | spec->mixers[0] = ad1984a_precision_mixers; | ||
4577 | spec->init_verbs[spec->num_init_verbs++] = | ||
4578 | ad1984a_precision_verbs; | ||
4579 | spec->multiout.dig_out_nid = 0; | ||
4580 | codec->patch_ops.unsol_event = ad1984a_precision_unsol_event; | ||
4581 | codec->patch_ops.init = ad1984a_precision_init; | ||
4582 | break; | ||
4407 | case AD1984A_TOUCHSMART: | 4583 | case AD1984A_TOUCHSMART: |
4408 | spec->mixers[0] = ad1984a_touchsmart_mixers; | 4584 | spec->mixers[0] = ad1984a_touchsmart_mixers; |
4409 | spec->init_verbs[0] = ad1984a_touchsmart_verbs; | 4585 | spec->init_verbs[0] = ad1984a_touchsmart_verbs; |
@@ -4422,6 +4598,7 @@ static int patch_ad1884a(struct hda_codec *codec) | |||
4422 | } | 4598 | } |
4423 | 4599 | ||
4424 | codec->no_trigger_sense = 1; | 4600 | codec->no_trigger_sense = 1; |
4601 | codec->no_sticky_stream = 1; | ||
4425 | 4602 | ||
4426 | return 0; | 4603 | return 0; |
4427 | } | 4604 | } |
@@ -4439,22 +4616,22 @@ static int patch_ad1884a(struct hda_codec *codec) | |||
4439 | * port-G - rear clfe-out (6stack) | 4616 | * port-G - rear clfe-out (6stack) |
4440 | */ | 4617 | */ |
4441 | 4618 | ||
4442 | static hda_nid_t ad1882_dac_nids[3] = { | 4619 | static const hda_nid_t ad1882_dac_nids[3] = { |
4443 | 0x04, 0x03, 0x05 | 4620 | 0x04, 0x03, 0x05 |
4444 | }; | 4621 | }; |
4445 | 4622 | ||
4446 | static hda_nid_t ad1882_adc_nids[2] = { | 4623 | static const hda_nid_t ad1882_adc_nids[2] = { |
4447 | 0x08, 0x09, | 4624 | 0x08, 0x09, |
4448 | }; | 4625 | }; |
4449 | 4626 | ||
4450 | static hda_nid_t ad1882_capsrc_nids[2] = { | 4627 | static const hda_nid_t ad1882_capsrc_nids[2] = { |
4451 | 0x0c, 0x0d, | 4628 | 0x0c, 0x0d, |
4452 | }; | 4629 | }; |
4453 | 4630 | ||
4454 | #define AD1882_SPDIF_OUT 0x02 | 4631 | #define AD1882_SPDIF_OUT 0x02 |
4455 | 4632 | ||
4456 | /* list: 0x11, 0x39, 0x3a, 0x18, 0x3c, 0x3b, 0x12, 0x20 */ | 4633 | /* list: 0x11, 0x39, 0x3a, 0x18, 0x3c, 0x3b, 0x12, 0x20 */ |
4457 | static struct hda_input_mux ad1882_capture_source = { | 4634 | static const struct hda_input_mux ad1882_capture_source = { |
4458 | .num_items = 5, | 4635 | .num_items = 5, |
4459 | .items = { | 4636 | .items = { |
4460 | { "Front Mic", 0x1 }, | 4637 | { "Front Mic", 0x1 }, |
@@ -4466,7 +4643,7 @@ static struct hda_input_mux ad1882_capture_source = { | |||
4466 | }; | 4643 | }; |
4467 | 4644 | ||
4468 | /* list: 0x11, 0x39, 0x3a, 0x3c, 0x18, 0x1f, 0x12, 0x20 */ | 4645 | /* list: 0x11, 0x39, 0x3a, 0x3c, 0x18, 0x1f, 0x12, 0x20 */ |
4469 | static struct hda_input_mux ad1882a_capture_source = { | 4646 | static const struct hda_input_mux ad1882a_capture_source = { |
4470 | .num_items = 5, | 4647 | .num_items = 5, |
4471 | .items = { | 4648 | .items = { |
4472 | { "Front Mic", 0x1 }, | 4649 | { "Front Mic", 0x1 }, |
@@ -4477,7 +4654,7 @@ static struct hda_input_mux ad1882a_capture_source = { | |||
4477 | }, | 4654 | }, |
4478 | }; | 4655 | }; |
4479 | 4656 | ||
4480 | static struct snd_kcontrol_new ad1882_base_mixers[] = { | 4657 | static const struct snd_kcontrol_new ad1882_base_mixers[] = { |
4481 | HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT), | 4658 | HDA_CODEC_VOLUME("Front Playback Volume", 0x04, 0x0, HDA_OUTPUT), |
4482 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT), | 4659 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT), |
4483 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT), | 4660 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT), |
@@ -4487,9 +4664,9 @@ static struct snd_kcontrol_new ad1882_base_mixers[] = { | |||
4487 | HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x13, 1, 0x0, HDA_OUTPUT), | 4664 | HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x13, 1, 0x0, HDA_OUTPUT), |
4488 | HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x13, 1, 0x0, HDA_OUTPUT), | 4665 | HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x13, 1, 0x0, HDA_OUTPUT), |
4489 | 4666 | ||
4490 | HDA_CODEC_VOLUME("Mic Boost", 0x3c, 0x0, HDA_OUTPUT), | 4667 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x3c, 0x0, HDA_OUTPUT), |
4491 | HDA_CODEC_VOLUME("Front Mic Boost", 0x39, 0x0, HDA_OUTPUT), | 4668 | HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x39, 0x0, HDA_OUTPUT), |
4492 | HDA_CODEC_VOLUME("Line-In Boost", 0x3a, 0x0, HDA_OUTPUT), | 4669 | HDA_CODEC_VOLUME("Line-In Boost Volume", 0x3a, 0x0, HDA_OUTPUT), |
4493 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), | 4670 | HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), |
4494 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), | 4671 | HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), |
4495 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), | 4672 | HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT), |
@@ -4519,7 +4696,7 @@ static struct snd_kcontrol_new ad1882_base_mixers[] = { | |||
4519 | { } /* end */ | 4696 | { } /* end */ |
4520 | }; | 4697 | }; |
4521 | 4698 | ||
4522 | static struct snd_kcontrol_new ad1882_loopback_mixers[] = { | 4699 | static const struct snd_kcontrol_new ad1882_loopback_mixers[] = { |
4523 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x00, HDA_INPUT), | 4700 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x00, HDA_INPUT), |
4524 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT), | 4701 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT), |
4525 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x01, HDA_INPUT), | 4702 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x01, HDA_INPUT), |
@@ -4531,7 +4708,7 @@ static struct snd_kcontrol_new ad1882_loopback_mixers[] = { | |||
4531 | { } /* end */ | 4708 | { } /* end */ |
4532 | }; | 4709 | }; |
4533 | 4710 | ||
4534 | static struct snd_kcontrol_new ad1882a_loopback_mixers[] = { | 4711 | static const struct snd_kcontrol_new ad1882a_loopback_mixers[] = { |
4535 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x00, HDA_INPUT), | 4712 | HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x20, 0x00, HDA_INPUT), |
4536 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT), | 4713 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x20, 0x00, HDA_INPUT), |
4537 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x04, HDA_INPUT), | 4714 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x04, HDA_INPUT), |
@@ -4540,11 +4717,11 @@ static struct snd_kcontrol_new ad1882a_loopback_mixers[] = { | |||
4540 | HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x01, HDA_INPUT), | 4717 | HDA_CODEC_MUTE("Line Playback Switch", 0x20, 0x01, HDA_INPUT), |
4541 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x06, HDA_INPUT), | 4718 | HDA_CODEC_VOLUME("CD Playback Volume", 0x20, 0x06, HDA_INPUT), |
4542 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x06, HDA_INPUT), | 4719 | HDA_CODEC_MUTE("CD Playback Switch", 0x20, 0x06, HDA_INPUT), |
4543 | HDA_CODEC_VOLUME("Digital Mic Boost", 0x1f, 0x0, HDA_INPUT), | 4720 | HDA_CODEC_VOLUME("Digital Mic Boost Volume", 0x1f, 0x0, HDA_INPUT), |
4544 | { } /* end */ | 4721 | { } /* end */ |
4545 | }; | 4722 | }; |
4546 | 4723 | ||
4547 | static struct snd_kcontrol_new ad1882_3stack_mixers[] = { | 4724 | static const struct snd_kcontrol_new ad1882_3stack_mixers[] = { |
4548 | HDA_CODEC_MUTE("Surround Playback Switch", 0x15, 0x0, HDA_OUTPUT), | 4725 | HDA_CODEC_MUTE("Surround Playback Switch", 0x15, 0x0, HDA_OUTPUT), |
4549 | HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x17, 1, 0x0, HDA_OUTPUT), | 4726 | HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x17, 1, 0x0, HDA_OUTPUT), |
4550 | HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x17, 2, 0x0, HDA_OUTPUT), | 4727 | HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x17, 2, 0x0, HDA_OUTPUT), |
@@ -4558,14 +4735,14 @@ static struct snd_kcontrol_new ad1882_3stack_mixers[] = { | |||
4558 | { } /* end */ | 4735 | { } /* end */ |
4559 | }; | 4736 | }; |
4560 | 4737 | ||
4561 | static struct snd_kcontrol_new ad1882_6stack_mixers[] = { | 4738 | static const struct snd_kcontrol_new ad1882_6stack_mixers[] = { |
4562 | HDA_CODEC_MUTE("Surround Playback Switch", 0x16, 0x0, HDA_OUTPUT), | 4739 | HDA_CODEC_MUTE("Surround Playback Switch", 0x16, 0x0, HDA_OUTPUT), |
4563 | HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x24, 1, 0x0, HDA_OUTPUT), | 4740 | HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x24, 1, 0x0, HDA_OUTPUT), |
4564 | HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x24, 2, 0x0, HDA_OUTPUT), | 4741 | HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x24, 2, 0x0, HDA_OUTPUT), |
4565 | { } /* end */ | 4742 | { } /* end */ |
4566 | }; | 4743 | }; |
4567 | 4744 | ||
4568 | static struct hda_verb ad1882_ch2_init[] = { | 4745 | static const struct hda_verb ad1882_ch2_init[] = { |
4569 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | 4746 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, |
4570 | {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 4747 | {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
4571 | {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, | 4748 | {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, |
@@ -4575,7 +4752,7 @@ static struct hda_verb ad1882_ch2_init[] = { | |||
4575 | { } /* end */ | 4752 | { } /* end */ |
4576 | }; | 4753 | }; |
4577 | 4754 | ||
4578 | static struct hda_verb ad1882_ch4_init[] = { | 4755 | static const struct hda_verb ad1882_ch4_init[] = { |
4579 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | 4756 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
4580 | {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 4757 | {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
4581 | {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | 4758 | {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, |
@@ -4585,7 +4762,7 @@ static struct hda_verb ad1882_ch4_init[] = { | |||
4585 | { } /* end */ | 4762 | { } /* end */ |
4586 | }; | 4763 | }; |
4587 | 4764 | ||
4588 | static struct hda_verb ad1882_ch6_init[] = { | 4765 | static const struct hda_verb ad1882_ch6_init[] = { |
4589 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | 4766 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
4590 | {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | 4767 | {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
4591 | {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | 4768 | {0x2c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, |
@@ -4595,7 +4772,7 @@ static struct hda_verb ad1882_ch6_init[] = { | |||
4595 | { } /* end */ | 4772 | { } /* end */ |
4596 | }; | 4773 | }; |
4597 | 4774 | ||
4598 | static struct hda_channel_mode ad1882_modes[3] = { | 4775 | static const struct hda_channel_mode ad1882_modes[3] = { |
4599 | { 2, ad1882_ch2_init }, | 4776 | { 2, ad1882_ch2_init }, |
4600 | { 4, ad1882_ch4_init }, | 4777 | { 4, ad1882_ch4_init }, |
4601 | { 6, ad1882_ch6_init }, | 4778 | { 6, ad1882_ch6_init }, |
@@ -4604,7 +4781,7 @@ static struct hda_channel_mode ad1882_modes[3] = { | |||
4604 | /* | 4781 | /* |
4605 | * initialization verbs | 4782 | * initialization verbs |
4606 | */ | 4783 | */ |
4607 | static struct hda_verb ad1882_init_verbs[] = { | 4784 | static const struct hda_verb ad1882_init_verbs[] = { |
4608 | /* DACs; mute as default */ | 4785 | /* DACs; mute as default */ |
4609 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 4786 | {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, |
4610 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, | 4787 | {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, |
@@ -4673,7 +4850,7 @@ static struct hda_verb ad1882_init_verbs[] = { | |||
4673 | }; | 4850 | }; |
4674 | 4851 | ||
4675 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 4852 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
4676 | static struct hda_amp_list ad1882_loopbacks[] = { | 4853 | static const struct hda_amp_list ad1882_loopbacks[] = { |
4677 | { 0x20, HDA_INPUT, 0 }, /* Front Mic */ | 4854 | { 0x20, HDA_INPUT, 0 }, /* Front Mic */ |
4678 | { 0x20, HDA_INPUT, 1 }, /* Mic */ | 4855 | { 0x20, HDA_INPUT, 1 }, /* Mic */ |
4679 | { 0x20, HDA_INPUT, 4 }, /* Line */ | 4856 | { 0x20, HDA_INPUT, 4 }, /* Line */ |
@@ -4689,7 +4866,7 @@ enum { | |||
4689 | AD1882_MODELS | 4866 | AD1882_MODELS |
4690 | }; | 4867 | }; |
4691 | 4868 | ||
4692 | static const char *ad1882_models[AD1986A_MODELS] = { | 4869 | static const char * const ad1882_models[AD1986A_MODELS] = { |
4693 | [AD1882_3STACK] = "3stack", | 4870 | [AD1882_3STACK] = "3stack", |
4694 | [AD1882_6STACK] = "6stack", | 4871 | [AD1882_6STACK] = "6stack", |
4695 | }; | 4872 | }; |
@@ -4761,6 +4938,7 @@ static int patch_ad1882(struct hda_codec *codec) | |||
4761 | } | 4938 | } |
4762 | 4939 | ||
4763 | codec->no_trigger_sense = 1; | 4940 | codec->no_trigger_sense = 1; |
4941 | codec->no_sticky_stream = 1; | ||
4764 | 4942 | ||
4765 | return 0; | 4943 | return 0; |
4766 | } | 4944 | } |
@@ -4769,7 +4947,7 @@ static int patch_ad1882(struct hda_codec *codec) | |||
4769 | /* | 4947 | /* |
4770 | * patch entries | 4948 | * patch entries |
4771 | */ | 4949 | */ |
4772 | static struct hda_codec_preset snd_hda_preset_analog[] = { | 4950 | static const struct hda_codec_preset snd_hda_preset_analog[] = { |
4773 | { .id = 0x11d4184a, .name = "AD1884A", .patch = patch_ad1884a }, | 4951 | { .id = 0x11d4184a, .name = "AD1884A", .patch = patch_ad1884a }, |
4774 | { .id = 0x11d41882, .name = "AD1882", .patch = patch_ad1882 }, | 4952 | { .id = 0x11d41882, .name = "AD1882", .patch = patch_ad1882 }, |
4775 | { .id = 0x11d41883, .name = "AD1883", .patch = patch_ad1884a }, | 4953 | { .id = 0x11d41883, .name = "AD1883", .patch = patch_ad1884a }, |