diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 3681 |
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 | ||
300 | struct alc_fixup; | 300 | struct alc_fixup; |
301 | 301 | ||
302 | struct 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 | |||
308 | enum { | ||
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 | |||
302 | struct alc_spec { | 314 | struct 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 | */ |
411 | struct alc_config_preset { | 438 | struct 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 | */ |
563 | static char *alc_pin_mode_names[] = { | 590 | static 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 | }; |
567 | static unsigned char alc_pin_mode_values[] = { | 594 | static 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 | */ |
586 | static signed char alc_pin_mode_dir_info[5][2] = { | 613 | static 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 | */ |
903 | static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix) | 930 | static 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 */ |
974 | static struct hda_verb alc_gpio1_init_verbs[] = { | 1001 | static 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 | ||
981 | static struct hda_verb alc_gpio2_init_verbs[] = { | 1008 | static 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 | ||
988 | static struct hda_verb alc_gpio3_init_verbs[] = { | 1015 | static 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 | ||
1054 | static void alc_automute_speaker(struct hda_codec *codec, int pinctl) | 1089 | static 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 | |||
1103 | static 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 | ||
1087 | static void alc_automute_pin(struct hda_codec *codec) | 1138 | /* Toggle internal speakers muting */ |
1139 | static 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 | |||
1166 | static 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 | |||
1178 | static 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 | ||
1092 | static int get_connection_index(struct hda_codec *codec, hda_nid_t mux, | 1190 | static 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) | |||
1128 | static void alc_mic_automute(struct hda_codec *codec) | 1226 | static 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 | ||
1195 | static void alc_inithook(struct hda_codec *codec) | 1312 | static 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 */ | ||
1358 | static 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 | */ | ||
1388 | static void alc_eapd_shutup(struct hda_codec *codec) | ||
1389 | { | ||
1390 | alc_auto_setup_eapd(codec, false); | ||
1391 | msleep(200); | ||
1392 | } | ||
1393 | |||
1239 | static void alc_auto_init_amp(struct hda_codec *codec, int type) | 1394 | static 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 | ||
1453 | static 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 | |||
1482 | static 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 | |||
1498 | static 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 | |||
1531 | static 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 | |||
1539 | static struct snd_kcontrol_new *alc_kcontrol_new(struct alc_spec *spec); | ||
1540 | |||
1541 | static 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 | |||
1318 | static void alc_init_auto_hp(struct hda_codec *codec) | 1556 | static 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 | ||
1353 | static void alc_init_auto_mic(struct hda_codec *codec) | 1622 | static 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 | */ |
1845 | static struct hda_verb alc888_4ST_ch2_intel_init[] = { | 2126 | static 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 | */ |
1860 | static struct hda_verb alc888_4ST_ch4_intel_init[] = { | 2141 | static 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 | */ |
1875 | static struct hda_verb alc888_4ST_ch6_intel_init[] = { | 2156 | static 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 | */ |
1890 | static struct hda_verb alc888_4ST_ch8_intel_init[] = { | 2171 | static 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 | ||
1902 | static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = { | 2183 | static 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 | ||
1913 | static struct hda_verb alc888_fujitsu_xa3530_verbs[] = { | 2194 | static 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 | ||
1946 | static void alc_automute_amp(struct hda_codec *codec) | ||
1947 | { | ||
1948 | alc_automute_speaker(codec, 0); | ||
1949 | } | ||
1950 | |||
1951 | static 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 | |||
1962 | static void alc889_automute_setup(struct hda_codec *codec) | 2227 | static 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 | ||
1974 | static void alc889_intel_init_hook(struct hda_codec *codec) | 2241 | static 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 | ||
1980 | static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec) | 2247 | static 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 | ||
1994 | static struct hda_verb alc888_acer_aspire_4930g_verbs[] = { | 2263 | static 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 | ||
2017 | static struct hda_verb alc888_acer_aspire_6530g_verbs[] = { | 2286 | static 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 | ||
2047 | static struct hda_verb alc888_acer_aspire_7730G_verbs[] = { | 2316 | static 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 | ||
2077 | static struct hda_verb alc889_acer_aspire_8930g_verbs[] = { | 2346 | static 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 | ||
2123 | static struct hda_input_mux alc888_2_capture_sources[2] = { | 2392 | static 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 | ||
2144 | static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = { | 2413 | static 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 | ||
2167 | static struct hda_input_mux alc889_capture_sources[3] = { | 2436 | static 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 | ||
2199 | static struct snd_kcontrol_new alc888_base_mixer[] = { | 2468 | static 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 | ||
2221 | static struct snd_kcontrol_new alc888_acer_aspire_4930g_mixer[] = { | 2490 | static 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 | ||
2243 | static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = { | 2512 | static 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 | ||
2272 | static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec) | 2543 | static 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 | ||
2282 | static void alc888_acer_aspire_7730g_setup(struct hda_codec *codec) | 2555 | static 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 | ||
2292 | static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec) | 2567 | static 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 | ||
2310 | static hda_nid_t alc880_dac_nids[4] = { | 2587 | static 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 | ||
2315 | static hda_nid_t alc880_adc_nids[3] = { | 2592 | static 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 | */ |
2324 | static hda_nid_t alc880_adc_nids_alt[2] = { | 2601 | static 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 | ||
2332 | static struct hda_input_mux alc880_capture_source = { | 2609 | static 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 */ |
2344 | static struct hda_verb alc880_threestack_ch2_init[] = { | 2621 | static 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 */ |
2355 | static struct hda_verb alc880_threestack_ch6_init[] = { | 2632 | static 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 | ||
2365 | static struct hda_channel_mode alc880_threestack_modes[2] = { | 2642 | static 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 | ||
2370 | static struct snd_kcontrol_new alc880_three_stack_mixer[] = { | 2647 | static 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) \ |
2515 | static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \ | 2792 | static 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) \ |
2522 | static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \ | 2799 | static 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 */ |
2545 | static struct snd_kcontrol_new alc880_five_stack_mixer[] = { | 2822 | static 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 */ |
2553 | static struct hda_verb alc880_fivestack_ch6_init[] = { | 2830 | static 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 */ |
2561 | static struct hda_verb alc880_fivestack_ch8_init[] = { | 2838 | static 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 | ||
2568 | static struct hda_channel_mode alc880_fivestack_modes[2] = { | 2845 | static 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 | ||
2583 | static hda_nid_t alc880_6st_dac_nids[4] = { | 2860 | static 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 | ||
2588 | static struct hda_input_mux alc880_6stack_capture_source = { | 2865 | static 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 */ |
2599 | static struct hda_channel_mode alc880_sixstack_modes[1] = { | 2876 | static const struct hda_channel_mode alc880_sixstack_modes[1] = { |
2600 | { 8, NULL }, | 2877 | { 8, NULL }, |
2601 | }; | 2878 | }; |
2602 | 2879 | ||
2603 | static struct snd_kcontrol_new alc880_six_stack_mixer[] = { | 2880 | static 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 | ||
2658 | static hda_nid_t alc880_w810_dac_nids[3] = { | 2935 | static 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 */ |
2664 | static struct hda_channel_mode alc880_w810_modes[1] = { | 2941 | static 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 */ |
2669 | static struct snd_kcontrol_new alc880_w810_base_mixer[] = { | 2946 | static 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 | ||
2691 | static hda_nid_t alc880_z71v_dac_nids[1] = { | 2968 | static 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 */ |
2697 | static struct hda_channel_mode alc880_2_jack_modes[1] = { | 2974 | static const struct hda_channel_mode alc880_2_jack_modes[1] = { |
2698 | { 2, NULL } | 2975 | { 2, NULL } |
2699 | }; | 2976 | }; |
2700 | 2977 | ||
2701 | static struct snd_kcontrol_new alc880_z71v_mixer[] = { | 2978 | static 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 | ||
2721 | static hda_nid_t alc880_f1734_dac_nids[1] = { | 2998 | static 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 | ||
2726 | static struct snd_kcontrol_new alc880_f1734_mixer[] = { | 3003 | static 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 | ||
2738 | static struct hda_input_mux alc880_f1734_capture_source = { | 3015 | static 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 | ||
2758 | static struct snd_kcontrol_new alc880_asus_mixer[] = { | 3035 | static 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 */ |
2792 | static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = { | 3069 | static 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 */ |
2799 | static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = { | 3076 | static 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 */ |
2813 | static struct snd_kcontrol_new alc880_uniwill_mixer[] = { | 3090 | static 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 | ||
2840 | static struct snd_kcontrol_new alc880_fujitsu_mixer[] = { | 3117 | static 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 | ||
2854 | static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = { | 3131 | static 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 */ |
2917 | static struct snd_kcontrol_new alc_beep_mixer[] = { | 3192 | static 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 | */ |
3082 | static struct hda_verb alc880_volume_init_verbs[] = { | 3357 | static 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 | */ |
3133 | static struct hda_verb alc880_pin_3stack_init_verbs[] = { | 3408 | static 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 | */ |
3171 | static struct hda_verb alc880_pin_5stack_init_verbs[] = { | 3446 | static 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 | */ |
3215 | static struct hda_verb alc880_pin_w810_init_verbs[] = { | 3490 | static 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 | */ |
3236 | static struct hda_verb alc880_pin_z71v_init_verbs[] = { | 3511 | static 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 | */ |
3255 | static struct hda_verb alc880_pin_6stack_init_verbs[] = { | 3530 | static 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 | */ |
3285 | static struct hda_verb alc880_uniwill_init_verbs[] = { | 3560 | static 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 | */ |
3323 | static struct hda_verb alc880_uniwill_p53_init_verbs[] = { | 3598 | static 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 | ||
3352 | static struct hda_verb alc880_beep_init_verbs[] = { | 3627 | static 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 | ||
3377 | static void alc880_uniwill_init_hook(struct hda_codec *codec) | 3654 | static 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 | ||
3407 | static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec) | 3686 | static 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 | */ |
3436 | static struct hda_verb alc880_pin_f1734_init_verbs[] = { | 3715 | static 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 | */ |
3468 | static struct hda_verb alc880_pin_asus_init_verbs[] = { | 3747 | static 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 */ |
3502 | static struct hda_verb alc880_pin_clevo_init_verbs[] = { | 3781 | static 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 | ||
3530 | static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = { | 3809 | static 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) */ |
3568 | static hda_nid_t alc880_lg_dac_nids[3] = { | 3847 | static 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 */ |
3573 | static struct hda_input_mux alc880_lg_capture_source = { | 3852 | static 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 */ |
3583 | static struct hda_verb alc880_lg_ch2_init[] = { | 3862 | static 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 | ||
3590 | static struct hda_verb alc880_lg_ch4_init[] = { | 3869 | static 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 | ||
3597 | static struct hda_verb alc880_lg_ch6_init[] = { | 3876 | static 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 | ||
3604 | static struct hda_channel_mode alc880_lg_ch_modes[3] = { | 3883 | static 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 | ||
3610 | static struct snd_kcontrol_new alc880_lg_mixer[] = { | 3889 | static 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 | ||
3635 | static struct hda_verb alc880_lg_init_verbs[] = { | 3914 | static 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 | ||
3687 | static struct hda_input_mux alc880_lg_lw_capture_source = { | 3968 | static 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 | ||
3698 | static struct snd_kcontrol_new alc880_lg_lw_mixer[] = { | 3979 | static 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 | ||
3723 | static struct hda_verb alc880_lg_lw_init_verbs[] = { | 4004 | static 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 | ||
3759 | static struct snd_kcontrol_new alc880_medion_rim_mixer[] = { | 4042 | static 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 | ||
3769 | static struct hda_input_mux alc880_medion_rim_capture_source = { | 4052 | static 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 | ||
3777 | static struct hda_verb alc880_medion_rim_init_verbs[] = { | 4060 | static 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[] = { | |||
3801 | static void alc880_medion_rim_automute(struct hda_codec *codec) | 4084 | static 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 |
3831 | static struct hda_amp_list alc880_loopbacks[] = { | 4116 | static 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 | ||
3840 | static struct hda_amp_list alc880_lg_loopbacks[] = { | 4125 | static 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 | ||
4012 | static struct hda_pcm_stream dualmic_pcm_analog_capture = { | 4297 | static 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 | */ |
4025 | static struct hda_pcm_stream alc880_pcm_analog_playback = { | 4310 | static 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 | ||
4037 | static struct hda_pcm_stream alc880_pcm_analog_capture = { | 4322 | static 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 | ||
4044 | static struct hda_pcm_stream alc880_pcm_analog_alt_playback = { | 4329 | static 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 | ||
4051 | static struct hda_pcm_stream alc880_pcm_analog_alt_capture = { | 4336 | static 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 | ||
4062 | static struct hda_pcm_stream alc880_pcm_digital_playback = { | 4347 | static 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 | ||
4075 | static struct hda_pcm_stream alc880_pcm_digital_capture = { | 4360 | static 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 */ |
4083 | static struct hda_pcm_stream alc_pcm_null_stream = { | 4368 | static 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 | ||
4194 | static inline void alc_shutup(struct hda_codec *codec) | 4479 | static 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 |
4227 | static void alc_power_eapd(struct hda_codec *codec) | 4516 | static 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 | ||
4253 | static int alc_suspend(struct hda_codec *codec, pm_message_t state) | 4521 | static 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 |
4264 | static int alc_resume(struct hda_codec *codec) | 4532 | static 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 | */ |
4276 | static struct hda_codec_ops alc_patch_ops = { | 4545 | static 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 |
4311 | static hda_nid_t alc880_test_dac_nids[4] = { | 4580 | static const hda_nid_t alc880_test_dac_nids[4] = { |
4312 | 0x02, 0x03, 0x04, 0x05 | 4581 | 0x02, 0x03, 0x04, 0x05 |
4313 | }; | 4582 | }; |
4314 | 4583 | ||
4315 | static struct hda_input_mux alc880_test_capture_source = { | 4584 | static 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 | ||
4328 | static struct hda_channel_mode alc880_test_modes[4] = { | 4597 | static 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] = { | |||
4335 | static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol, | 4604 | static 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, | |||
4410 | static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol, | 4679 | static 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 | ||
4474 | static struct snd_kcontrol_new alc880_test_mixer[] = { | 4743 | static 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 | ||
4515 | static struct hda_verb alc880_test_init_verbs[] = { | 4784 | static 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 | ||
4599 | static struct snd_pci_quirk alc880_cfg_tbl[] = { | 4868 | static 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 | */ |
4679 | static struct alc_config_preset alc880_presets[] = { | 4948 | static 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 | }; |
4987 | static struct snd_kcontrol_new alc880_control_templates[] = { | 5256 | static 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 | ||
5262 | static 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 */ |
4994 | static int add_control(struct alc_spec *spec, int type, const char *name, | 5269 | static 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 | ||
5081 | static const char *alc_get_line_out_pfx(const struct auto_pin_cfg *cfg, | 5355 | static 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 | ||
5660 | static 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) | |||
5550 | static void set_capture_mixer(struct hda_codec *codec) | 5845 | static 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 */ |
5579 | static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids, | 5874 | static 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 | ||
5645 | static struct snd_pci_quirk beep_white_list[] = { | 5940 | static 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 | ||
5756 | static hda_nid_t alc260_dac_nids[1] = { | 6052 | static const hda_nid_t alc260_dac_nids[1] = { |
5757 | /* front */ | 6053 | /* front */ |
5758 | 0x02, | 6054 | 0x02, |
5759 | }; | 6055 | }; |
5760 | 6056 | ||
5761 | static hda_nid_t alc260_adc_nids[1] = { | 6057 | static const hda_nid_t alc260_adc_nids[1] = { |
5762 | /* ADC0 */ | 6058 | /* ADC0 */ |
5763 | 0x04, | 6059 | 0x04, |
5764 | }; | 6060 | }; |
5765 | 6061 | ||
5766 | static hda_nid_t alc260_adc_nids_alt[1] = { | 6062 | static 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 | */ |
5774 | static hda_nid_t alc260_dual_adc_nids[2] = { | 6070 | static 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 | ||
5782 | static struct hda_input_mux alc260_capture_source = { | 6078 | static 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 | */ |
5798 | static struct hda_input_mux alc260_fujitsu_capture_sources[2] = { | 6094 | static 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 | */ |
5822 | static struct hda_input_mux alc260_acer_capture_sources[2] = { | 6118 | static 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 */ |
5845 | static struct hda_input_mux alc260_favorit100_capture_sources[2] = { | 6141 | static 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 | */ |
5869 | static struct hda_channel_mode alc260_modes[1] = { | 6165 | static 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 | ||
5883 | static struct snd_kcontrol_new alc260_base_output_mixer[] = { | 6179 | static 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 | ||
5893 | static struct snd_kcontrol_new alc260_input_mixer[] = { | 6189 | static 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 */ |
5906 | static void alc260_hp_master_update(struct hda_codec *codec, | 6202 | static 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 | ||
5923 | static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol, | 6212 | static 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 | ||
5950 | static struct snd_kcontrol_new alc260_hp_output_mixer[] = { | 6235 | static 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 | ||
5970 | static struct hda_verb alc260_hp_unsol_verbs[] = { | 6254 | static 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 | ||
5975 | static void alc260_hp_automute(struct hda_codec *codec) | 6259 | static 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; | |
5983 | static 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 | ||
5989 | static struct snd_kcontrol_new alc260_hp_3013_mixer[] = { | 6270 | static 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 | ||
6010 | static struct hda_bind_ctls alc260_dc7600_bind_master_vol = { | 6290 | static 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 | |||
6301 | static 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 | ||
6020 | static struct hda_bind_ctls alc260_dc7600_bind_switch = { | 6311 | static 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 | ||
6029 | static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = { | 6320 | static 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 | ||
6037 | static struct hda_verb alc260_hp_3013_unsol_verbs[] = { | 6328 | static 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 | ||
6042 | static void alc260_hp_3013_automute(struct hda_codec *codec) | 6333 | static 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; | |
6050 | static 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 | |||
6057 | static 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 | |||
6069 | static 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 | */ |
6079 | static struct snd_kcontrol_new alc260_fujitsu_mixer[] = { | 6348 | static 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 | */ |
6116 | static struct snd_kcontrol_new alc260_acer_mixer[] = { | 6385 | static 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 | */ |
6137 | static struct snd_kcontrol_new alc260_favorit100_mixer[] = { | 6406 | static 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 | */ |
6150 | static struct snd_kcontrol_new alc260_will_mixer[] = { | 6419 | static 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 | */ |
6167 | static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = { | 6436 | static 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 | */ |
6184 | static struct hda_verb alc260_init_verbs[] = { | 6453 | static 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? */ |
6248 | static struct hda_verb alc260_hp_init_verbs[] = { | 6517 | static 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 | ||
6298 | static struct hda_verb alc260_hp_3013_init_verbs[] = { | 6567 | static 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 | */ |
6351 | static struct hda_verb alc260_fujitsu_init_verbs[] = { | 6620 | static 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 | */ |
6433 | static struct hda_verb alc260_acer_init_verbs[] = { | 6702 | static 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 | */ |
6521 | static struct hda_verb alc260_favorit100_init_verbs[] = { | 6790 | static 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 | ||
6601 | static struct hda_verb alc260_will_verbs[] = { | 6870 | static 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 | ||
6611 | static struct hda_verb alc260_replacer_672v_verbs[] = { | 6880 | static 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 | ||
6653 | static struct hda_verb alc260_hp_dc7600_verbs[] = { | 6922 | static 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 |
6671 | static hda_nid_t alc260_test_dac_nids[1] = { | 6940 | static const hda_nid_t alc260_test_dac_nids[1] = { |
6672 | 0x02, | 6941 | 0x02, |
6673 | }; | 6942 | }; |
6674 | static hda_nid_t alc260_test_adc_nids[2] = { | 6943 | static 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 | */ |
6681 | static struct hda_input_mux alc260_test_capture_sources[2] = { | 6950 | static 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 | }; |
6708 | static struct snd_kcontrol_new alc260_test_mixer[] = { | 6977 | static 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 | }; |
6772 | static struct hda_verb alc260_test_init_verbs[] = { | 7041 | static 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 | */ |
7008 | static struct hda_verb alc260_volume_init_verbs[] = { | 7277 | static 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 |
7098 | static struct hda_amp_list alc260_loopbacks[] = { | 7367 | static 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 | ||
7125 | static struct snd_pci_quirk alc260_fixup_tbl[] = { | 7394 | static 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 | ||
7149 | static struct snd_pci_quirk alc260_cfg_tbl[] = { | 7418 | static 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 | ||
7173 | static struct alc_config_preset alc260_presets[] = { | 7442 | static 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 | ||
7414 | static struct hda_channel_mode alc882_ch_modes[1] = { | 7687 | static const struct hda_channel_mode alc882_ch_modes[1] = { |
7415 | { 8, NULL } | 7688 | { 8, NULL } |
7416 | }; | 7689 | }; |
7417 | 7690 | ||
7418 | /* DACs */ | 7691 | /* DACs */ |
7419 | static hda_nid_t alc882_dac_nids[4] = { | 7692 | static 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 |
7429 | static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 }; | 7702 | static const hda_nid_t alc883_adc_nids_alt[1] = { 0x08 }; |
7430 | static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 }; | 7703 | static 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 | ||
7433 | static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 }; | 7706 | static const hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 }; |
7434 | static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 }; | 7707 | static 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 |
7436 | static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 }; | 7709 | static 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 | ||
7442 | static struct hda_input_mux alc882_capture_source = { | 7715 | static 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 | ||
7454 | static struct hda_input_mux alc889_capture_source = { | 7727 | static 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 | ||
7463 | static struct hda_input_mux mb5_capture_source = { | 7736 | static 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 | ||
7472 | static struct hda_input_mux macmini3_capture_source = { | 7745 | static 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 | ||
7480 | static struct hda_input_mux alc883_3stack_6ch_intel = { | 7753 | static 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 | ||
7490 | static struct hda_input_mux alc883_lenovo_101e_capture_source = { | 7763 | static 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 | ||
7498 | static struct hda_input_mux alc883_lenovo_nb0763_capture_source = { | 7771 | static 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 | ||
7508 | static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = { | 7781 | static 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 | ||
7516 | static struct hda_input_mux alc883_lenovo_sky_capture_source = { | 7789 | static 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 | ||
7525 | static struct hda_input_mux alc883_asus_eee1601_capture_source = { | 7798 | static 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 | ||
7533 | static struct hda_input_mux alc889A_mb31_capture_source = { | 7806 | static 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 | ||
7544 | static struct hda_input_mux alc889A_imac91_capture_source = { | 7817 | static 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 | */ |
7555 | static struct hda_channel_mode alc883_3ST_2ch_modes[1] = { | 7828 | static 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 | */ |
7562 | static struct hda_verb alc882_3ST_ch2_init[] = { | 7835 | static 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 | */ |
7573 | static struct hda_verb alc882_3ST_ch4_init[] = { | 7846 | static 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 | */ |
7585 | static struct hda_verb alc882_3ST_ch6_init[] = { | 7858 | static 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 | ||
7595 | static struct hda_channel_mode alc882_3ST_6ch_modes[3] = { | 7868 | static 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 | */ |
7606 | static struct hda_verb alc883_3ST_ch2_clevo_init[] = { | 7879 | static 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 | */ |
7618 | static struct hda_verb alc883_3ST_ch4_clevo_init[] = { | 7891 | static 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 | */ |
7631 | static struct hda_verb alc883_3ST_ch6_clevo_init[] = { | 7904 | static 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 | ||
7642 | static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = { | 7915 | static 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 | */ |
7652 | static struct hda_verb alc882_sixstack_ch6_init[] = { | 7925 | static 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 | */ |
7663 | static struct hda_verb alc882_sixstack_ch8_init[] = { | 7936 | static 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 | ||
7671 | static struct hda_channel_mode alc882_sixstack_modes[2] = { | 7944 | static 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 | ||
7679 | static struct hda_channel_mode alc885_mba21_ch_modes[1] = { | 7952 | static 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 | */ |
7690 | static struct hda_verb alc885_mbp_ch2_init[] = { | 7963 | static 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 | */ |
7700 | static struct hda_verb alc885_mbp_ch4_init[] = { | 7973 | static 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 | ||
7709 | static struct hda_channel_mode alc885_mbp_4ch_modes[2] = { | 7982 | static 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 | */ |
7719 | static struct hda_verb alc885_mb5_ch2_init[] = { | 7992 | static 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 | */ |
7731 | static struct hda_verb alc885_mb5_ch6_init[] = { | 8004 | static 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 | ||
7738 | static struct hda_channel_mode alc885_mb5_6ch_modes[2] = { | 8011 | static 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 | */ |
7748 | static struct hda_verb alc883_4ST_ch2_init[] = { | 8021 | static 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 | */ |
7761 | static struct hda_verb alc883_4ST_ch4_init[] = { | 8034 | static 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 | */ |
7775 | static struct hda_verb alc883_4ST_ch6_init[] = { | 8048 | static 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 | */ |
7790 | static struct hda_verb alc883_4ST_ch8_init[] = { | 8063 | static 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 | ||
7803 | static struct hda_channel_mode alc883_4ST_8ch_modes[4] = { | 8076 | static 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 | */ |
7814 | static struct hda_verb alc883_3ST_ch2_intel_init[] = { | 8087 | static 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 | */ |
7825 | static struct hda_verb alc883_3ST_ch4_intel_init[] = { | 8098 | static 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 | */ |
7837 | static struct hda_verb alc883_3ST_ch6_intel_init[] = { | 8110 | static 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 | ||
7847 | static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = { | 8120 | static 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 | */ |
7856 | static struct hda_verb alc889_ch2_intel_init[] = { | 8129 | static 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 | */ |
7869 | static struct hda_verb alc889_ch6_intel_init[] = { | 8142 | static 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 | */ |
7882 | static struct hda_verb alc889_ch8_intel_init[] = { | 8155 | static 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 | ||
7893 | static struct hda_channel_mode alc889_8ch_intel_modes[3] = { | 8166 | static 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 | */ |
7902 | static struct hda_verb alc883_sixstack_ch6_init[] = { | 8175 | static 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 | */ |
7913 | static struct hda_verb alc883_sixstack_ch8_init[] = { | 8186 | static 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 | ||
7921 | static struct hda_channel_mode alc883_sixstack_modes[2] = { | 8194 | static 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 | */ |
7930 | static struct snd_kcontrol_new alc882_base_mixer[] = { | 8203 | static 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 | ||
7957 | static struct snd_kcontrol_new alc885_mba21_mixer[] = { | 8230 | static 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 | ||
7964 | static struct snd_kcontrol_new alc885_mbp3_mixer[] = { | 8237 | static 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 | ||
7979 | static struct snd_kcontrol_new alc885_mb5_mixer[] = { | 8252 | static 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 | ||
7997 | static struct snd_kcontrol_new alc885_macmini3_mixer[] = { | 8270 | static 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 | ||
8012 | static struct snd_kcontrol_new alc885_imac91_mixer[] = { | 8285 | static 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 | ||
8019 | static struct snd_kcontrol_new alc882_w2jc_mixer[] = { | 8292 | static 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 | ||
8032 | static struct snd_kcontrol_new alc882_targa_mixer[] = { | 8305 | static 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 | */ |
8052 | static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = { | 8325 | static 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 | ||
8069 | static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = { | 8342 | static 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 | ||
8083 | static struct snd_kcontrol_new alc882_chmode_mixer[] = { | 8356 | static 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 | ||
8094 | static struct hda_verb alc882_base_init_verbs[] = { | 8367 | static 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 | ||
8156 | static struct hda_verb alc882_adc1_init_verbs[] = { | 8429 | static 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 | ||
8168 | static struct hda_verb alc882_eapd_verbs[] = { | 8441 | static 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 | ||
8175 | static struct hda_verb alc889_eapd_verbs[] = { | 8448 | static 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 | ||
8181 | static struct hda_verb alc_hp15_unsol_verbs[] = { | 8454 | static 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 | ||
8187 | static struct hda_verb alc885_init_verbs[] = { | 8460 | static 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 | ||
8246 | static struct hda_verb alc885_init_input_verbs[] = { | 8519 | static 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 */ |
8255 | static struct hda_verb alc889_init_input_verbs[] = { | 8528 | static 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 */ |
8265 | static struct snd_kcontrol_new alc882_macpro_mixer[] = { | 8538 | static 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 | ||
8278 | static struct hda_verb alc882_macpro_init_verbs[] = { | 8551 | static 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 */ |
8330 | static struct hda_verb alc885_mb5_init_verbs[] = { | 8603 | static 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 */ |
8379 | static struct hda_verb alc885_macmini3_init_verbs[] = { | 8652 | static 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 | ||
8426 | static struct hda_verb alc885_mba21_init_verbs[] = { | 8699 | static 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 */ |
8449 | static struct hda_verb alc885_mbp3_init_verbs[] = { | 8722 | static 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 */ |
8513 | static struct hda_verb alc885_imac91_init_verbs[] = { | 8786 | static 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. */ |
8568 | static struct snd_kcontrol_new alc885_imac24_mixer[] = { | 8841 | static 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. */ |
8575 | static struct hda_verb alc885_imac24_init_verbs[] = { | 8848 | static 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 | ||
8627 | static void alc885_imac91_setup(struct hda_codec *codec) | 8906 | static 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 | ||
8636 | static struct hda_verb alc882_targa_verbs[] = { | 8917 | static 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[] = { | |||
8652 | static void alc882_targa_automute(struct hda_codec *codec) | 8933 | static 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 | ||
8668 | static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res) | 8951 | static 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 | ||
8674 | static struct hda_verb alc882_asus_a7j_verbs[] = { | 8957 | static 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 | ||
8692 | static struct hda_verb alc882_asus_a7m_verbs[] = { | 8975 | static 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) | |||
8750 | static void alc885_imac24_init_hook(struct hda_codec *codec) | 9033 | static 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 | */ |
8759 | static struct hda_verb alc883_auto_init_verbs[] = { | 9042 | static 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) */ |
8799 | static struct hda_verb alc889A_mb31_ch2_init[] = { | 9082 | static 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) */ |
8808 | static struct hda_verb alc889A_mb31_ch4_init[] = { | 9091 | static 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) */ |
8817 | static struct hda_verb alc889A_mb31_ch5_init[] = { | 9100 | static 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) */ |
8826 | static struct hda_verb alc889A_mb31_ch6_init[] = { | 9109 | static 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 | ||
8834 | static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = { | 9117 | static 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 | ||
8841 | static struct hda_verb alc883_medion_eapd_verbs[] = { | 9124 | static 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 | ||
8850 | static struct snd_kcontrol_new alc883_mitac_mixer[] = { | 9133 | static 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 | ||
8867 | static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = { | 9150 | static 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 | ||
8881 | static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = { | 9164 | static 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 | ||
8895 | static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = { | 9178 | static 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 | ||
8912 | static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = { | 9195 | static 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 | ||
8935 | static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = { | 9218 | static 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 | ||
8959 | static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = { | 9242 | static 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 | ||
8983 | static struct snd_kcontrol_new alc883_fivestack_mixer[] = { | 9266 | static 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 | ||
9006 | static struct snd_kcontrol_new alc883_targa_mixer[] = { | 9289 | static 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 | ||
9027 | static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = { | 9310 | static 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 | ||
9043 | static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = { | 9326 | static 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 | ||
9052 | static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = { | 9335 | static 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 | ||
9064 | static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = { | 9347 | static 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 | ||
9077 | static struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = { | 9360 | static 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 | ||
9087 | static struct hda_verb alc883_medion_wim2160_verbs[] = { | 9370 | static 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 | ||
9113 | static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = { | 9398 | static 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 | ||
9125 | static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = { | 9410 | static 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 | ||
9138 | static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = { | 9423 | static 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 | ||
9163 | static struct snd_kcontrol_new alc889A_mb31_mixer[] = { | 9448 | static 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 | ||
9189 | static struct snd_kcontrol_new alc883_vaiott_mixer[] = { | 9474 | static 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 | ||
9199 | static struct hda_bind_ctls alc883_bind_cap_vol = { | 9484 | static 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 | ||
9208 | static struct hda_bind_ctls alc883_bind_cap_switch = { | 9493 | static 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 | ||
9217 | static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = { | 9502 | static 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 | ||
9229 | static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = { | 9514 | static 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 | ||
9244 | static struct snd_kcontrol_new alc883_chmode_mixer[] = { | 9529 | static 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 | ||
9265 | static struct hda_verb alc883_mitac_verbs[] = { | 9552 | static 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 | ||
9280 | static struct hda_verb alc883_clevo_m540r_verbs[] = { | 9567 | static 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 | ||
9296 | static struct hda_verb alc883_clevo_m720_verbs[] = { | 9583 | static 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 | ||
9311 | static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = { | 9598 | static 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 | ||
9325 | static struct hda_verb alc883_targa_verbs[] = { | 9612 | static 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 | ||
9354 | static struct hda_verb alc883_lenovo_101e_verbs[] = { | 9641 | static 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 | ||
9361 | static struct hda_verb alc883_lenovo_nb0763_verbs[] = { | 9648 | static 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 | ||
9369 | static struct hda_verb alc888_lenovo_ms7195_verbs[] = { | 9656 | static 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 | ||
9378 | static struct hda_verb alc883_haier_w66_verbs[] = { | 9665 | static 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 | ||
9391 | static struct hda_verb alc888_lenovo_sky_verbs[] = { | 9678 | static 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 | ||
9403 | static struct hda_verb alc888_6st_dell_verbs[] = { | 9690 | static 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 | ||
9408 | static struct hda_verb alc883_vaiott_verbs[] = { | 9695 | static 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 | ||
9429 | static struct hda_verb alc888_3st_hp_verbs[] = { | 9718 | static 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 | */ |
9440 | static struct hda_verb alc888_3st_hp_2ch_init[] = { | 9729 | static 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 | */ |
9451 | static struct hda_verb alc888_3st_hp_4ch_init[] = { | 9740 | static 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 | */ |
9463 | static struct hda_verb alc888_3st_hp_6ch_init[] = { | 9752 | static 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 | ||
9473 | static struct hda_channel_mode alc888_3st_hp_modes[3] = { | 9762 | static 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 */ | 9768 | static void alc888_lenovo_ms7195_setup(struct hda_codec *codec) |
9480 | static 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 */ | ||
9491 | static 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 | ||
9499 | static 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 | ||
9529 | static void alc883_clevo_m720_init_hook(struct hda_codec *codec) | 9804 | static 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 | ||
9557 | static void alc883_haier_w66_setup(struct hda_codec *codec) | 9834 | static 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 | ||
9565 | static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec) | 9844 | static 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 | |||
9573 | static 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 | ||
9583 | static 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 | ||
9602 | static struct hda_verb alc883_acer_eapd_verbs[] = { | 9869 | static 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 | ||
9631 | static void alc888_lenovo_sky_setup(struct hda_codec *codec) | 9900 | static 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 | ||
9643 | static void alc883_vaiott_setup(struct hda_codec *codec) | 9914 | static 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 | ||
9652 | static struct hda_verb alc888_asus_m90v_verbs[] = { | 9925 | static 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 | ||
9677 | static struct hda_verb alc888_asus_eee1601_verbs[] = { | 9952 | static 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 | ||
9699 | static struct hda_verb alc889A_mb31_verbs[] = { | 9974 | static 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 | ||
9745 | static hda_nid_t alc883_slave_dig_outs[] = { | 10020 | static const hda_nid_t alc883_slave_dig_outs[] = { |
9746 | ALC1200_DIGOUT_NID, 0, | 10021 | ALC1200_DIGOUT_NID, 0, |
9747 | }; | 10022 | }; |
9748 | 10023 | ||
9749 | static hda_nid_t alc1200_slave_dig_outs[] = { | 10024 | static 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 | ||
9808 | static struct snd_pci_quirk alc882_cfg_tbl[] = { | 10083 | static 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 */ |
9935 | static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = { | 10210 | static 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 | ||
9962 | static struct alc_config_preset alc882_presets[] = { | 10237 | static 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 | ||
10737 | static struct snd_pci_quirk alc882_fixup_tbl[] = { | 11014 | static 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) | |||
10921 | static int alc882_parse_auto_config(struct hda_codec *codec) | 11203 | static 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 | ||
11138 | static hda_nid_t alc262_dmic_adc_nids[1] = { | 11423 | static const hda_nid_t alc262_dmic_adc_nids[1] = { |
11139 | /* ADC0 */ | 11424 | /* ADC0 */ |
11140 | 0x09 | 11425 | 0x09 |
11141 | }; | 11426 | }; |
11142 | 11427 | ||
11143 | static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 }; | 11428 | static const hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 }; |
11144 | 11429 | ||
11145 | static struct snd_kcontrol_new alc262_base_mixer[] = { | 11430 | static 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 */ |
11166 | static 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 | ||
11185 | static void alc262_hp_bpc_automute(struct hda_codec *codec) | 11453 | static 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; | |
11193 | static 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 | ||
11200 | static void alc262_hp_wildwest_automute(struct hda_codec *codec) | 11463 | static 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; | |
11208 | static 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 | |
11218 | static 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 | ||
11247 | static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = { | 11491 | static 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 | ||
11271 | static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = { | 11515 | static 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 | ||
11291 | static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = { | 11535 | static 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 | ||
11307 | static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = { | 11553 | static 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 | ||
11318 | static struct hda_verb alc262_hp_t5735_verbs[] = { | 11564 | static 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 | ||
11326 | static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = { | 11572 | static 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 | ||
11336 | static struct hda_verb alc262_hp_rp5700_verbs[] = { | 11582 | static 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 | ||
11350 | static struct hda_input_mux alc262_hp_rp5700_capture_source = { | 11596 | static 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 */ |
11358 | static 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 | |
11383 | static 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 | ||
11412 | static struct snd_kcontrol_new alc262_hippo_mixer[] = { | 11623 | static 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 | ||
11429 | static struct snd_kcontrol_new alc262_hippo1_mixer[] = { | 11640 | static 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 */ |
11446 | static 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 | |||
11455 | static 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 | |||
11462 | static void alc262_hippo_setup(struct hda_codec *codec) | 11657 | static 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 | ||
11470 | static void alc262_hippo1_setup(struct hda_codec *codec) | 11667 | static 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 | ||
11479 | static struct snd_kcontrol_new alc262_sony_mixer[] = { | 11678 | static 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 | ||
11489 | static struct snd_kcontrol_new alc262_benq_t31_mixer[] = { | 11688 | static 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 | ||
11500 | static struct snd_kcontrol_new alc262_tyan_mixer[] = { | 11699 | static 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 | ||
11516 | static struct hda_verb alc262_tyan_verbs[] = { | 11715 | static 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 | */ |
11547 | static struct hda_verb alc262_init_verbs[] = { | 11748 | static 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 | ||
11623 | static struct hda_verb alc262_eapd_verbs[] = { | 11824 | static 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 | ||
11629 | static struct hda_verb alc262_hippo1_unsol_verbs[] = { | 11830 | static 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 | ||
11639 | static struct hda_verb alc262_sony_unsol_verbs[] = { | 11840 | static 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 | ||
11649 | static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = { | 11850 | static 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 | ||
11658 | static struct hda_verb alc262_toshiba_s06_verbs[] = { | 11859 | static 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 | ||
11690 | static struct snd_kcontrol_new alc262_nec_mixer[] = { | 11893 | static 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 | ||
11703 | static struct hda_verb alc262_nec_verbs[] = { | 11906 | static 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 | ||
11726 | static struct hda_verb alc262_fujitsu_unsol_verbs[] = { | 11929 | static 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 | ||
11734 | static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = { | 11937 | static 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 | ||
11740 | static struct hda_verb alc262_lenovo_3000_init_verbs[] = { | 11943 | static 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 | ||
11747 | static struct hda_input_mux alc262_fujitsu_capture_source = { | 11950 | static 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 | ||
11756 | static struct hda_input_mux alc262_HP_capture_source = { | 11959 | static 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 | ||
11767 | static struct hda_input_mux alc262_HP_D7000_capture_source = { | 11970 | static 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 */ | 11980 | static void alc262_fujitsu_setup(struct hda_codec *codec) |
11778 | static 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 */ | ||
11800 | static 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 | ||
11808 | static 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 */ |
11814 | static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = { | 11992 | static 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 */ | 12001 | static const struct snd_kcontrol_new alc262_fujitsu_mixer[] = { |
11824 | static 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 */ | ||
11850 | static 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 | |||
11858 | static 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) */ | ||
11871 | static 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 | |||
11885 | static 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) */ | 12027 | static void alc262_lenovo_3000_setup(struct hda_codec *codec) |
11913 | static 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 | ||
11926 | static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = { | 12038 | static 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 | ||
11948 | static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = { | 12059 | static 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 */ |
11961 | static struct hda_verb alc262_EAPD_verbs[] = { | 12072 | static 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 | ||
11967 | static struct hda_verb alc262_benq_t31_EAPD_verbs[] = { | 12078 | static 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 */ |
11977 | static struct snd_kcontrol_new alc262_ultra_mixer[] = { | 12088 | static 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 | ||
11987 | static struct hda_verb alc262_ultra_verbs[] = { | 12098 | static 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 | ||
12050 | static struct hda_input_mux alc262_ultra_capture_source = { | 12161 | static 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 | ||
12076 | static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = { | 12187 | static 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 | */ |
12207 | static struct hda_verb alc262_volume_init_verbs[] = { | 12318 | static 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 | ||
12268 | static struct hda_verb alc262_HP_BPC_init_verbs[] = { | 12379 | static 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 | ||
12372 | static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = { | 12483 | static 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 | ||
12468 | static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = { | 12579 | static 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 | ||
12504 | static struct snd_pci_quirk alc262_fixup_tbl[] = { | 12615 | static 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 | ||
12612 | static struct snd_pci_quirk alc262_cfg_tbl[] = { | 12723 | static 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 | ||
12664 | static struct alc_config_preset alc262_presets[] = { | 12775 | static 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 | ||
13030 | static hda_nid_t alc268_dac_nids[2] = { | 13148 | static const hda_nid_t alc268_dac_nids[2] = { |
13031 | /* front, hp */ | 13149 | /* front, hp */ |
13032 | 0x02, 0x03 | 13150 | 0x02, 0x03 |
13033 | }; | 13151 | }; |
13034 | 13152 | ||
13035 | static hda_nid_t alc268_adc_nids[2] = { | 13153 | static const hda_nid_t alc268_adc_nids[2] = { |
13036 | /* ADC0-1 */ | 13154 | /* ADC0-1 */ |
13037 | 0x08, 0x07 | 13155 | 0x08, 0x07 |
13038 | }; | 13156 | }; |
13039 | 13157 | ||
13040 | static hda_nid_t alc268_adc_nids_alt[1] = { | 13158 | static const hda_nid_t alc268_adc_nids_alt[1] = { |
13041 | /* ADC0 */ | 13159 | /* ADC0 */ |
13042 | 0x08 | 13160 | 0x08 |
13043 | }; | 13161 | }; |
13044 | 13162 | ||
13045 | static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 }; | 13163 | static const hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 }; |
13046 | 13164 | ||
13047 | static struct snd_kcontrol_new alc268_base_mixer[] = { | 13165 | static 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 | ||
13059 | static struct snd_kcontrol_new alc268_toshiba_mixer[] = { | 13177 | static 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 */ |
13071 | static struct hda_bind_ctls alc268_bind_beep_sw = { | 13189 | static 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 | ||
13080 | static struct snd_kcontrol_new alc268_beep_mixer[] = { | 13198 | static 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 | ||
13086 | static struct hda_verb alc268_eapd_verbs[] = { | 13204 | static 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 */ |
13093 | static struct hda_verb alc268_toshiba_verbs[] = { | 13211 | static 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 */ |
13100 | static struct hda_bind_ctls alc268_acer_bind_master_vol = { | 13218 | static 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 */ | 13227 | static void alc268_acer_setup(struct hda_codec *codec) |
13110 | static 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) */ | 13240 | static const struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = { |
13129 | static 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 | |||
13142 | static 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 | ||
13158 | static struct snd_kcontrol_new alc268_acer_mixer[] = { | 13255 | static 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 | ||
13176 | static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = { | 13272 | static 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 | ||
13193 | static struct hda_verb alc268_acer_aspire_one_verbs[] = { | 13288 | static 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 | ||
13203 | static struct hda_verb alc268_acer_verbs[] = { | 13298 | static 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 | |||
13219 | static 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 | |||
13227 | static 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 */ | ||
13233 | static 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 | |||
13246 | static 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 | ||
13259 | static void alc268_acer_lc_setup(struct hda_codec *codec) | 13312 | static 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 | ||
13269 | static void alc268_acer_lc_init_hook(struct hda_codec *codec) | 13327 | static const struct snd_kcontrol_new alc268_dell_mixer[] = { |
13270 | { | ||
13271 | alc268_aspire_one_speaker_automute(codec); | ||
13272 | alc_mic_automute(codec); | ||
13273 | } | ||
13274 | |||
13275 | static 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 | ||
13286 | static struct hda_verb alc268_dell_verbs[] = { | 13338 | static 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 | ||
13308 | static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = { | 13362 | static 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 | ||
13320 | static struct hda_verb alc267_quanta_il1_verbs[] = { | 13374 | static 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 | */ |
13341 | static struct hda_verb alc268_base_init_verbs[] = { | 13397 | static 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 | */ |
13389 | static struct hda_verb alc268_volume_init_verbs[] = { | 13445 | static 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 | ||
13415 | static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = { | 13471 | static 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 | ||
13421 | static struct snd_kcontrol_new alc268_capture_alt_mixer[] = { | 13477 | static 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 | ||
13428 | static struct snd_kcontrol_new alc268_capture_mixer[] = { | 13484 | static 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 | ||
13437 | static struct hda_input_mux alc268_capture_source = { | 13493 | static 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 | ||
13447 | static struct hda_input_mux alc268_acer_capture_source = { | 13503 | static 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 | ||
13456 | static struct hda_input_mux alc268_acer_dmic_capture_source = { | 13512 | static 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 |
13466 | static struct snd_kcontrol_new alc268_test_mixer[] = { | 13522 | static 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 | ||
13798 | static struct snd_pci_quirk alc268_cfg_tbl[] = { | 13854 | static 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 */ |
13823 | static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = { | 13879 | static 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 | ||
13831 | static struct alc_config_preset alc268_presets[] = { | 13887 | static 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 | ||
14101 | static hda_nid_t alc269_adc_nids[1] = { | 14161 | static const hda_nid_t alc269_adc_nids[1] = { |
14102 | /* ADC1 */ | 14162 | /* ADC1 */ |
14103 | 0x08, | 14163 | 0x08, |
14104 | }; | 14164 | }; |
14105 | 14165 | ||
14106 | static hda_nid_t alc269_capsrc_nids[1] = { | 14166 | static const hda_nid_t alc269_capsrc_nids[1] = { |
14107 | 0x23, | 14167 | 0x23, |
14108 | }; | 14168 | }; |
14109 | 14169 | ||
14110 | static hda_nid_t alc269vb_adc_nids[1] = { | 14170 | static const hda_nid_t alc269vb_adc_nids[1] = { |
14111 | /* ADC1 */ | 14171 | /* ADC1 */ |
14112 | 0x09, | 14172 | 0x09, |
14113 | }; | 14173 | }; |
14114 | 14174 | ||
14115 | static hda_nid_t alc269vb_capsrc_nids[1] = { | 14175 | static const hda_nid_t alc269vb_capsrc_nids[1] = { |
14116 | 0x22, | 14176 | 0x22, |
14117 | }; | 14177 | }; |
14118 | 14178 | ||
14119 | static hda_nid_t alc269_adc_candidates[] = { | 14179 | static 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 | ||
14126 | static struct snd_kcontrol_new alc269_base_mixer[] = { | 14186 | static 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 | ||
14142 | static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = { | 14202 | static 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 | ||
14163 | static struct snd_kcontrol_new alc269_lifebook_mixer[] = { | 14223 | static 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 | ||
14187 | static struct snd_kcontrol_new alc269_laptop_mixer[] = { | 14247 | static 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 | ||
14195 | static struct snd_kcontrol_new alc269vb_laptop_mixer[] = { | 14255 | static 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 | ||
14203 | static struct snd_kcontrol_new alc269_asus_mixer[] = { | 14263 | static 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 */ |
14210 | static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = { | 14270 | static 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 | ||
14218 | static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = { | 14278 | static 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 | ||
14225 | static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = { | 14285 | static 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 | ||
14233 | static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = { | 14293 | static 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 | ||
14243 | static struct hda_verb alc269_quanta_fl1_verbs[] = { | 14303 | static 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 | ||
14253 | static struct hda_verb alc269_lifebook_verbs[] = { | 14313 | static 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 */ |
14268 | static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec) | 14328 | static 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 \ |
14292 | static 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 | ||
14320 | static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec) | 14346 | static 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 | ||
14409 | static 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 | |||
14380 | static void alc269_lifebook_init_hook(struct hda_codec *codec) | 14420 | static 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 | ||
14386 | static struct hda_verb alc269_laptop_dmic_init_verbs[] = { | 14426 | static 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 | ||
14397 | static struct hda_verb alc269_laptop_amic_init_verbs[] = { | 14437 | static 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 | ||
14407 | static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = { | 14447 | static 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 | ||
14418 | static struct hda_verb alc269vb_laptop_amic_init_verbs[] = { | 14458 | static 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 | ||
14429 | static struct hda_verb alc271_acer_dmic_verbs[] = { | 14469 | static 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 */ | ||
14444 | static 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 */ | ||
14461 | static 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 | |||
14474 | static void alc269_laptop_amic_setup(struct hda_codec *codec) | 14483 | static 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 | ||
14522 | static 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 | */ |
14531 | static struct hda_verb alc269_init_verbs[] = { | 14546 | static 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 | ||
14574 | static struct hda_verb alc269vb_init_verbs[] = { | 14589 | static 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 | ||
14632 | static struct hda_pcm_stream alc269_44k_pcm_analog_playback = { | 14647 | static 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 | ||
14645 | static struct hda_pcm_stream alc269_44k_pcm_analog_capture = { | 14660 | static 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 | ||
14800 | static void alc269_toggle_power_output(struct hda_codec *codec, int power_up) | 14814 | static 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 | 14824 | static void alc269_shutup(struct hda_codec *codec) |
14811 | static 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 | ||
14829 | static int alc269_resume(struct hda_codec *codec) | 14835 | static 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, | |||
14864 | static void alc271_fixup_dmic(struct hda_codec *codec, | 14870 | static 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 | ||
14950 | static struct snd_pci_quirk alc269_fixup_tbl[] = { | 14956 | static 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 | ||
14981 | static struct snd_pci_quirk alc269_cfg_tbl[] = { | 14987 | static 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 | ||
15039 | static struct alc_config_preset alc269_presets[] = { | 15045 | static 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 | */ |
15344 | static struct hda_verb alc861_threestack_ch2_init[] = { | 15356 | static 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 | */ |
15363 | static struct hda_verb alc861_threestack_ch6_init[] = { | 15375 | static 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 | ||
15380 | static struct hda_channel_mode alc861_threestack_modes[2] = { | 15392 | static 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 */ |
15385 | static struct hda_verb alc861_uniwill_m31_ch2_init[] = { | 15397 | static 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 */ |
15391 | static struct hda_verb alc861_uniwill_m31_ch4_init[] = { | 15403 | static 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 | ||
15397 | static struct hda_channel_mode alc861_uniwill_m31_modes[2] = { | 15409 | static 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 */ |
15403 | static struct hda_verb alc861_asus_ch2_init[] = { | 15415 | static 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 */ |
15419 | static struct hda_verb alc861_asus_ch6_init[] = { | 15431 | static 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 | ||
15437 | static struct hda_channel_mode alc861_asus_modes[2] = { | 15449 | static 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 | ||
15444 | static struct snd_kcontrol_new alc861_base_mixer[] = { | 15456 | static 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 | ||
15467 | static struct snd_kcontrol_new alc861_3ST_mixer[] = { | 15479 | static 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 | ||
15498 | static struct snd_kcontrol_new alc861_toshiba_mixer[] = { | 15510 | static 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 | ||
15507 | static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = { | 15519 | static 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 | ||
15538 | static struct snd_kcontrol_new alc861_asus_mixer[] = { | 15550 | static 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 */ |
15570 | static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = { | 15582 | static 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 | */ |
15579 | static struct hda_verb alc861_base_init_verbs[] = { | 15591 | static 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 | ||
15645 | static struct hda_verb alc861_threestack_init_verbs[] = { | 15657 | static 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 | ||
15706 | static struct hda_verb alc861_uniwill_m31_init_verbs[] = { | 15718 | static 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 | ||
15768 | static struct hda_verb alc861_asus_init_verbs[] = { | 15780 | static 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 */ |
15834 | static struct hda_verb alc861_asus_laptop_init_verbs[] = { | 15846 | static 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 | */ |
15843 | static struct hda_verb alc861_auto_init_verbs[] = { | 15855 | static 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 | ||
15892 | static struct hda_verb alc861_toshiba_init_verbs[] = { | 15904 | static 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 | ||
15925 | static struct hda_channel_mode alc861_8ch_modes[1] = { | 15937 | static const struct hda_channel_mode alc861_8ch_modes[1] = { |
15926 | { 8, NULL } | 15938 | { 8, NULL } |
15927 | }; | 15939 | }; |
15928 | 15940 | ||
15929 | static hda_nid_t alc861_dac_nids[4] = { | 15941 | static 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 | ||
15934 | static hda_nid_t alc660_dac_nids[3] = { | 15946 | static 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 | ||
15939 | static hda_nid_t alc861_adc_nids[1] = { | 15951 | static const hda_nid_t alc861_adc_nids[1] = { |
15940 | /* ADC0-2 */ | 15952 | /* ADC0-2 */ |
15941 | 0x08, | 15953 | 0x08, |
15942 | }; | 15954 | }; |
15943 | 15955 | ||
15944 | static struct hda_input_mux alc861_capture_source = { | 15956 | static 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 |
16210 | static struct hda_amp_list alc861_loopbacks[] = { | 16229 | static 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 | ||
16235 | static struct snd_pci_quirk alc861_cfg_tbl[] = { | 16254 | static 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 | ||
16259 | static struct alc_config_preset alc861_presets[] = { | 16278 | static 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 | ||
16382 | static struct snd_pci_quirk alc861_fixup_tbl[] = { | 16401 | static 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 | ||
16475 | static hda_nid_t alc861vd_dac_nids[4] = { | 16494 | static 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 | */ |
16487 | static hda_nid_t alc660vd_dac_nids[3] = { | 16506 | static 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 | ||
16492 | static hda_nid_t alc861vd_adc_nids[1] = { | 16511 | static const hda_nid_t alc861vd_adc_nids[1] = { |
16493 | /* ADC0 */ | 16512 | /* ADC0 */ |
16494 | 0x09, | 16513 | 0x09, |
16495 | }; | 16514 | }; |
16496 | 16515 | ||
16497 | static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 }; | 16516 | static 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 */ |
16501 | static struct hda_input_mux alc861vd_capture_source = { | 16520 | static 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 | ||
16511 | static struct hda_input_mux alc861vd_dallas_capture_source = { | 16530 | static 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 | ||
16519 | static struct hda_input_mux alc861vd_hp_capture_source = { | 16538 | static 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 | */ |
16530 | static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = { | 16549 | static 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 | */ |
16537 | static struct hda_verb alc861vd_6stack_ch6_init[] = { | 16556 | static 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 | */ |
16548 | static struct hda_verb alc861vd_6stack_ch8_init[] = { | 16567 | static 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 | ||
16556 | static struct hda_channel_mode alc861vd_6stack_modes[2] = { | 16575 | static 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 | ||
16561 | static struct snd_kcontrol_new alc861vd_chmode_mixer[] = { | 16580 | static 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 | */ |
16575 | static struct snd_kcontrol_new alc861vd_6st_mixer[] = { | 16594 | static 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 | ||
16611 | static struct snd_kcontrol_new alc861vd_3st_mixer[] = { | 16630 | static 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 | ||
16634 | static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = { | 16653 | static 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 | */ |
16658 | static struct snd_kcontrol_new alc861vd_dallas_mixer[] = { | 16677 | static 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 | */ |
16675 | static struct snd_kcontrol_new alc861vd_hp_mixer[] = { | 16694 | static 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 | */ |
16691 | static struct hda_verb alc861vd_volume_init_verbs[] = { | 16710 | static 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 | */ |
16741 | static struct hda_verb alc861vd_3stack_init_verbs[] = { | 16760 | static 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 | */ |
16772 | static struct hda_verb alc861vd_6stack_init_verbs[] = { | 16791 | static 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 | ||
16813 | static struct hda_verb alc861vd_eapd_verbs[] = { | 16832 | static 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 | ||
16818 | static struct hda_verb alc660vd_eapd_verbs[] = { | 16837 | static 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 | ||
16824 | static struct hda_verb alc861vd_lenovo_unsol_verbs[] = { | 16843 | static 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 | ||
16840 | static void alc861vd_lenovo_init_hook(struct hda_codec *codec) | 16861 | static 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 | ||
16859 | static struct hda_verb alc861vd_dallas_verbs[] = { | 16880 | static 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 | ||
16939 | static struct snd_pci_quirk alc861vd_cfg_tbl[] = { | 16962 | static 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 | ||
16958 | static struct alc_config_preset alc861vd_presets[] = { | 16981 | static 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 | ||
17346 | static struct snd_pci_quirk alc861vd_fixup_tbl[] = { | 17376 | static 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 | ||
17451 | static hda_nid_t alc662_dac_nids[4] = { | 17482 | static 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 | ||
17456 | static hda_nid_t alc272_dac_nids[2] = { | 17487 | static const hda_nid_t alc272_dac_nids[2] = { |
17457 | 0x02, 0x03 | 17488 | 0x02, 0x03 |
17458 | }; | 17489 | }; |
17459 | 17490 | ||
17460 | static hda_nid_t alc662_adc_nids[2] = { | 17491 | static const hda_nid_t alc662_adc_nids[2] = { |
17461 | /* ADC1-2 */ | 17492 | /* ADC1-2 */ |
17462 | 0x09, 0x08 | 17493 | 0x09, 0x08 |
17463 | }; | 17494 | }; |
17464 | 17495 | ||
17465 | static hda_nid_t alc272_adc_nids[1] = { | 17496 | static const hda_nid_t alc272_adc_nids[1] = { |
17466 | /* ADC1-2 */ | 17497 | /* ADC1-2 */ |
17467 | 0x08, | 17498 | 0x08, |
17468 | }; | 17499 | }; |
17469 | 17500 | ||
17470 | static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 }; | 17501 | static const hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 }; |
17471 | static hda_nid_t alc272_capsrc_nids[1] = { 0x23 }; | 17502 | static 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 */ |
17476 | static struct hda_input_mux alc662_capture_source = { | 17507 | static 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 | ||
17486 | static struct hda_input_mux alc662_lenovo_101e_capture_source = { | 17517 | static 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 | ||
17494 | static struct hda_input_mux alc663_capture_source = { | 17525 | static 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 */ |
17504 | static struct hda_input_mux alc272_nc10_capture_source = { | 17535 | static 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 | */ |
17530 | static struct hda_channel_mode alc662_3ST_2ch_modes[1] = { | 17561 | static 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 | */ |
17537 | static struct hda_verb alc662_3ST_ch2_init[] = { | 17568 | static 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 | */ |
17548 | static struct hda_verb alc662_3ST_ch6_init[] = { | 17579 | static 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 | ||
17558 | static struct hda_channel_mode alc662_3ST_6ch_modes[2] = { | 17589 | static 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 | */ |
17566 | static struct hda_verb alc662_sixstack_ch6_init[] = { | 17597 | static 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 | */ |
17576 | static struct hda_verb alc662_sixstack_ch8_init[] = { | 17607 | static 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 | ||
17583 | static struct hda_channel_mode alc662_5stack_modes[2] = { | 17614 | static 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 | ||
17592 | static struct snd_kcontrol_new alc662_base_mixer[] = { | 17623 | static 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 | ||
17616 | static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = { | 17647 | static 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 | ||
17631 | static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = { | 17662 | static 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 | ||
17652 | static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = { | 17683 | static 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 | ||
17665 | static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = { | 17696 | static 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 | ||
17679 | static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = { | 17710 | static 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 | ||
17693 | static struct hda_bind_ctls alc663_asus_bind_master_vol = { | 17724 | static 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 | ||
17702 | static struct hda_bind_ctls alc663_asus_one_bind_switch = { | 17733 | static 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 | ||
17711 | static struct snd_kcontrol_new alc663_m51va_mixer[] = { | 17742 | static 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 | ||
17719 | static struct hda_bind_ctls alc663_asus_tree_bind_switch = { | 17750 | static 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 | ||
17729 | static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = { | 17760 | static 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 | ||
17740 | static struct hda_bind_ctls alc663_asus_four_bind_switch = { | 17771 | static 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 | ||
17750 | static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = { | 17781 | static 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 | ||
17760 | static struct snd_kcontrol_new alc662_1bjd_mixer[] = { | 17791 | static 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 | ||
17771 | static struct hda_bind_ctls alc663_asus_two_bind_master_vol = { | 17802 | static 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 | ||
17780 | static struct hda_bind_ctls alc663_asus_two_bind_switch = { | 17811 | static 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 | ||
17789 | static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = { | 17820 | static 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 | ||
17800 | static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = { | 17831 | static 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 | ||
17810 | static struct snd_kcontrol_new alc663_g71v_mixer[] = { | 17841 | static 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 | ||
17824 | static struct snd_kcontrol_new alc663_g50v_mixer[] = { | 17855 | static 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 | ||
17838 | static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = { | 17869 | static 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 | ||
17850 | static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = { | 17881 | static 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 | ||
17859 | static struct snd_kcontrol_new alc663_mode7_mixer[] = { | 17890 | static 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 | ||
17872 | static struct snd_kcontrol_new alc663_mode8_mixer[] = { | 17903 | static 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 | ||
17884 | static struct snd_kcontrol_new alc662_chmode_mixer[] = { | 17915 | static 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 | ||
17895 | static struct hda_verb alc662_init_verbs[] = { | 17926 | static 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 | |||
17948 | static 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 | ||
17958 | static struct hda_verb alc272_init_verbs[] = { | 17975 | static 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 | ||
17970 | static struct hda_verb alc662_sue_init_verbs[] = { | 17982 | static 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 | ||
17976 | static struct hda_verb alc662_eeepc_sue_init_verbs[] = { | 17988 | static 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*/ |
17983 | static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = { | 17995 | static 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 | ||
17989 | static struct hda_verb alc663_m51va_init_verbs[] = { | 18001 | static 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 | ||
18002 | static struct hda_verb alc663_21jd_amic_init_verbs[] = { | 18014 | static 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 | ||
18013 | static struct hda_verb alc662_1bjd_amic_init_verbs[] = { | 18025 | static 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 | ||
18025 | static struct hda_verb alc663_15jd_amic_init_verbs[] = { | 18037 | static 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 | ||
18036 | static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = { | 18048 | static 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 | ||
18052 | static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = { | 18064 | static 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 | ||
18068 | static struct hda_verb alc663_g71v_init_verbs[] = { | 18080 | static 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 | ||
18083 | static struct hda_verb alc663_g50v_init_verbs[] = { | 18095 | static 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 | ||
18093 | static struct hda_verb alc662_ecs_init_verbs[] = { | 18105 | static 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 | ||
18101 | static struct hda_verb alc272_dell_zm1_init_verbs[] = { | 18113 | static 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 | ||
18116 | static struct hda_verb alc272_dell_init_verbs[] = { | 18128 | static 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 | ||
18131 | static struct hda_verb alc663_mode7_init_verbs[] = { | 18143 | static 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 | ||
18150 | static struct hda_verb alc663_mode8_init_verbs[] = { | 18162 | static 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 | ||
18170 | static struct snd_kcontrol_new alc662_auto_capture_mixer[] = { | 18182 | static 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 | ||
18176 | static struct snd_kcontrol_new alc272_auto_capture_mixer[] = { | 18188 | static 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 | ||
18182 | static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec) | 18194 | static 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 | |||
18194 | static 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 | |||
18208 | static 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; |
18218 | static 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 | ||
18227 | static void alc662_eeepc_setup(struct hda_codec *codec) | 18207 | static 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 | ||
18239 | static void alc662_eeepc_inithook(struct hda_codec *codec) | ||
18240 | { | ||
18241 | alc262_hippo_automute(codec); | ||
18242 | alc_mic_automute(codec); | ||
18243 | } | ||
18244 | |||
18245 | static void alc662_eeepc_ep20_setup(struct hda_codec *codec) | 18219 | static 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 | |||
18255 | static 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 | |||
18268 | static 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 | |||
18285 | static 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 | |||
18302 | static 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 | |||
18313 | static 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 | |||
18329 | static 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 | |||
18349 | static 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 | |||
18373 | static 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 | |||
18397 | static 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 | ||
18410 | static void alc663_m51va_setup(struct hda_codec *codec) | 18229 | static 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 | ||
18420 | static 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 | |||
18429 | static void alc663_mode1_setup(struct hda_codec *codec) | 18245 | static 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 ******************************/ |
18442 | static void alc662_mode2_unsol_event(struct hda_codec *codec, | 18261 | static 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 | |||
18457 | static 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 ******************************/ |
18463 | static void alc663_mode3_unsol_event(struct hda_codec *codec, | 18276 | static 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 | |||
18478 | static 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 ******************************/ |
18484 | static void alc663_mode4_unsol_event(struct hda_codec *codec, | 18292 | static 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 | |||
18499 | static 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 ******************************/ |
18505 | static void alc663_mode5_unsol_event(struct hda_codec *codec, | 18310 | static 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 | |||
18520 | static 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 ******************************/ |
18526 | static void alc663_mode6_unsol_event(struct hda_codec *codec, | 18328 | static 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; | |
18541 | static 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 ******************************/ |
18548 | static void alc663_mode7_unsol_event(struct hda_codec *codec, | 18345 | static 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 | |||
18563 | static 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 ******************************/ |
18570 | static void alc663_mode8_unsol_event(struct hda_codec *codec, | 18362 | static 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 | |||
18585 | static void alc663_mode8_inithook(struct hda_codec *codec) | ||
18586 | { | ||
18587 | alc663_two_hp_m8_speaker_automute(codec); | ||
18588 | alc_mic_automute(codec); | ||
18589 | } | ||
18590 | |||
18591 | static 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 | |||
18604 | static 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 | |||
18615 | static 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 | |||
18633 | static 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 | ||
18640 | static void alc663_g50v_unsol_event(struct hda_codec *codec, | 18378 | static 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 | ||
18655 | static void alc663_g50v_inithook(struct hda_codec *codec) | 18397 | static const struct snd_kcontrol_new alc662_ecs_mixer[] = { |
18656 | { | ||
18657 | alc663_m51va_speaker_automute(codec); | ||
18658 | alc_mic_automute(codec); | ||
18659 | } | ||
18660 | |||
18661 | static 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 | ||
18675 | static struct snd_kcontrol_new alc272_nc10_mixer[] = { | 18411 | static 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 | ||
18733 | static struct snd_pci_quirk alc662_cfg_tbl[] = { | 18469 | static 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 | ||
18815 | static struct alc_config_preset alc662_presets[] = { | 18551 | static 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 */ |
19126 | static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid) | 18890 | static 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 */ | ||
18904 | static 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 */ |
19139 | static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin, | 18916 | static 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 */ | ||
18932 | static 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 */ |
19154 | static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin) | 18953 | static 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 | */ | ||
19193 | static 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 | |||
19230 | static 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 | |||
19246 | static 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 | |||
19255 | static 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 | |||
19283 | static 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 | |||
19302 | static 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 | |||
19310 | static 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 | |||
19377 | static int alc662_parse_auto_config(struct hda_codec *codec) | 19343 | static 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 | ||
19511 | static struct snd_pci_quirk alc662_fixup_tbl[] = { | 19472 | static 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 | ||
19619 | static 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 | ||
19664 | static hda_nid_t alc680_dac_nids[3] = { | 19635 | static 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 | ||
19669 | static hda_nid_t alc680_adc_nids[3] = { | 19640 | static 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 | ||
19737 | static struct hda_pcm_stream alc680_pcm_analog_auto_capture = { | 19707 | static 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 | ||
19748 | static struct snd_kcontrol_new alc680_base_mixer[] = { | 19718 | static 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 | ||
19760 | static struct hda_bind_ctls alc680_bind_cap_vol = { | 19730 | static 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 | ||
19770 | static struct hda_bind_ctls alc680_bind_cap_switch = { | 19740 | static 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 | ||
19780 | static struct snd_kcontrol_new alc680_master_capture_mixer[] = { | 19750 | static 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 | */ |
19789 | static struct hda_verb alc680_init_verbs[] = { | 19759 | static 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 | ||
19829 | static void alc680_unsol_event(struct hda_codec *codec, | 19801 | static 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 | ||
19838 | static void alc680_inithook(struct hda_codec *codec) | 19810 | static 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 | ||
20021 | static struct snd_pci_quirk alc680_cfg_tbl[] = { | 19993 | static 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 | ||
20026 | static struct alc_config_preset alc680_presets[] = { | 19998 | static 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 | */ |
20107 | static struct hda_codec_preset snd_hda_preset_realtek[] = { | 20079 | static 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 | ||