aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/patch_realtek.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r--sound/pci/hda/patch_realtek.c3681
1 files changed, 1828 insertions, 1853 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index c82979a8cd09..7a4e10002f56 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -299,11 +299,23 @@ struct alc_customize_define {
299 299
300struct alc_fixup; 300struct alc_fixup;
301 301
302struct alc_multi_io {
303 hda_nid_t pin; /* multi-io widget pin NID */
304 hda_nid_t dac; /* DAC to be connected */
305 unsigned int ctl_in; /* cached input-pin control value */
306};
307
308enum {
309 ALC_AUTOMUTE_PIN, /* change the pin control */
310 ALC_AUTOMUTE_AMP, /* mute/unmute the pin AMP */
311 ALC_AUTOMUTE_MIXER, /* mute/unmute mixer widget AMP */
312};
313
302struct alc_spec { 314struct alc_spec {
303 /* codec parameterization */ 315 /* codec parameterization */
304 struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ 316 const struct snd_kcontrol_new *mixers[5]; /* mixer arrays */
305 unsigned int num_mixers; 317 unsigned int num_mixers;
306 struct snd_kcontrol_new *cap_mixer; /* capture mixer */ 318 const struct snd_kcontrol_new *cap_mixer; /* capture mixer */
307 unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */ 319 unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */
308 320
309 const struct hda_verb *init_verbs[10]; /* initialization verbs 321 const struct hda_verb *init_verbs[10]; /* initialization verbs
@@ -313,14 +325,14 @@ struct alc_spec {
313 unsigned int num_init_verbs; 325 unsigned int num_init_verbs;
314 326
315 char stream_name_analog[32]; /* analog PCM stream */ 327 char stream_name_analog[32]; /* analog PCM stream */
316 struct hda_pcm_stream *stream_analog_playback; 328 const struct hda_pcm_stream *stream_analog_playback;
317 struct hda_pcm_stream *stream_analog_capture; 329 const struct hda_pcm_stream *stream_analog_capture;
318 struct hda_pcm_stream *stream_analog_alt_playback; 330 const struct hda_pcm_stream *stream_analog_alt_playback;
319 struct hda_pcm_stream *stream_analog_alt_capture; 331 const struct hda_pcm_stream *stream_analog_alt_capture;
320 332
321 char stream_name_digital[32]; /* digital PCM stream */ 333 char stream_name_digital[32]; /* digital PCM stream */
322 struct hda_pcm_stream *stream_digital_playback; 334 const struct hda_pcm_stream *stream_digital_playback;
323 struct hda_pcm_stream *stream_digital_capture; 335 const struct hda_pcm_stream *stream_digital_capture;
324 336
325 /* playback */ 337 /* playback */
326 struct hda_multi_out multiout; /* playback set-up 338 struct hda_multi_out multiout; /* playback set-up
@@ -333,8 +345,8 @@ struct alc_spec {
333 345
334 /* capture */ 346 /* capture */
335 unsigned int num_adc_nids; 347 unsigned int num_adc_nids;
336 hda_nid_t *adc_nids; 348 const hda_nid_t *adc_nids;
337 hda_nid_t *capsrc_nids; 349 const hda_nid_t *capsrc_nids;
338 hda_nid_t dig_in_nid; /* digital-in NID; optional */ 350 hda_nid_t dig_in_nid; /* digital-in NID; optional */
339 351
340 /* capture setup for dynamic dual-adc switch */ 352 /* capture setup for dynamic dual-adc switch */
@@ -348,6 +360,7 @@ struct alc_spec {
348 const struct hda_input_mux *input_mux; 360 const struct hda_input_mux *input_mux;
349 unsigned int cur_mux[3]; 361 unsigned int cur_mux[3];
350 struct alc_mic_route ext_mic; 362 struct alc_mic_route ext_mic;
363 struct alc_mic_route dock_mic;
351 struct alc_mic_route int_mic; 364 struct alc_mic_route int_mic;
352 365
353 /* channel model */ 366 /* channel model */
@@ -375,17 +388,27 @@ struct alc_spec {
375#ifdef CONFIG_SND_HDA_POWER_SAVE 388#ifdef CONFIG_SND_HDA_POWER_SAVE
376 void (*power_hook)(struct hda_codec *codec); 389 void (*power_hook)(struct hda_codec *codec);
377#endif 390#endif
391 void (*shutup)(struct hda_codec *codec);
378 392
379 /* for pin sensing */ 393 /* for pin sensing */
380 unsigned int sense_updated: 1;
381 unsigned int jack_present: 1; 394 unsigned int jack_present: 1;
382 unsigned int master_sw: 1; 395 unsigned int line_jack_present:1;
396 unsigned int master_mute:1;
383 unsigned int auto_mic:1; 397 unsigned int auto_mic:1;
398 unsigned int automute:1; /* HP automute enabled */
399 unsigned int detect_line:1; /* Line-out detection enabled */
400 unsigned int automute_lines:1; /* automute line-out as well */
401 unsigned int automute_hp_lo:1; /* both HP and LO available */
384 402
385 /* other flags */ 403 /* other flags */
386 unsigned int no_analog :1; /* digital I/O only */ 404 unsigned int no_analog :1; /* digital I/O only */
387 unsigned int dual_adc_switch:1; /* switch ADCs (for ALC275) */ 405 unsigned int dual_adc_switch:1; /* switch ADCs (for ALC275) */
388 unsigned int single_input_src:1; 406 unsigned int single_input_src:1;
407
408 /* auto-mute control */
409 int automute_mode;
410 hda_nid_t automute_mixer_nid[AUTO_CFG_MAX_OUTS];
411
389 int init_amp; 412 int init_amp;
390 int codec_variant; /* flag for other variants */ 413 int codec_variant; /* flag for other variants */
391 414
@@ -403,25 +426,29 @@ struct alc_spec {
403 int fixup_id; 426 int fixup_id;
404 const struct alc_fixup *fixup_list; 427 const struct alc_fixup *fixup_list;
405 const char *fixup_name; 428 const char *fixup_name;
429
430 /* multi-io */
431 int multi_ios;
432 struct alc_multi_io multi_io[4];
406}; 433};
407 434
408/* 435/*
409 * configuration template - to be copied to the spec instance 436 * configuration template - to be copied to the spec instance
410 */ 437 */
411struct alc_config_preset { 438struct alc_config_preset {
412 struct snd_kcontrol_new *mixers[5]; /* should be identical size 439 const struct snd_kcontrol_new *mixers[5]; /* should be identical size
413 * with spec 440 * with spec
414 */ 441 */
415 struct snd_kcontrol_new *cap_mixer; /* capture mixer */ 442 const struct snd_kcontrol_new *cap_mixer; /* capture mixer */
416 const struct hda_verb *init_verbs[5]; 443 const struct hda_verb *init_verbs[5];
417 unsigned int num_dacs; 444 unsigned int num_dacs;
418 hda_nid_t *dac_nids; 445 const hda_nid_t *dac_nids;
419 hda_nid_t dig_out_nid; /* optional */ 446 hda_nid_t dig_out_nid; /* optional */
420 hda_nid_t hp_nid; /* optional */ 447 hda_nid_t hp_nid; /* optional */
421 hda_nid_t *slave_dig_outs; 448 const hda_nid_t *slave_dig_outs;
422 unsigned int num_adc_nids; 449 unsigned int num_adc_nids;
423 hda_nid_t *adc_nids; 450 const hda_nid_t *adc_nids;
424 hda_nid_t *capsrc_nids; 451 const hda_nid_t *capsrc_nids;
425 hda_nid_t dig_in_nid; 452 hda_nid_t dig_in_nid;
426 unsigned int num_channel_mode; 453 unsigned int num_channel_mode;
427 const struct hda_channel_mode *channel_mode; 454 const struct hda_channel_mode *channel_mode;
@@ -433,7 +460,7 @@ struct alc_config_preset {
433 void (*setup)(struct hda_codec *); 460 void (*setup)(struct hda_codec *);
434 void (*init_hook)(struct hda_codec *); 461 void (*init_hook)(struct hda_codec *);
435#ifdef CONFIG_SND_HDA_POWER_SAVE 462#ifdef CONFIG_SND_HDA_POWER_SAVE
436 struct hda_amp_list *loopbacks; 463 const struct hda_amp_list *loopbacks;
437 void (*power_hook)(struct hda_codec *codec); 464 void (*power_hook)(struct hda_codec *codec);
438#endif 465#endif
439}; 466};
@@ -560,11 +587,11 @@ static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
560 * NIDs 0x0f and 0x10 have been observed to have this behaviour as of 587 * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
561 * March 2006. 588 * March 2006.
562 */ 589 */
563static char *alc_pin_mode_names[] = { 590static const char * const alc_pin_mode_names[] = {
564 "Mic 50pc bias", "Mic 80pc bias", 591 "Mic 50pc bias", "Mic 80pc bias",
565 "Line in", "Line out", "Headphone out", 592 "Line in", "Line out", "Headphone out",
566}; 593};
567static unsigned char alc_pin_mode_values[] = { 594static const unsigned char alc_pin_mode_values[] = {
568 PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP, 595 PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
569}; 596};
570/* The control can present all 5 options, or it can limit the options based 597/* The control can present all 5 options, or it can limit the options based
@@ -583,7 +610,7 @@ static unsigned char alc_pin_mode_values[] = {
583/* Info about the pin modes supported by the different pin direction modes. 610/* Info about the pin modes supported by the different pin direction modes.
584 * For each direction the minimum and maximum values are given. 611 * For each direction the minimum and maximum values are given.
585 */ 612 */
586static signed char alc_pin_mode_dir_info[5][2] = { 613static const signed char alc_pin_mode_dir_info[5][2] = {
587 { 0, 2 }, /* ALC_PIN_DIR_IN */ 614 { 0, 2 }, /* ALC_PIN_DIR_IN */
588 { 3, 4 }, /* ALC_PIN_DIR_OUT */ 615 { 3, 4 }, /* ALC_PIN_DIR_OUT */
589 { 0, 4 }, /* ALC_PIN_DIR_INOUT */ 616 { 0, 4 }, /* ALC_PIN_DIR_INOUT */
@@ -900,7 +927,7 @@ static void alc_fixup_autocfg_pin_nums(struct hda_codec *codec)
900 927
901/* 928/*
902 */ 929 */
903static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix) 930static void add_mixer(struct alc_spec *spec, const struct snd_kcontrol_new *mix)
904{ 931{
905 if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers))) 932 if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
906 return; 933 return;
@@ -971,21 +998,21 @@ static void setup_preset(struct hda_codec *codec,
971} 998}
972 999
973/* Enable GPIO mask and set output */ 1000/* Enable GPIO mask and set output */
974static struct hda_verb alc_gpio1_init_verbs[] = { 1001static const struct hda_verb alc_gpio1_init_verbs[] = {
975 {0x01, AC_VERB_SET_GPIO_MASK, 0x01}, 1002 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
976 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, 1003 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
977 {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, 1004 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
978 { } 1005 { }
979}; 1006};
980 1007
981static struct hda_verb alc_gpio2_init_verbs[] = { 1008static const struct hda_verb alc_gpio2_init_verbs[] = {
982 {0x01, AC_VERB_SET_GPIO_MASK, 0x02}, 1009 {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
983 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02}, 1010 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
984 {0x01, AC_VERB_SET_GPIO_DATA, 0x02}, 1011 {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
985 { } 1012 { }
986}; 1013};
987 1014
988static struct hda_verb alc_gpio3_init_verbs[] = { 1015static const struct hda_verb alc_gpio3_init_verbs[] = {
989 {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, 1016 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
990 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03}, 1017 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
991 {0x01, AC_VERB_SET_GPIO_DATA, 0x03}, 1018 {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
@@ -1031,6 +1058,7 @@ static int alc_init_jacks(struct hda_codec *codec)
1031 int err; 1058 int err;
1032 unsigned int hp_nid = spec->autocfg.hp_pins[0]; 1059 unsigned int hp_nid = spec->autocfg.hp_pins[0];
1033 unsigned int mic_nid = spec->ext_mic.pin; 1060 unsigned int mic_nid = spec->ext_mic.pin;
1061 unsigned int dock_nid = spec->dock_mic.pin;
1034 1062
1035 if (hp_nid) { 1063 if (hp_nid) {
1036 err = snd_hda_input_jack_add(codec, hp_nid, 1064 err = snd_hda_input_jack_add(codec, hp_nid,
@@ -1047,46 +1075,116 @@ static int alc_init_jacks(struct hda_codec *codec)
1047 return err; 1075 return err;
1048 snd_hda_input_jack_report(codec, mic_nid); 1076 snd_hda_input_jack_report(codec, mic_nid);
1049 } 1077 }
1078 if (dock_nid) {
1079 err = snd_hda_input_jack_add(codec, dock_nid,
1080 SND_JACK_MICROPHONE, NULL);
1081 if (err < 0)
1082 return err;
1083 snd_hda_input_jack_report(codec, dock_nid);
1084 }
1050#endif /* CONFIG_SND_HDA_INPUT_JACK */ 1085#endif /* CONFIG_SND_HDA_INPUT_JACK */
1051 return 0; 1086 return 0;
1052} 1087}
1053 1088
1054static void alc_automute_speaker(struct hda_codec *codec, int pinctl) 1089static int detect_jacks(struct hda_codec *codec, int num_pins, hda_nid_t *pins)
1055{ 1090{
1056 struct alc_spec *spec = codec->spec; 1091 int i, present = 0;
1057 unsigned int mute;
1058 hda_nid_t nid;
1059 int i;
1060 1092
1061 spec->jack_present = 0; 1093 for (i = 0; i < num_pins; i++) {
1062 for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) { 1094 hda_nid_t nid = pins[i];
1063 nid = spec->autocfg.hp_pins[i];
1064 if (!nid) 1095 if (!nid)
1065 break; 1096 break;
1066 snd_hda_input_jack_report(codec, nid); 1097 snd_hda_input_jack_report(codec, nid);
1067 spec->jack_present |= snd_hda_jack_detect(codec, nid); 1098 present |= snd_hda_jack_detect(codec, nid);
1068 } 1099 }
1100 return present;
1101}
1102
1103static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins,
1104 bool mute, bool hp_out)
1105{
1106 struct alc_spec *spec = codec->spec;
1107 unsigned int mute_bits = mute ? HDA_AMP_MUTE : 0;
1108 unsigned int pin_bits = mute ? 0 : (hp_out ? PIN_HP : PIN_OUT);
1109 int i;
1069 1110
1070 mute = spec->jack_present ? HDA_AMP_MUTE : 0; 1111 for (i = 0; i < num_pins; i++) {
1071 /* Toggle internal speakers muting */ 1112 hda_nid_t nid = pins[i];
1072 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1073 nid = spec->autocfg.speaker_pins[i];
1074 if (!nid) 1113 if (!nid)
1075 break; 1114 break;
1076 if (pinctl) { 1115 switch (spec->automute_mode) {
1116 case ALC_AUTOMUTE_PIN:
1077 snd_hda_codec_write(codec, nid, 0, 1117 snd_hda_codec_write(codec, nid, 0,
1078 AC_VERB_SET_PIN_WIDGET_CONTROL, 1118 AC_VERB_SET_PIN_WIDGET_CONTROL,
1079 spec->jack_present ? 0 : PIN_OUT); 1119 pin_bits);
1080 } else { 1120 break;
1121 case ALC_AUTOMUTE_AMP:
1081 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, 1122 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1082 HDA_AMP_MUTE, mute); 1123 HDA_AMP_MUTE, mute_bits);
1124 break;
1125 case ALC_AUTOMUTE_MIXER:
1126 nid = spec->automute_mixer_nid[i];
1127 if (!nid)
1128 break;
1129 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
1130 HDA_AMP_MUTE, mute_bits);
1131 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 1,
1132 HDA_AMP_MUTE, mute_bits);
1133 break;
1083 } 1134 }
1084 } 1135 }
1085} 1136}
1086 1137
1087static void alc_automute_pin(struct hda_codec *codec) 1138/* Toggle internal speakers muting */
1139static void update_speakers(struct hda_codec *codec)
1140{
1141 struct alc_spec *spec = codec->spec;
1142 int on;
1143
1144 if (!spec->automute)
1145 on = 0;
1146 else
1147 on = spec->jack_present | spec->line_jack_present;
1148 on |= spec->master_mute;
1149 do_automute(codec, ARRAY_SIZE(spec->autocfg.speaker_pins),
1150 spec->autocfg.speaker_pins, on, false);
1151
1152 /* toggle line-out mutes if needed, too */
1153 /* if LO is a copy of either HP or Speaker, don't need to handle it */
1154 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0] ||
1155 spec->autocfg.line_out_pins[0] == spec->autocfg.speaker_pins[0])
1156 return;
1157 if (!spec->automute_lines || !spec->automute)
1158 on = 0;
1159 else
1160 on = spec->jack_present;
1161 on |= spec->master_mute;
1162 do_automute(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
1163 spec->autocfg.line_out_pins, on, false);
1164}
1165
1166static void alc_hp_automute(struct hda_codec *codec)
1088{ 1167{
1089 alc_automute_speaker(codec, 1); 1168 struct alc_spec *spec = codec->spec;
1169
1170 if (!spec->automute)
1171 return;
1172 spec->jack_present =
1173 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
1174 spec->autocfg.hp_pins);
1175 update_speakers(codec);
1176}
1177
1178static void alc_line_automute(struct hda_codec *codec)
1179{
1180 struct alc_spec *spec = codec->spec;
1181
1182 if (!spec->automute || !spec->detect_line)
1183 return;
1184 spec->line_jack_present =
1185 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
1186 spec->autocfg.line_out_pins);
1187 update_speakers(codec);
1090} 1188}
1091 1189
1092static int get_connection_index(struct hda_codec *codec, hda_nid_t mux, 1190static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
@@ -1128,7 +1226,7 @@ static void alc_dual_mic_adc_auto_switch(struct hda_codec *codec)
1128static void alc_mic_automute(struct hda_codec *codec) 1226static void alc_mic_automute(struct hda_codec *codec)
1129{ 1227{
1130 struct alc_spec *spec = codec->spec; 1228 struct alc_spec *spec = codec->spec;
1131 struct alc_mic_route *dead, *alive; 1229 struct alc_mic_route *dead1, *dead2, *alive;
1132 unsigned int present, type; 1230 unsigned int present, type;
1133 hda_nid_t cap_nid; 1231 hda_nid_t cap_nid;
1134 1232
@@ -1146,13 +1244,24 @@ static void alc_mic_automute(struct hda_codec *codec)
1146 1244
1147 cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0]; 1245 cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1148 1246
1247 alive = &spec->int_mic;
1248 dead1 = &spec->ext_mic;
1249 dead2 = &spec->dock_mic;
1250
1149 present = snd_hda_jack_detect(codec, spec->ext_mic.pin); 1251 present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1150 if (present) { 1252 if (present) {
1151 alive = &spec->ext_mic; 1253 alive = &spec->ext_mic;
1152 dead = &spec->int_mic; 1254 dead1 = &spec->int_mic;
1153 } else { 1255 dead2 = &spec->dock_mic;
1154 alive = &spec->int_mic; 1256 }
1155 dead = &spec->ext_mic; 1257 if (!present && spec->dock_mic.pin > 0) {
1258 present = snd_hda_jack_detect(codec, spec->dock_mic.pin);
1259 if (present) {
1260 alive = &spec->dock_mic;
1261 dead1 = &spec->int_mic;
1262 dead2 = &spec->ext_mic;
1263 }
1264 snd_hda_input_jack_report(codec, spec->dock_mic.pin);
1156 } 1265 }
1157 1266
1158 type = get_wcaps_type(get_wcaps(codec, cap_nid)); 1267 type = get_wcaps_type(get_wcaps(codec, cap_nid));
@@ -1161,9 +1270,14 @@ static void alc_mic_automute(struct hda_codec *codec)
1161 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT, 1270 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1162 alive->mux_idx, 1271 alive->mux_idx,
1163 HDA_AMP_MUTE, 0); 1272 HDA_AMP_MUTE, 0);
1164 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT, 1273 if (dead1->pin > 0)
1165 dead->mux_idx, 1274 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1166 HDA_AMP_MUTE, HDA_AMP_MUTE); 1275 dead1->mux_idx,
1276 HDA_AMP_MUTE, HDA_AMP_MUTE);
1277 if (dead2->pin > 0)
1278 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1279 dead2->mux_idx,
1280 HDA_AMP_MUTE, HDA_AMP_MUTE);
1167 } else { 1281 } else {
1168 /* MUX style (e.g. ALC880) */ 1282 /* MUX style (e.g. ALC880) */
1169 snd_hda_codec_write_cache(codec, cap_nid, 0, 1283 snd_hda_codec_write_cache(codec, cap_nid, 0,
@@ -1184,7 +1298,10 @@ static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1184 res >>= 26; 1298 res >>= 26;
1185 switch (res) { 1299 switch (res) {
1186 case ALC880_HP_EVENT: 1300 case ALC880_HP_EVENT:
1187 alc_automute_pin(codec); 1301 alc_hp_automute(codec);
1302 break;
1303 case ALC880_FRONT_EVENT:
1304 alc_line_automute(codec);
1188 break; 1305 break;
1189 case ALC880_MIC_EVENT: 1306 case ALC880_MIC_EVENT:
1190 alc_mic_automute(codec); 1307 alc_mic_automute(codec);
@@ -1194,7 +1311,8 @@ static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1194 1311
1195static void alc_inithook(struct hda_codec *codec) 1312static void alc_inithook(struct hda_codec *codec)
1196{ 1313{
1197 alc_automute_pin(codec); 1314 alc_hp_automute(codec);
1315 alc_line_automute(codec);
1198 alc_mic_automute(codec); 1316 alc_mic_automute(codec);
1199} 1317}
1200 1318
@@ -1236,6 +1354,43 @@ static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
1236 on ? 2 : 0); 1354 on ? 2 : 0);
1237} 1355}
1238 1356
1357/* turn on/off EAPD controls of the codec */
1358static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
1359{
1360 /* We currently only handle front, HP */
1361 switch (codec->vendor_id) {
1362 case 0x10ec0260:
1363 set_eapd(codec, 0x0f, on);
1364 set_eapd(codec, 0x10, on);
1365 break;
1366 case 0x10ec0262:
1367 case 0x10ec0267:
1368 case 0x10ec0268:
1369 case 0x10ec0269:
1370 case 0x10ec0270:
1371 case 0x10ec0272:
1372 case 0x10ec0660:
1373 case 0x10ec0662:
1374 case 0x10ec0663:
1375 case 0x10ec0665:
1376 case 0x10ec0862:
1377 case 0x10ec0889:
1378 case 0x10ec0892:
1379 set_eapd(codec, 0x14, on);
1380 set_eapd(codec, 0x15, on);
1381 break;
1382 }
1383}
1384
1385/* generic shutup callback;
1386 * just turning off EPAD and a little pause for avoiding pop-noise
1387 */
1388static void alc_eapd_shutup(struct hda_codec *codec)
1389{
1390 alc_auto_setup_eapd(codec, false);
1391 msleep(200);
1392}
1393
1239static void alc_auto_init_amp(struct hda_codec *codec, int type) 1394static void alc_auto_init_amp(struct hda_codec *codec, int type)
1240{ 1395{
1241 unsigned int tmp; 1396 unsigned int tmp;
@@ -1251,27 +1406,7 @@ static void alc_auto_init_amp(struct hda_codec *codec, int type)
1251 snd_hda_sequence_write(codec, alc_gpio3_init_verbs); 1406 snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1252 break; 1407 break;
1253 case ALC_INIT_DEFAULT: 1408 case ALC_INIT_DEFAULT:
1254 switch (codec->vendor_id) { 1409 alc_auto_setup_eapd(codec, true);
1255 case 0x10ec0260:
1256 set_eapd(codec, 0x0f, 1);
1257 set_eapd(codec, 0x10, 1);
1258 break;
1259 case 0x10ec0262:
1260 case 0x10ec0267:
1261 case 0x10ec0268:
1262 case 0x10ec0269:
1263 case 0x10ec0270:
1264 case 0x10ec0272:
1265 case 0x10ec0660:
1266 case 0x10ec0662:
1267 case 0x10ec0663:
1268 case 0x10ec0665:
1269 case 0x10ec0862:
1270 case 0x10ec0889:
1271 set_eapd(codec, 0x14, 1);
1272 set_eapd(codec, 0x15, 1);
1273 break;
1274 }
1275 switch (codec->vendor_id) { 1410 switch (codec->vendor_id) {
1276 case 0x10ec0260: 1411 case 0x10ec0260:
1277 snd_hda_codec_write(codec, 0x1a, 0, 1412 snd_hda_codec_write(codec, 0x1a, 0,
@@ -1315,20 +1450,128 @@ static void alc_auto_init_amp(struct hda_codec *codec, int type)
1315 } 1450 }
1316} 1451}
1317 1452
1453static int alc_automute_mode_info(struct snd_kcontrol *kcontrol,
1454 struct snd_ctl_elem_info *uinfo)
1455{
1456 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1457 struct alc_spec *spec = codec->spec;
1458 static const char * const texts2[] = {
1459 "Disabled", "Enabled"
1460 };
1461 static const char * const texts3[] = {
1462 "Disabled", "Speaker Only", "Line-Out+Speaker"
1463 };
1464 const char * const *texts;
1465
1466 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1467 uinfo->count = 1;
1468 if (spec->automute_hp_lo) {
1469 uinfo->value.enumerated.items = 3;
1470 texts = texts3;
1471 } else {
1472 uinfo->value.enumerated.items = 2;
1473 texts = texts2;
1474 }
1475 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
1476 uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
1477 strcpy(uinfo->value.enumerated.name,
1478 texts[uinfo->value.enumerated.item]);
1479 return 0;
1480}
1481
1482static int alc_automute_mode_get(struct snd_kcontrol *kcontrol,
1483 struct snd_ctl_elem_value *ucontrol)
1484{
1485 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1486 struct alc_spec *spec = codec->spec;
1487 unsigned int val;
1488 if (!spec->automute)
1489 val = 0;
1490 else if (!spec->automute_lines)
1491 val = 1;
1492 else
1493 val = 2;
1494 ucontrol->value.enumerated.item[0] = val;
1495 return 0;
1496}
1497
1498static int alc_automute_mode_put(struct snd_kcontrol *kcontrol,
1499 struct snd_ctl_elem_value *ucontrol)
1500{
1501 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1502 struct alc_spec *spec = codec->spec;
1503
1504 switch (ucontrol->value.enumerated.item[0]) {
1505 case 0:
1506 if (!spec->automute)
1507 return 0;
1508 spec->automute = 0;
1509 break;
1510 case 1:
1511 if (spec->automute && !spec->automute_lines)
1512 return 0;
1513 spec->automute = 1;
1514 spec->automute_lines = 0;
1515 break;
1516 case 2:
1517 if (!spec->automute_hp_lo)
1518 return -EINVAL;
1519 if (spec->automute && spec->automute_lines)
1520 return 0;
1521 spec->automute = 1;
1522 spec->automute_lines = 1;
1523 break;
1524 default:
1525 return -EINVAL;
1526 }
1527 update_speakers(codec);
1528 return 1;
1529}
1530
1531static const struct snd_kcontrol_new alc_automute_mode_enum = {
1532 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1533 .name = "Auto-Mute Mode",
1534 .info = alc_automute_mode_info,
1535 .get = alc_automute_mode_get,
1536 .put = alc_automute_mode_put,
1537};
1538
1539static struct snd_kcontrol_new *alc_kcontrol_new(struct alc_spec *spec);
1540
1541static int alc_add_automute_mode_enum(struct hda_codec *codec)
1542{
1543 struct alc_spec *spec = codec->spec;
1544 struct snd_kcontrol_new *knew;
1545
1546 knew = alc_kcontrol_new(spec);
1547 if (!knew)
1548 return -ENOMEM;
1549 *knew = alc_automute_mode_enum;
1550 knew->name = kstrdup("Auto-Mute Mode", GFP_KERNEL);
1551 if (!knew->name)
1552 return -ENOMEM;
1553 return 0;
1554}
1555
1318static void alc_init_auto_hp(struct hda_codec *codec) 1556static void alc_init_auto_hp(struct hda_codec *codec)
1319{ 1557{
1320 struct alc_spec *spec = codec->spec; 1558 struct alc_spec *spec = codec->spec;
1321 struct auto_pin_cfg *cfg = &spec->autocfg; 1559 struct auto_pin_cfg *cfg = &spec->autocfg;
1560 int present = 0;
1322 int i; 1561 int i;
1323 1562
1324 if (!cfg->hp_pins[0]) { 1563 if (cfg->hp_pins[0])
1325 if (cfg->line_out_type != AUTO_PIN_HP_OUT) 1564 present++;
1326 return; 1565 if (cfg->line_out_pins[0])
1327 } 1566 present++;
1567 if (cfg->speaker_pins[0])
1568 present++;
1569 if (present < 2) /* need two different output types */
1570 return;
1571 if (present == 3)
1572 spec->automute_hp_lo = 1; /* both HP and LO automute */
1328 1573
1329 if (!cfg->speaker_pins[0]) { 1574 if (!cfg->speaker_pins[0]) {
1330 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1331 return;
1332 memcpy(cfg->speaker_pins, cfg->line_out_pins, 1575 memcpy(cfg->speaker_pins, cfg->line_out_pins,
1333 sizeof(cfg->speaker_pins)); 1576 sizeof(cfg->speaker_pins));
1334 cfg->speaker_outs = cfg->line_outs; 1577 cfg->speaker_outs = cfg->line_outs;
@@ -1341,28 +1584,49 @@ static void alc_init_auto_hp(struct hda_codec *codec)
1341 } 1584 }
1342 1585
1343 for (i = 0; i < cfg->hp_outs; i++) { 1586 for (i = 0; i < cfg->hp_outs; i++) {
1587 hda_nid_t nid = cfg->hp_pins[i];
1588 if (!is_jack_detectable(codec, nid))
1589 continue;
1344 snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n", 1590 snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1345 cfg->hp_pins[i]); 1591 nid);
1346 snd_hda_codec_write_cache(codec, cfg->hp_pins[i], 0, 1592 snd_hda_codec_write_cache(codec, nid, 0,
1347 AC_VERB_SET_UNSOLICITED_ENABLE, 1593 AC_VERB_SET_UNSOLICITED_ENABLE,
1348 AC_USRSP_EN | ALC880_HP_EVENT); 1594 AC_USRSP_EN | ALC880_HP_EVENT);
1595 spec->automute = 1;
1596 spec->automute_mode = ALC_AUTOMUTE_PIN;
1597 }
1598 if (spec->automute && cfg->line_out_pins[0] &&
1599 cfg->line_out_pins[0] != cfg->hp_pins[0] &&
1600 cfg->line_out_pins[0] != cfg->speaker_pins[0]) {
1601 for (i = 0; i < cfg->line_outs; i++) {
1602 hda_nid_t nid = cfg->line_out_pins[i];
1603 if (!is_jack_detectable(codec, nid))
1604 continue;
1605 snd_printdd("realtek: Enable Line-Out auto-muting "
1606 "on NID 0x%x\n", nid);
1607 snd_hda_codec_write_cache(codec, nid, 0,
1608 AC_VERB_SET_UNSOLICITED_ENABLE,
1609 AC_USRSP_EN | ALC880_FRONT_EVENT);
1610 spec->detect_line = 1;
1611 }
1612 spec->automute_lines = spec->detect_line;
1613 }
1614
1615 if (spec->automute) {
1616 /* create a control for automute mode */
1617 alc_add_automute_mode_enum(codec);
1618 spec->unsol_event = alc_sku_unsol_event;
1349 } 1619 }
1350 spec->unsol_event = alc_sku_unsol_event;
1351} 1620}
1352 1621
1353static void alc_init_auto_mic(struct hda_codec *codec) 1622static void alc_init_auto_mic(struct hda_codec *codec)
1354{ 1623{
1355 struct alc_spec *spec = codec->spec; 1624 struct alc_spec *spec = codec->spec;
1356 struct auto_pin_cfg *cfg = &spec->autocfg; 1625 struct auto_pin_cfg *cfg = &spec->autocfg;
1357 hda_nid_t fixed, ext; 1626 hda_nid_t fixed, ext, dock;
1358 int i; 1627 int i;
1359 1628
1360 /* there must be only two mic inputs exclusively */ 1629 fixed = ext = dock = 0;
1361 for (i = 0; i < cfg->num_inputs; i++)
1362 if (cfg->inputs[i].type >= AUTO_PIN_LINE_IN)
1363 return;
1364
1365 fixed = ext = 0;
1366 for (i = 0; i < cfg->num_inputs; i++) { 1630 for (i = 0; i < cfg->num_inputs; i++) {
1367 hda_nid_t nid = cfg->inputs[i].pin; 1631 hda_nid_t nid = cfg->inputs[i].pin;
1368 unsigned int defcfg; 1632 unsigned int defcfg;
@@ -1371,26 +1635,45 @@ static void alc_init_auto_mic(struct hda_codec *codec)
1371 case INPUT_PIN_ATTR_INT: 1635 case INPUT_PIN_ATTR_INT:
1372 if (fixed) 1636 if (fixed)
1373 return; /* already occupied */ 1637 return; /* already occupied */
1638 if (cfg->inputs[i].type != AUTO_PIN_MIC)
1639 return; /* invalid type */
1374 fixed = nid; 1640 fixed = nid;
1375 break; 1641 break;
1376 case INPUT_PIN_ATTR_UNUSED: 1642 case INPUT_PIN_ATTR_UNUSED:
1377 return; /* invalid entry */ 1643 return; /* invalid entry */
1644 case INPUT_PIN_ATTR_DOCK:
1645 if (dock)
1646 return; /* already occupied */
1647 if (cfg->inputs[i].type > AUTO_PIN_LINE_IN)
1648 return; /* invalid type */
1649 dock = nid;
1650 break;
1378 default: 1651 default:
1379 if (ext) 1652 if (ext)
1380 return; /* already occupied */ 1653 return; /* already occupied */
1654 if (cfg->inputs[i].type != AUTO_PIN_MIC)
1655 return; /* invalid type */
1381 ext = nid; 1656 ext = nid;
1382 break; 1657 break;
1383 } 1658 }
1384 } 1659 }
1660 if (!ext && dock) {
1661 ext = dock;
1662 dock = 0;
1663 }
1385 if (!ext || !fixed) 1664 if (!ext || !fixed)
1386 return; 1665 return;
1387 if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP)) 1666 if (!is_jack_detectable(codec, ext))
1667 return; /* no unsol support */
1668 if (dock && !is_jack_detectable(codec, dock))
1388 return; /* no unsol support */ 1669 return; /* no unsol support */
1389 snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n", 1670 snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x/0x%x\n",
1390 ext, fixed); 1671 ext, fixed, dock);
1391 spec->ext_mic.pin = ext; 1672 spec->ext_mic.pin = ext;
1673 spec->dock_mic.pin = dock;
1392 spec->int_mic.pin = fixed; 1674 spec->int_mic.pin = fixed;
1393 spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */ 1675 spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1676 spec->dock_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1394 spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */ 1677 spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1395 spec->auto_mic = 1; 1678 spec->auto_mic = 1;
1396 snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0, 1679 snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
@@ -1583,9 +1866,6 @@ do_sku:
1583 return 1; 1866 return 1;
1584 spec->autocfg.hp_pins[0] = nid; 1867 spec->autocfg.hp_pins[0] = nid;
1585 } 1868 }
1586
1587 alc_init_auto_hp(codec);
1588 alc_init_auto_mic(codec);
1589 return 1; 1869 return 1;
1590} 1870}
1591 1871
@@ -1598,9 +1878,10 @@ static void alc_ssid_check(struct hda_codec *codec,
1598 snd_printd("realtek: " 1878 snd_printd("realtek: "
1599 "Enable default setup for auto mode as fallback\n"); 1879 "Enable default setup for auto mode as fallback\n");
1600 spec->init_amp = ALC_INIT_DEFAULT; 1880 spec->init_amp = ALC_INIT_DEFAULT;
1601 alc_init_auto_hp(codec);
1602 alc_init_auto_mic(codec);
1603 } 1881 }
1882
1883 alc_init_auto_hp(codec);
1884 alc_init_auto_mic(codec);
1604} 1885}
1605 1886
1606/* 1887/*
@@ -1842,7 +2123,7 @@ static void alc_auto_parse_digital(struct hda_codec *codec)
1842/* 2123/*
1843 * 2ch mode 2124 * 2ch mode
1844 */ 2125 */
1845static struct hda_verb alc888_4ST_ch2_intel_init[] = { 2126static const struct hda_verb alc888_4ST_ch2_intel_init[] = {
1846/* Mic-in jack as mic in */ 2127/* Mic-in jack as mic in */
1847 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 2128 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1848 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 2129 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
@@ -1857,7 +2138,7 @@ static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1857/* 2138/*
1858 * 4ch mode 2139 * 4ch mode
1859 */ 2140 */
1860static struct hda_verb alc888_4ST_ch4_intel_init[] = { 2141static const struct hda_verb alc888_4ST_ch4_intel_init[] = {
1861/* Mic-in jack as mic in */ 2142/* Mic-in jack as mic in */
1862 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 2143 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1863 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 2144 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
@@ -1872,7 +2153,7 @@ static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1872/* 2153/*
1873 * 6ch mode 2154 * 6ch mode
1874 */ 2155 */
1875static struct hda_verb alc888_4ST_ch6_intel_init[] = { 2156static const struct hda_verb alc888_4ST_ch6_intel_init[] = {
1876/* Mic-in jack as CLFE */ 2157/* Mic-in jack as CLFE */
1877 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 2158 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1878 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 2159 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
@@ -1887,7 +2168,7 @@ static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1887/* 2168/*
1888 * 8ch mode 2169 * 8ch mode
1889 */ 2170 */
1890static struct hda_verb alc888_4ST_ch8_intel_init[] = { 2171static const struct hda_verb alc888_4ST_ch8_intel_init[] = {
1891/* Mic-in jack as CLFE */ 2172/* Mic-in jack as CLFE */
1892 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 2173 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1893 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 2174 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
@@ -1899,7 +2180,7 @@ static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1899 { } /* end */ 2180 { } /* end */
1900}; 2181};
1901 2182
1902static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = { 2183static const struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1903 { 2, alc888_4ST_ch2_intel_init }, 2184 { 2, alc888_4ST_ch2_intel_init },
1904 { 4, alc888_4ST_ch4_intel_init }, 2185 { 4, alc888_4ST_ch4_intel_init },
1905 { 6, alc888_4ST_ch6_intel_init }, 2186 { 6, alc888_4ST_ch6_intel_init },
@@ -1910,7 +2191,7 @@ static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1910 * ALC888 Fujitsu Siemens Amillo xa3530 2191 * ALC888 Fujitsu Siemens Amillo xa3530
1911 */ 2192 */
1912 2193
1913static struct hda_verb alc888_fujitsu_xa3530_verbs[] = { 2194static const struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1914/* Front Mic: set to PIN_IN (empty by default) */ 2195/* Front Mic: set to PIN_IN (empty by default) */
1915 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2196 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1916/* Connect Internal HP to Front */ 2197/* Connect Internal HP to Front */
@@ -1943,22 +2224,6 @@ static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1943 {} 2224 {}
1944}; 2225};
1945 2226
1946static void alc_automute_amp(struct hda_codec *codec)
1947{
1948 alc_automute_speaker(codec, 0);
1949}
1950
1951static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1952 unsigned int res)
1953{
1954 if (codec->vendor_id == 0x10ec0880)
1955 res >>= 28;
1956 else
1957 res >>= 26;
1958 if (res == ALC880_HP_EVENT)
1959 alc_automute_amp(codec);
1960}
1961
1962static void alc889_automute_setup(struct hda_codec *codec) 2227static void alc889_automute_setup(struct hda_codec *codec)
1963{ 2228{
1964 struct alc_spec *spec = codec->spec; 2229 struct alc_spec *spec = codec->spec;
@@ -1969,12 +2234,14 @@ static void alc889_automute_setup(struct hda_codec *codec)
1969 spec->autocfg.speaker_pins[2] = 0x17; 2234 spec->autocfg.speaker_pins[2] = 0x17;
1970 spec->autocfg.speaker_pins[3] = 0x19; 2235 spec->autocfg.speaker_pins[3] = 0x19;
1971 spec->autocfg.speaker_pins[4] = 0x1a; 2236 spec->autocfg.speaker_pins[4] = 0x1a;
2237 spec->automute = 1;
2238 spec->automute_mode = ALC_AUTOMUTE_AMP;
1972} 2239}
1973 2240
1974static void alc889_intel_init_hook(struct hda_codec *codec) 2241static void alc889_intel_init_hook(struct hda_codec *codec)
1975{ 2242{
1976 alc889_coef_init(codec); 2243 alc889_coef_init(codec);
1977 alc_automute_amp(codec); 2244 alc_hp_automute(codec);
1978} 2245}
1979 2246
1980static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec) 2247static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
@@ -1985,13 +2252,15 @@ static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
1985 spec->autocfg.hp_pins[1] = 0x1b; /* hp */ 2252 spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1986 spec->autocfg.speaker_pins[0] = 0x14; /* speaker */ 2253 spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1987 spec->autocfg.speaker_pins[1] = 0x15; /* bass */ 2254 spec->autocfg.speaker_pins[1] = 0x15; /* bass */
2255 spec->automute = 1;
2256 spec->automute_mode = ALC_AUTOMUTE_AMP;
1988} 2257}
1989 2258
1990/* 2259/*
1991 * ALC888 Acer Aspire 4930G model 2260 * ALC888 Acer Aspire 4930G model
1992 */ 2261 */
1993 2262
1994static struct hda_verb alc888_acer_aspire_4930g_verbs[] = { 2263static const struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1995/* Front Mic: set to PIN_IN (empty by default) */ 2264/* Front Mic: set to PIN_IN (empty by default) */
1996 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2265 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1997/* Unselect Front Mic by default in input mixer 3 */ 2266/* Unselect Front Mic by default in input mixer 3 */
@@ -2014,7 +2283,7 @@ static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
2014 * ALC888 Acer Aspire 6530G model 2283 * ALC888 Acer Aspire 6530G model
2015 */ 2284 */
2016 2285
2017static struct hda_verb alc888_acer_aspire_6530g_verbs[] = { 2286static const struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
2018/* Route to built-in subwoofer as well as speakers */ 2287/* Route to built-in subwoofer as well as speakers */
2019 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 2288 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2020 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 2289 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
@@ -2044,7 +2313,7 @@ static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
2044 *ALC888 Acer Aspire 7730G model 2313 *ALC888 Acer Aspire 7730G model
2045 */ 2314 */
2046 2315
2047static struct hda_verb alc888_acer_aspire_7730G_verbs[] = { 2316static const struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
2048/* Bias voltage on for external mic port */ 2317/* Bias voltage on for external mic port */
2049 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80}, 2318 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
2050/* Front Mic: set to PIN_IN (empty by default) */ 2319/* Front Mic: set to PIN_IN (empty by default) */
@@ -2074,7 +2343,7 @@ static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
2074 * ALC889 Acer Aspire 8930G model 2343 * ALC889 Acer Aspire 8930G model
2075 */ 2344 */
2076 2345
2077static struct hda_verb alc889_acer_aspire_8930g_verbs[] = { 2346static const struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
2078/* Front Mic: set to PIN_IN (empty by default) */ 2347/* Front Mic: set to PIN_IN (empty by default) */
2079 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2348 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2080/* Unselect Front Mic by default in input mixer 3 */ 2349/* Unselect Front Mic by default in input mixer 3 */
@@ -2120,7 +2389,7 @@ static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
2120 { } 2389 { }
2121}; 2390};
2122 2391
2123static struct hda_input_mux alc888_2_capture_sources[2] = { 2392static const struct hda_input_mux alc888_2_capture_sources[2] = {
2124 /* Front mic only available on one ADC */ 2393 /* Front mic only available on one ADC */
2125 { 2394 {
2126 .num_items = 4, 2395 .num_items = 4,
@@ -2141,7 +2410,7 @@ static struct hda_input_mux alc888_2_capture_sources[2] = {
2141 } 2410 }
2142}; 2411};
2143 2412
2144static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = { 2413static const struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
2145 /* Interal mic only available on one ADC */ 2414 /* Interal mic only available on one ADC */
2146 { 2415 {
2147 .num_items = 5, 2416 .num_items = 5,
@@ -2164,7 +2433,7 @@ static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
2164 } 2433 }
2165}; 2434};
2166 2435
2167static struct hda_input_mux alc889_capture_sources[3] = { 2436static const struct hda_input_mux alc889_capture_sources[3] = {
2168 /* Digital mic only available on first "ADC" */ 2437 /* Digital mic only available on first "ADC" */
2169 { 2438 {
2170 .num_items = 5, 2439 .num_items = 5,
@@ -2196,7 +2465,7 @@ static struct hda_input_mux alc889_capture_sources[3] = {
2196 } 2465 }
2197}; 2466};
2198 2467
2199static struct snd_kcontrol_new alc888_base_mixer[] = { 2468static const struct snd_kcontrol_new alc888_base_mixer[] = {
2200 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2469 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2201 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 2470 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2202 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2471 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -2218,7 +2487,7 @@ static struct snd_kcontrol_new alc888_base_mixer[] = {
2218 { } /* end */ 2487 { } /* end */
2219}; 2488};
2220 2489
2221static struct snd_kcontrol_new alc888_acer_aspire_4930g_mixer[] = { 2490static const struct snd_kcontrol_new alc888_acer_aspire_4930g_mixer[] = {
2222 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2491 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2223 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 2492 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2224 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2493 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -2240,7 +2509,7 @@ static struct snd_kcontrol_new alc888_acer_aspire_4930g_mixer[] = {
2240 { } /* end */ 2509 { } /* end */
2241}; 2510};
2242 2511
2243static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = { 2512static const struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
2244 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2513 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2245 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 2514 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2246 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2515 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -2267,6 +2536,8 @@ static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
2267 spec->autocfg.speaker_pins[0] = 0x14; 2536 spec->autocfg.speaker_pins[0] = 0x14;
2268 spec->autocfg.speaker_pins[1] = 0x16; 2537 spec->autocfg.speaker_pins[1] = 0x16;
2269 spec->autocfg.speaker_pins[2] = 0x17; 2538 spec->autocfg.speaker_pins[2] = 0x17;
2539 spec->automute = 1;
2540 spec->automute_mode = ALC_AUTOMUTE_AMP;
2270} 2541}
2271 2542
2272static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec) 2543static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
@@ -2277,6 +2548,8 @@ static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
2277 spec->autocfg.speaker_pins[0] = 0x14; 2548 spec->autocfg.speaker_pins[0] = 0x14;
2278 spec->autocfg.speaker_pins[1] = 0x16; 2549 spec->autocfg.speaker_pins[1] = 0x16;
2279 spec->autocfg.speaker_pins[2] = 0x17; 2550 spec->autocfg.speaker_pins[2] = 0x17;
2551 spec->automute = 1;
2552 spec->automute_mode = ALC_AUTOMUTE_AMP;
2280} 2553}
2281 2554
2282static void alc888_acer_aspire_7730g_setup(struct hda_codec *codec) 2555static void alc888_acer_aspire_7730g_setup(struct hda_codec *codec)
@@ -2287,6 +2560,8 @@ static void alc888_acer_aspire_7730g_setup(struct hda_codec *codec)
2287 spec->autocfg.speaker_pins[0] = 0x14; 2560 spec->autocfg.speaker_pins[0] = 0x14;
2288 spec->autocfg.speaker_pins[1] = 0x16; 2561 spec->autocfg.speaker_pins[1] = 0x16;
2289 spec->autocfg.speaker_pins[2] = 0x17; 2562 spec->autocfg.speaker_pins[2] = 0x17;
2563 spec->automute = 1;
2564 spec->automute_mode = ALC_AUTOMUTE_AMP;
2290} 2565}
2291 2566
2292static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec) 2567static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
@@ -2297,6 +2572,8 @@ static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
2297 spec->autocfg.speaker_pins[0] = 0x14; 2572 spec->autocfg.speaker_pins[0] = 0x14;
2298 spec->autocfg.speaker_pins[1] = 0x16; 2573 spec->autocfg.speaker_pins[1] = 0x16;
2299 spec->autocfg.speaker_pins[2] = 0x1b; 2574 spec->autocfg.speaker_pins[2] = 0x1b;
2575 spec->automute = 1;
2576 spec->automute_mode = ALC_AUTOMUTE_AMP;
2300} 2577}
2301 2578
2302/* 2579/*
@@ -2307,12 +2584,12 @@ static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
2307 * F-Mic = 0x1b, HP = 0x19 2584 * F-Mic = 0x1b, HP = 0x19
2308 */ 2585 */
2309 2586
2310static hda_nid_t alc880_dac_nids[4] = { 2587static const hda_nid_t alc880_dac_nids[4] = {
2311 /* front, rear, clfe, rear_surr */ 2588 /* front, rear, clfe, rear_surr */
2312 0x02, 0x05, 0x04, 0x03 2589 0x02, 0x05, 0x04, 0x03
2313}; 2590};
2314 2591
2315static hda_nid_t alc880_adc_nids[3] = { 2592static const hda_nid_t alc880_adc_nids[3] = {
2316 /* ADC0-2 */ 2593 /* ADC0-2 */
2317 0x07, 0x08, 0x09, 2594 0x07, 0x08, 0x09,
2318}; 2595};
@@ -2321,7 +2598,7 @@ static hda_nid_t alc880_adc_nids[3] = {
2321 * but it shows zero connection in the real implementation on some devices. 2598 * but it shows zero connection in the real implementation on some devices.
2322 * Note: this is a 915GAV bug, fixed on 915GLV 2599 * Note: this is a 915GAV bug, fixed on 915GLV
2323 */ 2600 */
2324static hda_nid_t alc880_adc_nids_alt[2] = { 2601static const hda_nid_t alc880_adc_nids_alt[2] = {
2325 /* ADC1-2 */ 2602 /* ADC1-2 */
2326 0x08, 0x09, 2603 0x08, 0x09,
2327}; 2604};
@@ -2329,7 +2606,7 @@ static hda_nid_t alc880_adc_nids_alt[2] = {
2329#define ALC880_DIGOUT_NID 0x06 2606#define ALC880_DIGOUT_NID 0x06
2330#define ALC880_DIGIN_NID 0x0a 2607#define ALC880_DIGIN_NID 0x0a
2331 2608
2332static struct hda_input_mux alc880_capture_source = { 2609static const struct hda_input_mux alc880_capture_source = {
2333 .num_items = 4, 2610 .num_items = 4,
2334 .items = { 2611 .items = {
2335 { "Mic", 0x0 }, 2612 { "Mic", 0x0 },
@@ -2341,7 +2618,7 @@ static struct hda_input_mux alc880_capture_source = {
2341 2618
2342/* channel source setting (2/6 channel selection for 3-stack) */ 2619/* channel source setting (2/6 channel selection for 3-stack) */
2343/* 2ch mode */ 2620/* 2ch mode */
2344static struct hda_verb alc880_threestack_ch2_init[] = { 2621static const struct hda_verb alc880_threestack_ch2_init[] = {
2345 /* set line-in to input, mute it */ 2622 /* set line-in to input, mute it */
2346 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 2623 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2347 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 2624 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
@@ -2352,7 +2629,7 @@ static struct hda_verb alc880_threestack_ch2_init[] = {
2352}; 2629};
2353 2630
2354/* 6ch mode */ 2631/* 6ch mode */
2355static struct hda_verb alc880_threestack_ch6_init[] = { 2632static const struct hda_verb alc880_threestack_ch6_init[] = {
2356 /* set line-in to output, unmute it */ 2633 /* set line-in to output, unmute it */
2357 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 2634 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2358 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 2635 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
@@ -2362,12 +2639,12 @@ static struct hda_verb alc880_threestack_ch6_init[] = {
2362 { } /* end */ 2639 { } /* end */
2363}; 2640};
2364 2641
2365static struct hda_channel_mode alc880_threestack_modes[2] = { 2642static const struct hda_channel_mode alc880_threestack_modes[2] = {
2366 { 2, alc880_threestack_ch2_init }, 2643 { 2, alc880_threestack_ch2_init },
2367 { 6, alc880_threestack_ch6_init }, 2644 { 6, alc880_threestack_ch6_init },
2368}; 2645};
2369 2646
2370static struct snd_kcontrol_new alc880_three_stack_mixer[] = { 2647static const struct snd_kcontrol_new alc880_three_stack_mixer[] = {
2371 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2648 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2372 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 2649 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2373 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 2650 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
@@ -2512,14 +2789,14 @@ static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
2512 } 2789 }
2513 2790
2514#define DEFINE_CAPMIX(num) \ 2791#define DEFINE_CAPMIX(num) \
2515static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \ 2792static const struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2516 _DEFINE_CAPMIX(num), \ 2793 _DEFINE_CAPMIX(num), \
2517 _DEFINE_CAPSRC(num), \ 2794 _DEFINE_CAPSRC(num), \
2518 { } /* end */ \ 2795 { } /* end */ \
2519} 2796}
2520 2797
2521#define DEFINE_CAPMIX_NOSRC(num) \ 2798#define DEFINE_CAPMIX_NOSRC(num) \
2522static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \ 2799static const struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2523 _DEFINE_CAPMIX(num), \ 2800 _DEFINE_CAPMIX(num), \
2524 { } /* end */ \ 2801 { } /* end */ \
2525} 2802}
@@ -2542,7 +2819,7 @@ DEFINE_CAPMIX_NOSRC(3);
2542 */ 2819 */
2543 2820
2544/* additional mixers to alc880_three_stack_mixer */ 2821/* additional mixers to alc880_three_stack_mixer */
2545static struct snd_kcontrol_new alc880_five_stack_mixer[] = { 2822static const struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2546 HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2823 HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2547 HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT), 2824 HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
2548 { } /* end */ 2825 { } /* end */
@@ -2550,7 +2827,7 @@ static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2550 2827
2551/* channel source setting (6/8 channel selection for 5-stack) */ 2828/* channel source setting (6/8 channel selection for 5-stack) */
2552/* 6ch mode */ 2829/* 6ch mode */
2553static struct hda_verb alc880_fivestack_ch6_init[] = { 2830static const struct hda_verb alc880_fivestack_ch6_init[] = {
2554 /* set line-in to input, mute it */ 2831 /* set line-in to input, mute it */
2555 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 2832 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2556 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 2833 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
@@ -2558,14 +2835,14 @@ static struct hda_verb alc880_fivestack_ch6_init[] = {
2558}; 2835};
2559 2836
2560/* 8ch mode */ 2837/* 8ch mode */
2561static struct hda_verb alc880_fivestack_ch8_init[] = { 2838static const struct hda_verb alc880_fivestack_ch8_init[] = {
2562 /* set line-in to output, unmute it */ 2839 /* set line-in to output, unmute it */
2563 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 2840 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2564 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 2841 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2565 { } /* end */ 2842 { } /* end */
2566}; 2843};
2567 2844
2568static struct hda_channel_mode alc880_fivestack_modes[2] = { 2845static const struct hda_channel_mode alc880_fivestack_modes[2] = {
2569 { 6, alc880_fivestack_ch6_init }, 2846 { 6, alc880_fivestack_ch6_init },
2570 { 8, alc880_fivestack_ch8_init }, 2847 { 8, alc880_fivestack_ch8_init },
2571}; 2848};
@@ -2580,12 +2857,12 @@ static struct hda_channel_mode alc880_fivestack_modes[2] = {
2580 * Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b 2857 * Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2581 */ 2858 */
2582 2859
2583static hda_nid_t alc880_6st_dac_nids[4] = { 2860static const hda_nid_t alc880_6st_dac_nids[4] = {
2584 /* front, rear, clfe, rear_surr */ 2861 /* front, rear, clfe, rear_surr */
2585 0x02, 0x03, 0x04, 0x05 2862 0x02, 0x03, 0x04, 0x05
2586}; 2863};
2587 2864
2588static struct hda_input_mux alc880_6stack_capture_source = { 2865static const struct hda_input_mux alc880_6stack_capture_source = {
2589 .num_items = 4, 2866 .num_items = 4,
2590 .items = { 2867 .items = {
2591 { "Mic", 0x0 }, 2868 { "Mic", 0x0 },
@@ -2596,11 +2873,11 @@ static struct hda_input_mux alc880_6stack_capture_source = {
2596}; 2873};
2597 2874
2598/* fixed 8-channels */ 2875/* fixed 8-channels */
2599static struct hda_channel_mode alc880_sixstack_modes[1] = { 2876static const struct hda_channel_mode alc880_sixstack_modes[1] = {
2600 { 8, NULL }, 2877 { 8, NULL },
2601}; 2878};
2602 2879
2603static struct snd_kcontrol_new alc880_six_stack_mixer[] = { 2880static const struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2604 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2881 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2605 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 2882 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2606 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2883 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -2655,18 +2932,18 @@ static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2655 * haven't setup any initialization verbs for these yet... 2932 * haven't setup any initialization verbs for these yet...
2656 */ 2933 */
2657 2934
2658static hda_nid_t alc880_w810_dac_nids[3] = { 2935static const hda_nid_t alc880_w810_dac_nids[3] = {
2659 /* front, rear/surround, clfe */ 2936 /* front, rear/surround, clfe */
2660 0x02, 0x03, 0x04 2937 0x02, 0x03, 0x04
2661}; 2938};
2662 2939
2663/* fixed 6 channels */ 2940/* fixed 6 channels */
2664static struct hda_channel_mode alc880_w810_modes[1] = { 2941static const struct hda_channel_mode alc880_w810_modes[1] = {
2665 { 6, NULL } 2942 { 6, NULL }
2666}; 2943};
2667 2944
2668/* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */ 2945/* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
2669static struct snd_kcontrol_new alc880_w810_base_mixer[] = { 2946static const struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2670 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2947 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2671 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 2948 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2672 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2949 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -2688,17 +2965,17 @@ static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2688 * Line = 0x1a 2965 * Line = 0x1a
2689 */ 2966 */
2690 2967
2691static hda_nid_t alc880_z71v_dac_nids[1] = { 2968static const hda_nid_t alc880_z71v_dac_nids[1] = {
2692 0x02 2969 0x02
2693}; 2970};
2694#define ALC880_Z71V_HP_DAC 0x03 2971#define ALC880_Z71V_HP_DAC 0x03
2695 2972
2696/* fixed 2 channels */ 2973/* fixed 2 channels */
2697static struct hda_channel_mode alc880_2_jack_modes[1] = { 2974static const struct hda_channel_mode alc880_2_jack_modes[1] = {
2698 { 2, NULL } 2975 { 2, NULL }
2699}; 2976};
2700 2977
2701static struct snd_kcontrol_new alc880_z71v_mixer[] = { 2978static const struct snd_kcontrol_new alc880_z71v_mixer[] = {
2702 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 2979 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2703 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 2980 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2704 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 2981 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -2718,12 +2995,12 @@ static struct snd_kcontrol_new alc880_z71v_mixer[] = {
2718 * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18 2995 * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2719 */ 2996 */
2720 2997
2721static hda_nid_t alc880_f1734_dac_nids[1] = { 2998static const hda_nid_t alc880_f1734_dac_nids[1] = {
2722 0x03 2999 0x03
2723}; 3000};
2724#define ALC880_F1734_HP_DAC 0x02 3001#define ALC880_F1734_HP_DAC 0x02
2725 3002
2726static struct snd_kcontrol_new alc880_f1734_mixer[] = { 3003static const struct snd_kcontrol_new alc880_f1734_mixer[] = {
2727 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 3004 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2728 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 3005 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2729 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 3006 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -2735,7 +3012,7 @@ static struct snd_kcontrol_new alc880_f1734_mixer[] = {
2735 { } /* end */ 3012 { } /* end */
2736}; 3013};
2737 3014
2738static struct hda_input_mux alc880_f1734_capture_source = { 3015static const struct hda_input_mux alc880_f1734_capture_source = {
2739 .num_items = 2, 3016 .num_items = 2,
2740 .items = { 3017 .items = {
2741 { "Mic", 0x1 }, 3018 { "Mic", 0x1 },
@@ -2755,7 +3032,7 @@ static struct hda_input_mux alc880_f1734_capture_source = {
2755#define alc880_asus_dac_nids alc880_w810_dac_nids /* identical with w810 */ 3032#define alc880_asus_dac_nids alc880_w810_dac_nids /* identical with w810 */
2756#define alc880_asus_modes alc880_threestack_modes /* 2/6 channel mode */ 3033#define alc880_asus_modes alc880_threestack_modes /* 2/6 channel mode */
2757 3034
2758static struct snd_kcontrol_new alc880_asus_mixer[] = { 3035static const struct snd_kcontrol_new alc880_asus_mixer[] = {
2759 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 3036 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2760 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 3037 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2761 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 3038 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -2789,14 +3066,14 @@ static struct snd_kcontrol_new alc880_asus_mixer[] = {
2789 */ 3066 */
2790 3067
2791/* additional mixers to alc880_asus_mixer */ 3068/* additional mixers to alc880_asus_mixer */
2792static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = { 3069static const struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
2793 HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT), 3070 HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2794 HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT), 3071 HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2795 { } /* end */ 3072 { } /* end */
2796}; 3073};
2797 3074
2798/* TCL S700 */ 3075/* TCL S700 */
2799static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = { 3076static const struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2800 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 3077 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2801 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 3078 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2802 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 3079 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
@@ -2810,7 +3087,7 @@ static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2810}; 3087};
2811 3088
2812/* Uniwill */ 3089/* Uniwill */
2813static struct snd_kcontrol_new alc880_uniwill_mixer[] = { 3090static const struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2814 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 3091 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2815 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 3092 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2816 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 3093 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -2837,7 +3114,7 @@ static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2837 { } /* end */ 3114 { } /* end */
2838}; 3115};
2839 3116
2840static struct snd_kcontrol_new alc880_fujitsu_mixer[] = { 3117static const struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2841 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 3118 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2842 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 3119 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2843 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 3120 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -2851,7 +3128,7 @@ static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2851 { } /* end */ 3128 { } /* end */
2852}; 3129};
2853 3130
2854static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = { 3131static const struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2855 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 3132 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2856 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 3133 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2857 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 3134 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -2878,7 +3155,6 @@ static const char * const alc_slave_vols[] = {
2878 "Speaker Playback Volume", 3155 "Speaker Playback Volume",
2879 "Mono Playback Volume", 3156 "Mono Playback Volume",
2880 "Line-Out Playback Volume", 3157 "Line-Out Playback Volume",
2881 "PCM Playback Volume",
2882 NULL, 3158 NULL,
2883}; 3159};
2884 3160
@@ -2893,7 +3169,6 @@ static const char * const alc_slave_sws[] = {
2893 "Mono Playback Switch", 3169 "Mono Playback Switch",
2894 "IEC958 Playback Switch", 3170 "IEC958 Playback Switch",
2895 "Line-Out Playback Switch", 3171 "Line-Out Playback Switch",
2896 "PCM Playback Switch",
2897 NULL, 3172 NULL,
2898}; 3173};
2899 3174
@@ -2914,7 +3189,7 @@ static void alc_free_kctls(struct hda_codec *codec);
2914 3189
2915#ifdef CONFIG_SND_HDA_INPUT_BEEP 3190#ifdef CONFIG_SND_HDA_INPUT_BEEP
2916/* additional beep mixers; the actual parameters are overwritten at build */ 3191/* additional beep mixers; the actual parameters are overwritten at build */
2917static struct snd_kcontrol_new alc_beep_mixer[] = { 3192static const struct snd_kcontrol_new alc_beep_mixer[] = {
2918 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT), 3193 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
2919 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT), 3194 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
2920 { } /* end */ 3195 { } /* end */
@@ -2925,7 +3200,7 @@ static int alc_build_controls(struct hda_codec *codec)
2925{ 3200{
2926 struct alc_spec *spec = codec->spec; 3201 struct alc_spec *spec = codec->spec;
2927 struct snd_kcontrol *kctl = NULL; 3202 struct snd_kcontrol *kctl = NULL;
2928 struct snd_kcontrol_new *knew; 3203 const struct snd_kcontrol_new *knew;
2929 int i, j, err; 3204 int i, j, err;
2930 unsigned int u; 3205 unsigned int u;
2931 hda_nid_t nid; 3206 hda_nid_t nid;
@@ -2962,7 +3237,7 @@ static int alc_build_controls(struct hda_codec *codec)
2962#ifdef CONFIG_SND_HDA_INPUT_BEEP 3237#ifdef CONFIG_SND_HDA_INPUT_BEEP
2963 /* create beep controls if needed */ 3238 /* create beep controls if needed */
2964 if (spec->beep_amp) { 3239 if (spec->beep_amp) {
2965 struct snd_kcontrol_new *knew; 3240 const struct snd_kcontrol_new *knew;
2966 for (knew = alc_beep_mixer; knew->name; knew++) { 3241 for (knew = alc_beep_mixer; knew->name; knew++) {
2967 struct snd_kcontrol *kctl; 3242 struct snd_kcontrol *kctl;
2968 kctl = snd_ctl_new1(knew, codec); 3243 kctl = snd_ctl_new1(knew, codec);
@@ -3001,7 +3276,7 @@ static int alc_build_controls(struct hda_codec *codec)
3001 if (!kctl) 3276 if (!kctl)
3002 kctl = snd_hda_find_mixer_ctl(codec, "Input Source"); 3277 kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
3003 for (i = 0; kctl && i < kctl->count; i++) { 3278 for (i = 0; kctl && i < kctl->count; i++) {
3004 hda_nid_t *nids = spec->capsrc_nids; 3279 const hda_nid_t *nids = spec->capsrc_nids;
3005 if (!nids) 3280 if (!nids)
3006 nids = spec->adc_nids; 3281 nids = spec->adc_nids;
3007 err = snd_hda_add_nid(codec, kctl, i, nids[i]); 3282 err = snd_hda_add_nid(codec, kctl, i, nids[i]);
@@ -3079,7 +3354,7 @@ static int alc_build_controls(struct hda_codec *codec)
3079/* 3354/*
3080 * generic initialization of ADC, input mixers and output mixers 3355 * generic initialization of ADC, input mixers and output mixers
3081 */ 3356 */
3082static struct hda_verb alc880_volume_init_verbs[] = { 3357static const struct hda_verb alc880_volume_init_verbs[] = {
3083 /* 3358 /*
3084 * Unmute ADC0-2 and set the default input to mic-in 3359 * Unmute ADC0-2 and set the default input to mic-in
3085 */ 3360 */
@@ -3130,7 +3405,7 @@ static struct hda_verb alc880_volume_init_verbs[] = {
3130 * 3-stack pin configuration: 3405 * 3-stack pin configuration:
3131 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b 3406 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
3132 */ 3407 */
3133static struct hda_verb alc880_pin_3stack_init_verbs[] = { 3408static const struct hda_verb alc880_pin_3stack_init_verbs[] = {
3134 /* 3409 /*
3135 * preset connection lists of input pins 3410 * preset connection lists of input pins
3136 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround 3411 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
@@ -3168,7 +3443,7 @@ static struct hda_verb alc880_pin_3stack_init_verbs[] = {
3168 * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19, 3443 * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
3169 * line-in/side = 0x1a, f-mic = 0x1b 3444 * line-in/side = 0x1a, f-mic = 0x1b
3170 */ 3445 */
3171static struct hda_verb alc880_pin_5stack_init_verbs[] = { 3446static const struct hda_verb alc880_pin_5stack_init_verbs[] = {
3172 /* 3447 /*
3173 * preset connection lists of input pins 3448 * preset connection lists of input pins
3174 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround 3449 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
@@ -3212,7 +3487,7 @@ static struct hda_verb alc880_pin_5stack_init_verbs[] = {
3212 * W810 pin configuration: 3487 * W810 pin configuration:
3213 * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b 3488 * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
3214 */ 3489 */
3215static struct hda_verb alc880_pin_w810_init_verbs[] = { 3490static const struct hda_verb alc880_pin_w810_init_verbs[] = {
3216 /* hphone/speaker input selector: front DAC */ 3491 /* hphone/speaker input selector: front DAC */
3217 {0x13, AC_VERB_SET_CONNECT_SEL, 0x0}, 3492 {0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
3218 3493
@@ -3233,7 +3508,7 @@ static struct hda_verb alc880_pin_w810_init_verbs[] = {
3233 * Z71V pin configuration: 3508 * Z71V pin configuration:
3234 * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?) 3509 * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
3235 */ 3510 */
3236static struct hda_verb alc880_pin_z71v_init_verbs[] = { 3511static const struct hda_verb alc880_pin_z71v_init_verbs[] = {
3237 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 3512 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3238 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3513 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3239 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 3514 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
@@ -3252,7 +3527,7 @@ static struct hda_verb alc880_pin_z71v_init_verbs[] = {
3252 * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18, 3527 * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
3253 * f-mic = 0x19, line = 0x1a, HP = 0x1b 3528 * f-mic = 0x19, line = 0x1a, HP = 0x1b
3254 */ 3529 */
3255static struct hda_verb alc880_pin_6stack_init_verbs[] = { 3530static const struct hda_verb alc880_pin_6stack_init_verbs[] = {
3256 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 3531 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3257 3532
3258 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 3533 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
@@ -3282,7 +3557,7 @@ static struct hda_verb alc880_pin_6stack_init_verbs[] = {
3282 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19, 3557 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
3283 * line = 0x1a 3558 * line = 0x1a
3284 */ 3559 */
3285static struct hda_verb alc880_uniwill_init_verbs[] = { 3560static const struct hda_verb alc880_uniwill_init_verbs[] = {
3286 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 3561 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3287 3562
3288 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 3563 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
@@ -3320,7 +3595,7 @@ static struct hda_verb alc880_uniwill_init_verbs[] = {
3320* Uniwill P53 3595* Uniwill P53
3321* HP = 0x14, InternalSpeaker = 0x15, mic = 0x19, 3596* HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
3322 */ 3597 */
3323static struct hda_verb alc880_uniwill_p53_init_verbs[] = { 3598static const struct hda_verb alc880_uniwill_p53_init_verbs[] = {
3324 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 3599 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3325 3600
3326 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 3601 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
@@ -3349,7 +3624,7 @@ static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
3349 { } 3624 { }
3350}; 3625};
3351 3626
3352static struct hda_verb alc880_beep_init_verbs[] = { 3627static const struct hda_verb alc880_beep_init_verbs[] = {
3353 { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) }, 3628 { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
3354 { } 3629 { }
3355}; 3630};
@@ -3372,11 +3647,13 @@ static void alc880_uniwill_setup(struct hda_codec *codec)
3372 spec->autocfg.hp_pins[0] = 0x14; 3647 spec->autocfg.hp_pins[0] = 0x14;
3373 spec->autocfg.speaker_pins[0] = 0x15; 3648 spec->autocfg.speaker_pins[0] = 0x15;
3374 spec->autocfg.speaker_pins[0] = 0x16; 3649 spec->autocfg.speaker_pins[0] = 0x16;
3650 spec->automute = 1;
3651 spec->automute_mode = ALC_AUTOMUTE_AMP;
3375} 3652}
3376 3653
3377static void alc880_uniwill_init_hook(struct hda_codec *codec) 3654static void alc880_uniwill_init_hook(struct hda_codec *codec)
3378{ 3655{
3379 alc_automute_amp(codec); 3656 alc_hp_automute(codec);
3380 alc88x_simple_mic_automute(codec); 3657 alc88x_simple_mic_automute(codec);
3381} 3658}
3382 3659
@@ -3391,7 +3668,7 @@ static void alc880_uniwill_unsol_event(struct hda_codec *codec,
3391 alc88x_simple_mic_automute(codec); 3668 alc88x_simple_mic_automute(codec);
3392 break; 3669 break;
3393 default: 3670 default:
3394 alc_automute_amp_unsol_event(codec, res); 3671 alc_sku_unsol_event(codec, res);
3395 break; 3672 break;
3396 } 3673 }
3397} 3674}
@@ -3402,6 +3679,8 @@ static void alc880_uniwill_p53_setup(struct hda_codec *codec)
3402 3679
3403 spec->autocfg.hp_pins[0] = 0x14; 3680 spec->autocfg.hp_pins[0] = 0x14;
3404 spec->autocfg.speaker_pins[0] = 0x15; 3681 spec->autocfg.speaker_pins[0] = 0x15;
3682 spec->automute = 1;
3683 spec->automute_mode = ALC_AUTOMUTE_AMP;
3405} 3684}
3406 3685
3407static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec) 3686static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
@@ -3426,14 +3705,14 @@ static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
3426 if ((res >> 28) == ALC880_DCVOL_EVENT) 3705 if ((res >> 28) == ALC880_DCVOL_EVENT)
3427 alc880_uniwill_p53_dcvol_automute(codec); 3706 alc880_uniwill_p53_dcvol_automute(codec);
3428 else 3707 else
3429 alc_automute_amp_unsol_event(codec, res); 3708 alc_sku_unsol_event(codec, res);
3430} 3709}
3431 3710
3432/* 3711/*
3433 * F1734 pin configuration: 3712 * F1734 pin configuration:
3434 * HP = 0x14, speaker-out = 0x15, mic = 0x18 3713 * HP = 0x14, speaker-out = 0x15, mic = 0x18
3435 */ 3714 */
3436static struct hda_verb alc880_pin_f1734_init_verbs[] = { 3715static const struct hda_verb alc880_pin_f1734_init_verbs[] = {
3437 {0x07, AC_VERB_SET_CONNECT_SEL, 0x01}, 3716 {0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
3438 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, 3717 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3439 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, 3718 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
@@ -3465,7 +3744,7 @@ static struct hda_verb alc880_pin_f1734_init_verbs[] = {
3465 * ASUS pin configuration: 3744 * ASUS pin configuration:
3466 * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a 3745 * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
3467 */ 3746 */
3468static struct hda_verb alc880_pin_asus_init_verbs[] = { 3747static const struct hda_verb alc880_pin_asus_init_verbs[] = {
3469 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, 3748 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3470 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, 3749 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3471 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, 3750 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
@@ -3499,7 +3778,7 @@ static struct hda_verb alc880_pin_asus_init_verbs[] = {
3499#define alc880_gpio3_init_verbs alc_gpio3_init_verbs 3778#define alc880_gpio3_init_verbs alc_gpio3_init_verbs
3500 3779
3501/* Clevo m520g init */ 3780/* Clevo m520g init */
3502static struct hda_verb alc880_pin_clevo_init_verbs[] = { 3781static const struct hda_verb alc880_pin_clevo_init_verbs[] = {
3503 /* headphone output */ 3782 /* headphone output */
3504 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01}, 3783 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3505 /* line-out */ 3784 /* line-out */
@@ -3527,7 +3806,7 @@ static struct hda_verb alc880_pin_clevo_init_verbs[] = {
3527 { } 3806 { }
3528}; 3807};
3529 3808
3530static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = { 3809static const struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
3531 /* change to EAPD mode */ 3810 /* change to EAPD mode */
3532 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 3811 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3533 {0x20, AC_VERB_SET_PROC_COEF, 0x3060}, 3812 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
@@ -3565,12 +3844,12 @@ static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
3565 */ 3844 */
3566 3845
3567/* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */ 3846/* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
3568static hda_nid_t alc880_lg_dac_nids[3] = { 3847static const hda_nid_t alc880_lg_dac_nids[3] = {
3569 0x05, 0x02, 0x03 3848 0x05, 0x02, 0x03
3570}; 3849};
3571 3850
3572/* seems analog CD is not working */ 3851/* seems analog CD is not working */
3573static struct hda_input_mux alc880_lg_capture_source = { 3852static const struct hda_input_mux alc880_lg_capture_source = {
3574 .num_items = 3, 3853 .num_items = 3,
3575 .items = { 3854 .items = {
3576 { "Mic", 0x1 }, 3855 { "Mic", 0x1 },
@@ -3580,34 +3859,34 @@ static struct hda_input_mux alc880_lg_capture_source = {
3580}; 3859};
3581 3860
3582/* 2,4,6 channel modes */ 3861/* 2,4,6 channel modes */
3583static struct hda_verb alc880_lg_ch2_init[] = { 3862static const struct hda_verb alc880_lg_ch2_init[] = {
3584 /* set line-in and mic-in to input */ 3863 /* set line-in and mic-in to input */
3585 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 3864 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3586 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 3865 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3587 { } 3866 { }
3588}; 3867};
3589 3868
3590static struct hda_verb alc880_lg_ch4_init[] = { 3869static const struct hda_verb alc880_lg_ch4_init[] = {
3591 /* set line-in to out and mic-in to input */ 3870 /* set line-in to out and mic-in to input */
3592 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, 3871 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3593 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 3872 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3594 { } 3873 { }
3595}; 3874};
3596 3875
3597static struct hda_verb alc880_lg_ch6_init[] = { 3876static const struct hda_verb alc880_lg_ch6_init[] = {
3598 /* set line-in and mic-in to output */ 3877 /* set line-in and mic-in to output */
3599 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, 3878 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3600 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, 3879 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3601 { } 3880 { }
3602}; 3881};
3603 3882
3604static struct hda_channel_mode alc880_lg_ch_modes[3] = { 3883static const struct hda_channel_mode alc880_lg_ch_modes[3] = {
3605 { 2, alc880_lg_ch2_init }, 3884 { 2, alc880_lg_ch2_init },
3606 { 4, alc880_lg_ch4_init }, 3885 { 4, alc880_lg_ch4_init },
3607 { 6, alc880_lg_ch6_init }, 3886 { 6, alc880_lg_ch6_init },
3608}; 3887};
3609 3888
3610static struct snd_kcontrol_new alc880_lg_mixer[] = { 3889static const struct snd_kcontrol_new alc880_lg_mixer[] = {
3611 HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 3890 HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3612 HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT), 3891 HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
3613 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 3892 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
@@ -3632,7 +3911,7 @@ static struct snd_kcontrol_new alc880_lg_mixer[] = {
3632 { } /* end */ 3911 { } /* end */
3633}; 3912};
3634 3913
3635static struct hda_verb alc880_lg_init_verbs[] = { 3914static const struct hda_verb alc880_lg_init_verbs[] = {
3636 /* set capture source to mic-in */ 3915 /* set capture source to mic-in */
3637 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3916 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3638 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3917 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
@@ -3670,6 +3949,8 @@ static void alc880_lg_setup(struct hda_codec *codec)
3670 3949
3671 spec->autocfg.hp_pins[0] = 0x1b; 3950 spec->autocfg.hp_pins[0] = 0x1b;
3672 spec->autocfg.speaker_pins[0] = 0x17; 3951 spec->autocfg.speaker_pins[0] = 0x17;
3952 spec->automute = 1;
3953 spec->automute_mode = ALC_AUTOMUTE_AMP;
3673} 3954}
3674 3955
3675/* 3956/*
@@ -3684,7 +3965,7 @@ static void alc880_lg_setup(struct hda_codec *codec)
3684 * SPDIF-Out: 0x1e 3965 * SPDIF-Out: 0x1e
3685 */ 3966 */
3686 3967
3687static struct hda_input_mux alc880_lg_lw_capture_source = { 3968static const struct hda_input_mux alc880_lg_lw_capture_source = {
3688 .num_items = 3, 3969 .num_items = 3,
3689 .items = { 3970 .items = {
3690 { "Mic", 0x0 }, 3971 { "Mic", 0x0 },
@@ -3695,7 +3976,7 @@ static struct hda_input_mux alc880_lg_lw_capture_source = {
3695 3976
3696#define alc880_lg_lw_modes alc880_threestack_modes 3977#define alc880_lg_lw_modes alc880_threestack_modes
3697 3978
3698static struct snd_kcontrol_new alc880_lg_lw_mixer[] = { 3979static const struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3699 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 3980 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3700 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 3981 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3701 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 3982 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
@@ -3720,7 +4001,7 @@ static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3720 { } /* end */ 4001 { } /* end */
3721}; 4002};
3722 4003
3723static struct hda_verb alc880_lg_lw_init_verbs[] = { 4004static const struct hda_verb alc880_lg_lw_init_verbs[] = {
3724 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 4005 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3725 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */ 4006 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3726 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */ 4007 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
@@ -3754,9 +4035,11 @@ static void alc880_lg_lw_setup(struct hda_codec *codec)
3754 4035
3755 spec->autocfg.hp_pins[0] = 0x1b; 4036 spec->autocfg.hp_pins[0] = 0x1b;
3756 spec->autocfg.speaker_pins[0] = 0x14; 4037 spec->autocfg.speaker_pins[0] = 0x14;
4038 spec->automute = 1;
4039 spec->automute_mode = ALC_AUTOMUTE_AMP;
3757} 4040}
3758 4041
3759static struct snd_kcontrol_new alc880_medion_rim_mixer[] = { 4042static const struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3760 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 4043 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3761 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT), 4044 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3762 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 4045 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
@@ -3766,7 +4049,7 @@ static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3766 { } /* end */ 4049 { } /* end */
3767}; 4050};
3768 4051
3769static struct hda_input_mux alc880_medion_rim_capture_source = { 4052static const struct hda_input_mux alc880_medion_rim_capture_source = {
3770 .num_items = 2, 4053 .num_items = 2,
3771 .items = { 4054 .items = {
3772 { "Mic", 0x0 }, 4055 { "Mic", 0x0 },
@@ -3774,7 +4057,7 @@ static struct hda_input_mux alc880_medion_rim_capture_source = {
3774 }, 4057 },
3775}; 4058};
3776 4059
3777static struct hda_verb alc880_medion_rim_init_verbs[] = { 4060static const struct hda_verb alc880_medion_rim_init_verbs[] = {
3778 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ 4061 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3779 4062
3780 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 4063 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
@@ -3801,7 +4084,7 @@ static struct hda_verb alc880_medion_rim_init_verbs[] = {
3801static void alc880_medion_rim_automute(struct hda_codec *codec) 4084static void alc880_medion_rim_automute(struct hda_codec *codec)
3802{ 4085{
3803 struct alc_spec *spec = codec->spec; 4086 struct alc_spec *spec = codec->spec;
3804 alc_automute_amp(codec); 4087 alc_hp_automute(codec);
3805 /* toggle EAPD */ 4088 /* toggle EAPD */
3806 if (spec->jack_present) 4089 if (spec->jack_present)
3807 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0); 4090 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
@@ -3825,10 +4108,12 @@ static void alc880_medion_rim_setup(struct hda_codec *codec)
3825 4108
3826 spec->autocfg.hp_pins[0] = 0x14; 4109 spec->autocfg.hp_pins[0] = 0x14;
3827 spec->autocfg.speaker_pins[0] = 0x1b; 4110 spec->autocfg.speaker_pins[0] = 0x1b;
4111 spec->automute = 1;
4112 spec->automute_mode = ALC_AUTOMUTE_AMP;
3828} 4113}
3829 4114
3830#ifdef CONFIG_SND_HDA_POWER_SAVE 4115#ifdef CONFIG_SND_HDA_POWER_SAVE
3831static struct hda_amp_list alc880_loopbacks[] = { 4116static const struct hda_amp_list alc880_loopbacks[] = {
3832 { 0x0b, HDA_INPUT, 0 }, 4117 { 0x0b, HDA_INPUT, 0 },
3833 { 0x0b, HDA_INPUT, 1 }, 4118 { 0x0b, HDA_INPUT, 1 },
3834 { 0x0b, HDA_INPUT, 2 }, 4119 { 0x0b, HDA_INPUT, 2 },
@@ -3837,7 +4122,7 @@ static struct hda_amp_list alc880_loopbacks[] = {
3837 { } /* end */ 4122 { } /* end */
3838}; 4123};
3839 4124
3840static struct hda_amp_list alc880_lg_loopbacks[] = { 4125static const struct hda_amp_list alc880_lg_loopbacks[] = {
3841 { 0x0b, HDA_INPUT, 1 }, 4126 { 0x0b, HDA_INPUT, 1 },
3842 { 0x0b, HDA_INPUT, 6 }, 4127 { 0x0b, HDA_INPUT, 6 },
3843 { 0x0b, HDA_INPUT, 7 }, 4128 { 0x0b, HDA_INPUT, 7 },
@@ -4009,7 +4294,7 @@ static int dualmic_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
4009 return 0; 4294 return 0;
4010} 4295}
4011 4296
4012static struct hda_pcm_stream dualmic_pcm_analog_capture = { 4297static const struct hda_pcm_stream dualmic_pcm_analog_capture = {
4013 .substreams = 1, 4298 .substreams = 1,
4014 .channels_min = 2, 4299 .channels_min = 2,
4015 .channels_max = 2, 4300 .channels_max = 2,
@@ -4022,7 +4307,7 @@ static struct hda_pcm_stream dualmic_pcm_analog_capture = {
4022 4307
4023/* 4308/*
4024 */ 4309 */
4025static struct hda_pcm_stream alc880_pcm_analog_playback = { 4310static const struct hda_pcm_stream alc880_pcm_analog_playback = {
4026 .substreams = 1, 4311 .substreams = 1,
4027 .channels_min = 2, 4312 .channels_min = 2,
4028 .channels_max = 8, 4313 .channels_max = 8,
@@ -4034,21 +4319,21 @@ static struct hda_pcm_stream alc880_pcm_analog_playback = {
4034 }, 4319 },
4035}; 4320};
4036 4321
4037static struct hda_pcm_stream alc880_pcm_analog_capture = { 4322static const struct hda_pcm_stream alc880_pcm_analog_capture = {
4038 .substreams = 1, 4323 .substreams = 1,
4039 .channels_min = 2, 4324 .channels_min = 2,
4040 .channels_max = 2, 4325 .channels_max = 2,
4041 /* NID is set in alc_build_pcms */ 4326 /* NID is set in alc_build_pcms */
4042}; 4327};
4043 4328
4044static struct hda_pcm_stream alc880_pcm_analog_alt_playback = { 4329static const struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
4045 .substreams = 1, 4330 .substreams = 1,
4046 .channels_min = 2, 4331 .channels_min = 2,
4047 .channels_max = 2, 4332 .channels_max = 2,
4048 /* NID is set in alc_build_pcms */ 4333 /* NID is set in alc_build_pcms */
4049}; 4334};
4050 4335
4051static struct hda_pcm_stream alc880_pcm_analog_alt_capture = { 4336static const struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
4052 .substreams = 2, /* can be overridden */ 4337 .substreams = 2, /* can be overridden */
4053 .channels_min = 2, 4338 .channels_min = 2,
4054 .channels_max = 2, 4339 .channels_max = 2,
@@ -4059,7 +4344,7 @@ static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
4059 }, 4344 },
4060}; 4345};
4061 4346
4062static struct hda_pcm_stream alc880_pcm_digital_playback = { 4347static const struct hda_pcm_stream alc880_pcm_digital_playback = {
4063 .substreams = 1, 4348 .substreams = 1,
4064 .channels_min = 2, 4349 .channels_min = 2,
4065 .channels_max = 2, 4350 .channels_max = 2,
@@ -4072,7 +4357,7 @@ static struct hda_pcm_stream alc880_pcm_digital_playback = {
4072 }, 4357 },
4073}; 4358};
4074 4359
4075static struct hda_pcm_stream alc880_pcm_digital_capture = { 4360static const struct hda_pcm_stream alc880_pcm_digital_capture = {
4076 .substreams = 1, 4361 .substreams = 1,
4077 .channels_min = 2, 4362 .channels_min = 2,
4078 .channels_max = 2, 4363 .channels_max = 2,
@@ -4080,7 +4365,7 @@ static struct hda_pcm_stream alc880_pcm_digital_capture = {
4080}; 4365};
4081 4366
4082/* Used by alc_build_pcms to flag that a PCM has no playback stream */ 4367/* Used by alc_build_pcms to flag that a PCM has no playback stream */
4083static struct hda_pcm_stream alc_pcm_null_stream = { 4368static const struct hda_pcm_stream alc_pcm_null_stream = {
4084 .substreams = 0, 4369 .substreams = 0,
4085 .channels_min = 0, 4370 .channels_min = 0,
4086 .channels_max = 0, 4371 .channels_max = 0,
@@ -4174,7 +4459,7 @@ static int alc_build_pcms(struct hda_codec *codec)
4174 alc_pcm_null_stream; 4459 alc_pcm_null_stream;
4175 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0; 4460 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
4176 } 4461 }
4177 if (spec->num_adc_nids > 1) { 4462 if (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture) {
4178 info->stream[SNDRV_PCM_STREAM_CAPTURE] = 4463 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
4179 *spec->stream_analog_alt_capture; 4464 *spec->stream_analog_alt_capture;
4180 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 4465 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
@@ -4193,6 +4478,10 @@ static int alc_build_pcms(struct hda_codec *codec)
4193 4478
4194static inline void alc_shutup(struct hda_codec *codec) 4479static inline void alc_shutup(struct hda_codec *codec)
4195{ 4480{
4481 struct alc_spec *spec = codec->spec;
4482
4483 if (spec && spec->shutup)
4484 spec->shutup(codec);
4196 snd_hda_shutup_pins(codec); 4485 snd_hda_shutup_pins(codec);
4197} 4486}
4198 4487
@@ -4226,28 +4515,7 @@ static void alc_free(struct hda_codec *codec)
4226#ifdef CONFIG_SND_HDA_POWER_SAVE 4515#ifdef CONFIG_SND_HDA_POWER_SAVE
4227static void alc_power_eapd(struct hda_codec *codec) 4516static void alc_power_eapd(struct hda_codec *codec)
4228{ 4517{
4229 /* We currently only handle front, HP */ 4518 alc_auto_setup_eapd(codec, false);
4230 switch (codec->vendor_id) {
4231 case 0x10ec0260:
4232 set_eapd(codec, 0x0f, 0);
4233 set_eapd(codec, 0x10, 0);
4234 break;
4235 case 0x10ec0262:
4236 case 0x10ec0267:
4237 case 0x10ec0268:
4238 case 0x10ec0269:
4239 case 0x10ec0270:
4240 case 0x10ec0272:
4241 case 0x10ec0660:
4242 case 0x10ec0662:
4243 case 0x10ec0663:
4244 case 0x10ec0665:
4245 case 0x10ec0862:
4246 case 0x10ec0889:
4247 set_eapd(codec, 0x14, 0);
4248 set_eapd(codec, 0x15, 0);
4249 break;
4250 }
4251} 4519}
4252 4520
4253static int alc_suspend(struct hda_codec *codec, pm_message_t state) 4521static int alc_suspend(struct hda_codec *codec, pm_message_t state)
@@ -4263,6 +4531,7 @@ static int alc_suspend(struct hda_codec *codec, pm_message_t state)
4263#ifdef SND_HDA_NEEDS_RESUME 4531#ifdef SND_HDA_NEEDS_RESUME
4264static int alc_resume(struct hda_codec *codec) 4532static int alc_resume(struct hda_codec *codec)
4265{ 4533{
4534 msleep(150); /* to avoid pop noise */
4266 codec->patch_ops.init(codec); 4535 codec->patch_ops.init(codec);
4267 snd_hda_codec_resume_amp(codec); 4536 snd_hda_codec_resume_amp(codec);
4268 snd_hda_codec_resume_cache(codec); 4537 snd_hda_codec_resume_cache(codec);
@@ -4273,7 +4542,7 @@ static int alc_resume(struct hda_codec *codec)
4273 4542
4274/* 4543/*
4275 */ 4544 */
4276static struct hda_codec_ops alc_patch_ops = { 4545static const struct hda_codec_ops alc_patch_ops = {
4277 .build_controls = alc_build_controls, 4546 .build_controls = alc_build_controls,
4278 .build_pcms = alc_build_pcms, 4547 .build_pcms = alc_build_pcms,
4279 .init = alc_init, 4548 .init = alc_init,
@@ -4308,11 +4577,11 @@ static int alc_codec_rename(struct hda_codec *codec, const char *name)
4308 * enum controls. 4577 * enum controls.
4309 */ 4578 */
4310#ifdef CONFIG_SND_DEBUG 4579#ifdef CONFIG_SND_DEBUG
4311static hda_nid_t alc880_test_dac_nids[4] = { 4580static const hda_nid_t alc880_test_dac_nids[4] = {
4312 0x02, 0x03, 0x04, 0x05 4581 0x02, 0x03, 0x04, 0x05
4313}; 4582};
4314 4583
4315static struct hda_input_mux alc880_test_capture_source = { 4584static const struct hda_input_mux alc880_test_capture_source = {
4316 .num_items = 7, 4585 .num_items = 7,
4317 .items = { 4586 .items = {
4318 { "In-1", 0x0 }, 4587 { "In-1", 0x0 },
@@ -4325,7 +4594,7 @@ static struct hda_input_mux alc880_test_capture_source = {
4325 }, 4594 },
4326}; 4595};
4327 4596
4328static struct hda_channel_mode alc880_test_modes[4] = { 4597static const struct hda_channel_mode alc880_test_modes[4] = {
4329 { 2, NULL }, 4598 { 2, NULL },
4330 { 4, NULL }, 4599 { 4, NULL },
4331 { 6, NULL }, 4600 { 6, NULL },
@@ -4335,7 +4604,7 @@ static struct hda_channel_mode alc880_test_modes[4] = {
4335static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol, 4604static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
4336 struct snd_ctl_elem_info *uinfo) 4605 struct snd_ctl_elem_info *uinfo)
4337{ 4606{
4338 static char *texts[] = { 4607 static const char * const texts[] = {
4339 "N/A", "Line Out", "HP Out", 4608 "N/A", "Line Out", "HP Out",
4340 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%" 4609 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
4341 }; 4610 };
@@ -4380,7 +4649,7 @@ static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
4380{ 4649{
4381 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 4650 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4382 hda_nid_t nid = (hda_nid_t)kcontrol->private_value; 4651 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4383 static unsigned int ctls[] = { 4652 static const unsigned int ctls[] = {
4384 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN, 4653 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
4385 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ, 4654 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
4386 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50, 4655 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
@@ -4410,7 +4679,7 @@ static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
4410static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol, 4679static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
4411 struct snd_ctl_elem_info *uinfo) 4680 struct snd_ctl_elem_info *uinfo)
4412{ 4681{
4413 static char *texts[] = { 4682 static const char * const texts[] = {
4414 "Front", "Surround", "CLFE", "Side" 4683 "Front", "Surround", "CLFE", "Side"
4415 }; 4684 };
4416 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 4685 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
@@ -4471,7 +4740,7 @@ static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
4471 .private_value = nid \ 4740 .private_value = nid \
4472 } 4741 }
4473 4742
4474static struct snd_kcontrol_new alc880_test_mixer[] = { 4743static const struct snd_kcontrol_new alc880_test_mixer[] = {
4475 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 4744 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
4476 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 4745 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
4477 HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT), 4746 HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
@@ -4512,7 +4781,7 @@ static struct snd_kcontrol_new alc880_test_mixer[] = {
4512 { } /* end */ 4781 { } /* end */
4513}; 4782};
4514 4783
4515static struct hda_verb alc880_test_init_verbs[] = { 4784static const struct hda_verb alc880_test_init_verbs[] = {
4516 /* Unmute inputs of 0x0c - 0x0f */ 4785 /* Unmute inputs of 0x0c - 0x0f */
4517 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4786 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4518 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 4787 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
@@ -4596,7 +4865,7 @@ static const char * const alc880_models[ALC880_MODEL_LAST] = {
4596 [ALC880_AUTO] = "auto", 4865 [ALC880_AUTO] = "auto",
4597}; 4866};
4598 4867
4599static struct snd_pci_quirk alc880_cfg_tbl[] = { 4868static const struct snd_pci_quirk alc880_cfg_tbl[] = {
4600 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810), 4869 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
4601 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG), 4870 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
4602 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST), 4871 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
@@ -4676,7 +4945,7 @@ static struct snd_pci_quirk alc880_cfg_tbl[] = {
4676/* 4945/*
4677 * ALC880 codec presets 4946 * ALC880 codec presets
4678 */ 4947 */
4679static struct alc_config_preset alc880_presets[] = { 4948static const struct alc_config_preset alc880_presets[] = {
4680 [ALC880_3ST] = { 4949 [ALC880_3ST] = {
4681 .mixers = { alc880_three_stack_mixer }, 4950 .mixers = { alc880_three_stack_mixer },
4682 .init_verbs = { alc880_volume_init_verbs, 4951 .init_verbs = { alc880_volume_init_verbs,
@@ -4794,7 +5063,7 @@ static struct alc_config_preset alc880_presets[] = {
4794 .input_mux = &alc880_f1734_capture_source, 5063 .input_mux = &alc880_f1734_capture_source,
4795 .unsol_event = alc880_uniwill_p53_unsol_event, 5064 .unsol_event = alc880_uniwill_p53_unsol_event,
4796 .setup = alc880_uniwill_p53_setup, 5065 .setup = alc880_uniwill_p53_setup,
4797 .init_hook = alc_automute_amp, 5066 .init_hook = alc_hp_automute,
4798 }, 5067 },
4799 [ALC880_ASUS] = { 5068 [ALC880_ASUS] = {
4800 .mixers = { alc880_asus_mixer }, 5069 .mixers = { alc880_asus_mixer },
@@ -4885,7 +5154,7 @@ static struct alc_config_preset alc880_presets[] = {
4885 .input_mux = &alc880_capture_source, 5154 .input_mux = &alc880_capture_source,
4886 .unsol_event = alc880_uniwill_p53_unsol_event, 5155 .unsol_event = alc880_uniwill_p53_unsol_event,
4887 .setup = alc880_uniwill_p53_setup, 5156 .setup = alc880_uniwill_p53_setup,
4888 .init_hook = alc_automute_amp, 5157 .init_hook = alc_hp_automute,
4889 }, 5158 },
4890 [ALC880_FUJITSU] = { 5159 [ALC880_FUJITSU] = {
4891 .mixers = { alc880_fujitsu_mixer }, 5160 .mixers = { alc880_fujitsu_mixer },
@@ -4900,7 +5169,7 @@ static struct alc_config_preset alc880_presets[] = {
4900 .input_mux = &alc880_capture_source, 5169 .input_mux = &alc880_capture_source,
4901 .unsol_event = alc880_uniwill_p53_unsol_event, 5170 .unsol_event = alc880_uniwill_p53_unsol_event,
4902 .setup = alc880_uniwill_p53_setup, 5171 .setup = alc880_uniwill_p53_setup,
4903 .init_hook = alc_automute_amp, 5172 .init_hook = alc_hp_automute,
4904 }, 5173 },
4905 [ALC880_CLEVO] = { 5174 [ALC880_CLEVO] = {
4906 .mixers = { alc880_three_stack_mixer }, 5175 .mixers = { alc880_three_stack_mixer },
@@ -4925,9 +5194,9 @@ static struct alc_config_preset alc880_presets[] = {
4925 .channel_mode = alc880_lg_ch_modes, 5194 .channel_mode = alc880_lg_ch_modes,
4926 .need_dac_fix = 1, 5195 .need_dac_fix = 1,
4927 .input_mux = &alc880_lg_capture_source, 5196 .input_mux = &alc880_lg_capture_source,
4928 .unsol_event = alc_automute_amp_unsol_event, 5197 .unsol_event = alc_sku_unsol_event,
4929 .setup = alc880_lg_setup, 5198 .setup = alc880_lg_setup,
4930 .init_hook = alc_automute_amp, 5199 .init_hook = alc_hp_automute,
4931#ifdef CONFIG_SND_HDA_POWER_SAVE 5200#ifdef CONFIG_SND_HDA_POWER_SAVE
4932 .loopbacks = alc880_lg_loopbacks, 5201 .loopbacks = alc880_lg_loopbacks,
4933#endif 5202#endif
@@ -4942,9 +5211,9 @@ static struct alc_config_preset alc880_presets[] = {
4942 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes), 5211 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4943 .channel_mode = alc880_lg_lw_modes, 5212 .channel_mode = alc880_lg_lw_modes,
4944 .input_mux = &alc880_lg_lw_capture_source, 5213 .input_mux = &alc880_lg_lw_capture_source,
4945 .unsol_event = alc_automute_amp_unsol_event, 5214 .unsol_event = alc_sku_unsol_event,
4946 .setup = alc880_lg_lw_setup, 5215 .setup = alc880_lg_lw_setup,
4947 .init_hook = alc_automute_amp, 5216 .init_hook = alc_hp_automute,
4948 }, 5217 },
4949 [ALC880_MEDION_RIM] = { 5218 [ALC880_MEDION_RIM] = {
4950 .mixers = { alc880_medion_rim_mixer }, 5219 .mixers = { alc880_medion_rim_mixer },
@@ -4984,20 +5253,25 @@ enum {
4984 ALC_CTL_WIDGET_MUTE, 5253 ALC_CTL_WIDGET_MUTE,
4985 ALC_CTL_BIND_MUTE, 5254 ALC_CTL_BIND_MUTE,
4986}; 5255};
4987static struct snd_kcontrol_new alc880_control_templates[] = { 5256static const struct snd_kcontrol_new alc880_control_templates[] = {
4988 HDA_CODEC_VOLUME(NULL, 0, 0, 0), 5257 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4989 HDA_CODEC_MUTE(NULL, 0, 0, 0), 5258 HDA_CODEC_MUTE(NULL, 0, 0, 0),
4990 HDA_BIND_MUTE(NULL, 0, 0, 0), 5259 HDA_BIND_MUTE(NULL, 0, 0, 0),
4991}; 5260};
4992 5261
5262static struct snd_kcontrol_new *alc_kcontrol_new(struct alc_spec *spec)
5263{
5264 snd_array_init(&spec->kctls, sizeof(struct snd_kcontrol_new), 32);
5265 return snd_array_new(&spec->kctls);
5266}
5267
4993/* add dynamic controls */ 5268/* add dynamic controls */
4994static int add_control(struct alc_spec *spec, int type, const char *name, 5269static int add_control(struct alc_spec *spec, int type, const char *name,
4995 int cidx, unsigned long val) 5270 int cidx, unsigned long val)
4996{ 5271{
4997 struct snd_kcontrol_new *knew; 5272 struct snd_kcontrol_new *knew;
4998 5273
4999 snd_array_init(&spec->kctls, sizeof(*knew), 32); 5274 knew = alc_kcontrol_new(spec);
5000 knew = snd_array_new(&spec->kctls);
5001 if (!knew) 5275 if (!knew)
5002 return -ENOMEM; 5276 return -ENOMEM;
5003 *knew = alc880_control_templates[type]; 5277 *knew = alc880_control_templates[type];
@@ -5055,7 +5329,7 @@ static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
5055 nid = cfg->line_out_pins[i]; 5329 nid = cfg->line_out_pins[i];
5056 if (alc880_is_fixed_pin(nid)) { 5330 if (alc880_is_fixed_pin(nid)) {
5057 int idx = alc880_fixed_pin_idx(nid); 5331 int idx = alc880_fixed_pin_idx(nid);
5058 spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx); 5332 spec->private_dac_nids[i] = alc880_idx_to_dac(idx);
5059 assigned[idx] = 1; 5333 assigned[idx] = 1;
5060 } 5334 }
5061 } 5335 }
@@ -5067,7 +5341,7 @@ static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
5067 /* search for an empty channel */ 5341 /* search for an empty channel */
5068 for (j = 0; j < cfg->line_outs; j++) { 5342 for (j = 0; j < cfg->line_outs; j++) {
5069 if (!assigned[j]) { 5343 if (!assigned[j]) {
5070 spec->multiout.dac_nids[i] = 5344 spec->private_dac_nids[i] =
5071 alc880_idx_to_dac(j); 5345 alc880_idx_to_dac(j);
5072 assigned[j] = 1; 5346 assigned[j] = 1;
5073 break; 5347 break;
@@ -5078,10 +5352,13 @@ static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
5078 return 0; 5352 return 0;
5079} 5353}
5080 5354
5081static const char *alc_get_line_out_pfx(const struct auto_pin_cfg *cfg, 5355static const char *alc_get_line_out_pfx(struct alc_spec *spec,
5082 bool can_be_master) 5356 bool can_be_master)
5083{ 5357{
5084 if (!cfg->hp_outs && !cfg->speaker_outs && can_be_master) 5358 struct auto_pin_cfg *cfg = &spec->autocfg;
5359
5360 if (cfg->line_outs == 1 && !spec->multi_ios &&
5361 !cfg->hp_outs && !cfg->speaker_outs && can_be_master)
5085 return "Master"; 5362 return "Master";
5086 5363
5087 switch (cfg->line_out_type) { 5364 switch (cfg->line_out_type) {
@@ -5092,7 +5369,7 @@ static const char *alc_get_line_out_pfx(const struct auto_pin_cfg *cfg,
5092 case AUTO_PIN_HP_OUT: 5369 case AUTO_PIN_HP_OUT:
5093 return "Headphone"; 5370 return "Headphone";
5094 default: 5371 default:
5095 if (cfg->line_outs == 1) 5372 if (cfg->line_outs == 1 && !spec->multi_ios)
5096 return "PCM"; 5373 return "PCM";
5097 break; 5374 break;
5098 } 5375 }
@@ -5106,11 +5383,15 @@ static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
5106 static const char * const chname[4] = { 5383 static const char * const chname[4] = {
5107 "Front", "Surround", NULL /*CLFE*/, "Side" 5384 "Front", "Surround", NULL /*CLFE*/, "Side"
5108 }; 5385 };
5109 const char *pfx = alc_get_line_out_pfx(cfg, false); 5386 const char *pfx = alc_get_line_out_pfx(spec, false);
5110 hda_nid_t nid; 5387 hda_nid_t nid;
5111 int i, err; 5388 int i, err, noutputs;
5112 5389
5113 for (i = 0; i < cfg->line_outs; i++) { 5390 noutputs = cfg->line_outs;
5391 if (spec->multi_ios > 0)
5392 noutputs += spec->multi_ios;
5393
5394 for (i = 0; i < noutputs; i++) {
5114 if (!spec->multiout.dac_nids[i]) 5395 if (!spec->multiout.dac_nids[i])
5115 continue; 5396 continue;
5116 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i])); 5397 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
@@ -5376,6 +5657,8 @@ static void alc880_auto_init_input_src(struct hda_codec *codec)
5376 } 5657 }
5377} 5658}
5378 5659
5660static int alc_auto_add_multi_channel_mode(struct hda_codec *codec);
5661
5379/* parse the BIOS configuration and set up the alc_spec */ 5662/* parse the BIOS configuration and set up the alc_spec */
5380/* return 1 if successful, 0 if the proper config is not found, 5663/* return 1 if successful, 0 if the proper config is not found,
5381 * or a negative error code 5664 * or a negative error code
@@ -5384,7 +5667,7 @@ static int alc880_parse_auto_config(struct hda_codec *codec)
5384{ 5667{
5385 struct alc_spec *spec = codec->spec; 5668 struct alc_spec *spec = codec->spec;
5386 int err; 5669 int err;
5387 static hda_nid_t alc880_ignore[] = { 0x1d, 0 }; 5670 static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
5388 5671
5389 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 5672 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
5390 alc880_ignore); 5673 alc880_ignore);
@@ -5396,6 +5679,9 @@ static int alc880_parse_auto_config(struct hda_codec *codec)
5396 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg); 5679 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
5397 if (err < 0) 5680 if (err < 0)
5398 return err; 5681 return err;
5682 err = alc_auto_add_multi_channel_mode(codec);
5683 if (err < 0)
5684 return err;
5399 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg); 5685 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
5400 if (err < 0) 5686 if (err < 0)
5401 return err; 5687 return err;
@@ -5467,6 +5753,12 @@ static void fixup_automic_adc(struct hda_codec *codec)
5467 spec->capsrc_nids += i; 5753 spec->capsrc_nids += i;
5468 spec->adc_nids += i; 5754 spec->adc_nids += i;
5469 spec->num_adc_nids = 1; 5755 spec->num_adc_nids = 1;
5756 /* optional dock-mic */
5757 eidx = get_connection_index(codec, cap, spec->dock_mic.pin);
5758 if (eidx < 0)
5759 spec->dock_mic.pin = 0;
5760 else
5761 spec->dock_mic.mux_idx = eidx;
5470 return; 5762 return;
5471 } 5763 }
5472 snd_printd(KERN_INFO "hda_codec: %s: " 5764 snd_printd(KERN_INFO "hda_codec: %s: "
@@ -5494,6 +5786,8 @@ static int init_capsrc_for_pin(struct hda_codec *codec, hda_nid_t pin)
5494 struct alc_spec *spec = codec->spec; 5786 struct alc_spec *spec = codec->spec;
5495 int i; 5787 int i;
5496 5788
5789 if (!pin)
5790 return 0;
5497 for (i = 0; i < spec->num_adc_nids; i++) { 5791 for (i = 0; i < spec->num_adc_nids; i++) {
5498 hda_nid_t cap = spec->capsrc_nids ? 5792 hda_nid_t cap = spec->capsrc_nids ?
5499 spec->capsrc_nids[i] : spec->adc_nids[i]; 5793 spec->capsrc_nids[i] : spec->adc_nids[i];
@@ -5534,6 +5828,7 @@ static void fixup_dual_adc_switch(struct hda_codec *codec)
5534{ 5828{
5535 struct alc_spec *spec = codec->spec; 5829 struct alc_spec *spec = codec->spec;
5536 init_capsrc_for_pin(codec, spec->ext_mic.pin); 5830 init_capsrc_for_pin(codec, spec->ext_mic.pin);
5831 init_capsrc_for_pin(codec, spec->dock_mic.pin);
5537 init_capsrc_for_pin(codec, spec->int_mic.pin); 5832 init_capsrc_for_pin(codec, spec->int_mic.pin);
5538} 5833}
5539 5834
@@ -5550,7 +5845,7 @@ static void alc_init_special_input_src(struct hda_codec *codec)
5550static void set_capture_mixer(struct hda_codec *codec) 5845static void set_capture_mixer(struct hda_codec *codec)
5551{ 5846{
5552 struct alc_spec *spec = codec->spec; 5847 struct alc_spec *spec = codec->spec;
5553 static struct snd_kcontrol_new *caps[2][3] = { 5848 static const struct snd_kcontrol_new *caps[2][3] = {
5554 { alc_capture_mixer_nosrc1, 5849 { alc_capture_mixer_nosrc1,
5555 alc_capture_mixer_nosrc2, 5850 alc_capture_mixer_nosrc2,
5556 alc_capture_mixer_nosrc3 }, 5851 alc_capture_mixer_nosrc3 },
@@ -5576,7 +5871,7 @@ static void set_capture_mixer(struct hda_codec *codec)
5576} 5871}
5577 5872
5578/* fill adc_nids (and capsrc_nids) containing all active input pins */ 5873/* fill adc_nids (and capsrc_nids) containing all active input pins */
5579static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids, 5874static void fillup_priv_adc_nids(struct hda_codec *codec, const hda_nid_t *nids,
5580 int num_nids) 5875 int num_nids)
5581{ 5876{
5582 struct alc_spec *spec = codec->spec; 5877 struct alc_spec *spec = codec->spec;
@@ -5642,10 +5937,11 @@ static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids,
5642#define set_beep_amp(spec, nid, idx, dir) \ 5937#define set_beep_amp(spec, nid, idx, dir) \
5643 ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir)) 5938 ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
5644 5939
5645static struct snd_pci_quirk beep_white_list[] = { 5940static const struct snd_pci_quirk beep_white_list[] = {
5646 SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), 5941 SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
5647 SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1), 5942 SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
5648 SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1), 5943 SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
5944 SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
5649 SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1), 5945 SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
5650 {} 5946 {}
5651}; 5947};
@@ -5753,17 +6049,17 @@ static int patch_alc880(struct hda_codec *codec)
5753 * ALC260 support 6049 * ALC260 support
5754 */ 6050 */
5755 6051
5756static hda_nid_t alc260_dac_nids[1] = { 6052static const hda_nid_t alc260_dac_nids[1] = {
5757 /* front */ 6053 /* front */
5758 0x02, 6054 0x02,
5759}; 6055};
5760 6056
5761static hda_nid_t alc260_adc_nids[1] = { 6057static const hda_nid_t alc260_adc_nids[1] = {
5762 /* ADC0 */ 6058 /* ADC0 */
5763 0x04, 6059 0x04,
5764}; 6060};
5765 6061
5766static hda_nid_t alc260_adc_nids_alt[1] = { 6062static const hda_nid_t alc260_adc_nids_alt[1] = {
5767 /* ADC1 */ 6063 /* ADC1 */
5768 0x05, 6064 0x05,
5769}; 6065};
@@ -5771,7 +6067,7 @@ static hda_nid_t alc260_adc_nids_alt[1] = {
5771/* NIDs used when simultaneous access to both ADCs makes sense. Note that 6067/* NIDs used when simultaneous access to both ADCs makes sense. Note that
5772 * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC. 6068 * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
5773 */ 6069 */
5774static hda_nid_t alc260_dual_adc_nids[2] = { 6070static const hda_nid_t alc260_dual_adc_nids[2] = {
5775 /* ADC0, ADC1 */ 6071 /* ADC0, ADC1 */
5776 0x04, 0x05 6072 0x04, 0x05
5777}; 6073};
@@ -5779,7 +6075,7 @@ static hda_nid_t alc260_dual_adc_nids[2] = {
5779#define ALC260_DIGOUT_NID 0x03 6075#define ALC260_DIGOUT_NID 0x03
5780#define ALC260_DIGIN_NID 0x06 6076#define ALC260_DIGIN_NID 0x06
5781 6077
5782static struct hda_input_mux alc260_capture_source = { 6078static const struct hda_input_mux alc260_capture_source = {
5783 .num_items = 4, 6079 .num_items = 4,
5784 .items = { 6080 .items = {
5785 { "Mic", 0x0 }, 6081 { "Mic", 0x0 },
@@ -5795,7 +6091,7 @@ static struct hda_input_mux alc260_capture_source = {
5795 * recording the mixer output on the second ADC (ADC0 doesn't have a 6091 * recording the mixer output on the second ADC (ADC0 doesn't have a
5796 * connection to the mixer output). 6092 * connection to the mixer output).
5797 */ 6093 */
5798static struct hda_input_mux alc260_fujitsu_capture_sources[2] = { 6094static const struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
5799 { 6095 {
5800 .num_items = 3, 6096 .num_items = 3,
5801 .items = { 6097 .items = {
@@ -5819,7 +6115,7 @@ static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
5819/* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to 6115/* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
5820 * the Fujitsu S702x, but jacks are marked differently. 6116 * the Fujitsu S702x, but jacks are marked differently.
5821 */ 6117 */
5822static struct hda_input_mux alc260_acer_capture_sources[2] = { 6118static const struct hda_input_mux alc260_acer_capture_sources[2] = {
5823 { 6119 {
5824 .num_items = 4, 6120 .num_items = 4,
5825 .items = { 6121 .items = {
@@ -5842,7 +6138,7 @@ static struct hda_input_mux alc260_acer_capture_sources[2] = {
5842}; 6138};
5843 6139
5844/* Maxdata Favorit 100XS */ 6140/* Maxdata Favorit 100XS */
5845static struct hda_input_mux alc260_favorit100_capture_sources[2] = { 6141static const struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5846 { 6142 {
5847 .num_items = 2, 6143 .num_items = 2,
5848 .items = { 6144 .items = {
@@ -5866,7 +6162,7 @@ static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5866 * element which allows changing the channel mode, so the verb list is 6162 * element which allows changing the channel mode, so the verb list is
5867 * never used. 6163 * never used.
5868 */ 6164 */
5869static struct hda_channel_mode alc260_modes[1] = { 6165static const struct hda_channel_mode alc260_modes[1] = {
5870 { 2, NULL }, 6166 { 2, NULL },
5871}; 6167};
5872 6168
@@ -5880,7 +6176,7 @@ static struct hda_channel_mode alc260_modes[1] = {
5880 * acer: acer + capture 6176 * acer: acer + capture
5881 */ 6177 */
5882 6178
5883static struct snd_kcontrol_new alc260_base_output_mixer[] = { 6179static const struct snd_kcontrol_new alc260_base_output_mixer[] = {
5884 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT), 6180 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5885 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT), 6181 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5886 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT), 6182 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
@@ -5890,7 +6186,7 @@ static struct snd_kcontrol_new alc260_base_output_mixer[] = {
5890 { } /* end */ 6186 { } /* end */
5891}; 6187};
5892 6188
5893static struct snd_kcontrol_new alc260_input_mixer[] = { 6189static const struct snd_kcontrol_new alc260_input_mixer[] = {
5894 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), 6190 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5895 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), 6191 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5896 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT), 6192 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
@@ -5903,21 +6199,14 @@ static struct snd_kcontrol_new alc260_input_mixer[] = {
5903}; 6199};
5904 6200
5905/* update HP, line and mono out pins according to the master switch */ 6201/* update HP, line and mono out pins according to the master switch */
5906static void alc260_hp_master_update(struct hda_codec *codec, 6202static void alc260_hp_master_update(struct hda_codec *codec)
5907 hda_nid_t hp, hda_nid_t line,
5908 hda_nid_t mono)
5909{ 6203{
5910 struct alc_spec *spec = codec->spec; 6204 struct alc_spec *spec = codec->spec;
5911 unsigned int val = spec->master_sw ? PIN_HP : 0; 6205
5912 /* change HP and line-out pins */ 6206 /* change HP pins */
5913 snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 6207 do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
5914 val); 6208 spec->autocfg.hp_pins, spec->master_mute, true);
5915 snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 6209 update_speakers(codec);
5916 val);
5917 /* mono (speaker) depending on the HP jack sense */
5918 val = (val && !spec->jack_present) ? PIN_OUT : 0;
5919 snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5920 val);
5921} 6210}
5922 6211
5923static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol, 6212static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
@@ -5925,7 +6214,7 @@ static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5925{ 6214{
5926 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 6215 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5927 struct alc_spec *spec = codec->spec; 6216 struct alc_spec *spec = codec->spec;
5928 *ucontrol->value.integer.value = spec->master_sw; 6217 *ucontrol->value.integer.value = !spec->master_mute;
5929 return 0; 6218 return 0;
5930} 6219}
5931 6220
@@ -5934,20 +6223,16 @@ static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5934{ 6223{
5935 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 6224 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5936 struct alc_spec *spec = codec->spec; 6225 struct alc_spec *spec = codec->spec;
5937 int val = !!*ucontrol->value.integer.value; 6226 int val = !*ucontrol->value.integer.value;
5938 hda_nid_t hp, line, mono;
5939 6227
5940 if (val == spec->master_sw) 6228 if (val == spec->master_mute)
5941 return 0; 6229 return 0;
5942 spec->master_sw = val; 6230 spec->master_mute = val;
5943 hp = (kcontrol->private_value >> 16) & 0xff; 6231 alc260_hp_master_update(codec);
5944 line = (kcontrol->private_value >> 8) & 0xff;
5945 mono = kcontrol->private_value & 0xff;
5946 alc260_hp_master_update(codec, hp, line, mono);
5947 return 1; 6232 return 1;
5948} 6233}
5949 6234
5950static struct snd_kcontrol_new alc260_hp_output_mixer[] = { 6235static const struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5951 { 6236 {
5952 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 6237 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5953 .name = "Master Playback Switch", 6238 .name = "Master Playback Switch",
@@ -5955,7 +6240,6 @@ static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5955 .info = snd_ctl_boolean_mono_info, 6240 .info = snd_ctl_boolean_mono_info,
5956 .get = alc260_hp_master_sw_get, 6241 .get = alc260_hp_master_sw_get,
5957 .put = alc260_hp_master_sw_put, 6242 .put = alc260_hp_master_sw_put,
5958 .private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5959 }, 6243 },
5960 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT), 6244 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5961 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT), 6245 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
@@ -5967,26 +6251,23 @@ static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5967 { } /* end */ 6251 { } /* end */
5968}; 6252};
5969 6253
5970static struct hda_verb alc260_hp_unsol_verbs[] = { 6254static const struct hda_verb alc260_hp_unsol_verbs[] = {
5971 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 6255 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5972 {}, 6256 {},
5973}; 6257};
5974 6258
5975static void alc260_hp_automute(struct hda_codec *codec) 6259static void alc260_hp_setup(struct hda_codec *codec)
5976{ 6260{
5977 struct alc_spec *spec = codec->spec; 6261 struct alc_spec *spec = codec->spec;
5978 6262
5979 spec->jack_present = snd_hda_jack_detect(codec, 0x10); 6263 spec->autocfg.hp_pins[0] = 0x0f;
5980 alc260_hp_master_update(codec, 0x0f, 0x10, 0x11); 6264 spec->autocfg.speaker_pins[0] = 0x10;
5981} 6265 spec->autocfg.speaker_pins[1] = 0x11;
5982 6266 spec->automute = 1;
5983static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res) 6267 spec->automute_mode = ALC_AUTOMUTE_PIN;
5984{
5985 if ((res >> 26) == ALC880_HP_EVENT)
5986 alc260_hp_automute(codec);
5987} 6268}
5988 6269
5989static struct snd_kcontrol_new alc260_hp_3013_mixer[] = { 6270static const struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
5990 { 6271 {
5991 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 6272 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5992 .name = "Master Playback Switch", 6273 .name = "Master Playback Switch",
@@ -5994,7 +6275,6 @@ static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
5994 .info = snd_ctl_boolean_mono_info, 6275 .info = snd_ctl_boolean_mono_info,
5995 .get = alc260_hp_master_sw_get, 6276 .get = alc260_hp_master_sw_get,
5996 .put = alc260_hp_master_sw_put, 6277 .put = alc260_hp_master_sw_put,
5997 .private_value = (0x15 << 16) | (0x10 << 8) | 0x11
5998 }, 6278 },
5999 HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT), 6279 HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
6000 HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT), 6280 HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
@@ -6007,7 +6287,18 @@ static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
6007 { } /* end */ 6287 { } /* end */
6008}; 6288};
6009 6289
6010static struct hda_bind_ctls alc260_dc7600_bind_master_vol = { 6290static void alc260_hp_3013_setup(struct hda_codec *codec)
6291{
6292 struct alc_spec *spec = codec->spec;
6293
6294 spec->autocfg.hp_pins[0] = 0x15;
6295 spec->autocfg.speaker_pins[0] = 0x10;
6296 spec->autocfg.speaker_pins[1] = 0x11;
6297 spec->automute = 1;
6298 spec->automute_mode = ALC_AUTOMUTE_PIN;
6299}
6300
6301static const struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
6011 .ops = &snd_hda_bind_vol, 6302 .ops = &snd_hda_bind_vol,
6012 .values = { 6303 .values = {
6013 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT), 6304 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
@@ -6017,7 +6308,7 @@ static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
6017 }, 6308 },
6018}; 6309};
6019 6310
6020static struct hda_bind_ctls alc260_dc7600_bind_switch = { 6311static const struct hda_bind_ctls alc260_dc7600_bind_switch = {
6021 .ops = &snd_hda_bind_sw, 6312 .ops = &snd_hda_bind_sw,
6022 .values = { 6313 .values = {
6023 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT), 6314 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
@@ -6026,7 +6317,7 @@ static struct hda_bind_ctls alc260_dc7600_bind_switch = {
6026 }, 6317 },
6027}; 6318};
6028 6319
6029static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = { 6320static const struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
6030 HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol), 6321 HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
6031 HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch), 6322 HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
6032 HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT), 6323 HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
@@ -6034,49 +6325,27 @@ static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
6034 { } /* end */ 6325 { } /* end */
6035}; 6326};
6036 6327
6037static struct hda_verb alc260_hp_3013_unsol_verbs[] = { 6328static const struct hda_verb alc260_hp_3013_unsol_verbs[] = {
6038 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 6329 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6039 {}, 6330 {},
6040}; 6331};
6041 6332
6042static void alc260_hp_3013_automute(struct hda_codec *codec) 6333static void alc260_hp_3012_setup(struct hda_codec *codec)
6043{ 6334{
6044 struct alc_spec *spec = codec->spec; 6335 struct alc_spec *spec = codec->spec;
6045 6336
6046 spec->jack_present = snd_hda_jack_detect(codec, 0x15); 6337 spec->autocfg.hp_pins[0] = 0x10;
6047 alc260_hp_master_update(codec, 0x15, 0x10, 0x11); 6338 spec->autocfg.speaker_pins[0] = 0x0f;
6048} 6339 spec->autocfg.speaker_pins[1] = 0x11;
6049 6340 spec->autocfg.speaker_pins[2] = 0x15;
6050static void alc260_hp_3013_unsol_event(struct hda_codec *codec, 6341 spec->automute = 1;
6051 unsigned int res) 6342 spec->automute_mode = ALC_AUTOMUTE_PIN;
6052{
6053 if ((res >> 26) == ALC880_HP_EVENT)
6054 alc260_hp_3013_automute(codec);
6055}
6056
6057static void alc260_hp_3012_automute(struct hda_codec *codec)
6058{
6059 unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
6060
6061 snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6062 bits);
6063 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6064 bits);
6065 snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6066 bits);
6067}
6068
6069static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
6070 unsigned int res)
6071{
6072 if ((res >> 26) == ALC880_HP_EVENT)
6073 alc260_hp_3012_automute(codec);
6074} 6343}
6075 6344
6076/* Fujitsu S702x series laptops. ALC260 pin usage: Mic/Line jack = 0x12, 6345/* Fujitsu S702x series laptops. ALC260 pin usage: Mic/Line jack = 0x12,
6077 * HP jack = 0x14, CD audio = 0x16, internal speaker = 0x10. 6346 * HP jack = 0x14, CD audio = 0x16, internal speaker = 0x10.
6078 */ 6347 */
6079static struct snd_kcontrol_new alc260_fujitsu_mixer[] = { 6348static const struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
6080 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT), 6349 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6081 HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT), 6350 HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
6082 ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT), 6351 ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
@@ -6113,7 +6382,7 @@ static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
6113 * controls for such models. On models without a "mono speaker" the control 6382 * controls for such models. On models without a "mono speaker" the control
6114 * won't do anything. 6383 * won't do anything.
6115 */ 6384 */
6116static struct snd_kcontrol_new alc260_acer_mixer[] = { 6385static const struct snd_kcontrol_new alc260_acer_mixer[] = {
6117 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), 6386 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6118 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT), 6387 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
6119 ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT), 6388 ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
@@ -6134,7 +6403,7 @@ static struct snd_kcontrol_new alc260_acer_mixer[] = {
6134 6403
6135/* Maxdata Favorit 100XS: one output and one input (0x12) jack 6404/* Maxdata Favorit 100XS: one output and one input (0x12) jack
6136 */ 6405 */
6137static struct snd_kcontrol_new alc260_favorit100_mixer[] = { 6406static const struct snd_kcontrol_new alc260_favorit100_mixer[] = {
6138 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), 6407 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6139 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT), 6408 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
6140 ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT), 6409 ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
@@ -6147,7 +6416,7 @@ static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
6147/* Packard bell V7900 ALC260 pin usage: HP = 0x0f, Mic jack = 0x12, 6416/* Packard bell V7900 ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
6148 * Line In jack = 0x14, CD audio = 0x16, pc beep = 0x17. 6417 * Line In jack = 0x14, CD audio = 0x16, pc beep = 0x17.
6149 */ 6418 */
6150static struct snd_kcontrol_new alc260_will_mixer[] = { 6419static const struct snd_kcontrol_new alc260_will_mixer[] = {
6151 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), 6420 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6152 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT), 6421 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
6153 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT), 6422 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
@@ -6164,7 +6433,7 @@ static struct snd_kcontrol_new alc260_will_mixer[] = {
6164/* Replacer 672V ALC260 pin usage: Mic jack = 0x12, 6433/* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
6165 * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f. 6434 * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
6166 */ 6435 */
6167static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = { 6436static const struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
6168 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), 6437 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6169 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT), 6438 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
6170 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT), 6439 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
@@ -6181,7 +6450,7 @@ static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
6181/* 6450/*
6182 * initialization verbs 6451 * initialization verbs
6183 */ 6452 */
6184static struct hda_verb alc260_init_verbs[] = { 6453static const struct hda_verb alc260_init_verbs[] = {
6185 /* Line In pin widget for input */ 6454 /* Line In pin widget for input */
6186 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 6455 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6187 /* CD pin widget for input */ 6456 /* CD pin widget for input */
@@ -6245,7 +6514,7 @@ static struct hda_verb alc260_init_verbs[] = {
6245}; 6514};
6246 6515
6247#if 0 /* should be identical with alc260_init_verbs? */ 6516#if 0 /* should be identical with alc260_init_verbs? */
6248static struct hda_verb alc260_hp_init_verbs[] = { 6517static const struct hda_verb alc260_hp_init_verbs[] = {
6249 /* Headphone and output */ 6518 /* Headphone and output */
6250 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 6519 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
6251 /* mono output */ 6520 /* mono output */
@@ -6295,7 +6564,7 @@ static struct hda_verb alc260_hp_init_verbs[] = {
6295}; 6564};
6296#endif 6565#endif
6297 6566
6298static struct hda_verb alc260_hp_3013_init_verbs[] = { 6567static const struct hda_verb alc260_hp_3013_init_verbs[] = {
6299 /* Line out and output */ 6568 /* Line out and output */
6300 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 6569 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
6301 /* mono output */ 6570 /* mono output */
@@ -6348,7 +6617,7 @@ static struct hda_verb alc260_hp_3013_init_verbs[] = {
6348 * laptops. ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD 6617 * laptops. ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
6349 * audio = 0x16, internal speaker = 0x10. 6618 * audio = 0x16, internal speaker = 0x10.
6350 */ 6619 */
6351static struct hda_verb alc260_fujitsu_init_verbs[] = { 6620static const struct hda_verb alc260_fujitsu_init_verbs[] = {
6352 /* Disable all GPIOs */ 6621 /* Disable all GPIOs */
6353 {0x01, AC_VERB_SET_GPIO_MASK, 0}, 6622 {0x01, AC_VERB_SET_GPIO_MASK, 0},
6354 /* Internal speaker is connected to headphone pin */ 6623 /* Internal speaker is connected to headphone pin */
@@ -6430,7 +6699,7 @@ static struct hda_verb alc260_fujitsu_init_verbs[] = {
6430/* Initialisation sequence for ALC260 as configured in Acer TravelMate and 6699/* Initialisation sequence for ALC260 as configured in Acer TravelMate and
6431 * similar laptops (adapted from Fujitsu init verbs). 6700 * similar laptops (adapted from Fujitsu init verbs).
6432 */ 6701 */
6433static struct hda_verb alc260_acer_init_verbs[] = { 6702static const struct hda_verb alc260_acer_init_verbs[] = {
6434 /* On TravelMate laptops, GPIO 0 enables the internal speaker and 6703 /* On TravelMate laptops, GPIO 0 enables the internal speaker and
6435 * the headphone jack. Turn this on and rely on the standard mute 6704 * the headphone jack. Turn this on and rely on the standard mute
6436 * methods whenever the user wants to turn these outputs off. 6705 * methods whenever the user wants to turn these outputs off.
@@ -6518,7 +6787,7 @@ static struct hda_verb alc260_acer_init_verbs[] = {
6518/* Initialisation sequence for Maxdata Favorit 100XS 6787/* Initialisation sequence for Maxdata Favorit 100XS
6519 * (adapted from Acer init verbs). 6788 * (adapted from Acer init verbs).
6520 */ 6789 */
6521static struct hda_verb alc260_favorit100_init_verbs[] = { 6790static const struct hda_verb alc260_favorit100_init_verbs[] = {
6522 /* GPIO 0 enables the output jack. 6791 /* GPIO 0 enables the output jack.
6523 * Turn this on and rely on the standard mute 6792 * Turn this on and rely on the standard mute
6524 * methods whenever the user wants to turn these outputs off. 6793 * methods whenever the user wants to turn these outputs off.
@@ -6598,7 +6867,7 @@ static struct hda_verb alc260_favorit100_init_verbs[] = {
6598 { } 6867 { }
6599}; 6868};
6600 6869
6601static struct hda_verb alc260_will_verbs[] = { 6870static const struct hda_verb alc260_will_verbs[] = {
6602 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 6871 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6603 {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00}, 6872 {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
6604 {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00}, 6873 {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
@@ -6608,7 +6877,7 @@ static struct hda_verb alc260_will_verbs[] = {
6608 {} 6877 {}
6609}; 6878};
6610 6879
6611static struct hda_verb alc260_replacer_672v_verbs[] = { 6880static const struct hda_verb alc260_replacer_672v_verbs[] = {
6612 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, 6881 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6613 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07}, 6882 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6614 {0x1a, AC_VERB_SET_PROC_COEF, 0x3050}, 6883 {0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
@@ -6650,7 +6919,7 @@ static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
6650 alc260_replacer_672v_automute(codec); 6919 alc260_replacer_672v_automute(codec);
6651} 6920}
6652 6921
6653static struct hda_verb alc260_hp_dc7600_verbs[] = { 6922static const struct hda_verb alc260_hp_dc7600_verbs[] = {
6654 {0x05, AC_VERB_SET_CONNECT_SEL, 0x01}, 6923 {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
6655 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 6924 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6656 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6925 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
@@ -6668,17 +6937,17 @@ static struct hda_verb alc260_hp_dc7600_verbs[] = {
6668 * configuration. 6937 * configuration.
6669 */ 6938 */
6670#ifdef CONFIG_SND_DEBUG 6939#ifdef CONFIG_SND_DEBUG
6671static hda_nid_t alc260_test_dac_nids[1] = { 6940static const hda_nid_t alc260_test_dac_nids[1] = {
6672 0x02, 6941 0x02,
6673}; 6942};
6674static hda_nid_t alc260_test_adc_nids[2] = { 6943static const hda_nid_t alc260_test_adc_nids[2] = {
6675 0x04, 0x05, 6944 0x04, 0x05,
6676}; 6945};
6677/* For testing the ALC260, each input MUX needs its own definition since 6946/* For testing the ALC260, each input MUX needs its own definition since
6678 * the signal assignments are different. This assumes that the first ADC 6947 * the signal assignments are different. This assumes that the first ADC
6679 * is NID 0x04. 6948 * is NID 0x04.
6680 */ 6949 */
6681static struct hda_input_mux alc260_test_capture_sources[2] = { 6950static const struct hda_input_mux alc260_test_capture_sources[2] = {
6682 { 6951 {
6683 .num_items = 7, 6952 .num_items = 7,
6684 .items = { 6953 .items = {
@@ -6705,7 +6974,7 @@ static struct hda_input_mux alc260_test_capture_sources[2] = {
6705 }, 6974 },
6706 }, 6975 },
6707}; 6976};
6708static struct snd_kcontrol_new alc260_test_mixer[] = { 6977static const struct snd_kcontrol_new alc260_test_mixer[] = {
6709 /* Output driver widgets */ 6978 /* Output driver widgets */
6710 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT), 6979 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
6711 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT), 6980 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
@@ -6769,7 +7038,7 @@ static struct snd_kcontrol_new alc260_test_mixer[] = {
6769 7038
6770 { } /* end */ 7039 { } /* end */
6771}; 7040};
6772static struct hda_verb alc260_test_init_verbs[] = { 7041static const struct hda_verb alc260_test_init_verbs[] = {
6773 /* Enable all GPIOs as outputs with an initial value of 0 */ 7042 /* Enable all GPIOs as outputs with an initial value of 0 */
6774 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f}, 7043 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
6775 {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, 7044 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
@@ -6907,7 +7176,7 @@ static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6907 7176
6908 spec->multiout.num_dacs = 1; 7177 spec->multiout.num_dacs = 1;
6909 spec->multiout.dac_nids = spec->private_dac_nids; 7178 spec->multiout.dac_nids = spec->private_dac_nids;
6910 spec->multiout.dac_nids[0] = 0x02; 7179 spec->private_dac_nids[0] = 0x02;
6911 7180
6912 nid = cfg->line_out_pins[0]; 7181 nid = cfg->line_out_pins[0];
6913 if (nid) { 7182 if (nid) {
@@ -7005,7 +7274,7 @@ static void alc260_auto_init_analog_input(struct hda_codec *codec)
7005/* 7274/*
7006 * generic initialization of ADC, input mixers and output mixers 7275 * generic initialization of ADC, input mixers and output mixers
7007 */ 7276 */
7008static struct hda_verb alc260_volume_init_verbs[] = { 7277static const struct hda_verb alc260_volume_init_verbs[] = {
7009 /* 7278 /*
7010 * Unmute ADC0-1 and set the default input to mic-in 7279 * Unmute ADC0-1 and set the default input to mic-in
7011 */ 7280 */
@@ -7050,7 +7319,7 @@ static int alc260_parse_auto_config(struct hda_codec *codec)
7050{ 7319{
7051 struct alc_spec *spec = codec->spec; 7320 struct alc_spec *spec = codec->spec;
7052 int err; 7321 int err;
7053 static hda_nid_t alc260_ignore[] = { 0x17, 0 }; 7322 static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
7054 7323
7055 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 7324 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
7056 alc260_ignore); 7325 alc260_ignore);
@@ -7095,7 +7364,7 @@ static void alc260_auto_init(struct hda_codec *codec)
7095} 7364}
7096 7365
7097#ifdef CONFIG_SND_HDA_POWER_SAVE 7366#ifdef CONFIG_SND_HDA_POWER_SAVE
7098static struct hda_amp_list alc260_loopbacks[] = { 7367static const struct hda_amp_list alc260_loopbacks[] = {
7099 { 0x07, HDA_INPUT, 0 }, 7368 { 0x07, HDA_INPUT, 0 },
7100 { 0x07, HDA_INPUT, 1 }, 7369 { 0x07, HDA_INPUT, 1 },
7101 { 0x07, HDA_INPUT, 2 }, 7370 { 0x07, HDA_INPUT, 2 },
@@ -7122,7 +7391,7 @@ static const struct alc_fixup alc260_fixups[] = {
7122 }, 7391 },
7123}; 7392};
7124 7393
7125static struct snd_pci_quirk alc260_fixup_tbl[] = { 7394static const struct snd_pci_quirk alc260_fixup_tbl[] = {
7126 SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", PINFIX_HP_DC5750), 7395 SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", PINFIX_HP_DC5750),
7127 {} 7396 {}
7128}; 7397};
@@ -7146,7 +7415,7 @@ static const char * const alc260_models[ALC260_MODEL_LAST] = {
7146 [ALC260_AUTO] = "auto", 7415 [ALC260_AUTO] = "auto",
7147}; 7416};
7148 7417
7149static struct snd_pci_quirk alc260_cfg_tbl[] = { 7418static const struct snd_pci_quirk alc260_cfg_tbl[] = {
7150 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER), 7419 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
7151 SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL), 7420 SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
7152 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER), 7421 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
@@ -7170,7 +7439,7 @@ static struct snd_pci_quirk alc260_cfg_tbl[] = {
7170 {} 7439 {}
7171}; 7440};
7172 7441
7173static struct alc_config_preset alc260_presets[] = { 7442static const struct alc_config_preset alc260_presets[] = {
7174 [ALC260_BASIC] = { 7443 [ALC260_BASIC] = {
7175 .mixers = { alc260_base_output_mixer, 7444 .mixers = { alc260_base_output_mixer,
7176 alc260_input_mixer }, 7445 alc260_input_mixer },
@@ -7195,8 +7464,9 @@ static struct alc_config_preset alc260_presets[] = {
7195 .num_channel_mode = ARRAY_SIZE(alc260_modes), 7464 .num_channel_mode = ARRAY_SIZE(alc260_modes),
7196 .channel_mode = alc260_modes, 7465 .channel_mode = alc260_modes,
7197 .input_mux = &alc260_capture_source, 7466 .input_mux = &alc260_capture_source,
7198 .unsol_event = alc260_hp_unsol_event, 7467 .unsol_event = alc_sku_unsol_event,
7199 .init_hook = alc260_hp_automute, 7468 .setup = alc260_hp_setup,
7469 .init_hook = alc_inithook,
7200 }, 7470 },
7201 [ALC260_HP_DC7600] = { 7471 [ALC260_HP_DC7600] = {
7202 .mixers = { alc260_hp_dc7600_mixer, 7472 .mixers = { alc260_hp_dc7600_mixer,
@@ -7210,8 +7480,9 @@ static struct alc_config_preset alc260_presets[] = {
7210 .num_channel_mode = ARRAY_SIZE(alc260_modes), 7480 .num_channel_mode = ARRAY_SIZE(alc260_modes),
7211 .channel_mode = alc260_modes, 7481 .channel_mode = alc260_modes,
7212 .input_mux = &alc260_capture_source, 7482 .input_mux = &alc260_capture_source,
7213 .unsol_event = alc260_hp_3012_unsol_event, 7483 .unsol_event = alc_sku_unsol_event,
7214 .init_hook = alc260_hp_3012_automute, 7484 .setup = alc260_hp_3012_setup,
7485 .init_hook = alc_inithook,
7215 }, 7486 },
7216 [ALC260_HP_3013] = { 7487 [ALC260_HP_3013] = {
7217 .mixers = { alc260_hp_3013_mixer, 7488 .mixers = { alc260_hp_3013_mixer,
@@ -7225,8 +7496,9 @@ static struct alc_config_preset alc260_presets[] = {
7225 .num_channel_mode = ARRAY_SIZE(alc260_modes), 7496 .num_channel_mode = ARRAY_SIZE(alc260_modes),
7226 .channel_mode = alc260_modes, 7497 .channel_mode = alc260_modes,
7227 .input_mux = &alc260_capture_source, 7498 .input_mux = &alc260_capture_source,
7228 .unsol_event = alc260_hp_3013_unsol_event, 7499 .unsol_event = alc_sku_unsol_event,
7229 .init_hook = alc260_hp_3013_automute, 7500 .setup = alc260_hp_3013_setup,
7501 .init_hook = alc_inithook,
7230 }, 7502 },
7231 [ALC260_FUJITSU_S702X] = { 7503 [ALC260_FUJITSU_S702X] = {
7232 .mixers = { alc260_fujitsu_mixer }, 7504 .mixers = { alc260_fujitsu_mixer },
@@ -7384,6 +7656,7 @@ static int patch_alc260(struct hda_codec *codec)
7384 codec->patch_ops = alc_patch_ops; 7656 codec->patch_ops = alc_patch_ops;
7385 if (board_config == ALC260_AUTO) 7657 if (board_config == ALC260_AUTO)
7386 spec->init_hook = alc260_auto_init; 7658 spec->init_hook = alc260_auto_init;
7659 spec->shutup = alc_eapd_shutup;
7387#ifdef CONFIG_SND_HDA_POWER_SAVE 7660#ifdef CONFIG_SND_HDA_POWER_SAVE
7388 if (!spec->loopback.amplist) 7661 if (!spec->loopback.amplist)
7389 spec->loopback.amplist = alc260_loopbacks; 7662 spec->loopback.amplist = alc260_loopbacks;
@@ -7411,12 +7684,12 @@ static int patch_alc260(struct hda_codec *codec)
7411#define ALC1200_DIGOUT_NID 0x10 7684#define ALC1200_DIGOUT_NID 0x10
7412 7685
7413 7686
7414static struct hda_channel_mode alc882_ch_modes[1] = { 7687static const struct hda_channel_mode alc882_ch_modes[1] = {
7415 { 8, NULL } 7688 { 8, NULL }
7416}; 7689};
7417 7690
7418/* DACs */ 7691/* DACs */
7419static hda_nid_t alc882_dac_nids[4] = { 7692static const hda_nid_t alc882_dac_nids[4] = {
7420 /* front, rear, clfe, rear_surr */ 7693 /* front, rear, clfe, rear_surr */
7421 0x02, 0x03, 0x04, 0x05 7694 0x02, 0x03, 0x04, 0x05
7422}; 7695};
@@ -7426,20 +7699,20 @@ static hda_nid_t alc882_dac_nids[4] = {
7426#define alc882_adc_nids alc880_adc_nids 7699#define alc882_adc_nids alc880_adc_nids
7427#define alc882_adc_nids_alt alc880_adc_nids_alt 7700#define alc882_adc_nids_alt alc880_adc_nids_alt
7428#define alc883_adc_nids alc882_adc_nids_alt 7701#define alc883_adc_nids alc882_adc_nids_alt
7429static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 }; 7702static const hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
7430static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 }; 7703static const hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
7431#define alc889_adc_nids alc880_adc_nids 7704#define alc889_adc_nids alc880_adc_nids
7432 7705
7433static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 }; 7706static const hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
7434static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 }; 7707static const hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
7435#define alc883_capsrc_nids alc882_capsrc_nids_alt 7708#define alc883_capsrc_nids alc882_capsrc_nids_alt
7436static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 }; 7709static const hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
7437#define alc889_capsrc_nids alc882_capsrc_nids 7710#define alc889_capsrc_nids alc882_capsrc_nids
7438 7711
7439/* input MUX */ 7712/* input MUX */
7440/* FIXME: should be a matrix-type input source selection */ 7713/* FIXME: should be a matrix-type input source selection */
7441 7714
7442static struct hda_input_mux alc882_capture_source = { 7715static const struct hda_input_mux alc882_capture_source = {
7443 .num_items = 4, 7716 .num_items = 4,
7444 .items = { 7717 .items = {
7445 { "Mic", 0x0 }, 7718 { "Mic", 0x0 },
@@ -7451,7 +7724,7 @@ static struct hda_input_mux alc882_capture_source = {
7451 7724
7452#define alc883_capture_source alc882_capture_source 7725#define alc883_capture_source alc882_capture_source
7453 7726
7454static struct hda_input_mux alc889_capture_source = { 7727static const struct hda_input_mux alc889_capture_source = {
7455 .num_items = 3, 7728 .num_items = 3,
7456 .items = { 7729 .items = {
7457 { "Front Mic", 0x0 }, 7730 { "Front Mic", 0x0 },
@@ -7460,7 +7733,7 @@ static struct hda_input_mux alc889_capture_source = {
7460 }, 7733 },
7461}; 7734};
7462 7735
7463static struct hda_input_mux mb5_capture_source = { 7736static const struct hda_input_mux mb5_capture_source = {
7464 .num_items = 3, 7737 .num_items = 3,
7465 .items = { 7738 .items = {
7466 { "Mic", 0x1 }, 7739 { "Mic", 0x1 },
@@ -7469,7 +7742,7 @@ static struct hda_input_mux mb5_capture_source = {
7469 }, 7742 },
7470}; 7743};
7471 7744
7472static struct hda_input_mux macmini3_capture_source = { 7745static const struct hda_input_mux macmini3_capture_source = {
7473 .num_items = 2, 7746 .num_items = 2,
7474 .items = { 7747 .items = {
7475 { "Line", 0x2 }, 7748 { "Line", 0x2 },
@@ -7477,7 +7750,7 @@ static struct hda_input_mux macmini3_capture_source = {
7477 }, 7750 },
7478}; 7751};
7479 7752
7480static struct hda_input_mux alc883_3stack_6ch_intel = { 7753static const struct hda_input_mux alc883_3stack_6ch_intel = {
7481 .num_items = 4, 7754 .num_items = 4,
7482 .items = { 7755 .items = {
7483 { "Mic", 0x1 }, 7756 { "Mic", 0x1 },
@@ -7487,7 +7760,7 @@ static struct hda_input_mux alc883_3stack_6ch_intel = {
7487 }, 7760 },
7488}; 7761};
7489 7762
7490static struct hda_input_mux alc883_lenovo_101e_capture_source = { 7763static const struct hda_input_mux alc883_lenovo_101e_capture_source = {
7491 .num_items = 2, 7764 .num_items = 2,
7492 .items = { 7765 .items = {
7493 { "Mic", 0x1 }, 7766 { "Mic", 0x1 },
@@ -7495,7 +7768,7 @@ static struct hda_input_mux alc883_lenovo_101e_capture_source = {
7495 }, 7768 },
7496}; 7769};
7497 7770
7498static struct hda_input_mux alc883_lenovo_nb0763_capture_source = { 7771static const struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
7499 .num_items = 4, 7772 .num_items = 4,
7500 .items = { 7773 .items = {
7501 { "Mic", 0x0 }, 7774 { "Mic", 0x0 },
@@ -7505,7 +7778,7 @@ static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
7505 }, 7778 },
7506}; 7779};
7507 7780
7508static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = { 7781static const struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
7509 .num_items = 2, 7782 .num_items = 2,
7510 .items = { 7783 .items = {
7511 { "Mic", 0x0 }, 7784 { "Mic", 0x0 },
@@ -7513,7 +7786,7 @@ static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
7513 }, 7786 },
7514}; 7787};
7515 7788
7516static struct hda_input_mux alc883_lenovo_sky_capture_source = { 7789static const struct hda_input_mux alc883_lenovo_sky_capture_source = {
7517 .num_items = 3, 7790 .num_items = 3,
7518 .items = { 7791 .items = {
7519 { "Mic", 0x0 }, 7792 { "Mic", 0x0 },
@@ -7522,7 +7795,7 @@ static struct hda_input_mux alc883_lenovo_sky_capture_source = {
7522 }, 7795 },
7523}; 7796};
7524 7797
7525static struct hda_input_mux alc883_asus_eee1601_capture_source = { 7798static const struct hda_input_mux alc883_asus_eee1601_capture_source = {
7526 .num_items = 2, 7799 .num_items = 2,
7527 .items = { 7800 .items = {
7528 { "Mic", 0x0 }, 7801 { "Mic", 0x0 },
@@ -7530,7 +7803,7 @@ static struct hda_input_mux alc883_asus_eee1601_capture_source = {
7530 }, 7803 },
7531}; 7804};
7532 7805
7533static struct hda_input_mux alc889A_mb31_capture_source = { 7806static const struct hda_input_mux alc889A_mb31_capture_source = {
7534 .num_items = 2, 7807 .num_items = 2,
7535 .items = { 7808 .items = {
7536 { "Mic", 0x0 }, 7809 { "Mic", 0x0 },
@@ -7541,7 +7814,7 @@ static struct hda_input_mux alc889A_mb31_capture_source = {
7541 }, 7814 },
7542}; 7815};
7543 7816
7544static struct hda_input_mux alc889A_imac91_capture_source = { 7817static const struct hda_input_mux alc889A_imac91_capture_source = {
7545 .num_items = 2, 7818 .num_items = 2,
7546 .items = { 7819 .items = {
7547 { "Mic", 0x01 }, 7820 { "Mic", 0x01 },
@@ -7552,14 +7825,14 @@ static struct hda_input_mux alc889A_imac91_capture_source = {
7552/* 7825/*
7553 * 2ch mode 7826 * 2ch mode
7554 */ 7827 */
7555static struct hda_channel_mode alc883_3ST_2ch_modes[1] = { 7828static const struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
7556 { 2, NULL } 7829 { 2, NULL }
7557}; 7830};
7558 7831
7559/* 7832/*
7560 * 2ch mode 7833 * 2ch mode
7561 */ 7834 */
7562static struct hda_verb alc882_3ST_ch2_init[] = { 7835static const struct hda_verb alc882_3ST_ch2_init[] = {
7563 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 7836 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7564 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 7837 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7565 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 7838 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
@@ -7570,7 +7843,7 @@ static struct hda_verb alc882_3ST_ch2_init[] = {
7570/* 7843/*
7571 * 4ch mode 7844 * 4ch mode
7572 */ 7845 */
7573static struct hda_verb alc882_3ST_ch4_init[] = { 7846static const struct hda_verb alc882_3ST_ch4_init[] = {
7574 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 7847 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7575 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 7848 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7576 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7849 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
@@ -7582,7 +7855,7 @@ static struct hda_verb alc882_3ST_ch4_init[] = {
7582/* 7855/*
7583 * 6ch mode 7856 * 6ch mode
7584 */ 7857 */
7585static struct hda_verb alc882_3ST_ch6_init[] = { 7858static const struct hda_verb alc882_3ST_ch6_init[] = {
7586 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7859 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7587 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 7860 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7588 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 7861 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
@@ -7592,7 +7865,7 @@ static struct hda_verb alc882_3ST_ch6_init[] = {
7592 { } /* end */ 7865 { } /* end */
7593}; 7866};
7594 7867
7595static struct hda_channel_mode alc882_3ST_6ch_modes[3] = { 7868static const struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
7596 { 2, alc882_3ST_ch2_init }, 7869 { 2, alc882_3ST_ch2_init },
7597 { 4, alc882_3ST_ch4_init }, 7870 { 4, alc882_3ST_ch4_init },
7598 { 6, alc882_3ST_ch6_init }, 7871 { 6, alc882_3ST_ch6_init },
@@ -7603,7 +7876,7 @@ static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
7603/* 7876/*
7604 * 2ch mode 7877 * 2ch mode
7605 */ 7878 */
7606static struct hda_verb alc883_3ST_ch2_clevo_init[] = { 7879static const struct hda_verb alc883_3ST_ch2_clevo_init[] = {
7607 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, 7880 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
7608 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 7881 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7609 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 7882 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
@@ -7615,7 +7888,7 @@ static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
7615/* 7888/*
7616 * 4ch mode 7889 * 4ch mode
7617 */ 7890 */
7618static struct hda_verb alc883_3ST_ch4_clevo_init[] = { 7891static const struct hda_verb alc883_3ST_ch4_clevo_init[] = {
7619 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7892 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7620 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 7893 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7621 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 7894 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
@@ -7628,7 +7901,7 @@ static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
7628/* 7901/*
7629 * 6ch mode 7902 * 6ch mode
7630 */ 7903 */
7631static struct hda_verb alc883_3ST_ch6_clevo_init[] = { 7904static const struct hda_verb alc883_3ST_ch6_clevo_init[] = {
7632 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7905 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7633 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7906 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7634 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 7907 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
@@ -7639,7 +7912,7 @@ static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
7639 { } /* end */ 7912 { } /* end */
7640}; 7913};
7641 7914
7642static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = { 7915static const struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
7643 { 2, alc883_3ST_ch2_clevo_init }, 7916 { 2, alc883_3ST_ch2_clevo_init },
7644 { 4, alc883_3ST_ch4_clevo_init }, 7917 { 4, alc883_3ST_ch4_clevo_init },
7645 { 6, alc883_3ST_ch6_clevo_init }, 7918 { 6, alc883_3ST_ch6_clevo_init },
@@ -7649,7 +7922,7 @@ static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
7649/* 7922/*
7650 * 6ch mode 7923 * 6ch mode
7651 */ 7924 */
7652static struct hda_verb alc882_sixstack_ch6_init[] = { 7925static const struct hda_verb alc882_sixstack_ch6_init[] = {
7653 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 7926 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7654 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7927 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7655 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7928 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
@@ -7660,7 +7933,7 @@ static struct hda_verb alc882_sixstack_ch6_init[] = {
7660/* 7933/*
7661 * 8ch mode 7934 * 8ch mode
7662 */ 7935 */
7663static struct hda_verb alc882_sixstack_ch8_init[] = { 7936static const struct hda_verb alc882_sixstack_ch8_init[] = {
7664 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7937 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7665 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7938 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7666 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7939 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
@@ -7668,7 +7941,7 @@ static struct hda_verb alc882_sixstack_ch8_init[] = {
7668 { } /* end */ 7941 { } /* end */
7669}; 7942};
7670 7943
7671static struct hda_channel_mode alc882_sixstack_modes[2] = { 7944static const struct hda_channel_mode alc882_sixstack_modes[2] = {
7672 { 6, alc882_sixstack_ch6_init }, 7945 { 6, alc882_sixstack_ch6_init },
7673 { 8, alc882_sixstack_ch8_init }, 7946 { 8, alc882_sixstack_ch8_init },
7674}; 7947};
@@ -7676,7 +7949,7 @@ static struct hda_channel_mode alc882_sixstack_modes[2] = {
7676 7949
7677/* Macbook Air 2,1 */ 7950/* Macbook Air 2,1 */
7678 7951
7679static struct hda_channel_mode alc885_mba21_ch_modes[1] = { 7952static const struct hda_channel_mode alc885_mba21_ch_modes[1] = {
7680 { 2, NULL }, 7953 { 2, NULL },
7681}; 7954};
7682 7955
@@ -7687,7 +7960,7 @@ static struct hda_channel_mode alc885_mba21_ch_modes[1] = {
7687/* 7960/*
7688 * 2ch mode 7961 * 2ch mode
7689 */ 7962 */
7690static struct hda_verb alc885_mbp_ch2_init[] = { 7963static const struct hda_verb alc885_mbp_ch2_init[] = {
7691 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 7964 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7692 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7965 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7693 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7966 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
@@ -7697,7 +7970,7 @@ static struct hda_verb alc885_mbp_ch2_init[] = {
7697/* 7970/*
7698 * 4ch mode 7971 * 4ch mode
7699 */ 7972 */
7700static struct hda_verb alc885_mbp_ch4_init[] = { 7973static const struct hda_verb alc885_mbp_ch4_init[] = {
7701 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 7974 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7702 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7975 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7703 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 7976 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
@@ -7706,7 +7979,7 @@ static struct hda_verb alc885_mbp_ch4_init[] = {
7706 { } /* end */ 7979 { } /* end */
7707}; 7980};
7708 7981
7709static struct hda_channel_mode alc885_mbp_4ch_modes[2] = { 7982static const struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
7710 { 2, alc885_mbp_ch2_init }, 7983 { 2, alc885_mbp_ch2_init },
7711 { 4, alc885_mbp_ch4_init }, 7984 { 4, alc885_mbp_ch4_init },
7712}; 7985};
@@ -7716,7 +7989,7 @@ static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
7716 * Speakers/Woofer/HP = Front 7989 * Speakers/Woofer/HP = Front
7717 * LineIn = Input 7990 * LineIn = Input
7718 */ 7991 */
7719static struct hda_verb alc885_mb5_ch2_init[] = { 7992static const struct hda_verb alc885_mb5_ch2_init[] = {
7720 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 7993 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7721 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7994 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7722 { } /* end */ 7995 { } /* end */
@@ -7728,14 +8001,14 @@ static struct hda_verb alc885_mb5_ch2_init[] = {
7728 * Woofer = LFE 8001 * Woofer = LFE
7729 * LineIn = Surround 8002 * LineIn = Surround
7730 */ 8003 */
7731static struct hda_verb alc885_mb5_ch6_init[] = { 8004static const struct hda_verb alc885_mb5_ch6_init[] = {
7732 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8005 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7733 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8006 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7734 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 8007 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7735 { } /* end */ 8008 { } /* end */
7736}; 8009};
7737 8010
7738static struct hda_channel_mode alc885_mb5_6ch_modes[2] = { 8011static const struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
7739 { 2, alc885_mb5_ch2_init }, 8012 { 2, alc885_mb5_ch2_init },
7740 { 6, alc885_mb5_ch6_init }, 8013 { 6, alc885_mb5_ch6_init },
7741}; 8014};
@@ -7745,7 +8018,7 @@ static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
7745/* 8018/*
7746 * 2ch mode 8019 * 2ch mode
7747 */ 8020 */
7748static struct hda_verb alc883_4ST_ch2_init[] = { 8021static const struct hda_verb alc883_4ST_ch2_init[] = {
7749 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8022 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7750 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 8023 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7751 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 8024 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
@@ -7758,7 +8031,7 @@ static struct hda_verb alc883_4ST_ch2_init[] = {
7758/* 8031/*
7759 * 4ch mode 8032 * 4ch mode
7760 */ 8033 */
7761static struct hda_verb alc883_4ST_ch4_init[] = { 8034static const struct hda_verb alc883_4ST_ch4_init[] = {
7762 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8035 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7763 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 8036 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7764 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 8037 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
@@ -7772,7 +8045,7 @@ static struct hda_verb alc883_4ST_ch4_init[] = {
7772/* 8045/*
7773 * 6ch mode 8046 * 6ch mode
7774 */ 8047 */
7775static struct hda_verb alc883_4ST_ch6_init[] = { 8048static const struct hda_verb alc883_4ST_ch6_init[] = {
7776 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8049 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7777 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 8050 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7778 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8051 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
@@ -7787,7 +8060,7 @@ static struct hda_verb alc883_4ST_ch6_init[] = {
7787/* 8060/*
7788 * 8ch mode 8061 * 8ch mode
7789 */ 8062 */
7790static struct hda_verb alc883_4ST_ch8_init[] = { 8063static const struct hda_verb alc883_4ST_ch8_init[] = {
7791 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8064 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7792 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 8065 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7793 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 }, 8066 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
@@ -7800,7 +8073,7 @@ static struct hda_verb alc883_4ST_ch8_init[] = {
7800 { } /* end */ 8073 { } /* end */
7801}; 8074};
7802 8075
7803static struct hda_channel_mode alc883_4ST_8ch_modes[4] = { 8076static const struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
7804 { 2, alc883_4ST_ch2_init }, 8077 { 2, alc883_4ST_ch2_init },
7805 { 4, alc883_4ST_ch4_init }, 8078 { 4, alc883_4ST_ch4_init },
7806 { 6, alc883_4ST_ch6_init }, 8079 { 6, alc883_4ST_ch6_init },
@@ -7811,7 +8084,7 @@ static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
7811/* 8084/*
7812 * 2ch mode 8085 * 2ch mode
7813 */ 8086 */
7814static struct hda_verb alc883_3ST_ch2_intel_init[] = { 8087static const struct hda_verb alc883_3ST_ch2_intel_init[] = {
7815 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 8088 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7816 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 8089 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7817 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 8090 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
@@ -7822,7 +8095,7 @@ static struct hda_verb alc883_3ST_ch2_intel_init[] = {
7822/* 8095/*
7823 * 4ch mode 8096 * 4ch mode
7824 */ 8097 */
7825static struct hda_verb alc883_3ST_ch4_intel_init[] = { 8098static const struct hda_verb alc883_3ST_ch4_intel_init[] = {
7826 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 8099 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7827 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 8100 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7828 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8101 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
@@ -7834,7 +8107,7 @@ static struct hda_verb alc883_3ST_ch4_intel_init[] = {
7834/* 8107/*
7835 * 6ch mode 8108 * 6ch mode
7836 */ 8109 */
7837static struct hda_verb alc883_3ST_ch6_intel_init[] = { 8110static const struct hda_verb alc883_3ST_ch6_intel_init[] = {
7838 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8111 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7839 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 8112 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7840 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 }, 8113 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
@@ -7844,7 +8117,7 @@ static struct hda_verb alc883_3ST_ch6_intel_init[] = {
7844 { } /* end */ 8117 { } /* end */
7845}; 8118};
7846 8119
7847static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = { 8120static const struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
7848 { 2, alc883_3ST_ch2_intel_init }, 8121 { 2, alc883_3ST_ch2_intel_init },
7849 { 4, alc883_3ST_ch4_intel_init }, 8122 { 4, alc883_3ST_ch4_intel_init },
7850 { 6, alc883_3ST_ch6_intel_init }, 8123 { 6, alc883_3ST_ch6_intel_init },
@@ -7853,7 +8126,7 @@ static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
7853/* 8126/*
7854 * 2ch mode 8127 * 2ch mode
7855 */ 8128 */
7856static struct hda_verb alc889_ch2_intel_init[] = { 8129static const struct hda_verb alc889_ch2_intel_init[] = {
7857 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 }, 8130 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7858 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 }, 8131 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
7859 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 }, 8132 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
@@ -7866,7 +8139,7 @@ static struct hda_verb alc889_ch2_intel_init[] = {
7866/* 8139/*
7867 * 6ch mode 8140 * 6ch mode
7868 */ 8141 */
7869static struct hda_verb alc889_ch6_intel_init[] = { 8142static const struct hda_verb alc889_ch6_intel_init[] = {
7870 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 }, 8143 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7871 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 }, 8144 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7872 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 }, 8145 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
@@ -7879,7 +8152,7 @@ static struct hda_verb alc889_ch6_intel_init[] = {
7879/* 8152/*
7880 * 8ch mode 8153 * 8ch mode
7881 */ 8154 */
7882static struct hda_verb alc889_ch8_intel_init[] = { 8155static const struct hda_verb alc889_ch8_intel_init[] = {
7883 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 }, 8156 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7884 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 }, 8157 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7885 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 }, 8158 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
@@ -7890,7 +8163,7 @@ static struct hda_verb alc889_ch8_intel_init[] = {
7890 { } /* end */ 8163 { } /* end */
7891}; 8164};
7892 8165
7893static struct hda_channel_mode alc889_8ch_intel_modes[3] = { 8166static const struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7894 { 2, alc889_ch2_intel_init }, 8167 { 2, alc889_ch2_intel_init },
7895 { 6, alc889_ch6_intel_init }, 8168 { 6, alc889_ch6_intel_init },
7896 { 8, alc889_ch8_intel_init }, 8169 { 8, alc889_ch8_intel_init },
@@ -7899,7 +8172,7 @@ static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7899/* 8172/*
7900 * 6ch mode 8173 * 6ch mode
7901 */ 8174 */
7902static struct hda_verb alc883_sixstack_ch6_init[] = { 8175static const struct hda_verb alc883_sixstack_ch6_init[] = {
7903 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 8176 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7904 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8177 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7905 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8178 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
@@ -7910,7 +8183,7 @@ static struct hda_verb alc883_sixstack_ch6_init[] = {
7910/* 8183/*
7911 * 8ch mode 8184 * 8ch mode
7912 */ 8185 */
7913static struct hda_verb alc883_sixstack_ch8_init[] = { 8186static const struct hda_verb alc883_sixstack_ch8_init[] = {
7914 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8187 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7915 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8188 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7916 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8189 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
@@ -7918,7 +8191,7 @@ static struct hda_verb alc883_sixstack_ch8_init[] = {
7918 { } /* end */ 8191 { } /* end */
7919}; 8192};
7920 8193
7921static struct hda_channel_mode alc883_sixstack_modes[2] = { 8194static const struct hda_channel_mode alc883_sixstack_modes[2] = {
7922 { 6, alc883_sixstack_ch6_init }, 8195 { 6, alc883_sixstack_ch6_init },
7923 { 8, alc883_sixstack_ch8_init }, 8196 { 8, alc883_sixstack_ch8_init },
7924}; 8197};
@@ -7927,7 +8200,7 @@ static struct hda_channel_mode alc883_sixstack_modes[2] = {
7927/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17 8200/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
7928 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b 8201 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
7929 */ 8202 */
7930static struct snd_kcontrol_new alc882_base_mixer[] = { 8203static const struct snd_kcontrol_new alc882_base_mixer[] = {
7931 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8204 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7932 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8205 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7933 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 8206 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -7954,14 +8227,14 @@ static struct snd_kcontrol_new alc882_base_mixer[] = {
7954 8227
7955/* Macbook Air 2,1 same control for HP and internal Speaker */ 8228/* Macbook Air 2,1 same control for HP and internal Speaker */
7956 8229
7957static struct snd_kcontrol_new alc885_mba21_mixer[] = { 8230static const struct snd_kcontrol_new alc885_mba21_mixer[] = {
7958 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 8231 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7959 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT), 8232 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
7960 { } 8233 { }
7961}; 8234};
7962 8235
7963 8236
7964static struct snd_kcontrol_new alc885_mbp3_mixer[] = { 8237static const struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7965 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 8238 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7966 HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT), 8239 HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7967 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT), 8240 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
@@ -7976,7 +8249,7 @@ static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7976 { } /* end */ 8249 { } /* end */
7977}; 8250};
7978 8251
7979static struct snd_kcontrol_new alc885_mb5_mixer[] = { 8252static const struct snd_kcontrol_new alc885_mb5_mixer[] = {
7980 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 8253 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7981 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), 8254 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7982 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), 8255 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
@@ -7994,7 +8267,7 @@ static struct snd_kcontrol_new alc885_mb5_mixer[] = {
7994 { } /* end */ 8267 { } /* end */
7995}; 8268};
7996 8269
7997static struct snd_kcontrol_new alc885_macmini3_mixer[] = { 8270static const struct snd_kcontrol_new alc885_macmini3_mixer[] = {
7998 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 8271 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7999 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), 8272 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8000 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), 8273 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
@@ -8009,14 +8282,14 @@ static struct snd_kcontrol_new alc885_macmini3_mixer[] = {
8009 { } /* end */ 8282 { } /* end */
8010}; 8283};
8011 8284
8012static struct snd_kcontrol_new alc885_imac91_mixer[] = { 8285static const struct snd_kcontrol_new alc885_imac91_mixer[] = {
8013 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 8286 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8014 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT), 8287 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
8015 { } /* end */ 8288 { } /* end */
8016}; 8289};
8017 8290
8018 8291
8019static struct snd_kcontrol_new alc882_w2jc_mixer[] = { 8292static const struct snd_kcontrol_new alc882_w2jc_mixer[] = {
8020 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8293 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8021 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8294 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8022 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 8295 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
@@ -8029,7 +8302,7 @@ static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
8029 { } /* end */ 8302 { } /* end */
8030}; 8303};
8031 8304
8032static struct snd_kcontrol_new alc882_targa_mixer[] = { 8305static const struct snd_kcontrol_new alc882_targa_mixer[] = {
8033 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8306 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8034 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8307 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8035 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 8308 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
@@ -8049,7 +8322,7 @@ static struct snd_kcontrol_new alc882_targa_mixer[] = {
8049/* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ??? 8322/* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
8050 * Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c 8323 * Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
8051 */ 8324 */
8052static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = { 8325static const struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
8053 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8326 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8054 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 8327 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8055 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 8328 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
@@ -8066,7 +8339,7 @@ static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
8066 { } /* end */ 8339 { } /* end */
8067}; 8340};
8068 8341
8069static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = { 8342static const struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
8070 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8343 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8071 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8344 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8072 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 8345 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
@@ -8080,7 +8353,7 @@ static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
8080 { } /* end */ 8353 { } /* end */
8081}; 8354};
8082 8355
8083static struct snd_kcontrol_new alc882_chmode_mixer[] = { 8356static const struct snd_kcontrol_new alc882_chmode_mixer[] = {
8084 { 8357 {
8085 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 8358 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8086 .name = "Channel Mode", 8359 .name = "Channel Mode",
@@ -8091,7 +8364,7 @@ static struct snd_kcontrol_new alc882_chmode_mixer[] = {
8091 { } /* end */ 8364 { } /* end */
8092}; 8365};
8093 8366
8094static struct hda_verb alc882_base_init_verbs[] = { 8367static const struct hda_verb alc882_base_init_verbs[] = {
8095 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 8368 /* Front mixer: unmute input/output amp left and right (volume = 0) */
8096 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 8369 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8097 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 8370 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
@@ -8153,7 +8426,7 @@ static struct hda_verb alc882_base_init_verbs[] = {
8153 { } 8426 { }
8154}; 8427};
8155 8428
8156static struct hda_verb alc882_adc1_init_verbs[] = { 8429static const struct hda_verb alc882_adc1_init_verbs[] = {
8157 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 8430 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
8158 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8431 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8159 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 8432 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
@@ -8165,26 +8438,26 @@ static struct hda_verb alc882_adc1_init_verbs[] = {
8165 { } 8438 { }
8166}; 8439};
8167 8440
8168static struct hda_verb alc882_eapd_verbs[] = { 8441static const struct hda_verb alc882_eapd_verbs[] = {
8169 /* change to EAPD mode */ 8442 /* change to EAPD mode */
8170 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 8443 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8171 {0x20, AC_VERB_SET_PROC_COEF, 0x3060}, 8444 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
8172 { } 8445 { }
8173}; 8446};
8174 8447
8175static struct hda_verb alc889_eapd_verbs[] = { 8448static const struct hda_verb alc889_eapd_verbs[] = {
8176 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 8449 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
8177 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 8450 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
8178 { } 8451 { }
8179}; 8452};
8180 8453
8181static struct hda_verb alc_hp15_unsol_verbs[] = { 8454static const struct hda_verb alc_hp15_unsol_verbs[] = {
8182 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 8455 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
8183 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8456 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8184 {} 8457 {}
8185}; 8458};
8186 8459
8187static struct hda_verb alc885_init_verbs[] = { 8460static const struct hda_verb alc885_init_verbs[] = {
8188 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 8461 /* Front mixer: unmute input/output amp left and right (volume = 0) */
8189 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8462 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8190 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8463 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
@@ -8243,7 +8516,7 @@ static struct hda_verb alc885_init_verbs[] = {
8243 { } 8516 { }
8244}; 8517};
8245 8518
8246static struct hda_verb alc885_init_input_verbs[] = { 8519static const struct hda_verb alc885_init_input_verbs[] = {
8247 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8520 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8248 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 8521 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
8249 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 8522 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
@@ -8252,7 +8525,7 @@ static struct hda_verb alc885_init_input_verbs[] = {
8252 8525
8253 8526
8254/* Unmute Selector 24h and set the default input to front mic */ 8527/* Unmute Selector 24h and set the default input to front mic */
8255static struct hda_verb alc889_init_input_verbs[] = { 8528static const struct hda_verb alc889_init_input_verbs[] = {
8256 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00}, 8529 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
8257 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8530 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8258 { } 8531 { }
@@ -8262,7 +8535,7 @@ static struct hda_verb alc889_init_input_verbs[] = {
8262#define alc883_init_verbs alc882_base_init_verbs 8535#define alc883_init_verbs alc882_base_init_verbs
8263 8536
8264/* Mac Pro test */ 8537/* Mac Pro test */
8265static struct snd_kcontrol_new alc882_macpro_mixer[] = { 8538static const struct snd_kcontrol_new alc882_macpro_mixer[] = {
8266 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8539 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8267 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8540 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8268 HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT), 8541 HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
@@ -8275,7 +8548,7 @@ static struct snd_kcontrol_new alc882_macpro_mixer[] = {
8275 { } /* end */ 8548 { } /* end */
8276}; 8549};
8277 8550
8278static struct hda_verb alc882_macpro_init_verbs[] = { 8551static const struct hda_verb alc882_macpro_init_verbs[] = {
8279 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 8552 /* Front mixer: unmute input/output amp left and right (volume = 0) */
8280 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 8553 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8281 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 8554 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
@@ -8327,7 +8600,7 @@ static struct hda_verb alc882_macpro_init_verbs[] = {
8327}; 8600};
8328 8601
8329/* Macbook 5,1 */ 8602/* Macbook 5,1 */
8330static struct hda_verb alc885_mb5_init_verbs[] = { 8603static const struct hda_verb alc885_mb5_init_verbs[] = {
8331 /* DACs */ 8604 /* DACs */
8332 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8605 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8333 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8606 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
@@ -8376,7 +8649,7 @@ static struct hda_verb alc885_mb5_init_verbs[] = {
8376}; 8649};
8377 8650
8378/* Macmini 3,1 */ 8651/* Macmini 3,1 */
8379static struct hda_verb alc885_macmini3_init_verbs[] = { 8652static const struct hda_verb alc885_macmini3_init_verbs[] = {
8380 /* DACs */ 8653 /* DACs */
8381 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8654 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8382 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8655 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
@@ -8423,7 +8696,7 @@ static struct hda_verb alc885_macmini3_init_verbs[] = {
8423}; 8696};
8424 8697
8425 8698
8426static struct hda_verb alc885_mba21_init_verbs[] = { 8699static const struct hda_verb alc885_mba21_init_verbs[] = {
8427 /*Internal and HP Speaker Mixer*/ 8700 /*Internal and HP Speaker Mixer*/
8428 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 8701 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8429 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8702 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
@@ -8446,7 +8719,7 @@ static struct hda_verb alc885_mba21_init_verbs[] = {
8446 8719
8447 8720
8448/* Macbook Pro rev3 */ 8721/* Macbook Pro rev3 */
8449static struct hda_verb alc885_mbp3_init_verbs[] = { 8722static const struct hda_verb alc885_mbp3_init_verbs[] = {
8450 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 8723 /* Front mixer: unmute input/output amp left and right (volume = 0) */
8451 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 8724 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8452 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 8725 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
@@ -8510,7 +8783,7 @@ static struct hda_verb alc885_mbp3_init_verbs[] = {
8510}; 8783};
8511 8784
8512/* iMac 9,1 */ 8785/* iMac 9,1 */
8513static struct hda_verb alc885_imac91_init_verbs[] = { 8786static const struct hda_verb alc885_imac91_init_verbs[] = {
8514 /* Internal Speaker Pin (0x0c) */ 8787 /* Internal Speaker Pin (0x0c) */
8515 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) }, 8788 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8516 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8789 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
@@ -8565,14 +8838,14 @@ static struct hda_verb alc885_imac91_init_verbs[] = {
8565}; 8838};
8566 8839
8567/* iMac 24 mixer. */ 8840/* iMac 24 mixer. */
8568static struct snd_kcontrol_new alc885_imac24_mixer[] = { 8841static const struct snd_kcontrol_new alc885_imac24_mixer[] = {
8569 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 8842 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8570 HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT), 8843 HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
8571 { } /* end */ 8844 { } /* end */
8572}; 8845};
8573 8846
8574/* iMac 24 init verbs. */ 8847/* iMac 24 init verbs. */
8575static struct hda_verb alc885_imac24_init_verbs[] = { 8848static const struct hda_verb alc885_imac24_init_verbs[] = {
8576 /* Internal speakers: output 0 (0x0c) */ 8849 /* Internal speakers: output 0 (0x0c) */
8577 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8850 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8578 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8851 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
@@ -8600,6 +8873,8 @@ static void alc885_imac24_setup(struct hda_codec *codec)
8600 spec->autocfg.hp_pins[0] = 0x14; 8873 spec->autocfg.hp_pins[0] = 0x14;
8601 spec->autocfg.speaker_pins[0] = 0x18; 8874 spec->autocfg.speaker_pins[0] = 0x18;
8602 spec->autocfg.speaker_pins[1] = 0x1a; 8875 spec->autocfg.speaker_pins[1] = 0x1a;
8876 spec->automute = 1;
8877 spec->automute_mode = ALC_AUTOMUTE_AMP;
8603} 8878}
8604 8879
8605#define alc885_mb5_setup alc885_imac24_setup 8880#define alc885_mb5_setup alc885_imac24_setup
@@ -8612,6 +8887,8 @@ static void alc885_mba21_setup(struct hda_codec *codec)
8612 8887
8613 spec->autocfg.hp_pins[0] = 0x14; 8888 spec->autocfg.hp_pins[0] = 0x14;
8614 spec->autocfg.speaker_pins[0] = 0x18; 8889 spec->autocfg.speaker_pins[0] = 0x18;
8890 spec->automute = 1;
8891 spec->automute_mode = ALC_AUTOMUTE_AMP;
8615} 8892}
8616 8893
8617 8894
@@ -8622,6 +8899,8 @@ static void alc885_mbp3_setup(struct hda_codec *codec)
8622 8899
8623 spec->autocfg.hp_pins[0] = 0x15; 8900 spec->autocfg.hp_pins[0] = 0x15;
8624 spec->autocfg.speaker_pins[0] = 0x14; 8901 spec->autocfg.speaker_pins[0] = 0x14;
8902 spec->automute = 1;
8903 spec->automute_mode = ALC_AUTOMUTE_AMP;
8625} 8904}
8626 8905
8627static void alc885_imac91_setup(struct hda_codec *codec) 8906static void alc885_imac91_setup(struct hda_codec *codec)
@@ -8631,9 +8910,11 @@ static void alc885_imac91_setup(struct hda_codec *codec)
8631 spec->autocfg.hp_pins[0] = 0x14; 8910 spec->autocfg.hp_pins[0] = 0x14;
8632 spec->autocfg.speaker_pins[0] = 0x18; 8911 spec->autocfg.speaker_pins[0] = 0x18;
8633 spec->autocfg.speaker_pins[1] = 0x1a; 8912 spec->autocfg.speaker_pins[1] = 0x1a;
8913 spec->automute = 1;
8914 spec->automute_mode = ALC_AUTOMUTE_AMP;
8634} 8915}
8635 8916
8636static struct hda_verb alc882_targa_verbs[] = { 8917static const struct hda_verb alc882_targa_verbs[] = {
8637 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8918 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8638 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8919 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8639 8920
@@ -8652,7 +8933,7 @@ static struct hda_verb alc882_targa_verbs[] = {
8652static void alc882_targa_automute(struct hda_codec *codec) 8933static void alc882_targa_automute(struct hda_codec *codec)
8653{ 8934{
8654 struct alc_spec *spec = codec->spec; 8935 struct alc_spec *spec = codec->spec;
8655 alc_automute_amp(codec); 8936 alc_hp_automute(codec);
8656 snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA, 8937 snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
8657 spec->jack_present ? 1 : 3); 8938 spec->jack_present ? 1 : 3);
8658} 8939}
@@ -8663,6 +8944,8 @@ static void alc882_targa_setup(struct hda_codec *codec)
8663 8944
8664 spec->autocfg.hp_pins[0] = 0x14; 8945 spec->autocfg.hp_pins[0] = 0x14;
8665 spec->autocfg.speaker_pins[0] = 0x1b; 8946 spec->autocfg.speaker_pins[0] = 0x1b;
8947 spec->automute = 1;
8948 spec->automute_mode = ALC_AUTOMUTE_AMP;
8666} 8949}
8667 8950
8668static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res) 8951static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
@@ -8671,7 +8954,7 @@ static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
8671 alc882_targa_automute(codec); 8954 alc882_targa_automute(codec);
8672} 8955}
8673 8956
8674static struct hda_verb alc882_asus_a7j_verbs[] = { 8957static const struct hda_verb alc882_asus_a7j_verbs[] = {
8675 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8958 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8676 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8959 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8677 8960
@@ -8689,7 +8972,7 @@ static struct hda_verb alc882_asus_a7j_verbs[] = {
8689 { } /* end */ 8972 { } /* end */
8690}; 8973};
8691 8974
8692static struct hda_verb alc882_asus_a7m_verbs[] = { 8975static const struct hda_verb alc882_asus_a7m_verbs[] = {
8693 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8976 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8694 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8977 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8695 8978
@@ -8750,13 +9033,13 @@ static void alc885_macpro_init_hook(struct hda_codec *codec)
8750static void alc885_imac24_init_hook(struct hda_codec *codec) 9033static void alc885_imac24_init_hook(struct hda_codec *codec)
8751{ 9034{
8752 alc885_macpro_init_hook(codec); 9035 alc885_macpro_init_hook(codec);
8753 alc_automute_amp(codec); 9036 alc_hp_automute(codec);
8754} 9037}
8755 9038
8756/* 9039/*
8757 * generic initialization of ADC, input mixers and output mixers 9040 * generic initialization of ADC, input mixers and output mixers
8758 */ 9041 */
8759static struct hda_verb alc883_auto_init_verbs[] = { 9042static const struct hda_verb alc883_auto_init_verbs[] = {
8760 /* 9043 /*
8761 * Unmute ADC0-2 and set the default input to mic-in 9044 * Unmute ADC0-2 and set the default input to mic-in
8762 */ 9045 */
@@ -8796,7 +9079,7 @@ static struct hda_verb alc883_auto_init_verbs[] = {
8796}; 9079};
8797 9080
8798/* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */ 9081/* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
8799static struct hda_verb alc889A_mb31_ch2_init[] = { 9082static const struct hda_verb alc889A_mb31_ch2_init[] = {
8800 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */ 9083 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
8801 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */ 9084 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8802 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */ 9085 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
@@ -8805,7 +9088,7 @@ static struct hda_verb alc889A_mb31_ch2_init[] = {
8805}; 9088};
8806 9089
8807/* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */ 9090/* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
8808static struct hda_verb alc889A_mb31_ch4_init[] = { 9091static const struct hda_verb alc889A_mb31_ch4_init[] = {
8809 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */ 9092 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
8810 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */ 9093 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8811 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */ 9094 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
@@ -8814,7 +9097,7 @@ static struct hda_verb alc889A_mb31_ch4_init[] = {
8814}; 9097};
8815 9098
8816/* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */ 9099/* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
8817static struct hda_verb alc889A_mb31_ch5_init[] = { 9100static const struct hda_verb alc889A_mb31_ch5_init[] = {
8818 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as rear */ 9101 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as rear */
8819 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */ 9102 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8820 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */ 9103 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
@@ -8823,7 +9106,7 @@ static struct hda_verb alc889A_mb31_ch5_init[] = {
8823}; 9106};
8824 9107
8825/* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */ 9108/* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
8826static struct hda_verb alc889A_mb31_ch6_init[] = { 9109static const struct hda_verb alc889A_mb31_ch6_init[] = {
8827 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as front */ 9110 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as front */
8828 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Subwoofer off */ 9111 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Subwoofer off */
8829 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */ 9112 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
@@ -8831,14 +9114,14 @@ static struct hda_verb alc889A_mb31_ch6_init[] = {
8831 { } /* end */ 9114 { } /* end */
8832}; 9115};
8833 9116
8834static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = { 9117static const struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
8835 { 2, alc889A_mb31_ch2_init }, 9118 { 2, alc889A_mb31_ch2_init },
8836 { 4, alc889A_mb31_ch4_init }, 9119 { 4, alc889A_mb31_ch4_init },
8837 { 5, alc889A_mb31_ch5_init }, 9120 { 5, alc889A_mb31_ch5_init },
8838 { 6, alc889A_mb31_ch6_init }, 9121 { 6, alc889A_mb31_ch6_init },
8839}; 9122};
8840 9123
8841static struct hda_verb alc883_medion_eapd_verbs[] = { 9124static const struct hda_verb alc883_medion_eapd_verbs[] = {
8842 /* eanable EAPD on medion laptop */ 9125 /* eanable EAPD on medion laptop */
8843 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 9126 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8844 {0x20, AC_VERB_SET_PROC_COEF, 0x3070}, 9127 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
@@ -8847,7 +9130,7 @@ static struct hda_verb alc883_medion_eapd_verbs[] = {
8847 9130
8848#define alc883_base_mixer alc882_base_mixer 9131#define alc883_base_mixer alc882_base_mixer
8849 9132
8850static struct snd_kcontrol_new alc883_mitac_mixer[] = { 9133static const struct snd_kcontrol_new alc883_mitac_mixer[] = {
8851 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9134 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8852 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 9135 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8853 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 9136 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
@@ -8864,7 +9147,7 @@ static struct snd_kcontrol_new alc883_mitac_mixer[] = {
8864 { } /* end */ 9147 { } /* end */
8865}; 9148};
8866 9149
8867static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = { 9150static const struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
8868 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9151 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8869 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 9152 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8870 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 9153 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -8878,7 +9161,7 @@ static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
8878 { } /* end */ 9161 { } /* end */
8879}; 9162};
8880 9163
8881static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = { 9164static const struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
8882 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9165 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8883 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 9166 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8884 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 9167 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -8892,7 +9175,7 @@ static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
8892 { } /* end */ 9175 { } /* end */
8893}; 9176};
8894 9177
8895static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = { 9178static const struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
8896 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9179 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8897 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 9180 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8898 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 9181 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
@@ -8909,7 +9192,7 @@ static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
8909 { } /* end */ 9192 { } /* end */
8910}; 9193};
8911 9194
8912static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = { 9195static const struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8913 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9196 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8914 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 9197 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8915 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 9198 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -8932,7 +9215,7 @@ static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8932 { } /* end */ 9215 { } /* end */
8933}; 9216};
8934 9217
8935static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = { 9218static const struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8936 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9219 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8937 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 9220 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8938 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 9221 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -8956,7 +9239,7 @@ static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8956 { } /* end */ 9239 { } /* end */
8957}; 9240};
8958 9241
8959static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = { 9242static const struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8960 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9243 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8961 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 9244 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8962 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 9245 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -8980,7 +9263,7 @@ static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8980 { } /* end */ 9263 { } /* end */
8981}; 9264};
8982 9265
8983static struct snd_kcontrol_new alc883_fivestack_mixer[] = { 9266static const struct snd_kcontrol_new alc883_fivestack_mixer[] = {
8984 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9267 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8985 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 9268 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8986 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 9269 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -9003,7 +9286,7 @@ static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
9003 { } /* end */ 9286 { } /* end */
9004}; 9287};
9005 9288
9006static struct snd_kcontrol_new alc883_targa_mixer[] = { 9289static const struct snd_kcontrol_new alc883_targa_mixer[] = {
9007 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9290 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9008 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 9291 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9009 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 9292 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
@@ -9024,7 +9307,7 @@ static struct snd_kcontrol_new alc883_targa_mixer[] = {
9024 { } /* end */ 9307 { } /* end */
9025}; 9308};
9026 9309
9027static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = { 9310static const struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
9028 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9311 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9029 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 9312 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9030 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 9313 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
@@ -9040,7 +9323,7 @@ static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
9040 { } /* end */ 9323 { } /* end */
9041}; 9324};
9042 9325
9043static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = { 9326static const struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
9044 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 9327 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
9045 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 9328 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
9046 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 9329 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
@@ -9049,7 +9332,7 @@ static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
9049 { } /* end */ 9332 { } /* end */
9050}; 9333};
9051 9334
9052static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = { 9335static const struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
9053 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9336 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9054 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 9337 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9055 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 9338 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -9061,7 +9344,7 @@ static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
9061 { } /* end */ 9344 { } /* end */
9062}; 9345};
9063 9346
9064static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = { 9347static const struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
9065 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9348 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9066 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT), 9349 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
9067 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 9350 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
@@ -9074,7 +9357,7 @@ static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
9074 { } /* end */ 9357 { } /* end */
9075}; 9358};
9076 9359
9077static struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = { 9360static const struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = {
9078 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9361 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9079 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 9362 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9080 HDA_CODEC_MUTE("Speaker Playback Switch", 0x15, 0x0, HDA_OUTPUT), 9363 HDA_CODEC_MUTE("Speaker Playback Switch", 0x15, 0x0, HDA_OUTPUT),
@@ -9084,7 +9367,7 @@ static struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = {
9084 { } /* end */ 9367 { } /* end */
9085}; 9368};
9086 9369
9087static struct hda_verb alc883_medion_wim2160_verbs[] = { 9370static const struct hda_verb alc883_medion_wim2160_verbs[] = {
9088 /* Unmute front mixer */ 9371 /* Unmute front mixer */
9089 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 9372 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9090 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 9373 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
@@ -9108,9 +9391,11 @@ static void alc883_medion_wim2160_setup(struct hda_codec *codec)
9108 9391
9109 spec->autocfg.hp_pins[0] = 0x1a; 9392 spec->autocfg.hp_pins[0] = 0x1a;
9110 spec->autocfg.speaker_pins[0] = 0x15; 9393 spec->autocfg.speaker_pins[0] = 0x15;
9394 spec->automute = 1;
9395 spec->automute_mode = ALC_AUTOMUTE_AMP;
9111} 9396}
9112 9397
9113static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = { 9398static const struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
9114 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9399 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9115 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 9400 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9116 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 9401 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
@@ -9122,7 +9407,7 @@ static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
9122 { } /* end */ 9407 { } /* end */
9123}; 9408};
9124 9409
9125static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = { 9410static const struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
9126 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9411 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9127 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 9412 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
9128 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 9413 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
@@ -9135,7 +9420,7 @@ static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
9135 { } /* end */ 9420 { } /* end */
9136}; 9421};
9137 9422
9138static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = { 9423static const struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
9139 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9424 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9140 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 9425 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9141 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT), 9426 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
@@ -9160,7 +9445,7 @@ static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
9160 { } /* end */ 9445 { } /* end */
9161}; 9446};
9162 9447
9163static struct snd_kcontrol_new alc889A_mb31_mixer[] = { 9448static const struct snd_kcontrol_new alc889A_mb31_mixer[] = {
9164 /* Output mixers */ 9449 /* Output mixers */
9165 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 9450 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
9166 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), 9451 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
@@ -9186,7 +9471,7 @@ static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
9186 { } /* end */ 9471 { } /* end */
9187}; 9472};
9188 9473
9189static struct snd_kcontrol_new alc883_vaiott_mixer[] = { 9474static const struct snd_kcontrol_new alc883_vaiott_mixer[] = {
9190 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9475 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9191 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 9476 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9192 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 9477 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
@@ -9196,7 +9481,7 @@ static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
9196 { } /* end */ 9481 { } /* end */
9197}; 9482};
9198 9483
9199static struct hda_bind_ctls alc883_bind_cap_vol = { 9484static const struct hda_bind_ctls alc883_bind_cap_vol = {
9200 .ops = &snd_hda_bind_vol, 9485 .ops = &snd_hda_bind_vol,
9201 .values = { 9486 .values = {
9202 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), 9487 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
@@ -9205,7 +9490,7 @@ static struct hda_bind_ctls alc883_bind_cap_vol = {
9205 }, 9490 },
9206}; 9491};
9207 9492
9208static struct hda_bind_ctls alc883_bind_cap_switch = { 9493static const struct hda_bind_ctls alc883_bind_cap_switch = {
9209 .ops = &snd_hda_bind_sw, 9494 .ops = &snd_hda_bind_sw,
9210 .values = { 9495 .values = {
9211 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), 9496 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
@@ -9214,7 +9499,7 @@ static struct hda_bind_ctls alc883_bind_cap_switch = {
9214 }, 9499 },
9215}; 9500};
9216 9501
9217static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = { 9502static const struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
9218 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9503 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9219 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 9504 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9220 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 9505 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
@@ -9226,7 +9511,7 @@ static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
9226 { } /* end */ 9511 { } /* end */
9227}; 9512};
9228 9513
9229static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = { 9514static const struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
9230 HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol), 9515 HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
9231 HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch), 9516 HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
9232 { 9517 {
@@ -9241,7 +9526,7 @@ static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
9241 { } /* end */ 9526 { } /* end */
9242}; 9527};
9243 9528
9244static struct snd_kcontrol_new alc883_chmode_mixer[] = { 9529static const struct snd_kcontrol_new alc883_chmode_mixer[] = {
9245 { 9530 {
9246 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 9531 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
9247 .name = "Channel Mode", 9532 .name = "Channel Mode",
@@ -9260,9 +9545,11 @@ static void alc883_mitac_setup(struct hda_codec *codec)
9260 spec->autocfg.hp_pins[0] = 0x15; 9545 spec->autocfg.hp_pins[0] = 0x15;
9261 spec->autocfg.speaker_pins[0] = 0x14; 9546 spec->autocfg.speaker_pins[0] = 0x14;
9262 spec->autocfg.speaker_pins[1] = 0x17; 9547 spec->autocfg.speaker_pins[1] = 0x17;
9548 spec->automute = 1;
9549 spec->automute_mode = ALC_AUTOMUTE_AMP;
9263} 9550}
9264 9551
9265static struct hda_verb alc883_mitac_verbs[] = { 9552static const struct hda_verb alc883_mitac_verbs[] = {
9266 /* HP */ 9553 /* HP */
9267 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 9554 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9268 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 9555 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
@@ -9277,7 +9564,7 @@ static struct hda_verb alc883_mitac_verbs[] = {
9277 { } /* end */ 9564 { } /* end */
9278}; 9565};
9279 9566
9280static struct hda_verb alc883_clevo_m540r_verbs[] = { 9567static const struct hda_verb alc883_clevo_m540r_verbs[] = {
9281 /* HP */ 9568 /* HP */
9282 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 9569 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9283 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 9570 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
@@ -9293,7 +9580,7 @@ static struct hda_verb alc883_clevo_m540r_verbs[] = {
9293 { } /* end */ 9580 { } /* end */
9294}; 9581};
9295 9582
9296static struct hda_verb alc883_clevo_m720_verbs[] = { 9583static const struct hda_verb alc883_clevo_m720_verbs[] = {
9297 /* HP */ 9584 /* HP */
9298 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 9585 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9299 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 9586 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
@@ -9308,7 +9595,7 @@ static struct hda_verb alc883_clevo_m720_verbs[] = {
9308 { } /* end */ 9595 { } /* end */
9309}; 9596};
9310 9597
9311static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = { 9598static const struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
9312 /* HP */ 9599 /* HP */
9313 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 9600 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
9314 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 9601 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
@@ -9322,7 +9609,7 @@ static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
9322 { } /* end */ 9609 { } /* end */
9323}; 9610};
9324 9611
9325static struct hda_verb alc883_targa_verbs[] = { 9612static const struct hda_verb alc883_targa_verbs[] = {
9326 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 9613 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9327 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 9614 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9328 9615
@@ -9351,14 +9638,14 @@ static struct hda_verb alc883_targa_verbs[] = {
9351 { } /* end */ 9638 { } /* end */
9352}; 9639};
9353 9640
9354static struct hda_verb alc883_lenovo_101e_verbs[] = { 9641static const struct hda_verb alc883_lenovo_101e_verbs[] = {
9355 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 9642 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9356 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN}, 9643 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
9357 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN}, 9644 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
9358 { } /* end */ 9645 { } /* end */
9359}; 9646};
9360 9647
9361static struct hda_verb alc883_lenovo_nb0763_verbs[] = { 9648static const struct hda_verb alc883_lenovo_nb0763_verbs[] = {
9362 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 9649 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9363 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 9650 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9364 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 9651 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
@@ -9366,7 +9653,7 @@ static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
9366 { } /* end */ 9653 { } /* end */
9367}; 9654};
9368 9655
9369static struct hda_verb alc888_lenovo_ms7195_verbs[] = { 9656static const struct hda_verb alc888_lenovo_ms7195_verbs[] = {
9370 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 9657 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9371 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 9658 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9372 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 9659 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
@@ -9375,7 +9662,7 @@ static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
9375 { } /* end */ 9662 { } /* end */
9376}; 9663};
9377 9664
9378static struct hda_verb alc883_haier_w66_verbs[] = { 9665static const struct hda_verb alc883_haier_w66_verbs[] = {
9379 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 9666 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9380 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 9667 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9381 9668
@@ -9388,7 +9675,7 @@ static struct hda_verb alc883_haier_w66_verbs[] = {
9388 { } /* end */ 9675 { } /* end */
9389}; 9676};
9390 9677
9391static struct hda_verb alc888_lenovo_sky_verbs[] = { 9678static const struct hda_verb alc888_lenovo_sky_verbs[] = {
9392 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 9679 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9393 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 9680 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9394 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 9681 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
@@ -9400,12 +9687,12 @@ static struct hda_verb alc888_lenovo_sky_verbs[] = {
9400 { } /* end */ 9687 { } /* end */
9401}; 9688};
9402 9689
9403static struct hda_verb alc888_6st_dell_verbs[] = { 9690static const struct hda_verb alc888_6st_dell_verbs[] = {
9404 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 9691 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9405 { } 9692 { }
9406}; 9693};
9407 9694
9408static struct hda_verb alc883_vaiott_verbs[] = { 9695static const struct hda_verb alc883_vaiott_verbs[] = {
9409 /* HP */ 9696 /* HP */
9410 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 9697 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9411 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 9698 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
@@ -9424,9 +9711,11 @@ static void alc888_3st_hp_setup(struct hda_codec *codec)
9424 spec->autocfg.speaker_pins[0] = 0x14; 9711 spec->autocfg.speaker_pins[0] = 0x14;
9425 spec->autocfg.speaker_pins[1] = 0x16; 9712 spec->autocfg.speaker_pins[1] = 0x16;
9426 spec->autocfg.speaker_pins[2] = 0x18; 9713 spec->autocfg.speaker_pins[2] = 0x18;
9714 spec->automute = 1;
9715 spec->automute_mode = ALC_AUTOMUTE_AMP;
9427} 9716}
9428 9717
9429static struct hda_verb alc888_3st_hp_verbs[] = { 9718static const struct hda_verb alc888_3st_hp_verbs[] = {
9430 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */ 9719 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */
9431 {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */ 9720 {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */
9432 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */ 9721 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */
@@ -9437,7 +9726,7 @@ static struct hda_verb alc888_3st_hp_verbs[] = {
9437/* 9726/*
9438 * 2ch mode 9727 * 2ch mode
9439 */ 9728 */
9440static struct hda_verb alc888_3st_hp_2ch_init[] = { 9729static const struct hda_verb alc888_3st_hp_2ch_init[] = {
9441 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 9730 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
9442 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 9731 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
9443 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 9732 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
@@ -9448,7 +9737,7 @@ static struct hda_verb alc888_3st_hp_2ch_init[] = {
9448/* 9737/*
9449 * 4ch mode 9738 * 4ch mode
9450 */ 9739 */
9451static struct hda_verb alc888_3st_hp_4ch_init[] = { 9740static const struct hda_verb alc888_3st_hp_4ch_init[] = {
9452 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 9741 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
9453 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 9742 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
9454 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 9743 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
@@ -9460,7 +9749,7 @@ static struct hda_verb alc888_3st_hp_4ch_init[] = {
9460/* 9749/*
9461 * 6ch mode 9750 * 6ch mode
9462 */ 9751 */
9463static struct hda_verb alc888_3st_hp_6ch_init[] = { 9752static const struct hda_verb alc888_3st_hp_6ch_init[] = {
9464 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 9753 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
9465 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 9754 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
9466 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 9755 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
@@ -9470,39 +9759,21 @@ static struct hda_verb alc888_3st_hp_6ch_init[] = {
9470 { } /* end */ 9759 { } /* end */
9471}; 9760};
9472 9761
9473static struct hda_channel_mode alc888_3st_hp_modes[3] = { 9762static const struct hda_channel_mode alc888_3st_hp_modes[3] = {
9474 { 2, alc888_3st_hp_2ch_init }, 9763 { 2, alc888_3st_hp_2ch_init },
9475 { 4, alc888_3st_hp_4ch_init }, 9764 { 4, alc888_3st_hp_4ch_init },
9476 { 6, alc888_3st_hp_6ch_init }, 9765 { 6, alc888_3st_hp_6ch_init },
9477}; 9766};
9478 9767
9479/* toggle front-jack and RCA according to the hp-jack state */ 9768static void alc888_lenovo_ms7195_setup(struct hda_codec *codec)
9480static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
9481{ 9769{
9482 unsigned int present = snd_hda_jack_detect(codec, 0x1b); 9770 struct alc_spec *spec = codec->spec;
9483
9484 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9485 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9486 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9487 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9488}
9489
9490/* toggle RCA according to the front-jack state */
9491static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
9492{
9493 unsigned int present = snd_hda_jack_detect(codec, 0x14);
9494
9495 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9496 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9497}
9498 9771
9499static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec, 9772 spec->autocfg.hp_pins[0] = 0x1b;
9500 unsigned int res) 9773 spec->autocfg.line_out_pins[0] = 0x14;
9501{ 9774 spec->autocfg.speaker_pins[0] = 0x15;
9502 if ((res >> 26) == ALC880_HP_EVENT) 9775 spec->automute = 1;
9503 alc888_lenovo_ms7195_front_automute(codec); 9776 spec->automute_mode = ALC_AUTOMUTE_AMP;
9504 if ((res >> 26) == ALC880_FRONT_EVENT)
9505 alc888_lenovo_ms7195_rca_automute(codec);
9506} 9777}
9507 9778
9508/* toggle speaker-output according to the hp-jack state */ 9779/* toggle speaker-output according to the hp-jack state */
@@ -9512,6 +9783,8 @@ static void alc883_lenovo_nb0763_setup(struct hda_codec *codec)
9512 9783
9513 spec->autocfg.hp_pins[0] = 0x14; 9784 spec->autocfg.hp_pins[0] = 0x14;
9514 spec->autocfg.speaker_pins[0] = 0x15; 9785 spec->autocfg.speaker_pins[0] = 0x15;
9786 spec->automute = 1;
9787 spec->automute_mode = ALC_AUTOMUTE_AMP;
9515} 9788}
9516 9789
9517/* toggle speaker-output according to the hp-jack state */ 9790/* toggle speaker-output according to the hp-jack state */
@@ -9524,11 +9797,13 @@ static void alc883_clevo_m720_setup(struct hda_codec *codec)
9524 9797
9525 spec->autocfg.hp_pins[0] = 0x15; 9798 spec->autocfg.hp_pins[0] = 0x15;
9526 spec->autocfg.speaker_pins[0] = 0x14; 9799 spec->autocfg.speaker_pins[0] = 0x14;
9800 spec->automute = 1;
9801 spec->automute_mode = ALC_AUTOMUTE_AMP;
9527} 9802}
9528 9803
9529static void alc883_clevo_m720_init_hook(struct hda_codec *codec) 9804static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
9530{ 9805{
9531 alc_automute_amp(codec); 9806 alc_hp_automute(codec);
9532 alc88x_simple_mic_automute(codec); 9807 alc88x_simple_mic_automute(codec);
9533} 9808}
9534 9809
@@ -9540,7 +9815,7 @@ static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
9540 alc88x_simple_mic_automute(codec); 9815 alc88x_simple_mic_automute(codec);
9541 break; 9816 break;
9542 default: 9817 default:
9543 alc_automute_amp_unsol_event(codec, res); 9818 alc_sku_unsol_event(codec, res);
9544 break; 9819 break;
9545 } 9820 }
9546} 9821}
@@ -9552,6 +9827,8 @@ static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
9552 9827
9553 spec->autocfg.hp_pins[0] = 0x14; 9828 spec->autocfg.hp_pins[0] = 0x14;
9554 spec->autocfg.speaker_pins[0] = 0x15; 9829 spec->autocfg.speaker_pins[0] = 0x15;
9830 spec->automute = 1;
9831 spec->automute_mode = ALC_AUTOMUTE_AMP;
9555} 9832}
9556 9833
9557static void alc883_haier_w66_setup(struct hda_codec *codec) 9834static void alc883_haier_w66_setup(struct hda_codec *codec)
@@ -9560,33 +9837,21 @@ static void alc883_haier_w66_setup(struct hda_codec *codec)
9560 9837
9561 spec->autocfg.hp_pins[0] = 0x1b; 9838 spec->autocfg.hp_pins[0] = 0x1b;
9562 spec->autocfg.speaker_pins[0] = 0x14; 9839 spec->autocfg.speaker_pins[0] = 0x14;
9840 spec->automute = 1;
9841 spec->automute_mode = ALC_AUTOMUTE_AMP;
9563} 9842}
9564 9843
9565static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec) 9844static void alc883_lenovo_101e_setup(struct hda_codec *codec)
9566{ 9845{
9567 int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0; 9846 struct alc_spec *spec = codec->spec;
9568
9569 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9570 HDA_AMP_MUTE, bits);
9571}
9572
9573static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
9574{
9575 int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
9576
9577 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9578 HDA_AMP_MUTE, bits);
9579 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9580 HDA_AMP_MUTE, bits);
9581}
9582 9847
9583static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec, 9848 spec->autocfg.hp_pins[0] = 0x1b;
9584 unsigned int res) 9849 spec->autocfg.line_out_pins[0] = 0x14;
9585{ 9850 spec->autocfg.speaker_pins[0] = 0x15;
9586 if ((res >> 26) == ALC880_HP_EVENT) 9851 spec->automute = 1;
9587 alc883_lenovo_101e_all_automute(codec); 9852 spec->detect_line = 1;
9588 if ((res >> 26) == ALC880_FRONT_EVENT) 9853 spec->automute_lines = 1;
9589 alc883_lenovo_101e_ispeaker_automute(codec); 9854 spec->automute_mode = ALC_AUTOMUTE_AMP;
9590} 9855}
9591 9856
9592/* toggle speaker-output according to the hp-jack state */ 9857/* toggle speaker-output according to the hp-jack state */
@@ -9597,9 +9862,11 @@ static void alc883_acer_aspire_setup(struct hda_codec *codec)
9597 spec->autocfg.hp_pins[0] = 0x14; 9862 spec->autocfg.hp_pins[0] = 0x14;
9598 spec->autocfg.speaker_pins[0] = 0x15; 9863 spec->autocfg.speaker_pins[0] = 0x15;
9599 spec->autocfg.speaker_pins[1] = 0x16; 9864 spec->autocfg.speaker_pins[1] = 0x16;
9865 spec->automute = 1;
9866 spec->automute_mode = ALC_AUTOMUTE_AMP;
9600} 9867}
9601 9868
9602static struct hda_verb alc883_acer_eapd_verbs[] = { 9869static const struct hda_verb alc883_acer_eapd_verbs[] = {
9603 /* HP Pin: output 0 (0x0c) */ 9870 /* HP Pin: output 0 (0x0c) */
9604 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 9871 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9605 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 9872 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
@@ -9626,6 +9893,8 @@ static void alc888_6st_dell_setup(struct hda_codec *codec)
9626 spec->autocfg.speaker_pins[1] = 0x15; 9893 spec->autocfg.speaker_pins[1] = 0x15;
9627 spec->autocfg.speaker_pins[2] = 0x16; 9894 spec->autocfg.speaker_pins[2] = 0x16;
9628 spec->autocfg.speaker_pins[3] = 0x17; 9895 spec->autocfg.speaker_pins[3] = 0x17;
9896 spec->automute = 1;
9897 spec->automute_mode = ALC_AUTOMUTE_AMP;
9629} 9898}
9630 9899
9631static void alc888_lenovo_sky_setup(struct hda_codec *codec) 9900static void alc888_lenovo_sky_setup(struct hda_codec *codec)
@@ -9638,6 +9907,8 @@ static void alc888_lenovo_sky_setup(struct hda_codec *codec)
9638 spec->autocfg.speaker_pins[2] = 0x16; 9907 spec->autocfg.speaker_pins[2] = 0x16;
9639 spec->autocfg.speaker_pins[3] = 0x17; 9908 spec->autocfg.speaker_pins[3] = 0x17;
9640 spec->autocfg.speaker_pins[4] = 0x1a; 9909 spec->autocfg.speaker_pins[4] = 0x1a;
9910 spec->automute = 1;
9911 spec->automute_mode = ALC_AUTOMUTE_AMP;
9641} 9912}
9642 9913
9643static void alc883_vaiott_setup(struct hda_codec *codec) 9914static void alc883_vaiott_setup(struct hda_codec *codec)
@@ -9647,9 +9918,11 @@ static void alc883_vaiott_setup(struct hda_codec *codec)
9647 spec->autocfg.hp_pins[0] = 0x15; 9918 spec->autocfg.hp_pins[0] = 0x15;
9648 spec->autocfg.speaker_pins[0] = 0x14; 9919 spec->autocfg.speaker_pins[0] = 0x14;
9649 spec->autocfg.speaker_pins[1] = 0x17; 9920 spec->autocfg.speaker_pins[1] = 0x17;
9921 spec->automute = 1;
9922 spec->automute_mode = ALC_AUTOMUTE_AMP;
9650} 9923}
9651 9924
9652static struct hda_verb alc888_asus_m90v_verbs[] = { 9925static const struct hda_verb alc888_asus_m90v_verbs[] = {
9653 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 9926 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9654 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 9927 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9655 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 9928 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
@@ -9672,9 +9945,11 @@ static void alc883_mode2_setup(struct hda_codec *codec)
9672 spec->ext_mic.mux_idx = 0; 9945 spec->ext_mic.mux_idx = 0;
9673 spec->int_mic.mux_idx = 1; 9946 spec->int_mic.mux_idx = 1;
9674 spec->auto_mic = 1; 9947 spec->auto_mic = 1;
9948 spec->automute = 1;
9949 spec->automute_mode = ALC_AUTOMUTE_AMP;
9675} 9950}
9676 9951
9677static struct hda_verb alc888_asus_eee1601_verbs[] = { 9952static const struct hda_verb alc888_asus_eee1601_verbs[] = {
9678 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 9953 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9679 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 9954 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9680 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 9955 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
@@ -9693,10 +9968,10 @@ static void alc883_eee1601_inithook(struct hda_codec *codec)
9693 9968
9694 spec->autocfg.hp_pins[0] = 0x14; 9969 spec->autocfg.hp_pins[0] = 0x14;
9695 spec->autocfg.speaker_pins[0] = 0x1b; 9970 spec->autocfg.speaker_pins[0] = 0x1b;
9696 alc_automute_pin(codec); 9971 alc_hp_automute(codec);
9697} 9972}
9698 9973
9699static struct hda_verb alc889A_mb31_verbs[] = { 9974static const struct hda_verb alc889A_mb31_verbs[] = {
9700 /* Init rear pin (used as headphone output) */ 9975 /* Init rear pin (used as headphone output) */
9701 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */ 9976 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */
9702 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Connect to front */ 9977 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Connect to front */
@@ -9742,11 +10017,11 @@ static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
9742#define alc882_pcm_digital_playback alc880_pcm_digital_playback 10017#define alc882_pcm_digital_playback alc880_pcm_digital_playback
9743#define alc882_pcm_digital_capture alc880_pcm_digital_capture 10018#define alc882_pcm_digital_capture alc880_pcm_digital_capture
9744 10019
9745static hda_nid_t alc883_slave_dig_outs[] = { 10020static const hda_nid_t alc883_slave_dig_outs[] = {
9746 ALC1200_DIGOUT_NID, 0, 10021 ALC1200_DIGOUT_NID, 0,
9747}; 10022};
9748 10023
9749static hda_nid_t alc1200_slave_dig_outs[] = { 10024static const hda_nid_t alc1200_slave_dig_outs[] = {
9750 ALC883_DIGOUT_NID, 0, 10025 ALC883_DIGOUT_NID, 0,
9751}; 10026};
9752 10027
@@ -9805,7 +10080,7 @@ static const char * const alc882_models[ALC882_MODEL_LAST] = {
9805 [ALC882_AUTO] = "auto", 10080 [ALC882_AUTO] = "auto",
9806}; 10081};
9807 10082
9808static struct snd_pci_quirk alc882_cfg_tbl[] = { 10083static const struct snd_pci_quirk alc882_cfg_tbl[] = {
9809 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG), 10084 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
9810 10085
9811 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE), 10086 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
@@ -9932,7 +10207,7 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = {
9932}; 10207};
9933 10208
9934/* codec SSID table for Intel Mac */ 10209/* codec SSID table for Intel Mac */
9935static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = { 10210static const struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9936 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3), 10211 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
9937 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3), 10212 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
9938 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3), 10213 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
@@ -9959,7 +10234,7 @@ static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9959 {} /* terminator */ 10234 {} /* terminator */
9960}; 10235};
9961 10236
9962static struct alc_config_preset alc882_presets[] = { 10237static const struct alc_config_preset alc882_presets[] = {
9963 [ALC882_3ST_DIG] = { 10238 [ALC882_3ST_DIG] = {
9964 .mixers = { alc882_base_mixer }, 10239 .mixers = { alc882_base_mixer },
9965 .init_verbs = { alc882_base_init_verbs, 10240 .init_verbs = { alc882_base_init_verbs,
@@ -10015,9 +10290,9 @@ static struct alc_config_preset alc882_presets[] = {
10015 .channel_mode = alc885_mba21_ch_modes, 10290 .channel_mode = alc885_mba21_ch_modes,
10016 .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes), 10291 .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
10017 .input_mux = &alc882_capture_source, 10292 .input_mux = &alc882_capture_source,
10018 .unsol_event = alc_automute_amp_unsol_event, 10293 .unsol_event = alc_sku_unsol_event,
10019 .setup = alc885_mba21_setup, 10294 .setup = alc885_mba21_setup,
10020 .init_hook = alc_automute_amp, 10295 .init_hook = alc_hp_automute,
10021 }, 10296 },
10022 [ALC885_MBP3] = { 10297 [ALC885_MBP3] = {
10023 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer }, 10298 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
@@ -10031,9 +10306,9 @@ static struct alc_config_preset alc882_presets[] = {
10031 .input_mux = &alc882_capture_source, 10306 .input_mux = &alc882_capture_source,
10032 .dig_out_nid = ALC882_DIGOUT_NID, 10307 .dig_out_nid = ALC882_DIGOUT_NID,
10033 .dig_in_nid = ALC882_DIGIN_NID, 10308 .dig_in_nid = ALC882_DIGIN_NID,
10034 .unsol_event = alc_automute_amp_unsol_event, 10309 .unsol_event = alc_sku_unsol_event,
10035 .setup = alc885_mbp3_setup, 10310 .setup = alc885_mbp3_setup,
10036 .init_hook = alc_automute_amp, 10311 .init_hook = alc_hp_automute,
10037 }, 10312 },
10038 [ALC885_MB5] = { 10313 [ALC885_MB5] = {
10039 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer }, 10314 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
@@ -10046,9 +10321,9 @@ static struct alc_config_preset alc882_presets[] = {
10046 .input_mux = &mb5_capture_source, 10321 .input_mux = &mb5_capture_source,
10047 .dig_out_nid = ALC882_DIGOUT_NID, 10322 .dig_out_nid = ALC882_DIGOUT_NID,
10048 .dig_in_nid = ALC882_DIGIN_NID, 10323 .dig_in_nid = ALC882_DIGIN_NID,
10049 .unsol_event = alc_automute_amp_unsol_event, 10324 .unsol_event = alc_sku_unsol_event,
10050 .setup = alc885_mb5_setup, 10325 .setup = alc885_mb5_setup,
10051 .init_hook = alc_automute_amp, 10326 .init_hook = alc_hp_automute,
10052 }, 10327 },
10053 [ALC885_MACMINI3] = { 10328 [ALC885_MACMINI3] = {
10054 .mixers = { alc885_macmini3_mixer, alc882_chmode_mixer }, 10329 .mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
@@ -10061,9 +10336,9 @@ static struct alc_config_preset alc882_presets[] = {
10061 .input_mux = &macmini3_capture_source, 10336 .input_mux = &macmini3_capture_source,
10062 .dig_out_nid = ALC882_DIGOUT_NID, 10337 .dig_out_nid = ALC882_DIGOUT_NID,
10063 .dig_in_nid = ALC882_DIGIN_NID, 10338 .dig_in_nid = ALC882_DIGIN_NID,
10064 .unsol_event = alc_automute_amp_unsol_event, 10339 .unsol_event = alc_sku_unsol_event,
10065 .setup = alc885_macmini3_setup, 10340 .setup = alc885_macmini3_setup,
10066 .init_hook = alc_automute_amp, 10341 .init_hook = alc_hp_automute,
10067 }, 10342 },
10068 [ALC885_MACPRO] = { 10343 [ALC885_MACPRO] = {
10069 .mixers = { alc882_macpro_mixer }, 10344 .mixers = { alc882_macpro_mixer },
@@ -10087,7 +10362,7 @@ static struct alc_config_preset alc882_presets[] = {
10087 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes), 10362 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
10088 .channel_mode = alc882_ch_modes, 10363 .channel_mode = alc882_ch_modes,
10089 .input_mux = &alc882_capture_source, 10364 .input_mux = &alc882_capture_source,
10090 .unsol_event = alc_automute_amp_unsol_event, 10365 .unsol_event = alc_sku_unsol_event,
10091 .setup = alc885_imac24_setup, 10366 .setup = alc885_imac24_setup,
10092 .init_hook = alc885_imac24_init_hook, 10367 .init_hook = alc885_imac24_init_hook,
10093 }, 10368 },
@@ -10102,9 +10377,9 @@ static struct alc_config_preset alc882_presets[] = {
10102 .input_mux = &alc889A_imac91_capture_source, 10377 .input_mux = &alc889A_imac91_capture_source,
10103 .dig_out_nid = ALC882_DIGOUT_NID, 10378 .dig_out_nid = ALC882_DIGOUT_NID,
10104 .dig_in_nid = ALC882_DIGIN_NID, 10379 .dig_in_nid = ALC882_DIGIN_NID,
10105 .unsol_event = alc_automute_amp_unsol_event, 10380 .unsol_event = alc_sku_unsol_event,
10106 .setup = alc885_imac91_setup, 10381 .setup = alc885_imac91_setup,
10107 .init_hook = alc_automute_amp, 10382 .init_hook = alc_hp_automute,
10108 }, 10383 },
10109 [ALC882_TARGA] = { 10384 [ALC882_TARGA] = {
10110 .mixers = { alc882_targa_mixer, alc882_chmode_mixer }, 10385 .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
@@ -10120,7 +10395,7 @@ static struct alc_config_preset alc882_presets[] = {
10120 .channel_mode = alc882_3ST_6ch_modes, 10395 .channel_mode = alc882_3ST_6ch_modes,
10121 .need_dac_fix = 1, 10396 .need_dac_fix = 1,
10122 .input_mux = &alc882_capture_source, 10397 .input_mux = &alc882_capture_source,
10123 .unsol_event = alc882_targa_unsol_event, 10398 .unsol_event = alc_sku_unsol_event,
10124 .setup = alc882_targa_setup, 10399 .setup = alc882_targa_setup,
10125 .init_hook = alc882_targa_automute, 10400 .init_hook = alc882_targa_automute,
10126 }, 10401 },
@@ -10214,8 +10489,8 @@ static struct alc_config_preset alc882_presets[] = {
10214 .capsrc_nids = alc889_capsrc_nids, 10489 .capsrc_nids = alc889_capsrc_nids,
10215 .input_mux = &alc889_capture_source, 10490 .input_mux = &alc889_capture_source,
10216 .setup = alc889_automute_setup, 10491 .setup = alc889_automute_setup,
10217 .init_hook = alc_automute_amp, 10492 .init_hook = alc_hp_automute,
10218 .unsol_event = alc_automute_amp_unsol_event, 10493 .unsol_event = alc_sku_unsol_event,
10219 .need_dac_fix = 1, 10494 .need_dac_fix = 1,
10220 }, 10495 },
10221 [ALC889_INTEL] = { 10496 [ALC889_INTEL] = {
@@ -10235,7 +10510,7 @@ static struct alc_config_preset alc882_presets[] = {
10235 .input_mux = &alc889_capture_source, 10510 .input_mux = &alc889_capture_source,
10236 .setup = alc889_automute_setup, 10511 .setup = alc889_automute_setup,
10237 .init_hook = alc889_intel_init_hook, 10512 .init_hook = alc889_intel_init_hook,
10238 .unsol_event = alc_automute_amp_unsol_event, 10513 .unsol_event = alc_sku_unsol_event,
10239 .need_dac_fix = 1, 10514 .need_dac_fix = 1,
10240 }, 10515 },
10241 [ALC883_6ST_DIG] = { 10516 [ALC883_6ST_DIG] = {
@@ -10324,9 +10599,9 @@ static struct alc_config_preset alc882_presets[] = {
10324 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 10599 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10325 .channel_mode = alc883_3ST_2ch_modes, 10600 .channel_mode = alc883_3ST_2ch_modes,
10326 .input_mux = &alc883_capture_source, 10601 .input_mux = &alc883_capture_source,
10327 .unsol_event = alc_automute_amp_unsol_event, 10602 .unsol_event = alc_sku_unsol_event,
10328 .setup = alc883_acer_aspire_setup, 10603 .setup = alc883_acer_aspire_setup,
10329 .init_hook = alc_automute_amp, 10604 .init_hook = alc_hp_automute,
10330 }, 10605 },
10331 [ALC888_ACER_ASPIRE_4930G] = { 10606 [ALC888_ACER_ASPIRE_4930G] = {
10332 .mixers = { alc888_acer_aspire_4930g_mixer, 10607 .mixers = { alc888_acer_aspire_4930g_mixer,
@@ -10346,9 +10621,9 @@ static struct alc_config_preset alc882_presets[] = {
10346 .num_mux_defs = 10621 .num_mux_defs =
10347 ARRAY_SIZE(alc888_2_capture_sources), 10622 ARRAY_SIZE(alc888_2_capture_sources),
10348 .input_mux = alc888_2_capture_sources, 10623 .input_mux = alc888_2_capture_sources,
10349 .unsol_event = alc_automute_amp_unsol_event, 10624 .unsol_event = alc_sku_unsol_event,
10350 .setup = alc888_acer_aspire_4930g_setup, 10625 .setup = alc888_acer_aspire_4930g_setup,
10351 .init_hook = alc_automute_amp, 10626 .init_hook = alc_hp_automute,
10352 }, 10627 },
10353 [ALC888_ACER_ASPIRE_6530G] = { 10628 [ALC888_ACER_ASPIRE_6530G] = {
10354 .mixers = { alc888_acer_aspire_6530_mixer }, 10629 .mixers = { alc888_acer_aspire_6530_mixer },
@@ -10365,9 +10640,9 @@ static struct alc_config_preset alc882_presets[] = {
10365 .num_mux_defs = 10640 .num_mux_defs =
10366 ARRAY_SIZE(alc888_2_capture_sources), 10641 ARRAY_SIZE(alc888_2_capture_sources),
10367 .input_mux = alc888_acer_aspire_6530_sources, 10642 .input_mux = alc888_acer_aspire_6530_sources,
10368 .unsol_event = alc_automute_amp_unsol_event, 10643 .unsol_event = alc_sku_unsol_event,
10369 .setup = alc888_acer_aspire_6530g_setup, 10644 .setup = alc888_acer_aspire_6530g_setup,
10370 .init_hook = alc_automute_amp, 10645 .init_hook = alc_hp_automute,
10371 }, 10646 },
10372 [ALC888_ACER_ASPIRE_8930G] = { 10647 [ALC888_ACER_ASPIRE_8930G] = {
10373 .mixers = { alc889_acer_aspire_8930g_mixer, 10648 .mixers = { alc889_acer_aspire_8930g_mixer,
@@ -10388,9 +10663,9 @@ static struct alc_config_preset alc882_presets[] = {
10388 .num_mux_defs = 10663 .num_mux_defs =
10389 ARRAY_SIZE(alc889_capture_sources), 10664 ARRAY_SIZE(alc889_capture_sources),
10390 .input_mux = alc889_capture_sources, 10665 .input_mux = alc889_capture_sources,
10391 .unsol_event = alc_automute_amp_unsol_event, 10666 .unsol_event = alc_sku_unsol_event,
10392 .setup = alc889_acer_aspire_8930g_setup, 10667 .setup = alc889_acer_aspire_8930g_setup,
10393 .init_hook = alc_automute_amp, 10668 .init_hook = alc_hp_automute,
10394#ifdef CONFIG_SND_HDA_POWER_SAVE 10669#ifdef CONFIG_SND_HDA_POWER_SAVE
10395 .power_hook = alc_power_eapd, 10670 .power_hook = alc_power_eapd,
10396#endif 10671#endif
@@ -10411,9 +10686,9 @@ static struct alc_config_preset alc882_presets[] = {
10411 .need_dac_fix = 1, 10686 .need_dac_fix = 1,
10412 .const_channel_count = 6, 10687 .const_channel_count = 6,
10413 .input_mux = &alc883_capture_source, 10688 .input_mux = &alc883_capture_source,
10414 .unsol_event = alc_automute_amp_unsol_event, 10689 .unsol_event = alc_sku_unsol_event,
10415 .setup = alc888_acer_aspire_7730g_setup, 10690 .setup = alc888_acer_aspire_7730g_setup,
10416 .init_hook = alc_automute_amp, 10691 .init_hook = alc_hp_automute,
10417 }, 10692 },
10418 [ALC883_MEDION] = { 10693 [ALC883_MEDION] = {
10419 .mixers = { alc883_fivestack_mixer, 10694 .mixers = { alc883_fivestack_mixer,
@@ -10440,9 +10715,9 @@ static struct alc_config_preset alc882_presets[] = {
10440 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 10715 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10441 .channel_mode = alc883_3ST_2ch_modes, 10716 .channel_mode = alc883_3ST_2ch_modes,
10442 .input_mux = &alc883_capture_source, 10717 .input_mux = &alc883_capture_source,
10443 .unsol_event = alc_automute_amp_unsol_event, 10718 .unsol_event = alc_sku_unsol_event,
10444 .setup = alc883_medion_wim2160_setup, 10719 .setup = alc883_medion_wim2160_setup,
10445 .init_hook = alc_automute_amp, 10720 .init_hook = alc_hp_automute,
10446 }, 10721 },
10447 [ALC883_LAPTOP_EAPD] = { 10722 [ALC883_LAPTOP_EAPD] = {
10448 .mixers = { alc883_base_mixer }, 10723 .mixers = { alc883_base_mixer },
@@ -10492,8 +10767,9 @@ static struct alc_config_preset alc882_presets[] = {
10492 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 10767 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10493 .channel_mode = alc883_3ST_2ch_modes, 10768 .channel_mode = alc883_3ST_2ch_modes,
10494 .input_mux = &alc883_lenovo_101e_capture_source, 10769 .input_mux = &alc883_lenovo_101e_capture_source,
10495 .unsol_event = alc883_lenovo_101e_unsol_event, 10770 .setup = alc883_lenovo_101e_setup,
10496 .init_hook = alc883_lenovo_101e_all_automute, 10771 .unsol_event = alc_sku_unsol_event,
10772 .init_hook = alc_inithook,
10497 }, 10773 },
10498 [ALC883_LENOVO_NB0763] = { 10774 [ALC883_LENOVO_NB0763] = {
10499 .mixers = { alc883_lenovo_nb0763_mixer }, 10775 .mixers = { alc883_lenovo_nb0763_mixer },
@@ -10504,9 +10780,9 @@ static struct alc_config_preset alc882_presets[] = {
10504 .channel_mode = alc883_3ST_2ch_modes, 10780 .channel_mode = alc883_3ST_2ch_modes,
10505 .need_dac_fix = 1, 10781 .need_dac_fix = 1,
10506 .input_mux = &alc883_lenovo_nb0763_capture_source, 10782 .input_mux = &alc883_lenovo_nb0763_capture_source,
10507 .unsol_event = alc_automute_amp_unsol_event, 10783 .unsol_event = alc_sku_unsol_event,
10508 .setup = alc883_lenovo_nb0763_setup, 10784 .setup = alc883_lenovo_nb0763_setup,
10509 .init_hook = alc_automute_amp, 10785 .init_hook = alc_hp_automute,
10510 }, 10786 },
10511 [ALC888_LENOVO_MS7195_DIG] = { 10787 [ALC888_LENOVO_MS7195_DIG] = {
10512 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 10788 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
@@ -10518,8 +10794,9 @@ static struct alc_config_preset alc882_presets[] = {
10518 .channel_mode = alc883_3ST_6ch_modes, 10794 .channel_mode = alc883_3ST_6ch_modes,
10519 .need_dac_fix = 1, 10795 .need_dac_fix = 1,
10520 .input_mux = &alc883_capture_source, 10796 .input_mux = &alc883_capture_source,
10521 .unsol_event = alc883_lenovo_ms7195_unsol_event, 10797 .unsol_event = alc_sku_unsol_event,
10522 .init_hook = alc888_lenovo_ms7195_front_automute, 10798 .setup = alc888_lenovo_ms7195_setup,
10799 .init_hook = alc_inithook,
10523 }, 10800 },
10524 [ALC883_HAIER_W66] = { 10801 [ALC883_HAIER_W66] = {
10525 .mixers = { alc883_targa_2ch_mixer}, 10802 .mixers = { alc883_targa_2ch_mixer},
@@ -10530,9 +10807,9 @@ static struct alc_config_preset alc882_presets[] = {
10530 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 10807 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10531 .channel_mode = alc883_3ST_2ch_modes, 10808 .channel_mode = alc883_3ST_2ch_modes,
10532 .input_mux = &alc883_capture_source, 10809 .input_mux = &alc883_capture_source,
10533 .unsol_event = alc_automute_amp_unsol_event, 10810 .unsol_event = alc_sku_unsol_event,
10534 .setup = alc883_haier_w66_setup, 10811 .setup = alc883_haier_w66_setup,
10535 .init_hook = alc_automute_amp, 10812 .init_hook = alc_hp_automute,
10536 }, 10813 },
10537 [ALC888_3ST_HP] = { 10814 [ALC888_3ST_HP] = {
10538 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 10815 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
@@ -10543,9 +10820,9 @@ static struct alc_config_preset alc882_presets[] = {
10543 .channel_mode = alc888_3st_hp_modes, 10820 .channel_mode = alc888_3st_hp_modes,
10544 .need_dac_fix = 1, 10821 .need_dac_fix = 1,
10545 .input_mux = &alc883_capture_source, 10822 .input_mux = &alc883_capture_source,
10546 .unsol_event = alc_automute_amp_unsol_event, 10823 .unsol_event = alc_sku_unsol_event,
10547 .setup = alc888_3st_hp_setup, 10824 .setup = alc888_3st_hp_setup,
10548 .init_hook = alc_automute_amp, 10825 .init_hook = alc_hp_automute,
10549 }, 10826 },
10550 [ALC888_6ST_DELL] = { 10827 [ALC888_6ST_DELL] = {
10551 .mixers = { alc883_base_mixer, alc883_chmode_mixer }, 10828 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
@@ -10557,9 +10834,9 @@ static struct alc_config_preset alc882_presets[] = {
10557 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 10834 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10558 .channel_mode = alc883_sixstack_modes, 10835 .channel_mode = alc883_sixstack_modes,
10559 .input_mux = &alc883_capture_source, 10836 .input_mux = &alc883_capture_source,
10560 .unsol_event = alc_automute_amp_unsol_event, 10837 .unsol_event = alc_sku_unsol_event,
10561 .setup = alc888_6st_dell_setup, 10838 .setup = alc888_6st_dell_setup,
10562 .init_hook = alc_automute_amp, 10839 .init_hook = alc_hp_automute,
10563 }, 10840 },
10564 [ALC883_MITAC] = { 10841 [ALC883_MITAC] = {
10565 .mixers = { alc883_mitac_mixer }, 10842 .mixers = { alc883_mitac_mixer },
@@ -10569,9 +10846,9 @@ static struct alc_config_preset alc882_presets[] = {
10569 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 10846 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10570 .channel_mode = alc883_3ST_2ch_modes, 10847 .channel_mode = alc883_3ST_2ch_modes,
10571 .input_mux = &alc883_capture_source, 10848 .input_mux = &alc883_capture_source,
10572 .unsol_event = alc_automute_amp_unsol_event, 10849 .unsol_event = alc_sku_unsol_event,
10573 .setup = alc883_mitac_setup, 10850 .setup = alc883_mitac_setup,
10574 .init_hook = alc_automute_amp, 10851 .init_hook = alc_hp_automute,
10575 }, 10852 },
10576 [ALC883_FUJITSU_PI2515] = { 10853 [ALC883_FUJITSU_PI2515] = {
10577 .mixers = { alc883_2ch_fujitsu_pi2515_mixer }, 10854 .mixers = { alc883_2ch_fujitsu_pi2515_mixer },
@@ -10583,9 +10860,9 @@ static struct alc_config_preset alc882_presets[] = {
10583 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 10860 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10584 .channel_mode = alc883_3ST_2ch_modes, 10861 .channel_mode = alc883_3ST_2ch_modes,
10585 .input_mux = &alc883_fujitsu_pi2515_capture_source, 10862 .input_mux = &alc883_fujitsu_pi2515_capture_source,
10586 .unsol_event = alc_automute_amp_unsol_event, 10863 .unsol_event = alc_sku_unsol_event,
10587 .setup = alc883_2ch_fujitsu_pi2515_setup, 10864 .setup = alc883_2ch_fujitsu_pi2515_setup,
10588 .init_hook = alc_automute_amp, 10865 .init_hook = alc_hp_automute,
10589 }, 10866 },
10590 [ALC888_FUJITSU_XA3530] = { 10867 [ALC888_FUJITSU_XA3530] = {
10591 .mixers = { alc888_base_mixer, alc883_chmode_mixer }, 10868 .mixers = { alc888_base_mixer, alc883_chmode_mixer },
@@ -10602,9 +10879,9 @@ static struct alc_config_preset alc882_presets[] = {
10602 .num_mux_defs = 10879 .num_mux_defs =
10603 ARRAY_SIZE(alc888_2_capture_sources), 10880 ARRAY_SIZE(alc888_2_capture_sources),
10604 .input_mux = alc888_2_capture_sources, 10881 .input_mux = alc888_2_capture_sources,
10605 .unsol_event = alc_automute_amp_unsol_event, 10882 .unsol_event = alc_sku_unsol_event,
10606 .setup = alc888_fujitsu_xa3530_setup, 10883 .setup = alc888_fujitsu_xa3530_setup,
10607 .init_hook = alc_automute_amp, 10884 .init_hook = alc_hp_automute,
10608 }, 10885 },
10609 [ALC888_LENOVO_SKY] = { 10886 [ALC888_LENOVO_SKY] = {
10610 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer }, 10887 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
@@ -10616,9 +10893,9 @@ static struct alc_config_preset alc882_presets[] = {
10616 .channel_mode = alc883_sixstack_modes, 10893 .channel_mode = alc883_sixstack_modes,
10617 .need_dac_fix = 1, 10894 .need_dac_fix = 1,
10618 .input_mux = &alc883_lenovo_sky_capture_source, 10895 .input_mux = &alc883_lenovo_sky_capture_source,
10619 .unsol_event = alc_automute_amp_unsol_event, 10896 .unsol_event = alc_sku_unsol_event,
10620 .setup = alc888_lenovo_sky_setup, 10897 .setup = alc888_lenovo_sky_setup,
10621 .init_hook = alc_automute_amp, 10898 .init_hook = alc_hp_automute,
10622 }, 10899 },
10623 [ALC888_ASUS_M90V] = { 10900 [ALC888_ASUS_M90V] = {
10624 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 10901 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
@@ -10686,9 +10963,9 @@ static struct alc_config_preset alc882_presets[] = {
10686 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 10963 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10687 .channel_mode = alc883_3ST_2ch_modes, 10964 .channel_mode = alc883_3ST_2ch_modes,
10688 .input_mux = &alc883_capture_source, 10965 .input_mux = &alc883_capture_source,
10689 .unsol_event = alc_automute_amp_unsol_event, 10966 .unsol_event = alc_sku_unsol_event,
10690 .setup = alc883_vaiott_setup, 10967 .setup = alc883_vaiott_setup,
10691 .init_hook = alc_automute_amp, 10968 .init_hook = alc_hp_automute,
10692 }, 10969 },
10693}; 10970};
10694 10971
@@ -10734,7 +11011,7 @@ static const struct alc_fixup alc882_fixups[] = {
10734 }, 11011 },
10735}; 11012};
10736 11013
10737static struct snd_pci_quirk alc882_fixup_tbl[] = { 11014static const struct snd_pci_quirk alc882_fixup_tbl[] = {
10738 SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", PINFIX_PB_M5210), 11015 SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", PINFIX_PB_M5210),
10739 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", PINFIX_LENOVO_Y530), 11016 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", PINFIX_LENOVO_Y530),
10740 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX), 11017 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
@@ -10842,6 +11119,11 @@ static void alc882_auto_init_input_src(struct hda_codec *codec)
10842 const struct hda_input_mux *imux; 11119 const struct hda_input_mux *imux;
10843 int conns, mute, idx, item; 11120 int conns, mute, idx, item;
10844 11121
11122 /* mute ADC */
11123 snd_hda_codec_write(codec, spec->adc_nids[c], 0,
11124 AC_VERB_SET_AMP_GAIN_MUTE,
11125 AMP_IN_MUTE(0));
11126
10845 conns = snd_hda_get_connections(codec, nid, conn_list, 11127 conns = snd_hda_get_connections(codec, nid, conn_list,
10846 ARRAY_SIZE(conn_list)); 11128 ARRAY_SIZE(conn_list));
10847 if (conns < 0) 11129 if (conns < 0)
@@ -10921,7 +11203,7 @@ static int alc_auto_add_mic_boost(struct hda_codec *codec)
10921static int alc882_parse_auto_config(struct hda_codec *codec) 11203static int alc882_parse_auto_config(struct hda_codec *codec)
10922{ 11204{
10923 struct alc_spec *spec = codec->spec; 11205 struct alc_spec *spec = codec->spec;
10924 static hda_nid_t alc882_ignore[] = { 0x1d, 0 }; 11206 static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
10925 int err; 11207 int err;
10926 11208
10927 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 11209 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
@@ -10934,6 +11216,9 @@ static int alc882_parse_auto_config(struct hda_codec *codec)
10934 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg); 11216 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
10935 if (err < 0) 11217 if (err < 0)
10936 return err; 11218 return err;
11219 err = alc_auto_add_multi_channel_mode(codec);
11220 if (err < 0)
11221 return err;
10937 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg); 11222 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
10938 if (err < 0) 11223 if (err < 0)
10939 return err; 11224 return err;
@@ -11135,14 +11420,14 @@ static int patch_alc882(struct hda_codec *codec)
11135#define alc262_modes alc260_modes 11420#define alc262_modes alc260_modes
11136#define alc262_capture_source alc882_capture_source 11421#define alc262_capture_source alc882_capture_source
11137 11422
11138static hda_nid_t alc262_dmic_adc_nids[1] = { 11423static const hda_nid_t alc262_dmic_adc_nids[1] = {
11139 /* ADC0 */ 11424 /* ADC0 */
11140 0x09 11425 0x09
11141}; 11426};
11142 11427
11143static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 }; 11428static const hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
11144 11429
11145static struct snd_kcontrol_new alc262_base_mixer[] = { 11430static const struct snd_kcontrol_new alc262_base_mixer[] = {
11146 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 11431 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11147 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 11432 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11148 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 11433 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
@@ -11163,71 +11448,30 @@ static struct snd_kcontrol_new alc262_base_mixer[] = {
11163}; 11448};
11164 11449
11165/* update HP, line and mono-out pins according to the master switch */ 11450/* update HP, line and mono-out pins according to the master switch */
11166static void alc262_hp_master_update(struct hda_codec *codec) 11451#define alc262_hp_master_update alc260_hp_master_update
11167{
11168 struct alc_spec *spec = codec->spec;
11169 int val = spec->master_sw;
11170
11171 /* HP & line-out */
11172 snd_hda_codec_write_cache(codec, 0x1b, 0,
11173 AC_VERB_SET_PIN_WIDGET_CONTROL,
11174 val ? PIN_HP : 0);
11175 snd_hda_codec_write_cache(codec, 0x15, 0,
11176 AC_VERB_SET_PIN_WIDGET_CONTROL,
11177 val ? PIN_HP : 0);
11178 /* mono (speaker) depending on the HP jack sense */
11179 val = val && !spec->jack_present;
11180 snd_hda_codec_write_cache(codec, 0x16, 0,
11181 AC_VERB_SET_PIN_WIDGET_CONTROL,
11182 val ? PIN_OUT : 0);
11183}
11184 11452
11185static void alc262_hp_bpc_automute(struct hda_codec *codec) 11453static void alc262_hp_bpc_setup(struct hda_codec *codec)
11186{ 11454{
11187 struct alc_spec *spec = codec->spec; 11455 struct alc_spec *spec = codec->spec;
11188 11456
11189 spec->jack_present = snd_hda_jack_detect(codec, 0x1b); 11457 spec->autocfg.hp_pins[0] = 0x1b;
11190 alc262_hp_master_update(codec); 11458 spec->autocfg.speaker_pins[0] = 0x16;
11191} 11459 spec->automute = 1;
11192 11460 spec->automute_mode = ALC_AUTOMUTE_PIN;
11193static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
11194{
11195 if ((res >> 26) != ALC880_HP_EVENT)
11196 return;
11197 alc262_hp_bpc_automute(codec);
11198} 11461}
11199 11462
11200static void alc262_hp_wildwest_automute(struct hda_codec *codec) 11463static void alc262_hp_wildwest_setup(struct hda_codec *codec)
11201{ 11464{
11202 struct alc_spec *spec = codec->spec; 11465 struct alc_spec *spec = codec->spec;
11203 11466
11204 spec->jack_present = snd_hda_jack_detect(codec, 0x15); 11467 spec->autocfg.hp_pins[0] = 0x15;
11205 alc262_hp_master_update(codec); 11468 spec->autocfg.speaker_pins[0] = 0x16;
11206} 11469 spec->automute = 1;
11207 11470 spec->automute_mode = ALC_AUTOMUTE_PIN;
11208static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
11209 unsigned int res)
11210{
11211 if ((res >> 26) != ALC880_HP_EVENT)
11212 return;
11213 alc262_hp_wildwest_automute(codec);
11214} 11471}
11215 11472
11216#define alc262_hp_master_sw_get alc260_hp_master_sw_get 11473#define alc262_hp_master_sw_get alc260_hp_master_sw_get
11217 11474#define alc262_hp_master_sw_put alc260_hp_master_sw_put
11218static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
11219 struct snd_ctl_elem_value *ucontrol)
11220{
11221 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11222 struct alc_spec *spec = codec->spec;
11223 int val = !!*ucontrol->value.integer.value;
11224
11225 if (val == spec->master_sw)
11226 return 0;
11227 spec->master_sw = val;
11228 alc262_hp_master_update(codec);
11229 return 1;
11230}
11231 11475
11232#define ALC262_HP_MASTER_SWITCH \ 11476#define ALC262_HP_MASTER_SWITCH \
11233 { \ 11477 { \
@@ -11244,7 +11488,7 @@ static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
11244 } 11488 }
11245 11489
11246 11490
11247static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = { 11491static const struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
11248 ALC262_HP_MASTER_SWITCH, 11492 ALC262_HP_MASTER_SWITCH,
11249 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 11493 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11250 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT), 11494 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
@@ -11268,7 +11512,7 @@ static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
11268 { } /* end */ 11512 { } /* end */
11269}; 11513};
11270 11514
11271static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = { 11515static const struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
11272 ALC262_HP_MASTER_SWITCH, 11516 ALC262_HP_MASTER_SWITCH,
11273 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 11517 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11274 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 11518 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
@@ -11288,7 +11532,7 @@ static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
11288 { } /* end */ 11532 { } /* end */
11289}; 11533};
11290 11534
11291static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = { 11535static const struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
11292 HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 11536 HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11293 HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 11537 HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11294 HDA_CODEC_VOLUME("Rear Mic Boost Volume", 0x18, 0, HDA_INPUT), 11538 HDA_CODEC_VOLUME("Rear Mic Boost Volume", 0x18, 0, HDA_INPUT),
@@ -11302,9 +11546,11 @@ static void alc262_hp_t5735_setup(struct hda_codec *codec)
11302 11546
11303 spec->autocfg.hp_pins[0] = 0x15; 11547 spec->autocfg.hp_pins[0] = 0x15;
11304 spec->autocfg.speaker_pins[0] = 0x14; 11548 spec->autocfg.speaker_pins[0] = 0x14;
11549 spec->automute = 1;
11550 spec->automute_mode = ALC_AUTOMUTE_PIN;
11305} 11551}
11306 11552
11307static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = { 11553static const struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
11308 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 11554 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11309 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 11555 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11310 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 11556 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
@@ -11315,7 +11561,7 @@ static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
11315 { } /* end */ 11561 { } /* end */
11316}; 11562};
11317 11563
11318static struct hda_verb alc262_hp_t5735_verbs[] = { 11564static const struct hda_verb alc262_hp_t5735_verbs[] = {
11319 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 11565 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11320 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 11566 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11321 11567
@@ -11323,7 +11569,7 @@ static struct hda_verb alc262_hp_t5735_verbs[] = {
11323 { } 11569 { }
11324}; 11570};
11325 11571
11326static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = { 11572static const struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
11327 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 11573 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11328 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 11574 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
11329 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT), 11575 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
@@ -11333,7 +11579,7 @@ static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
11333 { } /* end */ 11579 { } /* end */
11334}; 11580};
11335 11581
11336static struct hda_verb alc262_hp_rp5700_verbs[] = { 11582static const struct hda_verb alc262_hp_rp5700_verbs[] = {
11337 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 11583 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11338 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 11584 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11339 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 11585 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
@@ -11347,7 +11593,7 @@ static struct hda_verb alc262_hp_rp5700_verbs[] = {
11347 {} 11593 {}
11348}; 11594};
11349 11595
11350static struct hda_input_mux alc262_hp_rp5700_capture_source = { 11596static const struct hda_input_mux alc262_hp_rp5700_capture_source = {
11351 .num_items = 1, 11597 .num_items = 1,
11352 .items = { 11598 .items = {
11353 { "Line", 0x1 }, 11599 { "Line", 0x1 },
@@ -11355,44 +11601,9 @@ static struct hda_input_mux alc262_hp_rp5700_capture_source = {
11355}; 11601};
11356 11602
11357/* bind hp and internal speaker mute (with plug check) as master switch */ 11603/* bind hp and internal speaker mute (with plug check) as master switch */
11358static void alc262_hippo_master_update(struct hda_codec *codec) 11604#define alc262_hippo_master_update alc262_hp_master_update
11359{
11360 struct alc_spec *spec = codec->spec;
11361 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
11362 hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
11363 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
11364 unsigned int mute;
11365
11366 /* HP */
11367 mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
11368 snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
11369 HDA_AMP_MUTE, mute);
11370 /* mute internal speaker per jack sense */
11371 if (spec->jack_present)
11372 mute = HDA_AMP_MUTE;
11373 if (line_nid)
11374 snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
11375 HDA_AMP_MUTE, mute);
11376 if (speaker_nid && speaker_nid != line_nid)
11377 snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
11378 HDA_AMP_MUTE, mute);
11379}
11380
11381#define alc262_hippo_master_sw_get alc262_hp_master_sw_get 11605#define alc262_hippo_master_sw_get alc262_hp_master_sw_get
11382 11606#define alc262_hippo_master_sw_put alc262_hp_master_sw_put
11383static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
11384 struct snd_ctl_elem_value *ucontrol)
11385{
11386 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11387 struct alc_spec *spec = codec->spec;
11388 int val = !!*ucontrol->value.integer.value;
11389
11390 if (val == spec->master_sw)
11391 return 0;
11392 spec->master_sw = val;
11393 alc262_hippo_master_update(codec);
11394 return 1;
11395}
11396 11607
11397#define ALC262_HIPPO_MASTER_SWITCH \ 11608#define ALC262_HIPPO_MASTER_SWITCH \
11398 { \ 11609 { \
@@ -11409,7 +11620,7 @@ static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
11409 (SUBDEV_SPEAKER(0) << 16), \ 11620 (SUBDEV_SPEAKER(0) << 16), \
11410 } 11621 }
11411 11622
11412static struct snd_kcontrol_new alc262_hippo_mixer[] = { 11623static const struct snd_kcontrol_new alc262_hippo_mixer[] = {
11413 ALC262_HIPPO_MASTER_SWITCH, 11624 ALC262_HIPPO_MASTER_SWITCH,
11414 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 11625 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11415 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 11626 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
@@ -11426,7 +11637,7 @@ static struct snd_kcontrol_new alc262_hippo_mixer[] = {
11426 { } /* end */ 11637 { } /* end */
11427}; 11638};
11428 11639
11429static struct snd_kcontrol_new alc262_hippo1_mixer[] = { 11640static const struct snd_kcontrol_new alc262_hippo1_mixer[] = {
11430 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 11641 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11431 ALC262_HIPPO_MASTER_SWITCH, 11642 ALC262_HIPPO_MASTER_SWITCH,
11432 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 11643 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
@@ -11443,28 +11654,14 @@ static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
11443}; 11654};
11444 11655
11445/* mute/unmute internal speaker according to the hp jack and mute state */ 11656/* mute/unmute internal speaker according to the hp jack and mute state */
11446static void alc262_hippo_automute(struct hda_codec *codec)
11447{
11448 struct alc_spec *spec = codec->spec;
11449 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
11450
11451 spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
11452 alc262_hippo_master_update(codec);
11453}
11454
11455static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
11456{
11457 if ((res >> 26) != ALC880_HP_EVENT)
11458 return;
11459 alc262_hippo_automute(codec);
11460}
11461
11462static void alc262_hippo_setup(struct hda_codec *codec) 11657static void alc262_hippo_setup(struct hda_codec *codec)
11463{ 11658{
11464 struct alc_spec *spec = codec->spec; 11659 struct alc_spec *spec = codec->spec;
11465 11660
11466 spec->autocfg.hp_pins[0] = 0x15; 11661 spec->autocfg.hp_pins[0] = 0x15;
11467 spec->autocfg.speaker_pins[0] = 0x14; 11662 spec->autocfg.speaker_pins[0] = 0x14;
11663 spec->automute = 1;
11664 spec->automute_mode = ALC_AUTOMUTE_AMP;
11468} 11665}
11469 11666
11470static void alc262_hippo1_setup(struct hda_codec *codec) 11667static void alc262_hippo1_setup(struct hda_codec *codec)
@@ -11473,10 +11670,12 @@ static void alc262_hippo1_setup(struct hda_codec *codec)
11473 11670
11474 spec->autocfg.hp_pins[0] = 0x1b; 11671 spec->autocfg.hp_pins[0] = 0x1b;
11475 spec->autocfg.speaker_pins[0] = 0x14; 11672 spec->autocfg.speaker_pins[0] = 0x14;
11673 spec->automute = 1;
11674 spec->automute_mode = ALC_AUTOMUTE_AMP;
11476} 11675}
11477 11676
11478 11677
11479static struct snd_kcontrol_new alc262_sony_mixer[] = { 11678static const struct snd_kcontrol_new alc262_sony_mixer[] = {
11480 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 11679 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11481 ALC262_HIPPO_MASTER_SWITCH, 11680 ALC262_HIPPO_MASTER_SWITCH,
11482 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 11681 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
@@ -11486,7 +11685,7 @@ static struct snd_kcontrol_new alc262_sony_mixer[] = {
11486 { } /* end */ 11685 { } /* end */
11487}; 11686};
11488 11687
11489static struct snd_kcontrol_new alc262_benq_t31_mixer[] = { 11688static const struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
11490 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 11689 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11491 ALC262_HIPPO_MASTER_SWITCH, 11690 ALC262_HIPPO_MASTER_SWITCH,
11492 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 11691 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
@@ -11497,7 +11696,7 @@ static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
11497 { } /* end */ 11696 { } /* end */
11498}; 11697};
11499 11698
11500static struct snd_kcontrol_new alc262_tyan_mixer[] = { 11699static const struct snd_kcontrol_new alc262_tyan_mixer[] = {
11501 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 11700 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11502 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT), 11701 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11503 HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT), 11702 HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
@@ -11513,7 +11712,7 @@ static struct snd_kcontrol_new alc262_tyan_mixer[] = {
11513 { } /* end */ 11712 { } /* end */
11514}; 11713};
11515 11714
11516static struct hda_verb alc262_tyan_verbs[] = { 11715static const struct hda_verb alc262_tyan_verbs[] = {
11517 /* Headphone automute */ 11716 /* Headphone automute */
11518 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 11717 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11519 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 11718 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
@@ -11535,6 +11734,8 @@ static void alc262_tyan_setup(struct hda_codec *codec)
11535 11734
11536 spec->autocfg.hp_pins[0] = 0x1b; 11735 spec->autocfg.hp_pins[0] = 0x1b;
11537 spec->autocfg.speaker_pins[0] = 0x15; 11736 spec->autocfg.speaker_pins[0] = 0x15;
11737 spec->automute = 1;
11738 spec->automute_mode = ALC_AUTOMUTE_AMP;
11538} 11739}
11539 11740
11540 11741
@@ -11544,7 +11745,7 @@ static void alc262_tyan_setup(struct hda_codec *codec)
11544/* 11745/*
11545 * generic initialization of ADC, input mixers and output mixers 11746 * generic initialization of ADC, input mixers and output mixers
11546 */ 11747 */
11547static struct hda_verb alc262_init_verbs[] = { 11748static const struct hda_verb alc262_init_verbs[] = {
11548 /* 11749 /*
11549 * Unmute ADC0-2 and set the default input to mic-in 11750 * Unmute ADC0-2 and set the default input to mic-in
11550 */ 11751 */
@@ -11620,13 +11821,13 @@ static struct hda_verb alc262_init_verbs[] = {
11620 { } 11821 { }
11621}; 11822};
11622 11823
11623static struct hda_verb alc262_eapd_verbs[] = { 11824static const struct hda_verb alc262_eapd_verbs[] = {
11624 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 11825 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
11625 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 11826 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
11626 { } 11827 { }
11627}; 11828};
11628 11829
11629static struct hda_verb alc262_hippo1_unsol_verbs[] = { 11830static const struct hda_verb alc262_hippo1_unsol_verbs[] = {
11630 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 11831 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11631 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 11832 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11632 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000}, 11833 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
@@ -11636,7 +11837,7 @@ static struct hda_verb alc262_hippo1_unsol_verbs[] = {
11636 {} 11837 {}
11637}; 11838};
11638 11839
11639static struct hda_verb alc262_sony_unsol_verbs[] = { 11840static const struct hda_verb alc262_sony_unsol_verbs[] = {
11640 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, 11841 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11641 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 11842 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11642 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, // Front Mic 11843 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, // Front Mic
@@ -11646,7 +11847,7 @@ static struct hda_verb alc262_sony_unsol_verbs[] = {
11646 {} 11847 {}
11647}; 11848};
11648 11849
11649static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = { 11850static const struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
11650 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 11851 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11651 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 11852 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11652 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 11853 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
@@ -11655,7 +11856,7 @@ static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
11655 { } /* end */ 11856 { } /* end */
11656}; 11857};
11657 11858
11658static struct hda_verb alc262_toshiba_s06_verbs[] = { 11859static const struct hda_verb alc262_toshiba_s06_verbs[] = {
11659 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 11860 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11660 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 11861 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11661 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 11862 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
@@ -11678,6 +11879,8 @@ static void alc262_toshiba_s06_setup(struct hda_codec *codec)
11678 spec->int_mic.pin = 0x12; 11879 spec->int_mic.pin = 0x12;
11679 spec->int_mic.mux_idx = 9; 11880 spec->int_mic.mux_idx = 9;
11680 spec->auto_mic = 1; 11881 spec->auto_mic = 1;
11882 spec->automute = 1;
11883 spec->automute_mode = ALC_AUTOMUTE_PIN;
11681} 11884}
11682 11885
11683/* 11886/*
@@ -11687,7 +11890,7 @@ static void alc262_toshiba_s06_setup(struct hda_codec *codec)
11687 * 0x18 = external mic 11890 * 0x18 = external mic
11688 */ 11891 */
11689 11892
11690static struct snd_kcontrol_new alc262_nec_mixer[] = { 11893static const struct snd_kcontrol_new alc262_nec_mixer[] = {
11691 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 11894 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
11692 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT), 11895 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
11693 11896
@@ -11700,7 +11903,7 @@ static struct snd_kcontrol_new alc262_nec_mixer[] = {
11700 { } /* end */ 11903 { } /* end */
11701}; 11904};
11702 11905
11703static struct hda_verb alc262_nec_verbs[] = { 11906static const struct hda_verb alc262_nec_verbs[] = {
11704 /* Unmute Speaker */ 11907 /* Unmute Speaker */
11705 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 11908 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11706 11909
@@ -11723,7 +11926,7 @@ static struct hda_verb alc262_nec_verbs[] = {
11723 11926
11724#define ALC_HP_EVENT 0x37 11927#define ALC_HP_EVENT 0x37
11725 11928
11726static struct hda_verb alc262_fujitsu_unsol_verbs[] = { 11929static const struct hda_verb alc262_fujitsu_unsol_verbs[] = {
11727 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 11930 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11728 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 11931 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11729 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 11932 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
@@ -11731,20 +11934,20 @@ static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
11731 {} 11934 {}
11732}; 11935};
11733 11936
11734static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = { 11937static const struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
11735 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT}, 11938 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11736 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 11939 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11737 {} 11940 {}
11738}; 11941};
11739 11942
11740static struct hda_verb alc262_lenovo_3000_init_verbs[] = { 11943static const struct hda_verb alc262_lenovo_3000_init_verbs[] = {
11741 /* Front Mic pin: input vref at 50% */ 11944 /* Front Mic pin: input vref at 50% */
11742 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50}, 11945 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
11743 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 11946 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11744 {} 11947 {}
11745}; 11948};
11746 11949
11747static struct hda_input_mux alc262_fujitsu_capture_source = { 11950static const struct hda_input_mux alc262_fujitsu_capture_source = {
11748 .num_items = 3, 11951 .num_items = 3,
11749 .items = { 11952 .items = {
11750 { "Mic", 0x0 }, 11953 { "Mic", 0x0 },
@@ -11753,7 +11956,7 @@ static struct hda_input_mux alc262_fujitsu_capture_source = {
11753 }, 11956 },
11754}; 11957};
11755 11958
11756static struct hda_input_mux alc262_HP_capture_source = { 11959static const struct hda_input_mux alc262_HP_capture_source = {
11757 .num_items = 5, 11960 .num_items = 5,
11758 .items = { 11961 .items = {
11759 { "Mic", 0x0 }, 11962 { "Mic", 0x0 },
@@ -11764,7 +11967,7 @@ static struct hda_input_mux alc262_HP_capture_source = {
11764 }, 11967 },
11765}; 11968};
11766 11969
11767static struct hda_input_mux alc262_HP_D7000_capture_source = { 11970static const struct hda_input_mux alc262_HP_D7000_capture_source = {
11768 .num_items = 4, 11971 .num_items = 4,
11769 .items = { 11972 .items = {
11770 { "Mic", 0x0 }, 11973 { "Mic", 0x0 },
@@ -11774,44 +11977,19 @@ static struct hda_input_mux alc262_HP_D7000_capture_source = {
11774 }, 11977 },
11775}; 11978};
11776 11979
11777/* mute/unmute internal speaker according to the hp jacks and mute state */ 11980static void alc262_fujitsu_setup(struct hda_codec *codec)
11778static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
11779{ 11981{
11780 struct alc_spec *spec = codec->spec; 11982 struct alc_spec *spec = codec->spec;
11781 unsigned int mute;
11782
11783 if (force || !spec->sense_updated) {
11784 spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
11785 snd_hda_jack_detect(codec, 0x1b);
11786 spec->sense_updated = 1;
11787 }
11788 /* unmute internal speaker only if both HPs are unplugged and
11789 * master switch is on
11790 */
11791 if (spec->jack_present)
11792 mute = HDA_AMP_MUTE;
11793 else
11794 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
11795 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11796 HDA_AMP_MUTE, mute);
11797}
11798
11799/* unsolicited event for HP jack sensing */
11800static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
11801 unsigned int res)
11802{
11803 if ((res >> 26) != ALC_HP_EVENT)
11804 return;
11805 alc262_fujitsu_automute(codec, 1);
11806}
11807 11983
11808static void alc262_fujitsu_init_hook(struct hda_codec *codec) 11984 spec->autocfg.hp_pins[0] = 0x14;
11809{ 11985 spec->autocfg.hp_pins[1] = 0x1b;
11810 alc262_fujitsu_automute(codec, 1); 11986 spec->autocfg.speaker_pins[0] = 0x15;
11987 spec->automute = 1;
11988 spec->automute_mode = ALC_AUTOMUTE_AMP;
11811} 11989}
11812 11990
11813/* bind volumes of both NID 0x0c and 0x0d */ 11991/* bind volumes of both NID 0x0c and 0x0d */
11814static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = { 11992static const struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
11815 .ops = &snd_hda_bind_vol, 11993 .ops = &snd_hda_bind_vol,
11816 .values = { 11994 .values = {
11817 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT), 11995 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
@@ -11820,78 +11998,15 @@ static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
11820 }, 11998 },
11821}; 11999};
11822 12000
11823/* mute/unmute internal speaker according to the hp jack and mute state */ 12001static const struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
11824static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
11825{
11826 struct alc_spec *spec = codec->spec;
11827 unsigned int mute;
11828
11829 if (force || !spec->sense_updated) {
11830 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
11831 spec->sense_updated = 1;
11832 }
11833 if (spec->jack_present) {
11834 /* mute internal speaker */
11835 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11836 HDA_AMP_MUTE, HDA_AMP_MUTE);
11837 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11838 HDA_AMP_MUTE, HDA_AMP_MUTE);
11839 } else {
11840 /* unmute internal speaker if necessary */
11841 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
11842 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11843 HDA_AMP_MUTE, mute);
11844 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11845 HDA_AMP_MUTE, mute);
11846 }
11847}
11848
11849/* unsolicited event for HP jack sensing */
11850static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
11851 unsigned int res)
11852{
11853 if ((res >> 26) != ALC_HP_EVENT)
11854 return;
11855 alc262_lenovo_3000_automute(codec, 1);
11856}
11857
11858static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
11859 int dir, int idx, long *valp)
11860{
11861 int i, change = 0;
11862
11863 for (i = 0; i < 2; i++, valp++)
11864 change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
11865 HDA_AMP_MUTE,
11866 *valp ? 0 : HDA_AMP_MUTE);
11867 return change;
11868}
11869
11870/* bind hp and internal speaker mute (with plug check) */
11871static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
11872 struct snd_ctl_elem_value *ucontrol)
11873{
11874 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11875 long *valp = ucontrol->value.integer.value;
11876 int change;
11877
11878 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11879 change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11880 if (change)
11881 alc262_fujitsu_automute(codec, 0);
11882 return change;
11883}
11884
11885static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
11886 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol), 12002 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11887 { 12003 {
11888 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 12004 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11889 .name = "Master Playback Switch", 12005 .name = "Master Playback Switch",
11890 .subdevice = HDA_SUBDEV_AMP_FLAG, 12006 .subdevice = HDA_SUBDEV_NID_FLAG | 0x14,
11891 .info = snd_hda_mixer_amp_switch_info, 12007 .info = snd_ctl_boolean_mono_info,
11892 .get = snd_hda_mixer_amp_switch_get, 12008 .get = alc262_hp_master_sw_get,
11893 .put = alc262_fujitsu_master_sw_put, 12009 .put = alc262_hp_master_sw_put,
11894 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11895 }, 12010 },
11896 { 12011 {
11897 .iface = NID_MAPPING, 12012 .iface = NID_MAPPING,
@@ -11909,30 +12024,26 @@ static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
11909 { } /* end */ 12024 { } /* end */
11910}; 12025};
11911 12026
11912/* bind hp and internal speaker mute (with plug check) */ 12027static void alc262_lenovo_3000_setup(struct hda_codec *codec)
11913static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
11914 struct snd_ctl_elem_value *ucontrol)
11915{ 12028{
11916 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 12029 struct alc_spec *spec = codec->spec;
11917 long *valp = ucontrol->value.integer.value;
11918 int change;
11919 12030
11920 change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp); 12031 spec->autocfg.hp_pins[0] = 0x1b;
11921 if (change) 12032 spec->autocfg.speaker_pins[0] = 0x14;
11922 alc262_lenovo_3000_automute(codec, 0); 12033 spec->autocfg.speaker_pins[1] = 0x16;
11923 return change; 12034 spec->automute = 1;
12035 spec->automute_mode = ALC_AUTOMUTE_AMP;
11924} 12036}
11925 12037
11926static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = { 12038static const struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
11927 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol), 12039 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11928 { 12040 {
11929 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 12041 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11930 .name = "Master Playback Switch", 12042 .name = "Master Playback Switch",
11931 .subdevice = HDA_SUBDEV_AMP_FLAG, 12043 .subdevice = HDA_SUBDEV_NID_FLAG | 0x1b,
11932 .info = snd_hda_mixer_amp_switch_info, 12044 .info = snd_ctl_boolean_mono_info,
11933 .get = snd_hda_mixer_amp_switch_get, 12045 .get = alc262_hp_master_sw_get,
11934 .put = alc262_lenovo_3000_master_sw_put, 12046 .put = alc262_hp_master_sw_put,
11935 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
11936 }, 12047 },
11937 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 12048 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11938 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 12049 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
@@ -11945,7 +12056,7 @@ static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
11945 { } /* end */ 12056 { } /* end */
11946}; 12057};
11947 12058
11948static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = { 12059static const struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
11949 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol), 12060 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11950 ALC262_HIPPO_MASTER_SWITCH, 12061 ALC262_HIPPO_MASTER_SWITCH,
11951 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 12062 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
@@ -11958,13 +12069,13 @@ static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
11958}; 12069};
11959 12070
11960/* additional init verbs for Benq laptops */ 12071/* additional init verbs for Benq laptops */
11961static struct hda_verb alc262_EAPD_verbs[] = { 12072static const struct hda_verb alc262_EAPD_verbs[] = {
11962 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 12073 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11963 {0x20, AC_VERB_SET_PROC_COEF, 0x3070}, 12074 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
11964 {} 12075 {}
11965}; 12076};
11966 12077
11967static struct hda_verb alc262_benq_t31_EAPD_verbs[] = { 12078static const struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
11968 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 12079 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11969 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, 12080 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11970 12081
@@ -11974,7 +12085,7 @@ static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
11974}; 12085};
11975 12086
11976/* Samsung Q1 Ultra Vista model setup */ 12087/* Samsung Q1 Ultra Vista model setup */
11977static struct snd_kcontrol_new alc262_ultra_mixer[] = { 12088static const struct snd_kcontrol_new alc262_ultra_mixer[] = {
11978 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 12089 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11979 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT), 12090 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11980 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 12091 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
@@ -11984,7 +12095,7 @@ static struct snd_kcontrol_new alc262_ultra_mixer[] = {
11984 { } /* end */ 12095 { } /* end */
11985}; 12096};
11986 12097
11987static struct hda_verb alc262_ultra_verbs[] = { 12098static const struct hda_verb alc262_ultra_verbs[] = {
11988 /* output mixer */ 12099 /* output mixer */
11989 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 12100 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11990 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 12101 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
@@ -12047,7 +12158,7 @@ static void alc262_ultra_unsol_event(struct hda_codec *codec,
12047 alc262_ultra_automute(codec); 12158 alc262_ultra_automute(codec);
12048} 12159}
12049 12160
12050static struct hda_input_mux alc262_ultra_capture_source = { 12161static const struct hda_input_mux alc262_ultra_capture_source = {
12051 .num_items = 2, 12162 .num_items = 2,
12052 .items = { 12163 .items = {
12053 { "Mic", 0x1 }, 12164 { "Mic", 0x1 },
@@ -12073,7 +12184,7 @@ static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
12073 return ret; 12184 return ret;
12074} 12185}
12075 12186
12076static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = { 12187static const struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
12077 HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT), 12188 HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
12078 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT), 12189 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
12079 { 12190 {
@@ -12148,9 +12259,9 @@ static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
12148 12259
12149 spec->multiout.num_dacs = 1; /* only use one dac */ 12260 spec->multiout.num_dacs = 1; /* only use one dac */
12150 spec->multiout.dac_nids = spec->private_dac_nids; 12261 spec->multiout.dac_nids = spec->private_dac_nids;
12151 spec->multiout.dac_nids[0] = 2; 12262 spec->private_dac_nids[0] = 2;
12152 12263
12153 pfx = alc_get_line_out_pfx(cfg, true); 12264 pfx = alc_get_line_out_pfx(spec, true);
12154 if (!pfx) 12265 if (!pfx)
12155 pfx = "Front"; 12266 pfx = "Front";
12156 for (i = 0; i < 2; i++) { 12267 for (i = 0; i < 2; i++) {
@@ -12204,7 +12315,7 @@ static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
12204/* 12315/*
12205 * generic initialization of ADC, input mixers and output mixers 12316 * generic initialization of ADC, input mixers and output mixers
12206 */ 12317 */
12207static struct hda_verb alc262_volume_init_verbs[] = { 12318static const struct hda_verb alc262_volume_init_verbs[] = {
12208 /* 12319 /*
12209 * Unmute ADC0-2 and set the default input to mic-in 12320 * Unmute ADC0-2 and set the default input to mic-in
12210 */ 12321 */
@@ -12265,7 +12376,7 @@ static struct hda_verb alc262_volume_init_verbs[] = {
12265 { } 12376 { }
12266}; 12377};
12267 12378
12268static struct hda_verb alc262_HP_BPC_init_verbs[] = { 12379static const struct hda_verb alc262_HP_BPC_init_verbs[] = {
12269 /* 12380 /*
12270 * Unmute ADC0-2 and set the default input to mic-in 12381 * Unmute ADC0-2 and set the default input to mic-in
12271 */ 12382 */
@@ -12369,7 +12480,7 @@ static struct hda_verb alc262_HP_BPC_init_verbs[] = {
12369 { } 12480 { }
12370}; 12481};
12371 12482
12372static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = { 12483static const struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
12373 /* 12484 /*
12374 * Unmute ADC0-2 and set the default input to mic-in 12485 * Unmute ADC0-2 and set the default input to mic-in
12375 */ 12486 */
@@ -12465,7 +12576,7 @@ static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
12465 { } 12576 { }
12466}; 12577};
12467 12578
12468static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = { 12579static const struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
12469 12580
12470 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Front Speaker */ 12581 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Front Speaker */
12471 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 12582 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
@@ -12501,7 +12612,7 @@ static const struct alc_fixup alc262_fixups[] = {
12501 }, 12612 },
12502}; 12613};
12503 12614
12504static struct snd_pci_quirk alc262_fixup_tbl[] = { 12615static const struct snd_pci_quirk alc262_fixup_tbl[] = {
12505 SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", PINFIX_FSC_H270), 12616 SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", PINFIX_FSC_H270),
12506 {} 12617 {}
12507}; 12618};
@@ -12524,7 +12635,7 @@ static int alc262_parse_auto_config(struct hda_codec *codec)
12524{ 12635{
12525 struct alc_spec *spec = codec->spec; 12636 struct alc_spec *spec = codec->spec;
12526 int err; 12637 int err;
12527 static hda_nid_t alc262_ignore[] = { 0x1d, 0 }; 12638 static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
12528 12639
12529 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 12640 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12530 alc262_ignore); 12641 alc262_ignore);
@@ -12609,7 +12720,7 @@ static const char * const alc262_models[ALC262_MODEL_LAST] = {
12609 [ALC262_AUTO] = "auto", 12720 [ALC262_AUTO] = "auto",
12610}; 12721};
12611 12722
12612static struct snd_pci_quirk alc262_cfg_tbl[] = { 12723static const struct snd_pci_quirk alc262_cfg_tbl[] = {
12613 SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO), 12724 SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
12614 SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC), 12725 SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
12615 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series", 12726 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
@@ -12661,7 +12772,7 @@ static struct snd_pci_quirk alc262_cfg_tbl[] = {
12661 {} 12772 {}
12662}; 12773};
12663 12774
12664static struct alc_config_preset alc262_presets[] = { 12775static const struct alc_config_preset alc262_presets[] = {
12665 [ALC262_BASIC] = { 12776 [ALC262_BASIC] = {
12666 .mixers = { alc262_base_mixer }, 12777 .mixers = { alc262_base_mixer },
12667 .init_verbs = { alc262_init_verbs }, 12778 .init_verbs = { alc262_init_verbs },
@@ -12682,9 +12793,9 @@ static struct alc_config_preset alc262_presets[] = {
12682 .num_channel_mode = ARRAY_SIZE(alc262_modes), 12793 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12683 .channel_mode = alc262_modes, 12794 .channel_mode = alc262_modes,
12684 .input_mux = &alc262_capture_source, 12795 .input_mux = &alc262_capture_source,
12685 .unsol_event = alc262_hippo_unsol_event, 12796 .unsol_event = alc_sku_unsol_event,
12686 .setup = alc262_hippo_setup, 12797 .setup = alc262_hippo_setup,
12687 .init_hook = alc262_hippo_automute, 12798 .init_hook = alc_inithook,
12688 }, 12799 },
12689 [ALC262_HIPPO_1] = { 12800 [ALC262_HIPPO_1] = {
12690 .mixers = { alc262_hippo1_mixer }, 12801 .mixers = { alc262_hippo1_mixer },
@@ -12696,9 +12807,9 @@ static struct alc_config_preset alc262_presets[] = {
12696 .num_channel_mode = ARRAY_SIZE(alc262_modes), 12807 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12697 .channel_mode = alc262_modes, 12808 .channel_mode = alc262_modes,
12698 .input_mux = &alc262_capture_source, 12809 .input_mux = &alc262_capture_source,
12699 .unsol_event = alc262_hippo_unsol_event, 12810 .unsol_event = alc_sku_unsol_event,
12700 .setup = alc262_hippo1_setup, 12811 .setup = alc262_hippo1_setup,
12701 .init_hook = alc262_hippo_automute, 12812 .init_hook = alc_inithook,
12702 }, 12813 },
12703 [ALC262_FUJITSU] = { 12814 [ALC262_FUJITSU] = {
12704 .mixers = { alc262_fujitsu_mixer }, 12815 .mixers = { alc262_fujitsu_mixer },
@@ -12711,8 +12822,9 @@ static struct alc_config_preset alc262_presets[] = {
12711 .num_channel_mode = ARRAY_SIZE(alc262_modes), 12822 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12712 .channel_mode = alc262_modes, 12823 .channel_mode = alc262_modes,
12713 .input_mux = &alc262_fujitsu_capture_source, 12824 .input_mux = &alc262_fujitsu_capture_source,
12714 .unsol_event = alc262_fujitsu_unsol_event, 12825 .unsol_event = alc_sku_unsol_event,
12715 .init_hook = alc262_fujitsu_init_hook, 12826 .setup = alc262_fujitsu_setup,
12827 .init_hook = alc_inithook,
12716 }, 12828 },
12717 [ALC262_HP_BPC] = { 12829 [ALC262_HP_BPC] = {
12718 .mixers = { alc262_HP_BPC_mixer }, 12830 .mixers = { alc262_HP_BPC_mixer },
@@ -12723,8 +12835,9 @@ static struct alc_config_preset alc262_presets[] = {
12723 .num_channel_mode = ARRAY_SIZE(alc262_modes), 12835 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12724 .channel_mode = alc262_modes, 12836 .channel_mode = alc262_modes,
12725 .input_mux = &alc262_HP_capture_source, 12837 .input_mux = &alc262_HP_capture_source,
12726 .unsol_event = alc262_hp_bpc_unsol_event, 12838 .unsol_event = alc_sku_unsol_event,
12727 .init_hook = alc262_hp_bpc_automute, 12839 .setup = alc262_hp_bpc_setup,
12840 .init_hook = alc_inithook,
12728 }, 12841 },
12729 [ALC262_HP_BPC_D7000_WF] = { 12842 [ALC262_HP_BPC_D7000_WF] = {
12730 .mixers = { alc262_HP_BPC_WildWest_mixer }, 12843 .mixers = { alc262_HP_BPC_WildWest_mixer },
@@ -12735,8 +12848,9 @@ static struct alc_config_preset alc262_presets[] = {
12735 .num_channel_mode = ARRAY_SIZE(alc262_modes), 12848 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12736 .channel_mode = alc262_modes, 12849 .channel_mode = alc262_modes,
12737 .input_mux = &alc262_HP_D7000_capture_source, 12850 .input_mux = &alc262_HP_D7000_capture_source,
12738 .unsol_event = alc262_hp_wildwest_unsol_event, 12851 .unsol_event = alc_sku_unsol_event,
12739 .init_hook = alc262_hp_wildwest_automute, 12852 .setup = alc262_hp_wildwest_setup,
12853 .init_hook = alc_inithook,
12740 }, 12854 },
12741 [ALC262_HP_BPC_D7000_WL] = { 12855 [ALC262_HP_BPC_D7000_WL] = {
12742 .mixers = { alc262_HP_BPC_WildWest_mixer, 12856 .mixers = { alc262_HP_BPC_WildWest_mixer,
@@ -12748,8 +12862,9 @@ static struct alc_config_preset alc262_presets[] = {
12748 .num_channel_mode = ARRAY_SIZE(alc262_modes), 12862 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12749 .channel_mode = alc262_modes, 12863 .channel_mode = alc262_modes,
12750 .input_mux = &alc262_HP_D7000_capture_source, 12864 .input_mux = &alc262_HP_D7000_capture_source,
12751 .unsol_event = alc262_hp_wildwest_unsol_event, 12865 .unsol_event = alc_sku_unsol_event,
12752 .init_hook = alc262_hp_wildwest_automute, 12866 .setup = alc262_hp_wildwest_setup,
12867 .init_hook = alc_inithook,
12753 }, 12868 },
12754 [ALC262_HP_TC_T5735] = { 12869 [ALC262_HP_TC_T5735] = {
12755 .mixers = { alc262_hp_t5735_mixer }, 12870 .mixers = { alc262_hp_t5735_mixer },
@@ -12792,9 +12907,9 @@ static struct alc_config_preset alc262_presets[] = {
12792 .num_channel_mode = ARRAY_SIZE(alc262_modes), 12907 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12793 .channel_mode = alc262_modes, 12908 .channel_mode = alc262_modes,
12794 .input_mux = &alc262_capture_source, 12909 .input_mux = &alc262_capture_source,
12795 .unsol_event = alc262_hippo_unsol_event, 12910 .unsol_event = alc_sku_unsol_event,
12796 .setup = alc262_hippo_setup, 12911 .setup = alc262_hippo_setup,
12797 .init_hook = alc262_hippo_automute, 12912 .init_hook = alc_inithook,
12798 }, 12913 },
12799 [ALC262_BENQ_T31] = { 12914 [ALC262_BENQ_T31] = {
12800 .mixers = { alc262_benq_t31_mixer }, 12915 .mixers = { alc262_benq_t31_mixer },
@@ -12806,9 +12921,9 @@ static struct alc_config_preset alc262_presets[] = {
12806 .num_channel_mode = ARRAY_SIZE(alc262_modes), 12921 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12807 .channel_mode = alc262_modes, 12922 .channel_mode = alc262_modes,
12808 .input_mux = &alc262_capture_source, 12923 .input_mux = &alc262_capture_source,
12809 .unsol_event = alc262_hippo_unsol_event, 12924 .unsol_event = alc_sku_unsol_event,
12810 .setup = alc262_hippo_setup, 12925 .setup = alc262_hippo_setup,
12811 .init_hook = alc262_hippo_automute, 12926 .init_hook = alc_inithook,
12812 }, 12927 },
12813 [ALC262_ULTRA] = { 12928 [ALC262_ULTRA] = {
12814 .mixers = { alc262_ultra_mixer }, 12929 .mixers = { alc262_ultra_mixer },
@@ -12837,7 +12952,9 @@ static struct alc_config_preset alc262_presets[] = {
12837 .num_channel_mode = ARRAY_SIZE(alc262_modes), 12952 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12838 .channel_mode = alc262_modes, 12953 .channel_mode = alc262_modes,
12839 .input_mux = &alc262_fujitsu_capture_source, 12954 .input_mux = &alc262_fujitsu_capture_source,
12840 .unsol_event = alc262_lenovo_3000_unsol_event, 12955 .unsol_event = alc_sku_unsol_event,
12956 .setup = alc262_lenovo_3000_setup,
12957 .init_hook = alc_inithook,
12841 }, 12958 },
12842 [ALC262_NEC] = { 12959 [ALC262_NEC] = {
12843 .mixers = { alc262_nec_mixer }, 12960 .mixers = { alc262_nec_mixer },
@@ -12874,9 +12991,9 @@ static struct alc_config_preset alc262_presets[] = {
12874 .num_channel_mode = ARRAY_SIZE(alc262_modes), 12991 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12875 .channel_mode = alc262_modes, 12992 .channel_mode = alc262_modes,
12876 .input_mux = &alc262_capture_source, 12993 .input_mux = &alc262_capture_source,
12877 .unsol_event = alc262_hippo_unsol_event, 12994 .unsol_event = alc_sku_unsol_event,
12878 .setup = alc262_hippo_setup, 12995 .setup = alc262_hippo_setup,
12879 .init_hook = alc262_hippo_automute, 12996 .init_hook = alc_inithook,
12880 }, 12997 },
12881 [ALC262_TYAN] = { 12998 [ALC262_TYAN] = {
12882 .mixers = { alc262_tyan_mixer }, 12999 .mixers = { alc262_tyan_mixer },
@@ -12888,9 +13005,9 @@ static struct alc_config_preset alc262_presets[] = {
12888 .num_channel_mode = ARRAY_SIZE(alc262_modes), 13005 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12889 .channel_mode = alc262_modes, 13006 .channel_mode = alc262_modes,
12890 .input_mux = &alc262_capture_source, 13007 .input_mux = &alc262_capture_source,
12891 .unsol_event = alc_automute_amp_unsol_event, 13008 .unsol_event = alc_sku_unsol_event,
12892 .setup = alc262_tyan_setup, 13009 .setup = alc262_tyan_setup,
12893 .init_hook = alc_automute_amp, 13010 .init_hook = alc_hp_automute,
12894 }, 13011 },
12895}; 13012};
12896 13013
@@ -13011,6 +13128,7 @@ static int patch_alc262(struct hda_codec *codec)
13011 codec->patch_ops = alc_patch_ops; 13128 codec->patch_ops = alc_patch_ops;
13012 if (board_config == ALC262_AUTO) 13129 if (board_config == ALC262_AUTO)
13013 spec->init_hook = alc262_auto_init; 13130 spec->init_hook = alc262_auto_init;
13131 spec->shutup = alc_eapd_shutup;
13014 13132
13015 alc_init_jacks(codec); 13133 alc_init_jacks(codec);
13016#ifdef CONFIG_SND_HDA_POWER_SAVE 13134#ifdef CONFIG_SND_HDA_POWER_SAVE
@@ -13027,24 +13145,24 @@ static int patch_alc262(struct hda_codec *codec)
13027#define ALC268_DIGOUT_NID ALC880_DIGOUT_NID 13145#define ALC268_DIGOUT_NID ALC880_DIGOUT_NID
13028#define alc268_modes alc260_modes 13146#define alc268_modes alc260_modes
13029 13147
13030static hda_nid_t alc268_dac_nids[2] = { 13148static const hda_nid_t alc268_dac_nids[2] = {
13031 /* front, hp */ 13149 /* front, hp */
13032 0x02, 0x03 13150 0x02, 0x03
13033}; 13151};
13034 13152
13035static hda_nid_t alc268_adc_nids[2] = { 13153static const hda_nid_t alc268_adc_nids[2] = {
13036 /* ADC0-1 */ 13154 /* ADC0-1 */
13037 0x08, 0x07 13155 0x08, 0x07
13038}; 13156};
13039 13157
13040static hda_nid_t alc268_adc_nids_alt[1] = { 13158static const hda_nid_t alc268_adc_nids_alt[1] = {
13041 /* ADC0 */ 13159 /* ADC0 */
13042 0x08 13160 0x08
13043}; 13161};
13044 13162
13045static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 }; 13163static const hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
13046 13164
13047static struct snd_kcontrol_new alc268_base_mixer[] = { 13165static const struct snd_kcontrol_new alc268_base_mixer[] = {
13048 /* output mixer control */ 13166 /* output mixer control */
13049 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), 13167 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
13050 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 13168 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
@@ -13056,7 +13174,7 @@ static struct snd_kcontrol_new alc268_base_mixer[] = {
13056 { } 13174 { }
13057}; 13175};
13058 13176
13059static struct snd_kcontrol_new alc268_toshiba_mixer[] = { 13177static const struct snd_kcontrol_new alc268_toshiba_mixer[] = {
13060 /* output mixer control */ 13178 /* output mixer control */
13061 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), 13179 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
13062 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT), 13180 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
@@ -13068,7 +13186,7 @@ static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
13068}; 13186};
13069 13187
13070/* bind Beep switches of both NID 0x0f and 0x10 */ 13188/* bind Beep switches of both NID 0x0f and 0x10 */
13071static struct hda_bind_ctls alc268_bind_beep_sw = { 13189static const struct hda_bind_ctls alc268_bind_beep_sw = {
13072 .ops = &snd_hda_bind_sw, 13190 .ops = &snd_hda_bind_sw,
13073 .values = { 13191 .values = {
13074 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT), 13192 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
@@ -13077,27 +13195,27 @@ static struct hda_bind_ctls alc268_bind_beep_sw = {
13077 }, 13195 },
13078}; 13196};
13079 13197
13080static struct snd_kcontrol_new alc268_beep_mixer[] = { 13198static const struct snd_kcontrol_new alc268_beep_mixer[] = {
13081 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT), 13199 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
13082 HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw), 13200 HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
13083 { } 13201 { }
13084}; 13202};
13085 13203
13086static struct hda_verb alc268_eapd_verbs[] = { 13204static const struct hda_verb alc268_eapd_verbs[] = {
13087 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 13205 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
13088 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 13206 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
13089 { } 13207 { }
13090}; 13208};
13091 13209
13092/* Toshiba specific */ 13210/* Toshiba specific */
13093static struct hda_verb alc268_toshiba_verbs[] = { 13211static const struct hda_verb alc268_toshiba_verbs[] = {
13094 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 13212 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13095 { } /* end */ 13213 { } /* end */
13096}; 13214};
13097 13215
13098/* Acer specific */ 13216/* Acer specific */
13099/* bind volumes of both NID 0x02 and 0x03 */ 13217/* bind volumes of both NID 0x02 and 0x03 */
13100static struct hda_bind_ctls alc268_acer_bind_master_vol = { 13218static const struct hda_bind_ctls alc268_acer_bind_master_vol = {
13101 .ops = &snd_hda_bind_vol, 13219 .ops = &snd_hda_bind_vol,
13102 .values = { 13220 .values = {
13103 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT), 13221 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
@@ -13106,66 +13224,44 @@ static struct hda_bind_ctls alc268_acer_bind_master_vol = {
13106 }, 13224 },
13107}; 13225};
13108 13226
13109/* mute/unmute internal speaker according to the hp jack and mute state */ 13227static void alc268_acer_setup(struct hda_codec *codec)
13110static void alc268_acer_automute(struct hda_codec *codec, int force)
13111{ 13228{
13112 struct alc_spec *spec = codec->spec; 13229 struct alc_spec *spec = codec->spec;
13113 unsigned int mute;
13114 13230
13115 if (force || !spec->sense_updated) { 13231 spec->autocfg.hp_pins[0] = 0x14;
13116 spec->jack_present = snd_hda_jack_detect(codec, 0x14); 13232 spec->autocfg.speaker_pins[0] = 0x15;
13117 spec->sense_updated = 1; 13233 spec->automute = 1;
13118 } 13234 spec->automute_mode = ALC_AUTOMUTE_AMP;
13119 if (spec->jack_present)
13120 mute = HDA_AMP_MUTE; /* mute internal speaker */
13121 else /* unmute internal speaker if necessary */
13122 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
13123 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
13124 HDA_AMP_MUTE, mute);
13125} 13235}
13126 13236
13237#define alc268_acer_master_sw_get alc262_hp_master_sw_get
13238#define alc268_acer_master_sw_put alc262_hp_master_sw_put
13127 13239
13128/* bind hp and internal speaker mute (with plug check) */ 13240static const struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
13129static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
13130 struct snd_ctl_elem_value *ucontrol)
13131{
13132 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
13133 long *valp = ucontrol->value.integer.value;
13134 int change;
13135
13136 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
13137 if (change)
13138 alc268_acer_automute(codec, 0);
13139 return change;
13140}
13141
13142static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
13143 /* output mixer control */ 13241 /* output mixer control */
13144 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), 13242 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13145 { 13243 {
13146 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 13244 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13147 .name = "Master Playback Switch", 13245 .name = "Master Playback Switch",
13148 .subdevice = HDA_SUBDEV_AMP_FLAG, 13246 .subdevice = HDA_SUBDEV_NID_FLAG | 0x15,
13149 .info = snd_hda_mixer_amp_switch_info, 13247 .info = snd_ctl_boolean_mono_info,
13150 .get = snd_hda_mixer_amp_switch_get, 13248 .get = alc268_acer_master_sw_get,
13151 .put = alc268_acer_master_sw_put, 13249 .put = alc268_acer_master_sw_put,
13152 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13153 }, 13250 },
13154 HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT), 13251 HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
13155 { } 13252 { }
13156}; 13253};
13157 13254
13158static struct snd_kcontrol_new alc268_acer_mixer[] = { 13255static const struct snd_kcontrol_new alc268_acer_mixer[] = {
13159 /* output mixer control */ 13256 /* output mixer control */
13160 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), 13257 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13161 { 13258 {
13162 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 13259 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13163 .name = "Master Playback Switch", 13260 .name = "Master Playback Switch",
13164 .subdevice = HDA_SUBDEV_AMP_FLAG, 13261 .subdevice = HDA_SUBDEV_NID_FLAG | 0x14,
13165 .info = snd_hda_mixer_amp_switch_info, 13262 .info = snd_ctl_boolean_mono_info,
13166 .get = snd_hda_mixer_amp_switch_get, 13263 .get = alc268_acer_master_sw_get,
13167 .put = alc268_acer_master_sw_put, 13264 .put = alc268_acer_master_sw_put,
13168 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13169 }, 13265 },
13170 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 13266 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
13171 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT), 13267 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
@@ -13173,24 +13269,23 @@ static struct snd_kcontrol_new alc268_acer_mixer[] = {
13173 { } 13269 { }
13174}; 13270};
13175 13271
13176static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = { 13272static const struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
13177 /* output mixer control */ 13273 /* output mixer control */
13178 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), 13274 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13179 { 13275 {
13180 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 13276 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13181 .name = "Master Playback Switch", 13277 .name = "Master Playback Switch",
13182 .subdevice = HDA_SUBDEV_AMP_FLAG, 13278 .subdevice = HDA_SUBDEV_NID_FLAG | 0x14,
13183 .info = snd_hda_mixer_amp_switch_info, 13279 .info = snd_ctl_boolean_mono_info,
13184 .get = snd_hda_mixer_amp_switch_get, 13280 .get = alc268_acer_master_sw_get,
13185 .put = alc268_acer_master_sw_put, 13281 .put = alc268_acer_master_sw_put,
13186 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13187 }, 13282 },
13188 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 13283 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
13189 HDA_CODEC_VOLUME("Line In Boost Volume", 0x1a, 0, HDA_INPUT), 13284 HDA_CODEC_VOLUME("Line In Boost Volume", 0x1a, 0, HDA_INPUT),
13190 { } 13285 { }
13191}; 13286};
13192 13287
13193static struct hda_verb alc268_acer_aspire_one_verbs[] = { 13288static const struct hda_verb alc268_acer_aspire_one_verbs[] = {
13194 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 13289 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13195 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 13290 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13196 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 13291 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
@@ -13200,7 +13295,7 @@ static struct hda_verb alc268_acer_aspire_one_verbs[] = {
13200 { } 13295 { }
13201}; 13296};
13202 13297
13203static struct hda_verb alc268_acer_verbs[] = { 13298static const struct hda_verb alc268_acer_verbs[] = {
13204 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */ 13299 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
13205 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 13300 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13206 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 13301 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
@@ -13212,53 +13307,16 @@ static struct hda_verb alc268_acer_verbs[] = {
13212}; 13307};
13213 13308
13214/* unsolicited event for HP jack sensing */ 13309/* unsolicited event for HP jack sensing */
13215#define alc268_toshiba_unsol_event alc262_hippo_unsol_event
13216#define alc268_toshiba_setup alc262_hippo_setup 13310#define alc268_toshiba_setup alc262_hippo_setup
13217#define alc268_toshiba_automute alc262_hippo_automute
13218
13219static void alc268_acer_unsol_event(struct hda_codec *codec,
13220 unsigned int res)
13221{
13222 if ((res >> 26) != ALC880_HP_EVENT)
13223 return;
13224 alc268_acer_automute(codec, 1);
13225}
13226
13227static void alc268_acer_init_hook(struct hda_codec *codec)
13228{
13229 alc268_acer_automute(codec, 1);
13230}
13231
13232/* toggle speaker-output according to the hp-jack state */
13233static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
13234{
13235 unsigned int present;
13236 unsigned char bits;
13237
13238 present = snd_hda_jack_detect(codec, 0x15);
13239 bits = present ? HDA_AMP_MUTE : 0;
13240 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
13241 HDA_AMP_MUTE, bits);
13242 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
13243 HDA_AMP_MUTE, bits);
13244}
13245
13246static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
13247 unsigned int res)
13248{
13249 switch (res >> 26) {
13250 case ALC880_HP_EVENT:
13251 alc268_aspire_one_speaker_automute(codec);
13252 break;
13253 case ALC880_MIC_EVENT:
13254 alc_mic_automute(codec);
13255 break;
13256 }
13257}
13258 13311
13259static void alc268_acer_lc_setup(struct hda_codec *codec) 13312static void alc268_acer_lc_setup(struct hda_codec *codec)
13260{ 13313{
13261 struct alc_spec *spec = codec->spec; 13314 struct alc_spec *spec = codec->spec;
13315 spec->autocfg.hp_pins[0] = 0x15;
13316 spec->autocfg.speaker_pins[0] = 0x14;
13317 spec->automute_mixer_nid[0] = 0x0f;
13318 spec->automute = 1;
13319 spec->automute_mode = ALC_AUTOMUTE_MIXER;
13262 spec->ext_mic.pin = 0x18; 13320 spec->ext_mic.pin = 0x18;
13263 spec->ext_mic.mux_idx = 0; 13321 spec->ext_mic.mux_idx = 0;
13264 spec->int_mic.pin = 0x12; 13322 spec->int_mic.pin = 0x12;
@@ -13266,13 +13324,7 @@ static void alc268_acer_lc_setup(struct hda_codec *codec)
13266 spec->auto_mic = 1; 13324 spec->auto_mic = 1;
13267} 13325}
13268 13326
13269static void alc268_acer_lc_init_hook(struct hda_codec *codec) 13327static const struct snd_kcontrol_new alc268_dell_mixer[] = {
13270{
13271 alc268_aspire_one_speaker_automute(codec);
13272 alc_mic_automute(codec);
13273}
13274
13275static struct snd_kcontrol_new alc268_dell_mixer[] = {
13276 /* output mixer control */ 13328 /* output mixer control */
13277 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 13329 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13278 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 13330 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
@@ -13283,7 +13335,7 @@ static struct snd_kcontrol_new alc268_dell_mixer[] = {
13283 { } 13335 { }
13284}; 13336};
13285 13337
13286static struct hda_verb alc268_dell_verbs[] = { 13338static const struct hda_verb alc268_dell_verbs[] = {
13287 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 13339 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13288 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 13340 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13289 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 13341 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
@@ -13303,9 +13355,11 @@ static void alc268_dell_setup(struct hda_codec *codec)
13303 spec->int_mic.pin = 0x19; 13355 spec->int_mic.pin = 0x19;
13304 spec->int_mic.mux_idx = 1; 13356 spec->int_mic.mux_idx = 1;
13305 spec->auto_mic = 1; 13357 spec->auto_mic = 1;
13358 spec->automute = 1;
13359 spec->automute_mode = ALC_AUTOMUTE_PIN;
13306} 13360}
13307 13361
13308static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = { 13362static const struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
13309 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT), 13363 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
13310 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 13364 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13311 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT), 13365 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
@@ -13317,7 +13371,7 @@ static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
13317 { } 13371 { }
13318}; 13372};
13319 13373
13320static struct hda_verb alc267_quanta_il1_verbs[] = { 13374static const struct hda_verb alc267_quanta_il1_verbs[] = {
13321 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 13375 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13322 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, 13376 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
13323 { } 13377 { }
@@ -13333,12 +13387,14 @@ static void alc267_quanta_il1_setup(struct hda_codec *codec)
13333 spec->int_mic.pin = 0x19; 13387 spec->int_mic.pin = 0x19;
13334 spec->int_mic.mux_idx = 1; 13388 spec->int_mic.mux_idx = 1;
13335 spec->auto_mic = 1; 13389 spec->auto_mic = 1;
13390 spec->automute = 1;
13391 spec->automute_mode = ALC_AUTOMUTE_PIN;
13336} 13392}
13337 13393
13338/* 13394/*
13339 * generic initialization of ADC, input mixers and output mixers 13395 * generic initialization of ADC, input mixers and output mixers
13340 */ 13396 */
13341static struct hda_verb alc268_base_init_verbs[] = { 13397static const struct hda_verb alc268_base_init_verbs[] = {
13342 /* Unmute DAC0-1 and set vol = 0 */ 13398 /* Unmute DAC0-1 and set vol = 0 */
13343 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 13399 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13344 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 13400 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
@@ -13386,7 +13442,7 @@ static struct hda_verb alc268_base_init_verbs[] = {
13386/* 13442/*
13387 * generic initialization of ADC, input mixers and output mixers 13443 * generic initialization of ADC, input mixers and output mixers
13388 */ 13444 */
13389static struct hda_verb alc268_volume_init_verbs[] = { 13445static const struct hda_verb alc268_volume_init_verbs[] = {
13390 /* set output DAC */ 13446 /* set output DAC */
13391 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 13447 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13392 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 13448 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
@@ -13412,20 +13468,20 @@ static struct hda_verb alc268_volume_init_verbs[] = {
13412 { } 13468 { }
13413}; 13469};
13414 13470
13415static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = { 13471static const struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
13416 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT), 13472 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13417 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT), 13473 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
13418 { } /* end */ 13474 { } /* end */
13419}; 13475};
13420 13476
13421static struct snd_kcontrol_new alc268_capture_alt_mixer[] = { 13477static const struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
13422 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT), 13478 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13423 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT), 13479 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
13424 _DEFINE_CAPSRC(1), 13480 _DEFINE_CAPSRC(1),
13425 { } /* end */ 13481 { } /* end */
13426}; 13482};
13427 13483
13428static struct snd_kcontrol_new alc268_capture_mixer[] = { 13484static const struct snd_kcontrol_new alc268_capture_mixer[] = {
13429 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT), 13485 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13430 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT), 13486 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
13431 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT), 13487 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
@@ -13434,7 +13490,7 @@ static struct snd_kcontrol_new alc268_capture_mixer[] = {
13434 { } /* end */ 13490 { } /* end */
13435}; 13491};
13436 13492
13437static struct hda_input_mux alc268_capture_source = { 13493static const struct hda_input_mux alc268_capture_source = {
13438 .num_items = 4, 13494 .num_items = 4,
13439 .items = { 13495 .items = {
13440 { "Mic", 0x0 }, 13496 { "Mic", 0x0 },
@@ -13444,7 +13500,7 @@ static struct hda_input_mux alc268_capture_source = {
13444 }, 13500 },
13445}; 13501};
13446 13502
13447static struct hda_input_mux alc268_acer_capture_source = { 13503static const struct hda_input_mux alc268_acer_capture_source = {
13448 .num_items = 3, 13504 .num_items = 3,
13449 .items = { 13505 .items = {
13450 { "Mic", 0x0 }, 13506 { "Mic", 0x0 },
@@ -13453,7 +13509,7 @@ static struct hda_input_mux alc268_acer_capture_source = {
13453 }, 13509 },
13454}; 13510};
13455 13511
13456static struct hda_input_mux alc268_acer_dmic_capture_source = { 13512static const struct hda_input_mux alc268_acer_dmic_capture_source = {
13457 .num_items = 3, 13513 .num_items = 3,
13458 .items = { 13514 .items = {
13459 { "Mic", 0x0 }, 13515 { "Mic", 0x0 },
@@ -13463,7 +13519,7 @@ static struct hda_input_mux alc268_acer_dmic_capture_source = {
13463}; 13519};
13464 13520
13465#ifdef CONFIG_SND_DEBUG 13521#ifdef CONFIG_SND_DEBUG
13466static struct snd_kcontrol_new alc268_test_mixer[] = { 13522static const struct snd_kcontrol_new alc268_test_mixer[] = {
13467 /* Volume widgets */ 13523 /* Volume widgets */
13468 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT), 13524 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13469 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT), 13525 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
@@ -13542,7 +13598,7 @@ static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
13542 HDA_OUTPUT)); 13598 HDA_OUTPUT));
13543 if (err < 0) 13599 if (err < 0)
13544 return err; 13600 return err;
13545 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac; 13601 spec->private_dac_nids[spec->multiout.num_dacs++] = dac;
13546 } 13602 }
13547 13603
13548 if (nid != 0x16) 13604 if (nid != 0x16)
@@ -13715,7 +13771,7 @@ static int alc268_parse_auto_config(struct hda_codec *codec)
13715{ 13771{
13716 struct alc_spec *spec = codec->spec; 13772 struct alc_spec *spec = codec->spec;
13717 int err; 13773 int err;
13718 static hda_nid_t alc268_ignore[] = { 0 }; 13774 static const hda_nid_t alc268_ignore[] = { 0 };
13719 13775
13720 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 13776 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13721 alc268_ignore); 13777 alc268_ignore);
@@ -13795,7 +13851,7 @@ static const char * const alc268_models[ALC268_MODEL_LAST] = {
13795 [ALC268_AUTO] = "auto", 13851 [ALC268_AUTO] = "auto",
13796}; 13852};
13797 13853
13798static struct snd_pci_quirk alc268_cfg_tbl[] = { 13854static const struct snd_pci_quirk alc268_cfg_tbl[] = {
13799 SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER), 13855 SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
13800 SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER), 13856 SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
13801 SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER), 13857 SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
@@ -13820,7 +13876,7 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = {
13820}; 13876};
13821 13877
13822/* Toshiba laptops have no unique PCI SSID but only codec SSID */ 13878/* Toshiba laptops have no unique PCI SSID but only codec SSID */
13823static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = { 13879static const struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
13824 SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO), 13880 SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
13825 SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO), 13881 SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
13826 SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05", 13882 SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
@@ -13828,7 +13884,7 @@ static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
13828 {} 13884 {}
13829}; 13885};
13830 13886
13831static struct alc_config_preset alc268_presets[] = { 13887static const struct alc_config_preset alc268_presets[] = {
13832 [ALC267_QUANTA_IL1] = { 13888 [ALC267_QUANTA_IL1] = {
13833 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer, 13889 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
13834 alc268_capture_nosrc_mixer }, 13890 alc268_capture_nosrc_mixer },
@@ -13874,9 +13930,9 @@ static struct alc_config_preset alc268_presets[] = {
13874 .num_channel_mode = ARRAY_SIZE(alc268_modes), 13930 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13875 .channel_mode = alc268_modes, 13931 .channel_mode = alc268_modes,
13876 .input_mux = &alc268_capture_source, 13932 .input_mux = &alc268_capture_source,
13877 .unsol_event = alc268_toshiba_unsol_event, 13933 .unsol_event = alc_sku_unsol_event,
13878 .setup = alc268_toshiba_setup, 13934 .setup = alc268_toshiba_setup,
13879 .init_hook = alc268_toshiba_automute, 13935 .init_hook = alc_inithook,
13880 }, 13936 },
13881 [ALC268_ACER] = { 13937 [ALC268_ACER] = {
13882 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer, 13938 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
@@ -13892,8 +13948,9 @@ static struct alc_config_preset alc268_presets[] = {
13892 .num_channel_mode = ARRAY_SIZE(alc268_modes), 13948 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13893 .channel_mode = alc268_modes, 13949 .channel_mode = alc268_modes,
13894 .input_mux = &alc268_acer_capture_source, 13950 .input_mux = &alc268_acer_capture_source,
13895 .unsol_event = alc268_acer_unsol_event, 13951 .unsol_event = alc_sku_unsol_event,
13896 .init_hook = alc268_acer_init_hook, 13952 .setup = alc268_acer_setup,
13953 .init_hook = alc_inithook,
13897 }, 13954 },
13898 [ALC268_ACER_DMIC] = { 13955 [ALC268_ACER_DMIC] = {
13899 .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer, 13956 .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
@@ -13909,8 +13966,9 @@ static struct alc_config_preset alc268_presets[] = {
13909 .num_channel_mode = ARRAY_SIZE(alc268_modes), 13966 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13910 .channel_mode = alc268_modes, 13967 .channel_mode = alc268_modes,
13911 .input_mux = &alc268_acer_dmic_capture_source, 13968 .input_mux = &alc268_acer_dmic_capture_source,
13912 .unsol_event = alc268_acer_unsol_event, 13969 .unsol_event = alc_sku_unsol_event,
13913 .init_hook = alc268_acer_init_hook, 13970 .setup = alc268_acer_setup,
13971 .init_hook = alc_inithook,
13914 }, 13972 },
13915 [ALC268_ACER_ASPIRE_ONE] = { 13973 [ALC268_ACER_ASPIRE_ONE] = {
13916 .mixers = { alc268_acer_aspire_one_mixer, 13974 .mixers = { alc268_acer_aspire_one_mixer,
@@ -13926,9 +13984,9 @@ static struct alc_config_preset alc268_presets[] = {
13926 .hp_nid = 0x03, 13984 .hp_nid = 0x03,
13927 .num_channel_mode = ARRAY_SIZE(alc268_modes), 13985 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13928 .channel_mode = alc268_modes, 13986 .channel_mode = alc268_modes,
13929 .unsol_event = alc268_acer_lc_unsol_event, 13987 .unsol_event = alc_sku_unsol_event,
13930 .setup = alc268_acer_lc_setup, 13988 .setup = alc268_acer_lc_setup,
13931 .init_hook = alc268_acer_lc_init_hook, 13989 .init_hook = alc_inithook,
13932 }, 13990 },
13933 [ALC268_DELL] = { 13991 [ALC268_DELL] = {
13934 .mixers = { alc268_dell_mixer, alc268_beep_mixer, 13992 .mixers = { alc268_dell_mixer, alc268_beep_mixer,
@@ -13962,8 +14020,9 @@ static struct alc_config_preset alc268_presets[] = {
13962 .num_channel_mode = ARRAY_SIZE(alc268_modes), 14020 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13963 .channel_mode = alc268_modes, 14021 .channel_mode = alc268_modes,
13964 .input_mux = &alc268_capture_source, 14022 .input_mux = &alc268_capture_source,
14023 .unsol_event = alc_sku_unsol_event,
13965 .setup = alc268_toshiba_setup, 14024 .setup = alc268_toshiba_setup,
13966 .init_hook = alc268_toshiba_automute, 14025 .init_hook = alc_inithook,
13967 }, 14026 },
13968#ifdef CONFIG_SND_DEBUG 14027#ifdef CONFIG_SND_DEBUG
13969 [ALC268_TEST] = { 14028 [ALC268_TEST] = {
@@ -14085,6 +14144,7 @@ static int patch_alc268(struct hda_codec *codec)
14085 codec->patch_ops = alc_patch_ops; 14144 codec->patch_ops = alc_patch_ops;
14086 if (board_config == ALC268_AUTO) 14145 if (board_config == ALC268_AUTO)
14087 spec->init_hook = alc268_auto_init; 14146 spec->init_hook = alc268_auto_init;
14147 spec->shutup = alc_eapd_shutup;
14088 14148
14089 alc_init_jacks(codec); 14149 alc_init_jacks(codec);
14090 14150
@@ -14098,32 +14158,32 @@ static int patch_alc268(struct hda_codec *codec)
14098 14158
14099#define alc269_dac_nids alc260_dac_nids 14159#define alc269_dac_nids alc260_dac_nids
14100 14160
14101static hda_nid_t alc269_adc_nids[1] = { 14161static const hda_nid_t alc269_adc_nids[1] = {
14102 /* ADC1 */ 14162 /* ADC1 */
14103 0x08, 14163 0x08,
14104}; 14164};
14105 14165
14106static hda_nid_t alc269_capsrc_nids[1] = { 14166static const hda_nid_t alc269_capsrc_nids[1] = {
14107 0x23, 14167 0x23,
14108}; 14168};
14109 14169
14110static hda_nid_t alc269vb_adc_nids[1] = { 14170static const hda_nid_t alc269vb_adc_nids[1] = {
14111 /* ADC1 */ 14171 /* ADC1 */
14112 0x09, 14172 0x09,
14113}; 14173};
14114 14174
14115static hda_nid_t alc269vb_capsrc_nids[1] = { 14175static const hda_nid_t alc269vb_capsrc_nids[1] = {
14116 0x22, 14176 0x22,
14117}; 14177};
14118 14178
14119static hda_nid_t alc269_adc_candidates[] = { 14179static const hda_nid_t alc269_adc_candidates[] = {
14120 0x08, 0x09, 0x07, 0x11, 14180 0x08, 0x09, 0x07, 0x11,
14121}; 14181};
14122 14182
14123#define alc269_modes alc260_modes 14183#define alc269_modes alc260_modes
14124#define alc269_capture_source alc880_lg_lw_capture_source 14184#define alc269_capture_source alc880_lg_lw_capture_source
14125 14185
14126static struct snd_kcontrol_new alc269_base_mixer[] = { 14186static const struct snd_kcontrol_new alc269_base_mixer[] = {
14127 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 14187 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14128 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 14188 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
14129 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 14189 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
@@ -14139,7 +14199,7 @@ static struct snd_kcontrol_new alc269_base_mixer[] = {
14139 { } /* end */ 14199 { } /* end */
14140}; 14200};
14141 14201
14142static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = { 14202static const struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
14143 /* output mixer control */ 14203 /* output mixer control */
14144 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), 14204 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
14145 { 14205 {
@@ -14160,7 +14220,7 @@ static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
14160 { } 14220 { }
14161}; 14221};
14162 14222
14163static struct snd_kcontrol_new alc269_lifebook_mixer[] = { 14223static const struct snd_kcontrol_new alc269_lifebook_mixer[] = {
14164 /* output mixer control */ 14224 /* output mixer control */
14165 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol), 14225 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
14166 { 14226 {
@@ -14184,7 +14244,7 @@ static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
14184 { } 14244 { }
14185}; 14245};
14186 14246
14187static struct snd_kcontrol_new alc269_laptop_mixer[] = { 14247static const struct snd_kcontrol_new alc269_laptop_mixer[] = {
14188 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 14248 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
14189 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 14249 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14190 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 14250 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
@@ -14192,7 +14252,7 @@ static struct snd_kcontrol_new alc269_laptop_mixer[] = {
14192 { } /* end */ 14252 { } /* end */
14193}; 14253};
14194 14254
14195static struct snd_kcontrol_new alc269vb_laptop_mixer[] = { 14255static const struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
14196 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 14256 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
14197 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 14257 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14198 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT), 14258 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
@@ -14200,14 +14260,14 @@ static struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
14200 { } /* end */ 14260 { } /* end */
14201}; 14261};
14202 14262
14203static struct snd_kcontrol_new alc269_asus_mixer[] = { 14263static const struct snd_kcontrol_new alc269_asus_mixer[] = {
14204 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT), 14264 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14205 HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x0, HDA_INPUT), 14265 HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x0, HDA_INPUT),
14206 { } /* end */ 14266 { } /* end */
14207}; 14267};
14208 14268
14209/* capture mixer elements */ 14269/* capture mixer elements */
14210static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = { 14270static const struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
14211 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), 14271 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
14212 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), 14272 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
14213 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 14273 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
@@ -14215,14 +14275,14 @@ static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
14215 { } /* end */ 14275 { } /* end */
14216}; 14276};
14217 14277
14218static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = { 14278static const struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
14219 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), 14279 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
14220 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), 14280 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
14221 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 14281 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
14222 { } /* end */ 14282 { } /* end */
14223}; 14283};
14224 14284
14225static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = { 14285static const struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
14226 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT), 14286 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
14227 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT), 14287 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
14228 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 14288 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
@@ -14230,7 +14290,7 @@ static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
14230 { } /* end */ 14290 { } /* end */
14231}; 14291};
14232 14292
14233static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = { 14293static const struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
14234 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT), 14294 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
14235 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT), 14295 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
14236 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), 14296 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
@@ -14240,7 +14300,7 @@ static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
14240/* FSC amilo */ 14300/* FSC amilo */
14241#define alc269_fujitsu_mixer alc269_laptop_mixer 14301#define alc269_fujitsu_mixer alc269_laptop_mixer
14242 14302
14243static struct hda_verb alc269_quanta_fl1_verbs[] = { 14303static const struct hda_verb alc269_quanta_fl1_verbs[] = {
14244 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 14304 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14245 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 14305 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14246 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 14306 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
@@ -14250,7 +14310,7 @@ static struct hda_verb alc269_quanta_fl1_verbs[] = {
14250 { } 14310 { }
14251}; 14311};
14252 14312
14253static struct hda_verb alc269_lifebook_verbs[] = { 14313static const struct hda_verb alc269_lifebook_verbs[] = {
14254 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 14314 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14255 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, 14315 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
14256 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 14316 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
@@ -14267,15 +14327,7 @@ static struct hda_verb alc269_lifebook_verbs[] = {
14267/* toggle speaker-output according to the hp-jack state */ 14327/* toggle speaker-output according to the hp-jack state */
14268static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec) 14328static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
14269{ 14329{
14270 unsigned int present; 14330 alc_hp_automute(codec);
14271 unsigned char bits;
14272
14273 present = snd_hda_jack_detect(codec, 0x15);
14274 bits = present ? HDA_AMP_MUTE : 0;
14275 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
14276 HDA_AMP_MUTE, bits);
14277 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
14278 HDA_AMP_MUTE, bits);
14279 14331
14280 snd_hda_codec_write(codec, 0x20, 0, 14332 snd_hda_codec_write(codec, 0x20, 0,
14281 AC_VERB_SET_COEF_INDEX, 0x0c); 14333 AC_VERB_SET_COEF_INDEX, 0x0c);
@@ -14288,34 +14340,8 @@ static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
14288 AC_VERB_SET_PROC_COEF, 0x480); 14340 AC_VERB_SET_PROC_COEF, 0x480);
14289} 14341}
14290 14342
14291/* toggle speaker-output according to the hp-jacks state */ 14343#define alc269_lifebook_speaker_automute \
14292static void alc269_lifebook_speaker_automute(struct hda_codec *codec) 14344 alc269_quanta_fl1_speaker_automute
14293{
14294 unsigned int present;
14295 unsigned char bits;
14296
14297 /* Check laptop headphone socket */
14298 present = snd_hda_jack_detect(codec, 0x15);
14299
14300 /* Check port replicator headphone socket */
14301 present |= snd_hda_jack_detect(codec, 0x1a);
14302
14303 bits = present ? HDA_AMP_MUTE : 0;
14304 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
14305 HDA_AMP_MUTE, bits);
14306 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
14307 HDA_AMP_MUTE, bits);
14308
14309 snd_hda_codec_write(codec, 0x20, 0,
14310 AC_VERB_SET_COEF_INDEX, 0x0c);
14311 snd_hda_codec_write(codec, 0x20, 0,
14312 AC_VERB_SET_PROC_COEF, 0x680);
14313
14314 snd_hda_codec_write(codec, 0x20, 0,
14315 AC_VERB_SET_COEF_INDEX, 0x0c);
14316 snd_hda_codec_write(codec, 0x20, 0,
14317 AC_VERB_SET_PROC_COEF, 0x480);
14318}
14319 14345
14320static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec) 14346static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
14321{ 14347{
@@ -14364,6 +14390,9 @@ static void alc269_quanta_fl1_setup(struct hda_codec *codec)
14364 struct alc_spec *spec = codec->spec; 14390 struct alc_spec *spec = codec->spec;
14365 spec->autocfg.hp_pins[0] = 0x15; 14391 spec->autocfg.hp_pins[0] = 0x15;
14366 spec->autocfg.speaker_pins[0] = 0x14; 14392 spec->autocfg.speaker_pins[0] = 0x14;
14393 spec->automute_mixer_nid[0] = 0x0c;
14394 spec->automute = 1;
14395 spec->automute_mode = ALC_AUTOMUTE_MIXER;
14367 spec->ext_mic.pin = 0x18; 14396 spec->ext_mic.pin = 0x18;
14368 spec->ext_mic.mux_idx = 0; 14397 spec->ext_mic.mux_idx = 0;
14369 spec->int_mic.pin = 0x19; 14398 spec->int_mic.pin = 0x19;
@@ -14377,13 +14406,24 @@ static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
14377 alc_mic_automute(codec); 14406 alc_mic_automute(codec);
14378} 14407}
14379 14408
14409static void alc269_lifebook_setup(struct hda_codec *codec)
14410{
14411 struct alc_spec *spec = codec->spec;
14412 spec->autocfg.hp_pins[0] = 0x15;
14413 spec->autocfg.hp_pins[1] = 0x1a;
14414 spec->autocfg.speaker_pins[0] = 0x14;
14415 spec->automute_mixer_nid[0] = 0x0c;
14416 spec->automute = 1;
14417 spec->automute_mode = ALC_AUTOMUTE_MIXER;
14418}
14419
14380static void alc269_lifebook_init_hook(struct hda_codec *codec) 14420static void alc269_lifebook_init_hook(struct hda_codec *codec)
14381{ 14421{
14382 alc269_lifebook_speaker_automute(codec); 14422 alc269_lifebook_speaker_automute(codec);
14383 alc269_lifebook_mic_autoswitch(codec); 14423 alc269_lifebook_mic_autoswitch(codec);
14384} 14424}
14385 14425
14386static struct hda_verb alc269_laptop_dmic_init_verbs[] = { 14426static const struct hda_verb alc269_laptop_dmic_init_verbs[] = {
14387 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 14427 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14388 {0x23, AC_VERB_SET_CONNECT_SEL, 0x05}, 14428 {0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
14389 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 }, 14429 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
@@ -14394,7 +14434,7 @@ static struct hda_verb alc269_laptop_dmic_init_verbs[] = {
14394 {} 14434 {}
14395}; 14435};
14396 14436
14397static struct hda_verb alc269_laptop_amic_init_verbs[] = { 14437static const struct hda_verb alc269_laptop_amic_init_verbs[] = {
14398 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 14438 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14399 {0x23, AC_VERB_SET_CONNECT_SEL, 0x01}, 14439 {0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
14400 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 }, 14440 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
@@ -14404,7 +14444,7 @@ static struct hda_verb alc269_laptop_amic_init_verbs[] = {
14404 {} 14444 {}
14405}; 14445};
14406 14446
14407static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = { 14447static const struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
14408 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, 14448 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
14409 {0x22, AC_VERB_SET_CONNECT_SEL, 0x06}, 14449 {0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
14410 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 }, 14450 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
@@ -14415,7 +14455,7 @@ static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
14415 {} 14455 {}
14416}; 14456};
14417 14457
14418static struct hda_verb alc269vb_laptop_amic_init_verbs[] = { 14458static const struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
14419 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, 14459 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
14420 {0x22, AC_VERB_SET_CONNECT_SEL, 0x01}, 14460 {0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
14421 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 }, 14461 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
@@ -14426,7 +14466,7 @@ static struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
14426 {} 14466 {}
14427}; 14467};
14428 14468
14429static struct hda_verb alc271_acer_dmic_verbs[] = { 14469static const struct hda_verb alc271_acer_dmic_verbs[] = {
14430 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d}, 14470 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
14431 {0x20, AC_VERB_SET_PROC_COEF, 0x4000}, 14471 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
14432 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 14472 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
@@ -14440,42 +14480,14 @@ static struct hda_verb alc271_acer_dmic_verbs[] = {
14440 { } 14480 { }
14441}; 14481};
14442 14482
14443/* toggle speaker-output according to the hp-jack state */
14444static void alc269_speaker_automute(struct hda_codec *codec)
14445{
14446 struct alc_spec *spec = codec->spec;
14447 unsigned int nid = spec->autocfg.hp_pins[0];
14448 unsigned int present;
14449 unsigned char bits;
14450
14451 present = snd_hda_jack_detect(codec, nid);
14452 bits = present ? HDA_AMP_MUTE : 0;
14453 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
14454 HDA_AMP_MUTE, bits);
14455 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
14456 HDA_AMP_MUTE, bits);
14457 snd_hda_input_jack_report(codec, nid);
14458}
14459
14460/* unsolicited event for HP jack sensing */
14461static void alc269_laptop_unsol_event(struct hda_codec *codec,
14462 unsigned int res)
14463{
14464 switch (res >> 26) {
14465 case ALC880_HP_EVENT:
14466 alc269_speaker_automute(codec);
14467 break;
14468 case ALC880_MIC_EVENT:
14469 alc_mic_automute(codec);
14470 break;
14471 }
14472}
14473
14474static void alc269_laptop_amic_setup(struct hda_codec *codec) 14483static void alc269_laptop_amic_setup(struct hda_codec *codec)
14475{ 14484{
14476 struct alc_spec *spec = codec->spec; 14485 struct alc_spec *spec = codec->spec;
14477 spec->autocfg.hp_pins[0] = 0x15; 14486 spec->autocfg.hp_pins[0] = 0x15;
14478 spec->autocfg.speaker_pins[0] = 0x14; 14487 spec->autocfg.speaker_pins[0] = 0x14;
14488 spec->automute_mixer_nid[0] = 0x0c;
14489 spec->automute = 1;
14490 spec->automute_mode = ALC_AUTOMUTE_MIXER;
14479 spec->ext_mic.pin = 0x18; 14491 spec->ext_mic.pin = 0x18;
14480 spec->ext_mic.mux_idx = 0; 14492 spec->ext_mic.mux_idx = 0;
14481 spec->int_mic.pin = 0x19; 14493 spec->int_mic.pin = 0x19;
@@ -14488,6 +14500,9 @@ static void alc269_laptop_dmic_setup(struct hda_codec *codec)
14488 struct alc_spec *spec = codec->spec; 14500 struct alc_spec *spec = codec->spec;
14489 spec->autocfg.hp_pins[0] = 0x15; 14501 spec->autocfg.hp_pins[0] = 0x15;
14490 spec->autocfg.speaker_pins[0] = 0x14; 14502 spec->autocfg.speaker_pins[0] = 0x14;
14503 spec->automute_mixer_nid[0] = 0x0c;
14504 spec->automute = 1;
14505 spec->automute_mode = ALC_AUTOMUTE_MIXER;
14491 spec->ext_mic.pin = 0x18; 14506 spec->ext_mic.pin = 0x18;
14492 spec->ext_mic.mux_idx = 0; 14507 spec->ext_mic.mux_idx = 0;
14493 spec->int_mic.pin = 0x12; 14508 spec->int_mic.pin = 0x12;
@@ -14500,6 +14515,9 @@ static void alc269vb_laptop_amic_setup(struct hda_codec *codec)
14500 struct alc_spec *spec = codec->spec; 14515 struct alc_spec *spec = codec->spec;
14501 spec->autocfg.hp_pins[0] = 0x21; 14516 spec->autocfg.hp_pins[0] = 0x21;
14502 spec->autocfg.speaker_pins[0] = 0x14; 14517 spec->autocfg.speaker_pins[0] = 0x14;
14518 spec->automute_mixer_nid[0] = 0x0c;
14519 spec->automute = 1;
14520 spec->automute_mode = ALC_AUTOMUTE_MIXER;
14503 spec->ext_mic.pin = 0x18; 14521 spec->ext_mic.pin = 0x18;
14504 spec->ext_mic.mux_idx = 0; 14522 spec->ext_mic.mux_idx = 0;
14505 spec->int_mic.pin = 0x19; 14523 spec->int_mic.pin = 0x19;
@@ -14512,6 +14530,9 @@ static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
14512 struct alc_spec *spec = codec->spec; 14530 struct alc_spec *spec = codec->spec;
14513 spec->autocfg.hp_pins[0] = 0x21; 14531 spec->autocfg.hp_pins[0] = 0x21;
14514 spec->autocfg.speaker_pins[0] = 0x14; 14532 spec->autocfg.speaker_pins[0] = 0x14;
14533 spec->automute_mixer_nid[0] = 0x0c;
14534 spec->automute = 1;
14535 spec->automute_mode = ALC_AUTOMUTE_MIXER;
14515 spec->ext_mic.pin = 0x18; 14536 spec->ext_mic.pin = 0x18;
14516 spec->ext_mic.mux_idx = 0; 14537 spec->ext_mic.mux_idx = 0;
14517 spec->int_mic.pin = 0x12; 14538 spec->int_mic.pin = 0x12;
@@ -14519,16 +14540,10 @@ static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
14519 spec->auto_mic = 1; 14540 spec->auto_mic = 1;
14520} 14541}
14521 14542
14522static void alc269_laptop_inithook(struct hda_codec *codec)
14523{
14524 alc269_speaker_automute(codec);
14525 alc_mic_automute(codec);
14526}
14527
14528/* 14543/*
14529 * generic initialization of ADC, input mixers and output mixers 14544 * generic initialization of ADC, input mixers and output mixers
14530 */ 14545 */
14531static struct hda_verb alc269_init_verbs[] = { 14546static const struct hda_verb alc269_init_verbs[] = {
14532 /* 14547 /*
14533 * Unmute ADC0 and set the default input to mic-in 14548 * Unmute ADC0 and set the default input to mic-in
14534 */ 14549 */
@@ -14571,7 +14586,7 @@ static struct hda_verb alc269_init_verbs[] = {
14571 { } 14586 { }
14572}; 14587};
14573 14588
14574static struct hda_verb alc269vb_init_verbs[] = { 14589static const struct hda_verb alc269vb_init_verbs[] = {
14575 /* 14590 /*
14576 * Unmute ADC0 and set the default input to mic-in 14591 * Unmute ADC0 and set the default input to mic-in
14577 */ 14592 */
@@ -14629,7 +14644,7 @@ static struct hda_verb alc269vb_init_verbs[] = {
14629#define alc269_pcm_digital_playback alc880_pcm_digital_playback 14644#define alc269_pcm_digital_playback alc880_pcm_digital_playback
14630#define alc269_pcm_digital_capture alc880_pcm_digital_capture 14645#define alc269_pcm_digital_capture alc880_pcm_digital_capture
14631 14646
14632static struct hda_pcm_stream alc269_44k_pcm_analog_playback = { 14647static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
14633 .substreams = 1, 14648 .substreams = 1,
14634 .channels_min = 2, 14649 .channels_min = 2,
14635 .channels_max = 8, 14650 .channels_max = 8,
@@ -14642,7 +14657,7 @@ static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
14642 }, 14657 },
14643}; 14658};
14644 14659
14645static struct hda_pcm_stream alc269_44k_pcm_analog_capture = { 14660static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
14646 .substreams = 1, 14661 .substreams = 1,
14647 .channels_min = 2, 14662 .channels_min = 2,
14648 .channels_max = 2, 14663 .channels_max = 2,
@@ -14726,7 +14741,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
14726{ 14741{
14727 struct alc_spec *spec = codec->spec; 14742 struct alc_spec *spec = codec->spec;
14728 int err; 14743 int err;
14729 static hda_nid_t alc269_ignore[] = { 0x1d, 0 }; 14744 static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
14730 14745
14731 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 14746 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
14732 alc269_ignore); 14747 alc269_ignore);
@@ -14796,7 +14811,6 @@ static void alc269_auto_init(struct hda_codec *codec)
14796 alc_inithook(codec); 14811 alc_inithook(codec);
14797} 14812}
14798 14813
14799#ifdef SND_HDA_NEEDS_RESUME
14800static void alc269_toggle_power_output(struct hda_codec *codec, int power_up) 14814static void alc269_toggle_power_output(struct hda_codec *codec, int power_up)
14801{ 14815{
14802 int val = alc_read_coef_idx(codec, 0x04); 14816 int val = alc_read_coef_idx(codec, 0x04);
@@ -14807,25 +14821,17 @@ static void alc269_toggle_power_output(struct hda_codec *codec, int power_up)
14807 alc_write_coef_idx(codec, 0x04, val); 14821 alc_write_coef_idx(codec, 0x04, val);
14808} 14822}
14809 14823
14810#ifdef CONFIG_SND_HDA_POWER_SAVE 14824static void alc269_shutup(struct hda_codec *codec)
14811static int alc269_suspend(struct hda_codec *codec, pm_message_t state)
14812{ 14825{
14813 struct alc_spec *spec = codec->spec;
14814
14815 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017) 14826 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017)
14816 alc269_toggle_power_output(codec, 0); 14827 alc269_toggle_power_output(codec, 0);
14817 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) { 14828 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
14818 alc269_toggle_power_output(codec, 0); 14829 alc269_toggle_power_output(codec, 0);
14819 msleep(150); 14830 msleep(150);
14820 } 14831 }
14821
14822 alc_shutup(codec);
14823 if (spec && spec->power_hook)
14824 spec->power_hook(codec);
14825 return 0;
14826} 14832}
14827#endif /* CONFIG_SND_HDA_POWER_SAVE */
14828 14833
14834#ifdef SND_HDA_NEEDS_RESUME
14829static int alc269_resume(struct hda_codec *codec) 14835static int alc269_resume(struct hda_codec *codec)
14830{ 14836{
14831 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) { 14837 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
@@ -14864,7 +14870,7 @@ static void alc269_fixup_hweq(struct hda_codec *codec,
14864static void alc271_fixup_dmic(struct hda_codec *codec, 14870static void alc271_fixup_dmic(struct hda_codec *codec,
14865 const struct alc_fixup *fix, int action) 14871 const struct alc_fixup *fix, int action)
14866{ 14872{
14867 static struct hda_verb verbs[] = { 14873 static const struct hda_verb verbs[] = {
14868 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d}, 14874 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
14869 {0x20, AC_VERB_SET_PROC_COEF, 0x4000}, 14875 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
14870 {} 14876 {}
@@ -14947,7 +14953,7 @@ static const struct alc_fixup alc269_fixups[] = {
14947 }, 14953 },
14948}; 14954};
14949 14955
14950static struct snd_pci_quirk alc269_fixup_tbl[] = { 14956static const struct snd_pci_quirk alc269_fixup_tbl[] = {
14951 SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2), 14957 SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
14952 SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), 14958 SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
14953 SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), 14959 SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
@@ -14978,7 +14984,7 @@ static const char * const alc269_models[ALC269_MODEL_LAST] = {
14978 [ALC269_AUTO] = "auto", 14984 [ALC269_AUTO] = "auto",
14979}; 14985};
14980 14986
14981static struct snd_pci_quirk alc269_cfg_tbl[] = { 14987static const struct snd_pci_quirk alc269_cfg_tbl[] = {
14982 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1), 14988 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
14983 SND_PCI_QUIRK(0x1025, 0x047c, "ACER ZGA", ALC271_ACER), 14989 SND_PCI_QUIRK(0x1025, 0x047c, "ACER ZGA", ALC271_ACER),
14984 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", 14990 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
@@ -15036,7 +15042,7 @@ static struct snd_pci_quirk alc269_cfg_tbl[] = {
15036 {} 15042 {}
15037}; 15043};
15038 15044
15039static struct alc_config_preset alc269_presets[] = { 15045static const struct alc_config_preset alc269_presets[] = {
15040 [ALC269_BASIC] = { 15046 [ALC269_BASIC] = {
15041 .mixers = { alc269_base_mixer }, 15047 .mixers = { alc269_base_mixer },
15042 .init_verbs = { alc269_init_verbs }, 15048 .init_verbs = { alc269_init_verbs },
@@ -15070,9 +15076,9 @@ static struct alc_config_preset alc269_presets[] = {
15070 .hp_nid = 0x03, 15076 .hp_nid = 0x03,
15071 .num_channel_mode = ARRAY_SIZE(alc269_modes), 15077 .num_channel_mode = ARRAY_SIZE(alc269_modes),
15072 .channel_mode = alc269_modes, 15078 .channel_mode = alc269_modes,
15073 .unsol_event = alc269_laptop_unsol_event, 15079 .unsol_event = alc_sku_unsol_event,
15074 .setup = alc269_laptop_amic_setup, 15080 .setup = alc269_laptop_amic_setup,
15075 .init_hook = alc269_laptop_inithook, 15081 .init_hook = alc_inithook,
15076 }, 15082 },
15077 [ALC269_DMIC] = { 15083 [ALC269_DMIC] = {
15078 .mixers = { alc269_laptop_mixer }, 15084 .mixers = { alc269_laptop_mixer },
@@ -15084,9 +15090,9 @@ static struct alc_config_preset alc269_presets[] = {
15084 .hp_nid = 0x03, 15090 .hp_nid = 0x03,
15085 .num_channel_mode = ARRAY_SIZE(alc269_modes), 15091 .num_channel_mode = ARRAY_SIZE(alc269_modes),
15086 .channel_mode = alc269_modes, 15092 .channel_mode = alc269_modes,
15087 .unsol_event = alc269_laptop_unsol_event, 15093 .unsol_event = alc_sku_unsol_event,
15088 .setup = alc269_laptop_dmic_setup, 15094 .setup = alc269_laptop_dmic_setup,
15089 .init_hook = alc269_laptop_inithook, 15095 .init_hook = alc_inithook,
15090 }, 15096 },
15091 [ALC269VB_AMIC] = { 15097 [ALC269VB_AMIC] = {
15092 .mixers = { alc269vb_laptop_mixer }, 15098 .mixers = { alc269vb_laptop_mixer },
@@ -15098,9 +15104,9 @@ static struct alc_config_preset alc269_presets[] = {
15098 .hp_nid = 0x03, 15104 .hp_nid = 0x03,
15099 .num_channel_mode = ARRAY_SIZE(alc269_modes), 15105 .num_channel_mode = ARRAY_SIZE(alc269_modes),
15100 .channel_mode = alc269_modes, 15106 .channel_mode = alc269_modes,
15101 .unsol_event = alc269_laptop_unsol_event, 15107 .unsol_event = alc_sku_unsol_event,
15102 .setup = alc269vb_laptop_amic_setup, 15108 .setup = alc269vb_laptop_amic_setup,
15103 .init_hook = alc269_laptop_inithook, 15109 .init_hook = alc_inithook,
15104 }, 15110 },
15105 [ALC269VB_DMIC] = { 15111 [ALC269VB_DMIC] = {
15106 .mixers = { alc269vb_laptop_mixer }, 15112 .mixers = { alc269vb_laptop_mixer },
@@ -15112,9 +15118,9 @@ static struct alc_config_preset alc269_presets[] = {
15112 .hp_nid = 0x03, 15118 .hp_nid = 0x03,
15113 .num_channel_mode = ARRAY_SIZE(alc269_modes), 15119 .num_channel_mode = ARRAY_SIZE(alc269_modes),
15114 .channel_mode = alc269_modes, 15120 .channel_mode = alc269_modes,
15115 .unsol_event = alc269_laptop_unsol_event, 15121 .unsol_event = alc_sku_unsol_event,
15116 .setup = alc269vb_laptop_dmic_setup, 15122 .setup = alc269vb_laptop_dmic_setup,
15117 .init_hook = alc269_laptop_inithook, 15123 .init_hook = alc_inithook,
15118 }, 15124 },
15119 [ALC269_FUJITSU] = { 15125 [ALC269_FUJITSU] = {
15120 .mixers = { alc269_fujitsu_mixer }, 15126 .mixers = { alc269_fujitsu_mixer },
@@ -15126,9 +15132,9 @@ static struct alc_config_preset alc269_presets[] = {
15126 .hp_nid = 0x03, 15132 .hp_nid = 0x03,
15127 .num_channel_mode = ARRAY_SIZE(alc269_modes), 15133 .num_channel_mode = ARRAY_SIZE(alc269_modes),
15128 .channel_mode = alc269_modes, 15134 .channel_mode = alc269_modes,
15129 .unsol_event = alc269_laptop_unsol_event, 15135 .unsol_event = alc_sku_unsol_event,
15130 .setup = alc269_laptop_dmic_setup, 15136 .setup = alc269_laptop_dmic_setup,
15131 .init_hook = alc269_laptop_inithook, 15137 .init_hook = alc_inithook,
15132 }, 15138 },
15133 [ALC269_LIFEBOOK] = { 15139 [ALC269_LIFEBOOK] = {
15134 .mixers = { alc269_lifebook_mixer }, 15140 .mixers = { alc269_lifebook_mixer },
@@ -15140,6 +15146,7 @@ static struct alc_config_preset alc269_presets[] = {
15140 .channel_mode = alc269_modes, 15146 .channel_mode = alc269_modes,
15141 .input_mux = &alc269_capture_source, 15147 .input_mux = &alc269_capture_source,
15142 .unsol_event = alc269_lifebook_unsol_event, 15148 .unsol_event = alc269_lifebook_unsol_event,
15149 .setup = alc269_lifebook_setup,
15143 .init_hook = alc269_lifebook_init_hook, 15150 .init_hook = alc269_lifebook_init_hook,
15144 }, 15151 },
15145 [ALC271_ACER] = { 15152 [ALC271_ACER] = {
@@ -15185,14 +15192,21 @@ static int alc269_fill_coef(struct hda_codec *codec)
15185 val = alc_read_coef_idx(codec, 0xd); 15192 val = alc_read_coef_idx(codec, 0xd);
15186 if ((val & 0x0c00) >> 10 != 0x1) { 15193 if ((val & 0x0c00) >> 10 != 0x1) {
15187 /* Capless ramp up clock control */ 15194 /* Capless ramp up clock control */
15188 alc_write_coef_idx(codec, 0xd, val | 1<<10); 15195 alc_write_coef_idx(codec, 0xd, val | (1<<10));
15189 } 15196 }
15190 val = alc_read_coef_idx(codec, 0x17); 15197 val = alc_read_coef_idx(codec, 0x17);
15191 if ((val & 0x01c0) >> 6 != 0x4) { 15198 if ((val & 0x01c0) >> 6 != 0x4) {
15192 /* Class D power on reset */ 15199 /* Class D power on reset */
15193 alc_write_coef_idx(codec, 0x17, val | 1<<7); 15200 alc_write_coef_idx(codec, 0x17, val | (1<<7));
15194 } 15201 }
15195 } 15202 }
15203
15204 val = alc_read_coef_idx(codec, 0xd); /* Class D */
15205 alc_write_coef_idx(codec, 0xd, val | (1<<14));
15206
15207 val = alc_read_coef_idx(codec, 0x4); /* HP */
15208 alc_write_coef_idx(codec, 0x4, val | (1<<11));
15209
15196 return 0; 15210 return 0;
15197} 15211}
15198 15212
@@ -15313,14 +15327,12 @@ static int patch_alc269(struct hda_codec *codec)
15313 spec->vmaster_nid = 0x02; 15327 spec->vmaster_nid = 0x02;
15314 15328
15315 codec->patch_ops = alc_patch_ops; 15329 codec->patch_ops = alc_patch_ops;
15316#ifdef CONFIG_SND_HDA_POWER_SAVE
15317 codec->patch_ops.suspend = alc269_suspend;
15318#endif
15319#ifdef SND_HDA_NEEDS_RESUME 15330#ifdef SND_HDA_NEEDS_RESUME
15320 codec->patch_ops.resume = alc269_resume; 15331 codec->patch_ops.resume = alc269_resume;
15321#endif 15332#endif
15322 if (board_config == ALC269_AUTO) 15333 if (board_config == ALC269_AUTO)
15323 spec->init_hook = alc269_auto_init; 15334 spec->init_hook = alc269_auto_init;
15335 spec->shutup = alc269_shutup;
15324 15336
15325 alc_init_jacks(codec); 15337 alc_init_jacks(codec);
15326#ifdef CONFIG_SND_HDA_POWER_SAVE 15338#ifdef CONFIG_SND_HDA_POWER_SAVE
@@ -15341,7 +15353,7 @@ static int patch_alc269(struct hda_codec *codec)
15341 * set the path ways for 2 channel output 15353 * set the path ways for 2 channel output
15342 * need to set the codec line out and mic 1 pin widgets to inputs 15354 * need to set the codec line out and mic 1 pin widgets to inputs
15343 */ 15355 */
15344static struct hda_verb alc861_threestack_ch2_init[] = { 15356static const struct hda_verb alc861_threestack_ch2_init[] = {
15345 /* set pin widget 1Ah (line in) for input */ 15357 /* set pin widget 1Ah (line in) for input */
15346 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 15358 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15347 /* set pin widget 18h (mic1/2) for input, for mic also enable 15359 /* set pin widget 18h (mic1/2) for input, for mic also enable
@@ -15360,7 +15372,7 @@ static struct hda_verb alc861_threestack_ch2_init[] = {
15360 * 6ch mode 15372 * 6ch mode
15361 * need to set the codec line out and mic 1 pin widgets to outputs 15373 * need to set the codec line out and mic 1 pin widgets to outputs
15362 */ 15374 */
15363static struct hda_verb alc861_threestack_ch6_init[] = { 15375static const struct hda_verb alc861_threestack_ch6_init[] = {
15364 /* set pin widget 1Ah (line in) for output (Back Surround)*/ 15376 /* set pin widget 1Ah (line in) for output (Back Surround)*/
15365 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 15377 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15366 /* set pin widget 18h (mic1) for output (CLFE)*/ 15378 /* set pin widget 18h (mic1) for output (CLFE)*/
@@ -15377,30 +15389,30 @@ static struct hda_verb alc861_threestack_ch6_init[] = {
15377 { } /* end */ 15389 { } /* end */
15378}; 15390};
15379 15391
15380static struct hda_channel_mode alc861_threestack_modes[2] = { 15392static const struct hda_channel_mode alc861_threestack_modes[2] = {
15381 { 2, alc861_threestack_ch2_init }, 15393 { 2, alc861_threestack_ch2_init },
15382 { 6, alc861_threestack_ch6_init }, 15394 { 6, alc861_threestack_ch6_init },
15383}; 15395};
15384/* Set mic1 as input and unmute the mixer */ 15396/* Set mic1 as input and unmute the mixer */
15385static struct hda_verb alc861_uniwill_m31_ch2_init[] = { 15397static const struct hda_verb alc861_uniwill_m31_ch2_init[] = {
15386 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 }, 15398 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15387 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/ 15399 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
15388 { } /* end */ 15400 { } /* end */
15389}; 15401};
15390/* Set mic1 as output and mute mixer */ 15402/* Set mic1 as output and mute mixer */
15391static struct hda_verb alc861_uniwill_m31_ch4_init[] = { 15403static const struct hda_verb alc861_uniwill_m31_ch4_init[] = {
15392 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 15404 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15393 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/ 15405 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
15394 { } /* end */ 15406 { } /* end */
15395}; 15407};
15396 15408
15397static struct hda_channel_mode alc861_uniwill_m31_modes[2] = { 15409static const struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
15398 { 2, alc861_uniwill_m31_ch2_init }, 15410 { 2, alc861_uniwill_m31_ch2_init },
15399 { 4, alc861_uniwill_m31_ch4_init }, 15411 { 4, alc861_uniwill_m31_ch4_init },
15400}; 15412};
15401 15413
15402/* Set mic1 and line-in as input and unmute the mixer */ 15414/* Set mic1 and line-in as input and unmute the mixer */
15403static struct hda_verb alc861_asus_ch2_init[] = { 15415static const struct hda_verb alc861_asus_ch2_init[] = {
15404 /* set pin widget 1Ah (line in) for input */ 15416 /* set pin widget 1Ah (line in) for input */
15405 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 }, 15417 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15406 /* set pin widget 18h (mic1/2) for input, for mic also enable 15418 /* set pin widget 18h (mic1/2) for input, for mic also enable
@@ -15416,7 +15428,7 @@ static struct hda_verb alc861_asus_ch2_init[] = {
15416 { } /* end */ 15428 { } /* end */
15417}; 15429};
15418/* Set mic1 nad line-in as output and mute mixer */ 15430/* Set mic1 nad line-in as output and mute mixer */
15419static struct hda_verb alc861_asus_ch6_init[] = { 15431static const struct hda_verb alc861_asus_ch6_init[] = {
15420 /* set pin widget 1Ah (line in) for output (Back Surround)*/ 15432 /* set pin widget 1Ah (line in) for output (Back Surround)*/
15421 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 }, 15433 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15422 /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */ 15434 /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
@@ -15434,14 +15446,14 @@ static struct hda_verb alc861_asus_ch6_init[] = {
15434 { } /* end */ 15446 { } /* end */
15435}; 15447};
15436 15448
15437static struct hda_channel_mode alc861_asus_modes[2] = { 15449static const struct hda_channel_mode alc861_asus_modes[2] = {
15438 { 2, alc861_asus_ch2_init }, 15450 { 2, alc861_asus_ch2_init },
15439 { 6, alc861_asus_ch6_init }, 15451 { 6, alc861_asus_ch6_init },
15440}; 15452};
15441 15453
15442/* patch-ALC861 */ 15454/* patch-ALC861 */
15443 15455
15444static struct snd_kcontrol_new alc861_base_mixer[] = { 15456static const struct snd_kcontrol_new alc861_base_mixer[] = {
15445 /* output mixer control */ 15457 /* output mixer control */
15446 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT), 15458 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
15447 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT), 15459 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
@@ -15464,7 +15476,7 @@ static struct snd_kcontrol_new alc861_base_mixer[] = {
15464 { } /* end */ 15476 { } /* end */
15465}; 15477};
15466 15478
15467static struct snd_kcontrol_new alc861_3ST_mixer[] = { 15479static const struct snd_kcontrol_new alc861_3ST_mixer[] = {
15468 /* output mixer control */ 15480 /* output mixer control */
15469 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT), 15481 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
15470 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT), 15482 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
@@ -15495,7 +15507,7 @@ static struct snd_kcontrol_new alc861_3ST_mixer[] = {
15495 { } /* end */ 15507 { } /* end */
15496}; 15508};
15497 15509
15498static struct snd_kcontrol_new alc861_toshiba_mixer[] = { 15510static const struct snd_kcontrol_new alc861_toshiba_mixer[] = {
15499 /* output mixer control */ 15511 /* output mixer control */
15500 HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT), 15512 HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
15501 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT), 15513 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
@@ -15504,7 +15516,7 @@ static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
15504 { } /* end */ 15516 { } /* end */
15505}; 15517};
15506 15518
15507static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = { 15519static const struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
15508 /* output mixer control */ 15520 /* output mixer control */
15509 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT), 15521 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
15510 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT), 15522 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
@@ -15535,7 +15547,7 @@ static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
15535 { } /* end */ 15547 { } /* end */
15536}; 15548};
15537 15549
15538static struct snd_kcontrol_new alc861_asus_mixer[] = { 15550static const struct snd_kcontrol_new alc861_asus_mixer[] = {
15539 /* output mixer control */ 15551 /* output mixer control */
15540 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT), 15552 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
15541 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT), 15553 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
@@ -15567,7 +15579,7 @@ static struct snd_kcontrol_new alc861_asus_mixer[] = {
15567}; 15579};
15568 15580
15569/* additional mixer */ 15581/* additional mixer */
15570static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = { 15582static const struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
15571 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT), 15583 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
15572 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT), 15584 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
15573 { } 15585 { }
@@ -15576,7 +15588,7 @@ static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
15576/* 15588/*
15577 * generic initialization of ADC, input mixers and output mixers 15589 * generic initialization of ADC, input mixers and output mixers
15578 */ 15590 */
15579static struct hda_verb alc861_base_init_verbs[] = { 15591static const struct hda_verb alc861_base_init_verbs[] = {
15580 /* 15592 /*
15581 * Unmute ADC0 and set the default input to mic-in 15593 * Unmute ADC0 and set the default input to mic-in
15582 */ 15594 */
@@ -15642,7 +15654,7 @@ static struct hda_verb alc861_base_init_verbs[] = {
15642 { } 15654 { }
15643}; 15655};
15644 15656
15645static struct hda_verb alc861_threestack_init_verbs[] = { 15657static const struct hda_verb alc861_threestack_init_verbs[] = {
15646 /* 15658 /*
15647 * Unmute ADC0 and set the default input to mic-in 15659 * Unmute ADC0 and set the default input to mic-in
15648 */ 15660 */
@@ -15703,7 +15715,7 @@ static struct hda_verb alc861_threestack_init_verbs[] = {
15703 { } 15715 { }
15704}; 15716};
15705 15717
15706static struct hda_verb alc861_uniwill_m31_init_verbs[] = { 15718static const struct hda_verb alc861_uniwill_m31_init_verbs[] = {
15707 /* 15719 /*
15708 * Unmute ADC0 and set the default input to mic-in 15720 * Unmute ADC0 and set the default input to mic-in
15709 */ 15721 */
@@ -15765,7 +15777,7 @@ static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
15765 { } 15777 { }
15766}; 15778};
15767 15779
15768static struct hda_verb alc861_asus_init_verbs[] = { 15780static const struct hda_verb alc861_asus_init_verbs[] = {
15769 /* 15781 /*
15770 * Unmute ADC0 and set the default input to mic-in 15782 * Unmute ADC0 and set the default input to mic-in
15771 */ 15783 */
@@ -15831,7 +15843,7 @@ static struct hda_verb alc861_asus_init_verbs[] = {
15831}; 15843};
15832 15844
15833/* additional init verbs for ASUS laptops */ 15845/* additional init verbs for ASUS laptops */
15834static struct hda_verb alc861_asus_laptop_init_verbs[] = { 15846static const struct hda_verb alc861_asus_laptop_init_verbs[] = {
15835 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */ 15847 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
15836 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */ 15848 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
15837 { } 15849 { }
@@ -15840,7 +15852,7 @@ static struct hda_verb alc861_asus_laptop_init_verbs[] = {
15840/* 15852/*
15841 * generic initialization of ADC, input mixers and output mixers 15853 * generic initialization of ADC, input mixers and output mixers
15842 */ 15854 */
15843static struct hda_verb alc861_auto_init_verbs[] = { 15855static const struct hda_verb alc861_auto_init_verbs[] = {
15844 /* 15856 /*
15845 * Unmute ADC0 and set the default input to mic-in 15857 * Unmute ADC0 and set the default input to mic-in
15846 */ 15858 */
@@ -15889,7 +15901,7 @@ static struct hda_verb alc861_auto_init_verbs[] = {
15889 { } 15901 { }
15890}; 15902};
15891 15903
15892static struct hda_verb alc861_toshiba_init_verbs[] = { 15904static const struct hda_verb alc861_toshiba_init_verbs[] = {
15893 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 15905 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15894 15906
15895 { } 15907 { }
@@ -15922,26 +15934,26 @@ static void alc861_toshiba_unsol_event(struct hda_codec *codec,
15922 15934
15923#define ALC861_DIGOUT_NID 0x07 15935#define ALC861_DIGOUT_NID 0x07
15924 15936
15925static struct hda_channel_mode alc861_8ch_modes[1] = { 15937static const struct hda_channel_mode alc861_8ch_modes[1] = {
15926 { 8, NULL } 15938 { 8, NULL }
15927}; 15939};
15928 15940
15929static hda_nid_t alc861_dac_nids[4] = { 15941static const hda_nid_t alc861_dac_nids[4] = {
15930 /* front, surround, clfe, side */ 15942 /* front, surround, clfe, side */
15931 0x03, 0x06, 0x05, 0x04 15943 0x03, 0x06, 0x05, 0x04
15932}; 15944};
15933 15945
15934static hda_nid_t alc660_dac_nids[3] = { 15946static const hda_nid_t alc660_dac_nids[3] = {
15935 /* front, clfe, surround */ 15947 /* front, clfe, surround */
15936 0x03, 0x05, 0x06 15948 0x03, 0x05, 0x06
15937}; 15949};
15938 15950
15939static hda_nid_t alc861_adc_nids[1] = { 15951static const hda_nid_t alc861_adc_nids[1] = {
15940 /* ADC0-2 */ 15952 /* ADC0-2 */
15941 0x08, 15953 0x08,
15942}; 15954};
15943 15955
15944static struct hda_input_mux alc861_capture_source = { 15956static const struct hda_input_mux alc861_capture_source = {
15945 .num_items = 5, 15957 .num_items = 5,
15946 .items = { 15958 .items = {
15947 { "Mic", 0x0 }, 15959 { "Mic", 0x0 },
@@ -15991,7 +16003,7 @@ static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
15991 dac = alc861_look_for_dac(codec, nid); 16003 dac = alc861_look_for_dac(codec, nid);
15992 if (!dac) 16004 if (!dac)
15993 continue; 16005 continue;
15994 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac; 16006 spec->private_dac_nids[spec->multiout.num_dacs++] = dac;
15995 } 16007 }
15996 return 0; 16008 return 0;
15997} 16009}
@@ -16014,11 +16026,15 @@ static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
16014 static const char * const chname[4] = { 16026 static const char * const chname[4] = {
16015 "Front", "Surround", NULL /*CLFE*/, "Side" 16027 "Front", "Surround", NULL /*CLFE*/, "Side"
16016 }; 16028 };
16017 const char *pfx = alc_get_line_out_pfx(cfg, true); 16029 const char *pfx = alc_get_line_out_pfx(spec, true);
16018 hda_nid_t nid; 16030 hda_nid_t nid;
16019 int i, err; 16031 int i, err, noutputs;
16020 16032
16021 for (i = 0; i < cfg->line_outs; i++) { 16033 noutputs = cfg->line_outs;
16034 if (spec->multi_ios > 0)
16035 noutputs += spec->multi_ios;
16036
16037 for (i = 0; i < noutputs; i++) {
16022 nid = spec->multiout.dac_nids[i]; 16038 nid = spec->multiout.dac_nids[i];
16023 if (!nid) 16039 if (!nid)
16024 continue; 16040 continue;
@@ -16151,7 +16167,7 @@ static int alc861_parse_auto_config(struct hda_codec *codec)
16151{ 16167{
16152 struct alc_spec *spec = codec->spec; 16168 struct alc_spec *spec = codec->spec;
16153 int err; 16169 int err;
16154 static hda_nid_t alc861_ignore[] = { 0x1d, 0 }; 16170 static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
16155 16171
16156 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 16172 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
16157 alc861_ignore); 16173 alc861_ignore);
@@ -16163,6 +16179,9 @@ static int alc861_parse_auto_config(struct hda_codec *codec)
16163 err = alc861_auto_fill_dac_nids(codec, &spec->autocfg); 16179 err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
16164 if (err < 0) 16180 if (err < 0)
16165 return err; 16181 return err;
16182 err = alc_auto_add_multi_channel_mode(codec);
16183 if (err < 0)
16184 return err;
16166 err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg); 16185 err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
16167 if (err < 0) 16186 if (err < 0)
16168 return err; 16187 return err;
@@ -16207,7 +16226,7 @@ static void alc861_auto_init(struct hda_codec *codec)
16207} 16226}
16208 16227
16209#ifdef CONFIG_SND_HDA_POWER_SAVE 16228#ifdef CONFIG_SND_HDA_POWER_SAVE
16210static struct hda_amp_list alc861_loopbacks[] = { 16229static const struct hda_amp_list alc861_loopbacks[] = {
16211 { 0x15, HDA_INPUT, 0 }, 16230 { 0x15, HDA_INPUT, 0 },
16212 { 0x15, HDA_INPUT, 1 }, 16231 { 0x15, HDA_INPUT, 1 },
16213 { 0x15, HDA_INPUT, 2 }, 16232 { 0x15, HDA_INPUT, 2 },
@@ -16232,7 +16251,7 @@ static const char * const alc861_models[ALC861_MODEL_LAST] = {
16232 [ALC861_AUTO] = "auto", 16251 [ALC861_AUTO] = "auto",
16233}; 16252};
16234 16253
16235static struct snd_pci_quirk alc861_cfg_tbl[] = { 16254static const struct snd_pci_quirk alc861_cfg_tbl[] = {
16236 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST), 16255 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
16237 SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP), 16256 SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
16238 SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP), 16257 SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
@@ -16256,7 +16275,7 @@ static struct snd_pci_quirk alc861_cfg_tbl[] = {
16256 {} 16275 {}
16257}; 16276};
16258 16277
16259static struct alc_config_preset alc861_presets[] = { 16278static const struct alc_config_preset alc861_presets[] = {
16260 [ALC861_3ST] = { 16279 [ALC861_3ST] = {
16261 .mixers = { alc861_3ST_mixer }, 16280 .mixers = { alc861_3ST_mixer },
16262 .init_verbs = { alc861_threestack_init_verbs }, 16281 .init_verbs = { alc861_threestack_init_verbs },
@@ -16379,7 +16398,7 @@ static const struct alc_fixup alc861_fixups[] = {
16379 }, 16398 },
16380}; 16399};
16381 16400
16382static struct snd_pci_quirk alc861_fixup_tbl[] = { 16401static const struct snd_pci_quirk alc861_fixup_tbl[] = {
16383 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505), 16402 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
16384 {} 16403 {}
16385}; 16404};
@@ -16472,7 +16491,7 @@ static int patch_alc861(struct hda_codec *codec)
16472 */ 16491 */
16473#define ALC861VD_DIGOUT_NID 0x06 16492#define ALC861VD_DIGOUT_NID 0x06
16474 16493
16475static hda_nid_t alc861vd_dac_nids[4] = { 16494static const hda_nid_t alc861vd_dac_nids[4] = {
16476 /* front, surr, clfe, side surr */ 16495 /* front, surr, clfe, side surr */
16477 0x02, 0x03, 0x04, 0x05 16496 0x02, 0x03, 0x04, 0x05
16478}; 16497};
@@ -16484,21 +16503,21 @@ static hda_nid_t alc861vd_dac_nids[4] = {
16484 * - and it is the same as in 861vd. 16503 * - and it is the same as in 861vd.
16485 * adc_nids in ALC660vd are (is) the same as in 861vd 16504 * adc_nids in ALC660vd are (is) the same as in 861vd
16486 */ 16505 */
16487static hda_nid_t alc660vd_dac_nids[3] = { 16506static const hda_nid_t alc660vd_dac_nids[3] = {
16488 /* front, rear, clfe, rear_surr */ 16507 /* front, rear, clfe, rear_surr */
16489 0x02, 0x04, 0x03 16508 0x02, 0x04, 0x03
16490}; 16509};
16491 16510
16492static hda_nid_t alc861vd_adc_nids[1] = { 16511static const hda_nid_t alc861vd_adc_nids[1] = {
16493 /* ADC0 */ 16512 /* ADC0 */
16494 0x09, 16513 0x09,
16495}; 16514};
16496 16515
16497static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 }; 16516static const hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
16498 16517
16499/* input MUX */ 16518/* input MUX */
16500/* FIXME: should be a matrix-type input source selection */ 16519/* FIXME: should be a matrix-type input source selection */
16501static struct hda_input_mux alc861vd_capture_source = { 16520static const struct hda_input_mux alc861vd_capture_source = {
16502 .num_items = 4, 16521 .num_items = 4,
16503 .items = { 16522 .items = {
16504 { "Mic", 0x0 }, 16523 { "Mic", 0x0 },
@@ -16508,7 +16527,7 @@ static struct hda_input_mux alc861vd_capture_source = {
16508 }, 16527 },
16509}; 16528};
16510 16529
16511static struct hda_input_mux alc861vd_dallas_capture_source = { 16530static const struct hda_input_mux alc861vd_dallas_capture_source = {
16512 .num_items = 2, 16531 .num_items = 2,
16513 .items = { 16532 .items = {
16514 { "Mic", 0x0 }, 16533 { "Mic", 0x0 },
@@ -16516,7 +16535,7 @@ static struct hda_input_mux alc861vd_dallas_capture_source = {
16516 }, 16535 },
16517}; 16536};
16518 16537
16519static struct hda_input_mux alc861vd_hp_capture_source = { 16538static const struct hda_input_mux alc861vd_hp_capture_source = {
16520 .num_items = 2, 16539 .num_items = 2,
16521 .items = { 16540 .items = {
16522 { "Front Mic", 0x0 }, 16541 { "Front Mic", 0x0 },
@@ -16527,14 +16546,14 @@ static struct hda_input_mux alc861vd_hp_capture_source = {
16527/* 16546/*
16528 * 2ch mode 16547 * 2ch mode
16529 */ 16548 */
16530static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = { 16549static const struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
16531 { 2, NULL } 16550 { 2, NULL }
16532}; 16551};
16533 16552
16534/* 16553/*
16535 * 6ch mode 16554 * 6ch mode
16536 */ 16555 */
16537static struct hda_verb alc861vd_6stack_ch6_init[] = { 16556static const struct hda_verb alc861vd_6stack_ch6_init[] = {
16538 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 16557 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16539 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 16558 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16540 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 16559 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
@@ -16545,7 +16564,7 @@ static struct hda_verb alc861vd_6stack_ch6_init[] = {
16545/* 16564/*
16546 * 8ch mode 16565 * 8ch mode
16547 */ 16566 */
16548static struct hda_verb alc861vd_6stack_ch8_init[] = { 16567static const struct hda_verb alc861vd_6stack_ch8_init[] = {
16549 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 16568 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16550 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 16569 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16551 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 16570 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
@@ -16553,12 +16572,12 @@ static struct hda_verb alc861vd_6stack_ch8_init[] = {
16553 { } /* end */ 16572 { } /* end */
16554}; 16573};
16555 16574
16556static struct hda_channel_mode alc861vd_6stack_modes[2] = { 16575static const struct hda_channel_mode alc861vd_6stack_modes[2] = {
16557 { 6, alc861vd_6stack_ch6_init }, 16576 { 6, alc861vd_6stack_ch6_init },
16558 { 8, alc861vd_6stack_ch8_init }, 16577 { 8, alc861vd_6stack_ch8_init },
16559}; 16578};
16560 16579
16561static struct snd_kcontrol_new alc861vd_chmode_mixer[] = { 16580static const struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
16562 { 16581 {
16563 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 16582 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
16564 .name = "Channel Mode", 16583 .name = "Channel Mode",
@@ -16572,7 +16591,7 @@ static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
16572/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17 16591/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
16573 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b 16592 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
16574 */ 16593 */
16575static struct snd_kcontrol_new alc861vd_6st_mixer[] = { 16594static const struct snd_kcontrol_new alc861vd_6st_mixer[] = {
16576 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16595 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16577 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 16596 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16578 16597
@@ -16608,7 +16627,7 @@ static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
16608 { } /* end */ 16627 { } /* end */
16609}; 16628};
16610 16629
16611static struct snd_kcontrol_new alc861vd_3st_mixer[] = { 16630static const struct snd_kcontrol_new alc861vd_3st_mixer[] = {
16612 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16631 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16613 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 16632 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16614 16633
@@ -16631,7 +16650,7 @@ static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
16631 { } /* end */ 16650 { } /* end */
16632}; 16651};
16633 16652
16634static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = { 16653static const struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
16635 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16654 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16636 /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/ 16655 /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
16637 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 16656 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
@@ -16655,7 +16674,7 @@ static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
16655/* Pin assignment: Speaker=0x14, HP = 0x15, 16674/* Pin assignment: Speaker=0x14, HP = 0x15,
16656 * Mic=0x18, Internal Mic = 0x19, CD = 0x1c, PC Beep = 0x1d 16675 * Mic=0x18, Internal Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
16657 */ 16676 */
16658static struct snd_kcontrol_new alc861vd_dallas_mixer[] = { 16677static const struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
16659 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16678 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16660 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT), 16679 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
16661 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 16680 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
@@ -16672,7 +16691,7 @@ static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
16672/* Pin assignment: Speaker=0x14, Line-out = 0x15, 16691/* Pin assignment: Speaker=0x14, Line-out = 0x15,
16673 * Front Mic=0x18, ATAPI Mic = 0x19, 16692 * Front Mic=0x18, ATAPI Mic = 0x19,
16674 */ 16693 */
16675static struct snd_kcontrol_new alc861vd_hp_mixer[] = { 16694static const struct snd_kcontrol_new alc861vd_hp_mixer[] = {
16676 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16695 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16677 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 16696 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16678 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 16697 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
@@ -16688,7 +16707,7 @@ static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
16688/* 16707/*
16689 * generic initialization of ADC, input mixers and output mixers 16708 * generic initialization of ADC, input mixers and output mixers
16690 */ 16709 */
16691static struct hda_verb alc861vd_volume_init_verbs[] = { 16710static const struct hda_verb alc861vd_volume_init_verbs[] = {
16692 /* 16711 /*
16693 * Unmute ADC0 and set the default input to mic-in 16712 * Unmute ADC0 and set the default input to mic-in
16694 */ 16713 */
@@ -16738,7 +16757,7 @@ static struct hda_verb alc861vd_volume_init_verbs[] = {
16738 * 3-stack pin configuration: 16757 * 3-stack pin configuration:
16739 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b 16758 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
16740 */ 16759 */
16741static struct hda_verb alc861vd_3stack_init_verbs[] = { 16760static const struct hda_verb alc861vd_3stack_init_verbs[] = {
16742 /* 16761 /*
16743 * Set pin mode and muting 16762 * Set pin mode and muting
16744 */ 16763 */
@@ -16769,7 +16788,7 @@ static struct hda_verb alc861vd_3stack_init_verbs[] = {
16769/* 16788/*
16770 * 6-stack pin configuration: 16789 * 6-stack pin configuration:
16771 */ 16790 */
16772static struct hda_verb alc861vd_6stack_init_verbs[] = { 16791static const struct hda_verb alc861vd_6stack_init_verbs[] = {
16773 /* 16792 /*
16774 * Set pin mode and muting 16793 * Set pin mode and muting
16775 */ 16794 */
@@ -16810,18 +16829,18 @@ static struct hda_verb alc861vd_6stack_init_verbs[] = {
16810 { } 16829 { }
16811}; 16830};
16812 16831
16813static struct hda_verb alc861vd_eapd_verbs[] = { 16832static const struct hda_verb alc861vd_eapd_verbs[] = {
16814 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 16833 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16815 { } 16834 { }
16816}; 16835};
16817 16836
16818static struct hda_verb alc660vd_eapd_verbs[] = { 16837static const struct hda_verb alc660vd_eapd_verbs[] = {
16819 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 16838 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16820 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 16839 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16821 { } 16840 { }
16822}; 16841};
16823 16842
16824static struct hda_verb alc861vd_lenovo_unsol_verbs[] = { 16843static const struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
16825 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 16844 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16826 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 16845 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16827 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, 16846 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
@@ -16835,11 +16854,13 @@ static void alc861vd_lenovo_setup(struct hda_codec *codec)
16835 struct alc_spec *spec = codec->spec; 16854 struct alc_spec *spec = codec->spec;
16836 spec->autocfg.hp_pins[0] = 0x1b; 16855 spec->autocfg.hp_pins[0] = 0x1b;
16837 spec->autocfg.speaker_pins[0] = 0x14; 16856 spec->autocfg.speaker_pins[0] = 0x14;
16857 spec->automute = 1;
16858 spec->automute_mode = ALC_AUTOMUTE_AMP;
16838} 16859}
16839 16860
16840static void alc861vd_lenovo_init_hook(struct hda_codec *codec) 16861static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
16841{ 16862{
16842 alc_automute_amp(codec); 16863 alc_hp_automute(codec);
16843 alc88x_simple_mic_automute(codec); 16864 alc88x_simple_mic_automute(codec);
16844} 16865}
16845 16866
@@ -16851,12 +16872,12 @@ static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
16851 alc88x_simple_mic_automute(codec); 16872 alc88x_simple_mic_automute(codec);
16852 break; 16873 break;
16853 default: 16874 default:
16854 alc_automute_amp_unsol_event(codec, res); 16875 alc_sku_unsol_event(codec, res);
16855 break; 16876 break;
16856 } 16877 }
16857} 16878}
16858 16879
16859static struct hda_verb alc861vd_dallas_verbs[] = { 16880static const struct hda_verb alc861vd_dallas_verbs[] = {
16860 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 16881 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16861 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 16882 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16862 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 16883 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
@@ -16908,6 +16929,8 @@ static void alc861vd_dallas_setup(struct hda_codec *codec)
16908 16929
16909 spec->autocfg.hp_pins[0] = 0x15; 16930 spec->autocfg.hp_pins[0] = 0x15;
16910 spec->autocfg.speaker_pins[0] = 0x14; 16931 spec->autocfg.speaker_pins[0] = 0x14;
16932 spec->automute = 1;
16933 spec->automute_mode = ALC_AUTOMUTE_AMP;
16911} 16934}
16912 16935
16913#ifdef CONFIG_SND_HDA_POWER_SAVE 16936#ifdef CONFIG_SND_HDA_POWER_SAVE
@@ -16936,7 +16959,7 @@ static const char * const alc861vd_models[ALC861VD_MODEL_LAST] = {
16936 [ALC861VD_AUTO] = "auto", 16959 [ALC861VD_AUTO] = "auto",
16937}; 16960};
16938 16961
16939static struct snd_pci_quirk alc861vd_cfg_tbl[] = { 16962static const struct snd_pci_quirk alc861vd_cfg_tbl[] = {
16940 SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST), 16963 SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
16941 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP), 16964 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
16942 SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST), 16965 SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
@@ -16955,7 +16978,7 @@ static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
16955 {} 16978 {}
16956}; 16979};
16957 16980
16958static struct alc_config_preset alc861vd_presets[] = { 16981static const struct alc_config_preset alc861vd_presets[] = {
16959 [ALC660VD_3ST] = { 16982 [ALC660VD_3ST] = {
16960 .mixers = { alc861vd_3st_mixer }, 16983 .mixers = { alc861vd_3st_mixer },
16961 .init_verbs = { alc861vd_volume_init_verbs, 16984 .init_verbs = { alc861vd_volume_init_verbs,
@@ -17032,9 +17055,9 @@ static struct alc_config_preset alc861vd_presets[] = {
17032 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 17055 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
17033 .channel_mode = alc861vd_3stack_2ch_modes, 17056 .channel_mode = alc861vd_3stack_2ch_modes,
17034 .input_mux = &alc861vd_dallas_capture_source, 17057 .input_mux = &alc861vd_dallas_capture_source,
17035 .unsol_event = alc_automute_amp_unsol_event, 17058 .unsol_event = alc_sku_unsol_event,
17036 .setup = alc861vd_dallas_setup, 17059 .setup = alc861vd_dallas_setup,
17037 .init_hook = alc_automute_amp, 17060 .init_hook = alc_hp_automute,
17038 }, 17061 },
17039 [ALC861VD_HP] = { 17062 [ALC861VD_HP] = {
17040 .mixers = { alc861vd_hp_mixer }, 17063 .mixers = { alc861vd_hp_mixer },
@@ -17045,9 +17068,9 @@ static struct alc_config_preset alc861vd_presets[] = {
17045 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes), 17068 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
17046 .channel_mode = alc861vd_3stack_2ch_modes, 17069 .channel_mode = alc861vd_3stack_2ch_modes,
17047 .input_mux = &alc861vd_hp_capture_source, 17070 .input_mux = &alc861vd_hp_capture_source,
17048 .unsol_event = alc_automute_amp_unsol_event, 17071 .unsol_event = alc_sku_unsol_event,
17049 .setup = alc861vd_dallas_setup, 17072 .setup = alc861vd_dallas_setup,
17050 .init_hook = alc_automute_amp, 17073 .init_hook = alc_hp_automute,
17051 }, 17074 },
17052 [ALC660VD_ASUS_V1S] = { 17075 [ALC660VD_ASUS_V1S] = {
17053 .mixers = { alc861vd_lenovo_mixer }, 17076 .mixers = { alc861vd_lenovo_mixer },
@@ -17146,11 +17169,15 @@ static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
17146 static const char * const chname[4] = { 17169 static const char * const chname[4] = {
17147 "Front", "Surround", "CLFE", "Side" 17170 "Front", "Surround", "CLFE", "Side"
17148 }; 17171 };
17149 const char *pfx = alc_get_line_out_pfx(cfg, true); 17172 const char *pfx = alc_get_line_out_pfx(spec, true);
17150 hda_nid_t nid_v, nid_s; 17173 hda_nid_t nid_v, nid_s;
17151 int i, err; 17174 int i, err, noutputs;
17152 17175
17153 for (i = 0; i < cfg->line_outs; i++) { 17176 noutputs = cfg->line_outs;
17177 if (spec->multi_ios > 0)
17178 noutputs += spec->multi_ios;
17179
17180 for (i = 0; i < noutputs; i++) {
17154 if (!spec->multiout.dac_nids[i]) 17181 if (!spec->multiout.dac_nids[i])
17155 continue; 17182 continue;
17156 nid_v = alc861vd_idx_to_mixer_vol( 17183 nid_v = alc861vd_idx_to_mixer_vol(
@@ -17263,7 +17290,7 @@ static int alc861vd_parse_auto_config(struct hda_codec *codec)
17263{ 17290{
17264 struct alc_spec *spec = codec->spec; 17291 struct alc_spec *spec = codec->spec;
17265 int err; 17292 int err;
17266 static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 }; 17293 static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
17267 17294
17268 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 17295 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
17269 alc861vd_ignore); 17296 alc861vd_ignore);
@@ -17275,6 +17302,9 @@ static int alc861vd_parse_auto_config(struct hda_codec *codec)
17275 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg); 17302 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
17276 if (err < 0) 17303 if (err < 0)
17277 return err; 17304 return err;
17305 err = alc_auto_add_multi_channel_mode(codec);
17306 if (err < 0)
17307 return err;
17278 err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg); 17308 err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
17279 if (err < 0) 17309 if (err < 0)
17280 return err; 17310 return err;
@@ -17343,7 +17373,7 @@ static const struct alc_fixup alc861vd_fixups[] = {
17343 }, 17373 },
17344}; 17374};
17345 17375
17346static struct snd_pci_quirk alc861vd_fixup_tbl[] = { 17376static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
17347 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1), 17377 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
17348 {} 17378 {}
17349}; 17379};
@@ -17426,6 +17456,7 @@ static int patch_alc861vd(struct hda_codec *codec)
17426 17456
17427 if (board_config == ALC861VD_AUTO) 17457 if (board_config == ALC861VD_AUTO)
17428 spec->init_hook = alc861vd_auto_init; 17458 spec->init_hook = alc861vd_auto_init;
17459 spec->shutup = alc_eapd_shutup;
17429#ifdef CONFIG_SND_HDA_POWER_SAVE 17460#ifdef CONFIG_SND_HDA_POWER_SAVE
17430 if (!spec->loopback.amplist) 17461 if (!spec->loopback.amplist)
17431 spec->loopback.amplist = alc861vd_loopbacks; 17462 spec->loopback.amplist = alc861vd_loopbacks;
@@ -17448,32 +17479,32 @@ static int patch_alc861vd(struct hda_codec *codec)
17448#define ALC662_DIGOUT_NID 0x06 17479#define ALC662_DIGOUT_NID 0x06
17449#define ALC662_DIGIN_NID 0x0a 17480#define ALC662_DIGIN_NID 0x0a
17450 17481
17451static hda_nid_t alc662_dac_nids[4] = { 17482static const hda_nid_t alc662_dac_nids[3] = {
17452 /* front, rear, clfe, rear_surr */ 17483 /* front, rear, clfe */
17453 0x02, 0x03, 0x04 17484 0x02, 0x03, 0x04
17454}; 17485};
17455 17486
17456static hda_nid_t alc272_dac_nids[2] = { 17487static const hda_nid_t alc272_dac_nids[2] = {
17457 0x02, 0x03 17488 0x02, 0x03
17458}; 17489};
17459 17490
17460static hda_nid_t alc662_adc_nids[2] = { 17491static const hda_nid_t alc662_adc_nids[2] = {
17461 /* ADC1-2 */ 17492 /* ADC1-2 */
17462 0x09, 0x08 17493 0x09, 0x08
17463}; 17494};
17464 17495
17465static hda_nid_t alc272_adc_nids[1] = { 17496static const hda_nid_t alc272_adc_nids[1] = {
17466 /* ADC1-2 */ 17497 /* ADC1-2 */
17467 0x08, 17498 0x08,
17468}; 17499};
17469 17500
17470static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 }; 17501static const hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
17471static hda_nid_t alc272_capsrc_nids[1] = { 0x23 }; 17502static const hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
17472 17503
17473 17504
17474/* input MUX */ 17505/* input MUX */
17475/* FIXME: should be a matrix-type input source selection */ 17506/* FIXME: should be a matrix-type input source selection */
17476static struct hda_input_mux alc662_capture_source = { 17507static const struct hda_input_mux alc662_capture_source = {
17477 .num_items = 4, 17508 .num_items = 4,
17478 .items = { 17509 .items = {
17479 { "Mic", 0x0 }, 17510 { "Mic", 0x0 },
@@ -17483,7 +17514,7 @@ static struct hda_input_mux alc662_capture_source = {
17483 }, 17514 },
17484}; 17515};
17485 17516
17486static struct hda_input_mux alc662_lenovo_101e_capture_source = { 17517static const struct hda_input_mux alc662_lenovo_101e_capture_source = {
17487 .num_items = 2, 17518 .num_items = 2,
17488 .items = { 17519 .items = {
17489 { "Mic", 0x1 }, 17520 { "Mic", 0x1 },
@@ -17491,7 +17522,7 @@ static struct hda_input_mux alc662_lenovo_101e_capture_source = {
17491 }, 17522 },
17492}; 17523};
17493 17524
17494static struct hda_input_mux alc663_capture_source = { 17525static const struct hda_input_mux alc663_capture_source = {
17495 .num_items = 3, 17526 .num_items = 3,
17496 .items = { 17527 .items = {
17497 { "Mic", 0x0 }, 17528 { "Mic", 0x0 },
@@ -17501,7 +17532,7 @@ static struct hda_input_mux alc663_capture_source = {
17501}; 17532};
17502 17533
17503#if 0 /* set to 1 for testing other input sources below */ 17534#if 0 /* set to 1 for testing other input sources below */
17504static struct hda_input_mux alc272_nc10_capture_source = { 17535static const struct hda_input_mux alc272_nc10_capture_source = {
17505 .num_items = 16, 17536 .num_items = 16,
17506 .items = { 17537 .items = {
17507 { "Autoselect Mic", 0x0 }, 17538 { "Autoselect Mic", 0x0 },
@@ -17527,14 +17558,14 @@ static struct hda_input_mux alc272_nc10_capture_source = {
17527/* 17558/*
17528 * 2ch mode 17559 * 2ch mode
17529 */ 17560 */
17530static struct hda_channel_mode alc662_3ST_2ch_modes[1] = { 17561static const struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
17531 { 2, NULL } 17562 { 2, NULL }
17532}; 17563};
17533 17564
17534/* 17565/*
17535 * 2ch mode 17566 * 2ch mode
17536 */ 17567 */
17537static struct hda_verb alc662_3ST_ch2_init[] = { 17568static const struct hda_verb alc662_3ST_ch2_init[] = {
17538 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 17569 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
17539 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 17570 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
17540 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 17571 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
@@ -17545,7 +17576,7 @@ static struct hda_verb alc662_3ST_ch2_init[] = {
17545/* 17576/*
17546 * 6ch mode 17577 * 6ch mode
17547 */ 17578 */
17548static struct hda_verb alc662_3ST_ch6_init[] = { 17579static const struct hda_verb alc662_3ST_ch6_init[] = {
17549 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 17580 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17550 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 17581 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
17551 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 17582 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
@@ -17555,7 +17586,7 @@ static struct hda_verb alc662_3ST_ch6_init[] = {
17555 { } /* end */ 17586 { } /* end */
17556}; 17587};
17557 17588
17558static struct hda_channel_mode alc662_3ST_6ch_modes[2] = { 17589static const struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
17559 { 2, alc662_3ST_ch2_init }, 17590 { 2, alc662_3ST_ch2_init },
17560 { 6, alc662_3ST_ch6_init }, 17591 { 6, alc662_3ST_ch6_init },
17561}; 17592};
@@ -17563,7 +17594,7 @@ static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
17563/* 17594/*
17564 * 2ch mode 17595 * 2ch mode
17565 */ 17596 */
17566static struct hda_verb alc662_sixstack_ch6_init[] = { 17597static const struct hda_verb alc662_sixstack_ch6_init[] = {
17567 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 17598 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
17568 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 17599 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
17569 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 17600 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
@@ -17573,14 +17604,14 @@ static struct hda_verb alc662_sixstack_ch6_init[] = {
17573/* 17604/*
17574 * 6ch mode 17605 * 6ch mode
17575 */ 17606 */
17576static struct hda_verb alc662_sixstack_ch8_init[] = { 17607static const struct hda_verb alc662_sixstack_ch8_init[] = {
17577 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 17608 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17578 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 17609 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17579 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 17610 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17580 { } /* end */ 17611 { } /* end */
17581}; 17612};
17582 17613
17583static struct hda_channel_mode alc662_5stack_modes[2] = { 17614static const struct hda_channel_mode alc662_5stack_modes[2] = {
17584 { 2, alc662_sixstack_ch6_init }, 17615 { 2, alc662_sixstack_ch6_init },
17585 { 6, alc662_sixstack_ch8_init }, 17616 { 6, alc662_sixstack_ch8_init },
17586}; 17617};
@@ -17589,7 +17620,7 @@ static struct hda_channel_mode alc662_5stack_modes[2] = {
17589 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b 17620 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
17590 */ 17621 */
17591 17622
17592static struct snd_kcontrol_new alc662_base_mixer[] = { 17623static const struct snd_kcontrol_new alc662_base_mixer[] = {
17593 /* output mixer control */ 17624 /* output mixer control */
17594 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), 17625 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
17595 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT), 17626 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
@@ -17613,7 +17644,7 @@ static struct snd_kcontrol_new alc662_base_mixer[] = {
17613 { } /* end */ 17644 { } /* end */
17614}; 17645};
17615 17646
17616static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = { 17647static const struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
17617 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 17648 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17618 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT), 17649 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
17619 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 17650 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
@@ -17628,7 +17659,7 @@ static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
17628 { } /* end */ 17659 { } /* end */
17629}; 17660};
17630 17661
17631static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = { 17662static const struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
17632 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 17663 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17633 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT), 17664 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
17634 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT), 17665 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
@@ -17649,7 +17680,7 @@ static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
17649 { } /* end */ 17680 { } /* end */
17650}; 17681};
17651 17682
17652static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = { 17683static const struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
17653 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 17684 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17654 HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT), 17685 HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
17655 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT), 17686 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
@@ -17662,7 +17693,7 @@ static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
17662 { } /* end */ 17693 { } /* end */
17663}; 17694};
17664 17695
17665static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = { 17696static const struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
17666 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT), 17697 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17667 ALC262_HIPPO_MASTER_SWITCH, 17698 ALC262_HIPPO_MASTER_SWITCH,
17668 17699
@@ -17676,7 +17707,7 @@ static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
17676 { } /* end */ 17707 { } /* end */
17677}; 17708};
17678 17709
17679static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = { 17710static const struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
17680 ALC262_HIPPO_MASTER_SWITCH, 17711 ALC262_HIPPO_MASTER_SWITCH,
17681 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 17712 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17682 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT), 17713 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
@@ -17690,7 +17721,7 @@ static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
17690 { } /* end */ 17721 { } /* end */
17691}; 17722};
17692 17723
17693static struct hda_bind_ctls alc663_asus_bind_master_vol = { 17724static const struct hda_bind_ctls alc663_asus_bind_master_vol = {
17694 .ops = &snd_hda_bind_vol, 17725 .ops = &snd_hda_bind_vol,
17695 .values = { 17726 .values = {
17696 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT), 17727 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
@@ -17699,7 +17730,7 @@ static struct hda_bind_ctls alc663_asus_bind_master_vol = {
17699 }, 17730 },
17700}; 17731};
17701 17732
17702static struct hda_bind_ctls alc663_asus_one_bind_switch = { 17733static const struct hda_bind_ctls alc663_asus_one_bind_switch = {
17703 .ops = &snd_hda_bind_sw, 17734 .ops = &snd_hda_bind_sw,
17704 .values = { 17735 .values = {
17705 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 17736 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
@@ -17708,7 +17739,7 @@ static struct hda_bind_ctls alc663_asus_one_bind_switch = {
17708 }, 17739 },
17709}; 17740};
17710 17741
17711static struct snd_kcontrol_new alc663_m51va_mixer[] = { 17742static const struct snd_kcontrol_new alc663_m51va_mixer[] = {
17712 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol), 17743 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17713 HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch), 17744 HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
17714 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 17745 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
@@ -17716,7 +17747,7 @@ static struct snd_kcontrol_new alc663_m51va_mixer[] = {
17716 { } /* end */ 17747 { } /* end */
17717}; 17748};
17718 17749
17719static struct hda_bind_ctls alc663_asus_tree_bind_switch = { 17750static const struct hda_bind_ctls alc663_asus_tree_bind_switch = {
17720 .ops = &snd_hda_bind_sw, 17751 .ops = &snd_hda_bind_sw,
17721 .values = { 17752 .values = {
17722 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 17753 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
@@ -17726,7 +17757,7 @@ static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
17726 }, 17757 },
17727}; 17758};
17728 17759
17729static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = { 17760static const struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
17730 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol), 17761 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17731 HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch), 17762 HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
17732 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 17763 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
@@ -17737,7 +17768,7 @@ static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
17737 { } /* end */ 17768 { } /* end */
17738}; 17769};
17739 17770
17740static struct hda_bind_ctls alc663_asus_four_bind_switch = { 17771static const struct hda_bind_ctls alc663_asus_four_bind_switch = {
17741 .ops = &snd_hda_bind_sw, 17772 .ops = &snd_hda_bind_sw,
17742 .values = { 17773 .values = {
17743 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 17774 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
@@ -17747,7 +17778,7 @@ static struct hda_bind_ctls alc663_asus_four_bind_switch = {
17747 }, 17778 },
17748}; 17779};
17749 17780
17750static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = { 17781static const struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
17751 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol), 17782 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17752 HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch), 17783 HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
17753 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 17784 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
@@ -17757,7 +17788,7 @@ static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
17757 { } /* end */ 17788 { } /* end */
17758}; 17789};
17759 17790
17760static struct snd_kcontrol_new alc662_1bjd_mixer[] = { 17791static const struct snd_kcontrol_new alc662_1bjd_mixer[] = {
17761 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 17792 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17762 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 17793 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17763 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 17794 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
@@ -17768,7 +17799,7 @@ static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
17768 { } /* end */ 17799 { } /* end */
17769}; 17800};
17770 17801
17771static struct hda_bind_ctls alc663_asus_two_bind_master_vol = { 17802static const struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
17772 .ops = &snd_hda_bind_vol, 17803 .ops = &snd_hda_bind_vol,
17773 .values = { 17804 .values = {
17774 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT), 17805 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
@@ -17777,7 +17808,7 @@ static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
17777 }, 17808 },
17778}; 17809};
17779 17810
17780static struct hda_bind_ctls alc663_asus_two_bind_switch = { 17811static const struct hda_bind_ctls alc663_asus_two_bind_switch = {
17781 .ops = &snd_hda_bind_sw, 17812 .ops = &snd_hda_bind_sw,
17782 .values = { 17813 .values = {
17783 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 17814 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
@@ -17786,7 +17817,7 @@ static struct hda_bind_ctls alc663_asus_two_bind_switch = {
17786 }, 17817 },
17787}; 17818};
17788 17819
17789static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = { 17820static const struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
17790 HDA_BIND_VOL("Master Playback Volume", 17821 HDA_BIND_VOL("Master Playback Volume",
17791 &alc663_asus_two_bind_master_vol), 17822 &alc663_asus_two_bind_master_vol),
17792 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch), 17823 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
@@ -17797,7 +17828,7 @@ static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
17797 { } /* end */ 17828 { } /* end */
17798}; 17829};
17799 17830
17800static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = { 17831static const struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
17801 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol), 17832 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17802 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch), 17833 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
17803 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 17834 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
@@ -17807,7 +17838,7 @@ static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
17807 { } /* end */ 17838 { } /* end */
17808}; 17839};
17809 17840
17810static struct snd_kcontrol_new alc663_g71v_mixer[] = { 17841static const struct snd_kcontrol_new alc663_g71v_mixer[] = {
17811 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 17842 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17812 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 17843 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17813 HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT), 17844 HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
@@ -17821,7 +17852,7 @@ static struct snd_kcontrol_new alc663_g71v_mixer[] = {
17821 { } /* end */ 17852 { } /* end */
17822}; 17853};
17823 17854
17824static struct snd_kcontrol_new alc663_g50v_mixer[] = { 17855static const struct snd_kcontrol_new alc663_g50v_mixer[] = {
17825 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 17856 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17826 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 17857 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17827 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT), 17858 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
@@ -17835,7 +17866,7 @@ static struct snd_kcontrol_new alc663_g50v_mixer[] = {
17835 { } /* end */ 17866 { } /* end */
17836}; 17867};
17837 17868
17838static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = { 17869static const struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
17839 .ops = &snd_hda_bind_sw, 17870 .ops = &snd_hda_bind_sw,
17840 .values = { 17871 .values = {
17841 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 17872 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
@@ -17847,7 +17878,7 @@ static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
17847 }, 17878 },
17848}; 17879};
17849 17880
17850static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = { 17881static const struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
17851 .ops = &snd_hda_bind_sw, 17882 .ops = &snd_hda_bind_sw,
17852 .values = { 17883 .values = {
17853 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 17884 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
@@ -17856,7 +17887,7 @@ static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
17856 }, 17887 },
17857}; 17888};
17858 17889
17859static struct snd_kcontrol_new alc663_mode7_mixer[] = { 17890static const struct snd_kcontrol_new alc663_mode7_mixer[] = {
17860 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch), 17891 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17861 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol), 17892 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17862 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch), 17893 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
@@ -17869,7 +17900,7 @@ static struct snd_kcontrol_new alc663_mode7_mixer[] = {
17869 { } /* end */ 17900 { } /* end */
17870}; 17901};
17871 17902
17872static struct snd_kcontrol_new alc663_mode8_mixer[] = { 17903static const struct snd_kcontrol_new alc663_mode8_mixer[] = {
17873 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch), 17904 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17874 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol), 17905 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17875 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch), 17906 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
@@ -17881,7 +17912,7 @@ static struct snd_kcontrol_new alc663_mode8_mixer[] = {
17881}; 17912};
17882 17913
17883 17914
17884static struct snd_kcontrol_new alc662_chmode_mixer[] = { 17915static const struct snd_kcontrol_new alc662_chmode_mixer[] = {
17885 { 17916 {
17886 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 17917 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
17887 .name = "Channel Mode", 17918 .name = "Channel Mode",
@@ -17892,7 +17923,7 @@ static struct snd_kcontrol_new alc662_chmode_mixer[] = {
17892 { } /* end */ 17923 { } /* end */
17893}; 17924};
17894 17925
17895static struct hda_verb alc662_init_verbs[] = { 17926static const struct hda_verb alc662_init_verbs[] = {
17896 /* ADC: mute amp left and right */ 17927 /* ADC: mute amp left and right */
17897 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 17928 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17898 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 17929 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
@@ -17938,55 +17969,36 @@ static struct hda_verb alc662_init_verbs[] = {
17938 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 17969 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17939 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 17970 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17940 17971
17941 /* always trun on EAPD */
17942 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
17943 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
17944
17945 { }
17946};
17947
17948static struct hda_verb alc663_init_verbs[] = {
17949 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17950 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17951 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17952 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17953 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17954 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17955 { } 17972 { }
17956}; 17973};
17957 17974
17958static struct hda_verb alc272_init_verbs[] = { 17975static const struct hda_verb alc662_eapd_init_verbs[] = {
17959 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 17976 /* always trun on EAPD */
17960 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 17977 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
17961 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 17978 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
17962 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17963 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17964 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17965 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17966 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17967 { } 17979 { }
17968}; 17980};
17969 17981
17970static struct hda_verb alc662_sue_init_verbs[] = { 17982static const struct hda_verb alc662_sue_init_verbs[] = {
17971 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT}, 17983 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17972 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT}, 17984 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17973 {} 17985 {}
17974}; 17986};
17975 17987
17976static struct hda_verb alc662_eeepc_sue_init_verbs[] = { 17988static const struct hda_verb alc662_eeepc_sue_init_verbs[] = {
17977 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 17989 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17978 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 17990 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17979 {} 17991 {}
17980}; 17992};
17981 17993
17982/* Set Unsolicited Event*/ 17994/* Set Unsolicited Event*/
17983static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = { 17995static const struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
17984 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 17996 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17985 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 17997 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17986 {} 17998 {}
17987}; 17999};
17988 18000
17989static struct hda_verb alc663_m51va_init_verbs[] = { 18001static const struct hda_verb alc663_m51va_init_verbs[] = {
17990 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 18002 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17991 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 18003 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17992 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 18004 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
@@ -17999,7 +18011,7 @@ static struct hda_verb alc663_m51va_init_verbs[] = {
17999 {} 18011 {}
18000}; 18012};
18001 18013
18002static struct hda_verb alc663_21jd_amic_init_verbs[] = { 18014static const struct hda_verb alc663_21jd_amic_init_verbs[] = {
18003 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 18015 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18004 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 18016 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18005 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 18017 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
@@ -18010,7 +18022,7 @@ static struct hda_verb alc663_21jd_amic_init_verbs[] = {
18010 {} 18022 {}
18011}; 18023};
18012 18024
18013static struct hda_verb alc662_1bjd_amic_init_verbs[] = { 18025static const struct hda_verb alc662_1bjd_amic_init_verbs[] = {
18014 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 18026 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18015 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 18027 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18016 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 18028 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
@@ -18022,7 +18034,7 @@ static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
18022 {} 18034 {}
18023}; 18035};
18024 18036
18025static struct hda_verb alc663_15jd_amic_init_verbs[] = { 18037static const struct hda_verb alc663_15jd_amic_init_verbs[] = {
18026 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 18038 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18027 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 18039 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18028 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */ 18040 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
@@ -18033,7 +18045,7 @@ static struct hda_verb alc663_15jd_amic_init_verbs[] = {
18033 {} 18045 {}
18034}; 18046};
18035 18047
18036static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = { 18048static const struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
18037 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 18049 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18038 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 18050 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18039 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 18051 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
@@ -18049,7 +18061,7 @@ static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
18049 {} 18061 {}
18050}; 18062};
18051 18063
18052static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = { 18064static const struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
18053 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 18065 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18054 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 18066 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18055 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 18067 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
@@ -18065,7 +18077,7 @@ static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
18065 {} 18077 {}
18066}; 18078};
18067 18079
18068static struct hda_verb alc663_g71v_init_verbs[] = { 18080static const struct hda_verb alc663_g71v_init_verbs[] = {
18069 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 18081 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18070 /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */ 18082 /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
18071 /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */ 18083 /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
@@ -18080,7 +18092,7 @@ static struct hda_verb alc663_g71v_init_verbs[] = {
18080 {} 18092 {}
18081}; 18093};
18082 18094
18083static struct hda_verb alc663_g50v_init_verbs[] = { 18095static const struct hda_verb alc663_g50v_init_verbs[] = {
18084 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 18096 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18085 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 18097 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18086 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */ 18098 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
@@ -18090,7 +18102,7 @@ static struct hda_verb alc663_g50v_init_verbs[] = {
18090 {} 18102 {}
18091}; 18103};
18092 18104
18093static struct hda_verb alc662_ecs_init_verbs[] = { 18105static const struct hda_verb alc662_ecs_init_verbs[] = {
18094 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f}, 18106 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
18095 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 18107 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
18096 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, 18108 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
@@ -18098,7 +18110,7 @@ static struct hda_verb alc662_ecs_init_verbs[] = {
18098 {} 18110 {}
18099}; 18111};
18100 18112
18101static struct hda_verb alc272_dell_zm1_init_verbs[] = { 18113static const struct hda_verb alc272_dell_zm1_init_verbs[] = {
18102 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 18114 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18103 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 18115 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18104 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 18116 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
@@ -18113,7 +18125,7 @@ static struct hda_verb alc272_dell_zm1_init_verbs[] = {
18113 {} 18125 {}
18114}; 18126};
18115 18127
18116static struct hda_verb alc272_dell_init_verbs[] = { 18128static const struct hda_verb alc272_dell_init_verbs[] = {
18117 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 18129 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18118 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 18130 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18119 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 18131 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
@@ -18128,7 +18140,7 @@ static struct hda_verb alc272_dell_init_verbs[] = {
18128 {} 18140 {}
18129}; 18141};
18130 18142
18131static struct hda_verb alc663_mode7_init_verbs[] = { 18143static const struct hda_verb alc663_mode7_init_verbs[] = {
18132 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 18144 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18133 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 18145 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18134 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 18146 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
@@ -18147,7 +18159,7 @@ static struct hda_verb alc663_mode7_init_verbs[] = {
18147 {} 18159 {}
18148}; 18160};
18149 18161
18150static struct hda_verb alc663_mode8_init_verbs[] = { 18162static const struct hda_verb alc663_mode8_init_verbs[] = {
18151 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 18163 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18152 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 18164 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18153 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 18165 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
@@ -18167,61 +18179,29 @@ static struct hda_verb alc663_mode8_init_verbs[] = {
18167 {} 18179 {}
18168}; 18180};
18169 18181
18170static struct snd_kcontrol_new alc662_auto_capture_mixer[] = { 18182static const struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
18171 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT), 18183 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
18172 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT), 18184 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
18173 { } /* end */ 18185 { } /* end */
18174}; 18186};
18175 18187
18176static struct snd_kcontrol_new alc272_auto_capture_mixer[] = { 18188static const struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
18177 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), 18189 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
18178 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT), 18190 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
18179 { } /* end */ 18191 { } /* end */
18180}; 18192};
18181 18193
18182static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec) 18194static void alc662_lenovo_101e_setup(struct hda_codec *codec)
18183{
18184 unsigned int present;
18185 unsigned char bits;
18186
18187 present = snd_hda_jack_detect(codec, 0x14);
18188 bits = present ? HDA_AMP_MUTE : 0;
18189
18190 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
18191 HDA_AMP_MUTE, bits);
18192}
18193
18194static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
18195{
18196 unsigned int present;
18197 unsigned char bits;
18198
18199 present = snd_hda_jack_detect(codec, 0x1b);
18200 bits = present ? HDA_AMP_MUTE : 0;
18201
18202 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
18203 HDA_AMP_MUTE, bits);
18204 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
18205 HDA_AMP_MUTE, bits);
18206}
18207
18208static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
18209 unsigned int res)
18210{ 18195{
18211 if ((res >> 26) == ALC880_HP_EVENT) 18196 struct alc_spec *spec = codec->spec;
18212 alc662_lenovo_101e_all_automute(codec);
18213 if ((res >> 26) == ALC880_FRONT_EVENT)
18214 alc662_lenovo_101e_ispeaker_automute(codec);
18215}
18216 18197
18217/* unsolicited event for HP jack sensing */ 18198 spec->autocfg.hp_pins[0] = 0x1b;
18218static void alc662_eeepc_unsol_event(struct hda_codec *codec, 18199 spec->autocfg.line_out_pins[0] = 0x14;
18219 unsigned int res) 18200 spec->autocfg.speaker_pins[0] = 0x15;
18220{ 18201 spec->automute = 1;
18221 if ((res >> 26) == ALC880_MIC_EVENT) 18202 spec->detect_line = 1;
18222 alc_mic_automute(codec); 18203 spec->automute_lines = 1;
18223 else 18204 spec->automute_mode = ALC_AUTOMUTE_AMP;
18224 alc262_hippo_unsol_event(codec, res);
18225} 18205}
18226 18206
18227static void alc662_eeepc_setup(struct hda_codec *codec) 18207static void alc662_eeepc_setup(struct hda_codec *codec)
@@ -18236,180 +18216,24 @@ static void alc662_eeepc_setup(struct hda_codec *codec)
18236 spec->auto_mic = 1; 18216 spec->auto_mic = 1;
18237} 18217}
18238 18218
18239static void alc662_eeepc_inithook(struct hda_codec *codec)
18240{
18241 alc262_hippo_automute(codec);
18242 alc_mic_automute(codec);
18243}
18244
18245static void alc662_eeepc_ep20_setup(struct hda_codec *codec) 18219static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
18246{ 18220{
18247 struct alc_spec *spec = codec->spec; 18221 struct alc_spec *spec = codec->spec;
18248 18222
18249 spec->autocfg.hp_pins[0] = 0x14; 18223 spec->autocfg.hp_pins[0] = 0x14;
18250 spec->autocfg.speaker_pins[0] = 0x1b; 18224 spec->autocfg.speaker_pins[0] = 0x1b;
18251} 18225 spec->automute = 1;
18252 18226 spec->automute_mode = ALC_AUTOMUTE_AMP;
18253#define alc662_eeepc_ep20_inithook alc262_hippo_master_update
18254
18255static void alc663_m51va_speaker_automute(struct hda_codec *codec)
18256{
18257 unsigned int present;
18258 unsigned char bits;
18259
18260 present = snd_hda_jack_detect(codec, 0x21);
18261 bits = present ? HDA_AMP_MUTE : 0;
18262 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
18263 HDA_AMP_MUTE, bits);
18264 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
18265 HDA_AMP_MUTE, bits);
18266}
18267
18268static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
18269{
18270 unsigned int present;
18271 unsigned char bits;
18272
18273 present = snd_hda_jack_detect(codec, 0x21);
18274 bits = present ? HDA_AMP_MUTE : 0;
18275 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
18276 HDA_AMP_MUTE, bits);
18277 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
18278 HDA_AMP_MUTE, bits);
18279 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
18280 HDA_AMP_MUTE, bits);
18281 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
18282 HDA_AMP_MUTE, bits);
18283}
18284
18285static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
18286{
18287 unsigned int present;
18288 unsigned char bits;
18289
18290 present = snd_hda_jack_detect(codec, 0x15);
18291 bits = present ? HDA_AMP_MUTE : 0;
18292 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
18293 HDA_AMP_MUTE, bits);
18294 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
18295 HDA_AMP_MUTE, bits);
18296 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
18297 HDA_AMP_MUTE, bits);
18298 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
18299 HDA_AMP_MUTE, bits);
18300}
18301
18302static void alc662_f5z_speaker_automute(struct hda_codec *codec)
18303{
18304 unsigned int present;
18305 unsigned char bits;
18306
18307 present = snd_hda_jack_detect(codec, 0x1b);
18308 bits = present ? 0 : PIN_OUT;
18309 snd_hda_codec_write(codec, 0x14, 0,
18310 AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
18311}
18312
18313static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
18314{
18315 unsigned int present1, present2;
18316
18317 present1 = snd_hda_jack_detect(codec, 0x21);
18318 present2 = snd_hda_jack_detect(codec, 0x15);
18319
18320 if (present1 || present2) {
18321 snd_hda_codec_write_cache(codec, 0x14, 0,
18322 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
18323 } else {
18324 snd_hda_codec_write_cache(codec, 0x14, 0,
18325 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
18326 }
18327}
18328
18329static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
18330{
18331 unsigned int present1, present2;
18332
18333 present1 = snd_hda_jack_detect(codec, 0x1b);
18334 present2 = snd_hda_jack_detect(codec, 0x15);
18335
18336 if (present1 || present2) {
18337 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
18338 HDA_AMP_MUTE, HDA_AMP_MUTE);
18339 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
18340 HDA_AMP_MUTE, HDA_AMP_MUTE);
18341 } else {
18342 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
18343 HDA_AMP_MUTE, 0);
18344 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
18345 HDA_AMP_MUTE, 0);
18346 }
18347}
18348
18349static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
18350{
18351 unsigned int present1, present2;
18352
18353 present1 = snd_hda_codec_read(codec, 0x1b, 0,
18354 AC_VERB_GET_PIN_SENSE, 0)
18355 & AC_PINSENSE_PRESENCE;
18356 present2 = snd_hda_codec_read(codec, 0x21, 0,
18357 AC_VERB_GET_PIN_SENSE, 0)
18358 & AC_PINSENSE_PRESENCE;
18359
18360 if (present1 || present2) {
18361 snd_hda_codec_write_cache(codec, 0x14, 0,
18362 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
18363 snd_hda_codec_write_cache(codec, 0x17, 0,
18364 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
18365 } else {
18366 snd_hda_codec_write_cache(codec, 0x14, 0,
18367 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
18368 snd_hda_codec_write_cache(codec, 0x17, 0,
18369 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
18370 }
18371}
18372
18373static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
18374{
18375 unsigned int present1, present2;
18376
18377 present1 = snd_hda_codec_read(codec, 0x21, 0,
18378 AC_VERB_GET_PIN_SENSE, 0)
18379 & AC_PINSENSE_PRESENCE;
18380 present2 = snd_hda_codec_read(codec, 0x15, 0,
18381 AC_VERB_GET_PIN_SENSE, 0)
18382 & AC_PINSENSE_PRESENCE;
18383
18384 if (present1 || present2) {
18385 snd_hda_codec_write_cache(codec, 0x14, 0,
18386 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
18387 snd_hda_codec_write_cache(codec, 0x17, 0,
18388 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
18389 } else {
18390 snd_hda_codec_write_cache(codec, 0x14, 0,
18391 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
18392 snd_hda_codec_write_cache(codec, 0x17, 0,
18393 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
18394 }
18395}
18396
18397static void alc663_m51va_unsol_event(struct hda_codec *codec,
18398 unsigned int res)
18399{
18400 switch (res >> 26) {
18401 case ALC880_HP_EVENT:
18402 alc663_m51va_speaker_automute(codec);
18403 break;
18404 case ALC880_MIC_EVENT:
18405 alc_mic_automute(codec);
18406 break;
18407 }
18408} 18227}
18409 18228
18410static void alc663_m51va_setup(struct hda_codec *codec) 18229static void alc663_m51va_setup(struct hda_codec *codec)
18411{ 18230{
18412 struct alc_spec *spec = codec->spec; 18231 struct alc_spec *spec = codec->spec;
18232 spec->autocfg.hp_pins[0] = 0x21;
18233 spec->autocfg.speaker_pins[0] = 0x14;
18234 spec->automute_mixer_nid[0] = 0x0c;
18235 spec->automute = 1;
18236 spec->automute_mode = ALC_AUTOMUTE_MIXER;
18413 spec->ext_mic.pin = 0x18; 18237 spec->ext_mic.pin = 0x18;
18414 spec->ext_mic.mux_idx = 0; 18238 spec->ext_mic.mux_idx = 0;
18415 spec->int_mic.pin = 0x12; 18239 spec->int_mic.pin = 0x12;
@@ -18417,18 +18241,15 @@ static void alc663_m51va_setup(struct hda_codec *codec)
18417 spec->auto_mic = 1; 18241 spec->auto_mic = 1;
18418} 18242}
18419 18243
18420static void alc663_m51va_inithook(struct hda_codec *codec)
18421{
18422 alc663_m51va_speaker_automute(codec);
18423 alc_mic_automute(codec);
18424}
18425
18426/* ***************** Mode1 ******************************/ 18244/* ***************** Mode1 ******************************/
18427#define alc663_mode1_unsol_event alc663_m51va_unsol_event
18428
18429static void alc663_mode1_setup(struct hda_codec *codec) 18245static void alc663_mode1_setup(struct hda_codec *codec)
18430{ 18246{
18431 struct alc_spec *spec = codec->spec; 18247 struct alc_spec *spec = codec->spec;
18248 spec->autocfg.hp_pins[0] = 0x21;
18249 spec->autocfg.speaker_pins[0] = 0x14;
18250 spec->automute_mixer_nid[0] = 0x0c;
18251 spec->automute = 1;
18252 spec->automute_mode = ALC_AUTOMUTE_MIXER;
18432 spec->ext_mic.pin = 0x18; 18253 spec->ext_mic.pin = 0x18;
18433 spec->ext_mic.mux_idx = 0; 18254 spec->ext_mic.mux_idx = 0;
18434 spec->int_mic.pin = 0x19; 18255 spec->int_mic.pin = 0x19;
@@ -18436,229 +18257,144 @@ static void alc663_mode1_setup(struct hda_codec *codec)
18436 spec->auto_mic = 1; 18257 spec->auto_mic = 1;
18437} 18258}
18438 18259
18439#define alc663_mode1_inithook alc663_m51va_inithook
18440
18441/* ***************** Mode2 ******************************/ 18260/* ***************** Mode2 ******************************/
18442static void alc662_mode2_unsol_event(struct hda_codec *codec, 18261static void alc662_mode2_setup(struct hda_codec *codec)
18443 unsigned int res)
18444{ 18262{
18445 switch (res >> 26) { 18263 struct alc_spec *spec = codec->spec;
18446 case ALC880_HP_EVENT: 18264 spec->autocfg.hp_pins[0] = 0x1b;
18447 alc662_f5z_speaker_automute(codec); 18265 spec->autocfg.speaker_pins[0] = 0x14;
18448 break; 18266 spec->automute = 1;
18449 case ALC880_MIC_EVENT: 18267 spec->automute_mode = ALC_AUTOMUTE_PIN;
18450 alc_mic_automute(codec); 18268 spec->ext_mic.pin = 0x18;
18451 break; 18269 spec->ext_mic.mux_idx = 0;
18452 } 18270 spec->int_mic.pin = 0x19;
18271 spec->int_mic.mux_idx = 1;
18272 spec->auto_mic = 1;
18453} 18273}
18454 18274
18455#define alc662_mode2_setup alc663_mode1_setup
18456
18457static void alc662_mode2_inithook(struct hda_codec *codec)
18458{
18459 alc662_f5z_speaker_automute(codec);
18460 alc_mic_automute(codec);
18461}
18462/* ***************** Mode3 ******************************/ 18275/* ***************** Mode3 ******************************/
18463static void alc663_mode3_unsol_event(struct hda_codec *codec, 18276static void alc663_mode3_setup(struct hda_codec *codec)
18464 unsigned int res)
18465{ 18277{
18466 switch (res >> 26) { 18278 struct alc_spec *spec = codec->spec;
18467 case ALC880_HP_EVENT: 18279 spec->autocfg.hp_pins[0] = 0x21;
18468 alc663_two_hp_m1_speaker_automute(codec); 18280 spec->autocfg.hp_pins[0] = 0x15;
18469 break; 18281 spec->autocfg.speaker_pins[0] = 0x14;
18470 case ALC880_MIC_EVENT: 18282 spec->automute = 1;
18471 alc_mic_automute(codec); 18283 spec->automute_mode = ALC_AUTOMUTE_PIN;
18472 break; 18284 spec->ext_mic.pin = 0x18;
18473 } 18285 spec->ext_mic.mux_idx = 0;
18286 spec->int_mic.pin = 0x19;
18287 spec->int_mic.mux_idx = 1;
18288 spec->auto_mic = 1;
18474} 18289}
18475 18290
18476#define alc663_mode3_setup alc663_mode1_setup
18477
18478static void alc663_mode3_inithook(struct hda_codec *codec)
18479{
18480 alc663_two_hp_m1_speaker_automute(codec);
18481 alc_mic_automute(codec);
18482}
18483/* ***************** Mode4 ******************************/ 18291/* ***************** Mode4 ******************************/
18484static void alc663_mode4_unsol_event(struct hda_codec *codec, 18292static void alc663_mode4_setup(struct hda_codec *codec)
18485 unsigned int res)
18486{ 18293{
18487 switch (res >> 26) { 18294 struct alc_spec *spec = codec->spec;
18488 case ALC880_HP_EVENT: 18295 spec->autocfg.hp_pins[0] = 0x21;
18489 alc663_21jd_two_speaker_automute(codec); 18296 spec->autocfg.speaker_pins[0] = 0x14;
18490 break; 18297 spec->autocfg.speaker_pins[1] = 0x16;
18491 case ALC880_MIC_EVENT: 18298 spec->automute_mixer_nid[0] = 0x0c;
18492 alc_mic_automute(codec); 18299 spec->automute_mixer_nid[1] = 0x0e;
18493 break; 18300 spec->automute = 1;
18494 } 18301 spec->automute_mode = ALC_AUTOMUTE_MIXER;
18302 spec->ext_mic.pin = 0x18;
18303 spec->ext_mic.mux_idx = 0;
18304 spec->int_mic.pin = 0x19;
18305 spec->int_mic.mux_idx = 1;
18306 spec->auto_mic = 1;
18495} 18307}
18496 18308
18497#define alc663_mode4_setup alc663_mode1_setup
18498
18499static void alc663_mode4_inithook(struct hda_codec *codec)
18500{
18501 alc663_21jd_two_speaker_automute(codec);
18502 alc_mic_automute(codec);
18503}
18504/* ***************** Mode5 ******************************/ 18309/* ***************** Mode5 ******************************/
18505static void alc663_mode5_unsol_event(struct hda_codec *codec, 18310static void alc663_mode5_setup(struct hda_codec *codec)
18506 unsigned int res)
18507{ 18311{
18508 switch (res >> 26) { 18312 struct alc_spec *spec = codec->spec;
18509 case ALC880_HP_EVENT: 18313 spec->autocfg.hp_pins[0] = 0x15;
18510 alc663_15jd_two_speaker_automute(codec); 18314 spec->autocfg.speaker_pins[0] = 0x14;
18511 break; 18315 spec->autocfg.speaker_pins[1] = 0x16;
18512 case ALC880_MIC_EVENT: 18316 spec->automute_mixer_nid[0] = 0x0c;
18513 alc_mic_automute(codec); 18317 spec->automute_mixer_nid[1] = 0x0e;
18514 break; 18318 spec->automute = 1;
18515 } 18319 spec->automute_mode = ALC_AUTOMUTE_MIXER;
18320 spec->ext_mic.pin = 0x18;
18321 spec->ext_mic.mux_idx = 0;
18322 spec->int_mic.pin = 0x19;
18323 spec->int_mic.mux_idx = 1;
18324 spec->auto_mic = 1;
18516} 18325}
18517 18326
18518#define alc663_mode5_setup alc663_mode1_setup
18519
18520static void alc663_mode5_inithook(struct hda_codec *codec)
18521{
18522 alc663_15jd_two_speaker_automute(codec);
18523 alc_mic_automute(codec);
18524}
18525/* ***************** Mode6 ******************************/ 18327/* ***************** Mode6 ******************************/
18526static void alc663_mode6_unsol_event(struct hda_codec *codec, 18328static void alc663_mode6_setup(struct hda_codec *codec)
18527 unsigned int res)
18528{ 18329{
18529 switch (res >> 26) { 18330 struct alc_spec *spec = codec->spec;
18530 case ALC880_HP_EVENT: 18331 spec->autocfg.hp_pins[0] = 0x1b;
18531 alc663_two_hp_m2_speaker_automute(codec); 18332 spec->autocfg.hp_pins[0] = 0x15;
18532 break; 18333 spec->autocfg.speaker_pins[0] = 0x14;
18533 case ALC880_MIC_EVENT: 18334 spec->automute_mixer_nid[0] = 0x0c;
18534 alc_mic_automute(codec); 18335 spec->automute = 1;
18535 break; 18336 spec->automute_mode = ALC_AUTOMUTE_MIXER;
18536 } 18337 spec->ext_mic.pin = 0x18;
18537} 18338 spec->ext_mic.mux_idx = 0;
18538 18339 spec->int_mic.pin = 0x19;
18539#define alc663_mode6_setup alc663_mode1_setup 18340 spec->int_mic.mux_idx = 1;
18540 18341 spec->auto_mic = 1;
18541static void alc663_mode6_inithook(struct hda_codec *codec)
18542{
18543 alc663_two_hp_m2_speaker_automute(codec);
18544 alc_mic_automute(codec);
18545} 18342}
18546 18343
18547/* ***************** Mode7 ******************************/ 18344/* ***************** Mode7 ******************************/
18548static void alc663_mode7_unsol_event(struct hda_codec *codec, 18345static void alc663_mode7_setup(struct hda_codec *codec)
18549 unsigned int res)
18550{
18551 switch (res >> 26) {
18552 case ALC880_HP_EVENT:
18553 alc663_two_hp_m7_speaker_automute(codec);
18554 break;
18555 case ALC880_MIC_EVENT:
18556 alc_mic_automute(codec);
18557 break;
18558 }
18559}
18560
18561#define alc663_mode7_setup alc663_mode1_setup
18562
18563static void alc663_mode7_inithook(struct hda_codec *codec)
18564{ 18346{
18565 alc663_two_hp_m7_speaker_automute(codec); 18347 struct alc_spec *spec = codec->spec;
18566 alc_mic_automute(codec); 18348 spec->autocfg.hp_pins[0] = 0x1b;
18349 spec->autocfg.hp_pins[0] = 0x21;
18350 spec->autocfg.speaker_pins[0] = 0x14;
18351 spec->autocfg.speaker_pins[0] = 0x17;
18352 spec->automute = 1;
18353 spec->automute_mode = ALC_AUTOMUTE_PIN;
18354 spec->ext_mic.pin = 0x18;
18355 spec->ext_mic.mux_idx = 0;
18356 spec->int_mic.pin = 0x19;
18357 spec->int_mic.mux_idx = 1;
18358 spec->auto_mic = 1;
18567} 18359}
18568 18360
18569/* ***************** Mode8 ******************************/ 18361/* ***************** Mode8 ******************************/
18570static void alc663_mode8_unsol_event(struct hda_codec *codec, 18362static void alc663_mode8_setup(struct hda_codec *codec)
18571 unsigned int res)
18572{
18573 switch (res >> 26) {
18574 case ALC880_HP_EVENT:
18575 alc663_two_hp_m8_speaker_automute(codec);
18576 break;
18577 case ALC880_MIC_EVENT:
18578 alc_mic_automute(codec);
18579 break;
18580 }
18581}
18582
18583#define alc663_mode8_setup alc663_m51va_setup
18584
18585static void alc663_mode8_inithook(struct hda_codec *codec)
18586{
18587 alc663_two_hp_m8_speaker_automute(codec);
18588 alc_mic_automute(codec);
18589}
18590
18591static void alc663_g71v_hp_automute(struct hda_codec *codec)
18592{
18593 unsigned int present;
18594 unsigned char bits;
18595
18596 present = snd_hda_jack_detect(codec, 0x21);
18597 bits = present ? HDA_AMP_MUTE : 0;
18598 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
18599 HDA_AMP_MUTE, bits);
18600 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
18601 HDA_AMP_MUTE, bits);
18602}
18603
18604static void alc663_g71v_front_automute(struct hda_codec *codec)
18605{
18606 unsigned int present;
18607 unsigned char bits;
18608
18609 present = snd_hda_jack_detect(codec, 0x15);
18610 bits = present ? HDA_AMP_MUTE : 0;
18611 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
18612 HDA_AMP_MUTE, bits);
18613}
18614
18615static void alc663_g71v_unsol_event(struct hda_codec *codec,
18616 unsigned int res)
18617{ 18363{
18618 switch (res >> 26) { 18364 struct alc_spec *spec = codec->spec;
18619 case ALC880_HP_EVENT: 18365 spec->autocfg.hp_pins[0] = 0x21;
18620 alc663_g71v_hp_automute(codec); 18366 spec->autocfg.hp_pins[1] = 0x15;
18621 break; 18367 spec->autocfg.speaker_pins[0] = 0x14;
18622 case ALC880_FRONT_EVENT: 18368 spec->autocfg.speaker_pins[0] = 0x17;
18623 alc663_g71v_front_automute(codec); 18369 spec->automute = 1;
18624 break; 18370 spec->automute_mode = ALC_AUTOMUTE_PIN;
18625 case ALC880_MIC_EVENT: 18371 spec->ext_mic.pin = 0x18;
18626 alc_mic_automute(codec); 18372 spec->ext_mic.mux_idx = 0;
18627 break; 18373 spec->int_mic.pin = 0x12;
18628 } 18374 spec->int_mic.mux_idx = 9;
18629} 18375 spec->auto_mic = 1;
18630
18631#define alc663_g71v_setup alc663_m51va_setup
18632
18633static void alc663_g71v_inithook(struct hda_codec *codec)
18634{
18635 alc663_g71v_front_automute(codec);
18636 alc663_g71v_hp_automute(codec);
18637 alc_mic_automute(codec);
18638} 18376}
18639 18377
18640static void alc663_g50v_unsol_event(struct hda_codec *codec, 18378static void alc663_g71v_setup(struct hda_codec *codec)
18641 unsigned int res)
18642{ 18379{
18643 switch (res >> 26) { 18380 struct alc_spec *spec = codec->spec;
18644 case ALC880_HP_EVENT: 18381 spec->autocfg.hp_pins[0] = 0x21;
18645 alc663_m51va_speaker_automute(codec); 18382 spec->autocfg.line_out_pins[0] = 0x15;
18646 break; 18383 spec->autocfg.speaker_pins[0] = 0x14;
18647 case ALC880_MIC_EVENT: 18384 spec->automute = 1;
18648 alc_mic_automute(codec); 18385 spec->automute_mode = ALC_AUTOMUTE_AMP;
18649 break; 18386 spec->detect_line = 1;
18650 } 18387 spec->automute_lines = 1;
18388 spec->ext_mic.pin = 0x18;
18389 spec->ext_mic.mux_idx = 0;
18390 spec->int_mic.pin = 0x12;
18391 spec->int_mic.mux_idx = 9;
18392 spec->auto_mic = 1;
18651} 18393}
18652 18394
18653#define alc663_g50v_setup alc663_m51va_setup 18395#define alc663_g50v_setup alc663_m51va_setup
18654 18396
18655static void alc663_g50v_inithook(struct hda_codec *codec) 18397static const struct snd_kcontrol_new alc662_ecs_mixer[] = {
18656{
18657 alc663_m51va_speaker_automute(codec);
18658 alc_mic_automute(codec);
18659}
18660
18661static struct snd_kcontrol_new alc662_ecs_mixer[] = {
18662 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT), 18398 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
18663 ALC262_HIPPO_MASTER_SWITCH, 18399 ALC262_HIPPO_MASTER_SWITCH,
18664 18400
@@ -18672,7 +18408,7 @@ static struct snd_kcontrol_new alc662_ecs_mixer[] = {
18672 { } /* end */ 18408 { } /* end */
18673}; 18409};
18674 18410
18675static struct snd_kcontrol_new alc272_nc10_mixer[] = { 18411static const struct snd_kcontrol_new alc272_nc10_mixer[] = {
18676 /* Master Playback automatically created from Speaker and Headphone */ 18412 /* Master Playback automatically created from Speaker and Headphone */
18677 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 18413 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
18678 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 18414 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
@@ -18707,7 +18443,7 @@ static const char * const alc662_models[ALC662_MODEL_LAST] = {
18707 [ALC662_3ST_2ch_DIG] = "3stack-dig", 18443 [ALC662_3ST_2ch_DIG] = "3stack-dig",
18708 [ALC662_3ST_6ch_DIG] = "3stack-6ch-dig", 18444 [ALC662_3ST_6ch_DIG] = "3stack-6ch-dig",
18709 [ALC662_3ST_6ch] = "3stack-6ch", 18445 [ALC662_3ST_6ch] = "3stack-6ch",
18710 [ALC662_5ST_DIG] = "6stack-dig", 18446 [ALC662_5ST_DIG] = "5stack-dig",
18711 [ALC662_LENOVO_101E] = "lenovo-101e", 18447 [ALC662_LENOVO_101E] = "lenovo-101e",
18712 [ALC662_ASUS_EEEPC_P701] = "eeepc-p701", 18448 [ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
18713 [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20", 18449 [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
@@ -18730,7 +18466,7 @@ static const char * const alc662_models[ALC662_MODEL_LAST] = {
18730 [ALC662_AUTO] = "auto", 18466 [ALC662_AUTO] = "auto",
18731}; 18467};
18732 18468
18733static struct snd_pci_quirk alc662_cfg_tbl[] = { 18469static const struct snd_pci_quirk alc662_cfg_tbl[] = {
18734 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS), 18470 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
18735 SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL), 18471 SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
18736 SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1), 18472 SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
@@ -18812,10 +18548,10 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = {
18812 {} 18548 {}
18813}; 18549};
18814 18550
18815static struct alc_config_preset alc662_presets[] = { 18551static const struct alc_config_preset alc662_presets[] = {
18816 [ALC662_3ST_2ch_DIG] = { 18552 [ALC662_3ST_2ch_DIG] = {
18817 .mixers = { alc662_3ST_2ch_mixer }, 18553 .mixers = { alc662_3ST_2ch_mixer },
18818 .init_verbs = { alc662_init_verbs }, 18554 .init_verbs = { alc662_init_verbs, alc662_eapd_init_verbs },
18819 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18555 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18820 .dac_nids = alc662_dac_nids, 18556 .dac_nids = alc662_dac_nids,
18821 .dig_out_nid = ALC662_DIGOUT_NID, 18557 .dig_out_nid = ALC662_DIGOUT_NID,
@@ -18826,7 +18562,7 @@ static struct alc_config_preset alc662_presets[] = {
18826 }, 18562 },
18827 [ALC662_3ST_6ch_DIG] = { 18563 [ALC662_3ST_6ch_DIG] = {
18828 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer }, 18564 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18829 .init_verbs = { alc662_init_verbs }, 18565 .init_verbs = { alc662_init_verbs, alc662_eapd_init_verbs },
18830 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18566 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18831 .dac_nids = alc662_dac_nids, 18567 .dac_nids = alc662_dac_nids,
18832 .dig_out_nid = ALC662_DIGOUT_NID, 18568 .dig_out_nid = ALC662_DIGOUT_NID,
@@ -18838,7 +18574,7 @@ static struct alc_config_preset alc662_presets[] = {
18838 }, 18574 },
18839 [ALC662_3ST_6ch] = { 18575 [ALC662_3ST_6ch] = {
18840 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer }, 18576 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18841 .init_verbs = { alc662_init_verbs }, 18577 .init_verbs = { alc662_init_verbs, alc662_eapd_init_verbs },
18842 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18578 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18843 .dac_nids = alc662_dac_nids, 18579 .dac_nids = alc662_dac_nids,
18844 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes), 18580 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
@@ -18848,7 +18584,7 @@ static struct alc_config_preset alc662_presets[] = {
18848 }, 18584 },
18849 [ALC662_5ST_DIG] = { 18585 [ALC662_5ST_DIG] = {
18850 .mixers = { alc662_base_mixer, alc662_chmode_mixer }, 18586 .mixers = { alc662_base_mixer, alc662_chmode_mixer },
18851 .init_verbs = { alc662_init_verbs }, 18587 .init_verbs = { alc662_init_verbs, alc662_eapd_init_verbs },
18852 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18588 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18853 .dac_nids = alc662_dac_nids, 18589 .dac_nids = alc662_dac_nids,
18854 .dig_out_nid = ALC662_DIGOUT_NID, 18590 .dig_out_nid = ALC662_DIGOUT_NID,
@@ -18859,104 +18595,120 @@ static struct alc_config_preset alc662_presets[] = {
18859 }, 18595 },
18860 [ALC662_LENOVO_101E] = { 18596 [ALC662_LENOVO_101E] = {
18861 .mixers = { alc662_lenovo_101e_mixer }, 18597 .mixers = { alc662_lenovo_101e_mixer },
18862 .init_verbs = { alc662_init_verbs, alc662_sue_init_verbs }, 18598 .init_verbs = { alc662_init_verbs,
18599 alc662_eapd_init_verbs,
18600 alc662_sue_init_verbs },
18863 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18601 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18864 .dac_nids = alc662_dac_nids, 18602 .dac_nids = alc662_dac_nids,
18865 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18603 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18866 .channel_mode = alc662_3ST_2ch_modes, 18604 .channel_mode = alc662_3ST_2ch_modes,
18867 .input_mux = &alc662_lenovo_101e_capture_source, 18605 .input_mux = &alc662_lenovo_101e_capture_source,
18868 .unsol_event = alc662_lenovo_101e_unsol_event, 18606 .unsol_event = alc_sku_unsol_event,
18869 .init_hook = alc662_lenovo_101e_all_automute, 18607 .setup = alc662_lenovo_101e_setup,
18608 .init_hook = alc_inithook,
18870 }, 18609 },
18871 [ALC662_ASUS_EEEPC_P701] = { 18610 [ALC662_ASUS_EEEPC_P701] = {
18872 .mixers = { alc662_eeepc_p701_mixer }, 18611 .mixers = { alc662_eeepc_p701_mixer },
18873 .init_verbs = { alc662_init_verbs, 18612 .init_verbs = { alc662_init_verbs,
18613 alc662_eapd_init_verbs,
18874 alc662_eeepc_sue_init_verbs }, 18614 alc662_eeepc_sue_init_verbs },
18875 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18615 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18876 .dac_nids = alc662_dac_nids, 18616 .dac_nids = alc662_dac_nids,
18877 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18617 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18878 .channel_mode = alc662_3ST_2ch_modes, 18618 .channel_mode = alc662_3ST_2ch_modes,
18879 .unsol_event = alc662_eeepc_unsol_event, 18619 .unsol_event = alc_sku_unsol_event,
18880 .setup = alc662_eeepc_setup, 18620 .setup = alc662_eeepc_setup,
18881 .init_hook = alc662_eeepc_inithook, 18621 .init_hook = alc_inithook,
18882 }, 18622 },
18883 [ALC662_ASUS_EEEPC_EP20] = { 18623 [ALC662_ASUS_EEEPC_EP20] = {
18884 .mixers = { alc662_eeepc_ep20_mixer, 18624 .mixers = { alc662_eeepc_ep20_mixer,
18885 alc662_chmode_mixer }, 18625 alc662_chmode_mixer },
18886 .init_verbs = { alc662_init_verbs, 18626 .init_verbs = { alc662_init_verbs,
18627 alc662_eapd_init_verbs,
18887 alc662_eeepc_ep20_sue_init_verbs }, 18628 alc662_eeepc_ep20_sue_init_verbs },
18888 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18629 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18889 .dac_nids = alc662_dac_nids, 18630 .dac_nids = alc662_dac_nids,
18890 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes), 18631 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18891 .channel_mode = alc662_3ST_6ch_modes, 18632 .channel_mode = alc662_3ST_6ch_modes,
18892 .input_mux = &alc662_lenovo_101e_capture_source, 18633 .input_mux = &alc662_lenovo_101e_capture_source,
18893 .unsol_event = alc662_eeepc_unsol_event, 18634 .unsol_event = alc_sku_unsol_event,
18894 .setup = alc662_eeepc_ep20_setup, 18635 .setup = alc662_eeepc_ep20_setup,
18895 .init_hook = alc662_eeepc_ep20_inithook, 18636 .init_hook = alc_inithook,
18896 }, 18637 },
18897 [ALC662_ECS] = { 18638 [ALC662_ECS] = {
18898 .mixers = { alc662_ecs_mixer }, 18639 .mixers = { alc662_ecs_mixer },
18899 .init_verbs = { alc662_init_verbs, 18640 .init_verbs = { alc662_init_verbs,
18641 alc662_eapd_init_verbs,
18900 alc662_ecs_init_verbs }, 18642 alc662_ecs_init_verbs },
18901 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18643 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18902 .dac_nids = alc662_dac_nids, 18644 .dac_nids = alc662_dac_nids,
18903 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18645 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18904 .channel_mode = alc662_3ST_2ch_modes, 18646 .channel_mode = alc662_3ST_2ch_modes,
18905 .unsol_event = alc662_eeepc_unsol_event, 18647 .unsol_event = alc_sku_unsol_event,
18906 .setup = alc662_eeepc_setup, 18648 .setup = alc662_eeepc_setup,
18907 .init_hook = alc662_eeepc_inithook, 18649 .init_hook = alc_inithook,
18908 }, 18650 },
18909 [ALC663_ASUS_M51VA] = { 18651 [ALC663_ASUS_M51VA] = {
18910 .mixers = { alc663_m51va_mixer }, 18652 .mixers = { alc663_m51va_mixer },
18911 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs }, 18653 .init_verbs = { alc662_init_verbs,
18654 alc662_eapd_init_verbs,
18655 alc663_m51va_init_verbs },
18912 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18656 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18913 .dac_nids = alc662_dac_nids, 18657 .dac_nids = alc662_dac_nids,
18914 .dig_out_nid = ALC662_DIGOUT_NID, 18658 .dig_out_nid = ALC662_DIGOUT_NID,
18915 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18659 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18916 .channel_mode = alc662_3ST_2ch_modes, 18660 .channel_mode = alc662_3ST_2ch_modes,
18917 .unsol_event = alc663_m51va_unsol_event, 18661 .unsol_event = alc_sku_unsol_event,
18918 .setup = alc663_m51va_setup, 18662 .setup = alc663_m51va_setup,
18919 .init_hook = alc663_m51va_inithook, 18663 .init_hook = alc_inithook,
18920 }, 18664 },
18921 [ALC663_ASUS_G71V] = { 18665 [ALC663_ASUS_G71V] = {
18922 .mixers = { alc663_g71v_mixer }, 18666 .mixers = { alc663_g71v_mixer },
18923 .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs }, 18667 .init_verbs = { alc662_init_verbs,
18668 alc662_eapd_init_verbs,
18669 alc663_g71v_init_verbs },
18924 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18670 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18925 .dac_nids = alc662_dac_nids, 18671 .dac_nids = alc662_dac_nids,
18926 .dig_out_nid = ALC662_DIGOUT_NID, 18672 .dig_out_nid = ALC662_DIGOUT_NID,
18927 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18673 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18928 .channel_mode = alc662_3ST_2ch_modes, 18674 .channel_mode = alc662_3ST_2ch_modes,
18929 .unsol_event = alc663_g71v_unsol_event, 18675 .unsol_event = alc_sku_unsol_event,
18930 .setup = alc663_g71v_setup, 18676 .setup = alc663_g71v_setup,
18931 .init_hook = alc663_g71v_inithook, 18677 .init_hook = alc_inithook,
18932 }, 18678 },
18933 [ALC663_ASUS_H13] = { 18679 [ALC663_ASUS_H13] = {
18934 .mixers = { alc663_m51va_mixer }, 18680 .mixers = { alc663_m51va_mixer },
18935 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs }, 18681 .init_verbs = { alc662_init_verbs,
18682 alc662_eapd_init_verbs,
18683 alc663_m51va_init_verbs },
18936 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18684 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18937 .dac_nids = alc662_dac_nids, 18685 .dac_nids = alc662_dac_nids,
18938 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18686 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18939 .channel_mode = alc662_3ST_2ch_modes, 18687 .channel_mode = alc662_3ST_2ch_modes,
18940 .unsol_event = alc663_m51va_unsol_event, 18688 .setup = alc663_m51va_setup,
18941 .init_hook = alc663_m51va_inithook, 18689 .unsol_event = alc_sku_unsol_event,
18690 .init_hook = alc_inithook,
18942 }, 18691 },
18943 [ALC663_ASUS_G50V] = { 18692 [ALC663_ASUS_G50V] = {
18944 .mixers = { alc663_g50v_mixer }, 18693 .mixers = { alc663_g50v_mixer },
18945 .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs }, 18694 .init_verbs = { alc662_init_verbs,
18695 alc662_eapd_init_verbs,
18696 alc663_g50v_init_verbs },
18946 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18697 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18947 .dac_nids = alc662_dac_nids, 18698 .dac_nids = alc662_dac_nids,
18948 .dig_out_nid = ALC662_DIGOUT_NID, 18699 .dig_out_nid = ALC662_DIGOUT_NID,
18949 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes), 18700 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18950 .channel_mode = alc662_3ST_6ch_modes, 18701 .channel_mode = alc662_3ST_6ch_modes,
18951 .input_mux = &alc663_capture_source, 18702 .input_mux = &alc663_capture_source,
18952 .unsol_event = alc663_g50v_unsol_event, 18703 .unsol_event = alc_sku_unsol_event,
18953 .setup = alc663_g50v_setup, 18704 .setup = alc663_g50v_setup,
18954 .init_hook = alc663_g50v_inithook, 18705 .init_hook = alc_inithook,
18955 }, 18706 },
18956 [ALC663_ASUS_MODE1] = { 18707 [ALC663_ASUS_MODE1] = {
18957 .mixers = { alc663_m51va_mixer }, 18708 .mixers = { alc663_m51va_mixer },
18958 .cap_mixer = alc662_auto_capture_mixer, 18709 .cap_mixer = alc662_auto_capture_mixer,
18959 .init_verbs = { alc662_init_verbs, 18710 .init_verbs = { alc662_init_verbs,
18711 alc662_eapd_init_verbs,
18960 alc663_21jd_amic_init_verbs }, 18712 alc663_21jd_amic_init_verbs },
18961 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18713 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18962 .hp_nid = 0x03, 18714 .hp_nid = 0x03,
@@ -18964,28 +18716,30 @@ static struct alc_config_preset alc662_presets[] = {
18964 .dig_out_nid = ALC662_DIGOUT_NID, 18716 .dig_out_nid = ALC662_DIGOUT_NID,
18965 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18717 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18966 .channel_mode = alc662_3ST_2ch_modes, 18718 .channel_mode = alc662_3ST_2ch_modes,
18967 .unsol_event = alc663_mode1_unsol_event, 18719 .unsol_event = alc_sku_unsol_event,
18968 .setup = alc663_mode1_setup, 18720 .setup = alc663_mode1_setup,
18969 .init_hook = alc663_mode1_inithook, 18721 .init_hook = alc_inithook,
18970 }, 18722 },
18971 [ALC662_ASUS_MODE2] = { 18723 [ALC662_ASUS_MODE2] = {
18972 .mixers = { alc662_1bjd_mixer }, 18724 .mixers = { alc662_1bjd_mixer },
18973 .cap_mixer = alc662_auto_capture_mixer, 18725 .cap_mixer = alc662_auto_capture_mixer,
18974 .init_verbs = { alc662_init_verbs, 18726 .init_verbs = { alc662_init_verbs,
18727 alc662_eapd_init_verbs,
18975 alc662_1bjd_amic_init_verbs }, 18728 alc662_1bjd_amic_init_verbs },
18976 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18729 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18977 .dac_nids = alc662_dac_nids, 18730 .dac_nids = alc662_dac_nids,
18978 .dig_out_nid = ALC662_DIGOUT_NID, 18731 .dig_out_nid = ALC662_DIGOUT_NID,
18979 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18732 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18980 .channel_mode = alc662_3ST_2ch_modes, 18733 .channel_mode = alc662_3ST_2ch_modes,
18981 .unsol_event = alc662_mode2_unsol_event, 18734 .unsol_event = alc_sku_unsol_event,
18982 .setup = alc662_mode2_setup, 18735 .setup = alc662_mode2_setup,
18983 .init_hook = alc662_mode2_inithook, 18736 .init_hook = alc_inithook,
18984 }, 18737 },
18985 [ALC663_ASUS_MODE3] = { 18738 [ALC663_ASUS_MODE3] = {
18986 .mixers = { alc663_two_hp_m1_mixer }, 18739 .mixers = { alc663_two_hp_m1_mixer },
18987 .cap_mixer = alc662_auto_capture_mixer, 18740 .cap_mixer = alc662_auto_capture_mixer,
18988 .init_verbs = { alc662_init_verbs, 18741 .init_verbs = { alc662_init_verbs,
18742 alc662_eapd_init_verbs,
18989 alc663_two_hp_amic_m1_init_verbs }, 18743 alc663_two_hp_amic_m1_init_verbs },
18990 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18744 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18991 .hp_nid = 0x03, 18745 .hp_nid = 0x03,
@@ -18993,14 +18747,15 @@ static struct alc_config_preset alc662_presets[] = {
18993 .dig_out_nid = ALC662_DIGOUT_NID, 18747 .dig_out_nid = ALC662_DIGOUT_NID,
18994 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18748 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18995 .channel_mode = alc662_3ST_2ch_modes, 18749 .channel_mode = alc662_3ST_2ch_modes,
18996 .unsol_event = alc663_mode3_unsol_event, 18750 .unsol_event = alc_sku_unsol_event,
18997 .setup = alc663_mode3_setup, 18751 .setup = alc663_mode3_setup,
18998 .init_hook = alc663_mode3_inithook, 18752 .init_hook = alc_inithook,
18999 }, 18753 },
19000 [ALC663_ASUS_MODE4] = { 18754 [ALC663_ASUS_MODE4] = {
19001 .mixers = { alc663_asus_21jd_clfe_mixer }, 18755 .mixers = { alc663_asus_21jd_clfe_mixer },
19002 .cap_mixer = alc662_auto_capture_mixer, 18756 .cap_mixer = alc662_auto_capture_mixer,
19003 .init_verbs = { alc662_init_verbs, 18757 .init_verbs = { alc662_init_verbs,
18758 alc662_eapd_init_verbs,
19004 alc663_21jd_amic_init_verbs}, 18759 alc663_21jd_amic_init_verbs},
19005 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18760 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
19006 .hp_nid = 0x03, 18761 .hp_nid = 0x03,
@@ -19008,14 +18763,15 @@ static struct alc_config_preset alc662_presets[] = {
19008 .dig_out_nid = ALC662_DIGOUT_NID, 18763 .dig_out_nid = ALC662_DIGOUT_NID,
19009 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18764 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19010 .channel_mode = alc662_3ST_2ch_modes, 18765 .channel_mode = alc662_3ST_2ch_modes,
19011 .unsol_event = alc663_mode4_unsol_event, 18766 .unsol_event = alc_sku_unsol_event,
19012 .setup = alc663_mode4_setup, 18767 .setup = alc663_mode4_setup,
19013 .init_hook = alc663_mode4_inithook, 18768 .init_hook = alc_inithook,
19014 }, 18769 },
19015 [ALC663_ASUS_MODE5] = { 18770 [ALC663_ASUS_MODE5] = {
19016 .mixers = { alc663_asus_15jd_clfe_mixer }, 18771 .mixers = { alc663_asus_15jd_clfe_mixer },
19017 .cap_mixer = alc662_auto_capture_mixer, 18772 .cap_mixer = alc662_auto_capture_mixer,
19018 .init_verbs = { alc662_init_verbs, 18773 .init_verbs = { alc662_init_verbs,
18774 alc662_eapd_init_verbs,
19019 alc663_15jd_amic_init_verbs }, 18775 alc663_15jd_amic_init_verbs },
19020 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18776 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
19021 .hp_nid = 0x03, 18777 .hp_nid = 0x03,
@@ -19023,14 +18779,15 @@ static struct alc_config_preset alc662_presets[] = {
19023 .dig_out_nid = ALC662_DIGOUT_NID, 18779 .dig_out_nid = ALC662_DIGOUT_NID,
19024 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18780 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19025 .channel_mode = alc662_3ST_2ch_modes, 18781 .channel_mode = alc662_3ST_2ch_modes,
19026 .unsol_event = alc663_mode5_unsol_event, 18782 .unsol_event = alc_sku_unsol_event,
19027 .setup = alc663_mode5_setup, 18783 .setup = alc663_mode5_setup,
19028 .init_hook = alc663_mode5_inithook, 18784 .init_hook = alc_inithook,
19029 }, 18785 },
19030 [ALC663_ASUS_MODE6] = { 18786 [ALC663_ASUS_MODE6] = {
19031 .mixers = { alc663_two_hp_m2_mixer }, 18787 .mixers = { alc663_two_hp_m2_mixer },
19032 .cap_mixer = alc662_auto_capture_mixer, 18788 .cap_mixer = alc662_auto_capture_mixer,
19033 .init_verbs = { alc662_init_verbs, 18789 .init_verbs = { alc662_init_verbs,
18790 alc662_eapd_init_verbs,
19034 alc663_two_hp_amic_m2_init_verbs }, 18791 alc663_two_hp_amic_m2_init_verbs },
19035 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18792 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
19036 .hp_nid = 0x03, 18793 .hp_nid = 0x03,
@@ -19038,14 +18795,15 @@ static struct alc_config_preset alc662_presets[] = {
19038 .dig_out_nid = ALC662_DIGOUT_NID, 18795 .dig_out_nid = ALC662_DIGOUT_NID,
19039 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18796 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19040 .channel_mode = alc662_3ST_2ch_modes, 18797 .channel_mode = alc662_3ST_2ch_modes,
19041 .unsol_event = alc663_mode6_unsol_event, 18798 .unsol_event = alc_sku_unsol_event,
19042 .setup = alc663_mode6_setup, 18799 .setup = alc663_mode6_setup,
19043 .init_hook = alc663_mode6_inithook, 18800 .init_hook = alc_inithook,
19044 }, 18801 },
19045 [ALC663_ASUS_MODE7] = { 18802 [ALC663_ASUS_MODE7] = {
19046 .mixers = { alc663_mode7_mixer }, 18803 .mixers = { alc663_mode7_mixer },
19047 .cap_mixer = alc662_auto_capture_mixer, 18804 .cap_mixer = alc662_auto_capture_mixer,
19048 .init_verbs = { alc662_init_verbs, 18805 .init_verbs = { alc662_init_verbs,
18806 alc662_eapd_init_verbs,
19049 alc663_mode7_init_verbs }, 18807 alc663_mode7_init_verbs },
19050 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18808 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
19051 .hp_nid = 0x03, 18809 .hp_nid = 0x03,
@@ -19053,14 +18811,15 @@ static struct alc_config_preset alc662_presets[] = {
19053 .dig_out_nid = ALC662_DIGOUT_NID, 18811 .dig_out_nid = ALC662_DIGOUT_NID,
19054 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18812 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19055 .channel_mode = alc662_3ST_2ch_modes, 18813 .channel_mode = alc662_3ST_2ch_modes,
19056 .unsol_event = alc663_mode7_unsol_event, 18814 .unsol_event = alc_sku_unsol_event,
19057 .setup = alc663_mode7_setup, 18815 .setup = alc663_mode7_setup,
19058 .init_hook = alc663_mode7_inithook, 18816 .init_hook = alc_inithook,
19059 }, 18817 },
19060 [ALC663_ASUS_MODE8] = { 18818 [ALC663_ASUS_MODE8] = {
19061 .mixers = { alc663_mode8_mixer }, 18819 .mixers = { alc663_mode8_mixer },
19062 .cap_mixer = alc662_auto_capture_mixer, 18820 .cap_mixer = alc662_auto_capture_mixer,
19063 .init_verbs = { alc662_init_verbs, 18821 .init_verbs = { alc662_init_verbs,
18822 alc662_eapd_init_verbs,
19064 alc663_mode8_init_verbs }, 18823 alc663_mode8_init_verbs },
19065 .num_dacs = ARRAY_SIZE(alc662_dac_nids), 18824 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
19066 .hp_nid = 0x03, 18825 .hp_nid = 0x03,
@@ -19068,52 +18827,57 @@ static struct alc_config_preset alc662_presets[] = {
19068 .dig_out_nid = ALC662_DIGOUT_NID, 18827 .dig_out_nid = ALC662_DIGOUT_NID,
19069 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18828 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19070 .channel_mode = alc662_3ST_2ch_modes, 18829 .channel_mode = alc662_3ST_2ch_modes,
19071 .unsol_event = alc663_mode8_unsol_event, 18830 .unsol_event = alc_sku_unsol_event,
19072 .setup = alc663_mode8_setup, 18831 .setup = alc663_mode8_setup,
19073 .init_hook = alc663_mode8_inithook, 18832 .init_hook = alc_inithook,
19074 }, 18833 },
19075 [ALC272_DELL] = { 18834 [ALC272_DELL] = {
19076 .mixers = { alc663_m51va_mixer }, 18835 .mixers = { alc663_m51va_mixer },
19077 .cap_mixer = alc272_auto_capture_mixer, 18836 .cap_mixer = alc272_auto_capture_mixer,
19078 .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs }, 18837 .init_verbs = { alc662_init_verbs,
18838 alc662_eapd_init_verbs,
18839 alc272_dell_init_verbs },
19079 .num_dacs = ARRAY_SIZE(alc272_dac_nids), 18840 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
19080 .dac_nids = alc662_dac_nids, 18841 .dac_nids = alc272_dac_nids,
19081 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18842 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19082 .adc_nids = alc272_adc_nids, 18843 .adc_nids = alc272_adc_nids,
19083 .num_adc_nids = ARRAY_SIZE(alc272_adc_nids), 18844 .num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
19084 .capsrc_nids = alc272_capsrc_nids, 18845 .capsrc_nids = alc272_capsrc_nids,
19085 .channel_mode = alc662_3ST_2ch_modes, 18846 .channel_mode = alc662_3ST_2ch_modes,
19086 .unsol_event = alc663_m51va_unsol_event, 18847 .unsol_event = alc_sku_unsol_event,
19087 .setup = alc663_m51va_setup, 18848 .setup = alc663_m51va_setup,
19088 .init_hook = alc663_m51va_inithook, 18849 .init_hook = alc_inithook,
19089 }, 18850 },
19090 [ALC272_DELL_ZM1] = { 18851 [ALC272_DELL_ZM1] = {
19091 .mixers = { alc663_m51va_mixer }, 18852 .mixers = { alc663_m51va_mixer },
19092 .cap_mixer = alc662_auto_capture_mixer, 18853 .cap_mixer = alc662_auto_capture_mixer,
19093 .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs }, 18854 .init_verbs = { alc662_init_verbs,
18855 alc662_eapd_init_verbs,
18856 alc272_dell_zm1_init_verbs },
19094 .num_dacs = ARRAY_SIZE(alc272_dac_nids), 18857 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
19095 .dac_nids = alc662_dac_nids, 18858 .dac_nids = alc272_dac_nids,
19096 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18859 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19097 .adc_nids = alc662_adc_nids, 18860 .adc_nids = alc662_adc_nids,
19098 .num_adc_nids = 1, 18861 .num_adc_nids = 1,
19099 .capsrc_nids = alc662_capsrc_nids, 18862 .capsrc_nids = alc662_capsrc_nids,
19100 .channel_mode = alc662_3ST_2ch_modes, 18863 .channel_mode = alc662_3ST_2ch_modes,
19101 .unsol_event = alc663_m51va_unsol_event, 18864 .unsol_event = alc_sku_unsol_event,
19102 .setup = alc663_m51va_setup, 18865 .setup = alc663_m51va_setup,
19103 .init_hook = alc663_m51va_inithook, 18866 .init_hook = alc_inithook,
19104 }, 18867 },
19105 [ALC272_SAMSUNG_NC10] = { 18868 [ALC272_SAMSUNG_NC10] = {
19106 .mixers = { alc272_nc10_mixer }, 18869 .mixers = { alc272_nc10_mixer },
19107 .init_verbs = { alc662_init_verbs, 18870 .init_verbs = { alc662_init_verbs,
18871 alc662_eapd_init_verbs,
19108 alc663_21jd_amic_init_verbs }, 18872 alc663_21jd_amic_init_verbs },
19109 .num_dacs = ARRAY_SIZE(alc272_dac_nids), 18873 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
19110 .dac_nids = alc272_dac_nids, 18874 .dac_nids = alc272_dac_nids,
19111 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 18875 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19112 .channel_mode = alc662_3ST_2ch_modes, 18876 .channel_mode = alc662_3ST_2ch_modes,
19113 /*.input_mux = &alc272_nc10_capture_source,*/ 18877 /*.input_mux = &alc272_nc10_capture_source,*/
19114 .unsol_event = alc663_mode4_unsol_event, 18878 .unsol_event = alc_sku_unsol_event,
19115 .setup = alc663_mode4_setup, 18879 .setup = alc663_mode4_setup,
19116 .init_hook = alc663_mode4_inithook, 18880 .init_hook = alc_inithook,
19117 }, 18881 },
19118}; 18882};
19119 18883
@@ -19123,45 +18887,79 @@ static struct alc_config_preset alc662_presets[] = {
19123 */ 18887 */
19124 18888
19125/* convert from MIX nid to DAC */ 18889/* convert from MIX nid to DAC */
19126static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid) 18890static hda_nid_t alc_auto_mix_to_dac(struct hda_codec *codec, hda_nid_t nid)
19127{ 18891{
19128 if (nid == 0x0f) 18892 hda_nid_t list[5];
19129 return 0x02; 18893 int i, num;
19130 else if (nid >= 0x0c && nid <= 0x0e) 18894
19131 return nid - 0x0c + 0x02; 18895 num = snd_hda_get_connections(codec, nid, list, ARRAY_SIZE(list));
19132 else if (nid == 0x26) /* ALC887-VD has this DAC too */ 18896 for (i = 0; i < num; i++) {
19133 return 0x25; 18897 if (get_wcaps_type(get_wcaps(codec, list[i])) == AC_WID_AUD_OUT)
19134 else 18898 return list[i];
19135 return 0; 18899 }
18900 return 0;
18901}
18902
18903/* go down to the selector widget before the mixer */
18904static hda_nid_t alc_go_down_to_selector(struct hda_codec *codec, hda_nid_t pin)
18905{
18906 hda_nid_t srcs[5];
18907 int num = snd_hda_get_connections(codec, pin, srcs,
18908 ARRAY_SIZE(srcs));
18909 if (num != 1 ||
18910 get_wcaps_type(get_wcaps(codec, srcs[0])) != AC_WID_AUD_SEL)
18911 return pin;
18912 return srcs[0];
19136} 18913}
19137 18914
19138/* get MIX nid connected to the given pin targeted to DAC */ 18915/* get MIX nid connected to the given pin targeted to DAC */
19139static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin, 18916static hda_nid_t alc_auto_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
19140 hda_nid_t dac) 18917 hda_nid_t dac)
19141{ 18918{
19142 hda_nid_t mix[5]; 18919 hda_nid_t mix[5];
19143 int i, num; 18920 int i, num;
19144 18921
18922 pin = alc_go_down_to_selector(codec, pin);
19145 num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix)); 18923 num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
19146 for (i = 0; i < num; i++) { 18924 for (i = 0; i < num; i++) {
19147 if (alc662_mix_to_dac(mix[i]) == dac) 18925 if (alc_auto_mix_to_dac(codec, mix[i]) == dac)
19148 return mix[i]; 18926 return mix[i];
19149 } 18927 }
19150 return 0; 18928 return 0;
19151} 18929}
19152 18930
18931/* select the connection from pin to DAC if needed */
18932static int alc_auto_select_dac(struct hda_codec *codec, hda_nid_t pin,
18933 hda_nid_t dac)
18934{
18935 hda_nid_t mix[5];
18936 int i, num;
18937
18938 pin = alc_go_down_to_selector(codec, pin);
18939 num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
18940 if (num < 2)
18941 return 0;
18942 for (i = 0; i < num; i++) {
18943 if (alc_auto_mix_to_dac(codec, mix[i]) == dac) {
18944 snd_hda_codec_update_cache(codec, pin, 0,
18945 AC_VERB_SET_CONNECT_SEL, i);
18946 return 0;
18947 }
18948 }
18949 return 0;
18950}
18951
19153/* look for an empty DAC slot */ 18952/* look for an empty DAC slot */
19154static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin) 18953static hda_nid_t alc_auto_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
19155{ 18954{
19156 struct alc_spec *spec = codec->spec; 18955 struct alc_spec *spec = codec->spec;
19157 hda_nid_t srcs[5]; 18956 hda_nid_t srcs[5];
19158 int i, j, num; 18957 int i, j, num;
19159 18958
18959 pin = alc_go_down_to_selector(codec, pin);
19160 num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs)); 18960 num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
19161 if (num < 0)
19162 return 0;
19163 for (i = 0; i < num; i++) { 18961 for (i = 0; i < num; i++) {
19164 hda_nid_t nid = alc662_mix_to_dac(srcs[i]); 18962 hda_nid_t nid = alc_auto_mix_to_dac(codec, srcs[i]);
19165 if (!nid) 18963 if (!nid)
19166 continue; 18964 continue;
19167 for (j = 0; j < spec->multiout.num_dacs; j++) 18965 for (j = 0; j < spec->multiout.num_dacs; j++)
@@ -19183,10 +18981,10 @@ static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
19183 18981
19184 spec->multiout.dac_nids = spec->private_dac_nids; 18982 spec->multiout.dac_nids = spec->private_dac_nids;
19185 for (i = 0; i < cfg->line_outs; i++) { 18983 for (i = 0; i < cfg->line_outs; i++) {
19186 dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]); 18984 dac = alc_auto_look_for_dac(codec, cfg->line_out_pins[i]);
19187 if (!dac) 18985 if (!dac)
19188 continue; 18986 continue;
19189 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac; 18987 spec->private_dac_nids[spec->multiout.num_dacs++] = dac;
19190 } 18988 }
19191 return 0; 18989 return 0;
19192} 18990}
@@ -19222,15 +19020,23 @@ static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
19222 static const char * const chname[4] = { 19020 static const char * const chname[4] = {
19223 "Front", "Surround", NULL /*CLFE*/, "Side" 19021 "Front", "Surround", NULL /*CLFE*/, "Side"
19224 }; 19022 };
19225 const char *pfx = alc_get_line_out_pfx(cfg, true); 19023 const char *pfx = alc_get_line_out_pfx(spec, true);
19226 hda_nid_t nid, mix; 19024 hda_nid_t nid, mix, pin;
19227 int i, err; 19025 int i, err, noutputs;
19228 19026
19229 for (i = 0; i < cfg->line_outs; i++) { 19027 noutputs = cfg->line_outs;
19028 if (spec->multi_ios > 0)
19029 noutputs += spec->multi_ios;
19030
19031 for (i = 0; i < noutputs; i++) {
19230 nid = spec->multiout.dac_nids[i]; 19032 nid = spec->multiout.dac_nids[i];
19231 if (!nid) 19033 if (!nid)
19232 continue; 19034 continue;
19233 mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid); 19035 if (i >= cfg->line_outs)
19036 pin = spec->multi_io[i - 1].pin;
19037 else
19038 pin = cfg->line_out_pins[i];
19039 mix = alc_auto_dac_to_mix(codec, pin, nid);
19234 if (!mix) 19040 if (!mix)
19235 continue; 19041 continue;
19236 if (!pfx && i == 2) { 19042 if (!pfx && i == 2) {
@@ -19276,7 +19082,7 @@ static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
19276 19082
19277 if (!pin) 19083 if (!pin)
19278 return 0; 19084 return 0;
19279 nid = alc662_look_for_dac(codec, pin); 19085 nid = alc_auto_look_for_dac(codec, pin);
19280 if (!nid) { 19086 if (!nid) {
19281 /* the corresponding DAC is already occupied */ 19087 /* the corresponding DAC is already occupied */
19282 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP)) 19088 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
@@ -19286,7 +19092,7 @@ static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
19286 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); 19092 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
19287 } 19093 }
19288 19094
19289 mix = alc662_dac_to_mix(codec, pin, nid); 19095 mix = alc_auto_dac_to_mix(codec, pin, nid);
19290 if (!mix) 19096 if (!mix)
19291 return 0; 19097 return 0;
19292 err = alc662_add_vol_ctl(spec, pfx, nid, 3); 19098 err = alc662_add_vol_ctl(spec, pfx, nid, 3);
@@ -19310,14 +19116,21 @@ static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
19310 hda_nid_t srcs[HDA_MAX_CONNECTIONS]; 19116 hda_nid_t srcs[HDA_MAX_CONNECTIONS];
19311 19117
19312 alc_set_pin_output(codec, nid, pin_type); 19118 alc_set_pin_output(codec, nid, pin_type);
19313 /* need the manual connection? */
19314 num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs)); 19119 num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
19315 if (num <= 1)
19316 return;
19317 for (i = 0; i < num; i++) { 19120 for (i = 0; i < num; i++) {
19318 if (alc662_mix_to_dac(srcs[i]) != dac) 19121 if (alc_auto_mix_to_dac(codec, srcs[i]) != dac)
19319 continue; 19122 continue;
19320 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i); 19123 /* need the manual connection? */
19124 if (num > 1)
19125 snd_hda_codec_write(codec, nid, 0,
19126 AC_VERB_SET_CONNECT_SEL, i);
19127 /* unmute mixer widget inputs */
19128 snd_hda_codec_write(codec, srcs[i], 0,
19129 AC_VERB_SET_AMP_GAIN_MUTE,
19130 AMP_IN_UNMUTE(0));
19131 snd_hda_codec_write(codec, srcs[i], 0,
19132 AC_VERB_SET_AMP_GAIN_MUTE,
19133 AMP_IN_UNMUTE(1));
19321 return; 19134 return;
19322 } 19135 }
19323} 19136}
@@ -19374,11 +19187,164 @@ static void alc662_auto_init_analog_input(struct hda_codec *codec)
19374 19187
19375#define alc662_auto_init_input_src alc882_auto_init_input_src 19188#define alc662_auto_init_input_src alc882_auto_init_input_src
19376 19189
19190/*
19191 * multi-io helper
19192 */
19193static int alc_auto_fill_multi_ios(struct hda_codec *codec,
19194 unsigned int location)
19195{
19196 struct alc_spec *spec = codec->spec;
19197 struct auto_pin_cfg *cfg = &spec->autocfg;
19198 int type, i, num_pins = 0;
19199
19200 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
19201 for (i = 0; i < cfg->num_inputs; i++) {
19202 hda_nid_t nid = cfg->inputs[i].pin;
19203 hda_nid_t dac;
19204 unsigned int defcfg, caps;
19205 if (cfg->inputs[i].type != type)
19206 continue;
19207 defcfg = snd_hda_codec_get_pincfg(codec, nid);
19208 if (get_defcfg_connect(defcfg) != AC_JACK_PORT_COMPLEX)
19209 continue;
19210 if (location && get_defcfg_location(defcfg) != location)
19211 continue;
19212 caps = snd_hda_query_pin_caps(codec, nid);
19213 if (!(caps & AC_PINCAP_OUT))
19214 continue;
19215 dac = alc_auto_look_for_dac(codec, nid);
19216 if (!dac)
19217 continue;
19218 spec->multi_io[num_pins].pin = nid;
19219 spec->multi_io[num_pins].dac = dac;
19220 num_pins++;
19221 spec->private_dac_nids[spec->multiout.num_dacs++] = dac;
19222 }
19223 }
19224 spec->multiout.num_dacs = 1;
19225 if (num_pins < 2)
19226 return 0;
19227 return num_pins;
19228}
19229
19230static int alc_auto_ch_mode_info(struct snd_kcontrol *kcontrol,
19231 struct snd_ctl_elem_info *uinfo)
19232{
19233 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
19234 struct alc_spec *spec = codec->spec;
19235
19236 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
19237 uinfo->count = 1;
19238 uinfo->value.enumerated.items = spec->multi_ios + 1;
19239 if (uinfo->value.enumerated.item > spec->multi_ios)
19240 uinfo->value.enumerated.item = spec->multi_ios;
19241 sprintf(uinfo->value.enumerated.name, "%dch",
19242 (uinfo->value.enumerated.item + 1) * 2);
19243 return 0;
19244}
19245
19246static int alc_auto_ch_mode_get(struct snd_kcontrol *kcontrol,
19247 struct snd_ctl_elem_value *ucontrol)
19248{
19249 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
19250 struct alc_spec *spec = codec->spec;
19251 ucontrol->value.enumerated.item[0] = (spec->ext_channel_count - 1) / 2;
19252 return 0;
19253}
19254
19255static int alc_set_multi_io(struct hda_codec *codec, int idx, bool output)
19256{
19257 struct alc_spec *spec = codec->spec;
19258 hda_nid_t nid = spec->multi_io[idx].pin;
19259
19260 if (!spec->multi_io[idx].ctl_in)
19261 spec->multi_io[idx].ctl_in =
19262 snd_hda_codec_read(codec, nid, 0,
19263 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
19264 if (output) {
19265 snd_hda_codec_update_cache(codec, nid, 0,
19266 AC_VERB_SET_PIN_WIDGET_CONTROL,
19267 PIN_OUT);
19268 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
19269 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
19270 HDA_AMP_MUTE, 0);
19271 alc_auto_select_dac(codec, nid, spec->multi_io[idx].dac);
19272 } else {
19273 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
19274 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
19275 HDA_AMP_MUTE, HDA_AMP_MUTE);
19276 snd_hda_codec_update_cache(codec, nid, 0,
19277 AC_VERB_SET_PIN_WIDGET_CONTROL,
19278 spec->multi_io[idx].ctl_in);
19279 }
19280 return 0;
19281}
19282
19283static int alc_auto_ch_mode_put(struct snd_kcontrol *kcontrol,
19284 struct snd_ctl_elem_value *ucontrol)
19285{
19286 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
19287 struct alc_spec *spec = codec->spec;
19288 int i, ch;
19289
19290 ch = ucontrol->value.enumerated.item[0];
19291 if (ch < 0 || ch > spec->multi_ios)
19292 return -EINVAL;
19293 if (ch == (spec->ext_channel_count - 1) / 2)
19294 return 0;
19295 spec->ext_channel_count = (ch + 1) * 2;
19296 for (i = 0; i < spec->multi_ios; i++)
19297 alc_set_multi_io(codec, i, i < ch);
19298 spec->multiout.max_channels = spec->ext_channel_count;
19299 return 1;
19300}
19301
19302static const struct snd_kcontrol_new alc_auto_channel_mode_enum = {
19303 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
19304 .name = "Channel Mode",
19305 .info = alc_auto_ch_mode_info,
19306 .get = alc_auto_ch_mode_get,
19307 .put = alc_auto_ch_mode_put,
19308};
19309
19310static int alc_auto_add_multi_channel_mode(struct hda_codec *codec)
19311{
19312 struct alc_spec *spec = codec->spec;
19313 struct auto_pin_cfg *cfg = &spec->autocfg;
19314 unsigned int location, defcfg;
19315 int num_pins;
19316
19317 if (cfg->line_outs != 1 ||
19318 cfg->line_out_type != AUTO_PIN_LINE_OUT)
19319 return 0;
19320
19321 defcfg = snd_hda_codec_get_pincfg(codec, cfg->line_out_pins[0]);
19322 location = get_defcfg_location(defcfg);
19323
19324 num_pins = alc_auto_fill_multi_ios(codec, location);
19325 if (num_pins > 0) {
19326 struct snd_kcontrol_new *knew;
19327
19328 knew = alc_kcontrol_new(spec);
19329 if (!knew)
19330 return -ENOMEM;
19331 *knew = alc_auto_channel_mode_enum;
19332 knew->name = kstrdup("Channel Mode", GFP_KERNEL);
19333 if (!knew->name)
19334 return -ENOMEM;
19335
19336 spec->multi_ios = num_pins;
19337 spec->ext_channel_count = 2;
19338 spec->multiout.num_dacs = num_pins + 1;
19339 }
19340 return 0;
19341}
19342
19377static int alc662_parse_auto_config(struct hda_codec *codec) 19343static int alc662_parse_auto_config(struct hda_codec *codec)
19378{ 19344{
19379 struct alc_spec *spec = codec->spec; 19345 struct alc_spec *spec = codec->spec;
19380 int err; 19346 int err;
19381 static hda_nid_t alc662_ignore[] = { 0x1d, 0 }; 19347 static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
19382 19348
19383 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 19349 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
19384 alc662_ignore); 19350 alc662_ignore);
@@ -19390,6 +19356,9 @@ static int alc662_parse_auto_config(struct hda_codec *codec)
19390 err = alc662_auto_fill_dac_nids(codec, &spec->autocfg); 19356 err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
19391 if (err < 0) 19357 if (err < 0)
19392 return err; 19358 return err;
19359 err = alc_auto_add_multi_channel_mode(codec);
19360 if (err < 0)
19361 return err;
19393 err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg); 19362 err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
19394 if (err < 0) 19363 if (err < 0)
19395 return err; 19364 return err;
@@ -19420,14 +19389,6 @@ static int alc662_parse_auto_config(struct hda_codec *codec)
19420 spec->num_mux_defs = 1; 19389 spec->num_mux_defs = 1;
19421 spec->input_mux = &spec->private_imux[0]; 19390 spec->input_mux = &spec->private_imux[0];
19422 19391
19423 add_verb(spec, alc662_init_verbs);
19424 if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
19425 codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
19426 add_verb(spec, alc663_init_verbs);
19427
19428 if (codec->vendor_id == 0x10ec0272)
19429 add_verb(spec, alc272_init_verbs);
19430
19431 err = alc_auto_add_mic_boost(codec); 19392 err = alc_auto_add_mic_boost(codec);
19432 if (err < 0) 19393 if (err < 0)
19433 return err; 19394 return err;
@@ -19508,7 +19469,7 @@ static const struct alc_fixup alc662_fixups[] = {
19508 }, 19469 },
19509}; 19470};
19510 19471
19511static struct snd_pci_quirk alc662_fixup_tbl[] = { 19472static const struct snd_pci_quirk alc662_fixup_tbl[] = {
19512 SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE), 19473 SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
19513 SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE), 19474 SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
19514 SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE), 19475 SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
@@ -19626,6 +19587,7 @@ static int patch_alc662(struct hda_codec *codec)
19626 codec->patch_ops = alc_patch_ops; 19587 codec->patch_ops = alc_patch_ops;
19627 if (board_config == ALC662_AUTO) 19588 if (board_config == ALC662_AUTO)
19628 spec->init_hook = alc662_auto_init; 19589 spec->init_hook = alc662_auto_init;
19590 spec->shutup = alc_eapd_shutup;
19629 19591
19630 alc_init_jacks(codec); 19592 alc_init_jacks(codec);
19631 19593
@@ -19654,6 +19616,15 @@ static int patch_alc888(struct hda_codec *codec)
19654 return patch_alc882(codec); 19616 return patch_alc882(codec);
19655} 19617}
19656 19618
19619static int patch_alc899(struct hda_codec *codec)
19620{
19621 if ((alc_read_coef_idx(codec, 0) & 0x2000) != 0x2000) {
19622 kfree(codec->chip_name);
19623 codec->chip_name = kstrdup("ALC898", GFP_KERNEL);
19624 }
19625 return patch_alc882(codec);
19626}
19627
19657/* 19628/*
19658 * ALC680 support 19629 * ALC680 support
19659 */ 19630 */
@@ -19661,12 +19632,12 @@ static int patch_alc888(struct hda_codec *codec)
19661#define ALC680_DIGOUT_NID ALC880_DIGOUT_NID 19632#define ALC680_DIGOUT_NID ALC880_DIGOUT_NID
19662#define alc680_modes alc260_modes 19633#define alc680_modes alc260_modes
19663 19634
19664static hda_nid_t alc680_dac_nids[3] = { 19635static const hda_nid_t alc680_dac_nids[3] = {
19665 /* Lout1, Lout2, hp */ 19636 /* Lout1, Lout2, hp */
19666 0x02, 0x03, 0x04 19637 0x02, 0x03, 0x04
19667}; 19638};
19668 19639
19669static hda_nid_t alc680_adc_nids[3] = { 19640static const hda_nid_t alc680_adc_nids[3] = {
19670 /* ADC0-2 */ 19641 /* ADC0-2 */
19671 /* DMIC, MIC, Line-in*/ 19642 /* DMIC, MIC, Line-in*/
19672 0x07, 0x08, 0x09 19643 0x07, 0x08, 0x09
@@ -19686,8 +19657,7 @@ static void alc680_rec_autoswitch(struct hda_codec *codec)
19686 19657
19687 for (i = 0; i < cfg->num_inputs; i++) { 19658 for (i = 0; i < cfg->num_inputs; i++) {
19688 nid = cfg->inputs[i].pin; 19659 nid = cfg->inputs[i].pin;
19689 if (!(snd_hda_query_pin_caps(codec, nid) & 19660 if (!is_jack_detectable(codec, nid))
19690 AC_PINCAP_PRES_DETECT))
19691 continue; 19661 continue;
19692 if (snd_hda_jack_detect(codec, nid)) { 19662 if (snd_hda_jack_detect(codec, nid)) {
19693 if (cfg->inputs[i].type < type_found) { 19663 if (cfg->inputs[i].type < type_found) {
@@ -19734,7 +19704,7 @@ static int alc680_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
19734 return 0; 19704 return 0;
19735} 19705}
19736 19706
19737static struct hda_pcm_stream alc680_pcm_analog_auto_capture = { 19707static const struct hda_pcm_stream alc680_pcm_analog_auto_capture = {
19738 .substreams = 1, /* can be overridden */ 19708 .substreams = 1, /* can be overridden */
19739 .channels_min = 2, 19709 .channels_min = 2,
19740 .channels_max = 2, 19710 .channels_max = 2,
@@ -19745,7 +19715,7 @@ static struct hda_pcm_stream alc680_pcm_analog_auto_capture = {
19745 }, 19715 },
19746}; 19716};
19747 19717
19748static struct snd_kcontrol_new alc680_base_mixer[] = { 19718static const struct snd_kcontrol_new alc680_base_mixer[] = {
19749 /* output mixer control */ 19719 /* output mixer control */
19750 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), 19720 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
19751 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT), 19721 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
@@ -19757,7 +19727,7 @@ static struct snd_kcontrol_new alc680_base_mixer[] = {
19757 { } 19727 { }
19758}; 19728};
19759 19729
19760static struct hda_bind_ctls alc680_bind_cap_vol = { 19730static const struct hda_bind_ctls alc680_bind_cap_vol = {
19761 .ops = &snd_hda_bind_vol, 19731 .ops = &snd_hda_bind_vol,
19762 .values = { 19732 .values = {
19763 HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT), 19733 HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT),
@@ -19767,7 +19737,7 @@ static struct hda_bind_ctls alc680_bind_cap_vol = {
19767 }, 19737 },
19768}; 19738};
19769 19739
19770static struct hda_bind_ctls alc680_bind_cap_switch = { 19740static const struct hda_bind_ctls alc680_bind_cap_switch = {
19771 .ops = &snd_hda_bind_sw, 19741 .ops = &snd_hda_bind_sw,
19772 .values = { 19742 .values = {
19773 HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT), 19743 HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT),
@@ -19777,7 +19747,7 @@ static struct hda_bind_ctls alc680_bind_cap_switch = {
19777 }, 19747 },
19778}; 19748};
19779 19749
19780static struct snd_kcontrol_new alc680_master_capture_mixer[] = { 19750static const struct snd_kcontrol_new alc680_master_capture_mixer[] = {
19781 HDA_BIND_VOL("Capture Volume", &alc680_bind_cap_vol), 19751 HDA_BIND_VOL("Capture Volume", &alc680_bind_cap_vol),
19782 HDA_BIND_SW("Capture Switch", &alc680_bind_cap_switch), 19752 HDA_BIND_SW("Capture Switch", &alc680_bind_cap_switch),
19783 { } /* end */ 19753 { } /* end */
@@ -19786,7 +19756,7 @@ static struct snd_kcontrol_new alc680_master_capture_mixer[] = {
19786/* 19756/*
19787 * generic initialization of ADC, input mixers and output mixers 19757 * generic initialization of ADC, input mixers and output mixers
19788 */ 19758 */
19789static struct hda_verb alc680_init_verbs[] = { 19759static const struct hda_verb alc680_init_verbs[] = {
19790 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 19760 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
19791 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 19761 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
19792 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 19762 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
@@ -19824,20 +19794,22 @@ static void alc680_base_setup(struct hda_codec *codec)
19824 spec->autocfg.inputs[0].type = AUTO_PIN_MIC; 19794 spec->autocfg.inputs[0].type = AUTO_PIN_MIC;
19825 spec->autocfg.inputs[1].pin = 0x19; 19795 spec->autocfg.inputs[1].pin = 0x19;
19826 spec->autocfg.inputs[1].type = AUTO_PIN_LINE_IN; 19796 spec->autocfg.inputs[1].type = AUTO_PIN_LINE_IN;
19797 spec->automute = 1;
19798 spec->automute_mode = ALC_AUTOMUTE_AMP;
19827} 19799}
19828 19800
19829static void alc680_unsol_event(struct hda_codec *codec, 19801static void alc680_unsol_event(struct hda_codec *codec,
19830 unsigned int res) 19802 unsigned int res)
19831{ 19803{
19832 if ((res >> 26) == ALC880_HP_EVENT) 19804 if ((res >> 26) == ALC880_HP_EVENT)
19833 alc_automute_amp(codec); 19805 alc_hp_automute(codec);
19834 if ((res >> 26) == ALC880_MIC_EVENT) 19806 if ((res >> 26) == ALC880_MIC_EVENT)
19835 alc680_rec_autoswitch(codec); 19807 alc680_rec_autoswitch(codec);
19836} 19808}
19837 19809
19838static void alc680_inithook(struct hda_codec *codec) 19810static void alc680_inithook(struct hda_codec *codec)
19839{ 19811{
19840 alc_automute_amp(codec); 19812 alc_hp_automute(codec);
19841 alc680_rec_autoswitch(codec); 19813 alc680_rec_autoswitch(codec);
19842} 19814}
19843 19815
@@ -19874,7 +19846,7 @@ static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
19874 19846
19875 if (err < 0) 19847 if (err < 0)
19876 return err; 19848 return err;
19877 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac; 19849 spec->private_dac_nids[spec->multiout.num_dacs++] = dac;
19878 } 19850 }
19879 19851
19880 return 0; 19852 return 0;
@@ -19960,7 +19932,7 @@ static int alc680_parse_auto_config(struct hda_codec *codec)
19960{ 19932{
19961 struct alc_spec *spec = codec->spec; 19933 struct alc_spec *spec = codec->spec;
19962 int err; 19934 int err;
19963 static hda_nid_t alc680_ignore[] = { 0 }; 19935 static const hda_nid_t alc680_ignore[] = { 0 };
19964 19936
19965 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 19937 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
19966 alc680_ignore); 19938 alc680_ignore);
@@ -20018,12 +19990,12 @@ static const char * const alc680_models[ALC680_MODEL_LAST] = {
20018 [ALC680_AUTO] = "auto", 19990 [ALC680_AUTO] = "auto",
20019}; 19991};
20020 19992
20021static struct snd_pci_quirk alc680_cfg_tbl[] = { 19993static const struct snd_pci_quirk alc680_cfg_tbl[] = {
20022 SND_PCI_QUIRK(0x1043, 0x12f3, "ASUS NX90", ALC680_BASE), 19994 SND_PCI_QUIRK(0x1043, 0x12f3, "ASUS NX90", ALC680_BASE),
20023 {} 19995 {}
20024}; 19996};
20025 19997
20026static struct alc_config_preset alc680_presets[] = { 19998static const struct alc_config_preset alc680_presets[] = {
20027 [ALC680_BASE] = { 19999 [ALC680_BASE] = {
20028 .mixers = { alc680_base_mixer }, 20000 .mixers = { alc680_base_mixer },
20029 .cap_mixer = alc680_master_capture_mixer, 20001 .cap_mixer = alc680_master_capture_mixer,
@@ -20104,7 +20076,8 @@ static int patch_alc680(struct hda_codec *codec)
20104/* 20076/*
20105 * patch entries 20077 * patch entries
20106 */ 20078 */
20107static struct hda_codec_preset snd_hda_preset_realtek[] = { 20079static const struct hda_codec_preset snd_hda_preset_realtek[] = {
20080 { .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 },
20108 { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 }, 20081 { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
20109 { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 }, 20082 { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
20110 { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 }, 20083 { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
@@ -20113,6 +20086,7 @@ static struct hda_codec_preset snd_hda_preset_realtek[] = {
20113 { .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 }, 20086 { .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
20114 { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 }, 20087 { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
20115 { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 }, 20088 { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
20089 { .id = 0x10ec0276, .name = "ALC276", .patch = patch_alc269 },
20116 { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660", 20090 { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
20117 .patch = patch_alc861 }, 20091 .patch = patch_alc861 },
20118 { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd }, 20092 { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
@@ -20140,6 +20114,7 @@ static struct hda_codec_preset snd_hda_preset_realtek[] = {
20140 { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 }, 20114 { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
20141 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 }, 20115 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
20142 { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 }, 20116 { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
20117 { .id = 0x10ec0899, .name = "ALC899", .patch = patch_alc899 },
20143 {} /* terminator */ 20118 {} /* terminator */
20144}; 20119};
20145 20120