aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/patch_analog.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/pci/hda/patch_analog.c')
-rw-r--r--sound/pci/hda/patch_analog.c662
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
32struct ad198x_spec { 32struct 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
133static const char *ad_slave_vols[] = { 136static 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
146static const char *ad_slave_sws[] = { 149static 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
162static 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
172static 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};
159static void ad198x_free_kctls(struct hda_codec *codec); 181static 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 */
163static struct snd_kcontrol_new ad_beep_mixer[] = { 185static 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
169static struct snd_kcontrol_new ad_beep2_mixer[] = { 191static 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
334static 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 */
377static struct hda_pcm_stream ad198x_pcm_analog_playback = { 406static 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
389static struct hda_pcm_stream ad198x_pcm_analog_capture = { 418static 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
400static struct hda_pcm_stream ad198x_pcm_digital_playback = { 429static 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
413static struct hda_pcm_stream ad198x_pcm_digital_capture = { 442static 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
452static inline void ad198x_shutup(struct hda_codec *codec) 489 return 0;
453{
454 snd_hda_shutup_pins(codec);
455} 490}
456 491
457static void ad198x_free_kctls(struct hda_codec *codec) 492static 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
545static void ad198x_shutup(struct hda_codec *codec)
546{
547 snd_hda_shutup_pins(codec);
548 ad198x_power_eapd(codec);
549}
550
510static void ad198x_free(struct hda_codec *codec) 551static 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)
524static int ad198x_suspend(struct hda_codec *codec, pm_message_t state) 565static 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
532static struct hda_codec_ops ad198x_patch_ops = { 572static 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
602static hda_nid_t ad1986a_dac_nids[3] = { 642static 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};
605static hda_nid_t ad1986a_adc_nids[1] = { AD1986A_ADC }; 645static const hda_nid_t ad1986a_adc_nids[1] = { AD1986A_ADC };
606static hda_nid_t ad1986a_capsrc_nids[1] = { 0x12 }; 646static const hda_nid_t ad1986a_capsrc_nids[1] = { 0x12 };
607 647
608static struct hda_input_mux ad1986a_capture_source = { 648static 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
622static struct hda_bind_ctls ad1986a_bind_pcm_vol = { 662static 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
632static struct hda_bind_ctls ad1986a_bind_pcm_sw = { 672static 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 */
645static struct snd_kcontrol_new ad1986a_mixers[] = { 685static 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 */
686static struct snd_kcontrol_new ad1986a_3st_mixers[] = { 726static 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 */
698static hda_nid_t ad1986a_laptop_dac_nids[1] = { AD1986A_FRONT_DAC }; 738static 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 */
701static struct hda_bind_ctls ad1986a_laptop_master_vol = { 741static 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
710static struct hda_bind_ctls ad1986a_laptop_master_sw = { 750static 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
719static struct snd_kcontrol_new ad1986a_laptop_mixers[] = { 759static 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
750static struct hda_input_mux ad1986a_laptop_eapd_capture_source = { 790static 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
759static struct hda_input_mux ad1986a_automic_capture_source = { 799static 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
767static struct snd_kcontrol_new ad1986a_laptop_master_mixers[] = { 807static 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
773static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = { 813static 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
800static struct snd_kcontrol_new ad1986a_laptop_intmic_mixers[] = { 840static 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
894static struct snd_kcontrol_new ad1986a_automute_master_mixers[] = { 934static 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 */
912static struct hda_verb ad1986a_init_verbs[] = { 952static 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
967static struct hda_verb ad1986a_ch2_init[] = { 1007static 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
979static struct hda_verb ad1986a_ch4_init[] = { 1019static 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
989static struct hda_verb ad1986a_ch6_init[] = { 1029static 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
999static struct hda_channel_mode ad1986a_modes[3] = { 1039static 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 */
1006static struct hda_verb ad1986a_eapd_init_verbs[] = { 1046static 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
1011static struct hda_verb ad1986a_automic_verbs[] = { 1051static 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 */
1021static struct hda_verb ad1986a_ultra_init[] = { 1061static 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 */
1032static struct hda_verb ad1986a_hp_init_verbs[] = { 1072static 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
1072static const char *ad1986a_models[AD1986A_MODELS] = { 1112static 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
1083static struct snd_pci_quirk ad1986a_cfg_tbl[] = { 1123static 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
1115static struct hda_amp_list ad1986a_loopbacks[] = { 1155static 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
1291static hda_nid_t ad1983_dac_nids[1] = { AD1983_DAC }; 1332static const hda_nid_t ad1983_dac_nids[1] = { AD1983_DAC };
1292static hda_nid_t ad1983_adc_nids[1] = { AD1983_ADC }; 1333static const hda_nid_t ad1983_adc_nids[1] = { AD1983_ADC };
1293static hda_nid_t ad1983_capsrc_nids[1] = { 0x15 }; 1334static const hda_nid_t ad1983_capsrc_nids[1] = { 0x15 };
1294 1335
1295static struct hda_input_mux ad1983_capture_source = { 1336static 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 */
1308static int ad1983_spdif_route_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) 1349static 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
1347static struct snd_kcontrol_new ad1983_mixers[] = { 1388static 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
1380static struct hda_verb ad1983_init_verbs[] = { 1421static 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
1420static struct hda_amp_list ad1983_loopbacks[] = { 1461static 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
1479static hda_nid_t ad1981_dac_nids[1] = { AD1981_DAC }; 1521static const hda_nid_t ad1981_dac_nids[1] = { AD1981_DAC };
1480static hda_nid_t ad1981_adc_nids[1] = { AD1981_ADC }; 1522static const hda_nid_t ad1981_adc_nids[1] = { AD1981_ADC };
1481static hda_nid_t ad1981_capsrc_nids[1] = { 0x15 }; 1523static 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 */
1484static struct hda_input_mux ad1981_capture_source = { 1526static 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
1497static struct snd_kcontrol_new ad1981_mixers[] = { 1539static 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
1538static struct hda_verb ad1981_init_verbs[] = { 1580static 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
1586static struct hda_amp_list ad1981_loopbacks[] = { 1628static 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
1606static struct hda_verb ad1981_hp_init_verbs[] = { 1648static 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 */
1635static struct hda_bind_ctls ad1981_hp_bind_master_vol = { 1677static 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 */
1655static void ad1981_hp_automic(struct hda_codec *codec) 1697static 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
1691static struct hda_input_mux ad1981_hp_capture_source = { 1733static 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
1700static struct snd_kcontrol_new ad1981_hp_mixers[] = { 1742static 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 */
1751static struct hda_verb ad1981_toshiba_init_verbs[] = { 1793static 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
1759static struct snd_kcontrol_new ad1981_toshiba_mixers[] = { 1801static 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 */
1766static struct snd_kcontrol_new ad1981_thinkpad_mixers[] = { 1808static 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
1796static struct hda_input_mux ad1981_thinkpad_capture_source = { 1838static 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
1814static const char *ad1981_models[AD1981_MODELS] = { 1856static 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
1821static struct snd_pci_quirk ad1981_cfg_tbl[] = { 1863static 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)
2012enum { 2055enum {
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
2034static hda_nid_t ad1988_6stack_dac_nids[4] = { 2078static const hda_nid_t ad1988_6stack_dac_nids[4] = {
2035 0x04, 0x06, 0x05, 0x0a 2079 0x04, 0x06, 0x05, 0x0a
2036}; 2080};
2037 2081
2038static hda_nid_t ad1988_3stack_dac_nids[3] = { 2082static 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 */
2043static hda_nid_t ad1988_6stack_dac_nids_rev2[4] = { 2087static const hda_nid_t ad1988_6stack_dac_nids_rev2[4] = {
2044 0x04, 0x05, 0x0a, 0x06 2088 0x04, 0x05, 0x0a, 0x06
2045}; 2089};
2046 2090
2047static hda_nid_t ad1988_3stack_dac_nids_rev2[3] = { 2091static const hda_nid_t ad1988_alt_dac_nid[1] = {
2092 0x03
2093};
2094
2095static const hda_nid_t ad1988_3stack_dac_nids_rev2[3] = {
2048 0x04, 0x0a, 0x06 2096 0x04, 0x0a, 0x06
2049}; 2097};
2050 2098
2051static hda_nid_t ad1988_adc_nids[3] = { 2099static const hda_nid_t ad1988_adc_nids[3] = {
2052 0x08, 0x09, 0x0f 2100 0x08, 0x09, 0x0f
2053}; 2101};
2054 2102
2055static hda_nid_t ad1988_capsrc_nids[3] = { 2103static 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
2063static hda_nid_t ad1989b_slave_dig_outs[] = { 2111static 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
2067static struct hda_input_mux ad1988_6stack_capture_source = { 2115static 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
2078static struct hda_input_mux ad1988_laptop_capture_source = { 2126static 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 */
2121static struct snd_kcontrol_new ad1988_6stack_mixers1[] = { 2169static 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
2130static struct snd_kcontrol_new ad1988_6stack_mixers1_rev2[] = { 2178static 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
2139static struct snd_kcontrol_new ad1988_6stack_mixers2[] = { 2187static 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
2214static 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 */
2167static struct snd_kcontrol_new ad1988_3stack_mixers1[] = { 2221static 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
2175static struct snd_kcontrol_new ad1988_3stack_mixers1_rev2[] = { 2229static 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
2183static struct snd_kcontrol_new ad1988_3stack_mixers2[] = { 2237static 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 */
2217static struct snd_kcontrol_new ad1988_laptop_mixers[] = { 2271static 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 */
2248static struct snd_kcontrol_new ad1988_capture_mixers[] = { 2302static 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[] = {
2270static int ad1988_spdif_playback_source_info(struct snd_kcontrol *kcontrol, 2324static 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
2354static struct snd_kcontrol_new ad1988_spdif_out_mixers[] = { 2408static 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
2367static struct snd_kcontrol_new ad1988_spdif_in_mixers[] = { 2421static 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
2372static struct snd_kcontrol_new ad1989_spdif_out_mixers[] = { 2426static 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 */
2385static struct hda_verb ad1988_6stack_init_verbs[] = { 2439static 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
2445static struct hda_verb ad1988_capture_init_verbs[] = { 2499static 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
2512static 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
2463static struct hda_verb ad1988_spdif_init_verbs[] = { 2530static 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
2475static struct hda_verb ad1988_spdif_in_init_verbs[] = { 2542static 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 */
2482static struct hda_verb ad1989_spdif_init_verbs[] = { 2549static 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 */
2495static struct hda_verb ad1988_3stack_ch2_init[] = { 2562static 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
2505static struct hda_verb ad1988_3stack_ch6_init[] = { 2572static 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
2515static struct hda_channel_mode ad1988_3stack_modes[2] = { 2582static 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
2520static struct hda_verb ad1988_3stack_init_verbs[] = { 2587static 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 */
2580static struct hda_verb ad1988_laptop_hp_on[] = { 2647static 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};
2586static struct hda_verb ad1988_laptop_hp_off[] = { 2653static 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
2595static struct hda_verb ad1988_laptop_init_verbs[] = { 2662static 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
2659static struct hda_amp_list ad1988_loopbacks[] = { 2726static 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};
2677static struct snd_kcontrol_new ad1988_control_templates[] = { 2744static 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
2706static hda_nid_t ad1988_mixer_nids[8] = { 2773static 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
2711static inline hda_nid_t ad1988_idx_to_dac(struct hda_codec *codec, int idx) 2778static 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
2727static hda_nid_t ad1988_boost_nids[8] = { 2794static 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
2731static int ad1988_pin_idx(hda_nid_t nid) 2798static 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
2743static int ad1988_pin_to_loopback_idx(hda_nid_t nid) 2810static 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
2756static int ad1988_pin_to_adc_idx(hda_nid_t nid) 2823static 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 */
2882static int new_analog_input(struct ad198x_spec *spec, hda_nid_t pin, 2951static 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 */
2912static int ad1988_auto_create_analog_input_ctls(struct ad198x_spec *spec, 2981static 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)
2994static void ad1988_auto_init_analog_input(struct hda_codec *codec) 3065static 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
3077static const char *ad1988_models[AD1988_MODEL_LAST] = { 3147static 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
3087static struct snd_pci_quirk ad1988_cfg_tbl[] = { 3158static 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
3261static hda_nid_t ad1884_dac_nids[1] = { 3347static const hda_nid_t ad1884_dac_nids[1] = {
3262 0x04, 3348 0x04,
3263}; 3349};
3264 3350
3265static hda_nid_t ad1884_adc_nids[2] = { 3351static const hda_nid_t ad1884_adc_nids[2] = {
3266 0x08, 0x09, 3352 0x08, 0x09,
3267}; 3353};
3268 3354
3269static hda_nid_t ad1884_capsrc_nids[2] = { 3355static 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
3275static struct hda_input_mux ad1884_capture_source = { 3361static 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
3285static struct snd_kcontrol_new ad1884_base_mixers[] = { 3371static 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
3329static struct snd_kcontrol_new ad1984_dmic_mixers[] = { 3415static 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 */
3342static struct hda_verb ad1884_init_verbs[] = { 3428static 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
3388static struct hda_amp_list ad1884_loopbacks[] = { 3474static 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
3397static const char *ad1884_slave_vols[] = { 3483static 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 */
3459static struct hda_input_mux ad1984_thinkpad_capture_source = { 3546static 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 */
3473static struct hda_input_mux ad1984_dell_desktop_capture_source = { 3560static 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
3483static struct snd_kcontrol_new ad1984_thinkpad_mixers[] = { 3570static 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 */
3529static struct hda_verb ad1984_thinkpad_init_verbs[] = { 3616static 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 */
3547static struct snd_kcontrol_new ad1984_dell_desktop_mixers[] = { 3634static 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
3598static struct hda_pcm_stream ad1984_pcm_dmic_capture = { 3685static 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
3634static const char *ad1984_models[AD1984_MODELS] = { 3721static 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
3640static struct snd_pci_quirk ad1984_cfg_tbl[] = { 3727static 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
3705static hda_nid_t ad1884a_dac_nids[1] = { 3792static 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
3714static struct hda_input_mux ad1884a_capture_source = { 3801static 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
3725static struct snd_kcontrol_new ad1884a_base_mixers[] = { 3812static 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 */
3777static struct hda_verb ad1884a_init_verbs[] = { 3864static 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
3832static struct hda_amp_list ad1884a_loopbacks[] = { 3919static 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
3865static struct snd_kcontrol_new ad1884a_laptop_mixers[] = { 3952static 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
3893static struct snd_kcontrol_new ad1884a_mobile_mixers[] = { 3980static 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 */
4013static struct hda_verb ad1884a_laptop_verbs[] = { 4100static 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
4044static struct hda_verb ad1884a_mobile_verbs[] = { 4131static 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
4099static struct hda_verb ad1984a_thinkpad_verbs[] = { 4186static 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
4116static struct snd_kcontrol_new ad1984a_thinkpad_mixers[] = { 4203static 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
4137static struct hda_input_mux ad1984a_thinkpad_capture_source = { 4224static 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
4267static 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
4293static 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 */
4310static 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 */
4321static 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 */
4330static 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
4184static struct hda_verb ad1984a_touchsmart_verbs[] = { 4349static 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
4236static struct snd_kcontrol_new ad1984a_touchsmart_mixers[] = { 4401static 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
4305static const char *ad1884a_models[AD1884A_MODELS] = { 4471static 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
4313static struct snd_pci_quirk ad1884a_cfg_tbl[] = { 4480static 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
4442static hda_nid_t ad1882_dac_nids[3] = { 4619static const hda_nid_t ad1882_dac_nids[3] = {
4443 0x04, 0x03, 0x05 4620 0x04, 0x03, 0x05
4444}; 4621};
4445 4622
4446static hda_nid_t ad1882_adc_nids[2] = { 4623static const hda_nid_t ad1882_adc_nids[2] = {
4447 0x08, 0x09, 4624 0x08, 0x09,
4448}; 4625};
4449 4626
4450static hda_nid_t ad1882_capsrc_nids[2] = { 4627static 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 */
4457static struct hda_input_mux ad1882_capture_source = { 4634static 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 */
4469static struct hda_input_mux ad1882a_capture_source = { 4646static 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
4480static struct snd_kcontrol_new ad1882_base_mixers[] = { 4657static 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
4522static struct snd_kcontrol_new ad1882_loopback_mixers[] = { 4699static 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
4534static struct snd_kcontrol_new ad1882a_loopback_mixers[] = { 4711static 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
4547static struct snd_kcontrol_new ad1882_3stack_mixers[] = { 4724static 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
4561static struct snd_kcontrol_new ad1882_6stack_mixers[] = { 4738static 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
4568static struct hda_verb ad1882_ch2_init[] = { 4745static 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
4578static struct hda_verb ad1882_ch4_init[] = { 4755static 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
4588static struct hda_verb ad1882_ch6_init[] = { 4765static 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
4598static struct hda_channel_mode ad1882_modes[3] = { 4775static 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 */
4607static struct hda_verb ad1882_init_verbs[] = { 4784static 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
4676static struct hda_amp_list ad1882_loopbacks[] = { 4853static 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
4692static const char *ad1882_models[AD1986A_MODELS] = { 4869static 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 */
4772static struct hda_codec_preset snd_hda_preset_analog[] = { 4950static 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 },