Staging: Merge branch 'tidspbridge-for-2.6.39' of git://dev.omapzoom.org/pub/scm...
[deliverable/linux.git] / sound / pci / hda / patch_realtek.c
1 /*
2 * Universal Interface for Intel High Definition Audio Codec
3 *
4 * HD audio interface patch for ALC 260/880/882 codecs
5 *
6 * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
7 * PeiSen Hou <pshou@realtek.com.tw>
8 * Takashi Iwai <tiwai@suse.de>
9 * Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
10 *
11 * This driver is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This driver is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 */
25
26 #include <linux/init.h>
27 #include <linux/delay.h>
28 #include <linux/slab.h>
29 #include <linux/pci.h>
30 #include <sound/core.h>
31 #include <sound/jack.h>
32 #include "hda_codec.h"
33 #include "hda_local.h"
34 #include "hda_beep.h"
35
36 #define ALC880_FRONT_EVENT 0x01
37 #define ALC880_DCVOL_EVENT 0x02
38 #define ALC880_HP_EVENT 0x04
39 #define ALC880_MIC_EVENT 0x08
40
41 /* ALC880 board config type */
42 enum {
43 ALC880_3ST,
44 ALC880_3ST_DIG,
45 ALC880_5ST,
46 ALC880_5ST_DIG,
47 ALC880_W810,
48 ALC880_Z71V,
49 ALC880_6ST,
50 ALC880_6ST_DIG,
51 ALC880_F1734,
52 ALC880_ASUS,
53 ALC880_ASUS_DIG,
54 ALC880_ASUS_W1V,
55 ALC880_ASUS_DIG2,
56 ALC880_FUJITSU,
57 ALC880_UNIWILL_DIG,
58 ALC880_UNIWILL,
59 ALC880_UNIWILL_P53,
60 ALC880_CLEVO,
61 ALC880_TCL_S700,
62 ALC880_LG,
63 ALC880_LG_LW,
64 ALC880_MEDION_RIM,
65 #ifdef CONFIG_SND_DEBUG
66 ALC880_TEST,
67 #endif
68 ALC880_AUTO,
69 ALC880_MODEL_LAST /* last tag */
70 };
71
72 /* ALC260 models */
73 enum {
74 ALC260_BASIC,
75 ALC260_HP,
76 ALC260_HP_DC7600,
77 ALC260_HP_3013,
78 ALC260_FUJITSU_S702X,
79 ALC260_ACER,
80 ALC260_WILL,
81 ALC260_REPLACER_672V,
82 ALC260_FAVORIT100,
83 #ifdef CONFIG_SND_DEBUG
84 ALC260_TEST,
85 #endif
86 ALC260_AUTO,
87 ALC260_MODEL_LAST /* last tag */
88 };
89
90 /* ALC262 models */
91 enum {
92 ALC262_BASIC,
93 ALC262_HIPPO,
94 ALC262_HIPPO_1,
95 ALC262_FUJITSU,
96 ALC262_HP_BPC,
97 ALC262_HP_BPC_D7000_WL,
98 ALC262_HP_BPC_D7000_WF,
99 ALC262_HP_TC_T5735,
100 ALC262_HP_RP5700,
101 ALC262_BENQ_ED8,
102 ALC262_SONY_ASSAMD,
103 ALC262_BENQ_T31,
104 ALC262_ULTRA,
105 ALC262_LENOVO_3000,
106 ALC262_NEC,
107 ALC262_TOSHIBA_S06,
108 ALC262_TOSHIBA_RX1,
109 ALC262_TYAN,
110 ALC262_AUTO,
111 ALC262_MODEL_LAST /* last tag */
112 };
113
114 /* ALC268 models */
115 enum {
116 ALC267_QUANTA_IL1,
117 ALC268_3ST,
118 ALC268_TOSHIBA,
119 ALC268_ACER,
120 ALC268_ACER_DMIC,
121 ALC268_ACER_ASPIRE_ONE,
122 ALC268_DELL,
123 ALC268_ZEPTO,
124 #ifdef CONFIG_SND_DEBUG
125 ALC268_TEST,
126 #endif
127 ALC268_AUTO,
128 ALC268_MODEL_LAST /* last tag */
129 };
130
131 /* ALC269 models */
132 enum {
133 ALC269_BASIC,
134 ALC269_QUANTA_FL1,
135 ALC269_AMIC,
136 ALC269_DMIC,
137 ALC269VB_AMIC,
138 ALC269VB_DMIC,
139 ALC269_FUJITSU,
140 ALC269_LIFEBOOK,
141 ALC271_ACER,
142 ALC269_AUTO,
143 ALC269_MODEL_LAST /* last tag */
144 };
145
146 /* ALC861 models */
147 enum {
148 ALC861_3ST,
149 ALC660_3ST,
150 ALC861_3ST_DIG,
151 ALC861_6ST_DIG,
152 ALC861_UNIWILL_M31,
153 ALC861_TOSHIBA,
154 ALC861_ASUS,
155 ALC861_ASUS_LAPTOP,
156 ALC861_AUTO,
157 ALC861_MODEL_LAST,
158 };
159
160 /* ALC861-VD models */
161 enum {
162 ALC660VD_3ST,
163 ALC660VD_3ST_DIG,
164 ALC660VD_ASUS_V1S,
165 ALC861VD_3ST,
166 ALC861VD_3ST_DIG,
167 ALC861VD_6ST_DIG,
168 ALC861VD_LENOVO,
169 ALC861VD_DALLAS,
170 ALC861VD_HP,
171 ALC861VD_AUTO,
172 ALC861VD_MODEL_LAST,
173 };
174
175 /* ALC662 models */
176 enum {
177 ALC662_3ST_2ch_DIG,
178 ALC662_3ST_6ch_DIG,
179 ALC662_3ST_6ch,
180 ALC662_5ST_DIG,
181 ALC662_LENOVO_101E,
182 ALC662_ASUS_EEEPC_P701,
183 ALC662_ASUS_EEEPC_EP20,
184 ALC663_ASUS_M51VA,
185 ALC663_ASUS_G71V,
186 ALC663_ASUS_H13,
187 ALC663_ASUS_G50V,
188 ALC662_ECS,
189 ALC663_ASUS_MODE1,
190 ALC662_ASUS_MODE2,
191 ALC663_ASUS_MODE3,
192 ALC663_ASUS_MODE4,
193 ALC663_ASUS_MODE5,
194 ALC663_ASUS_MODE6,
195 ALC663_ASUS_MODE7,
196 ALC663_ASUS_MODE8,
197 ALC272_DELL,
198 ALC272_DELL_ZM1,
199 ALC272_SAMSUNG_NC10,
200 ALC662_AUTO,
201 ALC662_MODEL_LAST,
202 };
203
204 /* ALC882 models */
205 enum {
206 ALC882_3ST_DIG,
207 ALC882_6ST_DIG,
208 ALC882_ARIMA,
209 ALC882_W2JC,
210 ALC882_TARGA,
211 ALC882_ASUS_A7J,
212 ALC882_ASUS_A7M,
213 ALC885_MACPRO,
214 ALC885_MBA21,
215 ALC885_MBP3,
216 ALC885_MB5,
217 ALC885_MACMINI3,
218 ALC885_IMAC24,
219 ALC885_IMAC91,
220 ALC883_3ST_2ch_DIG,
221 ALC883_3ST_6ch_DIG,
222 ALC883_3ST_6ch,
223 ALC883_6ST_DIG,
224 ALC883_TARGA_DIG,
225 ALC883_TARGA_2ch_DIG,
226 ALC883_TARGA_8ch_DIG,
227 ALC883_ACER,
228 ALC883_ACER_ASPIRE,
229 ALC888_ACER_ASPIRE_4930G,
230 ALC888_ACER_ASPIRE_6530G,
231 ALC888_ACER_ASPIRE_8930G,
232 ALC888_ACER_ASPIRE_7730G,
233 ALC883_MEDION,
234 ALC883_MEDION_WIM2160,
235 ALC883_LAPTOP_EAPD,
236 ALC883_LENOVO_101E_2ch,
237 ALC883_LENOVO_NB0763,
238 ALC888_LENOVO_MS7195_DIG,
239 ALC888_LENOVO_SKY,
240 ALC883_HAIER_W66,
241 ALC888_3ST_HP,
242 ALC888_6ST_DELL,
243 ALC883_MITAC,
244 ALC883_CLEVO_M540R,
245 ALC883_CLEVO_M720,
246 ALC883_FUJITSU_PI2515,
247 ALC888_FUJITSU_XA3530,
248 ALC883_3ST_6ch_INTEL,
249 ALC889A_INTEL,
250 ALC889_INTEL,
251 ALC888_ASUS_M90V,
252 ALC888_ASUS_EEE1601,
253 ALC889A_MB31,
254 ALC1200_ASUS_P5Q,
255 ALC883_SONY_VAIO_TT,
256 ALC882_AUTO,
257 ALC882_MODEL_LAST,
258 };
259
260 /* ALC680 models */
261 enum {
262 ALC680_BASE,
263 ALC680_AUTO,
264 ALC680_MODEL_LAST,
265 };
266
267 /* for GPIO Poll */
268 #define GPIO_MASK 0x03
269
270 /* extra amp-initialization sequence types */
271 enum {
272 ALC_INIT_NONE,
273 ALC_INIT_DEFAULT,
274 ALC_INIT_GPIO1,
275 ALC_INIT_GPIO2,
276 ALC_INIT_GPIO3,
277 };
278
279 struct alc_mic_route {
280 hda_nid_t pin;
281 unsigned char mux_idx;
282 unsigned char amix_idx;
283 };
284
285 struct alc_jack {
286 hda_nid_t nid;
287 int type;
288 struct snd_jack *jack;
289 };
290
291 #define MUX_IDX_UNDEF ((unsigned char)-1)
292
293 struct alc_customize_define {
294 unsigned int sku_cfg;
295 unsigned char port_connectivity;
296 unsigned char check_sum;
297 unsigned char customization;
298 unsigned char external_amp;
299 unsigned int enable_pcbeep:1;
300 unsigned int platform_type:1;
301 unsigned int swap:1;
302 unsigned int override:1;
303 unsigned int fixup:1; /* Means that this sku is set by driver, not read from hw */
304 };
305
306 struct alc_fixup;
307
308 struct alc_spec {
309 /* codec parameterization */
310 struct snd_kcontrol_new *mixers[5]; /* mixer arrays */
311 unsigned int num_mixers;
312 struct snd_kcontrol_new *cap_mixer; /* capture mixer */
313 unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */
314
315 const struct hda_verb *init_verbs[10]; /* initialization verbs
316 * don't forget NULL
317 * termination!
318 */
319 unsigned int num_init_verbs;
320
321 char stream_name_analog[32]; /* analog PCM stream */
322 struct hda_pcm_stream *stream_analog_playback;
323 struct hda_pcm_stream *stream_analog_capture;
324 struct hda_pcm_stream *stream_analog_alt_playback;
325 struct hda_pcm_stream *stream_analog_alt_capture;
326
327 char stream_name_digital[32]; /* digital PCM stream */
328 struct hda_pcm_stream *stream_digital_playback;
329 struct hda_pcm_stream *stream_digital_capture;
330
331 /* playback */
332 struct hda_multi_out multiout; /* playback set-up
333 * max_channels, dacs must be set
334 * dig_out_nid and hp_nid are optional
335 */
336 hda_nid_t alt_dac_nid;
337 hda_nid_t slave_dig_outs[3]; /* optional - for auto-parsing */
338 int dig_out_type;
339
340 /* capture */
341 unsigned int num_adc_nids;
342 hda_nid_t *adc_nids;
343 hda_nid_t *capsrc_nids;
344 hda_nid_t dig_in_nid; /* digital-in NID; optional */
345
346 /* capture setup for dynamic dual-adc switch */
347 unsigned int cur_adc_idx;
348 hda_nid_t cur_adc;
349 unsigned int cur_adc_stream_tag;
350 unsigned int cur_adc_format;
351
352 /* capture source */
353 unsigned int num_mux_defs;
354 const struct hda_input_mux *input_mux;
355 unsigned int cur_mux[3];
356 struct alc_mic_route ext_mic;
357 struct alc_mic_route int_mic;
358
359 /* channel model */
360 const struct hda_channel_mode *channel_mode;
361 int num_channel_mode;
362 int need_dac_fix;
363 int const_channel_count;
364 int ext_channel_count;
365
366 /* PCM information */
367 struct hda_pcm pcm_rec[3]; /* used in alc_build_pcms() */
368
369 /* jack detection */
370 struct snd_array jacks;
371
372 /* dynamic controls, init_verbs and input_mux */
373 struct auto_pin_cfg autocfg;
374 struct alc_customize_define cdefine;
375 struct snd_array kctls;
376 struct hda_input_mux private_imux[3];
377 hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
378 hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
379 hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
380
381 /* hooks */
382 void (*init_hook)(struct hda_codec *codec);
383 void (*unsol_event)(struct hda_codec *codec, unsigned int res);
384 #ifdef CONFIG_SND_HDA_POWER_SAVE
385 void (*power_hook)(struct hda_codec *codec);
386 #endif
387
388 /* for pin sensing */
389 unsigned int sense_updated: 1;
390 unsigned int jack_present: 1;
391 unsigned int master_sw: 1;
392 unsigned int auto_mic:1;
393
394 /* other flags */
395 unsigned int no_analog :1; /* digital I/O only */
396 unsigned int dual_adc_switch:1; /* switch ADCs (for ALC275) */
397 int init_amp;
398 int codec_variant; /* flag for other variants */
399
400 /* for virtual master */
401 hda_nid_t vmaster_nid;
402 #ifdef CONFIG_SND_HDA_POWER_SAVE
403 struct hda_loopback_check loopback;
404 #endif
405
406 /* for PLL fix */
407 hda_nid_t pll_nid;
408 unsigned int pll_coef_idx, pll_coef_bit;
409
410 /* fix-up list */
411 int fixup_id;
412 const struct alc_fixup *fixup_list;
413 const char *fixup_name;
414 };
415
416 /*
417 * configuration template - to be copied to the spec instance
418 */
419 struct alc_config_preset {
420 struct snd_kcontrol_new *mixers[5]; /* should be identical size
421 * with spec
422 */
423 struct snd_kcontrol_new *cap_mixer; /* capture mixer */
424 const struct hda_verb *init_verbs[5];
425 unsigned int num_dacs;
426 hda_nid_t *dac_nids;
427 hda_nid_t dig_out_nid; /* optional */
428 hda_nid_t hp_nid; /* optional */
429 hda_nid_t *slave_dig_outs;
430 unsigned int num_adc_nids;
431 hda_nid_t *adc_nids;
432 hda_nid_t *capsrc_nids;
433 hda_nid_t dig_in_nid;
434 unsigned int num_channel_mode;
435 const struct hda_channel_mode *channel_mode;
436 int need_dac_fix;
437 int const_channel_count;
438 unsigned int num_mux_defs;
439 const struct hda_input_mux *input_mux;
440 void (*unsol_event)(struct hda_codec *, unsigned int);
441 void (*setup)(struct hda_codec *);
442 void (*init_hook)(struct hda_codec *);
443 #ifdef CONFIG_SND_HDA_POWER_SAVE
444 struct hda_amp_list *loopbacks;
445 void (*power_hook)(struct hda_codec *codec);
446 #endif
447 };
448
449
450 /*
451 * input MUX handling
452 */
453 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
454 struct snd_ctl_elem_info *uinfo)
455 {
456 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
457 struct alc_spec *spec = codec->spec;
458 unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
459 if (mux_idx >= spec->num_mux_defs)
460 mux_idx = 0;
461 if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
462 mux_idx = 0;
463 return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
464 }
465
466 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
467 struct snd_ctl_elem_value *ucontrol)
468 {
469 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
470 struct alc_spec *spec = codec->spec;
471 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
472
473 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
474 return 0;
475 }
476
477 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
478 struct snd_ctl_elem_value *ucontrol)
479 {
480 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
481 struct alc_spec *spec = codec->spec;
482 const struct hda_input_mux *imux;
483 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
484 unsigned int mux_idx;
485 hda_nid_t nid = spec->capsrc_nids ?
486 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
487 unsigned int type;
488
489 mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
490 imux = &spec->input_mux[mux_idx];
491 if (!imux->num_items && mux_idx > 0)
492 imux = &spec->input_mux[0];
493
494 type = get_wcaps_type(get_wcaps(codec, nid));
495 if (type == AC_WID_AUD_MIX) {
496 /* Matrix-mixer style (e.g. ALC882) */
497 unsigned int *cur_val = &spec->cur_mux[adc_idx];
498 unsigned int i, idx;
499
500 idx = ucontrol->value.enumerated.item[0];
501 if (idx >= imux->num_items)
502 idx = imux->num_items - 1;
503 if (*cur_val == idx)
504 return 0;
505 for (i = 0; i < imux->num_items; i++) {
506 unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
507 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
508 imux->items[i].index,
509 HDA_AMP_MUTE, v);
510 }
511 *cur_val = idx;
512 return 1;
513 } else {
514 /* MUX style (e.g. ALC880) */
515 return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
516 &spec->cur_mux[adc_idx]);
517 }
518 }
519
520 /*
521 * channel mode setting
522 */
523 static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
524 struct snd_ctl_elem_info *uinfo)
525 {
526 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
527 struct alc_spec *spec = codec->spec;
528 return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
529 spec->num_channel_mode);
530 }
531
532 static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
533 struct snd_ctl_elem_value *ucontrol)
534 {
535 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
536 struct alc_spec *spec = codec->spec;
537 return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
538 spec->num_channel_mode,
539 spec->ext_channel_count);
540 }
541
542 static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
543 struct snd_ctl_elem_value *ucontrol)
544 {
545 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
546 struct alc_spec *spec = codec->spec;
547 int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
548 spec->num_channel_mode,
549 &spec->ext_channel_count);
550 if (err >= 0 && !spec->const_channel_count) {
551 spec->multiout.max_channels = spec->ext_channel_count;
552 if (spec->need_dac_fix)
553 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
554 }
555 return err;
556 }
557
558 /*
559 * Control the mode of pin widget settings via the mixer. "pc" is used
560 * instead of "%" to avoid consequences of accidently treating the % as
561 * being part of a format specifier. Maximum allowed length of a value is
562 * 63 characters plus NULL terminator.
563 *
564 * Note: some retasking pin complexes seem to ignore requests for input
565 * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
566 * are requested. Therefore order this list so that this behaviour will not
567 * cause problems when mixer clients move through the enum sequentially.
568 * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
569 * March 2006.
570 */
571 static char *alc_pin_mode_names[] = {
572 "Mic 50pc bias", "Mic 80pc bias",
573 "Line in", "Line out", "Headphone out",
574 };
575 static unsigned char alc_pin_mode_values[] = {
576 PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
577 };
578 /* The control can present all 5 options, or it can limit the options based
579 * in the pin being assumed to be exclusively an input or an output pin. In
580 * addition, "input" pins may or may not process the mic bias option
581 * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
582 * accept requests for bias as of chip versions up to March 2006) and/or
583 * wiring in the computer.
584 */
585 #define ALC_PIN_DIR_IN 0x00
586 #define ALC_PIN_DIR_OUT 0x01
587 #define ALC_PIN_DIR_INOUT 0x02
588 #define ALC_PIN_DIR_IN_NOMICBIAS 0x03
589 #define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
590
591 /* Info about the pin modes supported by the different pin direction modes.
592 * For each direction the minimum and maximum values are given.
593 */
594 static signed char alc_pin_mode_dir_info[5][2] = {
595 { 0, 2 }, /* ALC_PIN_DIR_IN */
596 { 3, 4 }, /* ALC_PIN_DIR_OUT */
597 { 0, 4 }, /* ALC_PIN_DIR_INOUT */
598 { 2, 2 }, /* ALC_PIN_DIR_IN_NOMICBIAS */
599 { 2, 4 }, /* ALC_PIN_DIR_INOUT_NOMICBIAS */
600 };
601 #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
602 #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
603 #define alc_pin_mode_n_items(_dir) \
604 (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
605
606 static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
607 struct snd_ctl_elem_info *uinfo)
608 {
609 unsigned int item_num = uinfo->value.enumerated.item;
610 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
611
612 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
613 uinfo->count = 1;
614 uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
615
616 if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
617 item_num = alc_pin_mode_min(dir);
618 strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
619 return 0;
620 }
621
622 static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
623 struct snd_ctl_elem_value *ucontrol)
624 {
625 unsigned int i;
626 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
627 hda_nid_t nid = kcontrol->private_value & 0xffff;
628 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
629 long *valp = ucontrol->value.integer.value;
630 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
631 AC_VERB_GET_PIN_WIDGET_CONTROL,
632 0x00);
633
634 /* Find enumerated value for current pinctl setting */
635 i = alc_pin_mode_min(dir);
636 while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
637 i++;
638 *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
639 return 0;
640 }
641
642 static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
643 struct snd_ctl_elem_value *ucontrol)
644 {
645 signed int change;
646 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
647 hda_nid_t nid = kcontrol->private_value & 0xffff;
648 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
649 long val = *ucontrol->value.integer.value;
650 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
651 AC_VERB_GET_PIN_WIDGET_CONTROL,
652 0x00);
653
654 if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
655 val = alc_pin_mode_min(dir);
656
657 change = pinctl != alc_pin_mode_values[val];
658 if (change) {
659 /* Set pin mode to that requested */
660 snd_hda_codec_write_cache(codec, nid, 0,
661 AC_VERB_SET_PIN_WIDGET_CONTROL,
662 alc_pin_mode_values[val]);
663
664 /* Also enable the retasking pin's input/output as required
665 * for the requested pin mode. Enum values of 2 or less are
666 * input modes.
667 *
668 * Dynamically switching the input/output buffers probably
669 * reduces noise slightly (particularly on input) so we'll
670 * do it. However, having both input and output buffers
671 * enabled simultaneously doesn't seem to be problematic if
672 * this turns out to be necessary in the future.
673 */
674 if (val <= 2) {
675 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
676 HDA_AMP_MUTE, HDA_AMP_MUTE);
677 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
678 HDA_AMP_MUTE, 0);
679 } else {
680 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
681 HDA_AMP_MUTE, HDA_AMP_MUTE);
682 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
683 HDA_AMP_MUTE, 0);
684 }
685 }
686 return change;
687 }
688
689 #define ALC_PIN_MODE(xname, nid, dir) \
690 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
691 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
692 .info = alc_pin_mode_info, \
693 .get = alc_pin_mode_get, \
694 .put = alc_pin_mode_put, \
695 .private_value = nid | (dir<<16) }
696
697 /* A switch control for ALC260 GPIO pins. Multiple GPIOs can be ganged
698 * together using a mask with more than one bit set. This control is
699 * currently used only by the ALC260 test model. At this stage they are not
700 * needed for any "production" models.
701 */
702 #ifdef CONFIG_SND_DEBUG
703 #define alc_gpio_data_info snd_ctl_boolean_mono_info
704
705 static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
706 struct snd_ctl_elem_value *ucontrol)
707 {
708 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
709 hda_nid_t nid = kcontrol->private_value & 0xffff;
710 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
711 long *valp = ucontrol->value.integer.value;
712 unsigned int val = snd_hda_codec_read(codec, nid, 0,
713 AC_VERB_GET_GPIO_DATA, 0x00);
714
715 *valp = (val & mask) != 0;
716 return 0;
717 }
718 static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
719 struct snd_ctl_elem_value *ucontrol)
720 {
721 signed int change;
722 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
723 hda_nid_t nid = kcontrol->private_value & 0xffff;
724 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
725 long val = *ucontrol->value.integer.value;
726 unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
727 AC_VERB_GET_GPIO_DATA,
728 0x00);
729
730 /* Set/unset the masked GPIO bit(s) as needed */
731 change = (val == 0 ? 0 : mask) != (gpio_data & mask);
732 if (val == 0)
733 gpio_data &= ~mask;
734 else
735 gpio_data |= mask;
736 snd_hda_codec_write_cache(codec, nid, 0,
737 AC_VERB_SET_GPIO_DATA, gpio_data);
738
739 return change;
740 }
741 #define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
742 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
743 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
744 .info = alc_gpio_data_info, \
745 .get = alc_gpio_data_get, \
746 .put = alc_gpio_data_put, \
747 .private_value = nid | (mask<<16) }
748 #endif /* CONFIG_SND_DEBUG */
749
750 /* A switch control to allow the enabling of the digital IO pins on the
751 * ALC260. This is incredibly simplistic; the intention of this control is
752 * to provide something in the test model allowing digital outputs to be
753 * identified if present. If models are found which can utilise these
754 * outputs a more complete mixer control can be devised for those models if
755 * necessary.
756 */
757 #ifdef CONFIG_SND_DEBUG
758 #define alc_spdif_ctrl_info snd_ctl_boolean_mono_info
759
760 static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
761 struct snd_ctl_elem_value *ucontrol)
762 {
763 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
764 hda_nid_t nid = kcontrol->private_value & 0xffff;
765 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
766 long *valp = ucontrol->value.integer.value;
767 unsigned int val = snd_hda_codec_read(codec, nid, 0,
768 AC_VERB_GET_DIGI_CONVERT_1, 0x00);
769
770 *valp = (val & mask) != 0;
771 return 0;
772 }
773 static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
774 struct snd_ctl_elem_value *ucontrol)
775 {
776 signed int change;
777 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
778 hda_nid_t nid = kcontrol->private_value & 0xffff;
779 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
780 long val = *ucontrol->value.integer.value;
781 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
782 AC_VERB_GET_DIGI_CONVERT_1,
783 0x00);
784
785 /* Set/unset the masked control bit(s) as needed */
786 change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
787 if (val==0)
788 ctrl_data &= ~mask;
789 else
790 ctrl_data |= mask;
791 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
792 ctrl_data);
793
794 return change;
795 }
796 #define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
797 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
798 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
799 .info = alc_spdif_ctrl_info, \
800 .get = alc_spdif_ctrl_get, \
801 .put = alc_spdif_ctrl_put, \
802 .private_value = nid | (mask<<16) }
803 #endif /* CONFIG_SND_DEBUG */
804
805 /* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
806 * Again, this is only used in the ALC26x test models to help identify when
807 * the EAPD line must be asserted for features to work.
808 */
809 #ifdef CONFIG_SND_DEBUG
810 #define alc_eapd_ctrl_info snd_ctl_boolean_mono_info
811
812 static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
813 struct snd_ctl_elem_value *ucontrol)
814 {
815 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
816 hda_nid_t nid = kcontrol->private_value & 0xffff;
817 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
818 long *valp = ucontrol->value.integer.value;
819 unsigned int val = snd_hda_codec_read(codec, nid, 0,
820 AC_VERB_GET_EAPD_BTLENABLE, 0x00);
821
822 *valp = (val & mask) != 0;
823 return 0;
824 }
825
826 static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
827 struct snd_ctl_elem_value *ucontrol)
828 {
829 int change;
830 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
831 hda_nid_t nid = kcontrol->private_value & 0xffff;
832 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
833 long val = *ucontrol->value.integer.value;
834 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
835 AC_VERB_GET_EAPD_BTLENABLE,
836 0x00);
837
838 /* Set/unset the masked control bit(s) as needed */
839 change = (!val ? 0 : mask) != (ctrl_data & mask);
840 if (!val)
841 ctrl_data &= ~mask;
842 else
843 ctrl_data |= mask;
844 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
845 ctrl_data);
846
847 return change;
848 }
849
850 #define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
851 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
852 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
853 .info = alc_eapd_ctrl_info, \
854 .get = alc_eapd_ctrl_get, \
855 .put = alc_eapd_ctrl_put, \
856 .private_value = nid | (mask<<16) }
857 #endif /* CONFIG_SND_DEBUG */
858
859 /*
860 * set up the input pin config (depending on the given auto-pin type)
861 */
862 static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
863 int auto_pin_type)
864 {
865 unsigned int val = PIN_IN;
866
867 if (auto_pin_type == AUTO_PIN_MIC) {
868 unsigned int pincap;
869 unsigned int oldval;
870 oldval = snd_hda_codec_read(codec, nid, 0,
871 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
872 pincap = snd_hda_query_pin_caps(codec, nid);
873 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
874 /* if the default pin setup is vref50, we give it priority */
875 if ((pincap & AC_PINCAP_VREF_80) && oldval != PIN_VREF50)
876 val = PIN_VREF80;
877 else if (pincap & AC_PINCAP_VREF_50)
878 val = PIN_VREF50;
879 else if (pincap & AC_PINCAP_VREF_100)
880 val = PIN_VREF100;
881 else if (pincap & AC_PINCAP_VREF_GRD)
882 val = PIN_VREFGRD;
883 }
884 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
885 }
886
887 static void alc_fixup_autocfg_pin_nums(struct hda_codec *codec)
888 {
889 struct alc_spec *spec = codec->spec;
890 struct auto_pin_cfg *cfg = &spec->autocfg;
891
892 if (!cfg->line_outs) {
893 while (cfg->line_outs < AUTO_CFG_MAX_OUTS &&
894 cfg->line_out_pins[cfg->line_outs])
895 cfg->line_outs++;
896 }
897 if (!cfg->speaker_outs) {
898 while (cfg->speaker_outs < AUTO_CFG_MAX_OUTS &&
899 cfg->speaker_pins[cfg->speaker_outs])
900 cfg->speaker_outs++;
901 }
902 if (!cfg->hp_outs) {
903 while (cfg->hp_outs < AUTO_CFG_MAX_OUTS &&
904 cfg->hp_pins[cfg->hp_outs])
905 cfg->hp_outs++;
906 }
907 }
908
909 /*
910 */
911 static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
912 {
913 if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
914 return;
915 spec->mixers[spec->num_mixers++] = mix;
916 }
917
918 static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
919 {
920 if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
921 return;
922 spec->init_verbs[spec->num_init_verbs++] = verb;
923 }
924
925 /*
926 * set up from the preset table
927 */
928 static void setup_preset(struct hda_codec *codec,
929 const struct alc_config_preset *preset)
930 {
931 struct alc_spec *spec = codec->spec;
932 int i;
933
934 for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
935 add_mixer(spec, preset->mixers[i]);
936 spec->cap_mixer = preset->cap_mixer;
937 for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
938 i++)
939 add_verb(spec, preset->init_verbs[i]);
940
941 spec->channel_mode = preset->channel_mode;
942 spec->num_channel_mode = preset->num_channel_mode;
943 spec->need_dac_fix = preset->need_dac_fix;
944 spec->const_channel_count = preset->const_channel_count;
945
946 if (preset->const_channel_count)
947 spec->multiout.max_channels = preset->const_channel_count;
948 else
949 spec->multiout.max_channels = spec->channel_mode[0].channels;
950 spec->ext_channel_count = spec->channel_mode[0].channels;
951
952 spec->multiout.num_dacs = preset->num_dacs;
953 spec->multiout.dac_nids = preset->dac_nids;
954 spec->multiout.dig_out_nid = preset->dig_out_nid;
955 spec->multiout.slave_dig_outs = preset->slave_dig_outs;
956 spec->multiout.hp_nid = preset->hp_nid;
957
958 spec->num_mux_defs = preset->num_mux_defs;
959 if (!spec->num_mux_defs)
960 spec->num_mux_defs = 1;
961 spec->input_mux = preset->input_mux;
962
963 spec->num_adc_nids = preset->num_adc_nids;
964 spec->adc_nids = preset->adc_nids;
965 spec->capsrc_nids = preset->capsrc_nids;
966 spec->dig_in_nid = preset->dig_in_nid;
967
968 spec->unsol_event = preset->unsol_event;
969 spec->init_hook = preset->init_hook;
970 #ifdef CONFIG_SND_HDA_POWER_SAVE
971 spec->power_hook = preset->power_hook;
972 spec->loopback.amplist = preset->loopbacks;
973 #endif
974
975 if (preset->setup)
976 preset->setup(codec);
977
978 alc_fixup_autocfg_pin_nums(codec);
979 }
980
981 /* Enable GPIO mask and set output */
982 static struct hda_verb alc_gpio1_init_verbs[] = {
983 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
984 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
985 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
986 { }
987 };
988
989 static struct hda_verb alc_gpio2_init_verbs[] = {
990 {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
991 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
992 {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
993 { }
994 };
995
996 static struct hda_verb alc_gpio3_init_verbs[] = {
997 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
998 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
999 {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
1000 { }
1001 };
1002
1003 /*
1004 * Fix hardware PLL issue
1005 * On some codecs, the analog PLL gating control must be off while
1006 * the default value is 1.
1007 */
1008 static void alc_fix_pll(struct hda_codec *codec)
1009 {
1010 struct alc_spec *spec = codec->spec;
1011 unsigned int val;
1012
1013 if (!spec->pll_nid)
1014 return;
1015 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
1016 spec->pll_coef_idx);
1017 val = snd_hda_codec_read(codec, spec->pll_nid, 0,
1018 AC_VERB_GET_PROC_COEF, 0);
1019 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
1020 spec->pll_coef_idx);
1021 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
1022 val & ~(1 << spec->pll_coef_bit));
1023 }
1024
1025 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
1026 unsigned int coef_idx, unsigned int coef_bit)
1027 {
1028 struct alc_spec *spec = codec->spec;
1029 spec->pll_nid = nid;
1030 spec->pll_coef_idx = coef_idx;
1031 spec->pll_coef_bit = coef_bit;
1032 alc_fix_pll(codec);
1033 }
1034
1035 #ifdef CONFIG_SND_HDA_INPUT_JACK
1036 static void alc_free_jack_priv(struct snd_jack *jack)
1037 {
1038 struct alc_jack *jacks = jack->private_data;
1039 jacks->nid = 0;
1040 jacks->jack = NULL;
1041 }
1042
1043 static int alc_add_jack(struct hda_codec *codec,
1044 hda_nid_t nid, int type)
1045 {
1046 struct alc_spec *spec;
1047 struct alc_jack *jack;
1048 const char *name;
1049 int err;
1050
1051 spec = codec->spec;
1052 snd_array_init(&spec->jacks, sizeof(*jack), 32);
1053 jack = snd_array_new(&spec->jacks);
1054 if (!jack)
1055 return -ENOMEM;
1056
1057 jack->nid = nid;
1058 jack->type = type;
1059 name = (type == SND_JACK_HEADPHONE) ? "Headphone" : "Mic" ;
1060
1061 err = snd_jack_new(codec->bus->card, name, type, &jack->jack);
1062 if (err < 0)
1063 return err;
1064 jack->jack->private_data = jack;
1065 jack->jack->private_free = alc_free_jack_priv;
1066 return 0;
1067 }
1068
1069 static void alc_report_jack(struct hda_codec *codec, hda_nid_t nid)
1070 {
1071 struct alc_spec *spec = codec->spec;
1072 struct alc_jack *jacks = spec->jacks.list;
1073
1074 if (jacks) {
1075 int i;
1076 for (i = 0; i < spec->jacks.used; i++) {
1077 if (jacks->nid == nid) {
1078 unsigned int present;
1079 present = snd_hda_jack_detect(codec, nid);
1080
1081 present = (present) ? jacks->type : 0;
1082
1083 snd_jack_report(jacks->jack, present);
1084 }
1085 jacks++;
1086 }
1087 }
1088 }
1089
1090 static int alc_init_jacks(struct hda_codec *codec)
1091 {
1092 struct alc_spec *spec = codec->spec;
1093 int err;
1094 unsigned int hp_nid = spec->autocfg.hp_pins[0];
1095 unsigned int mic_nid = spec->ext_mic.pin;
1096
1097 if (hp_nid) {
1098 err = alc_add_jack(codec, hp_nid, SND_JACK_HEADPHONE);
1099 if (err < 0)
1100 return err;
1101 alc_report_jack(codec, hp_nid);
1102 }
1103
1104 if (mic_nid) {
1105 err = alc_add_jack(codec, mic_nid, SND_JACK_MICROPHONE);
1106 if (err < 0)
1107 return err;
1108 alc_report_jack(codec, mic_nid);
1109 }
1110
1111 return 0;
1112 }
1113 #else
1114 static inline void alc_report_jack(struct hda_codec *codec, hda_nid_t nid)
1115 {
1116 }
1117
1118 static inline int alc_init_jacks(struct hda_codec *codec)
1119 {
1120 return 0;
1121 }
1122 #endif
1123
1124 static void alc_automute_speaker(struct hda_codec *codec, int pinctl)
1125 {
1126 struct alc_spec *spec = codec->spec;
1127 unsigned int mute;
1128 hda_nid_t nid;
1129 int i;
1130
1131 spec->jack_present = 0;
1132 for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1133 nid = spec->autocfg.hp_pins[i];
1134 if (!nid)
1135 break;
1136 if (snd_hda_jack_detect(codec, nid)) {
1137 spec->jack_present = 1;
1138 break;
1139 }
1140 alc_report_jack(codec, spec->autocfg.hp_pins[i]);
1141 }
1142
1143 mute = spec->jack_present ? HDA_AMP_MUTE : 0;
1144 /* Toggle internal speakers muting */
1145 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1146 nid = spec->autocfg.speaker_pins[i];
1147 if (!nid)
1148 break;
1149 if (pinctl) {
1150 snd_hda_codec_write(codec, nid, 0,
1151 AC_VERB_SET_PIN_WIDGET_CONTROL,
1152 spec->jack_present ? 0 : PIN_OUT);
1153 } else {
1154 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1155 HDA_AMP_MUTE, mute);
1156 }
1157 }
1158 }
1159
1160 static void alc_automute_pin(struct hda_codec *codec)
1161 {
1162 alc_automute_speaker(codec, 1);
1163 }
1164
1165 static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
1166 hda_nid_t nid)
1167 {
1168 hda_nid_t conn[HDA_MAX_NUM_INPUTS];
1169 int i, nums;
1170
1171 nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
1172 for (i = 0; i < nums; i++)
1173 if (conn[i] == nid)
1174 return i;
1175 return -1;
1176 }
1177
1178 /* switch the current ADC according to the jack state */
1179 static void alc_dual_mic_adc_auto_switch(struct hda_codec *codec)
1180 {
1181 struct alc_spec *spec = codec->spec;
1182 unsigned int present;
1183 hda_nid_t new_adc;
1184
1185 present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1186 if (present)
1187 spec->cur_adc_idx = 1;
1188 else
1189 spec->cur_adc_idx = 0;
1190 new_adc = spec->adc_nids[spec->cur_adc_idx];
1191 if (spec->cur_adc && spec->cur_adc != new_adc) {
1192 /* stream is running, let's swap the current ADC */
1193 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
1194 spec->cur_adc = new_adc;
1195 snd_hda_codec_setup_stream(codec, new_adc,
1196 spec->cur_adc_stream_tag, 0,
1197 spec->cur_adc_format);
1198 }
1199 }
1200
1201 static void alc_mic_automute(struct hda_codec *codec)
1202 {
1203 struct alc_spec *spec = codec->spec;
1204 struct alc_mic_route *dead, *alive;
1205 unsigned int present, type;
1206 hda_nid_t cap_nid;
1207
1208 if (!spec->auto_mic)
1209 return;
1210 if (!spec->int_mic.pin || !spec->ext_mic.pin)
1211 return;
1212 if (snd_BUG_ON(!spec->adc_nids))
1213 return;
1214
1215 if (spec->dual_adc_switch) {
1216 alc_dual_mic_adc_auto_switch(codec);
1217 return;
1218 }
1219
1220 cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1221
1222 present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1223 if (present) {
1224 alive = &spec->ext_mic;
1225 dead = &spec->int_mic;
1226 } else {
1227 alive = &spec->int_mic;
1228 dead = &spec->ext_mic;
1229 }
1230
1231 type = get_wcaps_type(get_wcaps(codec, cap_nid));
1232 if (type == AC_WID_AUD_MIX) {
1233 /* Matrix-mixer style (e.g. ALC882) */
1234 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1235 alive->mux_idx,
1236 HDA_AMP_MUTE, 0);
1237 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1238 dead->mux_idx,
1239 HDA_AMP_MUTE, HDA_AMP_MUTE);
1240 } else {
1241 /* MUX style (e.g. ALC880) */
1242 snd_hda_codec_write_cache(codec, cap_nid, 0,
1243 AC_VERB_SET_CONNECT_SEL,
1244 alive->mux_idx);
1245 }
1246 alc_report_jack(codec, spec->ext_mic.pin);
1247
1248 /* FIXME: analog mixer */
1249 }
1250
1251 /* unsolicited event for HP jack sensing */
1252 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1253 {
1254 if (codec->vendor_id == 0x10ec0880)
1255 res >>= 28;
1256 else
1257 res >>= 26;
1258 switch (res) {
1259 case ALC880_HP_EVENT:
1260 alc_automute_pin(codec);
1261 break;
1262 case ALC880_MIC_EVENT:
1263 alc_mic_automute(codec);
1264 break;
1265 }
1266 }
1267
1268 static void alc_inithook(struct hda_codec *codec)
1269 {
1270 alc_automute_pin(codec);
1271 alc_mic_automute(codec);
1272 }
1273
1274 /* additional initialization for ALC888 variants */
1275 static void alc888_coef_init(struct hda_codec *codec)
1276 {
1277 unsigned int tmp;
1278
1279 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1280 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1281 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1282 if ((tmp & 0xf0) == 0x20)
1283 /* alc888S-VC */
1284 snd_hda_codec_read(codec, 0x20, 0,
1285 AC_VERB_SET_PROC_COEF, 0x830);
1286 else
1287 /* alc888-VB */
1288 snd_hda_codec_read(codec, 0x20, 0,
1289 AC_VERB_SET_PROC_COEF, 0x3030);
1290 }
1291
1292 static void alc889_coef_init(struct hda_codec *codec)
1293 {
1294 unsigned int tmp;
1295
1296 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1297 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1298 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1299 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1300 }
1301
1302 /* turn on/off EAPD control (only if available) */
1303 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
1304 {
1305 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
1306 return;
1307 if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
1308 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
1309 on ? 2 : 0);
1310 }
1311
1312 static void alc_auto_init_amp(struct hda_codec *codec, int type)
1313 {
1314 unsigned int tmp;
1315
1316 switch (type) {
1317 case ALC_INIT_GPIO1:
1318 snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1319 break;
1320 case ALC_INIT_GPIO2:
1321 snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1322 break;
1323 case ALC_INIT_GPIO3:
1324 snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1325 break;
1326 case ALC_INIT_DEFAULT:
1327 switch (codec->vendor_id) {
1328 case 0x10ec0260:
1329 set_eapd(codec, 0x0f, 1);
1330 set_eapd(codec, 0x10, 1);
1331 break;
1332 case 0x10ec0262:
1333 case 0x10ec0267:
1334 case 0x10ec0268:
1335 case 0x10ec0269:
1336 case 0x10ec0270:
1337 case 0x10ec0272:
1338 case 0x10ec0660:
1339 case 0x10ec0662:
1340 case 0x10ec0663:
1341 case 0x10ec0862:
1342 case 0x10ec0889:
1343 set_eapd(codec, 0x14, 1);
1344 set_eapd(codec, 0x15, 1);
1345 break;
1346 }
1347 switch (codec->vendor_id) {
1348 case 0x10ec0260:
1349 snd_hda_codec_write(codec, 0x1a, 0,
1350 AC_VERB_SET_COEF_INDEX, 7);
1351 tmp = snd_hda_codec_read(codec, 0x1a, 0,
1352 AC_VERB_GET_PROC_COEF, 0);
1353 snd_hda_codec_write(codec, 0x1a, 0,
1354 AC_VERB_SET_COEF_INDEX, 7);
1355 snd_hda_codec_write(codec, 0x1a, 0,
1356 AC_VERB_SET_PROC_COEF,
1357 tmp | 0x2010);
1358 break;
1359 case 0x10ec0262:
1360 case 0x10ec0880:
1361 case 0x10ec0882:
1362 case 0x10ec0883:
1363 case 0x10ec0885:
1364 case 0x10ec0887:
1365 case 0x10ec0889:
1366 alc889_coef_init(codec);
1367 break;
1368 case 0x10ec0888:
1369 alc888_coef_init(codec);
1370 break;
1371 #if 0 /* XXX: This may cause the silent output on speaker on some machines */
1372 case 0x10ec0267:
1373 case 0x10ec0268:
1374 snd_hda_codec_write(codec, 0x20, 0,
1375 AC_VERB_SET_COEF_INDEX, 7);
1376 tmp = snd_hda_codec_read(codec, 0x20, 0,
1377 AC_VERB_GET_PROC_COEF, 0);
1378 snd_hda_codec_write(codec, 0x20, 0,
1379 AC_VERB_SET_COEF_INDEX, 7);
1380 snd_hda_codec_write(codec, 0x20, 0,
1381 AC_VERB_SET_PROC_COEF,
1382 tmp | 0x3000);
1383 break;
1384 #endif /* XXX */
1385 }
1386 break;
1387 }
1388 }
1389
1390 static void alc_init_auto_hp(struct hda_codec *codec)
1391 {
1392 struct alc_spec *spec = codec->spec;
1393 struct auto_pin_cfg *cfg = &spec->autocfg;
1394 int i;
1395
1396 if (!cfg->hp_pins[0]) {
1397 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1398 return;
1399 }
1400
1401 if (!cfg->speaker_pins[0]) {
1402 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1403 return;
1404 memcpy(cfg->speaker_pins, cfg->line_out_pins,
1405 sizeof(cfg->speaker_pins));
1406 cfg->speaker_outs = cfg->line_outs;
1407 }
1408
1409 if (!cfg->hp_pins[0]) {
1410 memcpy(cfg->hp_pins, cfg->line_out_pins,
1411 sizeof(cfg->hp_pins));
1412 cfg->hp_outs = cfg->line_outs;
1413 }
1414
1415 for (i = 0; i < cfg->hp_outs; i++) {
1416 snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1417 cfg->hp_pins[i]);
1418 snd_hda_codec_write_cache(codec, cfg->hp_pins[i], 0,
1419 AC_VERB_SET_UNSOLICITED_ENABLE,
1420 AC_USRSP_EN | ALC880_HP_EVENT);
1421 }
1422 spec->unsol_event = alc_sku_unsol_event;
1423 }
1424
1425 static void alc_init_auto_mic(struct hda_codec *codec)
1426 {
1427 struct alc_spec *spec = codec->spec;
1428 struct auto_pin_cfg *cfg = &spec->autocfg;
1429 hda_nid_t fixed, ext;
1430 int i;
1431
1432 /* there must be only two mic inputs exclusively */
1433 for (i = 0; i < cfg->num_inputs; i++)
1434 if (cfg->inputs[i].type >= AUTO_PIN_LINE_IN)
1435 return;
1436
1437 fixed = ext = 0;
1438 for (i = 0; i < cfg->num_inputs; i++) {
1439 hda_nid_t nid = cfg->inputs[i].pin;
1440 unsigned int defcfg;
1441 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1442 switch (snd_hda_get_input_pin_attr(defcfg)) {
1443 case INPUT_PIN_ATTR_INT:
1444 if (fixed)
1445 return; /* already occupied */
1446 fixed = nid;
1447 break;
1448 case INPUT_PIN_ATTR_UNUSED:
1449 return; /* invalid entry */
1450 default:
1451 if (ext)
1452 return; /* already occupied */
1453 ext = nid;
1454 break;
1455 }
1456 }
1457 if (!ext || !fixed)
1458 return;
1459 if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1460 return; /* no unsol support */
1461 snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1462 ext, fixed);
1463 spec->ext_mic.pin = ext;
1464 spec->int_mic.pin = fixed;
1465 spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1466 spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1467 spec->auto_mic = 1;
1468 snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1469 AC_VERB_SET_UNSOLICITED_ENABLE,
1470 AC_USRSP_EN | ALC880_MIC_EVENT);
1471 spec->unsol_event = alc_sku_unsol_event;
1472 }
1473
1474 /* Could be any non-zero and even value. When used as fixup, tells
1475 * the driver to ignore any present sku defines.
1476 */
1477 #define ALC_FIXUP_SKU_IGNORE (2)
1478
1479 static int alc_auto_parse_customize_define(struct hda_codec *codec)
1480 {
1481 unsigned int ass, tmp, i;
1482 unsigned nid = 0;
1483 struct alc_spec *spec = codec->spec;
1484
1485 spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
1486
1487 if (spec->cdefine.fixup) {
1488 ass = spec->cdefine.sku_cfg;
1489 if (ass == ALC_FIXUP_SKU_IGNORE)
1490 return -1;
1491 goto do_sku;
1492 }
1493
1494 ass = codec->subsystem_id & 0xffff;
1495 if (ass != codec->bus->pci->subsystem_device && (ass & 1))
1496 goto do_sku;
1497
1498 nid = 0x1d;
1499 if (codec->vendor_id == 0x10ec0260)
1500 nid = 0x17;
1501 ass = snd_hda_codec_get_pincfg(codec, nid);
1502
1503 if (!(ass & 1)) {
1504 printk(KERN_INFO "hda_codec: %s: SKU not ready 0x%08x\n",
1505 codec->chip_name, ass);
1506 return -1;
1507 }
1508
1509 /* check sum */
1510 tmp = 0;
1511 for (i = 1; i < 16; i++) {
1512 if ((ass >> i) & 1)
1513 tmp++;
1514 }
1515 if (((ass >> 16) & 0xf) != tmp)
1516 return -1;
1517
1518 spec->cdefine.port_connectivity = ass >> 30;
1519 spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
1520 spec->cdefine.check_sum = (ass >> 16) & 0xf;
1521 spec->cdefine.customization = ass >> 8;
1522 do_sku:
1523 spec->cdefine.sku_cfg = ass;
1524 spec->cdefine.external_amp = (ass & 0x38) >> 3;
1525 spec->cdefine.platform_type = (ass & 0x4) >> 2;
1526 spec->cdefine.swap = (ass & 0x2) >> 1;
1527 spec->cdefine.override = ass & 0x1;
1528
1529 snd_printd("SKU: Nid=0x%x sku_cfg=0x%08x\n",
1530 nid, spec->cdefine.sku_cfg);
1531 snd_printd("SKU: port_connectivity=0x%x\n",
1532 spec->cdefine.port_connectivity);
1533 snd_printd("SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
1534 snd_printd("SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
1535 snd_printd("SKU: customization=0x%08x\n", spec->cdefine.customization);
1536 snd_printd("SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
1537 snd_printd("SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
1538 snd_printd("SKU: swap=0x%x\n", spec->cdefine.swap);
1539 snd_printd("SKU: override=0x%x\n", spec->cdefine.override);
1540
1541 return 0;
1542 }
1543
1544 /* check subsystem ID and set up device-specific initialization;
1545 * return 1 if initialized, 0 if invalid SSID
1546 */
1547 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1548 * 31 ~ 16 : Manufacture ID
1549 * 15 ~ 8 : SKU ID
1550 * 7 ~ 0 : Assembly ID
1551 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1552 */
1553 static int alc_subsystem_id(struct hda_codec *codec,
1554 hda_nid_t porta, hda_nid_t porte,
1555 hda_nid_t portd, hda_nid_t porti)
1556 {
1557 unsigned int ass, tmp, i;
1558 unsigned nid;
1559 struct alc_spec *spec = codec->spec;
1560
1561 if (spec->cdefine.fixup) {
1562 ass = spec->cdefine.sku_cfg;
1563 if (ass == ALC_FIXUP_SKU_IGNORE)
1564 return 0;
1565 goto do_sku;
1566 }
1567
1568 ass = codec->subsystem_id & 0xffff;
1569 if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1570 goto do_sku;
1571
1572 /* invalid SSID, check the special NID pin defcfg instead */
1573 /*
1574 * 31~30 : port connectivity
1575 * 29~21 : reserve
1576 * 20 : PCBEEP input
1577 * 19~16 : Check sum (15:1)
1578 * 15~1 : Custom
1579 * 0 : override
1580 */
1581 nid = 0x1d;
1582 if (codec->vendor_id == 0x10ec0260)
1583 nid = 0x17;
1584 ass = snd_hda_codec_get_pincfg(codec, nid);
1585 snd_printd("realtek: No valid SSID, "
1586 "checking pincfg 0x%08x for NID 0x%x\n",
1587 ass, nid);
1588 if (!(ass & 1))
1589 return 0;
1590 if ((ass >> 30) != 1) /* no physical connection */
1591 return 0;
1592
1593 /* check sum */
1594 tmp = 0;
1595 for (i = 1; i < 16; i++) {
1596 if ((ass >> i) & 1)
1597 tmp++;
1598 }
1599 if (((ass >> 16) & 0xf) != tmp)
1600 return 0;
1601 do_sku:
1602 snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1603 ass & 0xffff, codec->vendor_id);
1604 /*
1605 * 0 : override
1606 * 1 : Swap Jack
1607 * 2 : 0 --> Desktop, 1 --> Laptop
1608 * 3~5 : External Amplifier control
1609 * 7~6 : Reserved
1610 */
1611 tmp = (ass & 0x38) >> 3; /* external Amp control */
1612 switch (tmp) {
1613 case 1:
1614 spec->init_amp = ALC_INIT_GPIO1;
1615 break;
1616 case 3:
1617 spec->init_amp = ALC_INIT_GPIO2;
1618 break;
1619 case 7:
1620 spec->init_amp = ALC_INIT_GPIO3;
1621 break;
1622 case 5:
1623 default:
1624 spec->init_amp = ALC_INIT_DEFAULT;
1625 break;
1626 }
1627
1628 /* is laptop or Desktop and enable the function "Mute internal speaker
1629 * when the external headphone out jack is plugged"
1630 */
1631 if (!(ass & 0x8000))
1632 return 1;
1633 /*
1634 * 10~8 : Jack location
1635 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1636 * 14~13: Resvered
1637 * 15 : 1 --> enable the function "Mute internal speaker
1638 * when the external headphone out jack is plugged"
1639 */
1640 if (!spec->autocfg.hp_pins[0]) {
1641 hda_nid_t nid;
1642 tmp = (ass >> 11) & 0x3; /* HP to chassis */
1643 if (tmp == 0)
1644 nid = porta;
1645 else if (tmp == 1)
1646 nid = porte;
1647 else if (tmp == 2)
1648 nid = portd;
1649 else if (tmp == 3)
1650 nid = porti;
1651 else
1652 return 1;
1653 for (i = 0; i < spec->autocfg.line_outs; i++)
1654 if (spec->autocfg.line_out_pins[i] == nid)
1655 return 1;
1656 spec->autocfg.hp_pins[0] = nid;
1657 }
1658
1659 alc_init_auto_hp(codec);
1660 alc_init_auto_mic(codec);
1661 return 1;
1662 }
1663
1664 static void alc_ssid_check(struct hda_codec *codec,
1665 hda_nid_t porta, hda_nid_t porte,
1666 hda_nid_t portd, hda_nid_t porti)
1667 {
1668 if (!alc_subsystem_id(codec, porta, porte, portd, porti)) {
1669 struct alc_spec *spec = codec->spec;
1670 snd_printd("realtek: "
1671 "Enable default setup for auto mode as fallback\n");
1672 spec->init_amp = ALC_INIT_DEFAULT;
1673 alc_init_auto_hp(codec);
1674 alc_init_auto_mic(codec);
1675 }
1676 }
1677
1678 /*
1679 * Fix-up pin default configurations and add default verbs
1680 */
1681
1682 struct alc_pincfg {
1683 hda_nid_t nid;
1684 u32 val;
1685 };
1686
1687 struct alc_model_fixup {
1688 const int id;
1689 const char *name;
1690 };
1691
1692 struct alc_fixup {
1693 int type;
1694 bool chained;
1695 int chain_id;
1696 union {
1697 unsigned int sku;
1698 const struct alc_pincfg *pins;
1699 const struct hda_verb *verbs;
1700 void (*func)(struct hda_codec *codec,
1701 const struct alc_fixup *fix,
1702 int action);
1703 } v;
1704 };
1705
1706 enum {
1707 ALC_FIXUP_INVALID,
1708 ALC_FIXUP_SKU,
1709 ALC_FIXUP_PINS,
1710 ALC_FIXUP_VERBS,
1711 ALC_FIXUP_FUNC,
1712 };
1713
1714 enum {
1715 ALC_FIXUP_ACT_PRE_PROBE,
1716 ALC_FIXUP_ACT_PROBE,
1717 ALC_FIXUP_ACT_INIT,
1718 };
1719
1720 static void alc_apply_fixup(struct hda_codec *codec, int action)
1721 {
1722 struct alc_spec *spec = codec->spec;
1723 int id = spec->fixup_id;
1724 #ifdef CONFIG_SND_DEBUG_VERBOSE
1725 const char *modelname = spec->fixup_name;
1726 #endif
1727 int depth = 0;
1728
1729 if (!spec->fixup_list)
1730 return;
1731
1732 while (id >= 0) {
1733 const struct alc_fixup *fix = spec->fixup_list + id;
1734 const struct alc_pincfg *cfg;
1735
1736 switch (fix->type) {
1737 case ALC_FIXUP_SKU:
1738 if (action != ALC_FIXUP_ACT_PRE_PROBE || !fix->v.sku)
1739 break;;
1740 snd_printdd(KERN_INFO "hda_codec: %s: "
1741 "Apply sku override for %s\n",
1742 codec->chip_name, modelname);
1743 spec->cdefine.sku_cfg = fix->v.sku;
1744 spec->cdefine.fixup = 1;
1745 break;
1746 case ALC_FIXUP_PINS:
1747 cfg = fix->v.pins;
1748 if (action != ALC_FIXUP_ACT_PRE_PROBE || !cfg)
1749 break;
1750 snd_printdd(KERN_INFO "hda_codec: %s: "
1751 "Apply pincfg for %s\n",
1752 codec->chip_name, modelname);
1753 for (; cfg->nid; cfg++)
1754 snd_hda_codec_set_pincfg(codec, cfg->nid,
1755 cfg->val);
1756 break;
1757 case ALC_FIXUP_VERBS:
1758 if (action != ALC_FIXUP_ACT_PROBE || !fix->v.verbs)
1759 break;
1760 snd_printdd(KERN_INFO "hda_codec: %s: "
1761 "Apply fix-verbs for %s\n",
1762 codec->chip_name, modelname);
1763 add_verb(codec->spec, fix->v.verbs);
1764 break;
1765 case ALC_FIXUP_FUNC:
1766 if (!fix->v.func)
1767 break;
1768 snd_printdd(KERN_INFO "hda_codec: %s: "
1769 "Apply fix-func for %s\n",
1770 codec->chip_name, modelname);
1771 fix->v.func(codec, fix, action);
1772 break;
1773 default:
1774 snd_printk(KERN_ERR "hda_codec: %s: "
1775 "Invalid fixup type %d\n",
1776 codec->chip_name, fix->type);
1777 break;
1778 }
1779 if (!fix[id].chained)
1780 break;
1781 if (++depth > 10)
1782 break;
1783 id = fix[id].chain_id;
1784 }
1785 }
1786
1787 static void alc_pick_fixup(struct hda_codec *codec,
1788 const struct alc_model_fixup *models,
1789 const struct snd_pci_quirk *quirk,
1790 const struct alc_fixup *fixlist)
1791 {
1792 struct alc_spec *spec = codec->spec;
1793 int id = -1;
1794 const char *name = NULL;
1795
1796 if (codec->modelname && models) {
1797 while (models->name) {
1798 if (!strcmp(codec->modelname, models->name)) {
1799 id = models->id;
1800 name = models->name;
1801 break;
1802 }
1803 models++;
1804 }
1805 }
1806 if (id < 0) {
1807 quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1808 if (quirk) {
1809 id = quirk->value;
1810 #ifdef CONFIG_SND_DEBUG_VERBOSE
1811 name = quirk->name;
1812 #endif
1813 }
1814 }
1815
1816 spec->fixup_id = id;
1817 if (id >= 0) {
1818 spec->fixup_list = fixlist;
1819 spec->fixup_name = name;
1820 }
1821 }
1822
1823 static int alc_read_coef_idx(struct hda_codec *codec,
1824 unsigned int coef_idx)
1825 {
1826 unsigned int val;
1827 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1828 coef_idx);
1829 val = snd_hda_codec_read(codec, 0x20, 0,
1830 AC_VERB_GET_PROC_COEF, 0);
1831 return val;
1832 }
1833
1834 static void alc_write_coef_idx(struct hda_codec *codec, unsigned int coef_idx,
1835 unsigned int coef_val)
1836 {
1837 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1838 coef_idx);
1839 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF,
1840 coef_val);
1841 }
1842
1843 /* set right pin controls for digital I/O */
1844 static void alc_auto_init_digital(struct hda_codec *codec)
1845 {
1846 struct alc_spec *spec = codec->spec;
1847 int i;
1848 hda_nid_t pin;
1849
1850 for (i = 0; i < spec->autocfg.dig_outs; i++) {
1851 pin = spec->autocfg.dig_out_pins[i];
1852 if (pin) {
1853 snd_hda_codec_write(codec, pin, 0,
1854 AC_VERB_SET_PIN_WIDGET_CONTROL,
1855 PIN_OUT);
1856 }
1857 }
1858 pin = spec->autocfg.dig_in_pin;
1859 if (pin)
1860 snd_hda_codec_write(codec, pin, 0,
1861 AC_VERB_SET_PIN_WIDGET_CONTROL,
1862 PIN_IN);
1863 }
1864
1865 /* parse digital I/Os and set up NIDs in BIOS auto-parse mode */
1866 static void alc_auto_parse_digital(struct hda_codec *codec)
1867 {
1868 struct alc_spec *spec = codec->spec;
1869 int i, err;
1870 hda_nid_t dig_nid;
1871
1872 /* support multiple SPDIFs; the secondary is set up as a slave */
1873 for (i = 0; i < spec->autocfg.dig_outs; i++) {
1874 err = snd_hda_get_connections(codec,
1875 spec->autocfg.dig_out_pins[i],
1876 &dig_nid, 1);
1877 if (err < 0)
1878 continue;
1879 if (!i) {
1880 spec->multiout.dig_out_nid = dig_nid;
1881 spec->dig_out_type = spec->autocfg.dig_out_type[0];
1882 } else {
1883 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
1884 if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
1885 break;
1886 spec->slave_dig_outs[i - 1] = dig_nid;
1887 }
1888 }
1889
1890 if (spec->autocfg.dig_in_pin) {
1891 dig_nid = codec->start_nid;
1892 for (i = 0; i < codec->num_nodes; i++, dig_nid++) {
1893 unsigned int wcaps = get_wcaps(codec, dig_nid);
1894 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
1895 continue;
1896 if (!(wcaps & AC_WCAP_DIGITAL))
1897 continue;
1898 if (!(wcaps & AC_WCAP_CONN_LIST))
1899 continue;
1900 err = get_connection_index(codec, dig_nid,
1901 spec->autocfg.dig_in_pin);
1902 if (err >= 0) {
1903 spec->dig_in_nid = dig_nid;
1904 break;
1905 }
1906 }
1907 }
1908 }
1909
1910 /*
1911 * ALC888
1912 */
1913
1914 /*
1915 * 2ch mode
1916 */
1917 static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1918 /* Mic-in jack as mic in */
1919 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1920 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1921 /* Line-in jack as Line in */
1922 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1923 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1924 /* Line-Out as Front */
1925 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1926 { } /* end */
1927 };
1928
1929 /*
1930 * 4ch mode
1931 */
1932 static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1933 /* Mic-in jack as mic in */
1934 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1935 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1936 /* Line-in jack as Surround */
1937 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1938 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1939 /* Line-Out as Front */
1940 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1941 { } /* end */
1942 };
1943
1944 /*
1945 * 6ch mode
1946 */
1947 static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1948 /* Mic-in jack as CLFE */
1949 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1950 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1951 /* Line-in jack as Surround */
1952 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1953 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1954 /* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1955 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1956 { } /* end */
1957 };
1958
1959 /*
1960 * 8ch mode
1961 */
1962 static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1963 /* Mic-in jack as CLFE */
1964 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1965 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1966 /* Line-in jack as Surround */
1967 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1968 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1969 /* Line-Out as Side */
1970 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1971 { } /* end */
1972 };
1973
1974 static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1975 { 2, alc888_4ST_ch2_intel_init },
1976 { 4, alc888_4ST_ch4_intel_init },
1977 { 6, alc888_4ST_ch6_intel_init },
1978 { 8, alc888_4ST_ch8_intel_init },
1979 };
1980
1981 /*
1982 * ALC888 Fujitsu Siemens Amillo xa3530
1983 */
1984
1985 static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1986 /* Front Mic: set to PIN_IN (empty by default) */
1987 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1988 /* Connect Internal HP to Front */
1989 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1990 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1991 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1992 /* Connect Bass HP to Front */
1993 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1994 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1995 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1996 /* Connect Line-Out side jack (SPDIF) to Side */
1997 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1998 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1999 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
2000 /* Connect Mic jack to CLFE */
2001 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2002 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2003 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
2004 /* Connect Line-in jack to Surround */
2005 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2006 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2007 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
2008 /* Connect HP out jack to Front */
2009 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2010 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2011 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
2012 /* Enable unsolicited event for HP jack and Line-out jack */
2013 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
2014 {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
2015 {}
2016 };
2017
2018 static void alc_automute_amp(struct hda_codec *codec)
2019 {
2020 alc_automute_speaker(codec, 0);
2021 }
2022
2023 static void alc_automute_amp_unsol_event(struct hda_codec *codec,
2024 unsigned int res)
2025 {
2026 if (codec->vendor_id == 0x10ec0880)
2027 res >>= 28;
2028 else
2029 res >>= 26;
2030 if (res == ALC880_HP_EVENT)
2031 alc_automute_amp(codec);
2032 }
2033
2034 static void alc889_automute_setup(struct hda_codec *codec)
2035 {
2036 struct alc_spec *spec = codec->spec;
2037
2038 spec->autocfg.hp_pins[0] = 0x15;
2039 spec->autocfg.speaker_pins[0] = 0x14;
2040 spec->autocfg.speaker_pins[1] = 0x16;
2041 spec->autocfg.speaker_pins[2] = 0x17;
2042 spec->autocfg.speaker_pins[3] = 0x19;
2043 spec->autocfg.speaker_pins[4] = 0x1a;
2044 }
2045
2046 static void alc889_intel_init_hook(struct hda_codec *codec)
2047 {
2048 alc889_coef_init(codec);
2049 alc_automute_amp(codec);
2050 }
2051
2052 static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
2053 {
2054 struct alc_spec *spec = codec->spec;
2055
2056 spec->autocfg.hp_pins[0] = 0x17; /* line-out */
2057 spec->autocfg.hp_pins[1] = 0x1b; /* hp */
2058 spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
2059 spec->autocfg.speaker_pins[1] = 0x15; /* bass */
2060 }
2061
2062 /*
2063 * ALC888 Acer Aspire 4930G model
2064 */
2065
2066 static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
2067 /* Front Mic: set to PIN_IN (empty by default) */
2068 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2069 /* Unselect Front Mic by default in input mixer 3 */
2070 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
2071 /* Enable unsolicited event for HP jack */
2072 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
2073 /* Connect Internal HP to front */
2074 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2075 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2076 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
2077 /* Connect HP out to front */
2078 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2079 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2080 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
2081 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
2082 { }
2083 };
2084
2085 /*
2086 * ALC888 Acer Aspire 6530G model
2087 */
2088
2089 static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
2090 /* Route to built-in subwoofer as well as speakers */
2091 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2092 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2093 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2094 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2095 /* Bias voltage on for external mic port */
2096 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
2097 /* Front Mic: set to PIN_IN (empty by default) */
2098 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2099 /* Unselect Front Mic by default in input mixer 3 */
2100 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
2101 /* Enable unsolicited event for HP jack */
2102 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
2103 /* Enable speaker output */
2104 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2105 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2106 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
2107 /* Enable headphone output */
2108 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
2109 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2110 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
2111 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
2112 { }
2113 };
2114
2115 /*
2116 *ALC888 Acer Aspire 7730G model
2117 */
2118
2119 static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
2120 /* Bias voltage on for external mic port */
2121 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
2122 /* Front Mic: set to PIN_IN (empty by default) */
2123 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2124 /* Unselect Front Mic by default in input mixer 3 */
2125 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
2126 /* Enable unsolicited event for HP jack */
2127 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
2128 /* Enable speaker output */
2129 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2130 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2131 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
2132 /* Enable headphone output */
2133 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
2134 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2135 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
2136 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
2137 /*Enable internal subwoofer */
2138 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2139 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2140 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
2141 {0x17, AC_VERB_SET_EAPD_BTLENABLE, 2},
2142 { }
2143 };
2144
2145 /*
2146 * ALC889 Acer Aspire 8930G model
2147 */
2148
2149 static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
2150 /* Front Mic: set to PIN_IN (empty by default) */
2151 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2152 /* Unselect Front Mic by default in input mixer 3 */
2153 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
2154 /* Enable unsolicited event for HP jack */
2155 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
2156 /* Connect Internal Front to Front */
2157 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2158 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2159 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
2160 /* Connect Internal Rear to Rear */
2161 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2162 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2163 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
2164 /* Connect Internal CLFE to CLFE */
2165 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2166 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2167 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
2168 /* Connect HP out to Front */
2169 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
2170 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2171 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
2172 /* Enable all DACs */
2173 /* DAC DISABLE/MUTE 1? */
2174 /* setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
2175 {0x20, AC_VERB_SET_COEF_INDEX, 0x03},
2176 {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
2177 /* DAC DISABLE/MUTE 2? */
2178 /* some bit here disables the other DACs. Init=0x4900 */
2179 {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
2180 {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
2181 /* DMIC fix
2182 * This laptop has a stereo digital microphone. The mics are only 1cm apart
2183 * which makes the stereo useless. However, either the mic or the ALC889
2184 * makes the signal become a difference/sum signal instead of standard
2185 * stereo, which is annoying. So instead we flip this bit which makes the
2186 * codec replicate the sum signal to both channels, turning it into a
2187 * normal mono mic.
2188 */
2189 /* DMIC_CONTROL? Init value = 0x0001 */
2190 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
2191 {0x20, AC_VERB_SET_PROC_COEF, 0x0003},
2192 { }
2193 };
2194
2195 static struct hda_input_mux alc888_2_capture_sources[2] = {
2196 /* Front mic only available on one ADC */
2197 {
2198 .num_items = 4,
2199 .items = {
2200 { "Mic", 0x0 },
2201 { "Line", 0x2 },
2202 { "CD", 0x4 },
2203 { "Front Mic", 0xb },
2204 },
2205 },
2206 {
2207 .num_items = 3,
2208 .items = {
2209 { "Mic", 0x0 },
2210 { "Line", 0x2 },
2211 { "CD", 0x4 },
2212 },
2213 }
2214 };
2215
2216 static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
2217 /* Interal mic only available on one ADC */
2218 {
2219 .num_items = 5,
2220 .items = {
2221 { "Mic", 0x0 },
2222 { "Line In", 0x2 },
2223 { "CD", 0x4 },
2224 { "Input Mix", 0xa },
2225 { "Internal Mic", 0xb },
2226 },
2227 },
2228 {
2229 .num_items = 4,
2230 .items = {
2231 { "Mic", 0x0 },
2232 { "Line In", 0x2 },
2233 { "CD", 0x4 },
2234 { "Input Mix", 0xa },
2235 },
2236 }
2237 };
2238
2239 static struct hda_input_mux alc889_capture_sources[3] = {
2240 /* Digital mic only available on first "ADC" */
2241 {
2242 .num_items = 5,
2243 .items = {
2244 { "Mic", 0x0 },
2245 { "Line", 0x2 },
2246 { "CD", 0x4 },
2247 { "Front Mic", 0xb },
2248 { "Input Mix", 0xa },
2249 },
2250 },
2251 {
2252 .num_items = 4,
2253 .items = {
2254 { "Mic", 0x0 },
2255 { "Line", 0x2 },
2256 { "CD", 0x4 },
2257 { "Input Mix", 0xa },
2258 },
2259 },
2260 {
2261 .num_items = 4,
2262 .items = {
2263 { "Mic", 0x0 },
2264 { "Line", 0x2 },
2265 { "CD", 0x4 },
2266 { "Input Mix", 0xa },
2267 },
2268 }
2269 };
2270
2271 static struct snd_kcontrol_new alc888_base_mixer[] = {
2272 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2273 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2274 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2275 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2276 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
2277 HDA_OUTPUT),
2278 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2279 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2280 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2281 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2282 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2283 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2284 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2285 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2286 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2287 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2288 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
2289 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2290 { } /* end */
2291 };
2292
2293 static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
2294 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2295 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2296 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2297 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2298 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
2299 HDA_OUTPUT),
2300 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2301 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2302 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2303 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2304 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2305 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2306 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
2307 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2308 { } /* end */
2309 };
2310
2311
2312 static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
2313 {
2314 struct alc_spec *spec = codec->spec;
2315
2316 spec->autocfg.hp_pins[0] = 0x15;
2317 spec->autocfg.speaker_pins[0] = 0x14;
2318 spec->autocfg.speaker_pins[1] = 0x16;
2319 spec->autocfg.speaker_pins[2] = 0x17;
2320 }
2321
2322 static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
2323 {
2324 struct alc_spec *spec = codec->spec;
2325
2326 spec->autocfg.hp_pins[0] = 0x15;
2327 spec->autocfg.speaker_pins[0] = 0x14;
2328 spec->autocfg.speaker_pins[1] = 0x16;
2329 spec->autocfg.speaker_pins[2] = 0x17;
2330 }
2331
2332 static void alc888_acer_aspire_7730g_setup(struct hda_codec *codec)
2333 {
2334 struct alc_spec *spec = codec->spec;
2335
2336 spec->autocfg.hp_pins[0] = 0x15;
2337 spec->autocfg.speaker_pins[0] = 0x14;
2338 spec->autocfg.speaker_pins[1] = 0x16;
2339 spec->autocfg.speaker_pins[2] = 0x17;
2340 }
2341
2342 static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
2343 {
2344 struct alc_spec *spec = codec->spec;
2345
2346 spec->autocfg.hp_pins[0] = 0x15;
2347 spec->autocfg.speaker_pins[0] = 0x14;
2348 spec->autocfg.speaker_pins[1] = 0x16;
2349 spec->autocfg.speaker_pins[2] = 0x1b;
2350 }
2351
2352 /*
2353 * ALC880 3-stack model
2354 *
2355 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
2356 * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
2357 * F-Mic = 0x1b, HP = 0x19
2358 */
2359
2360 static hda_nid_t alc880_dac_nids[4] = {
2361 /* front, rear, clfe, rear_surr */
2362 0x02, 0x05, 0x04, 0x03
2363 };
2364
2365 static hda_nid_t alc880_adc_nids[3] = {
2366 /* ADC0-2 */
2367 0x07, 0x08, 0x09,
2368 };
2369
2370 /* The datasheet says the node 0x07 is connected from inputs,
2371 * but it shows zero connection in the real implementation on some devices.
2372 * Note: this is a 915GAV bug, fixed on 915GLV
2373 */
2374 static hda_nid_t alc880_adc_nids_alt[2] = {
2375 /* ADC1-2 */
2376 0x08, 0x09,
2377 };
2378
2379 #define ALC880_DIGOUT_NID 0x06
2380 #define ALC880_DIGIN_NID 0x0a
2381
2382 static struct hda_input_mux alc880_capture_source = {
2383 .num_items = 4,
2384 .items = {
2385 { "Mic", 0x0 },
2386 { "Front Mic", 0x3 },
2387 { "Line", 0x2 },
2388 { "CD", 0x4 },
2389 },
2390 };
2391
2392 /* channel source setting (2/6 channel selection for 3-stack) */
2393 /* 2ch mode */
2394 static struct hda_verb alc880_threestack_ch2_init[] = {
2395 /* set line-in to input, mute it */
2396 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2397 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2398 /* set mic-in to input vref 80%, mute it */
2399 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
2400 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2401 { } /* end */
2402 };
2403
2404 /* 6ch mode */
2405 static struct hda_verb alc880_threestack_ch6_init[] = {
2406 /* set line-in to output, unmute it */
2407 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2408 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2409 /* set mic-in to output, unmute it */
2410 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2411 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2412 { } /* end */
2413 };
2414
2415 static struct hda_channel_mode alc880_threestack_modes[2] = {
2416 { 2, alc880_threestack_ch2_init },
2417 { 6, alc880_threestack_ch6_init },
2418 };
2419
2420 static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
2421 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2422 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2423 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2424 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
2425 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2426 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2427 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2428 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2429 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2430 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2431 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2432 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2433 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2434 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2435 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
2436 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
2437 HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
2438 {
2439 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2440 .name = "Channel Mode",
2441 .info = alc_ch_mode_info,
2442 .get = alc_ch_mode_get,
2443 .put = alc_ch_mode_put,
2444 },
2445 { } /* end */
2446 };
2447
2448 /* capture mixer elements */
2449 static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
2450 struct snd_ctl_elem_info *uinfo)
2451 {
2452 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2453 struct alc_spec *spec = codec->spec;
2454 int err;
2455
2456 mutex_lock(&codec->control_mutex);
2457 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2458 HDA_INPUT);
2459 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
2460 mutex_unlock(&codec->control_mutex);
2461 return err;
2462 }
2463
2464 static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
2465 unsigned int size, unsigned int __user *tlv)
2466 {
2467 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2468 struct alc_spec *spec = codec->spec;
2469 int err;
2470
2471 mutex_lock(&codec->control_mutex);
2472 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2473 HDA_INPUT);
2474 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
2475 mutex_unlock(&codec->control_mutex);
2476 return err;
2477 }
2478
2479 typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
2480 struct snd_ctl_elem_value *ucontrol);
2481
2482 static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
2483 struct snd_ctl_elem_value *ucontrol,
2484 getput_call_t func)
2485 {
2486 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2487 struct alc_spec *spec = codec->spec;
2488 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2489 int err;
2490
2491 mutex_lock(&codec->control_mutex);
2492 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
2493 3, 0, HDA_INPUT);
2494 err = func(kcontrol, ucontrol);
2495 mutex_unlock(&codec->control_mutex);
2496 return err;
2497 }
2498
2499 static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
2500 struct snd_ctl_elem_value *ucontrol)
2501 {
2502 return alc_cap_getput_caller(kcontrol, ucontrol,
2503 snd_hda_mixer_amp_volume_get);
2504 }
2505
2506 static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
2507 struct snd_ctl_elem_value *ucontrol)
2508 {
2509 return alc_cap_getput_caller(kcontrol, ucontrol,
2510 snd_hda_mixer_amp_volume_put);
2511 }
2512
2513 /* capture mixer elements */
2514 #define alc_cap_sw_info snd_ctl_boolean_stereo_info
2515
2516 static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
2517 struct snd_ctl_elem_value *ucontrol)
2518 {
2519 return alc_cap_getput_caller(kcontrol, ucontrol,
2520 snd_hda_mixer_amp_switch_get);
2521 }
2522
2523 static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
2524 struct snd_ctl_elem_value *ucontrol)
2525 {
2526 return alc_cap_getput_caller(kcontrol, ucontrol,
2527 snd_hda_mixer_amp_switch_put);
2528 }
2529
2530 #define _DEFINE_CAPMIX(num) \
2531 { \
2532 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2533 .name = "Capture Switch", \
2534 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
2535 .count = num, \
2536 .info = alc_cap_sw_info, \
2537 .get = alc_cap_sw_get, \
2538 .put = alc_cap_sw_put, \
2539 }, \
2540 { \
2541 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2542 .name = "Capture Volume", \
2543 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2544 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2545 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
2546 .count = num, \
2547 .info = alc_cap_vol_info, \
2548 .get = alc_cap_vol_get, \
2549 .put = alc_cap_vol_put, \
2550 .tlv = { .c = alc_cap_vol_tlv }, \
2551 }
2552
2553 #define _DEFINE_CAPSRC(num) \
2554 { \
2555 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2556 /* .name = "Capture Source", */ \
2557 .name = "Input Source", \
2558 .count = num, \
2559 .info = alc_mux_enum_info, \
2560 .get = alc_mux_enum_get, \
2561 .put = alc_mux_enum_put, \
2562 }
2563
2564 #define DEFINE_CAPMIX(num) \
2565 static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2566 _DEFINE_CAPMIX(num), \
2567 _DEFINE_CAPSRC(num), \
2568 { } /* end */ \
2569 }
2570
2571 #define DEFINE_CAPMIX_NOSRC(num) \
2572 static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2573 _DEFINE_CAPMIX(num), \
2574 { } /* end */ \
2575 }
2576
2577 /* up to three ADCs */
2578 DEFINE_CAPMIX(1);
2579 DEFINE_CAPMIX(2);
2580 DEFINE_CAPMIX(3);
2581 DEFINE_CAPMIX_NOSRC(1);
2582 DEFINE_CAPMIX_NOSRC(2);
2583 DEFINE_CAPMIX_NOSRC(3);
2584
2585 /*
2586 * ALC880 5-stack model
2587 *
2588 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2589 * Side = 0x02 (0xd)
2590 * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2591 * Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2592 */
2593
2594 /* additional mixers to alc880_three_stack_mixer */
2595 static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2596 HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2597 HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
2598 { } /* end */
2599 };
2600
2601 /* channel source setting (6/8 channel selection for 5-stack) */
2602 /* 6ch mode */
2603 static struct hda_verb alc880_fivestack_ch6_init[] = {
2604 /* set line-in to input, mute it */
2605 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2606 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2607 { } /* end */
2608 };
2609
2610 /* 8ch mode */
2611 static struct hda_verb alc880_fivestack_ch8_init[] = {
2612 /* set line-in to output, unmute it */
2613 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2614 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2615 { } /* end */
2616 };
2617
2618 static struct hda_channel_mode alc880_fivestack_modes[2] = {
2619 { 6, alc880_fivestack_ch6_init },
2620 { 8, alc880_fivestack_ch8_init },
2621 };
2622
2623
2624 /*
2625 * ALC880 6-stack model
2626 *
2627 * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2628 * Side = 0x05 (0x0f)
2629 * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2630 * Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2631 */
2632
2633 static hda_nid_t alc880_6st_dac_nids[4] = {
2634 /* front, rear, clfe, rear_surr */
2635 0x02, 0x03, 0x04, 0x05
2636 };
2637
2638 static struct hda_input_mux alc880_6stack_capture_source = {
2639 .num_items = 4,
2640 .items = {
2641 { "Mic", 0x0 },
2642 { "Front Mic", 0x1 },
2643 { "Line", 0x2 },
2644 { "CD", 0x4 },
2645 },
2646 };
2647
2648 /* fixed 8-channels */
2649 static struct hda_channel_mode alc880_sixstack_modes[1] = {
2650 { 8, NULL },
2651 };
2652
2653 static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2654 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2655 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2656 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2657 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2658 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2659 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2660 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2661 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2662 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2663 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2664 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2665 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2666 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2667 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2668 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2669 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2670 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2671 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2672 {
2673 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2674 .name = "Channel Mode",
2675 .info = alc_ch_mode_info,
2676 .get = alc_ch_mode_get,
2677 .put = alc_ch_mode_put,
2678 },
2679 { } /* end */
2680 };
2681
2682
2683 /*
2684 * ALC880 W810 model
2685 *
2686 * W810 has rear IO for:
2687 * Front (DAC 02)
2688 * Surround (DAC 03)
2689 * Center/LFE (DAC 04)
2690 * Digital out (06)
2691 *
2692 * The system also has a pair of internal speakers, and a headphone jack.
2693 * These are both connected to Line2 on the codec, hence to DAC 02.
2694 *
2695 * There is a variable resistor to control the speaker or headphone
2696 * volume. This is a hardware-only device without a software API.
2697 *
2698 * Plugging headphones in will disable the internal speakers. This is
2699 * implemented in hardware, not via the driver using jack sense. In
2700 * a similar fashion, plugging into the rear socket marked "front" will
2701 * disable both the speakers and headphones.
2702 *
2703 * For input, there's a microphone jack, and an "audio in" jack.
2704 * These may not do anything useful with this driver yet, because I
2705 * haven't setup any initialization verbs for these yet...
2706 */
2707
2708 static hda_nid_t alc880_w810_dac_nids[3] = {
2709 /* front, rear/surround, clfe */
2710 0x02, 0x03, 0x04
2711 };
2712
2713 /* fixed 6 channels */
2714 static struct hda_channel_mode alc880_w810_modes[1] = {
2715 { 6, NULL }
2716 };
2717
2718 /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
2719 static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2720 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2721 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2722 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2723 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2724 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2725 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2726 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2727 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2728 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2729 { } /* end */
2730 };
2731
2732
2733 /*
2734 * Z710V model
2735 *
2736 * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
2737 * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2738 * Line = 0x1a
2739 */
2740
2741 static hda_nid_t alc880_z71v_dac_nids[1] = {
2742 0x02
2743 };
2744 #define ALC880_Z71V_HP_DAC 0x03
2745
2746 /* fixed 2 channels */
2747 static struct hda_channel_mode alc880_2_jack_modes[1] = {
2748 { 2, NULL }
2749 };
2750
2751 static struct snd_kcontrol_new alc880_z71v_mixer[] = {
2752 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2753 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2754 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2755 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
2756 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2757 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2758 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2759 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2760 { } /* end */
2761 };
2762
2763
2764 /*
2765 * ALC880 F1734 model
2766 *
2767 * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2768 * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2769 */
2770
2771 static hda_nid_t alc880_f1734_dac_nids[1] = {
2772 0x03
2773 };
2774 #define ALC880_F1734_HP_DAC 0x02
2775
2776 static struct snd_kcontrol_new alc880_f1734_mixer[] = {
2777 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2778 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2779 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2780 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2781 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2782 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2783 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2784 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2785 { } /* end */
2786 };
2787
2788 static struct hda_input_mux alc880_f1734_capture_source = {
2789 .num_items = 2,
2790 .items = {
2791 { "Mic", 0x1 },
2792 { "CD", 0x4 },
2793 },
2794 };
2795
2796
2797 /*
2798 * ALC880 ASUS model
2799 *
2800 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2801 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2802 * Mic = 0x18, Line = 0x1a
2803 */
2804
2805 #define alc880_asus_dac_nids alc880_w810_dac_nids /* identical with w810 */
2806 #define alc880_asus_modes alc880_threestack_modes /* 2/6 channel mode */
2807
2808 static struct snd_kcontrol_new alc880_asus_mixer[] = {
2809 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2810 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2811 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2812 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2813 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2814 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2815 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2816 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2817 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2818 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2819 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2820 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2821 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2822 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2823 {
2824 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2825 .name = "Channel Mode",
2826 .info = alc_ch_mode_info,
2827 .get = alc_ch_mode_get,
2828 .put = alc_ch_mode_put,
2829 },
2830 { } /* end */
2831 };
2832
2833 /*
2834 * ALC880 ASUS W1V model
2835 *
2836 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2837 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2838 * Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2839 */
2840
2841 /* additional mixers to alc880_asus_mixer */
2842 static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
2843 HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2844 HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2845 { } /* end */
2846 };
2847
2848 /* TCL S700 */
2849 static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2850 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2851 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2852 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2853 HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
2854 HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
2855 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2856 HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2857 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2858 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
2859 { } /* end */
2860 };
2861
2862 /* Uniwill */
2863 static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2864 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2865 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2866 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2867 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2868 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2869 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2870 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2871 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2872 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2873 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2874 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2875 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2876 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2877 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2878 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2879 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2880 {
2881 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2882 .name = "Channel Mode",
2883 .info = alc_ch_mode_info,
2884 .get = alc_ch_mode_get,
2885 .put = alc_ch_mode_put,
2886 },
2887 { } /* end */
2888 };
2889
2890 static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2891 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2892 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2893 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2894 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2895 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2896 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2897 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2898 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2899 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2900 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2901 { } /* end */
2902 };
2903
2904 static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2905 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2906 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2907 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2908 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2909 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2910 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2911 { } /* end */
2912 };
2913
2914 /*
2915 * virtual master controls
2916 */
2917
2918 /*
2919 * slave controls for virtual master
2920 */
2921 static const char * const alc_slave_vols[] = {
2922 "Front Playback Volume",
2923 "Surround Playback Volume",
2924 "Center Playback Volume",
2925 "LFE Playback Volume",
2926 "Side Playback Volume",
2927 "Headphone Playback Volume",
2928 "Speaker Playback Volume",
2929 "Mono Playback Volume",
2930 "Line-Out Playback Volume",
2931 "PCM Playback Volume",
2932 NULL,
2933 };
2934
2935 static const char * const alc_slave_sws[] = {
2936 "Front Playback Switch",
2937 "Surround Playback Switch",
2938 "Center Playback Switch",
2939 "LFE Playback Switch",
2940 "Side Playback Switch",
2941 "Headphone Playback Switch",
2942 "Speaker Playback Switch",
2943 "Mono Playback Switch",
2944 "IEC958 Playback Switch",
2945 "Line-Out Playback Switch",
2946 "PCM Playback Switch",
2947 NULL,
2948 };
2949
2950 /*
2951 * build control elements
2952 */
2953
2954 #define NID_MAPPING (-1)
2955
2956 #define SUBDEV_SPEAKER_ (0 << 6)
2957 #define SUBDEV_HP_ (1 << 6)
2958 #define SUBDEV_LINE_ (2 << 6)
2959 #define SUBDEV_SPEAKER(x) (SUBDEV_SPEAKER_ | ((x) & 0x3f))
2960 #define SUBDEV_HP(x) (SUBDEV_HP_ | ((x) & 0x3f))
2961 #define SUBDEV_LINE(x) (SUBDEV_LINE_ | ((x) & 0x3f))
2962
2963 static void alc_free_kctls(struct hda_codec *codec);
2964
2965 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2966 /* additional beep mixers; the actual parameters are overwritten at build */
2967 static struct snd_kcontrol_new alc_beep_mixer[] = {
2968 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
2969 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
2970 { } /* end */
2971 };
2972 #endif
2973
2974 static int alc_build_controls(struct hda_codec *codec)
2975 {
2976 struct alc_spec *spec = codec->spec;
2977 struct snd_kcontrol *kctl = NULL;
2978 struct snd_kcontrol_new *knew;
2979 int i, j, err;
2980 unsigned int u;
2981 hda_nid_t nid;
2982
2983 for (i = 0; i < spec->num_mixers; i++) {
2984 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2985 if (err < 0)
2986 return err;
2987 }
2988 if (spec->cap_mixer) {
2989 err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2990 if (err < 0)
2991 return err;
2992 }
2993 if (spec->multiout.dig_out_nid) {
2994 err = snd_hda_create_spdif_out_ctls(codec,
2995 spec->multiout.dig_out_nid);
2996 if (err < 0)
2997 return err;
2998 if (!spec->no_analog) {
2999 err = snd_hda_create_spdif_share_sw(codec,
3000 &spec->multiout);
3001 if (err < 0)
3002 return err;
3003 spec->multiout.share_spdif = 1;
3004 }
3005 }
3006 if (spec->dig_in_nid) {
3007 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
3008 if (err < 0)
3009 return err;
3010 }
3011
3012 #ifdef CONFIG_SND_HDA_INPUT_BEEP
3013 /* create beep controls if needed */
3014 if (spec->beep_amp) {
3015 struct snd_kcontrol_new *knew;
3016 for (knew = alc_beep_mixer; knew->name; knew++) {
3017 struct snd_kcontrol *kctl;
3018 kctl = snd_ctl_new1(knew, codec);
3019 if (!kctl)
3020 return -ENOMEM;
3021 kctl->private_value = spec->beep_amp;
3022 err = snd_hda_ctl_add(codec, 0, kctl);
3023 if (err < 0)
3024 return err;
3025 }
3026 }
3027 #endif
3028
3029 /* if we have no master control, let's create it */
3030 if (!spec->no_analog &&
3031 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
3032 unsigned int vmaster_tlv[4];
3033 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
3034 HDA_OUTPUT, vmaster_tlv);
3035 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
3036 vmaster_tlv, alc_slave_vols);
3037 if (err < 0)
3038 return err;
3039 }
3040 if (!spec->no_analog &&
3041 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
3042 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
3043 NULL, alc_slave_sws);
3044 if (err < 0)
3045 return err;
3046 }
3047
3048 /* assign Capture Source enums to NID */
3049 if (spec->capsrc_nids || spec->adc_nids) {
3050 kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
3051 if (!kctl)
3052 kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
3053 for (i = 0; kctl && i < kctl->count; i++) {
3054 hda_nid_t *nids = spec->capsrc_nids;
3055 if (!nids)
3056 nids = spec->adc_nids;
3057 err = snd_hda_add_nid(codec, kctl, i, nids[i]);
3058 if (err < 0)
3059 return err;
3060 }
3061 }
3062 if (spec->cap_mixer) {
3063 const char *kname = kctl ? kctl->id.name : NULL;
3064 for (knew = spec->cap_mixer; knew->name; knew++) {
3065 if (kname && strcmp(knew->name, kname) == 0)
3066 continue;
3067 kctl = snd_hda_find_mixer_ctl(codec, knew->name);
3068 for (i = 0; kctl && i < kctl->count; i++) {
3069 err = snd_hda_add_nid(codec, kctl, i,
3070 spec->adc_nids[i]);
3071 if (err < 0)
3072 return err;
3073 }
3074 }
3075 }
3076
3077 /* other nid->control mapping */
3078 for (i = 0; i < spec->num_mixers; i++) {
3079 for (knew = spec->mixers[i]; knew->name; knew++) {
3080 if (knew->iface != NID_MAPPING)
3081 continue;
3082 kctl = snd_hda_find_mixer_ctl(codec, knew->name);
3083 if (kctl == NULL)
3084 continue;
3085 u = knew->subdevice;
3086 for (j = 0; j < 4; j++, u >>= 8) {
3087 nid = u & 0x3f;
3088 if (nid == 0)
3089 continue;
3090 switch (u & 0xc0) {
3091 case SUBDEV_SPEAKER_:
3092 nid = spec->autocfg.speaker_pins[nid];
3093 break;
3094 case SUBDEV_LINE_:
3095 nid = spec->autocfg.line_out_pins[nid];
3096 break;
3097 case SUBDEV_HP_:
3098 nid = spec->autocfg.hp_pins[nid];
3099 break;
3100 default:
3101 continue;
3102 }
3103 err = snd_hda_add_nid(codec, kctl, 0, nid);
3104 if (err < 0)
3105 return err;
3106 }
3107 u = knew->private_value;
3108 for (j = 0; j < 4; j++, u >>= 8) {
3109 nid = u & 0xff;
3110 if (nid == 0)
3111 continue;
3112 err = snd_hda_add_nid(codec, kctl, 0, nid);
3113 if (err < 0)
3114 return err;
3115 }
3116 }
3117 }
3118
3119 alc_free_kctls(codec); /* no longer needed */
3120
3121 return 0;
3122 }
3123
3124
3125 /*
3126 * initialize the codec volumes, etc
3127 */
3128
3129 /*
3130 * generic initialization of ADC, input mixers and output mixers
3131 */
3132 static struct hda_verb alc880_volume_init_verbs[] = {
3133 /*
3134 * Unmute ADC0-2 and set the default input to mic-in
3135 */
3136 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
3137 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3138 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
3139 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3140 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
3141 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3142
3143 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
3144 * mixer widget
3145 * Note: PASD motherboards uses the Line In 2 as the input for front
3146 * panel mic (mic 2)
3147 */
3148 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
3149 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3150 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3151 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
3152 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
3153 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
3154 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3155 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3156
3157 /*
3158 * Set up output mixers (0x0c - 0x0f)
3159 */
3160 /* set vol=0 to output mixers */
3161 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3162 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3163 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3164 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3165 /* set up input amps for analog loopback */
3166 /* Amp Indices: DAC = 0, mixer = 1 */
3167 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3168 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3169 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3170 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3171 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3172 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3173 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3174 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3175
3176 { }
3177 };
3178
3179 /*
3180 * 3-stack pin configuration:
3181 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
3182 */
3183 static struct hda_verb alc880_pin_3stack_init_verbs[] = {
3184 /*
3185 * preset connection lists of input pins
3186 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
3187 */
3188 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3189 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3190 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3191
3192 /*
3193 * Set pin mode and muting
3194 */
3195 /* set front pin widgets 0x14 for output */
3196 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3197 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3198 /* Mic1 (rear panel) pin widget for input and vref at 80% */
3199 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3200 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3201 /* Mic2 (as headphone out) for HP output */
3202 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3203 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3204 /* Line In pin widget for input */
3205 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3206 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3207 /* Line2 (as front mic) pin widget for input and vref at 80% */
3208 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3209 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3210 /* CD pin widget for input */
3211 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3212
3213 { }
3214 };
3215
3216 /*
3217 * 5-stack pin configuration:
3218 * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
3219 * line-in/side = 0x1a, f-mic = 0x1b
3220 */
3221 static struct hda_verb alc880_pin_5stack_init_verbs[] = {
3222 /*
3223 * preset connection lists of input pins
3224 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
3225 */
3226 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3227 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
3228
3229 /*
3230 * Set pin mode and muting
3231 */
3232 /* set pin widgets 0x14-0x17 for output */
3233 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3234 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3235 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3236 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3237 /* unmute pins for output (no gain on this amp) */
3238 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3239 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3240 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3241 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3242
3243 /* Mic1 (rear panel) pin widget for input and vref at 80% */
3244 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3245 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3246 /* Mic2 (as headphone out) for HP output */
3247 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3248 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3249 /* Line In pin widget for input */
3250 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3251 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3252 /* Line2 (as front mic) pin widget for input and vref at 80% */
3253 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3254 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3255 /* CD pin widget for input */
3256 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3257
3258 { }
3259 };
3260
3261 /*
3262 * W810 pin configuration:
3263 * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
3264 */
3265 static struct hda_verb alc880_pin_w810_init_verbs[] = {
3266 /* hphone/speaker input selector: front DAC */
3267 {0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
3268
3269 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3270 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3271 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3272 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3273 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3274 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3275
3276 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3277 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3278
3279 { }
3280 };
3281
3282 /*
3283 * Z71V pin configuration:
3284 * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
3285 */
3286 static struct hda_verb alc880_pin_z71v_init_verbs[] = {
3287 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3288 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3289 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3290 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3291
3292 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3293 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3294 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3295 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3296
3297 { }
3298 };
3299
3300 /*
3301 * 6-stack pin configuration:
3302 * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
3303 * f-mic = 0x19, line = 0x1a, HP = 0x1b
3304 */
3305 static struct hda_verb alc880_pin_6stack_init_verbs[] = {
3306 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3307
3308 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3309 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3310 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3311 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3312 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3313 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3314 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3315 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3316
3317 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3318 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3319 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3320 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3321 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3322 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3323 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3324 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3325 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3326
3327 { }
3328 };
3329
3330 /*
3331 * Uniwill pin configuration:
3332 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
3333 * line = 0x1a
3334 */
3335 static struct hda_verb alc880_uniwill_init_verbs[] = {
3336 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3337
3338 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3339 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3340 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3341 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3342 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3343 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3344 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3345 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3346 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3347 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3348 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3349 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3350 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3351 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3352
3353 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3354 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3355 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3356 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3357 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3358 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3359 /* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
3360 /* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
3361 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3362
3363 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3364 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
3365
3366 { }
3367 };
3368
3369 /*
3370 * Uniwill P53
3371 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
3372 */
3373 static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
3374 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3375
3376 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3377 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3378 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3379 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3380 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3381 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3382 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3383 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3384 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3385 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3386 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3387 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3388
3389 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3390 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3391 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3392 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3393 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3394 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3395
3396 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3397 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
3398
3399 { }
3400 };
3401
3402 static struct hda_verb alc880_beep_init_verbs[] = {
3403 { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
3404 { }
3405 };
3406
3407 /* auto-toggle front mic */
3408 static void alc88x_simple_mic_automute(struct hda_codec *codec)
3409 {
3410 unsigned int present;
3411 unsigned char bits;
3412
3413 present = snd_hda_jack_detect(codec, 0x18);
3414 bits = present ? HDA_AMP_MUTE : 0;
3415 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
3416 }
3417
3418 static void alc880_uniwill_setup(struct hda_codec *codec)
3419 {
3420 struct alc_spec *spec = codec->spec;
3421
3422 spec->autocfg.hp_pins[0] = 0x14;
3423 spec->autocfg.speaker_pins[0] = 0x15;
3424 spec->autocfg.speaker_pins[0] = 0x16;
3425 }
3426
3427 static void alc880_uniwill_init_hook(struct hda_codec *codec)
3428 {
3429 alc_automute_amp(codec);
3430 alc88x_simple_mic_automute(codec);
3431 }
3432
3433 static void alc880_uniwill_unsol_event(struct hda_codec *codec,
3434 unsigned int res)
3435 {
3436 /* Looks like the unsol event is incompatible with the standard
3437 * definition. 4bit tag is placed at 28 bit!
3438 */
3439 switch (res >> 28) {
3440 case ALC880_MIC_EVENT:
3441 alc88x_simple_mic_automute(codec);
3442 break;
3443 default:
3444 alc_automute_amp_unsol_event(codec, res);
3445 break;
3446 }
3447 }
3448
3449 static void alc880_uniwill_p53_setup(struct hda_codec *codec)
3450 {
3451 struct alc_spec *spec = codec->spec;
3452
3453 spec->autocfg.hp_pins[0] = 0x14;
3454 spec->autocfg.speaker_pins[0] = 0x15;
3455 }
3456
3457 static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
3458 {
3459 unsigned int present;
3460
3461 present = snd_hda_codec_read(codec, 0x21, 0,
3462 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
3463 present &= HDA_AMP_VOLMASK;
3464 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
3465 HDA_AMP_VOLMASK, present);
3466 snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
3467 HDA_AMP_VOLMASK, present);
3468 }
3469
3470 static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
3471 unsigned int res)
3472 {
3473 /* Looks like the unsol event is incompatible with the standard
3474 * definition. 4bit tag is placed at 28 bit!
3475 */
3476 if ((res >> 28) == ALC880_DCVOL_EVENT)
3477 alc880_uniwill_p53_dcvol_automute(codec);
3478 else
3479 alc_automute_amp_unsol_event(codec, res);
3480 }
3481
3482 /*
3483 * F1734 pin configuration:
3484 * HP = 0x14, speaker-out = 0x15, mic = 0x18
3485 */
3486 static struct hda_verb alc880_pin_f1734_init_verbs[] = {
3487 {0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
3488 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3489 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3490 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3491 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3492
3493 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3494 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3495 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3496 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3497
3498 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3499 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3500 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
3501 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3502 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3503 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3504 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3505 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3506 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3507
3508 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
3509 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
3510
3511 { }
3512 };
3513
3514 /*
3515 * ASUS pin configuration:
3516 * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
3517 */
3518 static struct hda_verb alc880_pin_asus_init_verbs[] = {
3519 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3520 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3521 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3522 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3523
3524 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3525 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3526 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3527 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3528 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3529 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3530 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3531 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3532
3533 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3534 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3535 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3536 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3537 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3538 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3539 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3540 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3541 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3542
3543 { }
3544 };
3545
3546 /* Enable GPIO mask and set output */
3547 #define alc880_gpio1_init_verbs alc_gpio1_init_verbs
3548 #define alc880_gpio2_init_verbs alc_gpio2_init_verbs
3549 #define alc880_gpio3_init_verbs alc_gpio3_init_verbs
3550
3551 /* Clevo m520g init */
3552 static struct hda_verb alc880_pin_clevo_init_verbs[] = {
3553 /* headphone output */
3554 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3555 /* line-out */
3556 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3557 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3558 /* Line-in */
3559 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3560 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3561 /* CD */
3562 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3563 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3564 /* Mic1 (rear panel) */
3565 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3566 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3567 /* Mic2 (front panel) */
3568 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3569 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3570 /* headphone */
3571 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3572 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3573 /* change to EAPD mode */
3574 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3575 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
3576
3577 { }
3578 };
3579
3580 static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
3581 /* change to EAPD mode */
3582 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3583 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
3584
3585 /* Headphone output */
3586 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3587 /* Front output*/
3588 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3589 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
3590
3591 /* Line In pin widget for input */
3592 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3593 /* CD pin widget for input */
3594 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3595 /* Mic1 (rear panel) pin widget for input and vref at 80% */
3596 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3597
3598 /* change to EAPD mode */
3599 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3600 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
3601
3602 { }
3603 };
3604
3605 /*
3606 * LG m1 express dual
3607 *
3608 * Pin assignment:
3609 * Rear Line-In/Out (blue): 0x14
3610 * Build-in Mic-In: 0x15
3611 * Speaker-out: 0x17
3612 * HP-Out (green): 0x1b
3613 * Mic-In/Out (red): 0x19
3614 * SPDIF-Out: 0x1e
3615 */
3616
3617 /* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
3618 static hda_nid_t alc880_lg_dac_nids[3] = {
3619 0x05, 0x02, 0x03
3620 };
3621
3622 /* seems analog CD is not working */
3623 static struct hda_input_mux alc880_lg_capture_source = {
3624 .num_items = 3,
3625 .items = {
3626 { "Mic", 0x1 },
3627 { "Line", 0x5 },
3628 { "Internal Mic", 0x6 },
3629 },
3630 };
3631
3632 /* 2,4,6 channel modes */
3633 static struct hda_verb alc880_lg_ch2_init[] = {
3634 /* set line-in and mic-in to input */
3635 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3636 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3637 { }
3638 };
3639
3640 static struct hda_verb alc880_lg_ch4_init[] = {
3641 /* set line-in to out and mic-in to input */
3642 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3643 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3644 { }
3645 };
3646
3647 static struct hda_verb alc880_lg_ch6_init[] = {
3648 /* set line-in and mic-in to output */
3649 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3650 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3651 { }
3652 };
3653
3654 static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3655 { 2, alc880_lg_ch2_init },
3656 { 4, alc880_lg_ch4_init },
3657 { 6, alc880_lg_ch6_init },
3658 };
3659
3660 static struct snd_kcontrol_new alc880_lg_mixer[] = {
3661 HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3662 HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
3663 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3664 HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3665 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3666 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3667 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3668 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3669 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3670 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3671 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3672 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3673 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3674 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3675 {
3676 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3677 .name = "Channel Mode",
3678 .info = alc_ch_mode_info,
3679 .get = alc_ch_mode_get,
3680 .put = alc_ch_mode_put,
3681 },
3682 { } /* end */
3683 };
3684
3685 static struct hda_verb alc880_lg_init_verbs[] = {
3686 /* set capture source to mic-in */
3687 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3688 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3689 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3690 /* mute all amp mixer inputs */
3691 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
3692 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3693 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3694 /* line-in to input */
3695 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3696 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3697 /* built-in mic */
3698 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3699 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3700 /* speaker-out */
3701 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3702 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3703 /* mic-in to input */
3704 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3705 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3706 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3707 /* HP-out */
3708 {0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3709 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3710 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3711 /* jack sense */
3712 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3713 { }
3714 };
3715
3716 /* toggle speaker-output according to the hp-jack state */
3717 static void alc880_lg_setup(struct hda_codec *codec)
3718 {
3719 struct alc_spec *spec = codec->spec;
3720
3721 spec->autocfg.hp_pins[0] = 0x1b;
3722 spec->autocfg.speaker_pins[0] = 0x17;
3723 }
3724
3725 /*
3726 * LG LW20
3727 *
3728 * Pin assignment:
3729 * Speaker-out: 0x14
3730 * Mic-In: 0x18
3731 * Built-in Mic-In: 0x19
3732 * Line-In: 0x1b
3733 * HP-Out: 0x1a
3734 * SPDIF-Out: 0x1e
3735 */
3736
3737 static struct hda_input_mux alc880_lg_lw_capture_source = {
3738 .num_items = 3,
3739 .items = {
3740 { "Mic", 0x0 },
3741 { "Internal Mic", 0x1 },
3742 { "Line In", 0x2 },
3743 },
3744 };
3745
3746 #define alc880_lg_lw_modes alc880_threestack_modes
3747
3748 static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3749 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3750 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3751 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3752 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3753 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3754 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3755 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3756 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3757 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3758 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
3759 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3760 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3761 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3762 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
3763 {
3764 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3765 .name = "Channel Mode",
3766 .info = alc_ch_mode_info,
3767 .get = alc_ch_mode_get,
3768 .put = alc_ch_mode_put,
3769 },
3770 { } /* end */
3771 };
3772
3773 static struct hda_verb alc880_lg_lw_init_verbs[] = {
3774 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3775 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3776 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3777
3778 /* set capture source to mic-in */
3779 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3780 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3781 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3782 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3783 /* speaker-out */
3784 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3785 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3786 /* HP-out */
3787 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3788 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3789 /* mic-in to input */
3790 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3791 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3792 /* built-in mic */
3793 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3794 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3795 /* jack sense */
3796 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3797 { }
3798 };
3799
3800 /* toggle speaker-output according to the hp-jack state */
3801 static void alc880_lg_lw_setup(struct hda_codec *codec)
3802 {
3803 struct alc_spec *spec = codec->spec;
3804
3805 spec->autocfg.hp_pins[0] = 0x1b;
3806 spec->autocfg.speaker_pins[0] = 0x14;
3807 }
3808
3809 static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3810 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3811 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3812 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3813 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3814 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3815 HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3816 { } /* end */
3817 };
3818
3819 static struct hda_input_mux alc880_medion_rim_capture_source = {
3820 .num_items = 2,
3821 .items = {
3822 { "Mic", 0x0 },
3823 { "Internal Mic", 0x1 },
3824 },
3825 };
3826
3827 static struct hda_verb alc880_medion_rim_init_verbs[] = {
3828 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3829
3830 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3831 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3832
3833 /* Mic1 (rear panel) pin widget for input and vref at 80% */
3834 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3835 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3836 /* Mic2 (as headphone out) for HP output */
3837 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3838 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3839 /* Internal Speaker */
3840 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3841 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3842
3843 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3844 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
3845
3846 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3847 { }
3848 };
3849
3850 /* toggle speaker-output according to the hp-jack state */
3851 static void alc880_medion_rim_automute(struct hda_codec *codec)
3852 {
3853 struct alc_spec *spec = codec->spec;
3854 alc_automute_amp(codec);
3855 /* toggle EAPD */
3856 if (spec->jack_present)
3857 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3858 else
3859 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3860 }
3861
3862 static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3863 unsigned int res)
3864 {
3865 /* Looks like the unsol event is incompatible with the standard
3866 * definition. 4bit tag is placed at 28 bit!
3867 */
3868 if ((res >> 28) == ALC880_HP_EVENT)
3869 alc880_medion_rim_automute(codec);
3870 }
3871
3872 static void alc880_medion_rim_setup(struct hda_codec *codec)
3873 {
3874 struct alc_spec *spec = codec->spec;
3875
3876 spec->autocfg.hp_pins[0] = 0x14;
3877 spec->autocfg.speaker_pins[0] = 0x1b;
3878 }
3879
3880 #ifdef CONFIG_SND_HDA_POWER_SAVE
3881 static struct hda_amp_list alc880_loopbacks[] = {
3882 { 0x0b, HDA_INPUT, 0 },
3883 { 0x0b, HDA_INPUT, 1 },
3884 { 0x0b, HDA_INPUT, 2 },
3885 { 0x0b, HDA_INPUT, 3 },
3886 { 0x0b, HDA_INPUT, 4 },
3887 { } /* end */
3888 };
3889
3890 static struct hda_amp_list alc880_lg_loopbacks[] = {
3891 { 0x0b, HDA_INPUT, 1 },
3892 { 0x0b, HDA_INPUT, 6 },
3893 { 0x0b, HDA_INPUT, 7 },
3894 { } /* end */
3895 };
3896 #endif
3897
3898 /*
3899 * Common callbacks
3900 */
3901
3902 static int alc_init(struct hda_codec *codec)
3903 {
3904 struct alc_spec *spec = codec->spec;
3905 unsigned int i;
3906
3907 alc_fix_pll(codec);
3908 alc_auto_init_amp(codec, spec->init_amp);
3909
3910 for (i = 0; i < spec->num_init_verbs; i++)
3911 snd_hda_sequence_write(codec, spec->init_verbs[i]);
3912
3913 if (spec->init_hook)
3914 spec->init_hook(codec);
3915
3916 alc_apply_fixup(codec, ALC_FIXUP_ACT_INIT);
3917
3918 hda_call_check_power_status(codec, 0x01);
3919 return 0;
3920 }
3921
3922 static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3923 {
3924 struct alc_spec *spec = codec->spec;
3925
3926 if (spec->unsol_event)
3927 spec->unsol_event(codec, res);
3928 }
3929
3930 #ifdef CONFIG_SND_HDA_POWER_SAVE
3931 static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3932 {
3933 struct alc_spec *spec = codec->spec;
3934 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3935 }
3936 #endif
3937
3938 /*
3939 * Analog playback callbacks
3940 */
3941 static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3942 struct hda_codec *codec,
3943 struct snd_pcm_substream *substream)
3944 {
3945 struct alc_spec *spec = codec->spec;
3946 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3947 hinfo);
3948 }
3949
3950 static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3951 struct hda_codec *codec,
3952 unsigned int stream_tag,
3953 unsigned int format,
3954 struct snd_pcm_substream *substream)
3955 {
3956 struct alc_spec *spec = codec->spec;
3957 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3958 stream_tag, format, substream);
3959 }
3960
3961 static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3962 struct hda_codec *codec,
3963 struct snd_pcm_substream *substream)
3964 {
3965 struct alc_spec *spec = codec->spec;
3966 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3967 }
3968
3969 /*
3970 * Digital out
3971 */
3972 static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3973 struct hda_codec *codec,
3974 struct snd_pcm_substream *substream)
3975 {
3976 struct alc_spec *spec = codec->spec;
3977 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3978 }
3979
3980 static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3981 struct hda_codec *codec,
3982 unsigned int stream_tag,
3983 unsigned int format,
3984 struct snd_pcm_substream *substream)
3985 {
3986 struct alc_spec *spec = codec->spec;
3987 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3988 stream_tag, format, substream);
3989 }
3990
3991 static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3992 struct hda_codec *codec,
3993 struct snd_pcm_substream *substream)
3994 {
3995 struct alc_spec *spec = codec->spec;
3996 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3997 }
3998
3999 static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
4000 struct hda_codec *codec,
4001 struct snd_pcm_substream *substream)
4002 {
4003 struct alc_spec *spec = codec->spec;
4004 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
4005 }
4006
4007 /*
4008 * Analog capture
4009 */
4010 static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
4011 struct hda_codec *codec,
4012 unsigned int stream_tag,
4013 unsigned int format,
4014 struct snd_pcm_substream *substream)
4015 {
4016 struct alc_spec *spec = codec->spec;
4017
4018 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
4019 stream_tag, 0, format);
4020 return 0;
4021 }
4022
4023 static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
4024 struct hda_codec *codec,
4025 struct snd_pcm_substream *substream)
4026 {
4027 struct alc_spec *spec = codec->spec;
4028
4029 snd_hda_codec_cleanup_stream(codec,
4030 spec->adc_nids[substream->number + 1]);
4031 return 0;
4032 }
4033
4034 /* analog capture with dynamic dual-adc changes */
4035 static int dualmic_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
4036 struct hda_codec *codec,
4037 unsigned int stream_tag,
4038 unsigned int format,
4039 struct snd_pcm_substream *substream)
4040 {
4041 struct alc_spec *spec = codec->spec;
4042 spec->cur_adc = spec->adc_nids[spec->cur_adc_idx];
4043 spec->cur_adc_stream_tag = stream_tag;
4044 spec->cur_adc_format = format;
4045 snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
4046 return 0;
4047 }
4048
4049 static int dualmic_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
4050 struct hda_codec *codec,
4051 struct snd_pcm_substream *substream)
4052 {
4053 struct alc_spec *spec = codec->spec;
4054 snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
4055 spec->cur_adc = 0;
4056 return 0;
4057 }
4058
4059 static struct hda_pcm_stream dualmic_pcm_analog_capture = {
4060 .substreams = 1,
4061 .channels_min = 2,
4062 .channels_max = 2,
4063 .nid = 0, /* fill later */
4064 .ops = {
4065 .prepare = dualmic_capture_pcm_prepare,
4066 .cleanup = dualmic_capture_pcm_cleanup
4067 },
4068 };
4069
4070 /*
4071 */
4072 static struct hda_pcm_stream alc880_pcm_analog_playback = {
4073 .substreams = 1,
4074 .channels_min = 2,
4075 .channels_max = 8,
4076 /* NID is set in alc_build_pcms */
4077 .ops = {
4078 .open = alc880_playback_pcm_open,
4079 .prepare = alc880_playback_pcm_prepare,
4080 .cleanup = alc880_playback_pcm_cleanup
4081 },
4082 };
4083
4084 static struct hda_pcm_stream alc880_pcm_analog_capture = {
4085 .substreams = 1,
4086 .channels_min = 2,
4087 .channels_max = 2,
4088 /* NID is set in alc_build_pcms */
4089 };
4090
4091 static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
4092 .substreams = 1,
4093 .channels_min = 2,
4094 .channels_max = 2,
4095 /* NID is set in alc_build_pcms */
4096 };
4097
4098 static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
4099 .substreams = 2, /* can be overridden */
4100 .channels_min = 2,
4101 .channels_max = 2,
4102 /* NID is set in alc_build_pcms */
4103 .ops = {
4104 .prepare = alc880_alt_capture_pcm_prepare,
4105 .cleanup = alc880_alt_capture_pcm_cleanup
4106 },
4107 };
4108
4109 static struct hda_pcm_stream alc880_pcm_digital_playback = {
4110 .substreams = 1,
4111 .channels_min = 2,
4112 .channels_max = 2,
4113 /* NID is set in alc_build_pcms */
4114 .ops = {
4115 .open = alc880_dig_playback_pcm_open,
4116 .close = alc880_dig_playback_pcm_close,
4117 .prepare = alc880_dig_playback_pcm_prepare,
4118 .cleanup = alc880_dig_playback_pcm_cleanup
4119 },
4120 };
4121
4122 static struct hda_pcm_stream alc880_pcm_digital_capture = {
4123 .substreams = 1,
4124 .channels_min = 2,
4125 .channels_max = 2,
4126 /* NID is set in alc_build_pcms */
4127 };
4128
4129 /* Used by alc_build_pcms to flag that a PCM has no playback stream */
4130 static struct hda_pcm_stream alc_pcm_null_stream = {
4131 .substreams = 0,
4132 .channels_min = 0,
4133 .channels_max = 0,
4134 };
4135
4136 static int alc_build_pcms(struct hda_codec *codec)
4137 {
4138 struct alc_spec *spec = codec->spec;
4139 struct hda_pcm *info = spec->pcm_rec;
4140 int i;
4141
4142 codec->num_pcms = 1;
4143 codec->pcm_info = info;
4144
4145 if (spec->no_analog)
4146 goto skip_analog;
4147
4148 snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
4149 "%s Analog", codec->chip_name);
4150 info->name = spec->stream_name_analog;
4151
4152 if (spec->stream_analog_playback) {
4153 if (snd_BUG_ON(!spec->multiout.dac_nids))
4154 return -EINVAL;
4155 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
4156 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
4157 }
4158 if (spec->stream_analog_capture) {
4159 if (snd_BUG_ON(!spec->adc_nids))
4160 return -EINVAL;
4161 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
4162 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
4163 }
4164
4165 if (spec->channel_mode) {
4166 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
4167 for (i = 0; i < spec->num_channel_mode; i++) {
4168 if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
4169 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
4170 }
4171 }
4172 }
4173
4174 skip_analog:
4175 /* SPDIF for stream index #1 */
4176 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
4177 snprintf(spec->stream_name_digital,
4178 sizeof(spec->stream_name_digital),
4179 "%s Digital", codec->chip_name);
4180 codec->num_pcms = 2;
4181 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
4182 info = spec->pcm_rec + 1;
4183 info->name = spec->stream_name_digital;
4184 if (spec->dig_out_type)
4185 info->pcm_type = spec->dig_out_type;
4186 else
4187 info->pcm_type = HDA_PCM_TYPE_SPDIF;
4188 if (spec->multiout.dig_out_nid &&
4189 spec->stream_digital_playback) {
4190 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
4191 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
4192 }
4193 if (spec->dig_in_nid &&
4194 spec->stream_digital_capture) {
4195 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
4196 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
4197 }
4198 /* FIXME: do we need this for all Realtek codec models? */
4199 codec->spdif_status_reset = 1;
4200 }
4201
4202 if (spec->no_analog)
4203 return 0;
4204
4205 /* If the use of more than one ADC is requested for the current
4206 * model, configure a second analog capture-only PCM.
4207 */
4208 /* Additional Analaog capture for index #2 */
4209 if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
4210 (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
4211 codec->num_pcms = 3;
4212 info = spec->pcm_rec + 2;
4213 info->name = spec->stream_name_analog;
4214 if (spec->alt_dac_nid) {
4215 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
4216 *spec->stream_analog_alt_playback;
4217 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
4218 spec->alt_dac_nid;
4219 } else {
4220 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
4221 alc_pcm_null_stream;
4222 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
4223 }
4224 if (spec->num_adc_nids > 1) {
4225 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
4226 *spec->stream_analog_alt_capture;
4227 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
4228 spec->adc_nids[1];
4229 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
4230 spec->num_adc_nids - 1;
4231 } else {
4232 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
4233 alc_pcm_null_stream;
4234 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
4235 }
4236 }
4237
4238 return 0;
4239 }
4240
4241 static inline void alc_shutup(struct hda_codec *codec)
4242 {
4243 snd_hda_shutup_pins(codec);
4244 }
4245
4246 static void alc_free_kctls(struct hda_codec *codec)
4247 {
4248 struct alc_spec *spec = codec->spec;
4249
4250 if (spec->kctls.list) {
4251 struct snd_kcontrol_new *kctl = spec->kctls.list;
4252 int i;
4253 for (i = 0; i < spec->kctls.used; i++)
4254 kfree(kctl[i].name);
4255 }
4256 snd_array_free(&spec->kctls);
4257 }
4258
4259 static void alc_free(struct hda_codec *codec)
4260 {
4261 struct alc_spec *spec = codec->spec;
4262
4263 if (!spec)
4264 return;
4265
4266 alc_shutup(codec);
4267 alc_free_kctls(codec);
4268 kfree(spec);
4269 snd_hda_detach_beep_device(codec);
4270 }
4271
4272 #ifdef CONFIG_SND_HDA_POWER_SAVE
4273 static void alc_power_eapd(struct hda_codec *codec)
4274 {
4275 /* We currently only handle front, HP */
4276 switch (codec->vendor_id) {
4277 case 0x10ec0260:
4278 set_eapd(codec, 0x0f, 0);
4279 set_eapd(codec, 0x10, 0);
4280 break;
4281 case 0x10ec0262:
4282 case 0x10ec0267:
4283 case 0x10ec0268:
4284 case 0x10ec0269:
4285 case 0x10ec0270:
4286 case 0x10ec0272:
4287 case 0x10ec0660:
4288 case 0x10ec0662:
4289 case 0x10ec0663:
4290 case 0x10ec0862:
4291 case 0x10ec0889:
4292 set_eapd(codec, 0x14, 0);
4293 set_eapd(codec, 0x15, 0);
4294 break;
4295 }
4296 }
4297
4298 static int alc_suspend(struct hda_codec *codec, pm_message_t state)
4299 {
4300 struct alc_spec *spec = codec->spec;
4301 alc_shutup(codec);
4302 if (spec && spec->power_hook)
4303 spec->power_hook(codec);
4304 return 0;
4305 }
4306 #endif
4307
4308 #ifdef SND_HDA_NEEDS_RESUME
4309 static int alc_resume(struct hda_codec *codec)
4310 {
4311 codec->patch_ops.init(codec);
4312 snd_hda_codec_resume_amp(codec);
4313 snd_hda_codec_resume_cache(codec);
4314 hda_call_check_power_status(codec, 0x01);
4315 return 0;
4316 }
4317 #endif
4318
4319 /*
4320 */
4321 static struct hda_codec_ops alc_patch_ops = {
4322 .build_controls = alc_build_controls,
4323 .build_pcms = alc_build_pcms,
4324 .init = alc_init,
4325 .free = alc_free,
4326 .unsol_event = alc_unsol_event,
4327 #ifdef SND_HDA_NEEDS_RESUME
4328 .resume = alc_resume,
4329 #endif
4330 #ifdef CONFIG_SND_HDA_POWER_SAVE
4331 .suspend = alc_suspend,
4332 .check_power_status = alc_check_power_status,
4333 #endif
4334 .reboot_notify = alc_shutup,
4335 };
4336
4337 /* replace the codec chip_name with the given string */
4338 static int alc_codec_rename(struct hda_codec *codec, const char *name)
4339 {
4340 kfree(codec->chip_name);
4341 codec->chip_name = kstrdup(name, GFP_KERNEL);
4342 if (!codec->chip_name) {
4343 alc_free(codec);
4344 return -ENOMEM;
4345 }
4346 return 0;
4347 }
4348
4349 /*
4350 * Test configuration for debugging
4351 *
4352 * Almost all inputs/outputs are enabled. I/O pins can be configured via
4353 * enum controls.
4354 */
4355 #ifdef CONFIG_SND_DEBUG
4356 static hda_nid_t alc880_test_dac_nids[4] = {
4357 0x02, 0x03, 0x04, 0x05
4358 };
4359
4360 static struct hda_input_mux alc880_test_capture_source = {
4361 .num_items = 7,
4362 .items = {
4363 { "In-1", 0x0 },
4364 { "In-2", 0x1 },
4365 { "In-3", 0x2 },
4366 { "In-4", 0x3 },
4367 { "CD", 0x4 },
4368 { "Front", 0x5 },
4369 { "Surround", 0x6 },
4370 },
4371 };
4372
4373 static struct hda_channel_mode alc880_test_modes[4] = {
4374 { 2, NULL },
4375 { 4, NULL },
4376 { 6, NULL },
4377 { 8, NULL },
4378 };
4379
4380 static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
4381 struct snd_ctl_elem_info *uinfo)
4382 {
4383 static char *texts[] = {
4384 "N/A", "Line Out", "HP Out",
4385 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
4386 };
4387 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4388 uinfo->count = 1;
4389 uinfo->value.enumerated.items = 8;
4390 if (uinfo->value.enumerated.item >= 8)
4391 uinfo->value.enumerated.item = 7;
4392 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
4393 return 0;
4394 }
4395
4396 static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
4397 struct snd_ctl_elem_value *ucontrol)
4398 {
4399 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4400 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4401 unsigned int pin_ctl, item = 0;
4402
4403 pin_ctl = snd_hda_codec_read(codec, nid, 0,
4404 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4405 if (pin_ctl & AC_PINCTL_OUT_EN) {
4406 if (pin_ctl & AC_PINCTL_HP_EN)
4407 item = 2;
4408 else
4409 item = 1;
4410 } else if (pin_ctl & AC_PINCTL_IN_EN) {
4411 switch (pin_ctl & AC_PINCTL_VREFEN) {
4412 case AC_PINCTL_VREF_HIZ: item = 3; break;
4413 case AC_PINCTL_VREF_50: item = 4; break;
4414 case AC_PINCTL_VREF_GRD: item = 5; break;
4415 case AC_PINCTL_VREF_80: item = 6; break;
4416 case AC_PINCTL_VREF_100: item = 7; break;
4417 }
4418 }
4419 ucontrol->value.enumerated.item[0] = item;
4420 return 0;
4421 }
4422
4423 static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
4424 struct snd_ctl_elem_value *ucontrol)
4425 {
4426 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4427 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4428 static unsigned int ctls[] = {
4429 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
4430 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
4431 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
4432 AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
4433 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
4434 AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
4435 };
4436 unsigned int old_ctl, new_ctl;
4437
4438 old_ctl = snd_hda_codec_read(codec, nid, 0,
4439 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4440 new_ctl = ctls[ucontrol->value.enumerated.item[0]];
4441 if (old_ctl != new_ctl) {
4442 int val;
4443 snd_hda_codec_write_cache(codec, nid, 0,
4444 AC_VERB_SET_PIN_WIDGET_CONTROL,
4445 new_ctl);
4446 val = ucontrol->value.enumerated.item[0] >= 3 ?
4447 HDA_AMP_MUTE : 0;
4448 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
4449 HDA_AMP_MUTE, val);
4450 return 1;
4451 }
4452 return 0;
4453 }
4454
4455 static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
4456 struct snd_ctl_elem_info *uinfo)
4457 {
4458 static char *texts[] = {
4459 "Front", "Surround", "CLFE", "Side"
4460 };
4461 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4462 uinfo->count = 1;
4463 uinfo->value.enumerated.items = 4;
4464 if (uinfo->value.enumerated.item >= 4)
4465 uinfo->value.enumerated.item = 3;
4466 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
4467 return 0;
4468 }
4469
4470 static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
4471 struct snd_ctl_elem_value *ucontrol)
4472 {
4473 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4474 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4475 unsigned int sel;
4476
4477 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
4478 ucontrol->value.enumerated.item[0] = sel & 3;
4479 return 0;
4480 }
4481
4482 static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
4483 struct snd_ctl_elem_value *ucontrol)
4484 {
4485 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4486 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4487 unsigned int sel;
4488
4489 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
4490 if (ucontrol->value.enumerated.item[0] != sel) {
4491 sel = ucontrol->value.enumerated.item[0] & 3;
4492 snd_hda_codec_write_cache(codec, nid, 0,
4493 AC_VERB_SET_CONNECT_SEL, sel);
4494 return 1;
4495 }
4496 return 0;
4497 }
4498
4499 #define PIN_CTL_TEST(xname,nid) { \
4500 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4501 .name = xname, \
4502 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4503 .info = alc_test_pin_ctl_info, \
4504 .get = alc_test_pin_ctl_get, \
4505 .put = alc_test_pin_ctl_put, \
4506 .private_value = nid \
4507 }
4508
4509 #define PIN_SRC_TEST(xname,nid) { \
4510 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4511 .name = xname, \
4512 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4513 .info = alc_test_pin_src_info, \
4514 .get = alc_test_pin_src_get, \
4515 .put = alc_test_pin_src_put, \
4516 .private_value = nid \
4517 }
4518
4519 static struct snd_kcontrol_new alc880_test_mixer[] = {
4520 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
4521 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
4522 HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
4523 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
4524 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
4525 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
4526 HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
4527 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
4528 PIN_CTL_TEST("Front Pin Mode", 0x14),
4529 PIN_CTL_TEST("Surround Pin Mode", 0x15),
4530 PIN_CTL_TEST("CLFE Pin Mode", 0x16),
4531 PIN_CTL_TEST("Side Pin Mode", 0x17),
4532 PIN_CTL_TEST("In-1 Pin Mode", 0x18),
4533 PIN_CTL_TEST("In-2 Pin Mode", 0x19),
4534 PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
4535 PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
4536 PIN_SRC_TEST("In-1 Pin Source", 0x18),
4537 PIN_SRC_TEST("In-2 Pin Source", 0x19),
4538 PIN_SRC_TEST("In-3 Pin Source", 0x1a),
4539 PIN_SRC_TEST("In-4 Pin Source", 0x1b),
4540 HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
4541 HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
4542 HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
4543 HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
4544 HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
4545 HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
4546 HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
4547 HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
4548 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
4549 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
4550 {
4551 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4552 .name = "Channel Mode",
4553 .info = alc_ch_mode_info,
4554 .get = alc_ch_mode_get,
4555 .put = alc_ch_mode_put,
4556 },
4557 { } /* end */
4558 };
4559
4560 static struct hda_verb alc880_test_init_verbs[] = {
4561 /* Unmute inputs of 0x0c - 0x0f */
4562 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4563 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4564 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4565 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4566 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4567 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4568 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4569 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4570 /* Vol output for 0x0c-0x0f */
4571 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4572 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4573 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4574 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4575 /* Set output pins 0x14-0x17 */
4576 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4577 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4578 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4579 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4580 /* Unmute output pins 0x14-0x17 */
4581 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4582 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4583 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4584 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4585 /* Set input pins 0x18-0x1c */
4586 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4587 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4588 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4589 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4590 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4591 /* Mute input pins 0x18-0x1b */
4592 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4593 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4594 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4595 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4596 /* ADC set up */
4597 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4598 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
4599 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4600 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
4601 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4602 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
4603 /* Analog input/passthru */
4604 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4605 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4606 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4607 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4608 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
4609 { }
4610 };
4611 #endif
4612
4613 /*
4614 */
4615
4616 static const char * const alc880_models[ALC880_MODEL_LAST] = {
4617 [ALC880_3ST] = "3stack",
4618 [ALC880_TCL_S700] = "tcl",
4619 [ALC880_3ST_DIG] = "3stack-digout",
4620 [ALC880_CLEVO] = "clevo",
4621 [ALC880_5ST] = "5stack",
4622 [ALC880_5ST_DIG] = "5stack-digout",
4623 [ALC880_W810] = "w810",
4624 [ALC880_Z71V] = "z71v",
4625 [ALC880_6ST] = "6stack",
4626 [ALC880_6ST_DIG] = "6stack-digout",
4627 [ALC880_ASUS] = "asus",
4628 [ALC880_ASUS_W1V] = "asus-w1v",
4629 [ALC880_ASUS_DIG] = "asus-dig",
4630 [ALC880_ASUS_DIG2] = "asus-dig2",
4631 [ALC880_UNIWILL_DIG] = "uniwill",
4632 [ALC880_UNIWILL_P53] = "uniwill-p53",
4633 [ALC880_FUJITSU] = "fujitsu",
4634 [ALC880_F1734] = "F1734",
4635 [ALC880_LG] = "lg",
4636 [ALC880_LG_LW] = "lg-lw",
4637 [ALC880_MEDION_RIM] = "medion",
4638 #ifdef CONFIG_SND_DEBUG
4639 [ALC880_TEST] = "test",
4640 #endif
4641 [ALC880_AUTO] = "auto",
4642 };
4643
4644 static struct snd_pci_quirk alc880_cfg_tbl[] = {
4645 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
4646 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
4647 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
4648 SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
4649 SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
4650 SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
4651 SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
4652 SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
4653 SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
4654 SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
4655 SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
4656 SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
4657 SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
4658 SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
4659 SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
4660 SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
4661 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
4662 SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
4663 /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
4664 SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
4665 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
4666 SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
4667 SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
4668 SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
4669 SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
4670 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
4671 SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
4672 SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
4673 SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
4674 SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
4675 SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
4676 SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
4677 SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
4678 SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
4679 SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
4680 SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
4681 SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
4682 SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
4683 SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
4684 SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
4685 SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
4686 SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
4687 SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
4688 SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
4689 SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
4690 SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
4691 SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
4692 SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
4693 SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
4694 SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_F1734),
4695 SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
4696 SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
4697 SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
4698 SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_LG),
4699 SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
4700 SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
4701 SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
4702 SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
4703 SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
4704 SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
4705 SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
4706 SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
4707 SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
4708 SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
4709 SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
4710 SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
4711 SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
4712 SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
4713 SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
4714 /* default Intel */
4715 SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
4716 SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
4717 SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
4718 {}
4719 };
4720
4721 /*
4722 * ALC880 codec presets
4723 */
4724 static struct alc_config_preset alc880_presets[] = {
4725 [ALC880_3ST] = {
4726 .mixers = { alc880_three_stack_mixer },
4727 .init_verbs = { alc880_volume_init_verbs,
4728 alc880_pin_3stack_init_verbs },
4729 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4730 .dac_nids = alc880_dac_nids,
4731 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4732 .channel_mode = alc880_threestack_modes,
4733 .need_dac_fix = 1,
4734 .input_mux = &alc880_capture_source,
4735 },
4736 [ALC880_3ST_DIG] = {
4737 .mixers = { alc880_three_stack_mixer },
4738 .init_verbs = { alc880_volume_init_verbs,
4739 alc880_pin_3stack_init_verbs },
4740 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4741 .dac_nids = alc880_dac_nids,
4742 .dig_out_nid = ALC880_DIGOUT_NID,
4743 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4744 .channel_mode = alc880_threestack_modes,
4745 .need_dac_fix = 1,
4746 .input_mux = &alc880_capture_source,
4747 },
4748 [ALC880_TCL_S700] = {
4749 .mixers = { alc880_tcl_s700_mixer },
4750 .init_verbs = { alc880_volume_init_verbs,
4751 alc880_pin_tcl_S700_init_verbs,
4752 alc880_gpio2_init_verbs },
4753 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4754 .dac_nids = alc880_dac_nids,
4755 .adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4756 .num_adc_nids = 1, /* single ADC */
4757 .hp_nid = 0x03,
4758 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4759 .channel_mode = alc880_2_jack_modes,
4760 .input_mux = &alc880_capture_source,
4761 },
4762 [ALC880_5ST] = {
4763 .mixers = { alc880_three_stack_mixer,
4764 alc880_five_stack_mixer},
4765 .init_verbs = { alc880_volume_init_verbs,
4766 alc880_pin_5stack_init_verbs },
4767 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4768 .dac_nids = alc880_dac_nids,
4769 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4770 .channel_mode = alc880_fivestack_modes,
4771 .input_mux = &alc880_capture_source,
4772 },
4773 [ALC880_5ST_DIG] = {
4774 .mixers = { alc880_three_stack_mixer,
4775 alc880_five_stack_mixer },
4776 .init_verbs = { alc880_volume_init_verbs,
4777 alc880_pin_5stack_init_verbs },
4778 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4779 .dac_nids = alc880_dac_nids,
4780 .dig_out_nid = ALC880_DIGOUT_NID,
4781 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4782 .channel_mode = alc880_fivestack_modes,
4783 .input_mux = &alc880_capture_source,
4784 },
4785 [ALC880_6ST] = {
4786 .mixers = { alc880_six_stack_mixer },
4787 .init_verbs = { alc880_volume_init_verbs,
4788 alc880_pin_6stack_init_verbs },
4789 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4790 .dac_nids = alc880_6st_dac_nids,
4791 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4792 .channel_mode = alc880_sixstack_modes,
4793 .input_mux = &alc880_6stack_capture_source,
4794 },
4795 [ALC880_6ST_DIG] = {
4796 .mixers = { alc880_six_stack_mixer },
4797 .init_verbs = { alc880_volume_init_verbs,
4798 alc880_pin_6stack_init_verbs },
4799 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4800 .dac_nids = alc880_6st_dac_nids,
4801 .dig_out_nid = ALC880_DIGOUT_NID,
4802 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4803 .channel_mode = alc880_sixstack_modes,
4804 .input_mux = &alc880_6stack_capture_source,
4805 },
4806 [ALC880_W810] = {
4807 .mixers = { alc880_w810_base_mixer },
4808 .init_verbs = { alc880_volume_init_verbs,
4809 alc880_pin_w810_init_verbs,
4810 alc880_gpio2_init_verbs },
4811 .num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4812 .dac_nids = alc880_w810_dac_nids,
4813 .dig_out_nid = ALC880_DIGOUT_NID,
4814 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4815 .channel_mode = alc880_w810_modes,
4816 .input_mux = &alc880_capture_source,
4817 },
4818 [ALC880_Z71V] = {
4819 .mixers = { alc880_z71v_mixer },
4820 .init_verbs = { alc880_volume_init_verbs,
4821 alc880_pin_z71v_init_verbs },
4822 .num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4823 .dac_nids = alc880_z71v_dac_nids,
4824 .dig_out_nid = ALC880_DIGOUT_NID,
4825 .hp_nid = 0x03,
4826 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4827 .channel_mode = alc880_2_jack_modes,
4828 .input_mux = &alc880_capture_source,
4829 },
4830 [ALC880_F1734] = {
4831 .mixers = { alc880_f1734_mixer },
4832 .init_verbs = { alc880_volume_init_verbs,
4833 alc880_pin_f1734_init_verbs },
4834 .num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4835 .dac_nids = alc880_f1734_dac_nids,
4836 .hp_nid = 0x02,
4837 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4838 .channel_mode = alc880_2_jack_modes,
4839 .input_mux = &alc880_f1734_capture_source,
4840 .unsol_event = alc880_uniwill_p53_unsol_event,
4841 .setup = alc880_uniwill_p53_setup,
4842 .init_hook = alc_automute_amp,
4843 },
4844 [ALC880_ASUS] = {
4845 .mixers = { alc880_asus_mixer },
4846 .init_verbs = { alc880_volume_init_verbs,
4847 alc880_pin_asus_init_verbs,
4848 alc880_gpio1_init_verbs },
4849 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4850 .dac_nids = alc880_asus_dac_nids,
4851 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4852 .channel_mode = alc880_asus_modes,
4853 .need_dac_fix = 1,
4854 .input_mux = &alc880_capture_source,
4855 },
4856 [ALC880_ASUS_DIG] = {
4857 .mixers = { alc880_asus_mixer },
4858 .init_verbs = { alc880_volume_init_verbs,
4859 alc880_pin_asus_init_verbs,
4860 alc880_gpio1_init_verbs },
4861 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4862 .dac_nids = alc880_asus_dac_nids,
4863 .dig_out_nid = ALC880_DIGOUT_NID,
4864 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4865 .channel_mode = alc880_asus_modes,
4866 .need_dac_fix = 1,
4867 .input_mux = &alc880_capture_source,
4868 },
4869 [ALC880_ASUS_DIG2] = {
4870 .mixers = { alc880_asus_mixer },
4871 .init_verbs = { alc880_volume_init_verbs,
4872 alc880_pin_asus_init_verbs,
4873 alc880_gpio2_init_verbs }, /* use GPIO2 */
4874 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4875 .dac_nids = alc880_asus_dac_nids,
4876 .dig_out_nid = ALC880_DIGOUT_NID,
4877 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4878 .channel_mode = alc880_asus_modes,
4879 .need_dac_fix = 1,
4880 .input_mux = &alc880_capture_source,
4881 },
4882 [ALC880_ASUS_W1V] = {
4883 .mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
4884 .init_verbs = { alc880_volume_init_verbs,
4885 alc880_pin_asus_init_verbs,
4886 alc880_gpio1_init_verbs },
4887 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4888 .dac_nids = alc880_asus_dac_nids,
4889 .dig_out_nid = ALC880_DIGOUT_NID,
4890 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4891 .channel_mode = alc880_asus_modes,
4892 .need_dac_fix = 1,
4893 .input_mux = &alc880_capture_source,
4894 },
4895 [ALC880_UNIWILL_DIG] = {
4896 .mixers = { alc880_asus_mixer },
4897 .init_verbs = { alc880_volume_init_verbs,
4898 alc880_pin_asus_init_verbs },
4899 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4900 .dac_nids = alc880_asus_dac_nids,
4901 .dig_out_nid = ALC880_DIGOUT_NID,
4902 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4903 .channel_mode = alc880_asus_modes,
4904 .need_dac_fix = 1,
4905 .input_mux = &alc880_capture_source,
4906 },
4907 [ALC880_UNIWILL] = {
4908 .mixers = { alc880_uniwill_mixer },
4909 .init_verbs = { alc880_volume_init_verbs,
4910 alc880_uniwill_init_verbs },
4911 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4912 .dac_nids = alc880_asus_dac_nids,
4913 .dig_out_nid = ALC880_DIGOUT_NID,
4914 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4915 .channel_mode = alc880_threestack_modes,
4916 .need_dac_fix = 1,
4917 .input_mux = &alc880_capture_source,
4918 .unsol_event = alc880_uniwill_unsol_event,
4919 .setup = alc880_uniwill_setup,
4920 .init_hook = alc880_uniwill_init_hook,
4921 },
4922 [ALC880_UNIWILL_P53] = {
4923 .mixers = { alc880_uniwill_p53_mixer },
4924 .init_verbs = { alc880_volume_init_verbs,
4925 alc880_uniwill_p53_init_verbs },
4926 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4927 .dac_nids = alc880_asus_dac_nids,
4928 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4929 .channel_mode = alc880_threestack_modes,
4930 .input_mux = &alc880_capture_source,
4931 .unsol_event = alc880_uniwill_p53_unsol_event,
4932 .setup = alc880_uniwill_p53_setup,
4933 .init_hook = alc_automute_amp,
4934 },
4935 [ALC880_FUJITSU] = {
4936 .mixers = { alc880_fujitsu_mixer },
4937 .init_verbs = { alc880_volume_init_verbs,
4938 alc880_uniwill_p53_init_verbs,
4939 alc880_beep_init_verbs },
4940 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4941 .dac_nids = alc880_dac_nids,
4942 .dig_out_nid = ALC880_DIGOUT_NID,
4943 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4944 .channel_mode = alc880_2_jack_modes,
4945 .input_mux = &alc880_capture_source,
4946 .unsol_event = alc880_uniwill_p53_unsol_event,
4947 .setup = alc880_uniwill_p53_setup,
4948 .init_hook = alc_automute_amp,
4949 },
4950 [ALC880_CLEVO] = {
4951 .mixers = { alc880_three_stack_mixer },
4952 .init_verbs = { alc880_volume_init_verbs,
4953 alc880_pin_clevo_init_verbs },
4954 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4955 .dac_nids = alc880_dac_nids,
4956 .hp_nid = 0x03,
4957 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4958 .channel_mode = alc880_threestack_modes,
4959 .need_dac_fix = 1,
4960 .input_mux = &alc880_capture_source,
4961 },
4962 [ALC880_LG] = {
4963 .mixers = { alc880_lg_mixer },
4964 .init_verbs = { alc880_volume_init_verbs,
4965 alc880_lg_init_verbs },
4966 .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4967 .dac_nids = alc880_lg_dac_nids,
4968 .dig_out_nid = ALC880_DIGOUT_NID,
4969 .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4970 .channel_mode = alc880_lg_ch_modes,
4971 .need_dac_fix = 1,
4972 .input_mux = &alc880_lg_capture_source,
4973 .unsol_event = alc_automute_amp_unsol_event,
4974 .setup = alc880_lg_setup,
4975 .init_hook = alc_automute_amp,
4976 #ifdef CONFIG_SND_HDA_POWER_SAVE
4977 .loopbacks = alc880_lg_loopbacks,
4978 #endif
4979 },
4980 [ALC880_LG_LW] = {
4981 .mixers = { alc880_lg_lw_mixer },
4982 .init_verbs = { alc880_volume_init_verbs,
4983 alc880_lg_lw_init_verbs },
4984 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4985 .dac_nids = alc880_dac_nids,
4986 .dig_out_nid = ALC880_DIGOUT_NID,
4987 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4988 .channel_mode = alc880_lg_lw_modes,
4989 .input_mux = &alc880_lg_lw_capture_source,
4990 .unsol_event = alc_automute_amp_unsol_event,
4991 .setup = alc880_lg_lw_setup,
4992 .init_hook = alc_automute_amp,
4993 },
4994 [ALC880_MEDION_RIM] = {
4995 .mixers = { alc880_medion_rim_mixer },
4996 .init_verbs = { alc880_volume_init_verbs,
4997 alc880_medion_rim_init_verbs,
4998 alc_gpio2_init_verbs },
4999 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
5000 .dac_nids = alc880_dac_nids,
5001 .dig_out_nid = ALC880_DIGOUT_NID,
5002 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
5003 .channel_mode = alc880_2_jack_modes,
5004 .input_mux = &alc880_medion_rim_capture_source,
5005 .unsol_event = alc880_medion_rim_unsol_event,
5006 .setup = alc880_medion_rim_setup,
5007 .init_hook = alc880_medion_rim_automute,
5008 },
5009 #ifdef CONFIG_SND_DEBUG
5010 [ALC880_TEST] = {
5011 .mixers = { alc880_test_mixer },
5012 .init_verbs = { alc880_test_init_verbs },
5013 .num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
5014 .dac_nids = alc880_test_dac_nids,
5015 .dig_out_nid = ALC880_DIGOUT_NID,
5016 .num_channel_mode = ARRAY_SIZE(alc880_test_modes),
5017 .channel_mode = alc880_test_modes,
5018 .input_mux = &alc880_test_capture_source,
5019 },
5020 #endif
5021 };
5022
5023 /*
5024 * Automatic parse of I/O pins from the BIOS configuration
5025 */
5026
5027 enum {
5028 ALC_CTL_WIDGET_VOL,
5029 ALC_CTL_WIDGET_MUTE,
5030 ALC_CTL_BIND_MUTE,
5031 };
5032 static struct snd_kcontrol_new alc880_control_templates[] = {
5033 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
5034 HDA_CODEC_MUTE(NULL, 0, 0, 0),
5035 HDA_BIND_MUTE(NULL, 0, 0, 0),
5036 };
5037
5038 /* add dynamic controls */
5039 static int add_control(struct alc_spec *spec, int type, const char *name,
5040 int cidx, unsigned long val)
5041 {
5042 struct snd_kcontrol_new *knew;
5043
5044 snd_array_init(&spec->kctls, sizeof(*knew), 32);
5045 knew = snd_array_new(&spec->kctls);
5046 if (!knew)
5047 return -ENOMEM;
5048 *knew = alc880_control_templates[type];
5049 knew->name = kstrdup(name, GFP_KERNEL);
5050 if (!knew->name)
5051 return -ENOMEM;
5052 knew->index = cidx;
5053 if (get_amp_nid_(val))
5054 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
5055 knew->private_value = val;
5056 return 0;
5057 }
5058
5059 static int add_control_with_pfx(struct alc_spec *spec, int type,
5060 const char *pfx, const char *dir,
5061 const char *sfx, int cidx, unsigned long val)
5062 {
5063 char name[32];
5064 snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
5065 return add_control(spec, type, name, cidx, val);
5066 }
5067
5068 #define add_pb_vol_ctrl(spec, type, pfx, val) \
5069 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", 0, val)
5070 #define add_pb_sw_ctrl(spec, type, pfx, val) \
5071 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", 0, val)
5072 #define __add_pb_vol_ctrl(spec, type, pfx, cidx, val) \
5073 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", cidx, val)
5074 #define __add_pb_sw_ctrl(spec, type, pfx, cidx, val) \
5075 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", cidx, val)
5076
5077 #define alc880_is_fixed_pin(nid) ((nid) >= 0x14 && (nid) <= 0x17)
5078 #define alc880_fixed_pin_idx(nid) ((nid) - 0x14)
5079 #define alc880_is_multi_pin(nid) ((nid) >= 0x18)
5080 #define alc880_multi_pin_idx(nid) ((nid) - 0x18)
5081 #define alc880_idx_to_dac(nid) ((nid) + 0x02)
5082 #define alc880_dac_to_idx(nid) ((nid) - 0x02)
5083 #define alc880_idx_to_mixer(nid) ((nid) + 0x0c)
5084 #define alc880_idx_to_selector(nid) ((nid) + 0x10)
5085 #define ALC880_PIN_CD_NID 0x1c
5086
5087 /* fill in the dac_nids table from the parsed pin configuration */
5088 static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
5089 const struct auto_pin_cfg *cfg)
5090 {
5091 hda_nid_t nid;
5092 int assigned[4];
5093 int i, j;
5094
5095 memset(assigned, 0, sizeof(assigned));
5096 spec->multiout.dac_nids = spec->private_dac_nids;
5097
5098 /* check the pins hardwired to audio widget */
5099 for (i = 0; i < cfg->line_outs; i++) {
5100 nid = cfg->line_out_pins[i];
5101 if (alc880_is_fixed_pin(nid)) {
5102 int idx = alc880_fixed_pin_idx(nid);
5103 spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
5104 assigned[idx] = 1;
5105 }
5106 }
5107 /* left pins can be connect to any audio widget */
5108 for (i = 0; i < cfg->line_outs; i++) {
5109 nid = cfg->line_out_pins[i];
5110 if (alc880_is_fixed_pin(nid))
5111 continue;
5112 /* search for an empty channel */
5113 for (j = 0; j < cfg->line_outs; j++) {
5114 if (!assigned[j]) {
5115 spec->multiout.dac_nids[i] =
5116 alc880_idx_to_dac(j);
5117 assigned[j] = 1;
5118 break;
5119 }
5120 }
5121 }
5122 spec->multiout.num_dacs = cfg->line_outs;
5123 return 0;
5124 }
5125
5126 static const char *alc_get_line_out_pfx(const struct auto_pin_cfg *cfg,
5127 bool can_be_master)
5128 {
5129 if (!cfg->hp_outs && !cfg->speaker_outs && can_be_master)
5130 return "Master";
5131
5132 switch (cfg->line_out_type) {
5133 case AUTO_PIN_SPEAKER_OUT:
5134 return "Speaker";
5135 case AUTO_PIN_HP_OUT:
5136 return "Headphone";
5137 default:
5138 if (cfg->line_outs == 1)
5139 return "PCM";
5140 break;
5141 }
5142 return NULL;
5143 }
5144
5145 /* add playback controls from the parsed DAC table */
5146 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
5147 const struct auto_pin_cfg *cfg)
5148 {
5149 static const char * const chname[4] = {
5150 "Front", "Surround", NULL /*CLFE*/, "Side"
5151 };
5152 const char *pfx = alc_get_line_out_pfx(cfg, false);
5153 hda_nid_t nid;
5154 int i, err;
5155
5156 for (i = 0; i < cfg->line_outs; i++) {
5157 if (!spec->multiout.dac_nids[i])
5158 continue;
5159 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
5160 if (!pfx && i == 2) {
5161 /* Center/LFE */
5162 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
5163 "Center",
5164 HDA_COMPOSE_AMP_VAL(nid, 1, 0,
5165 HDA_OUTPUT));
5166 if (err < 0)
5167 return err;
5168 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
5169 "LFE",
5170 HDA_COMPOSE_AMP_VAL(nid, 2, 0,
5171 HDA_OUTPUT));
5172 if (err < 0)
5173 return err;
5174 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
5175 "Center",
5176 HDA_COMPOSE_AMP_VAL(nid, 1, 2,
5177 HDA_INPUT));
5178 if (err < 0)
5179 return err;
5180 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
5181 "LFE",
5182 HDA_COMPOSE_AMP_VAL(nid, 2, 2,
5183 HDA_INPUT));
5184 if (err < 0)
5185 return err;
5186 } else {
5187 const char *name = pfx;
5188 if (!name)
5189 name = chname[i];
5190 err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
5191 name, i,
5192 HDA_COMPOSE_AMP_VAL(nid, 3, 0,
5193 HDA_OUTPUT));
5194 if (err < 0)
5195 return err;
5196 err = __add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
5197 name, i,
5198 HDA_COMPOSE_AMP_VAL(nid, 3, 2,
5199 HDA_INPUT));
5200 if (err < 0)
5201 return err;
5202 }
5203 }
5204 return 0;
5205 }
5206
5207 /* add playback controls for speaker and HP outputs */
5208 static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
5209 const char *pfx)
5210 {
5211 hda_nid_t nid;
5212 int err;
5213
5214 if (!pin)
5215 return 0;
5216
5217 if (alc880_is_fixed_pin(pin)) {
5218 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
5219 /* specify the DAC as the extra output */
5220 if (!spec->multiout.hp_nid)
5221 spec->multiout.hp_nid = nid;
5222 else
5223 spec->multiout.extra_out_nid[0] = nid;
5224 /* control HP volume/switch on the output mixer amp */
5225 nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
5226 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
5227 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
5228 if (err < 0)
5229 return err;
5230 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
5231 HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
5232 if (err < 0)
5233 return err;
5234 } else if (alc880_is_multi_pin(pin)) {
5235 /* set manual connection */
5236 /* we have only a switch on HP-out PIN */
5237 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
5238 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
5239 if (err < 0)
5240 return err;
5241 }
5242 return 0;
5243 }
5244
5245 /* create input playback/capture controls for the given pin */
5246 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
5247 const char *ctlname, int ctlidx,
5248 int idx, hda_nid_t mix_nid)
5249 {
5250 int err;
5251
5252 err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname, ctlidx,
5253 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
5254 if (err < 0)
5255 return err;
5256 err = __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname, ctlidx,
5257 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
5258 if (err < 0)
5259 return err;
5260 return 0;
5261 }
5262
5263 static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
5264 {
5265 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
5266 return (pincap & AC_PINCAP_IN) != 0;
5267 }
5268
5269 /* create playback/capture controls for input pins */
5270 static int alc_auto_create_input_ctls(struct hda_codec *codec,
5271 const struct auto_pin_cfg *cfg,
5272 hda_nid_t mixer,
5273 hda_nid_t cap1, hda_nid_t cap2)
5274 {
5275 struct alc_spec *spec = codec->spec;
5276 struct hda_input_mux *imux = &spec->private_imux[0];
5277 int i, err, idx, type_idx = 0;
5278 const char *prev_label = NULL;
5279
5280 for (i = 0; i < cfg->num_inputs; i++) {
5281 hda_nid_t pin;
5282 const char *label;
5283
5284 pin = cfg->inputs[i].pin;
5285 if (!alc_is_input_pin(codec, pin))
5286 continue;
5287
5288 label = hda_get_autocfg_input_label(codec, cfg, i);
5289 if (prev_label && !strcmp(label, prev_label))
5290 type_idx++;
5291 else
5292 type_idx = 0;
5293 prev_label = label;
5294
5295 if (mixer) {
5296 idx = get_connection_index(codec, mixer, pin);
5297 if (idx >= 0) {
5298 err = new_analog_input(spec, pin,
5299 label, type_idx,
5300 idx, mixer);
5301 if (err < 0)
5302 return err;
5303 }
5304 }
5305
5306 if (!cap1)
5307 continue;
5308 idx = get_connection_index(codec, cap1, pin);
5309 if (idx < 0 && cap2)
5310 idx = get_connection_index(codec, cap2, pin);
5311 if (idx >= 0)
5312 snd_hda_add_imux_item(imux, label, idx, NULL);
5313 }
5314 return 0;
5315 }
5316
5317 static int alc880_auto_create_input_ctls(struct hda_codec *codec,
5318 const struct auto_pin_cfg *cfg)
5319 {
5320 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
5321 }
5322
5323 static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
5324 unsigned int pin_type)
5325 {
5326 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5327 pin_type);
5328 /* unmute pin */
5329 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
5330 AMP_OUT_UNMUTE);
5331 }
5332
5333 static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
5334 hda_nid_t nid, int pin_type,
5335 int dac_idx)
5336 {
5337 alc_set_pin_output(codec, nid, pin_type);
5338 /* need the manual connection? */
5339 if (alc880_is_multi_pin(nid)) {
5340 struct alc_spec *spec = codec->spec;
5341 int idx = alc880_multi_pin_idx(nid);
5342 snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
5343 AC_VERB_SET_CONNECT_SEL,
5344 alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
5345 }
5346 }
5347
5348 static int get_pin_type(int line_out_type)
5349 {
5350 if (line_out_type == AUTO_PIN_HP_OUT)
5351 return PIN_HP;
5352 else
5353 return PIN_OUT;
5354 }
5355
5356 static void alc880_auto_init_multi_out(struct hda_codec *codec)
5357 {
5358 struct alc_spec *spec = codec->spec;
5359 int i;
5360
5361 for (i = 0; i < spec->autocfg.line_outs; i++) {
5362 hda_nid_t nid = spec->autocfg.line_out_pins[i];
5363 int pin_type = get_pin_type(spec->autocfg.line_out_type);
5364 alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
5365 }
5366 }
5367
5368 static void alc880_auto_init_extra_out(struct hda_codec *codec)
5369 {
5370 struct alc_spec *spec = codec->spec;
5371 hda_nid_t pin;
5372
5373 pin = spec->autocfg.speaker_pins[0];
5374 if (pin) /* connect to front */
5375 alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
5376 pin = spec->autocfg.hp_pins[0];
5377 if (pin) /* connect to front */
5378 alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
5379 }
5380
5381 static void alc880_auto_init_analog_input(struct hda_codec *codec)
5382 {
5383 struct alc_spec *spec = codec->spec;
5384 struct auto_pin_cfg *cfg = &spec->autocfg;
5385 int i;
5386
5387 for (i = 0; i < cfg->num_inputs; i++) {
5388 hda_nid_t nid = cfg->inputs[i].pin;
5389 if (alc_is_input_pin(codec, nid)) {
5390 alc_set_input_pin(codec, nid, cfg->inputs[i].type);
5391 if (nid != ALC880_PIN_CD_NID &&
5392 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
5393 snd_hda_codec_write(codec, nid, 0,
5394 AC_VERB_SET_AMP_GAIN_MUTE,
5395 AMP_OUT_MUTE);
5396 }
5397 }
5398 }
5399
5400 static void alc880_auto_init_input_src(struct hda_codec *codec)
5401 {
5402 struct alc_spec *spec = codec->spec;
5403 int c;
5404
5405 for (c = 0; c < spec->num_adc_nids; c++) {
5406 unsigned int mux_idx;
5407 const struct hda_input_mux *imux;
5408 mux_idx = c >= spec->num_mux_defs ? 0 : c;
5409 imux = &spec->input_mux[mux_idx];
5410 if (!imux->num_items && mux_idx > 0)
5411 imux = &spec->input_mux[0];
5412 if (imux)
5413 snd_hda_codec_write(codec, spec->adc_nids[c], 0,
5414 AC_VERB_SET_CONNECT_SEL,
5415 imux->items[0].index);
5416 }
5417 }
5418
5419 /* parse the BIOS configuration and set up the alc_spec */
5420 /* return 1 if successful, 0 if the proper config is not found,
5421 * or a negative error code
5422 */
5423 static int alc880_parse_auto_config(struct hda_codec *codec)
5424 {
5425 struct alc_spec *spec = codec->spec;
5426 int err;
5427 static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
5428
5429 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
5430 alc880_ignore);
5431 if (err < 0)
5432 return err;
5433 if (!spec->autocfg.line_outs)
5434 return 0; /* can't find valid BIOS pin config */
5435
5436 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
5437 if (err < 0)
5438 return err;
5439 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
5440 if (err < 0)
5441 return err;
5442 err = alc880_auto_create_extra_out(spec,
5443 spec->autocfg.speaker_pins[0],
5444 "Speaker");
5445 if (err < 0)
5446 return err;
5447 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
5448 "Headphone");
5449 if (err < 0)
5450 return err;
5451 err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
5452 if (err < 0)
5453 return err;
5454
5455 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
5456
5457 alc_auto_parse_digital(codec);
5458
5459 if (spec->kctls.list)
5460 add_mixer(spec, spec->kctls.list);
5461
5462 add_verb(spec, alc880_volume_init_verbs);
5463
5464 spec->num_mux_defs = 1;
5465 spec->input_mux = &spec->private_imux[0];
5466
5467 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
5468
5469 return 1;
5470 }
5471
5472 /* additional initialization for auto-configuration model */
5473 static void alc880_auto_init(struct hda_codec *codec)
5474 {
5475 struct alc_spec *spec = codec->spec;
5476 alc880_auto_init_multi_out(codec);
5477 alc880_auto_init_extra_out(codec);
5478 alc880_auto_init_analog_input(codec);
5479 alc880_auto_init_input_src(codec);
5480 alc_auto_init_digital(codec);
5481 if (spec->unsol_event)
5482 alc_inithook(codec);
5483 }
5484
5485 /* check the ADC/MUX contains all input pins; some ADC/MUX contains only
5486 * one of two digital mic pins, e.g. on ALC272
5487 */
5488 static void fixup_automic_adc(struct hda_codec *codec)
5489 {
5490 struct alc_spec *spec = codec->spec;
5491 int i;
5492
5493 for (i = 0; i < spec->num_adc_nids; i++) {
5494 hda_nid_t cap = spec->capsrc_nids ?
5495 spec->capsrc_nids[i] : spec->adc_nids[i];
5496 int iidx, eidx;
5497
5498 iidx = get_connection_index(codec, cap, spec->int_mic.pin);
5499 if (iidx < 0)
5500 continue;
5501 eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
5502 if (eidx < 0)
5503 continue;
5504 spec->int_mic.mux_idx = iidx;
5505 spec->ext_mic.mux_idx = eidx;
5506 if (spec->capsrc_nids)
5507 spec->capsrc_nids += i;
5508 spec->adc_nids += i;
5509 spec->num_adc_nids = 1;
5510 return;
5511 }
5512 snd_printd(KERN_INFO "hda_codec: %s: "
5513 "No ADC/MUX containing both 0x%x and 0x%x pins\n",
5514 codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
5515 spec->auto_mic = 0; /* disable auto-mic to be sure */
5516 }
5517
5518 /* select or unmute the given capsrc route */
5519 static void select_or_unmute_capsrc(struct hda_codec *codec, hda_nid_t cap,
5520 int idx)
5521 {
5522 if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
5523 snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
5524 HDA_AMP_MUTE, 0);
5525 } else {
5526 snd_hda_codec_write_cache(codec, cap, 0,
5527 AC_VERB_SET_CONNECT_SEL, idx);
5528 }
5529 }
5530
5531 /* set the default connection to that pin */
5532 static int init_capsrc_for_pin(struct hda_codec *codec, hda_nid_t pin)
5533 {
5534 struct alc_spec *spec = codec->spec;
5535 int i;
5536
5537 for (i = 0; i < spec->num_adc_nids; i++) {
5538 hda_nid_t cap = spec->capsrc_nids ?
5539 spec->capsrc_nids[i] : spec->adc_nids[i];
5540 int idx;
5541
5542 idx = get_connection_index(codec, cap, pin);
5543 if (idx < 0)
5544 continue;
5545 select_or_unmute_capsrc(codec, cap, idx);
5546 return i; /* return the found index */
5547 }
5548 return -1; /* not found */
5549 }
5550
5551 /* choose the ADC/MUX containing the input pin and initialize the setup */
5552 static void fixup_single_adc(struct hda_codec *codec)
5553 {
5554 struct alc_spec *spec = codec->spec;
5555 struct auto_pin_cfg *cfg = &spec->autocfg;
5556 int i;
5557
5558 /* search for the input pin; there must be only one */
5559 if (cfg->num_inputs != 1)
5560 return;
5561 i = init_capsrc_for_pin(codec, cfg->inputs[0].pin);
5562 if (i >= 0) {
5563 /* use only this ADC */
5564 if (spec->capsrc_nids)
5565 spec->capsrc_nids += i;
5566 spec->adc_nids += i;
5567 spec->num_adc_nids = 1;
5568 }
5569 }
5570
5571 /* initialize dual adcs */
5572 static void fixup_dual_adc_switch(struct hda_codec *codec)
5573 {
5574 struct alc_spec *spec = codec->spec;
5575 init_capsrc_for_pin(codec, spec->ext_mic.pin);
5576 init_capsrc_for_pin(codec, spec->int_mic.pin);
5577 }
5578
5579 static void set_capture_mixer(struct hda_codec *codec)
5580 {
5581 struct alc_spec *spec = codec->spec;
5582 static struct snd_kcontrol_new *caps[2][3] = {
5583 { alc_capture_mixer_nosrc1,
5584 alc_capture_mixer_nosrc2,
5585 alc_capture_mixer_nosrc3 },
5586 { alc_capture_mixer1,
5587 alc_capture_mixer2,
5588 alc_capture_mixer3 },
5589 };
5590 if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
5591 int mux = 0;
5592 int num_adcs = spec->num_adc_nids;
5593 if (spec->dual_adc_switch)
5594 fixup_dual_adc_switch(codec);
5595 else if (spec->auto_mic)
5596 fixup_automic_adc(codec);
5597 else if (spec->input_mux) {
5598 if (spec->input_mux->num_items > 1)
5599 mux = 1;
5600 else if (spec->input_mux->num_items == 1)
5601 fixup_single_adc(codec);
5602 }
5603 if (spec->dual_adc_switch)
5604 num_adcs = 1;
5605 spec->cap_mixer = caps[mux][num_adcs - 1];
5606 }
5607 }
5608
5609 /* fill adc_nids (and capsrc_nids) containing all active input pins */
5610 static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids,
5611 int num_nids)
5612 {
5613 struct alc_spec *spec = codec->spec;
5614 struct auto_pin_cfg *cfg = &spec->autocfg;
5615 int n;
5616 hda_nid_t fallback_adc = 0, fallback_cap = 0;
5617
5618 for (n = 0; n < num_nids; n++) {
5619 hda_nid_t adc, cap;
5620 hda_nid_t conn[HDA_MAX_NUM_INPUTS];
5621 int nconns, i, j;
5622
5623 adc = nids[n];
5624 if (get_wcaps_type(get_wcaps(codec, adc)) != AC_WID_AUD_IN)
5625 continue;
5626 cap = adc;
5627 nconns = snd_hda_get_connections(codec, cap, conn,
5628 ARRAY_SIZE(conn));
5629 if (nconns == 1) {
5630 cap = conn[0];
5631 nconns = snd_hda_get_connections(codec, cap, conn,
5632 ARRAY_SIZE(conn));
5633 }
5634 if (nconns <= 0)
5635 continue;
5636 if (!fallback_adc) {
5637 fallback_adc = adc;
5638 fallback_cap = cap;
5639 }
5640 for (i = 0; i < cfg->num_inputs; i++) {
5641 hda_nid_t nid = cfg->inputs[i].pin;
5642 for (j = 0; j < nconns; j++) {
5643 if (conn[j] == nid)
5644 break;
5645 }
5646 if (j >= nconns)
5647 break;
5648 }
5649 if (i >= cfg->num_inputs) {
5650 int num_adcs = spec->num_adc_nids;
5651 spec->private_adc_nids[num_adcs] = adc;
5652 spec->private_capsrc_nids[num_adcs] = cap;
5653 spec->num_adc_nids++;
5654 spec->adc_nids = spec->private_adc_nids;
5655 if (adc != cap)
5656 spec->capsrc_nids = spec->private_capsrc_nids;
5657 }
5658 }
5659 if (!spec->num_adc_nids) {
5660 printk(KERN_WARNING "hda_codec: %s: no valid ADC found;"
5661 " using fallback 0x%x\n",
5662 codec->chip_name, fallback_adc);
5663 spec->private_adc_nids[0] = fallback_adc;
5664 spec->adc_nids = spec->private_adc_nids;
5665 if (fallback_adc != fallback_cap) {
5666 spec->private_capsrc_nids[0] = fallback_cap;
5667 spec->capsrc_nids = spec->private_adc_nids;
5668 }
5669 }
5670 }
5671
5672 #ifdef CONFIG_SND_HDA_INPUT_BEEP
5673 #define set_beep_amp(spec, nid, idx, dir) \
5674 ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
5675
5676 static struct snd_pci_quirk beep_white_list[] = {
5677 SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
5678 SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
5679 SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
5680 {}
5681 };
5682
5683 static inline int has_cdefine_beep(struct hda_codec *codec)
5684 {
5685 struct alc_spec *spec = codec->spec;
5686 const struct snd_pci_quirk *q;
5687 q = snd_pci_quirk_lookup(codec->bus->pci, beep_white_list);
5688 if (q)
5689 return q->value;
5690 return spec->cdefine.enable_pcbeep;
5691 }
5692 #else
5693 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
5694 #define has_cdefine_beep(codec) 0
5695 #endif
5696
5697 /*
5698 * OK, here we have finally the patch for ALC880
5699 */
5700
5701 static int patch_alc880(struct hda_codec *codec)
5702 {
5703 struct alc_spec *spec;
5704 int board_config;
5705 int err;
5706
5707 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5708 if (spec == NULL)
5709 return -ENOMEM;
5710
5711 codec->spec = spec;
5712
5713 board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
5714 alc880_models,
5715 alc880_cfg_tbl);
5716 if (board_config < 0) {
5717 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5718 codec->chip_name);
5719 board_config = ALC880_AUTO;
5720 }
5721
5722 if (board_config == ALC880_AUTO) {
5723 /* automatic parse from the BIOS config */
5724 err = alc880_parse_auto_config(codec);
5725 if (err < 0) {
5726 alc_free(codec);
5727 return err;
5728 } else if (!err) {
5729 printk(KERN_INFO
5730 "hda_codec: Cannot set up configuration "
5731 "from BIOS. Using 3-stack mode...\n");
5732 board_config = ALC880_3ST;
5733 }
5734 }
5735
5736 err = snd_hda_attach_beep_device(codec, 0x1);
5737 if (err < 0) {
5738 alc_free(codec);
5739 return err;
5740 }
5741
5742 if (board_config != ALC880_AUTO)
5743 setup_preset(codec, &alc880_presets[board_config]);
5744
5745 spec->stream_analog_playback = &alc880_pcm_analog_playback;
5746 spec->stream_analog_capture = &alc880_pcm_analog_capture;
5747 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
5748
5749 spec->stream_digital_playback = &alc880_pcm_digital_playback;
5750 spec->stream_digital_capture = &alc880_pcm_digital_capture;
5751
5752 if (!spec->adc_nids && spec->input_mux) {
5753 /* check whether NID 0x07 is valid */
5754 unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
5755 /* get type */
5756 wcap = get_wcaps_type(wcap);
5757 if (wcap != AC_WID_AUD_IN) {
5758 spec->adc_nids = alc880_adc_nids_alt;
5759 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
5760 } else {
5761 spec->adc_nids = alc880_adc_nids;
5762 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
5763 }
5764 }
5765 set_capture_mixer(codec);
5766 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
5767
5768 spec->vmaster_nid = 0x0c;
5769
5770 codec->patch_ops = alc_patch_ops;
5771 if (board_config == ALC880_AUTO)
5772 spec->init_hook = alc880_auto_init;
5773 #ifdef CONFIG_SND_HDA_POWER_SAVE
5774 if (!spec->loopback.amplist)
5775 spec->loopback.amplist = alc880_loopbacks;
5776 #endif
5777
5778 return 0;
5779 }
5780
5781
5782 /*
5783 * ALC260 support
5784 */
5785
5786 static hda_nid_t alc260_dac_nids[1] = {
5787 /* front */
5788 0x02,
5789 };
5790
5791 static hda_nid_t alc260_adc_nids[1] = {
5792 /* ADC0 */
5793 0x04,
5794 };
5795
5796 static hda_nid_t alc260_adc_nids_alt[1] = {
5797 /* ADC1 */
5798 0x05,
5799 };
5800
5801 /* NIDs used when simultaneous access to both ADCs makes sense. Note that
5802 * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
5803 */
5804 static hda_nid_t alc260_dual_adc_nids[2] = {
5805 /* ADC0, ADC1 */
5806 0x04, 0x05
5807 };
5808
5809 #define ALC260_DIGOUT_NID 0x03
5810 #define ALC260_DIGIN_NID 0x06
5811
5812 static struct hda_input_mux alc260_capture_source = {
5813 .num_items = 4,
5814 .items = {
5815 { "Mic", 0x0 },
5816 { "Front Mic", 0x1 },
5817 { "Line", 0x2 },
5818 { "CD", 0x4 },
5819 },
5820 };
5821
5822 /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
5823 * headphone jack and the internal CD lines since these are the only pins at
5824 * which audio can appear. For flexibility, also allow the option of
5825 * recording the mixer output on the second ADC (ADC0 doesn't have a
5826 * connection to the mixer output).
5827 */
5828 static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
5829 {
5830 .num_items = 3,
5831 .items = {
5832 { "Mic/Line", 0x0 },
5833 { "CD", 0x4 },
5834 { "Headphone", 0x2 },
5835 },
5836 },
5837 {
5838 .num_items = 4,
5839 .items = {
5840 { "Mic/Line", 0x0 },
5841 { "CD", 0x4 },
5842 { "Headphone", 0x2 },
5843 { "Mixer", 0x5 },
5844 },
5845 },
5846
5847 };
5848
5849 /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
5850 * the Fujitsu S702x, but jacks are marked differently.
5851 */
5852 static struct hda_input_mux alc260_acer_capture_sources[2] = {
5853 {
5854 .num_items = 4,
5855 .items = {
5856 { "Mic", 0x0 },
5857 { "Line", 0x2 },
5858 { "CD", 0x4 },
5859 { "Headphone", 0x5 },
5860 },
5861 },
5862 {
5863 .num_items = 5,
5864 .items = {
5865 { "Mic", 0x0 },
5866 { "Line", 0x2 },
5867 { "CD", 0x4 },
5868 { "Headphone", 0x6 },
5869 { "Mixer", 0x5 },
5870 },
5871 },
5872 };
5873
5874 /* Maxdata Favorit 100XS */
5875 static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5876 {
5877 .num_items = 2,
5878 .items = {
5879 { "Line/Mic", 0x0 },
5880 { "CD", 0x4 },
5881 },
5882 },
5883 {
5884 .num_items = 3,
5885 .items = {
5886 { "Line/Mic", 0x0 },
5887 { "CD", 0x4 },
5888 { "Mixer", 0x5 },
5889 },
5890 },
5891 };
5892
5893 /*
5894 * This is just place-holder, so there's something for alc_build_pcms to look
5895 * at when it calculates the maximum number of channels. ALC260 has no mixer
5896 * element which allows changing the channel mode, so the verb list is
5897 * never used.
5898 */
5899 static struct hda_channel_mode alc260_modes[1] = {
5900 { 2, NULL },
5901 };
5902
5903
5904 /* Mixer combinations
5905 *
5906 * basic: base_output + input + pc_beep + capture
5907 * HP: base_output + input + capture_alt
5908 * HP_3013: hp_3013 + input + capture
5909 * fujitsu: fujitsu + capture
5910 * acer: acer + capture
5911 */
5912
5913 static struct snd_kcontrol_new alc260_base_output_mixer[] = {
5914 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5915 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5916 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5917 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5918 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5919 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5920 { } /* end */
5921 };
5922
5923 static struct snd_kcontrol_new alc260_input_mixer[] = {
5924 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5925 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5926 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5927 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5928 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5929 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5930 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5931 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
5932 { } /* end */
5933 };
5934
5935 /* update HP, line and mono out pins according to the master switch */
5936 static void alc260_hp_master_update(struct hda_codec *codec,
5937 hda_nid_t hp, hda_nid_t line,
5938 hda_nid_t mono)
5939 {
5940 struct alc_spec *spec = codec->spec;
5941 unsigned int val = spec->master_sw ? PIN_HP : 0;
5942 /* change HP and line-out pins */
5943 snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5944 val);
5945 snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5946 val);
5947 /* mono (speaker) depending on the HP jack sense */
5948 val = (val && !spec->jack_present) ? PIN_OUT : 0;
5949 snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5950 val);
5951 }
5952
5953 static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5954 struct snd_ctl_elem_value *ucontrol)
5955 {
5956 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5957 struct alc_spec *spec = codec->spec;
5958 *ucontrol->value.integer.value = spec->master_sw;
5959 return 0;
5960 }
5961
5962 static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5963 struct snd_ctl_elem_value *ucontrol)
5964 {
5965 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5966 struct alc_spec *spec = codec->spec;
5967 int val = !!*ucontrol->value.integer.value;
5968 hda_nid_t hp, line, mono;
5969
5970 if (val == spec->master_sw)
5971 return 0;
5972 spec->master_sw = val;
5973 hp = (kcontrol->private_value >> 16) & 0xff;
5974 line = (kcontrol->private_value >> 8) & 0xff;
5975 mono = kcontrol->private_value & 0xff;
5976 alc260_hp_master_update(codec, hp, line, mono);
5977 return 1;
5978 }
5979
5980 static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5981 {
5982 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5983 .name = "Master Playback Switch",
5984 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5985 .info = snd_ctl_boolean_mono_info,
5986 .get = alc260_hp_master_sw_get,
5987 .put = alc260_hp_master_sw_put,
5988 .private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5989 },
5990 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5991 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5992 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5993 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5994 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5995 HDA_OUTPUT),
5996 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5997 { } /* end */
5998 };
5999
6000 static struct hda_verb alc260_hp_unsol_verbs[] = {
6001 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6002 {},
6003 };
6004
6005 static void alc260_hp_automute(struct hda_codec *codec)
6006 {
6007 struct alc_spec *spec = codec->spec;
6008
6009 spec->jack_present = snd_hda_jack_detect(codec, 0x10);
6010 alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
6011 }
6012
6013 static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
6014 {
6015 if ((res >> 26) == ALC880_HP_EVENT)
6016 alc260_hp_automute(codec);
6017 }
6018
6019 static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
6020 {
6021 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
6022 .name = "Master Playback Switch",
6023 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
6024 .info = snd_ctl_boolean_mono_info,
6025 .get = alc260_hp_master_sw_get,
6026 .put = alc260_hp_master_sw_put,
6027 .private_value = (0x15 << 16) | (0x10 << 8) | 0x11
6028 },
6029 HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
6030 HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
6031 HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
6032 HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
6033 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6034 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
6035 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
6036 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
6037 { } /* end */
6038 };
6039
6040 static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
6041 .ops = &snd_hda_bind_vol,
6042 .values = {
6043 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
6044 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
6045 HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
6046 0
6047 },
6048 };
6049
6050 static struct hda_bind_ctls alc260_dc7600_bind_switch = {
6051 .ops = &snd_hda_bind_sw,
6052 .values = {
6053 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
6054 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
6055 0
6056 },
6057 };
6058
6059 static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
6060 HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
6061 HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
6062 HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
6063 HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
6064 { } /* end */
6065 };
6066
6067 static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
6068 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6069 {},
6070 };
6071
6072 static void alc260_hp_3013_automute(struct hda_codec *codec)
6073 {
6074 struct alc_spec *spec = codec->spec;
6075
6076 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
6077 alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
6078 }
6079
6080 static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
6081 unsigned int res)
6082 {
6083 if ((res >> 26) == ALC880_HP_EVENT)
6084 alc260_hp_3013_automute(codec);
6085 }
6086
6087 static void alc260_hp_3012_automute(struct hda_codec *codec)
6088 {
6089 unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
6090
6091 snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6092 bits);
6093 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6094 bits);
6095 snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6096 bits);
6097 }
6098
6099 static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
6100 unsigned int res)
6101 {
6102 if ((res >> 26) == ALC880_HP_EVENT)
6103 alc260_hp_3012_automute(codec);
6104 }
6105
6106 /* Fujitsu S702x series laptops. ALC260 pin usage: Mic/Line jack = 0x12,
6107 * HP jack = 0x14, CD audio = 0x16, internal speaker = 0x10.
6108 */
6109 static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
6110 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6111 HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
6112 ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
6113 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
6114 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
6115 HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
6116 HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
6117 ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
6118 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
6119 HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
6120 { } /* end */
6121 };
6122
6123 /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks. Note that current
6124 * versions of the ALC260 don't act on requests to enable mic bias from NID
6125 * 0x0f (used to drive the headphone jack in these laptops). The ALC260
6126 * datasheet doesn't mention this restriction. At this stage it's not clear
6127 * whether this behaviour is intentional or is a hardware bug in chip
6128 * revisions available in early 2006. Therefore for now allow the
6129 * "Headphone Jack Mode" control to span all choices, but if it turns out
6130 * that the lack of mic bias for this NID is intentional we could change the
6131 * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
6132 *
6133 * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
6134 * don't appear to make the mic bias available from the "line" jack, even
6135 * though the NID used for this jack (0x14) can supply it. The theory is
6136 * that perhaps Acer have included blocking capacitors between the ALC260
6137 * and the output jack. If this turns out to be the case for all such
6138 * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
6139 * to ALC_PIN_DIR_INOUT_NOMICBIAS.
6140 *
6141 * The C20x Tablet series have a mono internal speaker which is controlled
6142 * via the chip's Mono sum widget and pin complex, so include the necessary
6143 * controls for such models. On models without a "mono speaker" the control
6144 * won't do anything.
6145 */
6146 static struct snd_kcontrol_new alc260_acer_mixer[] = {
6147 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6148 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
6149 ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
6150 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
6151 HDA_OUTPUT),
6152 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
6153 HDA_INPUT),
6154 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
6155 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
6156 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
6157 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
6158 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
6159 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
6160 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
6161 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
6162 { } /* end */
6163 };
6164
6165 /* Maxdata Favorit 100XS: one output and one input (0x12) jack
6166 */
6167 static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
6168 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6169 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
6170 ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
6171 HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
6172 HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
6173 ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
6174 { } /* end */
6175 };
6176
6177 /* Packard bell V7900 ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
6178 * Line In jack = 0x14, CD audio = 0x16, pc beep = 0x17.
6179 */
6180 static struct snd_kcontrol_new alc260_will_mixer[] = {
6181 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6182 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
6183 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
6184 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
6185 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
6186 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
6187 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
6188 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
6189 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
6190 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
6191 { } /* end */
6192 };
6193
6194 /* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
6195 * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
6196 */
6197 static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
6198 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6199 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
6200 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
6201 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
6202 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
6203 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
6204 HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
6205 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
6206 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
6207 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
6208 { } /* end */
6209 };
6210
6211 /*
6212 * initialization verbs
6213 */
6214 static struct hda_verb alc260_init_verbs[] = {
6215 /* Line In pin widget for input */
6216 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6217 /* CD pin widget for input */
6218 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6219 /* Mic1 (rear panel) pin widget for input and vref at 80% */
6220 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
6221 /* Mic2 (front panel) pin widget for input and vref at 80% */
6222 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
6223 /* LINE-2 is used for line-out in rear */
6224 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6225 /* select line-out */
6226 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
6227 /* LINE-OUT pin */
6228 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6229 /* enable HP */
6230 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6231 /* enable Mono */
6232 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6233 /* mute capture amp left and right */
6234 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6235 /* set connection select to line in (default select for this ADC) */
6236 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
6237 /* mute capture amp left and right */
6238 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6239 /* set connection select to line in (default select for this ADC) */
6240 {0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
6241 /* set vol=0 Line-Out mixer amp left and right */
6242 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6243 /* unmute pin widget amp left and right (no gain on this amp) */
6244 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6245 /* set vol=0 HP mixer amp left and right */
6246 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6247 /* unmute pin widget amp left and right (no gain on this amp) */
6248 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6249 /* set vol=0 Mono mixer amp left and right */
6250 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6251 /* unmute pin widget amp left and right (no gain on this amp) */
6252 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6253 /* unmute LINE-2 out pin */
6254 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6255 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
6256 * Line In 2 = 0x03
6257 */
6258 /* mute analog inputs */
6259 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6260 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6261 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6262 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6263 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6264 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
6265 /* mute Front out path */
6266 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6267 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6268 /* mute Headphone out path */
6269 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6270 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6271 /* mute Mono out path */
6272 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6273 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6274 { }
6275 };
6276
6277 #if 0 /* should be identical with alc260_init_verbs? */
6278 static struct hda_verb alc260_hp_init_verbs[] = {
6279 /* Headphone and output */
6280 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
6281 /* mono output */
6282 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
6283 /* Mic1 (rear panel) pin widget for input and vref at 80% */
6284 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
6285 /* Mic2 (front panel) pin widget for input and vref at 80% */
6286 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
6287 /* Line In pin widget for input */
6288 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
6289 /* Line-2 pin widget for output */
6290 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
6291 /* CD pin widget for input */
6292 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
6293 /* unmute amp left and right */
6294 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
6295 /* set connection select to line in (default select for this ADC) */
6296 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
6297 /* unmute Line-Out mixer amp left and right (volume = 0) */
6298 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
6299 /* mute pin widget amp left and right (no gain on this amp) */
6300 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
6301 /* unmute HP mixer amp left and right (volume = 0) */
6302 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
6303 /* mute pin widget amp left and right (no gain on this amp) */
6304 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
6305 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
6306 * Line In 2 = 0x03
6307 */
6308 /* mute analog inputs */
6309 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6310 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6311 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6312 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6313 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6314 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
6315 /* Unmute Front out path */
6316 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
6317 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
6318 /* Unmute Headphone out path */
6319 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
6320 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
6321 /* Unmute Mono out path */
6322 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
6323 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
6324 { }
6325 };
6326 #endif
6327
6328 static struct hda_verb alc260_hp_3013_init_verbs[] = {
6329 /* Line out and output */
6330 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
6331 /* mono output */
6332 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
6333 /* Mic1 (rear panel) pin widget for input and vref at 80% */
6334 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
6335 /* Mic2 (front panel) pin widget for input and vref at 80% */
6336 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
6337 /* Line In pin widget for input */
6338 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
6339 /* Headphone pin widget for output */
6340 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
6341 /* CD pin widget for input */
6342 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
6343 /* unmute amp left and right */
6344 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
6345 /* set connection select to line in (default select for this ADC) */
6346 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
6347 /* unmute Line-Out mixer amp left and right (volume = 0) */
6348 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
6349 /* mute pin widget amp left and right (no gain on this amp) */
6350 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
6351 /* unmute HP mixer amp left and right (volume = 0) */
6352 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
6353 /* mute pin widget amp left and right (no gain on this amp) */
6354 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
6355 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
6356 * Line In 2 = 0x03
6357 */
6358 /* mute analog inputs */
6359 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6360 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6361 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6362 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6363 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6364 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
6365 /* Unmute Front out path */
6366 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
6367 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
6368 /* Unmute Headphone out path */
6369 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
6370 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
6371 /* Unmute Mono out path */
6372 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
6373 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
6374 { }
6375 };
6376
6377 /* Initialisation sequence for ALC260 as configured in Fujitsu S702x
6378 * laptops. ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
6379 * audio = 0x16, internal speaker = 0x10.
6380 */
6381 static struct hda_verb alc260_fujitsu_init_verbs[] = {
6382 /* Disable all GPIOs */
6383 {0x01, AC_VERB_SET_GPIO_MASK, 0},
6384 /* Internal speaker is connected to headphone pin */
6385 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6386 /* Headphone/Line-out jack connects to Line1 pin; make it an output */
6387 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6388 /* Mic/Line-in jack is connected to mic1 pin, so make it an input */
6389 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6390 /* Ensure all other unused pins are disabled and muted. */
6391 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6392 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6393 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6394 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6395 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6396 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6397 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6398 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6399
6400 /* Disable digital (SPDIF) pins */
6401 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6402 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6403
6404 /* Ensure Line1 pin widget takes its input from the OUT1 sum bus
6405 * when acting as an output.
6406 */
6407 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6408
6409 /* Start with output sum widgets muted and their output gains at min */
6410 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6411 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6412 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6413 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6414 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6415 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6416 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6417 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6418 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6419
6420 /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
6421 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6422 /* Unmute Line1 pin widget output buffer since it starts as an output.
6423 * If the pin mode is changed by the user the pin mode control will
6424 * take care of enabling the pin's input/output buffers as needed.
6425 * Therefore there's no need to enable the input buffer at this
6426 * stage.
6427 */
6428 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6429 /* Unmute input buffer of pin widget used for Line-in (no equiv
6430 * mixer ctrl)
6431 */
6432 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6433
6434 /* Mute capture amp left and right */
6435 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6436 /* Set ADC connection select to match default mixer setting - line
6437 * in (on mic1 pin)
6438 */
6439 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6440
6441 /* Do the same for the second ADC: mute capture input amp and
6442 * set ADC connection to line in (on mic1 pin)
6443 */
6444 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6445 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6446
6447 /* Mute all inputs to mixer widget (even unconnected ones) */
6448 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6449 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6450 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6451 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6452 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6453 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6454 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6455 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6456
6457 { }
6458 };
6459
6460 /* Initialisation sequence for ALC260 as configured in Acer TravelMate and
6461 * similar laptops (adapted from Fujitsu init verbs).
6462 */
6463 static struct hda_verb alc260_acer_init_verbs[] = {
6464 /* On TravelMate laptops, GPIO 0 enables the internal speaker and
6465 * the headphone jack. Turn this on and rely on the standard mute
6466 * methods whenever the user wants to turn these outputs off.
6467 */
6468 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6469 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6470 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
6471 /* Internal speaker/Headphone jack is connected to Line-out pin */
6472 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6473 /* Internal microphone/Mic jack is connected to Mic1 pin */
6474 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
6475 /* Line In jack is connected to Line1 pin */
6476 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6477 /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
6478 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6479 /* Ensure all other unused pins are disabled and muted. */
6480 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6481 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6482 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6483 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6484 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6485 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6486 /* Disable digital (SPDIF) pins */
6487 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6488 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6489
6490 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
6491 * bus when acting as outputs.
6492 */
6493 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6494 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6495
6496 /* Start with output sum widgets muted and their output gains at min */
6497 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6498 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6499 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6500 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6501 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6502 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6503 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6504 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6505 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6506
6507 /* Unmute Line-out pin widget amp left and right
6508 * (no equiv mixer ctrl)
6509 */
6510 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6511 /* Unmute mono pin widget amp output (no equiv mixer ctrl) */
6512 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6513 /* Unmute Mic1 and Line1 pin widget input buffers since they start as
6514 * inputs. If the pin mode is changed by the user the pin mode control
6515 * will take care of enabling the pin's input/output buffers as needed.
6516 * Therefore there's no need to enable the input buffer at this
6517 * stage.
6518 */
6519 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6520 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6521
6522 /* Mute capture amp left and right */
6523 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6524 /* Set ADC connection select to match default mixer setting - mic
6525 * (on mic1 pin)
6526 */
6527 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6528
6529 /* Do similar with the second ADC: mute capture input amp and
6530 * set ADC connection to mic to match ALSA's default state.
6531 */
6532 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6533 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6534
6535 /* Mute all inputs to mixer widget (even unconnected ones) */
6536 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6537 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6538 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6539 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6540 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6541 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6542 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6543 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6544
6545 { }
6546 };
6547
6548 /* Initialisation sequence for Maxdata Favorit 100XS
6549 * (adapted from Acer init verbs).
6550 */
6551 static struct hda_verb alc260_favorit100_init_verbs[] = {
6552 /* GPIO 0 enables the output jack.
6553 * Turn this on and rely on the standard mute
6554 * methods whenever the user wants to turn these outputs off.
6555 */
6556 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6557 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6558 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
6559 /* Line/Mic input jack is connected to Mic1 pin */
6560 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
6561 /* Ensure all other unused pins are disabled and muted. */
6562 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6563 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6564 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6565 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6566 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6567 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6568 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6569 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6570 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6571 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6572 /* Disable digital (SPDIF) pins */
6573 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6574 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6575
6576 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
6577 * bus when acting as outputs.
6578 */
6579 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6580 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6581
6582 /* Start with output sum widgets muted and their output gains at min */
6583 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6584 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6585 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6586 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6587 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6588 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6589 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6590 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6591 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6592
6593 /* Unmute Line-out pin widget amp left and right
6594 * (no equiv mixer ctrl)
6595 */
6596 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6597 /* Unmute Mic1 and Line1 pin widget input buffers since they start as
6598 * inputs. If the pin mode is changed by the user the pin mode control
6599 * will take care of enabling the pin's input/output buffers as needed.
6600 * Therefore there's no need to enable the input buffer at this
6601 * stage.
6602 */
6603 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6604
6605 /* Mute capture amp left and right */
6606 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6607 /* Set ADC connection select to match default mixer setting - mic
6608 * (on mic1 pin)
6609 */
6610 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6611
6612 /* Do similar with the second ADC: mute capture input amp and
6613 * set ADC connection to mic to match ALSA's default state.
6614 */
6615 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6616 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6617
6618 /* Mute all inputs to mixer widget (even unconnected ones) */
6619 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6620 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6621 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6622 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6623 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6624 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6625 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6626 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6627
6628 { }
6629 };
6630
6631 static struct hda_verb alc260_will_verbs[] = {
6632 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6633 {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
6634 {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
6635 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6636 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6637 {0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
6638 {}
6639 };
6640
6641 static struct hda_verb alc260_replacer_672v_verbs[] = {
6642 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6643 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6644 {0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
6645
6646 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6647 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6648 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6649
6650 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6651 {}
6652 };
6653
6654 /* toggle speaker-output according to the hp-jack state */
6655 static void alc260_replacer_672v_automute(struct hda_codec *codec)
6656 {
6657 unsigned int present;
6658
6659 /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
6660 present = snd_hda_jack_detect(codec, 0x0f);
6661 if (present) {
6662 snd_hda_codec_write_cache(codec, 0x01, 0,
6663 AC_VERB_SET_GPIO_DATA, 1);
6664 snd_hda_codec_write_cache(codec, 0x0f, 0,
6665 AC_VERB_SET_PIN_WIDGET_CONTROL,
6666 PIN_HP);
6667 } else {
6668 snd_hda_codec_write_cache(codec, 0x01, 0,
6669 AC_VERB_SET_GPIO_DATA, 0);
6670 snd_hda_codec_write_cache(codec, 0x0f, 0,
6671 AC_VERB_SET_PIN_WIDGET_CONTROL,
6672 PIN_OUT);
6673 }
6674 }
6675
6676 static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
6677 unsigned int res)
6678 {
6679 if ((res >> 26) == ALC880_HP_EVENT)
6680 alc260_replacer_672v_automute(codec);
6681 }
6682
6683 static struct hda_verb alc260_hp_dc7600_verbs[] = {
6684 {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
6685 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6686 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6687 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6688 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6689 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6690 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
6691 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6692 {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6693 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6694 {}
6695 };
6696
6697 /* Test configuration for debugging, modelled after the ALC880 test
6698 * configuration.
6699 */
6700 #ifdef CONFIG_SND_DEBUG
6701 static hda_nid_t alc260_test_dac_nids[1] = {
6702 0x02,
6703 };
6704 static hda_nid_t alc260_test_adc_nids[2] = {
6705 0x04, 0x05,
6706 };
6707 /* For testing the ALC260, each input MUX needs its own definition since
6708 * the signal assignments are different. This assumes that the first ADC
6709 * is NID 0x04.
6710 */
6711 static struct hda_input_mux alc260_test_capture_sources[2] = {
6712 {
6713 .num_items = 7,
6714 .items = {
6715 { "MIC1 pin", 0x0 },
6716 { "MIC2 pin", 0x1 },
6717 { "LINE1 pin", 0x2 },
6718 { "LINE2 pin", 0x3 },
6719 { "CD pin", 0x4 },
6720 { "LINE-OUT pin", 0x5 },
6721 { "HP-OUT pin", 0x6 },
6722 },
6723 },
6724 {
6725 .num_items = 8,
6726 .items = {
6727 { "MIC1 pin", 0x0 },
6728 { "MIC2 pin", 0x1 },
6729 { "LINE1 pin", 0x2 },
6730 { "LINE2 pin", 0x3 },
6731 { "CD pin", 0x4 },
6732 { "Mixer", 0x5 },
6733 { "LINE-OUT pin", 0x6 },
6734 { "HP-OUT pin", 0x7 },
6735 },
6736 },
6737 };
6738 static struct snd_kcontrol_new alc260_test_mixer[] = {
6739 /* Output driver widgets */
6740 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
6741 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
6742 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
6743 HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
6744 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6745 HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
6746
6747 /* Modes for retasking pin widgets
6748 * Note: the ALC260 doesn't seem to act on requests to enable mic
6749 * bias from NIDs 0x0f and 0x10. The ALC260 datasheet doesn't
6750 * mention this restriction. At this stage it's not clear whether
6751 * this behaviour is intentional or is a hardware bug in chip
6752 * revisions available at least up until early 2006. Therefore for
6753 * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
6754 * choices, but if it turns out that the lack of mic bias for these
6755 * NIDs is intentional we could change their modes from
6756 * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
6757 */
6758 ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
6759 ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
6760 ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
6761 ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
6762 ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
6763 ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
6764
6765 /* Loopback mixer controls */
6766 HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
6767 HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
6768 HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
6769 HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
6770 HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
6771 HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
6772 HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
6773 HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
6774 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
6775 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
6776 HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
6777 HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
6778 HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
6779 HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
6780
6781 /* Controls for GPIO pins, assuming they are configured as outputs */
6782 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
6783 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
6784 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
6785 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
6786
6787 /* Switches to allow the digital IO pins to be enabled. The datasheet
6788 * is ambigious as to which NID is which; testing on laptops which
6789 * make this output available should provide clarification.
6790 */
6791 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
6792 ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
6793
6794 /* A switch allowing EAPD to be enabled. Some laptops seem to use
6795 * this output to turn on an external amplifier.
6796 */
6797 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
6798 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
6799
6800 { } /* end */
6801 };
6802 static struct hda_verb alc260_test_init_verbs[] = {
6803 /* Enable all GPIOs as outputs with an initial value of 0 */
6804 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
6805 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6806 {0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
6807
6808 /* Enable retasking pins as output, initially without power amp */
6809 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6810 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6811 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6812 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6813 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6814 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6815
6816 /* Disable digital (SPDIF) pins initially, but users can enable
6817 * them via a mixer switch. In the case of SPDIF-out, this initverb
6818 * payload also sets the generation to 0, output to be in "consumer"
6819 * PCM format, copyright asserted, no pre-emphasis and no validity
6820 * control.
6821 */
6822 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6823 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6824
6825 /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
6826 * OUT1 sum bus when acting as an output.
6827 */
6828 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6829 {0x0c, AC_VERB_SET_CONNECT_SEL, 0},
6830 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6831 {0x0e, AC_VERB_SET_CONNECT_SEL, 0},
6832
6833 /* Start with output sum widgets muted and their output gains at min */
6834 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6835 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6836 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6837 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6838 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6839 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6840 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6841 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6842 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6843
6844 /* Unmute retasking pin widget output buffers since the default
6845 * state appears to be output. As the pin mode is changed by the
6846 * user the pin mode control will take care of enabling the pin's
6847 * input/output buffers as needed.
6848 */
6849 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6850 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6851 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6852 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6853 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6854 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6855 /* Also unmute the mono-out pin widget */
6856 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6857
6858 /* Mute capture amp left and right */
6859 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6860 /* Set ADC connection select to match default mixer setting (mic1
6861 * pin)
6862 */
6863 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6864
6865 /* Do the same for the second ADC: mute capture input amp and
6866 * set ADC connection to mic1 pin
6867 */
6868 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6869 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6870
6871 /* Mute all inputs to mixer widget (even unconnected ones) */
6872 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6873 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6874 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6875 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6876 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6877 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6878 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6879 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6880
6881 { }
6882 };
6883 #endif
6884
6885 #define alc260_pcm_analog_playback alc880_pcm_analog_alt_playback
6886 #define alc260_pcm_analog_capture alc880_pcm_analog_capture
6887
6888 #define alc260_pcm_digital_playback alc880_pcm_digital_playback
6889 #define alc260_pcm_digital_capture alc880_pcm_digital_capture
6890
6891 /*
6892 * for BIOS auto-configuration
6893 */
6894
6895 static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
6896 const char *pfx, int *vol_bits)
6897 {
6898 hda_nid_t nid_vol;
6899 unsigned long vol_val, sw_val;
6900 int err;
6901
6902 if (nid >= 0x0f && nid < 0x11) {
6903 nid_vol = nid - 0x7;
6904 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6905 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6906 } else if (nid == 0x11) {
6907 nid_vol = nid - 0x7;
6908 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
6909 sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
6910 } else if (nid >= 0x12 && nid <= 0x15) {
6911 nid_vol = 0x08;
6912 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6913 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6914 } else
6915 return 0; /* N/A */
6916
6917 if (!(*vol_bits & (1 << nid_vol))) {
6918 /* first control for the volume widget */
6919 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
6920 if (err < 0)
6921 return err;
6922 *vol_bits |= (1 << nid_vol);
6923 }
6924 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
6925 if (err < 0)
6926 return err;
6927 return 1;
6928 }
6929
6930 /* add playback controls from the parsed DAC table */
6931 static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6932 const struct auto_pin_cfg *cfg)
6933 {
6934 hda_nid_t nid;
6935 int err;
6936 int vols = 0;
6937
6938 spec->multiout.num_dacs = 1;
6939 spec->multiout.dac_nids = spec->private_dac_nids;
6940 spec->multiout.dac_nids[0] = 0x02;
6941
6942 nid = cfg->line_out_pins[0];
6943 if (nid) {
6944 const char *pfx;
6945 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6946 pfx = "Master";
6947 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6948 pfx = "Speaker";
6949 else
6950 pfx = "Front";
6951 err = alc260_add_playback_controls(spec, nid, pfx, &vols);
6952 if (err < 0)
6953 return err;
6954 }
6955
6956 nid = cfg->speaker_pins[0];
6957 if (nid) {
6958 err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
6959 if (err < 0)
6960 return err;
6961 }
6962
6963 nid = cfg->hp_pins[0];
6964 if (nid) {
6965 err = alc260_add_playback_controls(spec, nid, "Headphone",
6966 &vols);
6967 if (err < 0)
6968 return err;
6969 }
6970 return 0;
6971 }
6972
6973 /* create playback/capture controls for input pins */
6974 static int alc260_auto_create_input_ctls(struct hda_codec *codec,
6975 const struct auto_pin_cfg *cfg)
6976 {
6977 return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
6978 }
6979
6980 static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6981 hda_nid_t nid, int pin_type,
6982 int sel_idx)
6983 {
6984 alc_set_pin_output(codec, nid, pin_type);
6985 /* need the manual connection? */
6986 if (nid >= 0x12) {
6987 int idx = nid - 0x12;
6988 snd_hda_codec_write(codec, idx + 0x0b, 0,
6989 AC_VERB_SET_CONNECT_SEL, sel_idx);
6990 }
6991 }
6992
6993 static void alc260_auto_init_multi_out(struct hda_codec *codec)
6994 {
6995 struct alc_spec *spec = codec->spec;
6996 hda_nid_t nid;
6997
6998 nid = spec->autocfg.line_out_pins[0];
6999 if (nid) {
7000 int pin_type = get_pin_type(spec->autocfg.line_out_type);
7001 alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
7002 }
7003
7004 nid = spec->autocfg.speaker_pins[0];
7005 if (nid)
7006 alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
7007
7008 nid = spec->autocfg.hp_pins[0];
7009 if (nid)
7010 alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
7011 }
7012
7013 #define ALC260_PIN_CD_NID 0x16
7014 static void alc260_auto_init_analog_input(struct hda_codec *codec)
7015 {
7016 struct alc_spec *spec = codec->spec;
7017 struct auto_pin_cfg *cfg = &spec->autocfg;
7018 int i;
7019
7020 for (i = 0; i < cfg->num_inputs; i++) {
7021 hda_nid_t nid = cfg->inputs[i].pin;
7022 if (nid >= 0x12) {
7023 alc_set_input_pin(codec, nid, cfg->inputs[i].type);
7024 if (nid != ALC260_PIN_CD_NID &&
7025 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
7026 snd_hda_codec_write(codec, nid, 0,
7027 AC_VERB_SET_AMP_GAIN_MUTE,
7028 AMP_OUT_MUTE);
7029 }
7030 }
7031 }
7032
7033 #define alc260_auto_init_input_src alc880_auto_init_input_src
7034
7035 /*
7036 * generic initialization of ADC, input mixers and output mixers
7037 */
7038 static struct hda_verb alc260_volume_init_verbs[] = {
7039 /*
7040 * Unmute ADC0-1 and set the default input to mic-in
7041 */
7042 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
7043 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7044 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
7045 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7046
7047 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
7048 * mixer widget
7049 * Note: PASD motherboards uses the Line In 2 as the input for
7050 * front panel mic (mic 2)
7051 */
7052 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
7053 /* mute analog inputs */
7054 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7055 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7056 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7057 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7058 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7059
7060 /*
7061 * Set up output mixers (0x08 - 0x0a)
7062 */
7063 /* set vol=0 to output mixers */
7064 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7065 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7066 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7067 /* set up input amps for analog loopback */
7068 /* Amp Indices: DAC = 0, mixer = 1 */
7069 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7070 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7071 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7072 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7073 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7074 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7075
7076 { }
7077 };
7078
7079 static int alc260_parse_auto_config(struct hda_codec *codec)
7080 {
7081 struct alc_spec *spec = codec->spec;
7082 int err;
7083 static hda_nid_t alc260_ignore[] = { 0x17, 0 };
7084
7085 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
7086 alc260_ignore);
7087 if (err < 0)
7088 return err;
7089 err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
7090 if (err < 0)
7091 return err;
7092 if (!spec->kctls.list)
7093 return 0; /* can't find valid BIOS pin config */
7094 err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
7095 if (err < 0)
7096 return err;
7097
7098 spec->multiout.max_channels = 2;
7099
7100 if (spec->autocfg.dig_outs)
7101 spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
7102 if (spec->kctls.list)
7103 add_mixer(spec, spec->kctls.list);
7104
7105 add_verb(spec, alc260_volume_init_verbs);
7106
7107 spec->num_mux_defs = 1;
7108 spec->input_mux = &spec->private_imux[0];
7109
7110 alc_ssid_check(codec, 0x10, 0x15, 0x0f, 0);
7111
7112 return 1;
7113 }
7114
7115 /* additional initialization for auto-configuration model */
7116 static void alc260_auto_init(struct hda_codec *codec)
7117 {
7118 struct alc_spec *spec = codec->spec;
7119 alc260_auto_init_multi_out(codec);
7120 alc260_auto_init_analog_input(codec);
7121 alc260_auto_init_input_src(codec);
7122 alc_auto_init_digital(codec);
7123 if (spec->unsol_event)
7124 alc_inithook(codec);
7125 }
7126
7127 #ifdef CONFIG_SND_HDA_POWER_SAVE
7128 static struct hda_amp_list alc260_loopbacks[] = {
7129 { 0x07, HDA_INPUT, 0 },
7130 { 0x07, HDA_INPUT, 1 },
7131 { 0x07, HDA_INPUT, 2 },
7132 { 0x07, HDA_INPUT, 3 },
7133 { 0x07, HDA_INPUT, 4 },
7134 { } /* end */
7135 };
7136 #endif
7137
7138 /*
7139 * Pin config fixes
7140 */
7141 enum {
7142 PINFIX_HP_DC5750,
7143 };
7144
7145 static const struct alc_fixup alc260_fixups[] = {
7146 [PINFIX_HP_DC5750] = {
7147 .type = ALC_FIXUP_PINS,
7148 .v.pins = (const struct alc_pincfg[]) {
7149 { 0x11, 0x90130110 }, /* speaker */
7150 { }
7151 }
7152 },
7153 };
7154
7155 static struct snd_pci_quirk alc260_fixup_tbl[] = {
7156 SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", PINFIX_HP_DC5750),
7157 {}
7158 };
7159
7160 /*
7161 * ALC260 configurations
7162 */
7163 static const char * const alc260_models[ALC260_MODEL_LAST] = {
7164 [ALC260_BASIC] = "basic",
7165 [ALC260_HP] = "hp",
7166 [ALC260_HP_3013] = "hp-3013",
7167 [ALC260_HP_DC7600] = "hp-dc7600",
7168 [ALC260_FUJITSU_S702X] = "fujitsu",
7169 [ALC260_ACER] = "acer",
7170 [ALC260_WILL] = "will",
7171 [ALC260_REPLACER_672V] = "replacer",
7172 [ALC260_FAVORIT100] = "favorit100",
7173 #ifdef CONFIG_SND_DEBUG
7174 [ALC260_TEST] = "test",
7175 #endif
7176 [ALC260_AUTO] = "auto",
7177 };
7178
7179 static struct snd_pci_quirk alc260_cfg_tbl[] = {
7180 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
7181 SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
7182 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
7183 SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
7184 SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
7185 SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
7186 SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
7187 SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
7188 SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
7189 SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
7190 SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
7191 SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
7192 SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
7193 SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
7194 SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
7195 SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
7196 SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
7197 SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
7198 SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
7199 SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
7200 {}
7201 };
7202
7203 static struct alc_config_preset alc260_presets[] = {
7204 [ALC260_BASIC] = {
7205 .mixers = { alc260_base_output_mixer,
7206 alc260_input_mixer },
7207 .init_verbs = { alc260_init_verbs },
7208 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
7209 .dac_nids = alc260_dac_nids,
7210 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
7211 .adc_nids = alc260_dual_adc_nids,
7212 .num_channel_mode = ARRAY_SIZE(alc260_modes),
7213 .channel_mode = alc260_modes,
7214 .input_mux = &alc260_capture_source,
7215 },
7216 [ALC260_HP] = {
7217 .mixers = { alc260_hp_output_mixer,
7218 alc260_input_mixer },
7219 .init_verbs = { alc260_init_verbs,
7220 alc260_hp_unsol_verbs },
7221 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
7222 .dac_nids = alc260_dac_nids,
7223 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
7224 .adc_nids = alc260_adc_nids_alt,
7225 .num_channel_mode = ARRAY_SIZE(alc260_modes),
7226 .channel_mode = alc260_modes,
7227 .input_mux = &alc260_capture_source,
7228 .unsol_event = alc260_hp_unsol_event,
7229 .init_hook = alc260_hp_automute,
7230 },
7231 [ALC260_HP_DC7600] = {
7232 .mixers = { alc260_hp_dc7600_mixer,
7233 alc260_input_mixer },
7234 .init_verbs = { alc260_init_verbs,
7235 alc260_hp_dc7600_verbs },
7236 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
7237 .dac_nids = alc260_dac_nids,
7238 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
7239 .adc_nids = alc260_adc_nids_alt,
7240 .num_channel_mode = ARRAY_SIZE(alc260_modes),
7241 .channel_mode = alc260_modes,
7242 .input_mux = &alc260_capture_source,
7243 .unsol_event = alc260_hp_3012_unsol_event,
7244 .init_hook = alc260_hp_3012_automute,
7245 },
7246 [ALC260_HP_3013] = {
7247 .mixers = { alc260_hp_3013_mixer,
7248 alc260_input_mixer },
7249 .init_verbs = { alc260_hp_3013_init_verbs,
7250 alc260_hp_3013_unsol_verbs },
7251 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
7252 .dac_nids = alc260_dac_nids,
7253 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
7254 .adc_nids = alc260_adc_nids_alt,
7255 .num_channel_mode = ARRAY_SIZE(alc260_modes),
7256 .channel_mode = alc260_modes,
7257 .input_mux = &alc260_capture_source,
7258 .unsol_event = alc260_hp_3013_unsol_event,
7259 .init_hook = alc260_hp_3013_automute,
7260 },
7261 [ALC260_FUJITSU_S702X] = {
7262 .mixers = { alc260_fujitsu_mixer },
7263 .init_verbs = { alc260_fujitsu_init_verbs },
7264 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
7265 .dac_nids = alc260_dac_nids,
7266 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
7267 .adc_nids = alc260_dual_adc_nids,
7268 .num_channel_mode = ARRAY_SIZE(alc260_modes),
7269 .channel_mode = alc260_modes,
7270 .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
7271 .input_mux = alc260_fujitsu_capture_sources,
7272 },
7273 [ALC260_ACER] = {
7274 .mixers = { alc260_acer_mixer },
7275 .init_verbs = { alc260_acer_init_verbs },
7276 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
7277 .dac_nids = alc260_dac_nids,
7278 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
7279 .adc_nids = alc260_dual_adc_nids,
7280 .num_channel_mode = ARRAY_SIZE(alc260_modes),
7281 .channel_mode = alc260_modes,
7282 .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
7283 .input_mux = alc260_acer_capture_sources,
7284 },
7285 [ALC260_FAVORIT100] = {
7286 .mixers = { alc260_favorit100_mixer },
7287 .init_verbs = { alc260_favorit100_init_verbs },
7288 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
7289 .dac_nids = alc260_dac_nids,
7290 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
7291 .adc_nids = alc260_dual_adc_nids,
7292 .num_channel_mode = ARRAY_SIZE(alc260_modes),
7293 .channel_mode = alc260_modes,
7294 .num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
7295 .input_mux = alc260_favorit100_capture_sources,
7296 },
7297 [ALC260_WILL] = {
7298 .mixers = { alc260_will_mixer },
7299 .init_verbs = { alc260_init_verbs, alc260_will_verbs },
7300 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
7301 .dac_nids = alc260_dac_nids,
7302 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
7303 .adc_nids = alc260_adc_nids,
7304 .dig_out_nid = ALC260_DIGOUT_NID,
7305 .num_channel_mode = ARRAY_SIZE(alc260_modes),
7306 .channel_mode = alc260_modes,
7307 .input_mux = &alc260_capture_source,
7308 },
7309 [ALC260_REPLACER_672V] = {
7310 .mixers = { alc260_replacer_672v_mixer },
7311 .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
7312 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
7313 .dac_nids = alc260_dac_nids,
7314 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
7315 .adc_nids = alc260_adc_nids,
7316 .dig_out_nid = ALC260_DIGOUT_NID,
7317 .num_channel_mode = ARRAY_SIZE(alc260_modes),
7318 .channel_mode = alc260_modes,
7319 .input_mux = &alc260_capture_source,
7320 .unsol_event = alc260_replacer_672v_unsol_event,
7321 .init_hook = alc260_replacer_672v_automute,
7322 },
7323 #ifdef CONFIG_SND_DEBUG
7324 [ALC260_TEST] = {
7325 .mixers = { alc260_test_mixer },
7326 .init_verbs = { alc260_test_init_verbs },
7327 .num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
7328 .dac_nids = alc260_test_dac_nids,
7329 .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
7330 .adc_nids = alc260_test_adc_nids,
7331 .num_channel_mode = ARRAY_SIZE(alc260_modes),
7332 .channel_mode = alc260_modes,
7333 .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
7334 .input_mux = alc260_test_capture_sources,
7335 },
7336 #endif
7337 };
7338
7339 static int patch_alc260(struct hda_codec *codec)
7340 {
7341 struct alc_spec *spec;
7342 int err, board_config;
7343
7344 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
7345 if (spec == NULL)
7346 return -ENOMEM;
7347
7348 codec->spec = spec;
7349
7350 board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
7351 alc260_models,
7352 alc260_cfg_tbl);
7353 if (board_config < 0) {
7354 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
7355 codec->chip_name);
7356 board_config = ALC260_AUTO;
7357 }
7358
7359 if (board_config == ALC260_AUTO) {
7360 alc_pick_fixup(codec, NULL, alc260_fixup_tbl, alc260_fixups);
7361 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
7362 }
7363
7364 if (board_config == ALC260_AUTO) {
7365 /* automatic parse from the BIOS config */
7366 err = alc260_parse_auto_config(codec);
7367 if (err < 0) {
7368 alc_free(codec);
7369 return err;
7370 } else if (!err) {
7371 printk(KERN_INFO
7372 "hda_codec: Cannot set up configuration "
7373 "from BIOS. Using base mode...\n");
7374 board_config = ALC260_BASIC;
7375 }
7376 }
7377
7378 err = snd_hda_attach_beep_device(codec, 0x1);
7379 if (err < 0) {
7380 alc_free(codec);
7381 return err;
7382 }
7383
7384 if (board_config != ALC260_AUTO)
7385 setup_preset(codec, &alc260_presets[board_config]);
7386
7387 spec->stream_analog_playback = &alc260_pcm_analog_playback;
7388 spec->stream_analog_capture = &alc260_pcm_analog_capture;
7389 spec->stream_analog_alt_capture = &alc260_pcm_analog_capture;
7390
7391 spec->stream_digital_playback = &alc260_pcm_digital_playback;
7392 spec->stream_digital_capture = &alc260_pcm_digital_capture;
7393
7394 if (!spec->adc_nids && spec->input_mux) {
7395 /* check whether NID 0x04 is valid */
7396 unsigned int wcap = get_wcaps(codec, 0x04);
7397 wcap = get_wcaps_type(wcap);
7398 /* get type */
7399 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
7400 spec->adc_nids = alc260_adc_nids_alt;
7401 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
7402 } else {
7403 spec->adc_nids = alc260_adc_nids;
7404 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
7405 }
7406 }
7407 set_capture_mixer(codec);
7408 set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
7409
7410 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
7411
7412 spec->vmaster_nid = 0x08;
7413
7414 codec->patch_ops = alc_patch_ops;
7415 if (board_config == ALC260_AUTO)
7416 spec->init_hook = alc260_auto_init;
7417 #ifdef CONFIG_SND_HDA_POWER_SAVE
7418 if (!spec->loopback.amplist)
7419 spec->loopback.amplist = alc260_loopbacks;
7420 #endif
7421
7422 return 0;
7423 }
7424
7425
7426 /*
7427 * ALC882/883/885/888/889 support
7428 *
7429 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
7430 * configuration. Each pin widget can choose any input DACs and a mixer.
7431 * Each ADC is connected from a mixer of all inputs. This makes possible
7432 * 6-channel independent captures.
7433 *
7434 * In addition, an independent DAC for the multi-playback (not used in this
7435 * driver yet).
7436 */
7437 #define ALC882_DIGOUT_NID 0x06
7438 #define ALC882_DIGIN_NID 0x0a
7439 #define ALC883_DIGOUT_NID ALC882_DIGOUT_NID
7440 #define ALC883_DIGIN_NID ALC882_DIGIN_NID
7441 #define ALC1200_DIGOUT_NID 0x10
7442
7443
7444 static struct hda_channel_mode alc882_ch_modes[1] = {
7445 { 8, NULL }
7446 };
7447
7448 /* DACs */
7449 static hda_nid_t alc882_dac_nids[4] = {
7450 /* front, rear, clfe, rear_surr */
7451 0x02, 0x03, 0x04, 0x05
7452 };
7453 #define alc883_dac_nids alc882_dac_nids
7454
7455 /* ADCs */
7456 #define alc882_adc_nids alc880_adc_nids
7457 #define alc882_adc_nids_alt alc880_adc_nids_alt
7458 #define alc883_adc_nids alc882_adc_nids_alt
7459 static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
7460 static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
7461 #define alc889_adc_nids alc880_adc_nids
7462
7463 static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
7464 static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
7465 #define alc883_capsrc_nids alc882_capsrc_nids_alt
7466 static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
7467 #define alc889_capsrc_nids alc882_capsrc_nids
7468
7469 /* input MUX */
7470 /* FIXME: should be a matrix-type input source selection */
7471
7472 static struct hda_input_mux alc882_capture_source = {
7473 .num_items = 4,
7474 .items = {
7475 { "Mic", 0x0 },
7476 { "Front Mic", 0x1 },
7477 { "Line", 0x2 },
7478 { "CD", 0x4 },
7479 },
7480 };
7481
7482 #define alc883_capture_source alc882_capture_source
7483
7484 static struct hda_input_mux alc889_capture_source = {
7485 .num_items = 3,
7486 .items = {
7487 { "Front Mic", 0x0 },
7488 { "Mic", 0x3 },
7489 { "Line", 0x2 },
7490 },
7491 };
7492
7493 static struct hda_input_mux mb5_capture_source = {
7494 .num_items = 3,
7495 .items = {
7496 { "Mic", 0x1 },
7497 { "Line", 0x7 },
7498 { "CD", 0x4 },
7499 },
7500 };
7501
7502 static struct hda_input_mux macmini3_capture_source = {
7503 .num_items = 2,
7504 .items = {
7505 { "Line", 0x2 },
7506 { "CD", 0x4 },
7507 },
7508 };
7509
7510 static struct hda_input_mux alc883_3stack_6ch_intel = {
7511 .num_items = 4,
7512 .items = {
7513 { "Mic", 0x1 },
7514 { "Front Mic", 0x0 },
7515 { "Line", 0x2 },
7516 { "CD", 0x4 },
7517 },
7518 };
7519
7520 static struct hda_input_mux alc883_lenovo_101e_capture_source = {
7521 .num_items = 2,
7522 .items = {
7523 { "Mic", 0x1 },
7524 { "Line", 0x2 },
7525 },
7526 };
7527
7528 static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
7529 .num_items = 4,
7530 .items = {
7531 { "Mic", 0x0 },
7532 { "Internal Mic", 0x1 },
7533 { "Line", 0x2 },
7534 { "CD", 0x4 },
7535 },
7536 };
7537
7538 static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
7539 .num_items = 2,
7540 .items = {
7541 { "Mic", 0x0 },
7542 { "Internal Mic", 0x1 },
7543 },
7544 };
7545
7546 static struct hda_input_mux alc883_lenovo_sky_capture_source = {
7547 .num_items = 3,
7548 .items = {
7549 { "Mic", 0x0 },
7550 { "Front Mic", 0x1 },
7551 { "Line", 0x4 },
7552 },
7553 };
7554
7555 static struct hda_input_mux alc883_asus_eee1601_capture_source = {
7556 .num_items = 2,
7557 .items = {
7558 { "Mic", 0x0 },
7559 { "Line", 0x2 },
7560 },
7561 };
7562
7563 static struct hda_input_mux alc889A_mb31_capture_source = {
7564 .num_items = 2,
7565 .items = {
7566 { "Mic", 0x0 },
7567 /* Front Mic (0x01) unused */
7568 { "Line", 0x2 },
7569 /* Line 2 (0x03) unused */
7570 /* CD (0x04) unused? */
7571 },
7572 };
7573
7574 static struct hda_input_mux alc889A_imac91_capture_source = {
7575 .num_items = 2,
7576 .items = {
7577 { "Mic", 0x01 },
7578 { "Line", 0x2 }, /* Not sure! */
7579 },
7580 };
7581
7582 /*
7583 * 2ch mode
7584 */
7585 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
7586 { 2, NULL }
7587 };
7588
7589 /*
7590 * 2ch mode
7591 */
7592 static struct hda_verb alc882_3ST_ch2_init[] = {
7593 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7594 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7595 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7596 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7597 { } /* end */
7598 };
7599
7600 /*
7601 * 4ch mode
7602 */
7603 static struct hda_verb alc882_3ST_ch4_init[] = {
7604 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7605 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7606 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7607 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7608 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7609 { } /* end */
7610 };
7611
7612 /*
7613 * 6ch mode
7614 */
7615 static struct hda_verb alc882_3ST_ch6_init[] = {
7616 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7617 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7618 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7619 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7620 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7621 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7622 { } /* end */
7623 };
7624
7625 static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
7626 { 2, alc882_3ST_ch2_init },
7627 { 4, alc882_3ST_ch4_init },
7628 { 6, alc882_3ST_ch6_init },
7629 };
7630
7631 #define alc883_3ST_6ch_modes alc882_3ST_6ch_modes
7632
7633 /*
7634 * 2ch mode
7635 */
7636 static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
7637 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
7638 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7639 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7640 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7641 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7642 { } /* end */
7643 };
7644
7645 /*
7646 * 4ch mode
7647 */
7648 static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
7649 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7650 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7651 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7652 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7653 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7654 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7655 { } /* end */
7656 };
7657
7658 /*
7659 * 6ch mode
7660 */
7661 static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
7662 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7663 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7664 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7665 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7666 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7667 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7668 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7669 { } /* end */
7670 };
7671
7672 static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
7673 { 2, alc883_3ST_ch2_clevo_init },
7674 { 4, alc883_3ST_ch4_clevo_init },
7675 { 6, alc883_3ST_ch6_clevo_init },
7676 };
7677
7678
7679 /*
7680 * 6ch mode
7681 */
7682 static struct hda_verb alc882_sixstack_ch6_init[] = {
7683 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7684 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7685 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7686 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7687 { } /* end */
7688 };
7689
7690 /*
7691 * 8ch mode
7692 */
7693 static struct hda_verb alc882_sixstack_ch8_init[] = {
7694 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7695 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7696 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7697 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7698 { } /* end */
7699 };
7700
7701 static struct hda_channel_mode alc882_sixstack_modes[2] = {
7702 { 6, alc882_sixstack_ch6_init },
7703 { 8, alc882_sixstack_ch8_init },
7704 };
7705
7706
7707 /* Macbook Air 2,1 */
7708
7709 static struct hda_channel_mode alc885_mba21_ch_modes[1] = {
7710 { 2, NULL },
7711 };
7712
7713 /*
7714 * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
7715 */
7716
7717 /*
7718 * 2ch mode
7719 */
7720 static struct hda_verb alc885_mbp_ch2_init[] = {
7721 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7722 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7723 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7724 { } /* end */
7725 };
7726
7727 /*
7728 * 4ch mode
7729 */
7730 static struct hda_verb alc885_mbp_ch4_init[] = {
7731 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7732 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7733 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7734 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7735 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7736 { } /* end */
7737 };
7738
7739 static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
7740 { 2, alc885_mbp_ch2_init },
7741 { 4, alc885_mbp_ch4_init },
7742 };
7743
7744 /*
7745 * 2ch
7746 * Speakers/Woofer/HP = Front
7747 * LineIn = Input
7748 */
7749 static struct hda_verb alc885_mb5_ch2_init[] = {
7750 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7751 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7752 { } /* end */
7753 };
7754
7755 /*
7756 * 6ch mode
7757 * Speakers/HP = Front
7758 * Woofer = LFE
7759 * LineIn = Surround
7760 */
7761 static struct hda_verb alc885_mb5_ch6_init[] = {
7762 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7763 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7764 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7765 { } /* end */
7766 };
7767
7768 static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
7769 { 2, alc885_mb5_ch2_init },
7770 { 6, alc885_mb5_ch6_init },
7771 };
7772
7773 #define alc885_macmini3_6ch_modes alc885_mb5_6ch_modes
7774
7775 /*
7776 * 2ch mode
7777 */
7778 static struct hda_verb alc883_4ST_ch2_init[] = {
7779 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7780 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7781 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7782 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7783 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7784 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7785 { } /* end */
7786 };
7787
7788 /*
7789 * 4ch mode
7790 */
7791 static struct hda_verb alc883_4ST_ch4_init[] = {
7792 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7793 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7794 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7795 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7796 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7797 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7798 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7799 { } /* end */
7800 };
7801
7802 /*
7803 * 6ch mode
7804 */
7805 static struct hda_verb alc883_4ST_ch6_init[] = {
7806 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7807 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7808 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7809 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7810 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7811 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7812 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7813 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7814 { } /* end */
7815 };
7816
7817 /*
7818 * 8ch mode
7819 */
7820 static struct hda_verb alc883_4ST_ch8_init[] = {
7821 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7822 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7823 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7824 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7825 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7826 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7827 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7828 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7829 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7830 { } /* end */
7831 };
7832
7833 static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
7834 { 2, alc883_4ST_ch2_init },
7835 { 4, alc883_4ST_ch4_init },
7836 { 6, alc883_4ST_ch6_init },
7837 { 8, alc883_4ST_ch8_init },
7838 };
7839
7840
7841 /*
7842 * 2ch mode
7843 */
7844 static struct hda_verb alc883_3ST_ch2_intel_init[] = {
7845 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7846 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7847 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7848 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7849 { } /* end */
7850 };
7851
7852 /*
7853 * 4ch mode
7854 */
7855 static struct hda_verb alc883_3ST_ch4_intel_init[] = {
7856 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7857 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7858 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7859 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7860 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7861 { } /* end */
7862 };
7863
7864 /*
7865 * 6ch mode
7866 */
7867 static struct hda_verb alc883_3ST_ch6_intel_init[] = {
7868 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7869 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7870 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
7871 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7872 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7873 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7874 { } /* end */
7875 };
7876
7877 static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
7878 { 2, alc883_3ST_ch2_intel_init },
7879 { 4, alc883_3ST_ch4_intel_init },
7880 { 6, alc883_3ST_ch6_intel_init },
7881 };
7882
7883 /*
7884 * 2ch mode
7885 */
7886 static struct hda_verb alc889_ch2_intel_init[] = {
7887 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7888 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
7889 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
7890 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
7891 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7892 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7893 { } /* end */
7894 };
7895
7896 /*
7897 * 6ch mode
7898 */
7899 static struct hda_verb alc889_ch6_intel_init[] = {
7900 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7901 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7902 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7903 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7904 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7905 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7906 { } /* end */
7907 };
7908
7909 /*
7910 * 8ch mode
7911 */
7912 static struct hda_verb alc889_ch8_intel_init[] = {
7913 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7914 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7915 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7916 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7917 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
7918 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7919 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7920 { } /* end */
7921 };
7922
7923 static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7924 { 2, alc889_ch2_intel_init },
7925 { 6, alc889_ch6_intel_init },
7926 { 8, alc889_ch8_intel_init },
7927 };
7928
7929 /*
7930 * 6ch mode
7931 */
7932 static struct hda_verb alc883_sixstack_ch6_init[] = {
7933 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7934 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7935 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7936 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7937 { } /* end */
7938 };
7939
7940 /*
7941 * 8ch mode
7942 */
7943 static struct hda_verb alc883_sixstack_ch8_init[] = {
7944 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7945 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7946 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7947 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7948 { } /* end */
7949 };
7950
7951 static struct hda_channel_mode alc883_sixstack_modes[2] = {
7952 { 6, alc883_sixstack_ch6_init },
7953 { 8, alc883_sixstack_ch8_init },
7954 };
7955
7956
7957 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
7958 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
7959 */
7960 static struct snd_kcontrol_new alc882_base_mixer[] = {
7961 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7962 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7963 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7964 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7965 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7966 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7967 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7968 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7969 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7970 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7971 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7972 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7973 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7974 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7975 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7976 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7977 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
7978 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7979 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7980 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
7981 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7982 { } /* end */
7983 };
7984
7985 /* Macbook Air 2,1 same control for HP and internal Speaker */
7986
7987 static struct snd_kcontrol_new alc885_mba21_mixer[] = {
7988 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7989 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
7990 { }
7991 };
7992
7993
7994 static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7995 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7996 HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7997 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7998 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7999 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8000 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8001 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8002 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8003 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8004 HDA_CODEC_VOLUME("Line Boost Volume", 0x1a, 0x00, HDA_INPUT),
8005 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0x00, HDA_INPUT),
8006 { } /* end */
8007 };
8008
8009 static struct snd_kcontrol_new alc885_mb5_mixer[] = {
8010 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8011 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8012 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8013 HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8014 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
8015 HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
8016 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
8017 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
8018 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
8019 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
8020 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
8021 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
8022 HDA_CODEC_VOLUME("Line Boost Volume", 0x15, 0x00, HDA_INPUT),
8023 HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0x00, HDA_INPUT),
8024 { } /* end */
8025 };
8026
8027 static struct snd_kcontrol_new alc885_macmini3_mixer[] = {
8028 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8029 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8030 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8031 HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8032 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
8033 HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
8034 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
8035 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
8036 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
8037 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
8038 HDA_CODEC_VOLUME("Line Boost Volume", 0x15, 0x00, HDA_INPUT),
8039 { } /* end */
8040 };
8041
8042 static struct snd_kcontrol_new alc885_imac91_mixer[] = {
8043 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8044 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
8045 { } /* end */
8046 };
8047
8048
8049 static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
8050 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8051 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8052 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8053 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8054 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8055 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8056 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8057 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
8058 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8059 { } /* end */
8060 };
8061
8062 static struct snd_kcontrol_new alc882_targa_mixer[] = {
8063 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8064 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8065 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8066 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8067 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8068 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8069 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8070 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8071 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8072 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
8073 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8074 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8075 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
8076 { } /* end */
8077 };
8078
8079 /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
8080 * Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
8081 */
8082 static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
8083 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8084 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8085 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8086 HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
8087 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8088 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8089 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8090 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8091 HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
8092 HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
8093 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8094 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8095 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
8096 { } /* end */
8097 };
8098
8099 static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
8100 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8101 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8102 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8103 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8104 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8105 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8106 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8107 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8108 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
8109 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8110 { } /* end */
8111 };
8112
8113 static struct snd_kcontrol_new alc882_chmode_mixer[] = {
8114 {
8115 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8116 .name = "Channel Mode",
8117 .info = alc_ch_mode_info,
8118 .get = alc_ch_mode_get,
8119 .put = alc_ch_mode_put,
8120 },
8121 { } /* end */
8122 };
8123
8124 static struct hda_verb alc882_base_init_verbs[] = {
8125 /* Front mixer: unmute input/output amp left and right (volume = 0) */
8126 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8127 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8128 /* Rear mixer */
8129 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8130 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8131 /* CLFE mixer */
8132 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8133 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8134 /* Side mixer */
8135 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8136 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8137
8138 /* Front Pin: output 0 (0x0c) */
8139 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8140 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8141 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8142 /* Rear Pin: output 1 (0x0d) */
8143 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8144 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8145 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
8146 /* CLFE Pin: output 2 (0x0e) */
8147 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8148 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8149 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
8150 /* Side Pin: output 3 (0x0f) */
8151 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8152 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8153 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8154 /* Mic (rear) pin: input vref at 80% */
8155 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8156 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8157 /* Front Mic pin: input vref at 80% */
8158 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8159 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8160 /* Line In pin: input */
8161 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
8162 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8163 /* Line-2 In: Headphone output (output 0 - 0x0c) */
8164 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8165 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8166 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8167 /* CD pin widget for input */
8168 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
8169
8170 /* FIXME: use matrix-type input source selection */
8171 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8172 /* Input mixer2 */
8173 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8174 /* Input mixer3 */
8175 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8176 /* ADC2: mute amp left and right */
8177 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8178 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8179 /* ADC3: mute amp left and right */
8180 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8181 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8182
8183 { }
8184 };
8185
8186 static struct hda_verb alc882_adc1_init_verbs[] = {
8187 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
8188 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8189 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8190 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8191 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8192 /* ADC1: mute amp left and right */
8193 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8194 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
8195 { }
8196 };
8197
8198 static struct hda_verb alc882_eapd_verbs[] = {
8199 /* change to EAPD mode */
8200 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8201 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
8202 { }
8203 };
8204
8205 static struct hda_verb alc889_eapd_verbs[] = {
8206 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
8207 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
8208 { }
8209 };
8210
8211 static struct hda_verb alc_hp15_unsol_verbs[] = {
8212 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
8213 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8214 {}
8215 };
8216
8217 static struct hda_verb alc885_init_verbs[] = {
8218 /* Front mixer: unmute input/output amp left and right (volume = 0) */
8219 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8220 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8221 /* Rear mixer */
8222 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8223 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8224 /* CLFE mixer */
8225 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8226 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8227 /* Side mixer */
8228 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8229 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8230
8231 /* Front HP Pin: output 0 (0x0c) */
8232 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8233 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8234 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8235 /* Front Pin: output 0 (0x0c) */
8236 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8237 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8238 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8239 /* Rear Pin: output 1 (0x0d) */
8240 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8241 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8242 {0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
8243 /* CLFE Pin: output 2 (0x0e) */
8244 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8245 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8246 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
8247 /* Side Pin: output 3 (0x0f) */
8248 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8249 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8250 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8251 /* Mic (rear) pin: input vref at 80% */
8252 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8253 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8254 /* Front Mic pin: input vref at 80% */
8255 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8256 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8257 /* Line In pin: input */
8258 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
8259 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8260
8261 /* Mixer elements: 0x18, , 0x1a, 0x1b */
8262 /* Input mixer1 */
8263 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8264 /* Input mixer2 */
8265 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8266 /* Input mixer3 */
8267 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8268 /* ADC2: mute amp left and right */
8269 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8270 /* ADC3: mute amp left and right */
8271 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8272
8273 { }
8274 };
8275
8276 static struct hda_verb alc885_init_input_verbs[] = {
8277 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8278 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
8279 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
8280 { }
8281 };
8282
8283
8284 /* Unmute Selector 24h and set the default input to front mic */
8285 static struct hda_verb alc889_init_input_verbs[] = {
8286 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
8287 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8288 { }
8289 };
8290
8291
8292 #define alc883_init_verbs alc882_base_init_verbs
8293
8294 /* Mac Pro test */
8295 static struct snd_kcontrol_new alc882_macpro_mixer[] = {
8296 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8297 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8298 HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
8299 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
8300 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
8301 /* FIXME: this looks suspicious...
8302 HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
8303 HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
8304 */
8305 { } /* end */
8306 };
8307
8308 static struct hda_verb alc882_macpro_init_verbs[] = {
8309 /* Front mixer: unmute input/output amp left and right (volume = 0) */
8310 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8311 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8312 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8313 /* Front Pin: output 0 (0x0c) */
8314 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8315 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8316 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8317 /* Front Mic pin: input vref at 80% */
8318 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8319 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8320 /* Speaker: output */
8321 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8322 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8323 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
8324 /* Headphone output (output 0 - 0x0c) */
8325 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8326 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8327 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8328
8329 /* FIXME: use matrix-type input source selection */
8330 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8331 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
8332 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8333 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8334 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8335 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8336 /* Input mixer2 */
8337 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8338 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8339 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8340 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8341 /* Input mixer3 */
8342 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8343 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8344 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8345 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8346 /* ADC1: mute amp left and right */
8347 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8348 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
8349 /* ADC2: mute amp left and right */
8350 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8351 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8352 /* ADC3: mute amp left and right */
8353 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8354 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8355
8356 { }
8357 };
8358
8359 /* Macbook 5,1 */
8360 static struct hda_verb alc885_mb5_init_verbs[] = {
8361 /* DACs */
8362 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8363 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8364 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8365 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8366 /* Front mixer */
8367 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8368 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8369 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8370 /* Surround mixer */
8371 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8372 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8373 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8374 /* LFE mixer */
8375 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8376 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8377 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8378 /* HP mixer */
8379 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8380 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8381 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8382 /* Front Pin (0x0c) */
8383 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
8384 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8385 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8386 /* LFE Pin (0x0e) */
8387 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
8388 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8389 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
8390 /* HP Pin (0x0f) */
8391 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8392 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8393 {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
8394 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8395 /* Front Mic pin: input vref at 80% */
8396 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8397 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8398 /* Line In pin */
8399 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
8400 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8401
8402 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0x1)},
8403 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x7)},
8404 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x4)},
8405 { }
8406 };
8407
8408 /* Macmini 3,1 */
8409 static struct hda_verb alc885_macmini3_init_verbs[] = {
8410 /* DACs */
8411 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8412 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8413 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8414 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8415 /* Front mixer */
8416 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8417 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8418 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8419 /* Surround mixer */
8420 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8421 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8422 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8423 /* LFE mixer */
8424 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8425 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8426 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8427 /* HP mixer */
8428 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8429 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8430 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8431 /* Front Pin (0x0c) */
8432 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
8433 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8434 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8435 /* LFE Pin (0x0e) */
8436 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
8437 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8438 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
8439 /* HP Pin (0x0f) */
8440 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8441 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8442 {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
8443 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8444 /* Line In pin */
8445 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
8446 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8447
8448 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8449 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8450 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8451 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8452 { }
8453 };
8454
8455
8456 static struct hda_verb alc885_mba21_init_verbs[] = {
8457 /*Internal and HP Speaker Mixer*/
8458 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8459 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8460 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8461 /*Internal Speaker Pin (0x0c)*/
8462 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8463 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8464 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8465 /* HP Pin: output 0 (0x0e) */
8466 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
8467 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8468 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8469 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
8470 /* Line in (is hp when jack connected)*/
8471 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
8472 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8473
8474 { }
8475 };
8476
8477
8478 /* Macbook Pro rev3 */
8479 static struct hda_verb alc885_mbp3_init_verbs[] = {
8480 /* Front mixer: unmute input/output amp left and right (volume = 0) */
8481 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8482 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8483 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8484 /* Rear mixer */
8485 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8486 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8487 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8488 /* HP mixer */
8489 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8490 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8491 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8492 /* Front Pin: output 0 (0x0c) */
8493 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8494 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8495 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8496 /* HP Pin: output 0 (0x0e) */
8497 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
8498 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8499 {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
8500 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8501 /* Mic (rear) pin: input vref at 80% */
8502 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8503 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8504 /* Front Mic pin: input vref at 80% */
8505 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8506 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8507 /* Line In pin: use output 1 when in LineOut mode */
8508 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
8509 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8510 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8511
8512 /* FIXME: use matrix-type input source selection */
8513 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8514 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
8515 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8516 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8517 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8518 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8519 /* Input mixer2 */
8520 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8521 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8522 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8523 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8524 /* Input mixer3 */
8525 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8526 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8527 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8528 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8529 /* ADC1: mute amp left and right */
8530 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8531 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
8532 /* ADC2: mute amp left and right */
8533 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8534 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8535 /* ADC3: mute amp left and right */
8536 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8537 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8538
8539 { }
8540 };
8541
8542 /* iMac 9,1 */
8543 static struct hda_verb alc885_imac91_init_verbs[] = {
8544 /* Internal Speaker Pin (0x0c) */
8545 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8546 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8547 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8548 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8549 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8550 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8551 /* HP Pin: Rear */
8552 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8553 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8554 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8555 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
8556 /* Line in Rear */
8557 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
8558 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8559 /* Front Mic pin: input vref at 80% */
8560 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8561 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8562 /* Rear mixer */
8563 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8564 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8565 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8566 /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
8567 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8568 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8569 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8570 /* 0x24 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8571 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8572 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8573 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8574 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8575 /* 0x23 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8576 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8577 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8578 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8579 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8580 /* 0x22 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8581 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8582 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8583 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8584 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8585 /* 0x07 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8586 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8587 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
8588 /* 0x08 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8589 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8590 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8591 /* 0x09 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8592 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8593 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8594 { }
8595 };
8596
8597 /* iMac 24 mixer. */
8598 static struct snd_kcontrol_new alc885_imac24_mixer[] = {
8599 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8600 HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
8601 { } /* end */
8602 };
8603
8604 /* iMac 24 init verbs. */
8605 static struct hda_verb alc885_imac24_init_verbs[] = {
8606 /* Internal speakers: output 0 (0x0c) */
8607 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8608 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8609 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8610 /* Internal speakers: output 0 (0x0c) */
8611 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8612 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8613 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8614 /* Headphone: output 0 (0x0c) */
8615 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8616 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8617 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8618 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8619 /* Front Mic: input vref at 80% */
8620 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8621 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8622 { }
8623 };
8624
8625 /* Toggle speaker-output according to the hp-jack state */
8626 static void alc885_imac24_setup(struct hda_codec *codec)
8627 {
8628 struct alc_spec *spec = codec->spec;
8629
8630 spec->autocfg.hp_pins[0] = 0x14;
8631 spec->autocfg.speaker_pins[0] = 0x18;
8632 spec->autocfg.speaker_pins[1] = 0x1a;
8633 }
8634
8635 #define alc885_mb5_setup alc885_imac24_setup
8636 #define alc885_macmini3_setup alc885_imac24_setup
8637
8638 /* Macbook Air 2,1 */
8639 static void alc885_mba21_setup(struct hda_codec *codec)
8640 {
8641 struct alc_spec *spec = codec->spec;
8642
8643 spec->autocfg.hp_pins[0] = 0x14;
8644 spec->autocfg.speaker_pins[0] = 0x18;
8645 }
8646
8647
8648
8649 static void alc885_mbp3_setup(struct hda_codec *codec)
8650 {
8651 struct alc_spec *spec = codec->spec;
8652
8653 spec->autocfg.hp_pins[0] = 0x15;
8654 spec->autocfg.speaker_pins[0] = 0x14;
8655 }
8656
8657 static void alc885_imac91_setup(struct hda_codec *codec)
8658 {
8659 struct alc_spec *spec = codec->spec;
8660
8661 spec->autocfg.hp_pins[0] = 0x14;
8662 spec->autocfg.speaker_pins[0] = 0x18;
8663 spec->autocfg.speaker_pins[1] = 0x1a;
8664 }
8665
8666 static struct hda_verb alc882_targa_verbs[] = {
8667 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8668 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8669
8670 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8671 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8672
8673 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8674 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8675 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8676
8677 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8678 { } /* end */
8679 };
8680
8681 /* toggle speaker-output according to the hp-jack state */
8682 static void alc882_targa_automute(struct hda_codec *codec)
8683 {
8684 struct alc_spec *spec = codec->spec;
8685 alc_automute_amp(codec);
8686 snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
8687 spec->jack_present ? 1 : 3);
8688 }
8689
8690 static void alc882_targa_setup(struct hda_codec *codec)
8691 {
8692 struct alc_spec *spec = codec->spec;
8693
8694 spec->autocfg.hp_pins[0] = 0x14;
8695 spec->autocfg.speaker_pins[0] = 0x1b;
8696 }
8697
8698 static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
8699 {
8700 if ((res >> 26) == ALC880_HP_EVENT)
8701 alc882_targa_automute(codec);
8702 }
8703
8704 static struct hda_verb alc882_asus_a7j_verbs[] = {
8705 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8706 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8707
8708 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8709 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8710 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8711
8712 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8713 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8714 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8715
8716 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8717 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8718 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8719 { } /* end */
8720 };
8721
8722 static struct hda_verb alc882_asus_a7m_verbs[] = {
8723 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8724 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8725
8726 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8727 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8728 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8729
8730 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8731 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8732 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8733
8734 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8735 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8736 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8737 { } /* end */
8738 };
8739
8740 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
8741 {
8742 unsigned int gpiostate, gpiomask, gpiodir;
8743
8744 gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
8745 AC_VERB_GET_GPIO_DATA, 0);
8746
8747 if (!muted)
8748 gpiostate |= (1 << pin);
8749 else
8750 gpiostate &= ~(1 << pin);
8751
8752 gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
8753 AC_VERB_GET_GPIO_MASK, 0);
8754 gpiomask |= (1 << pin);
8755
8756 gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
8757 AC_VERB_GET_GPIO_DIRECTION, 0);
8758 gpiodir |= (1 << pin);
8759
8760
8761 snd_hda_codec_write(codec, codec->afg, 0,
8762 AC_VERB_SET_GPIO_MASK, gpiomask);
8763 snd_hda_codec_write(codec, codec->afg, 0,
8764 AC_VERB_SET_GPIO_DIRECTION, gpiodir);
8765
8766 msleep(1);
8767
8768 snd_hda_codec_write(codec, codec->afg, 0,
8769 AC_VERB_SET_GPIO_DATA, gpiostate);
8770 }
8771
8772 /* set up GPIO at initialization */
8773 static void alc885_macpro_init_hook(struct hda_codec *codec)
8774 {
8775 alc882_gpio_mute(codec, 0, 0);
8776 alc882_gpio_mute(codec, 1, 0);
8777 }
8778
8779 /* set up GPIO and update auto-muting at initialization */
8780 static void alc885_imac24_init_hook(struct hda_codec *codec)
8781 {
8782 alc885_macpro_init_hook(codec);
8783 alc_automute_amp(codec);
8784 }
8785
8786 /*
8787 * generic initialization of ADC, input mixers and output mixers
8788 */
8789 static struct hda_verb alc883_auto_init_verbs[] = {
8790 /*
8791 * Unmute ADC0-2 and set the default input to mic-in
8792 */
8793 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8794 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8795 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8796 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8797
8798 /*
8799 * Set up output mixers (0x0c - 0x0f)
8800 */
8801 /* set vol=0 to output mixers */
8802 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8803 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8804 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8805 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8806 /* set up input amps for analog loopback */
8807 /* Amp Indices: DAC = 0, mixer = 1 */
8808 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8809 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8810 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8811 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8812 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8813 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8814 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8815 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8816 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8817 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8818
8819 /* FIXME: use matrix-type input source selection */
8820 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8821 /* Input mixer2 */
8822 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8823 /* Input mixer3 */
8824 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8825 { }
8826 };
8827
8828 /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
8829 static struct hda_verb alc889A_mb31_ch2_init[] = {
8830 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
8831 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8832 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
8833 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
8834 { } /* end */
8835 };
8836
8837 /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
8838 static struct hda_verb alc889A_mb31_ch4_init[] = {
8839 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
8840 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8841 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
8842 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8843 { } /* end */
8844 };
8845
8846 /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
8847 static struct hda_verb alc889A_mb31_ch5_init[] = {
8848 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as rear */
8849 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8850 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
8851 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
8852 { } /* end */
8853 };
8854
8855 /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
8856 static struct hda_verb alc889A_mb31_ch6_init[] = {
8857 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as front */
8858 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Subwoofer off */
8859 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
8860 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8861 { } /* end */
8862 };
8863
8864 static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
8865 { 2, alc889A_mb31_ch2_init },
8866 { 4, alc889A_mb31_ch4_init },
8867 { 5, alc889A_mb31_ch5_init },
8868 { 6, alc889A_mb31_ch6_init },
8869 };
8870
8871 static struct hda_verb alc883_medion_eapd_verbs[] = {
8872 /* eanable EAPD on medion laptop */
8873 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8874 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
8875 { }
8876 };
8877
8878 #define alc883_base_mixer alc882_base_mixer
8879
8880 static struct snd_kcontrol_new alc883_mitac_mixer[] = {
8881 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8882 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8883 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8884 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8885 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8886 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8887 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8888 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8889 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
8890 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8891 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8892 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
8893 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8894 { } /* end */
8895 };
8896
8897 static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
8898 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8899 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8900 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8901 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8902 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8903 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
8904 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8905 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8906 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
8907 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8908 { } /* end */
8909 };
8910
8911 static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
8912 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8913 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8914 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8915 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8916 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8917 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
8918 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8919 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8920 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
8921 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8922 { } /* end */
8923 };
8924
8925 static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
8926 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8927 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8928 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8929 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8930 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8931 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8932 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8933 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8934 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
8935 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8936 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8937 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
8938 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8939 { } /* end */
8940 };
8941
8942 static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8943 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8944 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8945 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8946 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8947 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8948 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8949 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8950 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8951 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8952 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8953 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8954 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8955 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8956 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8957 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
8958 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8959 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8960 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
8961 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8962 { } /* end */
8963 };
8964
8965 static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8966 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8967 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8968 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8969 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8970 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8971 HDA_OUTPUT),
8972 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8973 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8974 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8975 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8976 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8977 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8978 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8979 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8980 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8981 HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0, HDA_INPUT),
8982 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8983 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8984 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x18, 0, HDA_INPUT),
8985 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8986 { } /* end */
8987 };
8988
8989 static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8990 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8991 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8992 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8993 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8994 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8995 HDA_OUTPUT),
8996 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8997 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8998 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8999 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
9000 HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
9001 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
9002 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
9003 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
9004 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
9005 HDA_CODEC_VOLUME("Mic Boost Volume", 0x1b, 0, HDA_INPUT),
9006 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
9007 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
9008 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x18, 0, HDA_INPUT),
9009 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
9010 { } /* end */
9011 };
9012
9013 static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
9014 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9015 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9016 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
9017 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
9018 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
9019 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
9020 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
9021 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
9022 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
9023 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
9024 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
9025 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
9026 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
9027 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
9028 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
9029 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
9030 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
9031 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
9032 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
9033 { } /* end */
9034 };
9035
9036 static struct snd_kcontrol_new alc883_targa_mixer[] = {
9037 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9038 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9039 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
9040 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
9041 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
9042 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
9043 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
9044 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
9045 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
9046 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
9047 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
9048 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
9049 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
9050 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
9051 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
9052 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
9053 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
9054 { } /* end */
9055 };
9056
9057 static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
9058 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9059 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9060 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
9061 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
9062 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
9063 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
9064 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
9065 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
9066 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
9067 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
9068 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
9069 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
9070 { } /* end */
9071 };
9072
9073 static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
9074 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
9075 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
9076 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
9077 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
9078 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
9079 { } /* end */
9080 };
9081
9082 static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
9083 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9084 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9085 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
9086 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
9087 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
9088 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
9089 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
9090 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
9091 { } /* end */
9092 };
9093
9094 static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
9095 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9096 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
9097 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
9098 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
9099 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
9100 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
9101 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
9102 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
9103 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
9104 { } /* end */
9105 };
9106
9107 static struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = {
9108 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9109 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9110 HDA_CODEC_MUTE("Speaker Playback Switch", 0x15, 0x0, HDA_OUTPUT),
9111 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT),
9112 HDA_CODEC_VOLUME("Line Playback Volume", 0x08, 0x0, HDA_INPUT),
9113 HDA_CODEC_MUTE("Line Playback Switch", 0x08, 0x0, HDA_INPUT),
9114 { } /* end */
9115 };
9116
9117 static struct hda_verb alc883_medion_wim2160_verbs[] = {
9118 /* Unmute front mixer */
9119 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9120 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9121
9122 /* Set speaker pin to front mixer */
9123 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9124
9125 /* Init headphone pin */
9126 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9127 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9128 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
9129 {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9130
9131 { } /* end */
9132 };
9133
9134 /* toggle speaker-output according to the hp-jack state */
9135 static void alc883_medion_wim2160_setup(struct hda_codec *codec)
9136 {
9137 struct alc_spec *spec = codec->spec;
9138
9139 spec->autocfg.hp_pins[0] = 0x1a;
9140 spec->autocfg.speaker_pins[0] = 0x15;
9141 }
9142
9143 static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
9144 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9145 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9146 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
9147 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
9148 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
9149 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
9150 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
9151 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
9152 { } /* end */
9153 };
9154
9155 static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
9156 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9157 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
9158 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
9159 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
9160 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
9161 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
9162 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
9163 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
9164 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
9165 { } /* end */
9166 };
9167
9168 static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
9169 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9170 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9171 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
9172 HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
9173 HDA_CODEC_VOLUME_MONO("Center Playback Volume",
9174 0x0d, 1, 0x0, HDA_OUTPUT),
9175 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
9176 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
9177 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
9178 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
9179 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
9180 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
9181 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
9182 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
9183 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
9184 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
9185 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
9186 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
9187 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
9188 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
9189 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
9190 { } /* end */
9191 };
9192
9193 static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
9194 /* Output mixers */
9195 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
9196 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
9197 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
9198 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
9199 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
9200 HDA_OUTPUT),
9201 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
9202 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
9203 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
9204 /* Output switches */
9205 HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
9206 HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
9207 HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
9208 /* Boost mixers */
9209 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0x00, HDA_INPUT),
9210 HDA_CODEC_VOLUME("Line Boost Volume", 0x1a, 0x00, HDA_INPUT),
9211 /* Input mixers */
9212 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
9213 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
9214 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
9215 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
9216 { } /* end */
9217 };
9218
9219 static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
9220 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9221 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9222 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
9223 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
9224 HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0, HDA_INPUT),
9225 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
9226 { } /* end */
9227 };
9228
9229 static struct hda_bind_ctls alc883_bind_cap_vol = {
9230 .ops = &snd_hda_bind_vol,
9231 .values = {
9232 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
9233 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
9234 0
9235 },
9236 };
9237
9238 static struct hda_bind_ctls alc883_bind_cap_switch = {
9239 .ops = &snd_hda_bind_sw,
9240 .values = {
9241 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
9242 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
9243 0
9244 },
9245 };
9246
9247 static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
9248 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9249 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9250 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
9251 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
9252 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
9253 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
9254 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
9255 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
9256 { } /* end */
9257 };
9258
9259 static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
9260 HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
9261 HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
9262 {
9263 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
9264 /* .name = "Capture Source", */
9265 .name = "Input Source",
9266 .count = 1,
9267 .info = alc_mux_enum_info,
9268 .get = alc_mux_enum_get,
9269 .put = alc_mux_enum_put,
9270 },
9271 { } /* end */
9272 };
9273
9274 static struct snd_kcontrol_new alc883_chmode_mixer[] = {
9275 {
9276 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
9277 .name = "Channel Mode",
9278 .info = alc_ch_mode_info,
9279 .get = alc_ch_mode_get,
9280 .put = alc_ch_mode_put,
9281 },
9282 { } /* end */
9283 };
9284
9285 /* toggle speaker-output according to the hp-jack state */
9286 static void alc883_mitac_setup(struct hda_codec *codec)
9287 {
9288 struct alc_spec *spec = codec->spec;
9289
9290 spec->autocfg.hp_pins[0] = 0x15;
9291 spec->autocfg.speaker_pins[0] = 0x14;
9292 spec->autocfg.speaker_pins[1] = 0x17;
9293 }
9294
9295 static struct hda_verb alc883_mitac_verbs[] = {
9296 /* HP */
9297 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9298 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9299 /* Subwoofer */
9300 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
9301 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9302
9303 /* enable unsolicited event */
9304 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9305 /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
9306
9307 { } /* end */
9308 };
9309
9310 static struct hda_verb alc883_clevo_m540r_verbs[] = {
9311 /* HP */
9312 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9313 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9314 /* Int speaker */
9315 /*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
9316
9317 /* enable unsolicited event */
9318 /*
9319 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9320 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9321 */
9322
9323 { } /* end */
9324 };
9325
9326 static struct hda_verb alc883_clevo_m720_verbs[] = {
9327 /* HP */
9328 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9329 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9330 /* Int speaker */
9331 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
9332 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9333
9334 /* enable unsolicited event */
9335 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9336 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9337
9338 { } /* end */
9339 };
9340
9341 static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
9342 /* HP */
9343 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
9344 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9345 /* Subwoofer */
9346 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
9347 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9348
9349 /* enable unsolicited event */
9350 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9351
9352 { } /* end */
9353 };
9354
9355 static struct hda_verb alc883_targa_verbs[] = {
9356 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9357 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9358
9359 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9360 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9361
9362 /* Connect Line-Out side jack (SPDIF) to Side */
9363 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9364 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9365 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
9366 /* Connect Mic jack to CLFE */
9367 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9368 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9369 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
9370 /* Connect Line-in jack to Surround */
9371 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9372 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9373 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
9374 /* Connect HP out jack to Front */
9375 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9376 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9377 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
9378
9379 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9380
9381 { } /* end */
9382 };
9383
9384 static struct hda_verb alc883_lenovo_101e_verbs[] = {
9385 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9386 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
9387 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
9388 { } /* end */
9389 };
9390
9391 static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
9392 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9393 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9394 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9395 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9396 { } /* end */
9397 };
9398
9399 static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
9400 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9401 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9402 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9403 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
9404 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9405 { } /* end */
9406 };
9407
9408 static struct hda_verb alc883_haier_w66_verbs[] = {
9409 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9410 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9411
9412 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9413
9414 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
9415 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9416 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9417 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9418 { } /* end */
9419 };
9420
9421 static struct hda_verb alc888_lenovo_sky_verbs[] = {
9422 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9423 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9424 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9425 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9426 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9427 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9428 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
9429 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9430 { } /* end */
9431 };
9432
9433 static struct hda_verb alc888_6st_dell_verbs[] = {
9434 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9435 { }
9436 };
9437
9438 static struct hda_verb alc883_vaiott_verbs[] = {
9439 /* HP */
9440 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9441 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9442
9443 /* enable unsolicited event */
9444 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9445
9446 { } /* end */
9447 };
9448
9449 static void alc888_3st_hp_setup(struct hda_codec *codec)
9450 {
9451 struct alc_spec *spec = codec->spec;
9452
9453 spec->autocfg.hp_pins[0] = 0x1b;
9454 spec->autocfg.speaker_pins[0] = 0x14;
9455 spec->autocfg.speaker_pins[1] = 0x16;
9456 spec->autocfg.speaker_pins[2] = 0x18;
9457 }
9458
9459 static struct hda_verb alc888_3st_hp_verbs[] = {
9460 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */
9461 {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */
9462 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */
9463 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9464 { } /* end */
9465 };
9466
9467 /*
9468 * 2ch mode
9469 */
9470 static struct hda_verb alc888_3st_hp_2ch_init[] = {
9471 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
9472 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
9473 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
9474 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
9475 { } /* end */
9476 };
9477
9478 /*
9479 * 4ch mode
9480 */
9481 static struct hda_verb alc888_3st_hp_4ch_init[] = {
9482 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
9483 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
9484 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
9485 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
9486 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
9487 { } /* end */
9488 };
9489
9490 /*
9491 * 6ch mode
9492 */
9493 static struct hda_verb alc888_3st_hp_6ch_init[] = {
9494 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
9495 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
9496 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
9497 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
9498 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
9499 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
9500 { } /* end */
9501 };
9502
9503 static struct hda_channel_mode alc888_3st_hp_modes[3] = {
9504 { 2, alc888_3st_hp_2ch_init },
9505 { 4, alc888_3st_hp_4ch_init },
9506 { 6, alc888_3st_hp_6ch_init },
9507 };
9508
9509 /* toggle front-jack and RCA according to the hp-jack state */
9510 static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
9511 {
9512 unsigned int present = snd_hda_jack_detect(codec, 0x1b);
9513
9514 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9515 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9516 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9517 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9518 }
9519
9520 /* toggle RCA according to the front-jack state */
9521 static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
9522 {
9523 unsigned int present = snd_hda_jack_detect(codec, 0x14);
9524
9525 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9526 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9527 }
9528
9529 static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
9530 unsigned int res)
9531 {
9532 if ((res >> 26) == ALC880_HP_EVENT)
9533 alc888_lenovo_ms7195_front_automute(codec);
9534 if ((res >> 26) == ALC880_FRONT_EVENT)
9535 alc888_lenovo_ms7195_rca_automute(codec);
9536 }
9537
9538 /* toggle speaker-output according to the hp-jack state */
9539 static void alc883_lenovo_nb0763_setup(struct hda_codec *codec)
9540 {
9541 struct alc_spec *spec = codec->spec;
9542
9543 spec->autocfg.hp_pins[0] = 0x14;
9544 spec->autocfg.speaker_pins[0] = 0x15;
9545 }
9546
9547 /* toggle speaker-output according to the hp-jack state */
9548 #define alc883_targa_init_hook alc882_targa_init_hook
9549 #define alc883_targa_unsol_event alc882_targa_unsol_event
9550
9551 static void alc883_clevo_m720_setup(struct hda_codec *codec)
9552 {
9553 struct alc_spec *spec = codec->spec;
9554
9555 spec->autocfg.hp_pins[0] = 0x15;
9556 spec->autocfg.speaker_pins[0] = 0x14;
9557 }
9558
9559 static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
9560 {
9561 alc_automute_amp(codec);
9562 alc88x_simple_mic_automute(codec);
9563 }
9564
9565 static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
9566 unsigned int res)
9567 {
9568 switch (res >> 26) {
9569 case ALC880_MIC_EVENT:
9570 alc88x_simple_mic_automute(codec);
9571 break;
9572 default:
9573 alc_automute_amp_unsol_event(codec, res);
9574 break;
9575 }
9576 }
9577
9578 /* toggle speaker-output according to the hp-jack state */
9579 static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
9580 {
9581 struct alc_spec *spec = codec->spec;
9582
9583 spec->autocfg.hp_pins[0] = 0x14;
9584 spec->autocfg.speaker_pins[0] = 0x15;
9585 }
9586
9587 static void alc883_haier_w66_setup(struct hda_codec *codec)
9588 {
9589 struct alc_spec *spec = codec->spec;
9590
9591 spec->autocfg.hp_pins[0] = 0x1b;
9592 spec->autocfg.speaker_pins[0] = 0x14;
9593 }
9594
9595 static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
9596 {
9597 int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
9598
9599 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9600 HDA_AMP_MUTE, bits);
9601 }
9602
9603 static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
9604 {
9605 int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
9606
9607 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9608 HDA_AMP_MUTE, bits);
9609 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9610 HDA_AMP_MUTE, bits);
9611 }
9612
9613 static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
9614 unsigned int res)
9615 {
9616 if ((res >> 26) == ALC880_HP_EVENT)
9617 alc883_lenovo_101e_all_automute(codec);
9618 if ((res >> 26) == ALC880_FRONT_EVENT)
9619 alc883_lenovo_101e_ispeaker_automute(codec);
9620 }
9621
9622 /* toggle speaker-output according to the hp-jack state */
9623 static void alc883_acer_aspire_setup(struct hda_codec *codec)
9624 {
9625 struct alc_spec *spec = codec->spec;
9626
9627 spec->autocfg.hp_pins[0] = 0x14;
9628 spec->autocfg.speaker_pins[0] = 0x15;
9629 spec->autocfg.speaker_pins[1] = 0x16;
9630 }
9631
9632 static struct hda_verb alc883_acer_eapd_verbs[] = {
9633 /* HP Pin: output 0 (0x0c) */
9634 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9635 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9636 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
9637 /* Front Pin: output 0 (0x0c) */
9638 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9639 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9640 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9641 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
9642 /* eanable EAPD on medion laptop */
9643 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
9644 {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
9645 /* enable unsolicited event */
9646 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9647 { }
9648 };
9649
9650 static void alc888_6st_dell_setup(struct hda_codec *codec)
9651 {
9652 struct alc_spec *spec = codec->spec;
9653
9654 spec->autocfg.hp_pins[0] = 0x1b;
9655 spec->autocfg.speaker_pins[0] = 0x14;
9656 spec->autocfg.speaker_pins[1] = 0x15;
9657 spec->autocfg.speaker_pins[2] = 0x16;
9658 spec->autocfg.speaker_pins[3] = 0x17;
9659 }
9660
9661 static void alc888_lenovo_sky_setup(struct hda_codec *codec)
9662 {
9663 struct alc_spec *spec = codec->spec;
9664
9665 spec->autocfg.hp_pins[0] = 0x1b;
9666 spec->autocfg.speaker_pins[0] = 0x14;
9667 spec->autocfg.speaker_pins[1] = 0x15;
9668 spec->autocfg.speaker_pins[2] = 0x16;
9669 spec->autocfg.speaker_pins[3] = 0x17;
9670 spec->autocfg.speaker_pins[4] = 0x1a;
9671 }
9672
9673 static void alc883_vaiott_setup(struct hda_codec *codec)
9674 {
9675 struct alc_spec *spec = codec->spec;
9676
9677 spec->autocfg.hp_pins[0] = 0x15;
9678 spec->autocfg.speaker_pins[0] = 0x14;
9679 spec->autocfg.speaker_pins[1] = 0x17;
9680 }
9681
9682 static struct hda_verb alc888_asus_m90v_verbs[] = {
9683 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9684 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9685 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9686 /* enable unsolicited event */
9687 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9688 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9689 { } /* end */
9690 };
9691
9692 static void alc883_mode2_setup(struct hda_codec *codec)
9693 {
9694 struct alc_spec *spec = codec->spec;
9695
9696 spec->autocfg.hp_pins[0] = 0x1b;
9697 spec->autocfg.speaker_pins[0] = 0x14;
9698 spec->autocfg.speaker_pins[1] = 0x15;
9699 spec->autocfg.speaker_pins[2] = 0x16;
9700 spec->ext_mic.pin = 0x18;
9701 spec->int_mic.pin = 0x19;
9702 spec->ext_mic.mux_idx = 0;
9703 spec->int_mic.mux_idx = 1;
9704 spec->auto_mic = 1;
9705 }
9706
9707 static struct hda_verb alc888_asus_eee1601_verbs[] = {
9708 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9709 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9710 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9711 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9712 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
9713 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
9714 {0x20, AC_VERB_SET_PROC_COEF, 0x0838},
9715 /* enable unsolicited event */
9716 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9717 { } /* end */
9718 };
9719
9720 static void alc883_eee1601_inithook(struct hda_codec *codec)
9721 {
9722 struct alc_spec *spec = codec->spec;
9723
9724 spec->autocfg.hp_pins[0] = 0x14;
9725 spec->autocfg.speaker_pins[0] = 0x1b;
9726 alc_automute_pin(codec);
9727 }
9728
9729 static struct hda_verb alc889A_mb31_verbs[] = {
9730 /* Init rear pin (used as headphone output) */
9731 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */
9732 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Connect to front */
9733 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9734 /* Init line pin (used as output in 4ch and 6ch mode) */
9735 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, /* Connect to CLFE */
9736 /* Init line 2 pin (used as headphone out by default) */
9737 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Use as input */
9738 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
9739 { } /* end */
9740 };
9741
9742 /* Mute speakers according to the headphone jack state */
9743 static void alc889A_mb31_automute(struct hda_codec *codec)
9744 {
9745 unsigned int present;
9746
9747 /* Mute only in 2ch or 4ch mode */
9748 if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
9749 == 0x00) {
9750 present = snd_hda_jack_detect(codec, 0x15);
9751 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9752 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9753 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
9754 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9755 }
9756 }
9757
9758 static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
9759 {
9760 if ((res >> 26) == ALC880_HP_EVENT)
9761 alc889A_mb31_automute(codec);
9762 }
9763
9764
9765 #ifdef CONFIG_SND_HDA_POWER_SAVE
9766 #define alc882_loopbacks alc880_loopbacks
9767 #endif
9768
9769 /* pcm configuration: identical with ALC880 */
9770 #define alc882_pcm_analog_playback alc880_pcm_analog_playback
9771 #define alc882_pcm_analog_capture alc880_pcm_analog_capture
9772 #define alc882_pcm_digital_playback alc880_pcm_digital_playback
9773 #define alc882_pcm_digital_capture alc880_pcm_digital_capture
9774
9775 static hda_nid_t alc883_slave_dig_outs[] = {
9776 ALC1200_DIGOUT_NID, 0,
9777 };
9778
9779 static hda_nid_t alc1200_slave_dig_outs[] = {
9780 ALC883_DIGOUT_NID, 0,
9781 };
9782
9783 /*
9784 * configuration and preset
9785 */
9786 static const char * const alc882_models[ALC882_MODEL_LAST] = {
9787 [ALC882_3ST_DIG] = "3stack-dig",
9788 [ALC882_6ST_DIG] = "6stack-dig",
9789 [ALC882_ARIMA] = "arima",
9790 [ALC882_W2JC] = "w2jc",
9791 [ALC882_TARGA] = "targa",
9792 [ALC882_ASUS_A7J] = "asus-a7j",
9793 [ALC882_ASUS_A7M] = "asus-a7m",
9794 [ALC885_MACPRO] = "macpro",
9795 [ALC885_MB5] = "mb5",
9796 [ALC885_MACMINI3] = "macmini3",
9797 [ALC885_MBA21] = "mba21",
9798 [ALC885_MBP3] = "mbp3",
9799 [ALC885_IMAC24] = "imac24",
9800 [ALC885_IMAC91] = "imac91",
9801 [ALC883_3ST_2ch_DIG] = "3stack-2ch-dig",
9802 [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig",
9803 [ALC883_3ST_6ch] = "3stack-6ch",
9804 [ALC883_6ST_DIG] = "alc883-6stack-dig",
9805 [ALC883_TARGA_DIG] = "targa-dig",
9806 [ALC883_TARGA_2ch_DIG] = "targa-2ch-dig",
9807 [ALC883_TARGA_8ch_DIG] = "targa-8ch-dig",
9808 [ALC883_ACER] = "acer",
9809 [ALC883_ACER_ASPIRE] = "acer-aspire",
9810 [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g",
9811 [ALC888_ACER_ASPIRE_6530G] = "acer-aspire-6530g",
9812 [ALC888_ACER_ASPIRE_8930G] = "acer-aspire-8930g",
9813 [ALC888_ACER_ASPIRE_7730G] = "acer-aspire-7730g",
9814 [ALC883_MEDION] = "medion",
9815 [ALC883_MEDION_WIM2160] = "medion-wim2160",
9816 [ALC883_LAPTOP_EAPD] = "laptop-eapd",
9817 [ALC883_LENOVO_101E_2ch] = "lenovo-101e",
9818 [ALC883_LENOVO_NB0763] = "lenovo-nb0763",
9819 [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
9820 [ALC888_LENOVO_SKY] = "lenovo-sky",
9821 [ALC883_HAIER_W66] = "haier-w66",
9822 [ALC888_3ST_HP] = "3stack-hp",
9823 [ALC888_6ST_DELL] = "6stack-dell",
9824 [ALC883_MITAC] = "mitac",
9825 [ALC883_CLEVO_M540R] = "clevo-m540r",
9826 [ALC883_CLEVO_M720] = "clevo-m720",
9827 [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
9828 [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
9829 [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel",
9830 [ALC889A_INTEL] = "intel-alc889a",
9831 [ALC889_INTEL] = "intel-x58",
9832 [ALC1200_ASUS_P5Q] = "asus-p5q",
9833 [ALC889A_MB31] = "mb31",
9834 [ALC883_SONY_VAIO_TT] = "sony-vaio-tt",
9835 [ALC882_AUTO] = "auto",
9836 };
9837
9838 static struct snd_pci_quirk alc882_cfg_tbl[] = {
9839 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
9840
9841 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
9842 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
9843 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
9844 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
9845 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
9846 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
9847 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
9848 ALC888_ACER_ASPIRE_4930G),
9849 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
9850 ALC888_ACER_ASPIRE_4930G),
9851 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
9852 ALC888_ACER_ASPIRE_8930G),
9853 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
9854 ALC888_ACER_ASPIRE_8930G),
9855 SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
9856 SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
9857 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
9858 ALC888_ACER_ASPIRE_6530G),
9859 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
9860 ALC888_ACER_ASPIRE_6530G),
9861 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
9862 ALC888_ACER_ASPIRE_7730G),
9863 /* default Acer -- disabled as it causes more problems.
9864 * model=auto should work fine now
9865 */
9866 /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
9867
9868 SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
9869
9870 SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
9871 SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
9872 SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
9873 SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
9874 SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
9875 SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
9876
9877 SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
9878 SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
9879 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
9880 SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
9881 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
9882 SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
9883 SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
9884 SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
9885 SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
9886 SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
9887 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
9888
9889 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
9890 SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
9891 SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
9892 SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
9893 SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
9894 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
9895 SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
9896 SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
9897 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
9898
9899 SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
9900 SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
9901 SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
9902 SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */
9903 SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
9904 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
9905 SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
9906 SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
9907 SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
9908 SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
9909 SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
9910 SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
9911 SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
9912 SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
9913 SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
9914 SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
9915 SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
9916 SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
9917 SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG),
9918 SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
9919 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
9920 SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
9921 SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
9922 SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
9923 SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
9924 SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
9925 SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
9926 SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
9927 SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG),
9928 SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
9929 SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
9930
9931 SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
9932 SND_PCI_QUIRK(0x1558, 0x0571, "Clevo laptop M570U", ALC883_3ST_6ch_DIG),
9933 SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
9934 SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
9935 SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
9936 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
9937 SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
9938 /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
9939 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
9940 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
9941 ALC883_FUJITSU_PI2515),
9942 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
9943 ALC888_FUJITSU_XA3530),
9944 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
9945 SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9946 SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9947 SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9948 SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
9949 SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
9950 SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
9951 SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
9952
9953 SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
9954 SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
9955 SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
9956 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
9957 SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
9958 SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
9959 SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG),
9960
9961 {}
9962 };
9963
9964 /* codec SSID table for Intel Mac */
9965 static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9966 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
9967 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
9968 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
9969 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
9970 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
9971 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
9972 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
9973 SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31),
9974 SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_ASUS_A7M),
9975 SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC885_MBP3),
9976 SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC885_MBA21),
9977 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
9978 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
9979 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
9980 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
9981 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
9982 SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC885_MB5),
9983 /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
9984 * so apparently no perfect solution yet
9985 */
9986 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
9987 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
9988 SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3),
9989 {} /* terminator */
9990 };
9991
9992 static struct alc_config_preset alc882_presets[] = {
9993 [ALC882_3ST_DIG] = {
9994 .mixers = { alc882_base_mixer },
9995 .init_verbs = { alc882_base_init_verbs,
9996 alc882_adc1_init_verbs },
9997 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9998 .dac_nids = alc882_dac_nids,
9999 .dig_out_nid = ALC882_DIGOUT_NID,
10000 .dig_in_nid = ALC882_DIGIN_NID,
10001 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
10002 .channel_mode = alc882_ch_modes,
10003 .need_dac_fix = 1,
10004 .input_mux = &alc882_capture_source,
10005 },
10006 [ALC882_6ST_DIG] = {
10007 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
10008 .init_verbs = { alc882_base_init_verbs,
10009 alc882_adc1_init_verbs },
10010 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
10011 .dac_nids = alc882_dac_nids,
10012 .dig_out_nid = ALC882_DIGOUT_NID,
10013 .dig_in_nid = ALC882_DIGIN_NID,
10014 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
10015 .channel_mode = alc882_sixstack_modes,
10016 .input_mux = &alc882_capture_source,
10017 },
10018 [ALC882_ARIMA] = {
10019 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
10020 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
10021 alc882_eapd_verbs },
10022 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
10023 .dac_nids = alc882_dac_nids,
10024 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
10025 .channel_mode = alc882_sixstack_modes,
10026 .input_mux = &alc882_capture_source,
10027 },
10028 [ALC882_W2JC] = {
10029 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
10030 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
10031 alc882_eapd_verbs, alc880_gpio1_init_verbs },
10032 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
10033 .dac_nids = alc882_dac_nids,
10034 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
10035 .channel_mode = alc880_threestack_modes,
10036 .need_dac_fix = 1,
10037 .input_mux = &alc882_capture_source,
10038 .dig_out_nid = ALC882_DIGOUT_NID,
10039 },
10040 [ALC885_MBA21] = {
10041 .mixers = { alc885_mba21_mixer },
10042 .init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
10043 .num_dacs = 2,
10044 .dac_nids = alc882_dac_nids,
10045 .channel_mode = alc885_mba21_ch_modes,
10046 .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
10047 .input_mux = &alc882_capture_source,
10048 .unsol_event = alc_automute_amp_unsol_event,
10049 .setup = alc885_mba21_setup,
10050 .init_hook = alc_automute_amp,
10051 },
10052 [ALC885_MBP3] = {
10053 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
10054 .init_verbs = { alc885_mbp3_init_verbs,
10055 alc880_gpio1_init_verbs },
10056 .num_dacs = 2,
10057 .dac_nids = alc882_dac_nids,
10058 .hp_nid = 0x04,
10059 .channel_mode = alc885_mbp_4ch_modes,
10060 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
10061 .input_mux = &alc882_capture_source,
10062 .dig_out_nid = ALC882_DIGOUT_NID,
10063 .dig_in_nid = ALC882_DIGIN_NID,
10064 .unsol_event = alc_automute_amp_unsol_event,
10065 .setup = alc885_mbp3_setup,
10066 .init_hook = alc_automute_amp,
10067 },
10068 [ALC885_MB5] = {
10069 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
10070 .init_verbs = { alc885_mb5_init_verbs,
10071 alc880_gpio1_init_verbs },
10072 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
10073 .dac_nids = alc882_dac_nids,
10074 .channel_mode = alc885_mb5_6ch_modes,
10075 .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
10076 .input_mux = &mb5_capture_source,
10077 .dig_out_nid = ALC882_DIGOUT_NID,
10078 .dig_in_nid = ALC882_DIGIN_NID,
10079 .unsol_event = alc_automute_amp_unsol_event,
10080 .setup = alc885_mb5_setup,
10081 .init_hook = alc_automute_amp,
10082 },
10083 [ALC885_MACMINI3] = {
10084 .mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
10085 .init_verbs = { alc885_macmini3_init_verbs,
10086 alc880_gpio1_init_verbs },
10087 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
10088 .dac_nids = alc882_dac_nids,
10089 .channel_mode = alc885_macmini3_6ch_modes,
10090 .num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes),
10091 .input_mux = &macmini3_capture_source,
10092 .dig_out_nid = ALC882_DIGOUT_NID,
10093 .dig_in_nid = ALC882_DIGIN_NID,
10094 .unsol_event = alc_automute_amp_unsol_event,
10095 .setup = alc885_macmini3_setup,
10096 .init_hook = alc_automute_amp,
10097 },
10098 [ALC885_MACPRO] = {
10099 .mixers = { alc882_macpro_mixer },
10100 .init_verbs = { alc882_macpro_init_verbs },
10101 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
10102 .dac_nids = alc882_dac_nids,
10103 .dig_out_nid = ALC882_DIGOUT_NID,
10104 .dig_in_nid = ALC882_DIGIN_NID,
10105 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
10106 .channel_mode = alc882_ch_modes,
10107 .input_mux = &alc882_capture_source,
10108 .init_hook = alc885_macpro_init_hook,
10109 },
10110 [ALC885_IMAC24] = {
10111 .mixers = { alc885_imac24_mixer },
10112 .init_verbs = { alc885_imac24_init_verbs },
10113 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
10114 .dac_nids = alc882_dac_nids,
10115 .dig_out_nid = ALC882_DIGOUT_NID,
10116 .dig_in_nid = ALC882_DIGIN_NID,
10117 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
10118 .channel_mode = alc882_ch_modes,
10119 .input_mux = &alc882_capture_source,
10120 .unsol_event = alc_automute_amp_unsol_event,
10121 .setup = alc885_imac24_setup,
10122 .init_hook = alc885_imac24_init_hook,
10123 },
10124 [ALC885_IMAC91] = {
10125 .mixers = {alc885_imac91_mixer},
10126 .init_verbs = { alc885_imac91_init_verbs,
10127 alc880_gpio1_init_verbs },
10128 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
10129 .dac_nids = alc882_dac_nids,
10130 .channel_mode = alc885_mba21_ch_modes,
10131 .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
10132 .input_mux = &alc889A_imac91_capture_source,
10133 .dig_out_nid = ALC882_DIGOUT_NID,
10134 .dig_in_nid = ALC882_DIGIN_NID,
10135 .unsol_event = alc_automute_amp_unsol_event,
10136 .setup = alc885_imac91_setup,
10137 .init_hook = alc_automute_amp,
10138 },
10139 [ALC882_TARGA] = {
10140 .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
10141 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
10142 alc880_gpio3_init_verbs, alc882_targa_verbs},
10143 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
10144 .dac_nids = alc882_dac_nids,
10145 .dig_out_nid = ALC882_DIGOUT_NID,
10146 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
10147 .adc_nids = alc882_adc_nids,
10148 .capsrc_nids = alc882_capsrc_nids,
10149 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
10150 .channel_mode = alc882_3ST_6ch_modes,
10151 .need_dac_fix = 1,
10152 .input_mux = &alc882_capture_source,
10153 .unsol_event = alc882_targa_unsol_event,
10154 .setup = alc882_targa_setup,
10155 .init_hook = alc882_targa_automute,
10156 },
10157 [ALC882_ASUS_A7J] = {
10158 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
10159 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
10160 alc882_asus_a7j_verbs},
10161 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
10162 .dac_nids = alc882_dac_nids,
10163 .dig_out_nid = ALC882_DIGOUT_NID,
10164 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
10165 .adc_nids = alc882_adc_nids,
10166 .capsrc_nids = alc882_capsrc_nids,
10167 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
10168 .channel_mode = alc882_3ST_6ch_modes,
10169 .need_dac_fix = 1,
10170 .input_mux = &alc882_capture_source,
10171 },
10172 [ALC882_ASUS_A7M] = {
10173 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
10174 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
10175 alc882_eapd_verbs, alc880_gpio1_init_verbs,
10176 alc882_asus_a7m_verbs },
10177 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
10178 .dac_nids = alc882_dac_nids,
10179 .dig_out_nid = ALC882_DIGOUT_NID,
10180 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
10181 .channel_mode = alc880_threestack_modes,
10182 .need_dac_fix = 1,
10183 .input_mux = &alc882_capture_source,
10184 },
10185 [ALC883_3ST_2ch_DIG] = {
10186 .mixers = { alc883_3ST_2ch_mixer },
10187 .init_verbs = { alc883_init_verbs },
10188 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10189 .dac_nids = alc883_dac_nids,
10190 .dig_out_nid = ALC883_DIGOUT_NID,
10191 .dig_in_nid = ALC883_DIGIN_NID,
10192 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10193 .channel_mode = alc883_3ST_2ch_modes,
10194 .input_mux = &alc883_capture_source,
10195 },
10196 [ALC883_3ST_6ch_DIG] = {
10197 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10198 .init_verbs = { alc883_init_verbs },
10199 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10200 .dac_nids = alc883_dac_nids,
10201 .dig_out_nid = ALC883_DIGOUT_NID,
10202 .dig_in_nid = ALC883_DIGIN_NID,
10203 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10204 .channel_mode = alc883_3ST_6ch_modes,
10205 .need_dac_fix = 1,
10206 .input_mux = &alc883_capture_source,
10207 },
10208 [ALC883_3ST_6ch] = {
10209 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10210 .init_verbs = { alc883_init_verbs },
10211 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10212 .dac_nids = alc883_dac_nids,
10213 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10214 .channel_mode = alc883_3ST_6ch_modes,
10215 .need_dac_fix = 1,
10216 .input_mux = &alc883_capture_source,
10217 },
10218 [ALC883_3ST_6ch_INTEL] = {
10219 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
10220 .init_verbs = { alc883_init_verbs },
10221 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10222 .dac_nids = alc883_dac_nids,
10223 .dig_out_nid = ALC883_DIGOUT_NID,
10224 .dig_in_nid = ALC883_DIGIN_NID,
10225 .slave_dig_outs = alc883_slave_dig_outs,
10226 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
10227 .channel_mode = alc883_3ST_6ch_intel_modes,
10228 .need_dac_fix = 1,
10229 .input_mux = &alc883_3stack_6ch_intel,
10230 },
10231 [ALC889A_INTEL] = {
10232 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
10233 .init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
10234 alc_hp15_unsol_verbs },
10235 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10236 .dac_nids = alc883_dac_nids,
10237 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
10238 .adc_nids = alc889_adc_nids,
10239 .dig_out_nid = ALC883_DIGOUT_NID,
10240 .dig_in_nid = ALC883_DIGIN_NID,
10241 .slave_dig_outs = alc883_slave_dig_outs,
10242 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
10243 .channel_mode = alc889_8ch_intel_modes,
10244 .capsrc_nids = alc889_capsrc_nids,
10245 .input_mux = &alc889_capture_source,
10246 .setup = alc889_automute_setup,
10247 .init_hook = alc_automute_amp,
10248 .unsol_event = alc_automute_amp_unsol_event,
10249 .need_dac_fix = 1,
10250 },
10251 [ALC889_INTEL] = {
10252 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
10253 .init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
10254 alc889_eapd_verbs, alc_hp15_unsol_verbs},
10255 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10256 .dac_nids = alc883_dac_nids,
10257 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
10258 .adc_nids = alc889_adc_nids,
10259 .dig_out_nid = ALC883_DIGOUT_NID,
10260 .dig_in_nid = ALC883_DIGIN_NID,
10261 .slave_dig_outs = alc883_slave_dig_outs,
10262 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
10263 .channel_mode = alc889_8ch_intel_modes,
10264 .capsrc_nids = alc889_capsrc_nids,
10265 .input_mux = &alc889_capture_source,
10266 .setup = alc889_automute_setup,
10267 .init_hook = alc889_intel_init_hook,
10268 .unsol_event = alc_automute_amp_unsol_event,
10269 .need_dac_fix = 1,
10270 },
10271 [ALC883_6ST_DIG] = {
10272 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
10273 .init_verbs = { alc883_init_verbs },
10274 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10275 .dac_nids = alc883_dac_nids,
10276 .dig_out_nid = ALC883_DIGOUT_NID,
10277 .dig_in_nid = ALC883_DIGIN_NID,
10278 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10279 .channel_mode = alc883_sixstack_modes,
10280 .input_mux = &alc883_capture_source,
10281 },
10282 [ALC883_TARGA_DIG] = {
10283 .mixers = { alc883_targa_mixer, alc883_chmode_mixer },
10284 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
10285 alc883_targa_verbs},
10286 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10287 .dac_nids = alc883_dac_nids,
10288 .dig_out_nid = ALC883_DIGOUT_NID,
10289 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10290 .channel_mode = alc883_3ST_6ch_modes,
10291 .need_dac_fix = 1,
10292 .input_mux = &alc883_capture_source,
10293 .unsol_event = alc883_targa_unsol_event,
10294 .setup = alc882_targa_setup,
10295 .init_hook = alc882_targa_automute,
10296 },
10297 [ALC883_TARGA_2ch_DIG] = {
10298 .mixers = { alc883_targa_2ch_mixer},
10299 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
10300 alc883_targa_verbs},
10301 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10302 .dac_nids = alc883_dac_nids,
10303 .adc_nids = alc883_adc_nids_alt,
10304 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
10305 .capsrc_nids = alc883_capsrc_nids,
10306 .dig_out_nid = ALC883_DIGOUT_NID,
10307 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10308 .channel_mode = alc883_3ST_2ch_modes,
10309 .input_mux = &alc883_capture_source,
10310 .unsol_event = alc883_targa_unsol_event,
10311 .setup = alc882_targa_setup,
10312 .init_hook = alc882_targa_automute,
10313 },
10314 [ALC883_TARGA_8ch_DIG] = {
10315 .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
10316 alc883_chmode_mixer },
10317 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
10318 alc883_targa_verbs },
10319 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10320 .dac_nids = alc883_dac_nids,
10321 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10322 .adc_nids = alc883_adc_nids_rev,
10323 .capsrc_nids = alc883_capsrc_nids_rev,
10324 .dig_out_nid = ALC883_DIGOUT_NID,
10325 .dig_in_nid = ALC883_DIGIN_NID,
10326 .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
10327 .channel_mode = alc883_4ST_8ch_modes,
10328 .need_dac_fix = 1,
10329 .input_mux = &alc883_capture_source,
10330 .unsol_event = alc883_targa_unsol_event,
10331 .setup = alc882_targa_setup,
10332 .init_hook = alc882_targa_automute,
10333 },
10334 [ALC883_ACER] = {
10335 .mixers = { alc883_base_mixer },
10336 /* On TravelMate laptops, GPIO 0 enables the internal speaker
10337 * and the headphone jack. Turn this on and rely on the
10338 * standard mute methods whenever the user wants to turn
10339 * these outputs off.
10340 */
10341 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
10342 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10343 .dac_nids = alc883_dac_nids,
10344 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10345 .channel_mode = alc883_3ST_2ch_modes,
10346 .input_mux = &alc883_capture_source,
10347 },
10348 [ALC883_ACER_ASPIRE] = {
10349 .mixers = { alc883_acer_aspire_mixer },
10350 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
10351 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10352 .dac_nids = alc883_dac_nids,
10353 .dig_out_nid = ALC883_DIGOUT_NID,
10354 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10355 .channel_mode = alc883_3ST_2ch_modes,
10356 .input_mux = &alc883_capture_source,
10357 .unsol_event = alc_automute_amp_unsol_event,
10358 .setup = alc883_acer_aspire_setup,
10359 .init_hook = alc_automute_amp,
10360 },
10361 [ALC888_ACER_ASPIRE_4930G] = {
10362 .mixers = { alc888_base_mixer,
10363 alc883_chmode_mixer },
10364 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
10365 alc888_acer_aspire_4930g_verbs },
10366 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10367 .dac_nids = alc883_dac_nids,
10368 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10369 .adc_nids = alc883_adc_nids_rev,
10370 .capsrc_nids = alc883_capsrc_nids_rev,
10371 .dig_out_nid = ALC883_DIGOUT_NID,
10372 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10373 .channel_mode = alc883_3ST_6ch_modes,
10374 .need_dac_fix = 1,
10375 .const_channel_count = 6,
10376 .num_mux_defs =
10377 ARRAY_SIZE(alc888_2_capture_sources),
10378 .input_mux = alc888_2_capture_sources,
10379 .unsol_event = alc_automute_amp_unsol_event,
10380 .setup = alc888_acer_aspire_4930g_setup,
10381 .init_hook = alc_automute_amp,
10382 },
10383 [ALC888_ACER_ASPIRE_6530G] = {
10384 .mixers = { alc888_acer_aspire_6530_mixer },
10385 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
10386 alc888_acer_aspire_6530g_verbs },
10387 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10388 .dac_nids = alc883_dac_nids,
10389 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10390 .adc_nids = alc883_adc_nids_rev,
10391 .capsrc_nids = alc883_capsrc_nids_rev,
10392 .dig_out_nid = ALC883_DIGOUT_NID,
10393 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10394 .channel_mode = alc883_3ST_2ch_modes,
10395 .num_mux_defs =
10396 ARRAY_SIZE(alc888_2_capture_sources),
10397 .input_mux = alc888_acer_aspire_6530_sources,
10398 .unsol_event = alc_automute_amp_unsol_event,
10399 .setup = alc888_acer_aspire_6530g_setup,
10400 .init_hook = alc_automute_amp,
10401 },
10402 [ALC888_ACER_ASPIRE_8930G] = {
10403 .mixers = { alc889_acer_aspire_8930g_mixer,
10404 alc883_chmode_mixer },
10405 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
10406 alc889_acer_aspire_8930g_verbs,
10407 alc889_eapd_verbs},
10408 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10409 .dac_nids = alc883_dac_nids,
10410 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
10411 .adc_nids = alc889_adc_nids,
10412 .capsrc_nids = alc889_capsrc_nids,
10413 .dig_out_nid = ALC883_DIGOUT_NID,
10414 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10415 .channel_mode = alc883_3ST_6ch_modes,
10416 .need_dac_fix = 1,
10417 .const_channel_count = 6,
10418 .num_mux_defs =
10419 ARRAY_SIZE(alc889_capture_sources),
10420 .input_mux = alc889_capture_sources,
10421 .unsol_event = alc_automute_amp_unsol_event,
10422 .setup = alc889_acer_aspire_8930g_setup,
10423 .init_hook = alc_automute_amp,
10424 #ifdef CONFIG_SND_HDA_POWER_SAVE
10425 .power_hook = alc_power_eapd,
10426 #endif
10427 },
10428 [ALC888_ACER_ASPIRE_7730G] = {
10429 .mixers = { alc883_3ST_6ch_mixer,
10430 alc883_chmode_mixer },
10431 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
10432 alc888_acer_aspire_7730G_verbs },
10433 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10434 .dac_nids = alc883_dac_nids,
10435 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10436 .adc_nids = alc883_adc_nids_rev,
10437 .capsrc_nids = alc883_capsrc_nids_rev,
10438 .dig_out_nid = ALC883_DIGOUT_NID,
10439 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10440 .channel_mode = alc883_3ST_6ch_modes,
10441 .need_dac_fix = 1,
10442 .const_channel_count = 6,
10443 .input_mux = &alc883_capture_source,
10444 .unsol_event = alc_automute_amp_unsol_event,
10445 .setup = alc888_acer_aspire_7730g_setup,
10446 .init_hook = alc_automute_amp,
10447 },
10448 [ALC883_MEDION] = {
10449 .mixers = { alc883_fivestack_mixer,
10450 alc883_chmode_mixer },
10451 .init_verbs = { alc883_init_verbs,
10452 alc883_medion_eapd_verbs },
10453 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10454 .dac_nids = alc883_dac_nids,
10455 .adc_nids = alc883_adc_nids_alt,
10456 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
10457 .capsrc_nids = alc883_capsrc_nids,
10458 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10459 .channel_mode = alc883_sixstack_modes,
10460 .input_mux = &alc883_capture_source,
10461 },
10462 [ALC883_MEDION_WIM2160] = {
10463 .mixers = { alc883_medion_wim2160_mixer },
10464 .init_verbs = { alc883_init_verbs, alc883_medion_wim2160_verbs },
10465 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10466 .dac_nids = alc883_dac_nids,
10467 .dig_out_nid = ALC883_DIGOUT_NID,
10468 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
10469 .adc_nids = alc883_adc_nids,
10470 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10471 .channel_mode = alc883_3ST_2ch_modes,
10472 .input_mux = &alc883_capture_source,
10473 .unsol_event = alc_automute_amp_unsol_event,
10474 .setup = alc883_medion_wim2160_setup,
10475 .init_hook = alc_automute_amp,
10476 },
10477 [ALC883_LAPTOP_EAPD] = {
10478 .mixers = { alc883_base_mixer },
10479 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
10480 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10481 .dac_nids = alc883_dac_nids,
10482 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10483 .channel_mode = alc883_3ST_2ch_modes,
10484 .input_mux = &alc883_capture_source,
10485 },
10486 [ALC883_CLEVO_M540R] = {
10487 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10488 .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
10489 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10490 .dac_nids = alc883_dac_nids,
10491 .dig_out_nid = ALC883_DIGOUT_NID,
10492 .dig_in_nid = ALC883_DIGIN_NID,
10493 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
10494 .channel_mode = alc883_3ST_6ch_clevo_modes,
10495 .need_dac_fix = 1,
10496 .input_mux = &alc883_capture_source,
10497 /* This machine has the hardware HP auto-muting, thus
10498 * we need no software mute via unsol event
10499 */
10500 },
10501 [ALC883_CLEVO_M720] = {
10502 .mixers = { alc883_clevo_m720_mixer },
10503 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
10504 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10505 .dac_nids = alc883_dac_nids,
10506 .dig_out_nid = ALC883_DIGOUT_NID,
10507 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10508 .channel_mode = alc883_3ST_2ch_modes,
10509 .input_mux = &alc883_capture_source,
10510 .unsol_event = alc883_clevo_m720_unsol_event,
10511 .setup = alc883_clevo_m720_setup,
10512 .init_hook = alc883_clevo_m720_init_hook,
10513 },
10514 [ALC883_LENOVO_101E_2ch] = {
10515 .mixers = { alc883_lenovo_101e_2ch_mixer},
10516 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
10517 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10518 .dac_nids = alc883_dac_nids,
10519 .adc_nids = alc883_adc_nids_alt,
10520 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
10521 .capsrc_nids = alc883_capsrc_nids,
10522 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10523 .channel_mode = alc883_3ST_2ch_modes,
10524 .input_mux = &alc883_lenovo_101e_capture_source,
10525 .unsol_event = alc883_lenovo_101e_unsol_event,
10526 .init_hook = alc883_lenovo_101e_all_automute,
10527 },
10528 [ALC883_LENOVO_NB0763] = {
10529 .mixers = { alc883_lenovo_nb0763_mixer },
10530 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
10531 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10532 .dac_nids = alc883_dac_nids,
10533 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10534 .channel_mode = alc883_3ST_2ch_modes,
10535 .need_dac_fix = 1,
10536 .input_mux = &alc883_lenovo_nb0763_capture_source,
10537 .unsol_event = alc_automute_amp_unsol_event,
10538 .setup = alc883_lenovo_nb0763_setup,
10539 .init_hook = alc_automute_amp,
10540 },
10541 [ALC888_LENOVO_MS7195_DIG] = {
10542 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10543 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
10544 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10545 .dac_nids = alc883_dac_nids,
10546 .dig_out_nid = ALC883_DIGOUT_NID,
10547 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10548 .channel_mode = alc883_3ST_6ch_modes,
10549 .need_dac_fix = 1,
10550 .input_mux = &alc883_capture_source,
10551 .unsol_event = alc883_lenovo_ms7195_unsol_event,
10552 .init_hook = alc888_lenovo_ms7195_front_automute,
10553 },
10554 [ALC883_HAIER_W66] = {
10555 .mixers = { alc883_targa_2ch_mixer},
10556 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
10557 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10558 .dac_nids = alc883_dac_nids,
10559 .dig_out_nid = ALC883_DIGOUT_NID,
10560 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10561 .channel_mode = alc883_3ST_2ch_modes,
10562 .input_mux = &alc883_capture_source,
10563 .unsol_event = alc_automute_amp_unsol_event,
10564 .setup = alc883_haier_w66_setup,
10565 .init_hook = alc_automute_amp,
10566 },
10567 [ALC888_3ST_HP] = {
10568 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10569 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
10570 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10571 .dac_nids = alc883_dac_nids,
10572 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
10573 .channel_mode = alc888_3st_hp_modes,
10574 .need_dac_fix = 1,
10575 .input_mux = &alc883_capture_source,
10576 .unsol_event = alc_automute_amp_unsol_event,
10577 .setup = alc888_3st_hp_setup,
10578 .init_hook = alc_automute_amp,
10579 },
10580 [ALC888_6ST_DELL] = {
10581 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
10582 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
10583 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10584 .dac_nids = alc883_dac_nids,
10585 .dig_out_nid = ALC883_DIGOUT_NID,
10586 .dig_in_nid = ALC883_DIGIN_NID,
10587 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10588 .channel_mode = alc883_sixstack_modes,
10589 .input_mux = &alc883_capture_source,
10590 .unsol_event = alc_automute_amp_unsol_event,
10591 .setup = alc888_6st_dell_setup,
10592 .init_hook = alc_automute_amp,
10593 },
10594 [ALC883_MITAC] = {
10595 .mixers = { alc883_mitac_mixer },
10596 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
10597 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10598 .dac_nids = alc883_dac_nids,
10599 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10600 .channel_mode = alc883_3ST_2ch_modes,
10601 .input_mux = &alc883_capture_source,
10602 .unsol_event = alc_automute_amp_unsol_event,
10603 .setup = alc883_mitac_setup,
10604 .init_hook = alc_automute_amp,
10605 },
10606 [ALC883_FUJITSU_PI2515] = {
10607 .mixers = { alc883_2ch_fujitsu_pi2515_mixer },
10608 .init_verbs = { alc883_init_verbs,
10609 alc883_2ch_fujitsu_pi2515_verbs},
10610 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10611 .dac_nids = alc883_dac_nids,
10612 .dig_out_nid = ALC883_DIGOUT_NID,
10613 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10614 .channel_mode = alc883_3ST_2ch_modes,
10615 .input_mux = &alc883_fujitsu_pi2515_capture_source,
10616 .unsol_event = alc_automute_amp_unsol_event,
10617 .setup = alc883_2ch_fujitsu_pi2515_setup,
10618 .init_hook = alc_automute_amp,
10619 },
10620 [ALC888_FUJITSU_XA3530] = {
10621 .mixers = { alc888_base_mixer, alc883_chmode_mixer },
10622 .init_verbs = { alc883_init_verbs,
10623 alc888_fujitsu_xa3530_verbs },
10624 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10625 .dac_nids = alc883_dac_nids,
10626 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10627 .adc_nids = alc883_adc_nids_rev,
10628 .capsrc_nids = alc883_capsrc_nids_rev,
10629 .dig_out_nid = ALC883_DIGOUT_NID,
10630 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
10631 .channel_mode = alc888_4ST_8ch_intel_modes,
10632 .num_mux_defs =
10633 ARRAY_SIZE(alc888_2_capture_sources),
10634 .input_mux = alc888_2_capture_sources,
10635 .unsol_event = alc_automute_amp_unsol_event,
10636 .setup = alc888_fujitsu_xa3530_setup,
10637 .init_hook = alc_automute_amp,
10638 },
10639 [ALC888_LENOVO_SKY] = {
10640 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
10641 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
10642 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10643 .dac_nids = alc883_dac_nids,
10644 .dig_out_nid = ALC883_DIGOUT_NID,
10645 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10646 .channel_mode = alc883_sixstack_modes,
10647 .need_dac_fix = 1,
10648 .input_mux = &alc883_lenovo_sky_capture_source,
10649 .unsol_event = alc_automute_amp_unsol_event,
10650 .setup = alc888_lenovo_sky_setup,
10651 .init_hook = alc_automute_amp,
10652 },
10653 [ALC888_ASUS_M90V] = {
10654 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10655 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
10656 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10657 .dac_nids = alc883_dac_nids,
10658 .dig_out_nid = ALC883_DIGOUT_NID,
10659 .dig_in_nid = ALC883_DIGIN_NID,
10660 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10661 .channel_mode = alc883_3ST_6ch_modes,
10662 .need_dac_fix = 1,
10663 .input_mux = &alc883_fujitsu_pi2515_capture_source,
10664 .unsol_event = alc_sku_unsol_event,
10665 .setup = alc883_mode2_setup,
10666 .init_hook = alc_inithook,
10667 },
10668 [ALC888_ASUS_EEE1601] = {
10669 .mixers = { alc883_asus_eee1601_mixer },
10670 .cap_mixer = alc883_asus_eee1601_cap_mixer,
10671 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
10672 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10673 .dac_nids = alc883_dac_nids,
10674 .dig_out_nid = ALC883_DIGOUT_NID,
10675 .dig_in_nid = ALC883_DIGIN_NID,
10676 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10677 .channel_mode = alc883_3ST_2ch_modes,
10678 .need_dac_fix = 1,
10679 .input_mux = &alc883_asus_eee1601_capture_source,
10680 .unsol_event = alc_sku_unsol_event,
10681 .init_hook = alc883_eee1601_inithook,
10682 },
10683 [ALC1200_ASUS_P5Q] = {
10684 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
10685 .init_verbs = { alc883_init_verbs },
10686 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10687 .dac_nids = alc883_dac_nids,
10688 .dig_out_nid = ALC1200_DIGOUT_NID,
10689 .dig_in_nid = ALC883_DIGIN_NID,
10690 .slave_dig_outs = alc1200_slave_dig_outs,
10691 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10692 .channel_mode = alc883_sixstack_modes,
10693 .input_mux = &alc883_capture_source,
10694 },
10695 [ALC889A_MB31] = {
10696 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
10697 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
10698 alc880_gpio1_init_verbs },
10699 .adc_nids = alc883_adc_nids,
10700 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
10701 .capsrc_nids = alc883_capsrc_nids,
10702 .dac_nids = alc883_dac_nids,
10703 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10704 .channel_mode = alc889A_mb31_6ch_modes,
10705 .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
10706 .input_mux = &alc889A_mb31_capture_source,
10707 .dig_out_nid = ALC883_DIGOUT_NID,
10708 .unsol_event = alc889A_mb31_unsol_event,
10709 .init_hook = alc889A_mb31_automute,
10710 },
10711 [ALC883_SONY_VAIO_TT] = {
10712 .mixers = { alc883_vaiott_mixer },
10713 .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
10714 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10715 .dac_nids = alc883_dac_nids,
10716 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10717 .channel_mode = alc883_3ST_2ch_modes,
10718 .input_mux = &alc883_capture_source,
10719 .unsol_event = alc_automute_amp_unsol_event,
10720 .setup = alc883_vaiott_setup,
10721 .init_hook = alc_automute_amp,
10722 },
10723 };
10724
10725
10726 /*
10727 * Pin config fixes
10728 */
10729 enum {
10730 PINFIX_ABIT_AW9D_MAX,
10731 PINFIX_PB_M5210,
10732 PINFIX_ACER_ASPIRE_7736,
10733 };
10734
10735 static const struct alc_fixup alc882_fixups[] = {
10736 [PINFIX_ABIT_AW9D_MAX] = {
10737 .type = ALC_FIXUP_PINS,
10738 .v.pins = (const struct alc_pincfg[]) {
10739 { 0x15, 0x01080104 }, /* side */
10740 { 0x16, 0x01011012 }, /* rear */
10741 { 0x17, 0x01016011 }, /* clfe */
10742 { }
10743 }
10744 },
10745 [PINFIX_PB_M5210] = {
10746 .type = ALC_FIXUP_VERBS,
10747 .v.verbs = (const struct hda_verb[]) {
10748 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 },
10749 {}
10750 }
10751 },
10752 [PINFIX_ACER_ASPIRE_7736] = {
10753 .type = ALC_FIXUP_SKU,
10754 .v.sku = ALC_FIXUP_SKU_IGNORE,
10755 },
10756 };
10757
10758 static struct snd_pci_quirk alc882_fixup_tbl[] = {
10759 SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", PINFIX_PB_M5210),
10760 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
10761 SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", PINFIX_ACER_ASPIRE_7736),
10762 {}
10763 };
10764
10765 /*
10766 * BIOS auto configuration
10767 */
10768 static int alc882_auto_create_input_ctls(struct hda_codec *codec,
10769 const struct auto_pin_cfg *cfg)
10770 {
10771 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
10772 }
10773
10774 static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
10775 hda_nid_t nid, int pin_type,
10776 hda_nid_t dac)
10777 {
10778 int idx;
10779
10780 /* set as output */
10781 alc_set_pin_output(codec, nid, pin_type);
10782
10783 if (dac == 0x25)
10784 idx = 4;
10785 else if (dac >= 0x02 && dac <= 0x05)
10786 idx = dac - 2;
10787 else
10788 return;
10789 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
10790 }
10791
10792 static void alc882_auto_init_multi_out(struct hda_codec *codec)
10793 {
10794 struct alc_spec *spec = codec->spec;
10795 int i;
10796
10797 for (i = 0; i <= HDA_SIDE; i++) {
10798 hda_nid_t nid = spec->autocfg.line_out_pins[i];
10799 int pin_type = get_pin_type(spec->autocfg.line_out_type);
10800 if (nid)
10801 alc882_auto_set_output_and_unmute(codec, nid, pin_type,
10802 spec->multiout.dac_nids[i]);
10803 }
10804 }
10805
10806 static void alc882_auto_init_hp_out(struct hda_codec *codec)
10807 {
10808 struct alc_spec *spec = codec->spec;
10809 hda_nid_t pin, dac;
10810 int i;
10811
10812 for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
10813 pin = spec->autocfg.hp_pins[i];
10814 if (!pin)
10815 break;
10816 dac = spec->multiout.hp_nid;
10817 if (!dac)
10818 dac = spec->multiout.dac_nids[0]; /* to front */
10819 alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, dac);
10820 }
10821 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
10822 pin = spec->autocfg.speaker_pins[i];
10823 if (!pin)
10824 break;
10825 dac = spec->multiout.extra_out_nid[0];
10826 if (!dac)
10827 dac = spec->multiout.dac_nids[0]; /* to front */
10828 alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, dac);
10829 }
10830 }
10831
10832 static void alc882_auto_init_analog_input(struct hda_codec *codec)
10833 {
10834 struct alc_spec *spec = codec->spec;
10835 struct auto_pin_cfg *cfg = &spec->autocfg;
10836 int i;
10837
10838 for (i = 0; i < cfg->num_inputs; i++) {
10839 hda_nid_t nid = cfg->inputs[i].pin;
10840 alc_set_input_pin(codec, nid, cfg->inputs[i].type);
10841 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
10842 snd_hda_codec_write(codec, nid, 0,
10843 AC_VERB_SET_AMP_GAIN_MUTE,
10844 AMP_OUT_MUTE);
10845 }
10846 }
10847
10848 static void alc882_auto_init_input_src(struct hda_codec *codec)
10849 {
10850 struct alc_spec *spec = codec->spec;
10851 int c;
10852
10853 for (c = 0; c < spec->num_adc_nids; c++) {
10854 hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
10855 hda_nid_t nid = spec->capsrc_nids[c];
10856 unsigned int mux_idx;
10857 const struct hda_input_mux *imux;
10858 int conns, mute, idx, item;
10859
10860 conns = snd_hda_get_connections(codec, nid, conn_list,
10861 ARRAY_SIZE(conn_list));
10862 if (conns < 0)
10863 continue;
10864 mux_idx = c >= spec->num_mux_defs ? 0 : c;
10865 imux = &spec->input_mux[mux_idx];
10866 if (!imux->num_items && mux_idx > 0)
10867 imux = &spec->input_mux[0];
10868 for (idx = 0; idx < conns; idx++) {
10869 /* if the current connection is the selected one,
10870 * unmute it as default - otherwise mute it
10871 */
10872 mute = AMP_IN_MUTE(idx);
10873 for (item = 0; item < imux->num_items; item++) {
10874 if (imux->items[item].index == idx) {
10875 if (spec->cur_mux[c] == item)
10876 mute = AMP_IN_UNMUTE(idx);
10877 break;
10878 }
10879 }
10880 /* check if we have a selector or mixer
10881 * we could check for the widget type instead, but
10882 * just check for Amp-In presence (in case of mixer
10883 * without amp-in there is something wrong, this
10884 * function shouldn't be used or capsrc nid is wrong)
10885 */
10886 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
10887 snd_hda_codec_write(codec, nid, 0,
10888 AC_VERB_SET_AMP_GAIN_MUTE,
10889 mute);
10890 else if (mute != AMP_IN_MUTE(idx))
10891 snd_hda_codec_write(codec, nid, 0,
10892 AC_VERB_SET_CONNECT_SEL,
10893 idx);
10894 }
10895 }
10896 }
10897
10898 /* add mic boosts if needed */
10899 static int alc_auto_add_mic_boost(struct hda_codec *codec)
10900 {
10901 struct alc_spec *spec = codec->spec;
10902 struct auto_pin_cfg *cfg = &spec->autocfg;
10903 int i, err;
10904 int type_idx = 0;
10905 hda_nid_t nid;
10906 const char *prev_label = NULL;
10907
10908 for (i = 0; i < cfg->num_inputs; i++) {
10909 if (cfg->inputs[i].type > AUTO_PIN_MIC)
10910 break;
10911 nid = cfg->inputs[i].pin;
10912 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) {
10913 const char *label;
10914 char boost_label[32];
10915
10916 label = hda_get_autocfg_input_label(codec, cfg, i);
10917 if (prev_label && !strcmp(label, prev_label))
10918 type_idx++;
10919 else
10920 type_idx = 0;
10921 prev_label = label;
10922
10923 snprintf(boost_label, sizeof(boost_label),
10924 "%s Boost Volume", label);
10925 err = add_control(spec, ALC_CTL_WIDGET_VOL,
10926 boost_label, type_idx,
10927 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10928 if (err < 0)
10929 return err;
10930 }
10931 }
10932 return 0;
10933 }
10934
10935 /* almost identical with ALC880 parser... */
10936 static int alc882_parse_auto_config(struct hda_codec *codec)
10937 {
10938 struct alc_spec *spec = codec->spec;
10939 static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
10940 int err;
10941
10942 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
10943 alc882_ignore);
10944 if (err < 0)
10945 return err;
10946 if (!spec->autocfg.line_outs)
10947 return 0; /* can't find valid BIOS pin config */
10948
10949 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
10950 if (err < 0)
10951 return err;
10952 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
10953 if (err < 0)
10954 return err;
10955 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
10956 "Headphone");
10957 if (err < 0)
10958 return err;
10959 err = alc880_auto_create_extra_out(spec,
10960 spec->autocfg.speaker_pins[0],
10961 "Speaker");
10962 if (err < 0)
10963 return err;
10964 err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
10965 if (err < 0)
10966 return err;
10967
10968 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
10969
10970 alc_auto_parse_digital(codec);
10971
10972 if (spec->kctls.list)
10973 add_mixer(spec, spec->kctls.list);
10974
10975 add_verb(spec, alc883_auto_init_verbs);
10976 /* if ADC 0x07 is available, initialize it, too */
10977 if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
10978 add_verb(spec, alc882_adc1_init_verbs);
10979
10980 spec->num_mux_defs = 1;
10981 spec->input_mux = &spec->private_imux[0];
10982
10983 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
10984
10985 err = alc_auto_add_mic_boost(codec);
10986 if (err < 0)
10987 return err;
10988
10989 return 1; /* config found */
10990 }
10991
10992 /* additional initialization for auto-configuration model */
10993 static void alc882_auto_init(struct hda_codec *codec)
10994 {
10995 struct alc_spec *spec = codec->spec;
10996 alc882_auto_init_multi_out(codec);
10997 alc882_auto_init_hp_out(codec);
10998 alc882_auto_init_analog_input(codec);
10999 alc882_auto_init_input_src(codec);
11000 alc_auto_init_digital(codec);
11001 if (spec->unsol_event)
11002 alc_inithook(codec);
11003 }
11004
11005 static int patch_alc882(struct hda_codec *codec)
11006 {
11007 struct alc_spec *spec;
11008 int err, board_config;
11009
11010 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
11011 if (spec == NULL)
11012 return -ENOMEM;
11013
11014 codec->spec = spec;
11015
11016 switch (codec->vendor_id) {
11017 case 0x10ec0882:
11018 case 0x10ec0885:
11019 break;
11020 default:
11021 /* ALC883 and variants */
11022 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
11023 break;
11024 }
11025
11026 board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
11027 alc882_models,
11028 alc882_cfg_tbl);
11029
11030 if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
11031 board_config = snd_hda_check_board_codec_sid_config(codec,
11032 ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
11033
11034 if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
11035 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
11036 codec->chip_name);
11037 board_config = ALC882_AUTO;
11038 }
11039
11040 if (board_config == ALC882_AUTO) {
11041 alc_pick_fixup(codec, NULL, alc882_fixup_tbl, alc882_fixups);
11042 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
11043 }
11044
11045 alc_auto_parse_customize_define(codec);
11046
11047 if (board_config == ALC882_AUTO) {
11048 /* automatic parse from the BIOS config */
11049 err = alc882_parse_auto_config(codec);
11050 if (err < 0) {
11051 alc_free(codec);
11052 return err;
11053 } else if (!err) {
11054 printk(KERN_INFO
11055 "hda_codec: Cannot set up configuration "
11056 "from BIOS. Using base mode...\n");
11057 board_config = ALC882_3ST_DIG;
11058 }
11059 }
11060
11061 if (has_cdefine_beep(codec)) {
11062 err = snd_hda_attach_beep_device(codec, 0x1);
11063 if (err < 0) {
11064 alc_free(codec);
11065 return err;
11066 }
11067 }
11068
11069 if (board_config != ALC882_AUTO)
11070 setup_preset(codec, &alc882_presets[board_config]);
11071
11072 spec->stream_analog_playback = &alc882_pcm_analog_playback;
11073 spec->stream_analog_capture = &alc882_pcm_analog_capture;
11074 /* FIXME: setup DAC5 */
11075 /*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
11076 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
11077
11078 spec->stream_digital_playback = &alc882_pcm_digital_playback;
11079 spec->stream_digital_capture = &alc882_pcm_digital_capture;
11080
11081 if (!spec->adc_nids && spec->input_mux) {
11082 int i, j;
11083 spec->num_adc_nids = 0;
11084 for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
11085 const struct hda_input_mux *imux = spec->input_mux;
11086 hda_nid_t cap;
11087 hda_nid_t items[16];
11088 hda_nid_t nid = alc882_adc_nids[i];
11089 unsigned int wcap = get_wcaps(codec, nid);
11090 /* get type */
11091 wcap = get_wcaps_type(wcap);
11092 if (wcap != AC_WID_AUD_IN)
11093 continue;
11094 spec->private_adc_nids[spec->num_adc_nids] = nid;
11095 err = snd_hda_get_connections(codec, nid, &cap, 1);
11096 if (err < 0)
11097 continue;
11098 err = snd_hda_get_connections(codec, cap, items,
11099 ARRAY_SIZE(items));
11100 if (err < 0)
11101 continue;
11102 for (j = 0; j < imux->num_items; j++)
11103 if (imux->items[j].index >= err)
11104 break;
11105 if (j < imux->num_items)
11106 continue;
11107 spec->private_capsrc_nids[spec->num_adc_nids] = cap;
11108 spec->num_adc_nids++;
11109 }
11110 spec->adc_nids = spec->private_adc_nids;
11111 spec->capsrc_nids = spec->private_capsrc_nids;
11112 }
11113
11114 set_capture_mixer(codec);
11115
11116 if (has_cdefine_beep(codec))
11117 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
11118
11119 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
11120
11121 spec->vmaster_nid = 0x0c;
11122
11123 codec->patch_ops = alc_patch_ops;
11124 if (board_config == ALC882_AUTO)
11125 spec->init_hook = alc882_auto_init;
11126
11127 alc_init_jacks(codec);
11128 #ifdef CONFIG_SND_HDA_POWER_SAVE
11129 if (!spec->loopback.amplist)
11130 spec->loopback.amplist = alc882_loopbacks;
11131 #endif
11132
11133 return 0;
11134 }
11135
11136
11137 /*
11138 * ALC262 support
11139 */
11140
11141 #define ALC262_DIGOUT_NID ALC880_DIGOUT_NID
11142 #define ALC262_DIGIN_NID ALC880_DIGIN_NID
11143
11144 #define alc262_dac_nids alc260_dac_nids
11145 #define alc262_adc_nids alc882_adc_nids
11146 #define alc262_adc_nids_alt alc882_adc_nids_alt
11147 #define alc262_capsrc_nids alc882_capsrc_nids
11148 #define alc262_capsrc_nids_alt alc882_capsrc_nids_alt
11149
11150 #define alc262_modes alc260_modes
11151 #define alc262_capture_source alc882_capture_source
11152
11153 static hda_nid_t alc262_dmic_adc_nids[1] = {
11154 /* ADC0 */
11155 0x09
11156 };
11157
11158 static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
11159
11160 static struct snd_kcontrol_new alc262_base_mixer[] = {
11161 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11162 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11163 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11164 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11165 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11166 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11167 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11168 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11169 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
11170 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11171 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11172 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
11173 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
11174 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11175 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
11176 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
11177 { } /* end */
11178 };
11179
11180 /* update HP, line and mono-out pins according to the master switch */
11181 static void alc262_hp_master_update(struct hda_codec *codec)
11182 {
11183 struct alc_spec *spec = codec->spec;
11184 int val = spec->master_sw;
11185
11186 /* HP & line-out */
11187 snd_hda_codec_write_cache(codec, 0x1b, 0,
11188 AC_VERB_SET_PIN_WIDGET_CONTROL,
11189 val ? PIN_HP : 0);
11190 snd_hda_codec_write_cache(codec, 0x15, 0,
11191 AC_VERB_SET_PIN_WIDGET_CONTROL,
11192 val ? PIN_HP : 0);
11193 /* mono (speaker) depending on the HP jack sense */
11194 val = val && !spec->jack_present;
11195 snd_hda_codec_write_cache(codec, 0x16, 0,
11196 AC_VERB_SET_PIN_WIDGET_CONTROL,
11197 val ? PIN_OUT : 0);
11198 }
11199
11200 static void alc262_hp_bpc_automute(struct hda_codec *codec)
11201 {
11202 struct alc_spec *spec = codec->spec;
11203
11204 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
11205 alc262_hp_master_update(codec);
11206 }
11207
11208 static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
11209 {
11210 if ((res >> 26) != ALC880_HP_EVENT)
11211 return;
11212 alc262_hp_bpc_automute(codec);
11213 }
11214
11215 static void alc262_hp_wildwest_automute(struct hda_codec *codec)
11216 {
11217 struct alc_spec *spec = codec->spec;
11218
11219 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
11220 alc262_hp_master_update(codec);
11221 }
11222
11223 static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
11224 unsigned int res)
11225 {
11226 if ((res >> 26) != ALC880_HP_EVENT)
11227 return;
11228 alc262_hp_wildwest_automute(codec);
11229 }
11230
11231 #define alc262_hp_master_sw_get alc260_hp_master_sw_get
11232
11233 static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
11234 struct snd_ctl_elem_value *ucontrol)
11235 {
11236 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11237 struct alc_spec *spec = codec->spec;
11238 int val = !!*ucontrol->value.integer.value;
11239
11240 if (val == spec->master_sw)
11241 return 0;
11242 spec->master_sw = val;
11243 alc262_hp_master_update(codec);
11244 return 1;
11245 }
11246
11247 #define ALC262_HP_MASTER_SWITCH \
11248 { \
11249 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
11250 .name = "Master Playback Switch", \
11251 .info = snd_ctl_boolean_mono_info, \
11252 .get = alc262_hp_master_sw_get, \
11253 .put = alc262_hp_master_sw_put, \
11254 }, \
11255 { \
11256 .iface = NID_MAPPING, \
11257 .name = "Master Playback Switch", \
11258 .private_value = 0x15 | (0x16 << 8) | (0x1b << 16), \
11259 }
11260
11261
11262 static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
11263 ALC262_HP_MASTER_SWITCH,
11264 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11265 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11266 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
11267 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
11268 HDA_OUTPUT),
11269 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
11270 HDA_OUTPUT),
11271 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11272 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11273 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
11274 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11275 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11276 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
11277 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11278 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11279 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11280 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11281 HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
11282 HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
11283 { } /* end */
11284 };
11285
11286 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
11287 ALC262_HP_MASTER_SWITCH,
11288 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11289 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
11290 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11291 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11292 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
11293 HDA_OUTPUT),
11294 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
11295 HDA_OUTPUT),
11296 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
11297 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
11298 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x1a, 0, HDA_INPUT),
11299 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
11300 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
11301 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11302 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11303 { } /* end */
11304 };
11305
11306 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
11307 HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11308 HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11309 HDA_CODEC_VOLUME("Rear Mic Boost Volume", 0x18, 0, HDA_INPUT),
11310 { } /* end */
11311 };
11312
11313 /* mute/unmute internal speaker according to the hp jack and mute state */
11314 static void alc262_hp_t5735_setup(struct hda_codec *codec)
11315 {
11316 struct alc_spec *spec = codec->spec;
11317
11318 spec->autocfg.hp_pins[0] = 0x15;
11319 spec->autocfg.speaker_pins[0] = 0x14;
11320 }
11321
11322 static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
11323 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11324 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11325 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11326 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11327 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11328 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11329 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
11330 { } /* end */
11331 };
11332
11333 static struct hda_verb alc262_hp_t5735_verbs[] = {
11334 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11335 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11336
11337 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11338 { }
11339 };
11340
11341 static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
11342 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11343 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
11344 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
11345 HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
11346 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
11347 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
11348 { } /* end */
11349 };
11350
11351 static struct hda_verb alc262_hp_rp5700_verbs[] = {
11352 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11353 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11354 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11355 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11356 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11357 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11358 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11359 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11360 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
11361 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
11362 {}
11363 };
11364
11365 static struct hda_input_mux alc262_hp_rp5700_capture_source = {
11366 .num_items = 1,
11367 .items = {
11368 { "Line", 0x1 },
11369 },
11370 };
11371
11372 /* bind hp and internal speaker mute (with plug check) as master switch */
11373 static void alc262_hippo_master_update(struct hda_codec *codec)
11374 {
11375 struct alc_spec *spec = codec->spec;
11376 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
11377 hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
11378 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
11379 unsigned int mute;
11380
11381 /* HP */
11382 mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
11383 snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
11384 HDA_AMP_MUTE, mute);
11385 /* mute internal speaker per jack sense */
11386 if (spec->jack_present)
11387 mute = HDA_AMP_MUTE;
11388 if (line_nid)
11389 snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
11390 HDA_AMP_MUTE, mute);
11391 if (speaker_nid && speaker_nid != line_nid)
11392 snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
11393 HDA_AMP_MUTE, mute);
11394 }
11395
11396 #define alc262_hippo_master_sw_get alc262_hp_master_sw_get
11397
11398 static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
11399 struct snd_ctl_elem_value *ucontrol)
11400 {
11401 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11402 struct alc_spec *spec = codec->spec;
11403 int val = !!*ucontrol->value.integer.value;
11404
11405 if (val == spec->master_sw)
11406 return 0;
11407 spec->master_sw = val;
11408 alc262_hippo_master_update(codec);
11409 return 1;
11410 }
11411
11412 #define ALC262_HIPPO_MASTER_SWITCH \
11413 { \
11414 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
11415 .name = "Master Playback Switch", \
11416 .info = snd_ctl_boolean_mono_info, \
11417 .get = alc262_hippo_master_sw_get, \
11418 .put = alc262_hippo_master_sw_put, \
11419 }, \
11420 { \
11421 .iface = NID_MAPPING, \
11422 .name = "Master Playback Switch", \
11423 .subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
11424 (SUBDEV_SPEAKER(0) << 16), \
11425 }
11426
11427 static struct snd_kcontrol_new alc262_hippo_mixer[] = {
11428 ALC262_HIPPO_MASTER_SWITCH,
11429 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11430 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11431 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11432 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11433 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11434 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11435 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11436 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
11437 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11438 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11439 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
11440 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11441 { } /* end */
11442 };
11443
11444 static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
11445 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11446 ALC262_HIPPO_MASTER_SWITCH,
11447 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11448 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11449 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11450 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11451 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11452 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11453 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
11454 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11455 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11456 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
11457 { } /* end */
11458 };
11459
11460 /* mute/unmute internal speaker according to the hp jack and mute state */
11461 static void alc262_hippo_automute(struct hda_codec *codec)
11462 {
11463 struct alc_spec *spec = codec->spec;
11464 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
11465
11466 spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
11467 alc262_hippo_master_update(codec);
11468 }
11469
11470 static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
11471 {
11472 if ((res >> 26) != ALC880_HP_EVENT)
11473 return;
11474 alc262_hippo_automute(codec);
11475 }
11476
11477 static void alc262_hippo_setup(struct hda_codec *codec)
11478 {
11479 struct alc_spec *spec = codec->spec;
11480
11481 spec->autocfg.hp_pins[0] = 0x15;
11482 spec->autocfg.speaker_pins[0] = 0x14;
11483 }
11484
11485 static void alc262_hippo1_setup(struct hda_codec *codec)
11486 {
11487 struct alc_spec *spec = codec->spec;
11488
11489 spec->autocfg.hp_pins[0] = 0x1b;
11490 spec->autocfg.speaker_pins[0] = 0x14;
11491 }
11492
11493
11494 static struct snd_kcontrol_new alc262_sony_mixer[] = {
11495 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11496 ALC262_HIPPO_MASTER_SWITCH,
11497 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11498 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11499 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11500 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11501 { } /* end */
11502 };
11503
11504 static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
11505 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11506 ALC262_HIPPO_MASTER_SWITCH,
11507 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11508 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11509 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11510 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11511 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11512 { } /* end */
11513 };
11514
11515 static struct snd_kcontrol_new alc262_tyan_mixer[] = {
11516 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11517 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11518 HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
11519 HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
11520 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11521 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11522 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11523 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11524 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
11525 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11526 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11527 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
11528 { } /* end */
11529 };
11530
11531 static struct hda_verb alc262_tyan_verbs[] = {
11532 /* Headphone automute */
11533 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11534 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11535 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11536
11537 /* P11 AUX_IN, white 4-pin connector */
11538 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11539 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
11540 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
11541 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
11542
11543 {}
11544 };
11545
11546 /* unsolicited event for HP jack sensing */
11547 static void alc262_tyan_setup(struct hda_codec *codec)
11548 {
11549 struct alc_spec *spec = codec->spec;
11550
11551 spec->autocfg.hp_pins[0] = 0x1b;
11552 spec->autocfg.speaker_pins[0] = 0x15;
11553 }
11554
11555
11556 #define alc262_capture_mixer alc882_capture_mixer
11557 #define alc262_capture_alt_mixer alc882_capture_alt_mixer
11558
11559 /*
11560 * generic initialization of ADC, input mixers and output mixers
11561 */
11562 static struct hda_verb alc262_init_verbs[] = {
11563 /*
11564 * Unmute ADC0-2 and set the default input to mic-in
11565 */
11566 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11567 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11568 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11569 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11570 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11571 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11572
11573 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11574 * mixer widget
11575 * Note: PASD motherboards uses the Line In 2 as the input for
11576 * front panel mic (mic 2)
11577 */
11578 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11579 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11580 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11581 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11582 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11583 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11584
11585 /*
11586 * Set up output mixers (0x0c - 0x0e)
11587 */
11588 /* set vol=0 to output mixers */
11589 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11590 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11591 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11592 /* set up input amps for analog loopback */
11593 /* Amp Indices: DAC = 0, mixer = 1 */
11594 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11595 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11596 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11597 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11598 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11599 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11600
11601 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11602 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11603 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11604 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11605 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11606 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11607
11608 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11609 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11610 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11611 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11612 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11613
11614 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11615 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11616
11617 /* FIXME: use matrix-type input source selection */
11618 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11619 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11620 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11621 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11622 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11623 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11624 /* Input mixer2 */
11625 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11626 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11627 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11628 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11629 /* Input mixer3 */
11630 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11631 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11632 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11633 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11634
11635 { }
11636 };
11637
11638 static struct hda_verb alc262_eapd_verbs[] = {
11639 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
11640 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
11641 { }
11642 };
11643
11644 static struct hda_verb alc262_hippo1_unsol_verbs[] = {
11645 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11646 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11647 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11648
11649 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11650 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11651 {}
11652 };
11653
11654 static struct hda_verb alc262_sony_unsol_verbs[] = {
11655 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11656 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11657 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, // Front Mic
11658
11659 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11660 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11661 {}
11662 };
11663
11664 static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
11665 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11666 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11667 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11668 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11669 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11670 { } /* end */
11671 };
11672
11673 static struct hda_verb alc262_toshiba_s06_verbs[] = {
11674 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11675 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11676 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11677 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11678 {0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
11679 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11680 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
11681 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11682 {}
11683 };
11684
11685 static void alc262_toshiba_s06_setup(struct hda_codec *codec)
11686 {
11687 struct alc_spec *spec = codec->spec;
11688
11689 spec->autocfg.hp_pins[0] = 0x15;
11690 spec->autocfg.speaker_pins[0] = 0x14;
11691 spec->ext_mic.pin = 0x18;
11692 spec->ext_mic.mux_idx = 0;
11693 spec->int_mic.pin = 0x12;
11694 spec->int_mic.mux_idx = 9;
11695 spec->auto_mic = 1;
11696 }
11697
11698 /*
11699 * nec model
11700 * 0x15 = headphone
11701 * 0x16 = internal speaker
11702 * 0x18 = external mic
11703 */
11704
11705 static struct snd_kcontrol_new alc262_nec_mixer[] = {
11706 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
11707 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
11708
11709 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11710 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11711 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
11712
11713 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11714 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11715 { } /* end */
11716 };
11717
11718 static struct hda_verb alc262_nec_verbs[] = {
11719 /* Unmute Speaker */
11720 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11721
11722 /* Headphone */
11723 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11724 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11725
11726 /* External mic to headphone */
11727 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11728 /* External mic to speaker */
11729 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11730 {}
11731 };
11732
11733 /*
11734 * fujitsu model
11735 * 0x14 = headphone/spdif-out, 0x15 = internal speaker,
11736 * 0x1b = port replicator headphone out
11737 */
11738
11739 #define ALC_HP_EVENT 0x37
11740
11741 static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
11742 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11743 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11744 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11745 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11746 {}
11747 };
11748
11749 static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
11750 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11751 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11752 {}
11753 };
11754
11755 static struct hda_verb alc262_lenovo_3000_init_verbs[] = {
11756 /* Front Mic pin: input vref at 50% */
11757 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
11758 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11759 {}
11760 };
11761
11762 static struct hda_input_mux alc262_fujitsu_capture_source = {
11763 .num_items = 3,
11764 .items = {
11765 { "Mic", 0x0 },
11766 { "Internal Mic", 0x1 },
11767 { "CD", 0x4 },
11768 },
11769 };
11770
11771 static struct hda_input_mux alc262_HP_capture_source = {
11772 .num_items = 5,
11773 .items = {
11774 { "Mic", 0x0 },
11775 { "Front Mic", 0x1 },
11776 { "Line", 0x2 },
11777 { "CD", 0x4 },
11778 { "AUX IN", 0x6 },
11779 },
11780 };
11781
11782 static struct hda_input_mux alc262_HP_D7000_capture_source = {
11783 .num_items = 4,
11784 .items = {
11785 { "Mic", 0x0 },
11786 { "Front Mic", 0x2 },
11787 { "Line", 0x1 },
11788 { "CD", 0x4 },
11789 },
11790 };
11791
11792 /* mute/unmute internal speaker according to the hp jacks and mute state */
11793 static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
11794 {
11795 struct alc_spec *spec = codec->spec;
11796 unsigned int mute;
11797
11798 if (force || !spec->sense_updated) {
11799 spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
11800 snd_hda_jack_detect(codec, 0x1b);
11801 spec->sense_updated = 1;
11802 }
11803 /* unmute internal speaker only if both HPs are unplugged and
11804 * master switch is on
11805 */
11806 if (spec->jack_present)
11807 mute = HDA_AMP_MUTE;
11808 else
11809 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
11810 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11811 HDA_AMP_MUTE, mute);
11812 }
11813
11814 /* unsolicited event for HP jack sensing */
11815 static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
11816 unsigned int res)
11817 {
11818 if ((res >> 26) != ALC_HP_EVENT)
11819 return;
11820 alc262_fujitsu_automute(codec, 1);
11821 }
11822
11823 static void alc262_fujitsu_init_hook(struct hda_codec *codec)
11824 {
11825 alc262_fujitsu_automute(codec, 1);
11826 }
11827
11828 /* bind volumes of both NID 0x0c and 0x0d */
11829 static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
11830 .ops = &snd_hda_bind_vol,
11831 .values = {
11832 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
11833 HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
11834 0
11835 },
11836 };
11837
11838 /* mute/unmute internal speaker according to the hp jack and mute state */
11839 static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
11840 {
11841 struct alc_spec *spec = codec->spec;
11842 unsigned int mute;
11843
11844 if (force || !spec->sense_updated) {
11845 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
11846 spec->sense_updated = 1;
11847 }
11848 if (spec->jack_present) {
11849 /* mute internal speaker */
11850 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11851 HDA_AMP_MUTE, HDA_AMP_MUTE);
11852 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11853 HDA_AMP_MUTE, HDA_AMP_MUTE);
11854 } else {
11855 /* unmute internal speaker if necessary */
11856 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
11857 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11858 HDA_AMP_MUTE, mute);
11859 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11860 HDA_AMP_MUTE, mute);
11861 }
11862 }
11863
11864 /* unsolicited event for HP jack sensing */
11865 static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
11866 unsigned int res)
11867 {
11868 if ((res >> 26) != ALC_HP_EVENT)
11869 return;
11870 alc262_lenovo_3000_automute(codec, 1);
11871 }
11872
11873 static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
11874 int dir, int idx, long *valp)
11875 {
11876 int i, change = 0;
11877
11878 for (i = 0; i < 2; i++, valp++)
11879 change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
11880 HDA_AMP_MUTE,
11881 *valp ? 0 : HDA_AMP_MUTE);
11882 return change;
11883 }
11884
11885 /* bind hp and internal speaker mute (with plug check) */
11886 static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
11887 struct snd_ctl_elem_value *ucontrol)
11888 {
11889 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11890 long *valp = ucontrol->value.integer.value;
11891 int change;
11892
11893 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11894 change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11895 if (change)
11896 alc262_fujitsu_automute(codec, 0);
11897 return change;
11898 }
11899
11900 static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
11901 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11902 {
11903 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11904 .name = "Master Playback Switch",
11905 .subdevice = HDA_SUBDEV_AMP_FLAG,
11906 .info = snd_hda_mixer_amp_switch_info,
11907 .get = snd_hda_mixer_amp_switch_get,
11908 .put = alc262_fujitsu_master_sw_put,
11909 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11910 },
11911 {
11912 .iface = NID_MAPPING,
11913 .name = "Master Playback Switch",
11914 .private_value = 0x1b,
11915 },
11916 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11917 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11918 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
11919 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11920 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11921 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
11922 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11923 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11924 { } /* end */
11925 };
11926
11927 /* bind hp and internal speaker mute (with plug check) */
11928 static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
11929 struct snd_ctl_elem_value *ucontrol)
11930 {
11931 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11932 long *valp = ucontrol->value.integer.value;
11933 int change;
11934
11935 change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11936 if (change)
11937 alc262_lenovo_3000_automute(codec, 0);
11938 return change;
11939 }
11940
11941 static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
11942 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11943 {
11944 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11945 .name = "Master Playback Switch",
11946 .subdevice = HDA_SUBDEV_AMP_FLAG,
11947 .info = snd_hda_mixer_amp_switch_info,
11948 .get = snd_hda_mixer_amp_switch_get,
11949 .put = alc262_lenovo_3000_master_sw_put,
11950 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
11951 },
11952 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11953 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11954 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
11955 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11956 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11957 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
11958 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11959 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11960 { } /* end */
11961 };
11962
11963 static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
11964 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11965 ALC262_HIPPO_MASTER_SWITCH,
11966 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11967 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11968 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
11969 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11970 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11971 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
11972 { } /* end */
11973 };
11974
11975 /* additional init verbs for Benq laptops */
11976 static struct hda_verb alc262_EAPD_verbs[] = {
11977 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11978 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
11979 {}
11980 };
11981
11982 static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
11983 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11984 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11985
11986 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11987 {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
11988 {}
11989 };
11990
11991 /* Samsung Q1 Ultra Vista model setup */
11992 static struct snd_kcontrol_new alc262_ultra_mixer[] = {
11993 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11994 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11995 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11996 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11997 HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0, HDA_INPUT),
11998 HDA_CODEC_VOLUME("Headphone Mic Boost Volume", 0x15, 0, HDA_INPUT),
11999 { } /* end */
12000 };
12001
12002 static struct hda_verb alc262_ultra_verbs[] = {
12003 /* output mixer */
12004 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
12005 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12006 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12007 /* speaker */
12008 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
12009 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12010 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12011 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
12012 /* HP */
12013 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12014 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12015 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12016 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
12017 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
12018 /* internal mic */
12019 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12020 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12021 /* ADC, choose mic */
12022 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
12023 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
12024 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12025 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
12026 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
12027 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
12028 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
12029 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
12030 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
12031 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
12032 {}
12033 };
12034
12035 /* mute/unmute internal speaker according to the hp jack and mute state */
12036 static void alc262_ultra_automute(struct hda_codec *codec)
12037 {
12038 struct alc_spec *spec = codec->spec;
12039 unsigned int mute;
12040
12041 mute = 0;
12042 /* auto-mute only when HP is used as HP */
12043 if (!spec->cur_mux[0]) {
12044 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
12045 if (spec->jack_present)
12046 mute = HDA_AMP_MUTE;
12047 }
12048 /* mute/unmute internal speaker */
12049 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
12050 HDA_AMP_MUTE, mute);
12051 /* mute/unmute HP */
12052 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
12053 HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
12054 }
12055
12056 /* unsolicited event for HP jack sensing */
12057 static void alc262_ultra_unsol_event(struct hda_codec *codec,
12058 unsigned int res)
12059 {
12060 if ((res >> 26) != ALC880_HP_EVENT)
12061 return;
12062 alc262_ultra_automute(codec);
12063 }
12064
12065 static struct hda_input_mux alc262_ultra_capture_source = {
12066 .num_items = 2,
12067 .items = {
12068 { "Mic", 0x1 },
12069 { "Headphone", 0x7 },
12070 },
12071 };
12072
12073 static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
12074 struct snd_ctl_elem_value *ucontrol)
12075 {
12076 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
12077 struct alc_spec *spec = codec->spec;
12078 int ret;
12079
12080 ret = alc_mux_enum_put(kcontrol, ucontrol);
12081 if (!ret)
12082 return 0;
12083 /* reprogram the HP pin as mic or HP according to the input source */
12084 snd_hda_codec_write_cache(codec, 0x15, 0,
12085 AC_VERB_SET_PIN_WIDGET_CONTROL,
12086 spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
12087 alc262_ultra_automute(codec); /* mute/unmute HP */
12088 return ret;
12089 }
12090
12091 static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
12092 HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
12093 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
12094 {
12095 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12096 .name = "Capture Source",
12097 .info = alc_mux_enum_info,
12098 .get = alc_mux_enum_get,
12099 .put = alc262_ultra_mux_enum_put,
12100 },
12101 {
12102 .iface = NID_MAPPING,
12103 .name = "Capture Source",
12104 .private_value = 0x15,
12105 },
12106 { } /* end */
12107 };
12108
12109 /* We use two mixers depending on the output pin; 0x16 is a mono output
12110 * and thus it's bound with a different mixer.
12111 * This function returns which mixer amp should be used.
12112 */
12113 static int alc262_check_volbit(hda_nid_t nid)
12114 {
12115 if (!nid)
12116 return 0;
12117 else if (nid == 0x16)
12118 return 2;
12119 else
12120 return 1;
12121 }
12122
12123 static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
12124 const char *pfx, int *vbits, int idx)
12125 {
12126 unsigned long val;
12127 int vbit;
12128
12129 vbit = alc262_check_volbit(nid);
12130 if (!vbit)
12131 return 0;
12132 if (*vbits & vbit) /* a volume control for this mixer already there */
12133 return 0;
12134 *vbits |= vbit;
12135 if (vbit == 2)
12136 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
12137 else
12138 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
12139 return __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, idx, val);
12140 }
12141
12142 static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
12143 const char *pfx, int idx)
12144 {
12145 unsigned long val;
12146
12147 if (!nid)
12148 return 0;
12149 if (nid == 0x16)
12150 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
12151 else
12152 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
12153 return __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, idx, val);
12154 }
12155
12156 /* add playback controls from the parsed DAC table */
12157 static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
12158 const struct auto_pin_cfg *cfg)
12159 {
12160 const char *pfx;
12161 int vbits;
12162 int i, err;
12163
12164 spec->multiout.num_dacs = 1; /* only use one dac */
12165 spec->multiout.dac_nids = spec->private_dac_nids;
12166 spec->multiout.dac_nids[0] = 2;
12167
12168 pfx = alc_get_line_out_pfx(cfg, true);
12169 if (!pfx)
12170 pfx = "Front";
12171 for (i = 0; i < 2; i++) {
12172 err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[i], pfx, i);
12173 if (err < 0)
12174 return err;
12175 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
12176 err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[i],
12177 "Speaker", i);
12178 if (err < 0)
12179 return err;
12180 }
12181 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
12182 err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[i],
12183 "Headphone", i);
12184 if (err < 0)
12185 return err;
12186 }
12187 }
12188
12189 vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
12190 alc262_check_volbit(cfg->speaker_pins[0]) |
12191 alc262_check_volbit(cfg->hp_pins[0]);
12192 if (vbits == 1 || vbits == 2)
12193 pfx = "Master"; /* only one mixer is used */
12194 vbits = 0;
12195 for (i = 0; i < 2; i++) {
12196 err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[i], pfx,
12197 &vbits, i);
12198 if (err < 0)
12199 return err;
12200 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
12201 err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[i],
12202 "Speaker", &vbits, i);
12203 if (err < 0)
12204 return err;
12205 }
12206 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
12207 err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[i],
12208 "Headphone", &vbits, i);
12209 if (err < 0)
12210 return err;
12211 }
12212 }
12213 return 0;
12214 }
12215
12216 #define alc262_auto_create_input_ctls \
12217 alc882_auto_create_input_ctls
12218
12219 /*
12220 * generic initialization of ADC, input mixers and output mixers
12221 */
12222 static struct hda_verb alc262_volume_init_verbs[] = {
12223 /*
12224 * Unmute ADC0-2 and set the default input to mic-in
12225 */
12226 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
12227 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12228 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
12229 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12230 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
12231 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12232
12233 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
12234 * mixer widget
12235 * Note: PASD motherboards uses the Line In 2 as the input for
12236 * front panel mic (mic 2)
12237 */
12238 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
12239 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
12240 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12241 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
12242 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
12243 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
12244
12245 /*
12246 * Set up output mixers (0x0c - 0x0f)
12247 */
12248 /* set vol=0 to output mixers */
12249 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12250 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12251 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12252
12253 /* set up input amps for analog loopback */
12254 /* Amp Indices: DAC = 0, mixer = 1 */
12255 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12256 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12257 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12258 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12259 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12260 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12261
12262 /* FIXME: use matrix-type input source selection */
12263 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
12264 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
12265 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12266 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
12267 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
12268 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
12269 /* Input mixer2 */
12270 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12271 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
12272 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
12273 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
12274 /* Input mixer3 */
12275 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12276 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
12277 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
12278 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
12279
12280 { }
12281 };
12282
12283 static struct hda_verb alc262_HP_BPC_init_verbs[] = {
12284 /*
12285 * Unmute ADC0-2 and set the default input to mic-in
12286 */
12287 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
12288 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12289 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
12290 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12291 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
12292 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12293
12294 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
12295 * mixer widget
12296 * Note: PASD motherboards uses the Line In 2 as the input for
12297 * front panel mic (mic 2)
12298 */
12299 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
12300 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
12301 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12302 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
12303 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
12304 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
12305 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
12306 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
12307
12308 /*
12309 * Set up output mixers (0x0c - 0x0e)
12310 */
12311 /* set vol=0 to output mixers */
12312 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12313 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12314 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12315
12316 /* set up input amps for analog loopback */
12317 /* Amp Indices: DAC = 0, mixer = 1 */
12318 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12319 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12320 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12321 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12322 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12323 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12324
12325 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12326 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
12327 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
12328
12329 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12330 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12331
12332 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
12333 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
12334
12335 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12336 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12337 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12338 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12339 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12340
12341 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12342 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12343 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12344 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12345 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12346 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12347
12348
12349 /* FIXME: use matrix-type input source selection */
12350 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
12351 /* Input mixer1: only unmute Mic */
12352 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12353 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
12354 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
12355 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
12356 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
12357 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
12358 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
12359 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
12360 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
12361 /* Input mixer2 */
12362 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12363 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
12364 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
12365 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
12366 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
12367 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
12368 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
12369 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
12370 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
12371 /* Input mixer3 */
12372 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12373 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
12374 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
12375 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
12376 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
12377 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
12378 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
12379 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
12380 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
12381
12382 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12383
12384 { }
12385 };
12386
12387 static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
12388 /*
12389 * Unmute ADC0-2 and set the default input to mic-in
12390 */
12391 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
12392 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12393 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
12394 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12395 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
12396 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12397
12398 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
12399 * mixer widget
12400 * Note: PASD motherboards uses the Line In 2 as the input for front
12401 * panel mic (mic 2)
12402 */
12403 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
12404 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
12405 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12406 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
12407 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
12408 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
12409 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
12410 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
12411 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
12412 /*
12413 * Set up output mixers (0x0c - 0x0e)
12414 */
12415 /* set vol=0 to output mixers */
12416 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12417 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12418 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12419
12420 /* set up input amps for analog loopback */
12421 /* Amp Indices: DAC = 0, mixer = 1 */
12422 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12423 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12424 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12425 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12426 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12427 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12428
12429
12430 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP */
12431 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Mono */
12432 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* rear MIC */
12433 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* Line in */
12434 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
12435 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Line out */
12436 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD in */
12437
12438 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12439 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12440
12441 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
12442 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
12443
12444 /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
12445 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12446 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12447 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
12448 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12449 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12450
12451 /* FIXME: use matrix-type input source selection */
12452 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
12453 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
12454 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
12455 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
12456 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
12457 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
12458 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
12459 /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
12460 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
12461 /* Input mixer2 */
12462 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12463 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
12464 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
12465 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
12466 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
12467 /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
12468 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
12469 /* Input mixer3 */
12470 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12471 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
12472 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
12473 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
12474 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
12475 /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
12476 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
12477
12478 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12479
12480 { }
12481 };
12482
12483 static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
12484
12485 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Front Speaker */
12486 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12487 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
12488
12489 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* MIC jack */
12490 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
12491 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
12492 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
12493
12494 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP jack */
12495 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
12496 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
12497 {}
12498 };
12499
12500 /*
12501 * Pin config fixes
12502 */
12503 enum {
12504 PINFIX_FSC_H270,
12505 };
12506
12507 static const struct alc_fixup alc262_fixups[] = {
12508 [PINFIX_FSC_H270] = {
12509 .type = ALC_FIXUP_PINS,
12510 .v.pins = (const struct alc_pincfg[]) {
12511 { 0x14, 0x99130110 }, /* speaker */
12512 { 0x15, 0x0221142f }, /* front HP */
12513 { 0x1b, 0x0121141f }, /* rear HP */
12514 { }
12515 }
12516 },
12517 };
12518
12519 static struct snd_pci_quirk alc262_fixup_tbl[] = {
12520 SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", PINFIX_FSC_H270),
12521 {}
12522 };
12523
12524
12525 #ifdef CONFIG_SND_HDA_POWER_SAVE
12526 #define alc262_loopbacks alc880_loopbacks
12527 #endif
12528
12529 /* pcm configuration: identical with ALC880 */
12530 #define alc262_pcm_analog_playback alc880_pcm_analog_playback
12531 #define alc262_pcm_analog_capture alc880_pcm_analog_capture
12532 #define alc262_pcm_digital_playback alc880_pcm_digital_playback
12533 #define alc262_pcm_digital_capture alc880_pcm_digital_capture
12534
12535 /*
12536 * BIOS auto configuration
12537 */
12538 static int alc262_parse_auto_config(struct hda_codec *codec)
12539 {
12540 struct alc_spec *spec = codec->spec;
12541 int err;
12542 static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
12543
12544 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12545 alc262_ignore);
12546 if (err < 0)
12547 return err;
12548 if (!spec->autocfg.line_outs) {
12549 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
12550 spec->multiout.max_channels = 2;
12551 spec->no_analog = 1;
12552 goto dig_only;
12553 }
12554 return 0; /* can't find valid BIOS pin config */
12555 }
12556 err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
12557 if (err < 0)
12558 return err;
12559 err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
12560 if (err < 0)
12561 return err;
12562
12563 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
12564
12565 dig_only:
12566 alc_auto_parse_digital(codec);
12567
12568 if (spec->kctls.list)
12569 add_mixer(spec, spec->kctls.list);
12570
12571 add_verb(spec, alc262_volume_init_verbs);
12572 spec->num_mux_defs = 1;
12573 spec->input_mux = &spec->private_imux[0];
12574
12575 err = alc_auto_add_mic_boost(codec);
12576 if (err < 0)
12577 return err;
12578
12579 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
12580
12581 return 1;
12582 }
12583
12584 #define alc262_auto_init_multi_out alc882_auto_init_multi_out
12585 #define alc262_auto_init_hp_out alc882_auto_init_hp_out
12586 #define alc262_auto_init_analog_input alc882_auto_init_analog_input
12587 #define alc262_auto_init_input_src alc882_auto_init_input_src
12588
12589
12590 /* init callback for auto-configuration model -- overriding the default init */
12591 static void alc262_auto_init(struct hda_codec *codec)
12592 {
12593 struct alc_spec *spec = codec->spec;
12594 alc262_auto_init_multi_out(codec);
12595 alc262_auto_init_hp_out(codec);
12596 alc262_auto_init_analog_input(codec);
12597 alc262_auto_init_input_src(codec);
12598 alc_auto_init_digital(codec);
12599 if (spec->unsol_event)
12600 alc_inithook(codec);
12601 }
12602
12603 /*
12604 * configuration and preset
12605 */
12606 static const char * const alc262_models[ALC262_MODEL_LAST] = {
12607 [ALC262_BASIC] = "basic",
12608 [ALC262_HIPPO] = "hippo",
12609 [ALC262_HIPPO_1] = "hippo_1",
12610 [ALC262_FUJITSU] = "fujitsu",
12611 [ALC262_HP_BPC] = "hp-bpc",
12612 [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
12613 [ALC262_HP_TC_T5735] = "hp-tc-t5735",
12614 [ALC262_HP_RP5700] = "hp-rp5700",
12615 [ALC262_BENQ_ED8] = "benq",
12616 [ALC262_BENQ_T31] = "benq-t31",
12617 [ALC262_SONY_ASSAMD] = "sony-assamd",
12618 [ALC262_TOSHIBA_S06] = "toshiba-s06",
12619 [ALC262_TOSHIBA_RX1] = "toshiba-rx1",
12620 [ALC262_ULTRA] = "ultra",
12621 [ALC262_LENOVO_3000] = "lenovo-3000",
12622 [ALC262_NEC] = "nec",
12623 [ALC262_TYAN] = "tyan",
12624 [ALC262_AUTO] = "auto",
12625 };
12626
12627 static struct snd_pci_quirk alc262_cfg_tbl[] = {
12628 SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
12629 SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
12630 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
12631 ALC262_HP_BPC),
12632 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
12633 ALC262_HP_BPC),
12634 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1500, "HP z series",
12635 ALC262_HP_BPC),
12636 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
12637 ALC262_HP_BPC),
12638 SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
12639 SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
12640 SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
12641 SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
12642 SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
12643 SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
12644 SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
12645 SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
12646 SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
12647 SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
12648 SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
12649 SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
12650 ALC262_HP_TC_T5735),
12651 SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
12652 SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
12653 SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
12654 SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
12655 SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
12656 SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
12657 SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
12658 SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
12659 #if 0 /* disable the quirk since model=auto works better in recent versions */
12660 SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
12661 ALC262_SONY_ASSAMD),
12662 #endif
12663 SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
12664 ALC262_TOSHIBA_RX1),
12665 SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
12666 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
12667 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
12668 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
12669 SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
12670 ALC262_ULTRA),
12671 SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
12672 SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
12673 SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
12674 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
12675 SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
12676 {}
12677 };
12678
12679 static struct alc_config_preset alc262_presets[] = {
12680 [ALC262_BASIC] = {
12681 .mixers = { alc262_base_mixer },
12682 .init_verbs = { alc262_init_verbs },
12683 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12684 .dac_nids = alc262_dac_nids,
12685 .hp_nid = 0x03,
12686 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12687 .channel_mode = alc262_modes,
12688 .input_mux = &alc262_capture_source,
12689 },
12690 [ALC262_HIPPO] = {
12691 .mixers = { alc262_hippo_mixer },
12692 .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
12693 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12694 .dac_nids = alc262_dac_nids,
12695 .hp_nid = 0x03,
12696 .dig_out_nid = ALC262_DIGOUT_NID,
12697 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12698 .channel_mode = alc262_modes,
12699 .input_mux = &alc262_capture_source,
12700 .unsol_event = alc262_hippo_unsol_event,
12701 .setup = alc262_hippo_setup,
12702 .init_hook = alc262_hippo_automute,
12703 },
12704 [ALC262_HIPPO_1] = {
12705 .mixers = { alc262_hippo1_mixer },
12706 .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
12707 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12708 .dac_nids = alc262_dac_nids,
12709 .hp_nid = 0x02,
12710 .dig_out_nid = ALC262_DIGOUT_NID,
12711 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12712 .channel_mode = alc262_modes,
12713 .input_mux = &alc262_capture_source,
12714 .unsol_event = alc262_hippo_unsol_event,
12715 .setup = alc262_hippo1_setup,
12716 .init_hook = alc262_hippo_automute,
12717 },
12718 [ALC262_FUJITSU] = {
12719 .mixers = { alc262_fujitsu_mixer },
12720 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12721 alc262_fujitsu_unsol_verbs },
12722 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12723 .dac_nids = alc262_dac_nids,
12724 .hp_nid = 0x03,
12725 .dig_out_nid = ALC262_DIGOUT_NID,
12726 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12727 .channel_mode = alc262_modes,
12728 .input_mux = &alc262_fujitsu_capture_source,
12729 .unsol_event = alc262_fujitsu_unsol_event,
12730 .init_hook = alc262_fujitsu_init_hook,
12731 },
12732 [ALC262_HP_BPC] = {
12733 .mixers = { alc262_HP_BPC_mixer },
12734 .init_verbs = { alc262_HP_BPC_init_verbs },
12735 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12736 .dac_nids = alc262_dac_nids,
12737 .hp_nid = 0x03,
12738 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12739 .channel_mode = alc262_modes,
12740 .input_mux = &alc262_HP_capture_source,
12741 .unsol_event = alc262_hp_bpc_unsol_event,
12742 .init_hook = alc262_hp_bpc_automute,
12743 },
12744 [ALC262_HP_BPC_D7000_WF] = {
12745 .mixers = { alc262_HP_BPC_WildWest_mixer },
12746 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12747 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12748 .dac_nids = alc262_dac_nids,
12749 .hp_nid = 0x03,
12750 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12751 .channel_mode = alc262_modes,
12752 .input_mux = &alc262_HP_D7000_capture_source,
12753 .unsol_event = alc262_hp_wildwest_unsol_event,
12754 .init_hook = alc262_hp_wildwest_automute,
12755 },
12756 [ALC262_HP_BPC_D7000_WL] = {
12757 .mixers = { alc262_HP_BPC_WildWest_mixer,
12758 alc262_HP_BPC_WildWest_option_mixer },
12759 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12760 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12761 .dac_nids = alc262_dac_nids,
12762 .hp_nid = 0x03,
12763 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12764 .channel_mode = alc262_modes,
12765 .input_mux = &alc262_HP_D7000_capture_source,
12766 .unsol_event = alc262_hp_wildwest_unsol_event,
12767 .init_hook = alc262_hp_wildwest_automute,
12768 },
12769 [ALC262_HP_TC_T5735] = {
12770 .mixers = { alc262_hp_t5735_mixer },
12771 .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
12772 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12773 .dac_nids = alc262_dac_nids,
12774 .hp_nid = 0x03,
12775 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12776 .channel_mode = alc262_modes,
12777 .input_mux = &alc262_capture_source,
12778 .unsol_event = alc_sku_unsol_event,
12779 .setup = alc262_hp_t5735_setup,
12780 .init_hook = alc_inithook,
12781 },
12782 [ALC262_HP_RP5700] = {
12783 .mixers = { alc262_hp_rp5700_mixer },
12784 .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
12785 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12786 .dac_nids = alc262_dac_nids,
12787 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12788 .channel_mode = alc262_modes,
12789 .input_mux = &alc262_hp_rp5700_capture_source,
12790 },
12791 [ALC262_BENQ_ED8] = {
12792 .mixers = { alc262_base_mixer },
12793 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
12794 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12795 .dac_nids = alc262_dac_nids,
12796 .hp_nid = 0x03,
12797 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12798 .channel_mode = alc262_modes,
12799 .input_mux = &alc262_capture_source,
12800 },
12801 [ALC262_SONY_ASSAMD] = {
12802 .mixers = { alc262_sony_mixer },
12803 .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
12804 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12805 .dac_nids = alc262_dac_nids,
12806 .hp_nid = 0x02,
12807 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12808 .channel_mode = alc262_modes,
12809 .input_mux = &alc262_capture_source,
12810 .unsol_event = alc262_hippo_unsol_event,
12811 .setup = alc262_hippo_setup,
12812 .init_hook = alc262_hippo_automute,
12813 },
12814 [ALC262_BENQ_T31] = {
12815 .mixers = { alc262_benq_t31_mixer },
12816 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
12817 alc_hp15_unsol_verbs },
12818 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12819 .dac_nids = alc262_dac_nids,
12820 .hp_nid = 0x03,
12821 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12822 .channel_mode = alc262_modes,
12823 .input_mux = &alc262_capture_source,
12824 .unsol_event = alc262_hippo_unsol_event,
12825 .setup = alc262_hippo_setup,
12826 .init_hook = alc262_hippo_automute,
12827 },
12828 [ALC262_ULTRA] = {
12829 .mixers = { alc262_ultra_mixer },
12830 .cap_mixer = alc262_ultra_capture_mixer,
12831 .init_verbs = { alc262_ultra_verbs },
12832 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12833 .dac_nids = alc262_dac_nids,
12834 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12835 .channel_mode = alc262_modes,
12836 .input_mux = &alc262_ultra_capture_source,
12837 .adc_nids = alc262_adc_nids, /* ADC0 */
12838 .capsrc_nids = alc262_capsrc_nids,
12839 .num_adc_nids = 1, /* single ADC */
12840 .unsol_event = alc262_ultra_unsol_event,
12841 .init_hook = alc262_ultra_automute,
12842 },
12843 [ALC262_LENOVO_3000] = {
12844 .mixers = { alc262_lenovo_3000_mixer },
12845 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12846 alc262_lenovo_3000_unsol_verbs,
12847 alc262_lenovo_3000_init_verbs },
12848 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12849 .dac_nids = alc262_dac_nids,
12850 .hp_nid = 0x03,
12851 .dig_out_nid = ALC262_DIGOUT_NID,
12852 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12853 .channel_mode = alc262_modes,
12854 .input_mux = &alc262_fujitsu_capture_source,
12855 .unsol_event = alc262_lenovo_3000_unsol_event,
12856 },
12857 [ALC262_NEC] = {
12858 .mixers = { alc262_nec_mixer },
12859 .init_verbs = { alc262_nec_verbs },
12860 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12861 .dac_nids = alc262_dac_nids,
12862 .hp_nid = 0x03,
12863 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12864 .channel_mode = alc262_modes,
12865 .input_mux = &alc262_capture_source,
12866 },
12867 [ALC262_TOSHIBA_S06] = {
12868 .mixers = { alc262_toshiba_s06_mixer },
12869 .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
12870 alc262_eapd_verbs },
12871 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12872 .capsrc_nids = alc262_dmic_capsrc_nids,
12873 .dac_nids = alc262_dac_nids,
12874 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
12875 .num_adc_nids = 1, /* single ADC */
12876 .dig_out_nid = ALC262_DIGOUT_NID,
12877 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12878 .channel_mode = alc262_modes,
12879 .unsol_event = alc_sku_unsol_event,
12880 .setup = alc262_toshiba_s06_setup,
12881 .init_hook = alc_inithook,
12882 },
12883 [ALC262_TOSHIBA_RX1] = {
12884 .mixers = { alc262_toshiba_rx1_mixer },
12885 .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
12886 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12887 .dac_nids = alc262_dac_nids,
12888 .hp_nid = 0x03,
12889 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12890 .channel_mode = alc262_modes,
12891 .input_mux = &alc262_capture_source,
12892 .unsol_event = alc262_hippo_unsol_event,
12893 .setup = alc262_hippo_setup,
12894 .init_hook = alc262_hippo_automute,
12895 },
12896 [ALC262_TYAN] = {
12897 .mixers = { alc262_tyan_mixer },
12898 .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
12899 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12900 .dac_nids = alc262_dac_nids,
12901 .hp_nid = 0x02,
12902 .dig_out_nid = ALC262_DIGOUT_NID,
12903 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12904 .channel_mode = alc262_modes,
12905 .input_mux = &alc262_capture_source,
12906 .unsol_event = alc_automute_amp_unsol_event,
12907 .setup = alc262_tyan_setup,
12908 .init_hook = alc_automute_amp,
12909 },
12910 };
12911
12912 static int patch_alc262(struct hda_codec *codec)
12913 {
12914 struct alc_spec *spec;
12915 int board_config;
12916 int err;
12917
12918 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
12919 if (spec == NULL)
12920 return -ENOMEM;
12921
12922 codec->spec = spec;
12923 #if 0
12924 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is
12925 * under-run
12926 */
12927 {
12928 int tmp;
12929 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12930 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
12931 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12932 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
12933 }
12934 #endif
12935 alc_auto_parse_customize_define(codec);
12936
12937 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
12938
12939 board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
12940 alc262_models,
12941 alc262_cfg_tbl);
12942
12943 if (board_config < 0) {
12944 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12945 codec->chip_name);
12946 board_config = ALC262_AUTO;
12947 }
12948
12949 if (board_config == ALC262_AUTO) {
12950 alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups);
12951 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
12952 }
12953
12954 if (board_config == ALC262_AUTO) {
12955 /* automatic parse from the BIOS config */
12956 err = alc262_parse_auto_config(codec);
12957 if (err < 0) {
12958 alc_free(codec);
12959 return err;
12960 } else if (!err) {
12961 printk(KERN_INFO
12962 "hda_codec: Cannot set up configuration "
12963 "from BIOS. Using base mode...\n");
12964 board_config = ALC262_BASIC;
12965 }
12966 }
12967
12968 if (!spec->no_analog && has_cdefine_beep(codec)) {
12969 err = snd_hda_attach_beep_device(codec, 0x1);
12970 if (err < 0) {
12971 alc_free(codec);
12972 return err;
12973 }
12974 }
12975
12976 if (board_config != ALC262_AUTO)
12977 setup_preset(codec, &alc262_presets[board_config]);
12978
12979 spec->stream_analog_playback = &alc262_pcm_analog_playback;
12980 spec->stream_analog_capture = &alc262_pcm_analog_capture;
12981
12982 spec->stream_digital_playback = &alc262_pcm_digital_playback;
12983 spec->stream_digital_capture = &alc262_pcm_digital_capture;
12984
12985 if (!spec->adc_nids && spec->input_mux) {
12986 int i;
12987 /* check whether the digital-mic has to be supported */
12988 for (i = 0; i < spec->input_mux->num_items; i++) {
12989 if (spec->input_mux->items[i].index >= 9)
12990 break;
12991 }
12992 if (i < spec->input_mux->num_items) {
12993 /* use only ADC0 */
12994 spec->adc_nids = alc262_dmic_adc_nids;
12995 spec->num_adc_nids = 1;
12996 spec->capsrc_nids = alc262_dmic_capsrc_nids;
12997 } else {
12998 /* all analog inputs */
12999 /* check whether NID 0x07 is valid */
13000 unsigned int wcap = get_wcaps(codec, 0x07);
13001
13002 /* get type */
13003 wcap = get_wcaps_type(wcap);
13004 if (wcap != AC_WID_AUD_IN) {
13005 spec->adc_nids = alc262_adc_nids_alt;
13006 spec->num_adc_nids =
13007 ARRAY_SIZE(alc262_adc_nids_alt);
13008 spec->capsrc_nids = alc262_capsrc_nids_alt;
13009 } else {
13010 spec->adc_nids = alc262_adc_nids;
13011 spec->num_adc_nids =
13012 ARRAY_SIZE(alc262_adc_nids);
13013 spec->capsrc_nids = alc262_capsrc_nids;
13014 }
13015 }
13016 }
13017 if (!spec->cap_mixer && !spec->no_analog)
13018 set_capture_mixer(codec);
13019 if (!spec->no_analog && has_cdefine_beep(codec))
13020 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
13021
13022 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
13023
13024 spec->vmaster_nid = 0x0c;
13025
13026 codec->patch_ops = alc_patch_ops;
13027 if (board_config == ALC262_AUTO)
13028 spec->init_hook = alc262_auto_init;
13029
13030 alc_init_jacks(codec);
13031 #ifdef CONFIG_SND_HDA_POWER_SAVE
13032 if (!spec->loopback.amplist)
13033 spec->loopback.amplist = alc262_loopbacks;
13034 #endif
13035
13036 return 0;
13037 }
13038
13039 /*
13040 * ALC268 channel source setting (2 channel)
13041 */
13042 #define ALC268_DIGOUT_NID ALC880_DIGOUT_NID
13043 #define alc268_modes alc260_modes
13044
13045 static hda_nid_t alc268_dac_nids[2] = {
13046 /* front, hp */
13047 0x02, 0x03
13048 };
13049
13050 static hda_nid_t alc268_adc_nids[2] = {
13051 /* ADC0-1 */
13052 0x08, 0x07
13053 };
13054
13055 static hda_nid_t alc268_adc_nids_alt[1] = {
13056 /* ADC0 */
13057 0x08
13058 };
13059
13060 static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
13061
13062 static struct snd_kcontrol_new alc268_base_mixer[] = {
13063 /* output mixer control */
13064 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
13065 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13066 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
13067 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13068 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
13069 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
13070 HDA_CODEC_VOLUME("Line In Boost Volume", 0x1a, 0, HDA_INPUT),
13071 { }
13072 };
13073
13074 static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
13075 /* output mixer control */
13076 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
13077 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
13078 ALC262_HIPPO_MASTER_SWITCH,
13079 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
13080 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
13081 HDA_CODEC_VOLUME("Line In Boost Volume", 0x1a, 0, HDA_INPUT),
13082 { }
13083 };
13084
13085 /* bind Beep switches of both NID 0x0f and 0x10 */
13086 static struct hda_bind_ctls alc268_bind_beep_sw = {
13087 .ops = &snd_hda_bind_sw,
13088 .values = {
13089 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
13090 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
13091 0
13092 },
13093 };
13094
13095 static struct snd_kcontrol_new alc268_beep_mixer[] = {
13096 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
13097 HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
13098 { }
13099 };
13100
13101 static struct hda_verb alc268_eapd_verbs[] = {
13102 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
13103 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
13104 { }
13105 };
13106
13107 /* Toshiba specific */
13108 static struct hda_verb alc268_toshiba_verbs[] = {
13109 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13110 { } /* end */
13111 };
13112
13113 /* Acer specific */
13114 /* bind volumes of both NID 0x02 and 0x03 */
13115 static struct hda_bind_ctls alc268_acer_bind_master_vol = {
13116 .ops = &snd_hda_bind_vol,
13117 .values = {
13118 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
13119 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
13120 0
13121 },
13122 };
13123
13124 /* mute/unmute internal speaker according to the hp jack and mute state */
13125 static void alc268_acer_automute(struct hda_codec *codec, int force)
13126 {
13127 struct alc_spec *spec = codec->spec;
13128 unsigned int mute;
13129
13130 if (force || !spec->sense_updated) {
13131 spec->jack_present = snd_hda_jack_detect(codec, 0x14);
13132 spec->sense_updated = 1;
13133 }
13134 if (spec->jack_present)
13135 mute = HDA_AMP_MUTE; /* mute internal speaker */
13136 else /* unmute internal speaker if necessary */
13137 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
13138 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
13139 HDA_AMP_MUTE, mute);
13140 }
13141
13142
13143 /* bind hp and internal speaker mute (with plug check) */
13144 static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
13145 struct snd_ctl_elem_value *ucontrol)
13146 {
13147 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
13148 long *valp = ucontrol->value.integer.value;
13149 int change;
13150
13151 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
13152 if (change)
13153 alc268_acer_automute(codec, 0);
13154 return change;
13155 }
13156
13157 static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
13158 /* output mixer control */
13159 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13160 {
13161 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13162 .name = "Master Playback Switch",
13163 .subdevice = HDA_SUBDEV_AMP_FLAG,
13164 .info = snd_hda_mixer_amp_switch_info,
13165 .get = snd_hda_mixer_amp_switch_get,
13166 .put = alc268_acer_master_sw_put,
13167 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13168 },
13169 HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
13170 { }
13171 };
13172
13173 static struct snd_kcontrol_new alc268_acer_mixer[] = {
13174 /* output mixer control */
13175 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13176 {
13177 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13178 .name = "Master Playback Switch",
13179 .subdevice = HDA_SUBDEV_AMP_FLAG,
13180 .info = snd_hda_mixer_amp_switch_info,
13181 .get = snd_hda_mixer_amp_switch_get,
13182 .put = alc268_acer_master_sw_put,
13183 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13184 },
13185 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
13186 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
13187 HDA_CODEC_VOLUME("Line In Boost Volume", 0x1a, 0, HDA_INPUT),
13188 { }
13189 };
13190
13191 static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
13192 /* output mixer control */
13193 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13194 {
13195 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13196 .name = "Master Playback Switch",
13197 .subdevice = HDA_SUBDEV_AMP_FLAG,
13198 .info = snd_hda_mixer_amp_switch_info,
13199 .get = snd_hda_mixer_amp_switch_get,
13200 .put = alc268_acer_master_sw_put,
13201 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13202 },
13203 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
13204 HDA_CODEC_VOLUME("Line In Boost Volume", 0x1a, 0, HDA_INPUT),
13205 { }
13206 };
13207
13208 static struct hda_verb alc268_acer_aspire_one_verbs[] = {
13209 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13210 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13211 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13212 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13213 {0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
13214 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
13215 { }
13216 };
13217
13218 static struct hda_verb alc268_acer_verbs[] = {
13219 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
13220 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13221 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13222 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13223 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13224 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13225 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13226 { }
13227 };
13228
13229 /* unsolicited event for HP jack sensing */
13230 #define alc268_toshiba_unsol_event alc262_hippo_unsol_event
13231 #define alc268_toshiba_setup alc262_hippo_setup
13232 #define alc268_toshiba_automute alc262_hippo_automute
13233
13234 static void alc268_acer_unsol_event(struct hda_codec *codec,
13235 unsigned int res)
13236 {
13237 if ((res >> 26) != ALC880_HP_EVENT)
13238 return;
13239 alc268_acer_automute(codec, 1);
13240 }
13241
13242 static void alc268_acer_init_hook(struct hda_codec *codec)
13243 {
13244 alc268_acer_automute(codec, 1);
13245 }
13246
13247 /* toggle speaker-output according to the hp-jack state */
13248 static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
13249 {
13250 unsigned int present;
13251 unsigned char bits;
13252
13253 present = snd_hda_jack_detect(codec, 0x15);
13254 bits = present ? HDA_AMP_MUTE : 0;
13255 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
13256 HDA_AMP_MUTE, bits);
13257 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
13258 HDA_AMP_MUTE, bits);
13259 }
13260
13261 static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
13262 unsigned int res)
13263 {
13264 switch (res >> 26) {
13265 case ALC880_HP_EVENT:
13266 alc268_aspire_one_speaker_automute(codec);
13267 break;
13268 case ALC880_MIC_EVENT:
13269 alc_mic_automute(codec);
13270 break;
13271 }
13272 }
13273
13274 static void alc268_acer_lc_setup(struct hda_codec *codec)
13275 {
13276 struct alc_spec *spec = codec->spec;
13277 spec->ext_mic.pin = 0x18;
13278 spec->ext_mic.mux_idx = 0;
13279 spec->int_mic.pin = 0x12;
13280 spec->int_mic.mux_idx = 6;
13281 spec->auto_mic = 1;
13282 }
13283
13284 static void alc268_acer_lc_init_hook(struct hda_codec *codec)
13285 {
13286 alc268_aspire_one_speaker_automute(codec);
13287 alc_mic_automute(codec);
13288 }
13289
13290 static struct snd_kcontrol_new alc268_dell_mixer[] = {
13291 /* output mixer control */
13292 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13293 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13294 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13295 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13296 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
13297 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
13298 { }
13299 };
13300
13301 static struct hda_verb alc268_dell_verbs[] = {
13302 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13303 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13304 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13305 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
13306 { }
13307 };
13308
13309 /* mute/unmute internal speaker according to the hp jack and mute state */
13310 static void alc268_dell_setup(struct hda_codec *codec)
13311 {
13312 struct alc_spec *spec = codec->spec;
13313
13314 spec->autocfg.hp_pins[0] = 0x15;
13315 spec->autocfg.speaker_pins[0] = 0x14;
13316 spec->ext_mic.pin = 0x18;
13317 spec->ext_mic.mux_idx = 0;
13318 spec->int_mic.pin = 0x19;
13319 spec->int_mic.mux_idx = 1;
13320 spec->auto_mic = 1;
13321 }
13322
13323 static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
13324 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
13325 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13326 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
13327 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13328 HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13329 HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
13330 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
13331 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
13332 { }
13333 };
13334
13335 static struct hda_verb alc267_quanta_il1_verbs[] = {
13336 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13337 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
13338 { }
13339 };
13340
13341 static void alc267_quanta_il1_setup(struct hda_codec *codec)
13342 {
13343 struct alc_spec *spec = codec->spec;
13344 spec->autocfg.hp_pins[0] = 0x15;
13345 spec->autocfg.speaker_pins[0] = 0x14;
13346 spec->ext_mic.pin = 0x18;
13347 spec->ext_mic.mux_idx = 0;
13348 spec->int_mic.pin = 0x19;
13349 spec->int_mic.mux_idx = 1;
13350 spec->auto_mic = 1;
13351 }
13352
13353 /*
13354 * generic initialization of ADC, input mixers and output mixers
13355 */
13356 static struct hda_verb alc268_base_init_verbs[] = {
13357 /* Unmute DAC0-1 and set vol = 0 */
13358 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13359 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13360
13361 /*
13362 * Set up output mixers (0x0c - 0x0e)
13363 */
13364 /* set vol=0 to output mixers */
13365 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13366 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
13367
13368 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13369 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13370
13371 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
13372 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
13373 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
13374 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
13375 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
13376 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13377 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13378 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13379
13380 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13381 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13382 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13383 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13384 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13385
13386 /* set PCBEEP vol = 0, mute connections */
13387 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13388 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13389 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13390
13391 /* Unmute Selector 23h,24h and set the default input to mic-in */
13392
13393 {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
13394 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13395 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
13396 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13397
13398 { }
13399 };
13400
13401 /*
13402 * generic initialization of ADC, input mixers and output mixers
13403 */
13404 static struct hda_verb alc268_volume_init_verbs[] = {
13405 /* set output DAC */
13406 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13407 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13408
13409 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
13410 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
13411 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13412 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13413 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13414
13415 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13416 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13417 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13418
13419 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13420 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13421
13422 /* set PCBEEP vol = 0, mute connections */
13423 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13424 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13425 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13426
13427 { }
13428 };
13429
13430 static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
13431 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13432 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
13433 { } /* end */
13434 };
13435
13436 static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
13437 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13438 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
13439 _DEFINE_CAPSRC(1),
13440 { } /* end */
13441 };
13442
13443 static struct snd_kcontrol_new alc268_capture_mixer[] = {
13444 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13445 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
13446 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
13447 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
13448 _DEFINE_CAPSRC(2),
13449 { } /* end */
13450 };
13451
13452 static struct hda_input_mux alc268_capture_source = {
13453 .num_items = 4,
13454 .items = {
13455 { "Mic", 0x0 },
13456 { "Front Mic", 0x1 },
13457 { "Line", 0x2 },
13458 { "CD", 0x3 },
13459 },
13460 };
13461
13462 static struct hda_input_mux alc268_acer_capture_source = {
13463 .num_items = 3,
13464 .items = {
13465 { "Mic", 0x0 },
13466 { "Internal Mic", 0x1 },
13467 { "Line", 0x2 },
13468 },
13469 };
13470
13471 static struct hda_input_mux alc268_acer_dmic_capture_source = {
13472 .num_items = 3,
13473 .items = {
13474 { "Mic", 0x0 },
13475 { "Internal Mic", 0x6 },
13476 { "Line", 0x2 },
13477 },
13478 };
13479
13480 #ifdef CONFIG_SND_DEBUG
13481 static struct snd_kcontrol_new alc268_test_mixer[] = {
13482 /* Volume widgets */
13483 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13484 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13485 HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
13486 HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
13487 HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
13488 HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
13489 HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
13490 HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
13491 HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
13492 HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
13493 HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
13494 HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
13495 HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
13496 /* The below appears problematic on some hardwares */
13497 /*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
13498 HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13499 HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
13500 HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
13501 HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
13502
13503 /* Modes for retasking pin widgets */
13504 ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
13505 ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
13506 ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
13507 ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
13508
13509 /* Controls for GPIO pins, assuming they are configured as outputs */
13510 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
13511 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
13512 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
13513 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
13514
13515 /* Switches to allow the digital SPDIF output pin to be enabled.
13516 * The ALC268 does not have an SPDIF input.
13517 */
13518 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
13519
13520 /* A switch allowing EAPD to be enabled. Some laptops seem to use
13521 * this output to turn on an external amplifier.
13522 */
13523 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
13524 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
13525
13526 { } /* end */
13527 };
13528 #endif
13529
13530 /* create input playback/capture controls for the given pin */
13531 static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
13532 const char *ctlname, int idx)
13533 {
13534 hda_nid_t dac;
13535 int err;
13536
13537 switch (nid) {
13538 case 0x14:
13539 case 0x16:
13540 dac = 0x02;
13541 break;
13542 case 0x15:
13543 case 0x1a: /* ALC259/269 only */
13544 case 0x1b: /* ALC259/269 only */
13545 case 0x21: /* ALC269vb has this pin, too */
13546 dac = 0x03;
13547 break;
13548 default:
13549 snd_printd(KERN_WARNING "hda_codec: "
13550 "ignoring pin 0x%x as unknown\n", nid);
13551 return 0;
13552 }
13553 if (spec->multiout.dac_nids[0] != dac &&
13554 spec->multiout.dac_nids[1] != dac) {
13555 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
13556 HDA_COMPOSE_AMP_VAL(dac, 3, idx,
13557 HDA_OUTPUT));
13558 if (err < 0)
13559 return err;
13560 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
13561 }
13562
13563 if (nid != 0x16)
13564 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
13565 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
13566 else /* mono */
13567 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
13568 HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
13569 if (err < 0)
13570 return err;
13571 return 0;
13572 }
13573
13574 /* add playback controls from the parsed DAC table */
13575 static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
13576 const struct auto_pin_cfg *cfg)
13577 {
13578 hda_nid_t nid;
13579 int err;
13580
13581 spec->multiout.dac_nids = spec->private_dac_nids;
13582
13583 nid = cfg->line_out_pins[0];
13584 if (nid) {
13585 const char *name;
13586 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
13587 name = "Speaker";
13588 else
13589 name = "Front";
13590 err = alc268_new_analog_output(spec, nid, name, 0);
13591 if (err < 0)
13592 return err;
13593 }
13594
13595 nid = cfg->speaker_pins[0];
13596 if (nid == 0x1d) {
13597 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
13598 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
13599 if (err < 0)
13600 return err;
13601 } else if (nid) {
13602 err = alc268_new_analog_output(spec, nid, "Speaker", 0);
13603 if (err < 0)
13604 return err;
13605 }
13606 nid = cfg->hp_pins[0];
13607 if (nid) {
13608 err = alc268_new_analog_output(spec, nid, "Headphone", 0);
13609 if (err < 0)
13610 return err;
13611 }
13612
13613 nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
13614 if (nid == 0x16) {
13615 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
13616 HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
13617 if (err < 0)
13618 return err;
13619 }
13620 return 0;
13621 }
13622
13623 /* create playback/capture controls for input pins */
13624 static int alc268_auto_create_input_ctls(struct hda_codec *codec,
13625 const struct auto_pin_cfg *cfg)
13626 {
13627 return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
13628 }
13629
13630 static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
13631 hda_nid_t nid, int pin_type)
13632 {
13633 int idx;
13634
13635 alc_set_pin_output(codec, nid, pin_type);
13636 if (nid == 0x14 || nid == 0x16)
13637 idx = 0;
13638 else
13639 idx = 1;
13640 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
13641 }
13642
13643 static void alc268_auto_init_multi_out(struct hda_codec *codec)
13644 {
13645 struct alc_spec *spec = codec->spec;
13646 int i;
13647
13648 for (i = 0; i < spec->autocfg.line_outs; i++) {
13649 hda_nid_t nid = spec->autocfg.line_out_pins[i];
13650 int pin_type = get_pin_type(spec->autocfg.line_out_type);
13651 alc268_auto_set_output_and_unmute(codec, nid, pin_type);
13652 }
13653 }
13654
13655 static void alc268_auto_init_hp_out(struct hda_codec *codec)
13656 {
13657 struct alc_spec *spec = codec->spec;
13658 hda_nid_t pin;
13659 int i;
13660
13661 for (i = 0; i < spec->autocfg.hp_outs; i++) {
13662 pin = spec->autocfg.hp_pins[i];
13663 alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
13664 }
13665 for (i = 0; i < spec->autocfg.speaker_outs; i++) {
13666 pin = spec->autocfg.speaker_pins[i];
13667 alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
13668 }
13669 if (spec->autocfg.mono_out_pin)
13670 snd_hda_codec_write(codec, spec->autocfg.mono_out_pin, 0,
13671 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
13672 }
13673
13674 static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
13675 {
13676 struct alc_spec *spec = codec->spec;
13677 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
13678 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
13679 hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
13680 unsigned int dac_vol1, dac_vol2;
13681
13682 if (line_nid == 0x1d || speaker_nid == 0x1d) {
13683 snd_hda_codec_write(codec, speaker_nid, 0,
13684 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
13685 /* mute mixer inputs from 0x1d */
13686 snd_hda_codec_write(codec, 0x0f, 0,
13687 AC_VERB_SET_AMP_GAIN_MUTE,
13688 AMP_IN_UNMUTE(1));
13689 snd_hda_codec_write(codec, 0x10, 0,
13690 AC_VERB_SET_AMP_GAIN_MUTE,
13691 AMP_IN_UNMUTE(1));
13692 } else {
13693 /* unmute mixer inputs from 0x1d */
13694 snd_hda_codec_write(codec, 0x0f, 0,
13695 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13696 snd_hda_codec_write(codec, 0x10, 0,
13697 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13698 }
13699
13700 dac_vol1 = dac_vol2 = 0xb000 | 0x40; /* set max volume */
13701 if (line_nid == 0x14)
13702 dac_vol2 = AMP_OUT_ZERO;
13703 else if (line_nid == 0x15)
13704 dac_vol1 = AMP_OUT_ZERO;
13705 if (hp_nid == 0x14)
13706 dac_vol2 = AMP_OUT_ZERO;
13707 else if (hp_nid == 0x15)
13708 dac_vol1 = AMP_OUT_ZERO;
13709 if (line_nid != 0x16 || hp_nid != 0x16 ||
13710 spec->autocfg.line_out_pins[1] != 0x16 ||
13711 spec->autocfg.line_out_pins[2] != 0x16)
13712 dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
13713
13714 snd_hda_codec_write(codec, 0x02, 0,
13715 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
13716 snd_hda_codec_write(codec, 0x03, 0,
13717 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
13718 }
13719
13720 /* pcm configuration: identical with ALC880 */
13721 #define alc268_pcm_analog_playback alc880_pcm_analog_playback
13722 #define alc268_pcm_analog_capture alc880_pcm_analog_capture
13723 #define alc268_pcm_analog_alt_capture alc880_pcm_analog_alt_capture
13724 #define alc268_pcm_digital_playback alc880_pcm_digital_playback
13725
13726 /*
13727 * BIOS auto configuration
13728 */
13729 static int alc268_parse_auto_config(struct hda_codec *codec)
13730 {
13731 struct alc_spec *spec = codec->spec;
13732 int err;
13733 static hda_nid_t alc268_ignore[] = { 0 };
13734
13735 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13736 alc268_ignore);
13737 if (err < 0)
13738 return err;
13739 if (!spec->autocfg.line_outs) {
13740 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
13741 spec->multiout.max_channels = 2;
13742 spec->no_analog = 1;
13743 goto dig_only;
13744 }
13745 return 0; /* can't find valid BIOS pin config */
13746 }
13747 err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
13748 if (err < 0)
13749 return err;
13750 err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
13751 if (err < 0)
13752 return err;
13753
13754 spec->multiout.max_channels = 2;
13755
13756 dig_only:
13757 /* digital only support output */
13758 alc_auto_parse_digital(codec);
13759 if (spec->kctls.list)
13760 add_mixer(spec, spec->kctls.list);
13761
13762 if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
13763 add_mixer(spec, alc268_beep_mixer);
13764
13765 add_verb(spec, alc268_volume_init_verbs);
13766 spec->num_mux_defs = 2;
13767 spec->input_mux = &spec->private_imux[0];
13768
13769 err = alc_auto_add_mic_boost(codec);
13770 if (err < 0)
13771 return err;
13772
13773 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
13774
13775 return 1;
13776 }
13777
13778 #define alc268_auto_init_analog_input alc882_auto_init_analog_input
13779
13780 /* init callback for auto-configuration model -- overriding the default init */
13781 static void alc268_auto_init(struct hda_codec *codec)
13782 {
13783 struct alc_spec *spec = codec->spec;
13784 alc268_auto_init_multi_out(codec);
13785 alc268_auto_init_hp_out(codec);
13786 alc268_auto_init_mono_speaker_out(codec);
13787 alc268_auto_init_analog_input(codec);
13788 alc_auto_init_digital(codec);
13789 if (spec->unsol_event)
13790 alc_inithook(codec);
13791 }
13792
13793 /*
13794 * configuration and preset
13795 */
13796 static const char * const alc268_models[ALC268_MODEL_LAST] = {
13797 [ALC267_QUANTA_IL1] = "quanta-il1",
13798 [ALC268_3ST] = "3stack",
13799 [ALC268_TOSHIBA] = "toshiba",
13800 [ALC268_ACER] = "acer",
13801 [ALC268_ACER_DMIC] = "acer-dmic",
13802 [ALC268_ACER_ASPIRE_ONE] = "acer-aspire",
13803 [ALC268_DELL] = "dell",
13804 [ALC268_ZEPTO] = "zepto",
13805 #ifdef CONFIG_SND_DEBUG
13806 [ALC268_TEST] = "test",
13807 #endif
13808 [ALC268_AUTO] = "auto",
13809 };
13810
13811 static struct snd_pci_quirk alc268_cfg_tbl[] = {
13812 SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
13813 SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
13814 SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
13815 SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
13816 SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
13817 SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
13818 ALC268_ACER_ASPIRE_ONE),
13819 SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
13820 SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
13821 "Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
13822 /* almost compatible with toshiba but with optional digital outs;
13823 * auto-probing seems working fine
13824 */
13825 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
13826 ALC268_AUTO),
13827 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
13828 SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
13829 SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
13830 SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
13831 SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
13832 {}
13833 };
13834
13835 /* Toshiba laptops have no unique PCI SSID but only codec SSID */
13836 static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
13837 SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
13838 SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
13839 SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
13840 ALC268_TOSHIBA),
13841 {}
13842 };
13843
13844 static struct alc_config_preset alc268_presets[] = {
13845 [ALC267_QUANTA_IL1] = {
13846 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
13847 alc268_capture_nosrc_mixer },
13848 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13849 alc267_quanta_il1_verbs },
13850 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13851 .dac_nids = alc268_dac_nids,
13852 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13853 .adc_nids = alc268_adc_nids_alt,
13854 .hp_nid = 0x03,
13855 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13856 .channel_mode = alc268_modes,
13857 .unsol_event = alc_sku_unsol_event,
13858 .setup = alc267_quanta_il1_setup,
13859 .init_hook = alc_inithook,
13860 },
13861 [ALC268_3ST] = {
13862 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13863 alc268_beep_mixer },
13864 .init_verbs = { alc268_base_init_verbs },
13865 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13866 .dac_nids = alc268_dac_nids,
13867 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13868 .adc_nids = alc268_adc_nids_alt,
13869 .capsrc_nids = alc268_capsrc_nids,
13870 .hp_nid = 0x03,
13871 .dig_out_nid = ALC268_DIGOUT_NID,
13872 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13873 .channel_mode = alc268_modes,
13874 .input_mux = &alc268_capture_source,
13875 },
13876 [ALC268_TOSHIBA] = {
13877 .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
13878 alc268_beep_mixer },
13879 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13880 alc268_toshiba_verbs },
13881 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13882 .dac_nids = alc268_dac_nids,
13883 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13884 .adc_nids = alc268_adc_nids_alt,
13885 .capsrc_nids = alc268_capsrc_nids,
13886 .hp_nid = 0x03,
13887 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13888 .channel_mode = alc268_modes,
13889 .input_mux = &alc268_capture_source,
13890 .unsol_event = alc268_toshiba_unsol_event,
13891 .setup = alc268_toshiba_setup,
13892 .init_hook = alc268_toshiba_automute,
13893 },
13894 [ALC268_ACER] = {
13895 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
13896 alc268_beep_mixer },
13897 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13898 alc268_acer_verbs },
13899 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13900 .dac_nids = alc268_dac_nids,
13901 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13902 .adc_nids = alc268_adc_nids_alt,
13903 .capsrc_nids = alc268_capsrc_nids,
13904 .hp_nid = 0x02,
13905 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13906 .channel_mode = alc268_modes,
13907 .input_mux = &alc268_acer_capture_source,
13908 .unsol_event = alc268_acer_unsol_event,
13909 .init_hook = alc268_acer_init_hook,
13910 },
13911 [ALC268_ACER_DMIC] = {
13912 .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
13913 alc268_beep_mixer },
13914 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13915 alc268_acer_verbs },
13916 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13917 .dac_nids = alc268_dac_nids,
13918 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13919 .adc_nids = alc268_adc_nids_alt,
13920 .capsrc_nids = alc268_capsrc_nids,
13921 .hp_nid = 0x02,
13922 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13923 .channel_mode = alc268_modes,
13924 .input_mux = &alc268_acer_dmic_capture_source,
13925 .unsol_event = alc268_acer_unsol_event,
13926 .init_hook = alc268_acer_init_hook,
13927 },
13928 [ALC268_ACER_ASPIRE_ONE] = {
13929 .mixers = { alc268_acer_aspire_one_mixer,
13930 alc268_beep_mixer,
13931 alc268_capture_nosrc_mixer },
13932 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13933 alc268_acer_aspire_one_verbs },
13934 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13935 .dac_nids = alc268_dac_nids,
13936 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13937 .adc_nids = alc268_adc_nids_alt,
13938 .capsrc_nids = alc268_capsrc_nids,
13939 .hp_nid = 0x03,
13940 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13941 .channel_mode = alc268_modes,
13942 .unsol_event = alc268_acer_lc_unsol_event,
13943 .setup = alc268_acer_lc_setup,
13944 .init_hook = alc268_acer_lc_init_hook,
13945 },
13946 [ALC268_DELL] = {
13947 .mixers = { alc268_dell_mixer, alc268_beep_mixer,
13948 alc268_capture_nosrc_mixer },
13949 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13950 alc268_dell_verbs },
13951 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13952 .dac_nids = alc268_dac_nids,
13953 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13954 .adc_nids = alc268_adc_nids_alt,
13955 .capsrc_nids = alc268_capsrc_nids,
13956 .hp_nid = 0x02,
13957 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13958 .channel_mode = alc268_modes,
13959 .unsol_event = alc_sku_unsol_event,
13960 .setup = alc268_dell_setup,
13961 .init_hook = alc_inithook,
13962 },
13963 [ALC268_ZEPTO] = {
13964 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13965 alc268_beep_mixer },
13966 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13967 alc268_toshiba_verbs },
13968 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13969 .dac_nids = alc268_dac_nids,
13970 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13971 .adc_nids = alc268_adc_nids_alt,
13972 .capsrc_nids = alc268_capsrc_nids,
13973 .hp_nid = 0x03,
13974 .dig_out_nid = ALC268_DIGOUT_NID,
13975 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13976 .channel_mode = alc268_modes,
13977 .input_mux = &alc268_capture_source,
13978 .setup = alc268_toshiba_setup,
13979 .init_hook = alc268_toshiba_automute,
13980 },
13981 #ifdef CONFIG_SND_DEBUG
13982 [ALC268_TEST] = {
13983 .mixers = { alc268_test_mixer, alc268_capture_mixer },
13984 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13985 alc268_volume_init_verbs },
13986 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13987 .dac_nids = alc268_dac_nids,
13988 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13989 .adc_nids = alc268_adc_nids_alt,
13990 .capsrc_nids = alc268_capsrc_nids,
13991 .hp_nid = 0x03,
13992 .dig_out_nid = ALC268_DIGOUT_NID,
13993 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13994 .channel_mode = alc268_modes,
13995 .input_mux = &alc268_capture_source,
13996 },
13997 #endif
13998 };
13999
14000 static int patch_alc268(struct hda_codec *codec)
14001 {
14002 struct alc_spec *spec;
14003 int board_config;
14004 int i, has_beep, err;
14005
14006 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
14007 if (spec == NULL)
14008 return -ENOMEM;
14009
14010 codec->spec = spec;
14011
14012 board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
14013 alc268_models,
14014 alc268_cfg_tbl);
14015
14016 if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
14017 board_config = snd_hda_check_board_codec_sid_config(codec,
14018 ALC268_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
14019
14020 if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
14021 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14022 codec->chip_name);
14023 board_config = ALC268_AUTO;
14024 }
14025
14026 if (board_config == ALC268_AUTO) {
14027 /* automatic parse from the BIOS config */
14028 err = alc268_parse_auto_config(codec);
14029 if (err < 0) {
14030 alc_free(codec);
14031 return err;
14032 } else if (!err) {
14033 printk(KERN_INFO
14034 "hda_codec: Cannot set up configuration "
14035 "from BIOS. Using base mode...\n");
14036 board_config = ALC268_3ST;
14037 }
14038 }
14039
14040 if (board_config != ALC268_AUTO)
14041 setup_preset(codec, &alc268_presets[board_config]);
14042
14043 spec->stream_analog_playback = &alc268_pcm_analog_playback;
14044 spec->stream_analog_capture = &alc268_pcm_analog_capture;
14045 spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
14046
14047 spec->stream_digital_playback = &alc268_pcm_digital_playback;
14048
14049 has_beep = 0;
14050 for (i = 0; i < spec->num_mixers; i++) {
14051 if (spec->mixers[i] == alc268_beep_mixer) {
14052 has_beep = 1;
14053 break;
14054 }
14055 }
14056
14057 if (has_beep) {
14058 err = snd_hda_attach_beep_device(codec, 0x1);
14059 if (err < 0) {
14060 alc_free(codec);
14061 return err;
14062 }
14063 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
14064 /* override the amp caps for beep generator */
14065 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
14066 (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
14067 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
14068 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
14069 (0 << AC_AMPCAP_MUTE_SHIFT));
14070 }
14071
14072 if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
14073 /* check whether NID 0x07 is valid */
14074 unsigned int wcap = get_wcaps(codec, 0x07);
14075 int i;
14076
14077 spec->capsrc_nids = alc268_capsrc_nids;
14078 /* get type */
14079 wcap = get_wcaps_type(wcap);
14080 if (spec->auto_mic ||
14081 wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
14082 spec->adc_nids = alc268_adc_nids_alt;
14083 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
14084 if (spec->auto_mic)
14085 fixup_automic_adc(codec);
14086 if (spec->auto_mic || spec->input_mux->num_items == 1)
14087 add_mixer(spec, alc268_capture_nosrc_mixer);
14088 else
14089 add_mixer(spec, alc268_capture_alt_mixer);
14090 } else {
14091 spec->adc_nids = alc268_adc_nids;
14092 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
14093 add_mixer(spec, alc268_capture_mixer);
14094 }
14095 /* set default input source */
14096 for (i = 0; i < spec->num_adc_nids; i++)
14097 snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
14098 0, AC_VERB_SET_CONNECT_SEL,
14099 i < spec->num_mux_defs ?
14100 spec->input_mux[i].items[0].index :
14101 spec->input_mux->items[0].index);
14102 }
14103
14104 spec->vmaster_nid = 0x02;
14105
14106 codec->patch_ops = alc_patch_ops;
14107 if (board_config == ALC268_AUTO)
14108 spec->init_hook = alc268_auto_init;
14109
14110 alc_init_jacks(codec);
14111
14112 return 0;
14113 }
14114
14115 /*
14116 * ALC269 channel source setting (2 channel)
14117 */
14118 #define ALC269_DIGOUT_NID ALC880_DIGOUT_NID
14119
14120 #define alc269_dac_nids alc260_dac_nids
14121
14122 static hda_nid_t alc269_adc_nids[1] = {
14123 /* ADC1 */
14124 0x08,
14125 };
14126
14127 static hda_nid_t alc269_capsrc_nids[1] = {
14128 0x23,
14129 };
14130
14131 static hda_nid_t alc269vb_adc_nids[1] = {
14132 /* ADC1 */
14133 0x09,
14134 };
14135
14136 static hda_nid_t alc269vb_capsrc_nids[1] = {
14137 0x22,
14138 };
14139
14140 static hda_nid_t alc269_adc_candidates[] = {
14141 0x08, 0x09, 0x07,
14142 };
14143
14144 #define alc269_modes alc260_modes
14145 #define alc269_capture_source alc880_lg_lw_capture_source
14146
14147 static struct snd_kcontrol_new alc269_base_mixer[] = {
14148 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14149 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
14150 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
14151 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
14152 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14153 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14154 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
14155 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
14156 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
14157 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
14158 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
14159 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
14160 { } /* end */
14161 };
14162
14163 static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
14164 /* output mixer control */
14165 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
14166 {
14167 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14168 .name = "Master Playback Switch",
14169 .subdevice = HDA_SUBDEV_AMP_FLAG,
14170 .info = snd_hda_mixer_amp_switch_info,
14171 .get = snd_hda_mixer_amp_switch_get,
14172 .put = alc268_acer_master_sw_put,
14173 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
14174 },
14175 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14176 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14177 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
14178 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
14179 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
14180 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
14181 { }
14182 };
14183
14184 static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
14185 /* output mixer control */
14186 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
14187 {
14188 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14189 .name = "Master Playback Switch",
14190 .subdevice = HDA_SUBDEV_AMP_FLAG,
14191 .info = snd_hda_mixer_amp_switch_info,
14192 .get = snd_hda_mixer_amp_switch_get,
14193 .put = alc268_acer_master_sw_put,
14194 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
14195 },
14196 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14197 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14198 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
14199 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
14200 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
14201 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
14202 HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
14203 HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
14204 HDA_CODEC_VOLUME("Dock Mic Boost Volume", 0x1b, 0, HDA_INPUT),
14205 { }
14206 };
14207
14208 static struct snd_kcontrol_new alc269_laptop_mixer[] = {
14209 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
14210 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14211 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
14212 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
14213 { } /* end */
14214 };
14215
14216 static struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
14217 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
14218 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14219 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
14220 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
14221 { } /* end */
14222 };
14223
14224 static struct snd_kcontrol_new alc269_asus_mixer[] = {
14225 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14226 HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x0, HDA_INPUT),
14227 { } /* end */
14228 };
14229
14230 /* capture mixer elements */
14231 static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
14232 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
14233 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
14234 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
14235 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
14236 { } /* end */
14237 };
14238
14239 static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
14240 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
14241 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
14242 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
14243 { } /* end */
14244 };
14245
14246 static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
14247 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
14248 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
14249 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
14250 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
14251 { } /* end */
14252 };
14253
14254 static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
14255 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
14256 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
14257 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
14258 { } /* end */
14259 };
14260
14261 /* FSC amilo */
14262 #define alc269_fujitsu_mixer alc269_laptop_mixer
14263
14264 static struct hda_verb alc269_quanta_fl1_verbs[] = {
14265 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14266 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14267 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14268 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
14269 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14270 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14271 { }
14272 };
14273
14274 static struct hda_verb alc269_lifebook_verbs[] = {
14275 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14276 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
14277 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14278 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14279 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
14280 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14281 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14282 {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
14283 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14284 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14285 { }
14286 };
14287
14288 /* toggle speaker-output according to the hp-jack state */
14289 static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
14290 {
14291 unsigned int present;
14292 unsigned char bits;
14293
14294 present = snd_hda_jack_detect(codec, 0x15);
14295 bits = present ? HDA_AMP_MUTE : 0;
14296 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
14297 HDA_AMP_MUTE, bits);
14298 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
14299 HDA_AMP_MUTE, bits);
14300
14301 snd_hda_codec_write(codec, 0x20, 0,
14302 AC_VERB_SET_COEF_INDEX, 0x0c);
14303 snd_hda_codec_write(codec, 0x20, 0,
14304 AC_VERB_SET_PROC_COEF, 0x680);
14305
14306 snd_hda_codec_write(codec, 0x20, 0,
14307 AC_VERB_SET_COEF_INDEX, 0x0c);
14308 snd_hda_codec_write(codec, 0x20, 0,
14309 AC_VERB_SET_PROC_COEF, 0x480);
14310 }
14311
14312 /* toggle speaker-output according to the hp-jacks state */
14313 static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
14314 {
14315 unsigned int present;
14316 unsigned char bits;
14317
14318 /* Check laptop headphone socket */
14319 present = snd_hda_jack_detect(codec, 0x15);
14320
14321 /* Check port replicator headphone socket */
14322 present |= snd_hda_jack_detect(codec, 0x1a);
14323
14324 bits = present ? HDA_AMP_MUTE : 0;
14325 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
14326 HDA_AMP_MUTE, bits);
14327 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
14328 HDA_AMP_MUTE, bits);
14329
14330 snd_hda_codec_write(codec, 0x20, 0,
14331 AC_VERB_SET_COEF_INDEX, 0x0c);
14332 snd_hda_codec_write(codec, 0x20, 0,
14333 AC_VERB_SET_PROC_COEF, 0x680);
14334
14335 snd_hda_codec_write(codec, 0x20, 0,
14336 AC_VERB_SET_COEF_INDEX, 0x0c);
14337 snd_hda_codec_write(codec, 0x20, 0,
14338 AC_VERB_SET_PROC_COEF, 0x480);
14339 }
14340
14341 static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
14342 {
14343 unsigned int present_laptop;
14344 unsigned int present_dock;
14345
14346 present_laptop = snd_hda_jack_detect(codec, 0x18);
14347 present_dock = snd_hda_jack_detect(codec, 0x1b);
14348
14349 /* Laptop mic port overrides dock mic port, design decision */
14350 if (present_dock)
14351 snd_hda_codec_write(codec, 0x23, 0,
14352 AC_VERB_SET_CONNECT_SEL, 0x3);
14353 if (present_laptop)
14354 snd_hda_codec_write(codec, 0x23, 0,
14355 AC_VERB_SET_CONNECT_SEL, 0x0);
14356 if (!present_dock && !present_laptop)
14357 snd_hda_codec_write(codec, 0x23, 0,
14358 AC_VERB_SET_CONNECT_SEL, 0x1);
14359 }
14360
14361 static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
14362 unsigned int res)
14363 {
14364 switch (res >> 26) {
14365 case ALC880_HP_EVENT:
14366 alc269_quanta_fl1_speaker_automute(codec);
14367 break;
14368 case ALC880_MIC_EVENT:
14369 alc_mic_automute(codec);
14370 break;
14371 }
14372 }
14373
14374 static void alc269_lifebook_unsol_event(struct hda_codec *codec,
14375 unsigned int res)
14376 {
14377 if ((res >> 26) == ALC880_HP_EVENT)
14378 alc269_lifebook_speaker_automute(codec);
14379 if ((res >> 26) == ALC880_MIC_EVENT)
14380 alc269_lifebook_mic_autoswitch(codec);
14381 }
14382
14383 static void alc269_quanta_fl1_setup(struct hda_codec *codec)
14384 {
14385 struct alc_spec *spec = codec->spec;
14386 spec->autocfg.hp_pins[0] = 0x15;
14387 spec->autocfg.speaker_pins[0] = 0x14;
14388 spec->ext_mic.pin = 0x18;
14389 spec->ext_mic.mux_idx = 0;
14390 spec->int_mic.pin = 0x19;
14391 spec->int_mic.mux_idx = 1;
14392 spec->auto_mic = 1;
14393 }
14394
14395 static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
14396 {
14397 alc269_quanta_fl1_speaker_automute(codec);
14398 alc_mic_automute(codec);
14399 }
14400
14401 static void alc269_lifebook_init_hook(struct hda_codec *codec)
14402 {
14403 alc269_lifebook_speaker_automute(codec);
14404 alc269_lifebook_mic_autoswitch(codec);
14405 }
14406
14407 static struct hda_verb alc269_laptop_dmic_init_verbs[] = {
14408 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14409 {0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
14410 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
14411 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
14412 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14413 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14414 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14415 {}
14416 };
14417
14418 static struct hda_verb alc269_laptop_amic_init_verbs[] = {
14419 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14420 {0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
14421 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
14422 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
14423 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14424 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14425 {}
14426 };
14427
14428 static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
14429 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
14430 {0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
14431 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
14432 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
14433 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14434 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14435 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14436 {}
14437 };
14438
14439 static struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
14440 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
14441 {0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
14442 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
14443 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
14444 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14445 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14446 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14447 {}
14448 };
14449
14450 static struct hda_verb alc271_acer_dmic_verbs[] = {
14451 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
14452 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
14453 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14454 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14455 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14456 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14457 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00},
14458 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14459 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14460 {0x22, AC_VERB_SET_CONNECT_SEL, 6},
14461 { }
14462 };
14463
14464 /* toggle speaker-output according to the hp-jack state */
14465 static void alc269_speaker_automute(struct hda_codec *codec)
14466 {
14467 struct alc_spec *spec = codec->spec;
14468 unsigned int nid = spec->autocfg.hp_pins[0];
14469 unsigned int present;
14470 unsigned char bits;
14471
14472 present = snd_hda_jack_detect(codec, nid);
14473 bits = present ? HDA_AMP_MUTE : 0;
14474 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
14475 HDA_AMP_MUTE, bits);
14476 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
14477 HDA_AMP_MUTE, bits);
14478 alc_report_jack(codec, nid);
14479 }
14480
14481 /* unsolicited event for HP jack sensing */
14482 static void alc269_laptop_unsol_event(struct hda_codec *codec,
14483 unsigned int res)
14484 {
14485 switch (res >> 26) {
14486 case ALC880_HP_EVENT:
14487 alc269_speaker_automute(codec);
14488 break;
14489 case ALC880_MIC_EVENT:
14490 alc_mic_automute(codec);
14491 break;
14492 }
14493 }
14494
14495 static void alc269_laptop_amic_setup(struct hda_codec *codec)
14496 {
14497 struct alc_spec *spec = codec->spec;
14498 spec->autocfg.hp_pins[0] = 0x15;
14499 spec->autocfg.speaker_pins[0] = 0x14;
14500 spec->ext_mic.pin = 0x18;
14501 spec->ext_mic.mux_idx = 0;
14502 spec->int_mic.pin = 0x19;
14503 spec->int_mic.mux_idx = 1;
14504 spec->auto_mic = 1;
14505 }
14506
14507 static void alc269_laptop_dmic_setup(struct hda_codec *codec)
14508 {
14509 struct alc_spec *spec = codec->spec;
14510 spec->autocfg.hp_pins[0] = 0x15;
14511 spec->autocfg.speaker_pins[0] = 0x14;
14512 spec->ext_mic.pin = 0x18;
14513 spec->ext_mic.mux_idx = 0;
14514 spec->int_mic.pin = 0x12;
14515 spec->int_mic.mux_idx = 5;
14516 spec->auto_mic = 1;
14517 }
14518
14519 static void alc269vb_laptop_amic_setup(struct hda_codec *codec)
14520 {
14521 struct alc_spec *spec = codec->spec;
14522 spec->autocfg.hp_pins[0] = 0x21;
14523 spec->autocfg.speaker_pins[0] = 0x14;
14524 spec->ext_mic.pin = 0x18;
14525 spec->ext_mic.mux_idx = 0;
14526 spec->int_mic.pin = 0x19;
14527 spec->int_mic.mux_idx = 1;
14528 spec->auto_mic = 1;
14529 }
14530
14531 static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
14532 {
14533 struct alc_spec *spec = codec->spec;
14534 spec->autocfg.hp_pins[0] = 0x21;
14535 spec->autocfg.speaker_pins[0] = 0x14;
14536 spec->ext_mic.pin = 0x18;
14537 spec->ext_mic.mux_idx = 0;
14538 spec->int_mic.pin = 0x12;
14539 spec->int_mic.mux_idx = 6;
14540 spec->auto_mic = 1;
14541 }
14542
14543 static void alc269_laptop_inithook(struct hda_codec *codec)
14544 {
14545 alc269_speaker_automute(codec);
14546 alc_mic_automute(codec);
14547 }
14548
14549 /*
14550 * generic initialization of ADC, input mixers and output mixers
14551 */
14552 static struct hda_verb alc269_init_verbs[] = {
14553 /*
14554 * Unmute ADC0 and set the default input to mic-in
14555 */
14556 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14557
14558 /*
14559 * Set up output mixers (0x02 - 0x03)
14560 */
14561 /* set vol=0 to output mixers */
14562 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14563 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14564
14565 /* set up input amps for analog loopback */
14566 /* Amp Indices: DAC = 0, mixer = 1 */
14567 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14568 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14569 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14570 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14571 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14572 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14573
14574 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14575 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14576 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14577 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14578 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14579 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14580 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14581
14582 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14583 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14584
14585 /* FIXME: use Mux-type input source selection */
14586 /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14587 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
14588 {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
14589
14590 /* set EAPD */
14591 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14592 { }
14593 };
14594
14595 static struct hda_verb alc269vb_init_verbs[] = {
14596 /*
14597 * Unmute ADC0 and set the default input to mic-in
14598 */
14599 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14600
14601 /*
14602 * Set up output mixers (0x02 - 0x03)
14603 */
14604 /* set vol=0 to output mixers */
14605 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14606 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14607
14608 /* set up input amps for analog loopback */
14609 /* Amp Indices: DAC = 0, mixer = 1 */
14610 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14611 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14612 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14613 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14614 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14615 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14616
14617 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14618 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14619 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14620 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14621 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14622 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14623 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14624
14625 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14626 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14627
14628 /* FIXME: use Mux-type input source selection */
14629 /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14630 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
14631 {0x22, AC_VERB_SET_CONNECT_SEL, 0x00},
14632
14633 /* set EAPD */
14634 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14635 { }
14636 };
14637
14638 #define alc269_auto_create_multi_out_ctls \
14639 alc268_auto_create_multi_out_ctls
14640 #define alc269_auto_create_input_ctls \
14641 alc268_auto_create_input_ctls
14642
14643 #ifdef CONFIG_SND_HDA_POWER_SAVE
14644 #define alc269_loopbacks alc880_loopbacks
14645 #endif
14646
14647 /* pcm configuration: identical with ALC880 */
14648 #define alc269_pcm_analog_playback alc880_pcm_analog_playback
14649 #define alc269_pcm_analog_capture alc880_pcm_analog_capture
14650 #define alc269_pcm_digital_playback alc880_pcm_digital_playback
14651 #define alc269_pcm_digital_capture alc880_pcm_digital_capture
14652
14653 static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
14654 .substreams = 1,
14655 .channels_min = 2,
14656 .channels_max = 8,
14657 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14658 /* NID is set in alc_build_pcms */
14659 .ops = {
14660 .open = alc880_playback_pcm_open,
14661 .prepare = alc880_playback_pcm_prepare,
14662 .cleanup = alc880_playback_pcm_cleanup
14663 },
14664 };
14665
14666 static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
14667 .substreams = 1,
14668 .channels_min = 2,
14669 .channels_max = 2,
14670 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14671 /* NID is set in alc_build_pcms */
14672 };
14673
14674 #ifdef CONFIG_SND_HDA_POWER_SAVE
14675 static int alc269_mic2_for_mute_led(struct hda_codec *codec)
14676 {
14677 switch (codec->subsystem_id) {
14678 case 0x103c1586:
14679 return 1;
14680 }
14681 return 0;
14682 }
14683
14684 static int alc269_mic2_mute_check_ps(struct hda_codec *codec, hda_nid_t nid)
14685 {
14686 /* update mute-LED according to the speaker mute state */
14687 if (nid == 0x01 || nid == 0x14) {
14688 int pinval;
14689 if (snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0) &
14690 HDA_AMP_MUTE)
14691 pinval = 0x24;
14692 else
14693 pinval = 0x20;
14694 /* mic2 vref pin is used for mute LED control */
14695 snd_hda_codec_update_cache(codec, 0x19, 0,
14696 AC_VERB_SET_PIN_WIDGET_CONTROL,
14697 pinval);
14698 }
14699 return alc_check_power_status(codec, nid);
14700 }
14701 #endif /* CONFIG_SND_HDA_POWER_SAVE */
14702
14703 static int alc275_setup_dual_adc(struct hda_codec *codec)
14704 {
14705 struct alc_spec *spec = codec->spec;
14706
14707 if (codec->vendor_id != 0x10ec0275 || !spec->auto_mic)
14708 return 0;
14709 if ((spec->ext_mic.pin >= 0x18 && spec->int_mic.pin <= 0x13) ||
14710 (spec->ext_mic.pin <= 0x12 && spec->int_mic.pin >= 0x18)) {
14711 if (spec->ext_mic.pin <= 0x12) {
14712 spec->private_adc_nids[0] = 0x08;
14713 spec->private_adc_nids[1] = 0x11;
14714 spec->private_capsrc_nids[0] = 0x23;
14715 spec->private_capsrc_nids[1] = 0x22;
14716 } else {
14717 spec->private_adc_nids[0] = 0x11;
14718 spec->private_adc_nids[1] = 0x08;
14719 spec->private_capsrc_nids[0] = 0x22;
14720 spec->private_capsrc_nids[1] = 0x23;
14721 }
14722 spec->adc_nids = spec->private_adc_nids;
14723 spec->capsrc_nids = spec->private_capsrc_nids;
14724 spec->num_adc_nids = 2;
14725 spec->dual_adc_switch = 1;
14726 snd_printdd("realtek: enabling dual ADC switchg (%02x:%02x)\n",
14727 spec->adc_nids[0], spec->adc_nids[1]);
14728 return 1;
14729 }
14730 return 0;
14731 }
14732
14733 /* different alc269-variants */
14734 enum {
14735 ALC269_TYPE_NORMAL,
14736 ALC269_TYPE_ALC258,
14737 ALC269_TYPE_ALC259,
14738 ALC269_TYPE_ALC269VB,
14739 ALC269_TYPE_ALC270,
14740 ALC269_TYPE_ALC271X,
14741 };
14742
14743 /*
14744 * BIOS auto configuration
14745 */
14746 static int alc269_parse_auto_config(struct hda_codec *codec)
14747 {
14748 struct alc_spec *spec = codec->spec;
14749 int err;
14750 static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
14751
14752 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
14753 alc269_ignore);
14754 if (err < 0)
14755 return err;
14756
14757 err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
14758 if (err < 0)
14759 return err;
14760 if (spec->codec_variant == ALC269_TYPE_NORMAL)
14761 err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
14762 else
14763 err = alc_auto_create_input_ctls(codec, &spec->autocfg, 0,
14764 0x22, 0);
14765 if (err < 0)
14766 return err;
14767
14768 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
14769
14770 alc_auto_parse_digital(codec);
14771
14772 if (spec->kctls.list)
14773 add_mixer(spec, spec->kctls.list);
14774
14775 if (spec->codec_variant != ALC269_TYPE_NORMAL) {
14776 add_verb(spec, alc269vb_init_verbs);
14777 alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21);
14778 } else {
14779 add_verb(spec, alc269_init_verbs);
14780 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
14781 }
14782
14783 spec->num_mux_defs = 1;
14784 spec->input_mux = &spec->private_imux[0];
14785
14786 if (!alc275_setup_dual_adc(codec))
14787 fillup_priv_adc_nids(codec, alc269_adc_candidates,
14788 sizeof(alc269_adc_candidates));
14789
14790 /* set default input source */
14791 if (!spec->dual_adc_switch)
14792 select_or_unmute_capsrc(codec, spec->capsrc_nids[0],
14793 spec->input_mux->items[0].index);
14794
14795 err = alc_auto_add_mic_boost(codec);
14796 if (err < 0)
14797 return err;
14798
14799 if (!spec->cap_mixer && !spec->no_analog)
14800 set_capture_mixer(codec);
14801
14802 return 1;
14803 }
14804
14805 #define alc269_auto_init_multi_out alc268_auto_init_multi_out
14806 #define alc269_auto_init_hp_out alc268_auto_init_hp_out
14807 #define alc269_auto_init_analog_input alc882_auto_init_analog_input
14808
14809
14810 /* init callback for auto-configuration model -- overriding the default init */
14811 static void alc269_auto_init(struct hda_codec *codec)
14812 {
14813 struct alc_spec *spec = codec->spec;
14814 alc269_auto_init_multi_out(codec);
14815 alc269_auto_init_hp_out(codec);
14816 alc269_auto_init_analog_input(codec);
14817 alc_auto_init_digital(codec);
14818 if (spec->unsol_event)
14819 alc_inithook(codec);
14820 }
14821
14822 #ifdef SND_HDA_NEEDS_RESUME
14823 static void alc269_toggle_power_output(struct hda_codec *codec, int power_up)
14824 {
14825 int val = alc_read_coef_idx(codec, 0x04);
14826 if (power_up)
14827 val |= 1 << 11;
14828 else
14829 val &= ~(1 << 11);
14830 alc_write_coef_idx(codec, 0x04, val);
14831 }
14832
14833 #ifdef CONFIG_SND_HDA_POWER_SAVE
14834 static int alc269_suspend(struct hda_codec *codec, pm_message_t state)
14835 {
14836 struct alc_spec *spec = codec->spec;
14837
14838 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017)
14839 alc269_toggle_power_output(codec, 0);
14840 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
14841 alc269_toggle_power_output(codec, 0);
14842 msleep(150);
14843 }
14844
14845 alc_shutup(codec);
14846 if (spec && spec->power_hook)
14847 spec->power_hook(codec);
14848 return 0;
14849 }
14850 #endif /* CONFIG_SND_HDA_POWER_SAVE */
14851
14852 static int alc269_resume(struct hda_codec *codec)
14853 {
14854 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
14855 alc269_toggle_power_output(codec, 0);
14856 msleep(150);
14857 }
14858
14859 codec->patch_ops.init(codec);
14860
14861 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017) {
14862 alc269_toggle_power_output(codec, 1);
14863 msleep(200);
14864 }
14865
14866 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018)
14867 alc269_toggle_power_output(codec, 1);
14868
14869 snd_hda_codec_resume_amp(codec);
14870 snd_hda_codec_resume_cache(codec);
14871 hda_call_check_power_status(codec, 0x01);
14872 return 0;
14873 }
14874 #endif /* SND_HDA_NEEDS_RESUME */
14875
14876 static void alc269_fixup_hweq(struct hda_codec *codec,
14877 const struct alc_fixup *fix, int action)
14878 {
14879 int coef;
14880
14881 if (action != ALC_FIXUP_ACT_INIT)
14882 return;
14883 coef = alc_read_coef_idx(codec, 0x1e);
14884 alc_write_coef_idx(codec, 0x1e, coef | 0x80);
14885 }
14886
14887 enum {
14888 ALC269_FIXUP_SONY_VAIO,
14889 ALC275_FIXUP_SONY_VAIO_GPIO2,
14890 ALC269_FIXUP_DELL_M101Z,
14891 ALC269_FIXUP_SKU_IGNORE,
14892 ALC269_FIXUP_ASUS_G73JW,
14893 ALC269_FIXUP_LENOVO_EAPD,
14894 ALC275_FIXUP_SONY_HWEQ,
14895 };
14896
14897 static const struct alc_fixup alc269_fixups[] = {
14898 [ALC269_FIXUP_SONY_VAIO] = {
14899 .type = ALC_FIXUP_VERBS,
14900 .v.verbs = (const struct hda_verb[]) {
14901 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
14902 {}
14903 }
14904 },
14905 [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
14906 .type = ALC_FIXUP_VERBS,
14907 .v.verbs = (const struct hda_verb[]) {
14908 {0x01, AC_VERB_SET_GPIO_MASK, 0x04},
14909 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04},
14910 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
14911 { }
14912 },
14913 .chained = true,
14914 .chain_id = ALC269_FIXUP_SONY_VAIO
14915 },
14916 [ALC269_FIXUP_DELL_M101Z] = {
14917 .type = ALC_FIXUP_VERBS,
14918 .v.verbs = (const struct hda_verb[]) {
14919 /* Enables internal speaker */
14920 {0x20, AC_VERB_SET_COEF_INDEX, 13},
14921 {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
14922 {}
14923 }
14924 },
14925 [ALC269_FIXUP_SKU_IGNORE] = {
14926 .type = ALC_FIXUP_SKU,
14927 .v.sku = ALC_FIXUP_SKU_IGNORE,
14928 },
14929 [ALC269_FIXUP_ASUS_G73JW] = {
14930 .type = ALC_FIXUP_PINS,
14931 .v.pins = (const struct alc_pincfg[]) {
14932 { 0x17, 0x99130111 }, /* subwoofer */
14933 { }
14934 }
14935 },
14936 [ALC269_FIXUP_LENOVO_EAPD] = {
14937 .type = ALC_FIXUP_VERBS,
14938 .v.verbs = (const struct hda_verb[]) {
14939 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
14940 {}
14941 }
14942 },
14943 [ALC275_FIXUP_SONY_HWEQ] = {
14944 .type = ALC_FIXUP_FUNC,
14945 .v.func = alc269_fixup_hweq,
14946 .chained = true,
14947 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
14948 }
14949 };
14950
14951 static struct snd_pci_quirk alc269_fixup_tbl[] = {
14952 SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
14953 SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
14954 SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
14955 SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
14956 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
14957 SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
14958 SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
14959 SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
14960 SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
14961 SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
14962 SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
14963 SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
14964 {}
14965 };
14966
14967
14968 /*
14969 * configuration and preset
14970 */
14971 static const char * const alc269_models[ALC269_MODEL_LAST] = {
14972 [ALC269_BASIC] = "basic",
14973 [ALC269_QUANTA_FL1] = "quanta",
14974 [ALC269_AMIC] = "laptop-amic",
14975 [ALC269_DMIC] = "laptop-dmic",
14976 [ALC269_FUJITSU] = "fujitsu",
14977 [ALC269_LIFEBOOK] = "lifebook",
14978 [ALC269_AUTO] = "auto",
14979 };
14980
14981 static struct snd_pci_quirk alc269_cfg_tbl[] = {
14982 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
14983 SND_PCI_QUIRK(0x1025, 0x047c, "ACER ZGA", ALC271_ACER),
14984 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
14985 ALC269_AMIC),
14986 SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC),
14987 SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC),
14988 SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC),
14989 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC),
14990 SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC),
14991 SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC),
14992 SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),
14993 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),
14994 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC),
14995 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_AMIC),
14996 SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),
14997 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),
14998 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC),
14999 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC),
15000 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC),
15001 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC),
15002 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC),
15003 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC),
15004 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC),
15005 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC),
15006 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC),
15007 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC),
15008 SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC),
15009 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC),
15010 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC),
15011 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC),
15012 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC),
15013 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC),
15014 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
15015 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
15016 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
15017 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC),
15018 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
15019 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
15020 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
15021 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
15022 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
15023 ALC269_DMIC),
15024 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
15025 ALC269_DMIC),
15026 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
15027 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
15028 SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO),
15029 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
15030 SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
15031 SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
15032 SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC),
15033 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC),
15034 SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC),
15035 SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC),
15036 {}
15037 };
15038
15039 static struct alc_config_preset alc269_presets[] = {
15040 [ALC269_BASIC] = {
15041 .mixers = { alc269_base_mixer },
15042 .init_verbs = { alc269_init_verbs },
15043 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
15044 .dac_nids = alc269_dac_nids,
15045 .hp_nid = 0x03,
15046 .num_channel_mode = ARRAY_SIZE(alc269_modes),
15047 .channel_mode = alc269_modes,
15048 .input_mux = &alc269_capture_source,
15049 },
15050 [ALC269_QUANTA_FL1] = {
15051 .mixers = { alc269_quanta_fl1_mixer },
15052 .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
15053 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
15054 .dac_nids = alc269_dac_nids,
15055 .hp_nid = 0x03,
15056 .num_channel_mode = ARRAY_SIZE(alc269_modes),
15057 .channel_mode = alc269_modes,
15058 .input_mux = &alc269_capture_source,
15059 .unsol_event = alc269_quanta_fl1_unsol_event,
15060 .setup = alc269_quanta_fl1_setup,
15061 .init_hook = alc269_quanta_fl1_init_hook,
15062 },
15063 [ALC269_AMIC] = {
15064 .mixers = { alc269_laptop_mixer },
15065 .cap_mixer = alc269_laptop_analog_capture_mixer,
15066 .init_verbs = { alc269_init_verbs,
15067 alc269_laptop_amic_init_verbs },
15068 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
15069 .dac_nids = alc269_dac_nids,
15070 .hp_nid = 0x03,
15071 .num_channel_mode = ARRAY_SIZE(alc269_modes),
15072 .channel_mode = alc269_modes,
15073 .unsol_event = alc269_laptop_unsol_event,
15074 .setup = alc269_laptop_amic_setup,
15075 .init_hook = alc269_laptop_inithook,
15076 },
15077 [ALC269_DMIC] = {
15078 .mixers = { alc269_laptop_mixer },
15079 .cap_mixer = alc269_laptop_digital_capture_mixer,
15080 .init_verbs = { alc269_init_verbs,
15081 alc269_laptop_dmic_init_verbs },
15082 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
15083 .dac_nids = alc269_dac_nids,
15084 .hp_nid = 0x03,
15085 .num_channel_mode = ARRAY_SIZE(alc269_modes),
15086 .channel_mode = alc269_modes,
15087 .unsol_event = alc269_laptop_unsol_event,
15088 .setup = alc269_laptop_dmic_setup,
15089 .init_hook = alc269_laptop_inithook,
15090 },
15091 [ALC269VB_AMIC] = {
15092 .mixers = { alc269vb_laptop_mixer },
15093 .cap_mixer = alc269vb_laptop_analog_capture_mixer,
15094 .init_verbs = { alc269vb_init_verbs,
15095 alc269vb_laptop_amic_init_verbs },
15096 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
15097 .dac_nids = alc269_dac_nids,
15098 .hp_nid = 0x03,
15099 .num_channel_mode = ARRAY_SIZE(alc269_modes),
15100 .channel_mode = alc269_modes,
15101 .unsol_event = alc269_laptop_unsol_event,
15102 .setup = alc269vb_laptop_amic_setup,
15103 .init_hook = alc269_laptop_inithook,
15104 },
15105 [ALC269VB_DMIC] = {
15106 .mixers = { alc269vb_laptop_mixer },
15107 .cap_mixer = alc269vb_laptop_digital_capture_mixer,
15108 .init_verbs = { alc269vb_init_verbs,
15109 alc269vb_laptop_dmic_init_verbs },
15110 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
15111 .dac_nids = alc269_dac_nids,
15112 .hp_nid = 0x03,
15113 .num_channel_mode = ARRAY_SIZE(alc269_modes),
15114 .channel_mode = alc269_modes,
15115 .unsol_event = alc269_laptop_unsol_event,
15116 .setup = alc269vb_laptop_dmic_setup,
15117 .init_hook = alc269_laptop_inithook,
15118 },
15119 [ALC269_FUJITSU] = {
15120 .mixers = { alc269_fujitsu_mixer },
15121 .cap_mixer = alc269_laptop_digital_capture_mixer,
15122 .init_verbs = { alc269_init_verbs,
15123 alc269_laptop_dmic_init_verbs },
15124 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
15125 .dac_nids = alc269_dac_nids,
15126 .hp_nid = 0x03,
15127 .num_channel_mode = ARRAY_SIZE(alc269_modes),
15128 .channel_mode = alc269_modes,
15129 .unsol_event = alc269_laptop_unsol_event,
15130 .setup = alc269_laptop_dmic_setup,
15131 .init_hook = alc269_laptop_inithook,
15132 },
15133 [ALC269_LIFEBOOK] = {
15134 .mixers = { alc269_lifebook_mixer },
15135 .init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
15136 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
15137 .dac_nids = alc269_dac_nids,
15138 .hp_nid = 0x03,
15139 .num_channel_mode = ARRAY_SIZE(alc269_modes),
15140 .channel_mode = alc269_modes,
15141 .input_mux = &alc269_capture_source,
15142 .unsol_event = alc269_lifebook_unsol_event,
15143 .init_hook = alc269_lifebook_init_hook,
15144 },
15145 [ALC271_ACER] = {
15146 .mixers = { alc269_asus_mixer },
15147 .cap_mixer = alc269vb_laptop_digital_capture_mixer,
15148 .init_verbs = { alc269_init_verbs, alc271_acer_dmic_verbs },
15149 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
15150 .dac_nids = alc269_dac_nids,
15151 .adc_nids = alc262_dmic_adc_nids,
15152 .num_adc_nids = ARRAY_SIZE(alc262_dmic_adc_nids),
15153 .capsrc_nids = alc262_dmic_capsrc_nids,
15154 .num_channel_mode = ARRAY_SIZE(alc269_modes),
15155 .channel_mode = alc269_modes,
15156 .input_mux = &alc269_capture_source,
15157 .dig_out_nid = ALC880_DIGOUT_NID,
15158 .unsol_event = alc_sku_unsol_event,
15159 .setup = alc269vb_laptop_dmic_setup,
15160 .init_hook = alc_inithook,
15161 },
15162 };
15163
15164 static int alc269_fill_coef(struct hda_codec *codec)
15165 {
15166 int val;
15167
15168 if ((alc_read_coef_idx(codec, 0) & 0x00ff) < 0x015) {
15169 alc_write_coef_idx(codec, 0xf, 0x960b);
15170 alc_write_coef_idx(codec, 0xe, 0x8817);
15171 }
15172
15173 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x016) {
15174 alc_write_coef_idx(codec, 0xf, 0x960b);
15175 alc_write_coef_idx(codec, 0xe, 0x8814);
15176 }
15177
15178 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017) {
15179 val = alc_read_coef_idx(codec, 0x04);
15180 /* Power up output pin */
15181 alc_write_coef_idx(codec, 0x04, val | (1<<11));
15182 }
15183
15184 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
15185 val = alc_read_coef_idx(codec, 0xd);
15186 if ((val & 0x0c00) >> 10 != 0x1) {
15187 /* Capless ramp up clock control */
15188 alc_write_coef_idx(codec, 0xd, val | 1<<10);
15189 }
15190 val = alc_read_coef_idx(codec, 0x17);
15191 if ((val & 0x01c0) >> 6 != 0x4) {
15192 /* Class D power on reset */
15193 alc_write_coef_idx(codec, 0x17, val | 1<<7);
15194 }
15195 }
15196 return 0;
15197 }
15198
15199 static int patch_alc269(struct hda_codec *codec)
15200 {
15201 struct alc_spec *spec;
15202 int board_config, coef;
15203 int err;
15204
15205 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
15206 if (spec == NULL)
15207 return -ENOMEM;
15208
15209 codec->spec = spec;
15210
15211 alc_auto_parse_customize_define(codec);
15212
15213 if (codec->vendor_id == 0x10ec0269) {
15214 coef = alc_read_coef_idx(codec, 0);
15215 if ((coef & 0x00f0) == 0x0010) {
15216 if (codec->bus->pci->subsystem_vendor == 0x1025 &&
15217 spec->cdefine.platform_type == 1) {
15218 alc_codec_rename(codec, "ALC271X");
15219 spec->codec_variant = ALC269_TYPE_ALC271X;
15220 } else if ((coef & 0xf000) == 0x1000) {
15221 spec->codec_variant = ALC269_TYPE_ALC270;
15222 } else if ((coef & 0xf000) == 0x2000) {
15223 alc_codec_rename(codec, "ALC259");
15224 spec->codec_variant = ALC269_TYPE_ALC259;
15225 } else if ((coef & 0xf000) == 0x3000) {
15226 alc_codec_rename(codec, "ALC258");
15227 spec->codec_variant = ALC269_TYPE_ALC258;
15228 } else {
15229 alc_codec_rename(codec, "ALC269VB");
15230 spec->codec_variant = ALC269_TYPE_ALC269VB;
15231 }
15232 } else
15233 alc_fix_pll_init(codec, 0x20, 0x04, 15);
15234 alc269_fill_coef(codec);
15235 }
15236
15237 board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
15238 alc269_models,
15239 alc269_cfg_tbl);
15240
15241 if (board_config < 0) {
15242 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15243 codec->chip_name);
15244 board_config = ALC269_AUTO;
15245 }
15246
15247 if (board_config == ALC269_AUTO) {
15248 alc_pick_fixup(codec, NULL, alc269_fixup_tbl, alc269_fixups);
15249 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
15250 }
15251
15252 if (board_config == ALC269_AUTO) {
15253 /* automatic parse from the BIOS config */
15254 err = alc269_parse_auto_config(codec);
15255 if (err < 0) {
15256 alc_free(codec);
15257 return err;
15258 } else if (!err) {
15259 printk(KERN_INFO
15260 "hda_codec: Cannot set up configuration "
15261 "from BIOS. Using base mode...\n");
15262 board_config = ALC269_BASIC;
15263 }
15264 }
15265
15266 if (has_cdefine_beep(codec)) {
15267 err = snd_hda_attach_beep_device(codec, 0x1);
15268 if (err < 0) {
15269 alc_free(codec);
15270 return err;
15271 }
15272 }
15273
15274 if (board_config != ALC269_AUTO)
15275 setup_preset(codec, &alc269_presets[board_config]);
15276
15277 if (board_config == ALC269_QUANTA_FL1) {
15278 /* Due to a hardware problem on Lenovo Ideadpad, we need to
15279 * fix the sample rate of analog I/O to 44.1kHz
15280 */
15281 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
15282 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
15283 } else if (spec->dual_adc_switch) {
15284 spec->stream_analog_playback = &alc269_pcm_analog_playback;
15285 /* switch ADC dynamically */
15286 spec->stream_analog_capture = &dualmic_pcm_analog_capture;
15287 } else {
15288 spec->stream_analog_playback = &alc269_pcm_analog_playback;
15289 spec->stream_analog_capture = &alc269_pcm_analog_capture;
15290 }
15291 spec->stream_digital_playback = &alc269_pcm_digital_playback;
15292 spec->stream_digital_capture = &alc269_pcm_digital_capture;
15293
15294 if (!spec->adc_nids) { /* wasn't filled automatically? use default */
15295 if (spec->codec_variant == ALC269_TYPE_NORMAL) {
15296 spec->adc_nids = alc269_adc_nids;
15297 spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
15298 spec->capsrc_nids = alc269_capsrc_nids;
15299 } else {
15300 spec->adc_nids = alc269vb_adc_nids;
15301 spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids);
15302 spec->capsrc_nids = alc269vb_capsrc_nids;
15303 }
15304 }
15305
15306 if (!spec->cap_mixer)
15307 set_capture_mixer(codec);
15308 if (has_cdefine_beep(codec))
15309 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
15310
15311 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
15312
15313 spec->vmaster_nid = 0x02;
15314
15315 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
15320 codec->patch_ops.resume = alc269_resume;
15321 #endif
15322 if (board_config == ALC269_AUTO)
15323 spec->init_hook = alc269_auto_init;
15324
15325 alc_init_jacks(codec);
15326 #ifdef CONFIG_SND_HDA_POWER_SAVE
15327 if (!spec->loopback.amplist)
15328 spec->loopback.amplist = alc269_loopbacks;
15329 if (alc269_mic2_for_mute_led(codec))
15330 codec->patch_ops.check_power_status = alc269_mic2_mute_check_ps;
15331 #endif
15332
15333 return 0;
15334 }
15335
15336 /*
15337 * ALC861 channel source setting (2/6 channel selection for 3-stack)
15338 */
15339
15340 /*
15341 * set the path ways for 2 channel output
15342 * need to set the codec line out and mic 1 pin widgets to inputs
15343 */
15344 static struct hda_verb alc861_threestack_ch2_init[] = {
15345 /* set pin widget 1Ah (line in) for input */
15346 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15347 /* set pin widget 18h (mic1/2) for input, for mic also enable
15348 * the vref
15349 */
15350 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15351
15352 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
15353 #if 0
15354 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
15355 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
15356 #endif
15357 { } /* end */
15358 };
15359 /*
15360 * 6ch mode
15361 * need to set the codec line out and mic 1 pin widgets to outputs
15362 */
15363 static struct hda_verb alc861_threestack_ch6_init[] = {
15364 /* set pin widget 1Ah (line in) for output (Back Surround)*/
15365 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15366 /* set pin widget 18h (mic1) for output (CLFE)*/
15367 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15368
15369 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
15370 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
15371
15372 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
15373 #if 0
15374 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
15375 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
15376 #endif
15377 { } /* end */
15378 };
15379
15380 static struct hda_channel_mode alc861_threestack_modes[2] = {
15381 { 2, alc861_threestack_ch2_init },
15382 { 6, alc861_threestack_ch6_init },
15383 };
15384 /* Set mic1 as input and unmute the mixer */
15385 static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
15386 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15387 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
15388 { } /* end */
15389 };
15390 /* Set mic1 as output and mute mixer */
15391 static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
15392 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15393 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
15394 { } /* end */
15395 };
15396
15397 static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
15398 { 2, alc861_uniwill_m31_ch2_init },
15399 { 4, alc861_uniwill_m31_ch4_init },
15400 };
15401
15402 /* Set mic1 and line-in as input and unmute the mixer */
15403 static struct hda_verb alc861_asus_ch2_init[] = {
15404 /* set pin widget 1Ah (line in) for input */
15405 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15406 /* set pin widget 18h (mic1/2) for input, for mic also enable
15407 * the vref
15408 */
15409 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15410
15411 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
15412 #if 0
15413 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
15414 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
15415 #endif
15416 { } /* end */
15417 };
15418 /* Set mic1 nad line-in as output and mute mixer */
15419 static struct hda_verb alc861_asus_ch6_init[] = {
15420 /* set pin widget 1Ah (line in) for output (Back Surround)*/
15421 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15422 /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
15423 /* set pin widget 18h (mic1) for output (CLFE)*/
15424 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15425 /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
15426 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
15427 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
15428
15429 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
15430 #if 0
15431 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
15432 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
15433 #endif
15434 { } /* end */
15435 };
15436
15437 static struct hda_channel_mode alc861_asus_modes[2] = {
15438 { 2, alc861_asus_ch2_init },
15439 { 6, alc861_asus_ch6_init },
15440 };
15441
15442 /* patch-ALC861 */
15443
15444 static struct snd_kcontrol_new alc861_base_mixer[] = {
15445 /* output mixer control */
15446 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
15447 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
15448 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
15449 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
15450 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
15451
15452 /*Input mixer control */
15453 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
15454 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
15455 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
15456 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
15457 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
15458 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
15459 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
15460 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
15461 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
15462 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
15463
15464 { } /* end */
15465 };
15466
15467 static struct snd_kcontrol_new alc861_3ST_mixer[] = {
15468 /* output mixer control */
15469 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
15470 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
15471 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
15472 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
15473 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
15474
15475 /* Input mixer control */
15476 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
15477 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
15478 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
15479 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
15480 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
15481 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
15482 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
15483 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
15484 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
15485 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
15486
15487 {
15488 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15489 .name = "Channel Mode",
15490 .info = alc_ch_mode_info,
15491 .get = alc_ch_mode_get,
15492 .put = alc_ch_mode_put,
15493 .private_value = ARRAY_SIZE(alc861_threestack_modes),
15494 },
15495 { } /* end */
15496 };
15497
15498 static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
15499 /* output mixer control */
15500 HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
15501 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
15502 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
15503
15504 { } /* end */
15505 };
15506
15507 static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
15508 /* output mixer control */
15509 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
15510 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
15511 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
15512 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
15513 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
15514
15515 /* Input mixer control */
15516 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
15517 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
15518 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
15519 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
15520 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
15521 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
15522 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
15523 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
15524 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
15525 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
15526
15527 {
15528 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15529 .name = "Channel Mode",
15530 .info = alc_ch_mode_info,
15531 .get = alc_ch_mode_get,
15532 .put = alc_ch_mode_put,
15533 .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
15534 },
15535 { } /* end */
15536 };
15537
15538 static struct snd_kcontrol_new alc861_asus_mixer[] = {
15539 /* output mixer control */
15540 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
15541 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
15542 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
15543 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
15544 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
15545
15546 /* Input mixer control */
15547 HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
15548 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
15549 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
15550 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
15551 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
15552 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
15553 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
15554 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
15555 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
15556 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
15557
15558 {
15559 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15560 .name = "Channel Mode",
15561 .info = alc_ch_mode_info,
15562 .get = alc_ch_mode_get,
15563 .put = alc_ch_mode_put,
15564 .private_value = ARRAY_SIZE(alc861_asus_modes),
15565 },
15566 { }
15567 };
15568
15569 /* additional mixer */
15570 static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
15571 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
15572 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
15573 { }
15574 };
15575
15576 /*
15577 * generic initialization of ADC, input mixers and output mixers
15578 */
15579 static struct hda_verb alc861_base_init_verbs[] = {
15580 /*
15581 * Unmute ADC0 and set the default input to mic-in
15582 */
15583 /* port-A for surround (rear panel) */
15584 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15585 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
15586 /* port-B for mic-in (rear panel) with vref */
15587 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15588 /* port-C for line-in (rear panel) */
15589 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15590 /* port-D for Front */
15591 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15592 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
15593 /* port-E for HP out (front panel) */
15594 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
15595 /* route front PCM to HP */
15596 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
15597 /* port-F for mic-in (front panel) with vref */
15598 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15599 /* port-G for CLFE (rear panel) */
15600 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15601 { 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
15602 /* port-H for side (rear panel) */
15603 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15604 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
15605 /* CD-in */
15606 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15607 /* route front mic to ADC1*/
15608 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
15609 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15610
15611 /* Unmute DAC0~3 & spdif out*/
15612 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15613 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15614 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15615 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15616 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15617
15618 /* Unmute Mixer 14 (mic) 1c (Line in)*/
15619 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15620 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15621 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15622 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15623
15624 /* Unmute Stereo Mixer 15 */
15625 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15626 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15627 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15628 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
15629
15630 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15631 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15632 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15633 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15634 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15635 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15636 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15637 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15638 /* hp used DAC 3 (Front) */
15639 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15640 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15641
15642 { }
15643 };
15644
15645 static struct hda_verb alc861_threestack_init_verbs[] = {
15646 /*
15647 * Unmute ADC0 and set the default input to mic-in
15648 */
15649 /* port-A for surround (rear panel) */
15650 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15651 /* port-B for mic-in (rear panel) with vref */
15652 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15653 /* port-C for line-in (rear panel) */
15654 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15655 /* port-D for Front */
15656 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15657 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
15658 /* port-E for HP out (front panel) */
15659 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
15660 /* route front PCM to HP */
15661 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
15662 /* port-F for mic-in (front panel) with vref */
15663 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15664 /* port-G for CLFE (rear panel) */
15665 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15666 /* port-H for side (rear panel) */
15667 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15668 /* CD-in */
15669 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15670 /* route front mic to ADC1*/
15671 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
15672 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15673 /* Unmute DAC0~3 & spdif out*/
15674 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15675 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15676 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15677 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15678 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15679
15680 /* Unmute Mixer 14 (mic) 1c (Line in)*/
15681 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15682 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15683 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15684 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15685
15686 /* Unmute Stereo Mixer 15 */
15687 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15688 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15689 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15690 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
15691
15692 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15693 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15694 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15695 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15696 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15697 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15698 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15699 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15700 /* hp used DAC 3 (Front) */
15701 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15702 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15703 { }
15704 };
15705
15706 static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
15707 /*
15708 * Unmute ADC0 and set the default input to mic-in
15709 */
15710 /* port-A for surround (rear panel) */
15711 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15712 /* port-B for mic-in (rear panel) with vref */
15713 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15714 /* port-C for line-in (rear panel) */
15715 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15716 /* port-D for Front */
15717 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15718 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
15719 /* port-E for HP out (front panel) */
15720 /* this has to be set to VREF80 */
15721 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15722 /* route front PCM to HP */
15723 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
15724 /* port-F for mic-in (front panel) with vref */
15725 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15726 /* port-G for CLFE (rear panel) */
15727 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15728 /* port-H for side (rear panel) */
15729 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15730 /* CD-in */
15731 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15732 /* route front mic to ADC1*/
15733 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
15734 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15735 /* Unmute DAC0~3 & spdif out*/
15736 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15737 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15738 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15739 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15740 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15741
15742 /* Unmute Mixer 14 (mic) 1c (Line in)*/
15743 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15744 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15745 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15746 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15747
15748 /* Unmute Stereo Mixer 15 */
15749 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15750 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15751 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15752 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
15753
15754 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15755 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15756 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15757 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15758 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15759 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15760 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15761 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15762 /* hp used DAC 3 (Front) */
15763 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15764 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15765 { }
15766 };
15767
15768 static struct hda_verb alc861_asus_init_verbs[] = {
15769 /*
15770 * Unmute ADC0 and set the default input to mic-in
15771 */
15772 /* port-A for surround (rear panel)
15773 * according to codec#0 this is the HP jack
15774 */
15775 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
15776 /* route front PCM to HP */
15777 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
15778 /* port-B for mic-in (rear panel) with vref */
15779 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15780 /* port-C for line-in (rear panel) */
15781 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15782 /* port-D for Front */
15783 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15784 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
15785 /* port-E for HP out (front panel) */
15786 /* this has to be set to VREF80 */
15787 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15788 /* route front PCM to HP */
15789 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
15790 /* port-F for mic-in (front panel) with vref */
15791 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15792 /* port-G for CLFE (rear panel) */
15793 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15794 /* port-H for side (rear panel) */
15795 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15796 /* CD-in */
15797 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15798 /* route front mic to ADC1*/
15799 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
15800 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15801 /* Unmute DAC0~3 & spdif out*/
15802 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15803 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15804 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15805 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15806 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15807 /* Unmute Mixer 14 (mic) 1c (Line in)*/
15808 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15809 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15810 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15811 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15812
15813 /* Unmute Stereo Mixer 15 */
15814 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15815 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15816 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15817 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
15818
15819 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15820 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15821 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15822 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15823 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15824 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15825 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15826 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15827 /* hp used DAC 3 (Front) */
15828 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15829 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15830 { }
15831 };
15832
15833 /* additional init verbs for ASUS laptops */
15834 static struct hda_verb alc861_asus_laptop_init_verbs[] = {
15835 { 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 */
15837 { }
15838 };
15839
15840 /*
15841 * generic initialization of ADC, input mixers and output mixers
15842 */
15843 static struct hda_verb alc861_auto_init_verbs[] = {
15844 /*
15845 * Unmute ADC0 and set the default input to mic-in
15846 */
15847 /* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
15848 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15849
15850 /* Unmute DAC0~3 & spdif out*/
15851 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15852 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15853 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15854 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15855 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15856
15857 /* Unmute Mixer 14 (mic) 1c (Line in)*/
15858 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15859 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15860 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15861 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15862
15863 /* Unmute Stereo Mixer 15 */
15864 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15865 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15866 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15867 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
15868
15869 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15870 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15871 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15872 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15873 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15874 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15875 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15876 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15877
15878 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15879 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15880 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15881 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15882 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15883 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15884 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15885 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15886
15887 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, /* set Mic 1 */
15888
15889 { }
15890 };
15891
15892 static struct hda_verb alc861_toshiba_init_verbs[] = {
15893 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15894
15895 { }
15896 };
15897
15898 /* toggle speaker-output according to the hp-jack state */
15899 static void alc861_toshiba_automute(struct hda_codec *codec)
15900 {
15901 unsigned int present = snd_hda_jack_detect(codec, 0x0f);
15902
15903 snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
15904 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
15905 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
15906 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
15907 }
15908
15909 static void alc861_toshiba_unsol_event(struct hda_codec *codec,
15910 unsigned int res)
15911 {
15912 if ((res >> 26) == ALC880_HP_EVENT)
15913 alc861_toshiba_automute(codec);
15914 }
15915
15916 /* pcm configuration: identical with ALC880 */
15917 #define alc861_pcm_analog_playback alc880_pcm_analog_playback
15918 #define alc861_pcm_analog_capture alc880_pcm_analog_capture
15919 #define alc861_pcm_digital_playback alc880_pcm_digital_playback
15920 #define alc861_pcm_digital_capture alc880_pcm_digital_capture
15921
15922
15923 #define ALC861_DIGOUT_NID 0x07
15924
15925 static struct hda_channel_mode alc861_8ch_modes[1] = {
15926 { 8, NULL }
15927 };
15928
15929 static hda_nid_t alc861_dac_nids[4] = {
15930 /* front, surround, clfe, side */
15931 0x03, 0x06, 0x05, 0x04
15932 };
15933
15934 static hda_nid_t alc660_dac_nids[3] = {
15935 /* front, clfe, surround */
15936 0x03, 0x05, 0x06
15937 };
15938
15939 static hda_nid_t alc861_adc_nids[1] = {
15940 /* ADC0-2 */
15941 0x08,
15942 };
15943
15944 static struct hda_input_mux alc861_capture_source = {
15945 .num_items = 5,
15946 .items = {
15947 { "Mic", 0x0 },
15948 { "Front Mic", 0x3 },
15949 { "Line", 0x1 },
15950 { "CD", 0x4 },
15951 { "Mixer", 0x5 },
15952 },
15953 };
15954
15955 static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
15956 {
15957 struct alc_spec *spec = codec->spec;
15958 hda_nid_t mix, srcs[5];
15959 int i, j, num;
15960
15961 if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
15962 return 0;
15963 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15964 if (num < 0)
15965 return 0;
15966 for (i = 0; i < num; i++) {
15967 unsigned int type;
15968 type = get_wcaps_type(get_wcaps(codec, srcs[i]));
15969 if (type != AC_WID_AUD_OUT)
15970 continue;
15971 for (j = 0; j < spec->multiout.num_dacs; j++)
15972 if (spec->multiout.dac_nids[j] == srcs[i])
15973 break;
15974 if (j >= spec->multiout.num_dacs)
15975 return srcs[i];
15976 }
15977 return 0;
15978 }
15979
15980 /* fill in the dac_nids table from the parsed pin configuration */
15981 static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
15982 const struct auto_pin_cfg *cfg)
15983 {
15984 struct alc_spec *spec = codec->spec;
15985 int i;
15986 hda_nid_t nid, dac;
15987
15988 spec->multiout.dac_nids = spec->private_dac_nids;
15989 for (i = 0; i < cfg->line_outs; i++) {
15990 nid = cfg->line_out_pins[i];
15991 dac = alc861_look_for_dac(codec, nid);
15992 if (!dac)
15993 continue;
15994 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
15995 }
15996 return 0;
15997 }
15998
15999 static int __alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
16000 hda_nid_t nid, int idx, unsigned int chs)
16001 {
16002 return __add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx, idx,
16003 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
16004 }
16005
16006 #define alc861_create_out_sw(codec, pfx, nid, chs) \
16007 __alc861_create_out_sw(codec, pfx, nid, 0, chs)
16008
16009 /* add playback controls from the parsed DAC table */
16010 static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
16011 const struct auto_pin_cfg *cfg)
16012 {
16013 struct alc_spec *spec = codec->spec;
16014 static const char * const chname[4] = {
16015 "Front", "Surround", NULL /*CLFE*/, "Side"
16016 };
16017 const char *pfx = alc_get_line_out_pfx(cfg, true);
16018 hda_nid_t nid;
16019 int i, err;
16020
16021 for (i = 0; i < cfg->line_outs; i++) {
16022 nid = spec->multiout.dac_nids[i];
16023 if (!nid)
16024 continue;
16025 if (!pfx && i == 2) {
16026 /* Center/LFE */
16027 err = alc861_create_out_sw(codec, "Center", nid, 1);
16028 if (err < 0)
16029 return err;
16030 err = alc861_create_out_sw(codec, "LFE", nid, 2);
16031 if (err < 0)
16032 return err;
16033 } else {
16034 const char *name = pfx;
16035 if (!name)
16036 name = chname[i];
16037 err = __alc861_create_out_sw(codec, name, nid, i, 3);
16038 if (err < 0)
16039 return err;
16040 }
16041 }
16042 return 0;
16043 }
16044
16045 static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
16046 {
16047 struct alc_spec *spec = codec->spec;
16048 int err;
16049 hda_nid_t nid;
16050
16051 if (!pin)
16052 return 0;
16053
16054 if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
16055 nid = alc861_look_for_dac(codec, pin);
16056 if (nid) {
16057 err = alc861_create_out_sw(codec, "Headphone", nid, 3);
16058 if (err < 0)
16059 return err;
16060 spec->multiout.hp_nid = nid;
16061 }
16062 }
16063 return 0;
16064 }
16065
16066 /* create playback/capture controls for input pins */
16067 static int alc861_auto_create_input_ctls(struct hda_codec *codec,
16068 const struct auto_pin_cfg *cfg)
16069 {
16070 return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
16071 }
16072
16073 static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
16074 hda_nid_t nid,
16075 int pin_type, hda_nid_t dac)
16076 {
16077 hda_nid_t mix, srcs[5];
16078 int i, num;
16079
16080 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
16081 pin_type);
16082 snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
16083 AMP_OUT_UNMUTE);
16084 if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
16085 return;
16086 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
16087 if (num < 0)
16088 return;
16089 for (i = 0; i < num; i++) {
16090 unsigned int mute;
16091 if (srcs[i] == dac || srcs[i] == 0x15)
16092 mute = AMP_IN_UNMUTE(i);
16093 else
16094 mute = AMP_IN_MUTE(i);
16095 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
16096 mute);
16097 }
16098 }
16099
16100 static void alc861_auto_init_multi_out(struct hda_codec *codec)
16101 {
16102 struct alc_spec *spec = codec->spec;
16103 int i;
16104
16105 for (i = 0; i < spec->autocfg.line_outs; i++) {
16106 hda_nid_t nid = spec->autocfg.line_out_pins[i];
16107 int pin_type = get_pin_type(spec->autocfg.line_out_type);
16108 if (nid)
16109 alc861_auto_set_output_and_unmute(codec, nid, pin_type,
16110 spec->multiout.dac_nids[i]);
16111 }
16112 }
16113
16114 static void alc861_auto_init_hp_out(struct hda_codec *codec)
16115 {
16116 struct alc_spec *spec = codec->spec;
16117
16118 if (spec->autocfg.hp_outs)
16119 alc861_auto_set_output_and_unmute(codec,
16120 spec->autocfg.hp_pins[0],
16121 PIN_HP,
16122 spec->multiout.hp_nid);
16123 if (spec->autocfg.speaker_outs)
16124 alc861_auto_set_output_and_unmute(codec,
16125 spec->autocfg.speaker_pins[0],
16126 PIN_OUT,
16127 spec->multiout.dac_nids[0]);
16128 }
16129
16130 static void alc861_auto_init_analog_input(struct hda_codec *codec)
16131 {
16132 struct alc_spec *spec = codec->spec;
16133 struct auto_pin_cfg *cfg = &spec->autocfg;
16134 int i;
16135
16136 for (i = 0; i < cfg->num_inputs; i++) {
16137 hda_nid_t nid = cfg->inputs[i].pin;
16138 if (nid >= 0x0c && nid <= 0x11)
16139 alc_set_input_pin(codec, nid, cfg->inputs[i].type);
16140 }
16141 }
16142
16143 /* parse the BIOS configuration and set up the alc_spec */
16144 /* return 1 if successful, 0 if the proper config is not found,
16145 * or a negative error code
16146 */
16147 static int alc861_parse_auto_config(struct hda_codec *codec)
16148 {
16149 struct alc_spec *spec = codec->spec;
16150 int err;
16151 static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
16152
16153 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
16154 alc861_ignore);
16155 if (err < 0)
16156 return err;
16157 if (!spec->autocfg.line_outs)
16158 return 0; /* can't find valid BIOS pin config */
16159
16160 err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
16161 if (err < 0)
16162 return err;
16163 err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
16164 if (err < 0)
16165 return err;
16166 err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
16167 if (err < 0)
16168 return err;
16169 err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
16170 if (err < 0)
16171 return err;
16172
16173 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
16174
16175 alc_auto_parse_digital(codec);
16176
16177 if (spec->kctls.list)
16178 add_mixer(spec, spec->kctls.list);
16179
16180 add_verb(spec, alc861_auto_init_verbs);
16181
16182 spec->num_mux_defs = 1;
16183 spec->input_mux = &spec->private_imux[0];
16184
16185 spec->adc_nids = alc861_adc_nids;
16186 spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
16187 set_capture_mixer(codec);
16188
16189 alc_ssid_check(codec, 0x0e, 0x0f, 0x0b, 0);
16190
16191 return 1;
16192 }
16193
16194 /* additional initialization for auto-configuration model */
16195 static void alc861_auto_init(struct hda_codec *codec)
16196 {
16197 struct alc_spec *spec = codec->spec;
16198 alc861_auto_init_multi_out(codec);
16199 alc861_auto_init_hp_out(codec);
16200 alc861_auto_init_analog_input(codec);
16201 alc_auto_init_digital(codec);
16202 if (spec->unsol_event)
16203 alc_inithook(codec);
16204 }
16205
16206 #ifdef CONFIG_SND_HDA_POWER_SAVE
16207 static struct hda_amp_list alc861_loopbacks[] = {
16208 { 0x15, HDA_INPUT, 0 },
16209 { 0x15, HDA_INPUT, 1 },
16210 { 0x15, HDA_INPUT, 2 },
16211 { 0x15, HDA_INPUT, 3 },
16212 { } /* end */
16213 };
16214 #endif
16215
16216
16217 /*
16218 * configuration and preset
16219 */
16220 static const char * const alc861_models[ALC861_MODEL_LAST] = {
16221 [ALC861_3ST] = "3stack",
16222 [ALC660_3ST] = "3stack-660",
16223 [ALC861_3ST_DIG] = "3stack-dig",
16224 [ALC861_6ST_DIG] = "6stack-dig",
16225 [ALC861_UNIWILL_M31] = "uniwill-m31",
16226 [ALC861_TOSHIBA] = "toshiba",
16227 [ALC861_ASUS] = "asus",
16228 [ALC861_ASUS_LAPTOP] = "asus-laptop",
16229 [ALC861_AUTO] = "auto",
16230 };
16231
16232 static struct snd_pci_quirk alc861_cfg_tbl[] = {
16233 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
16234 SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
16235 SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
16236 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
16237 SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
16238 SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
16239 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
16240 /* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
16241 * Any other models that need this preset?
16242 */
16243 /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
16244 SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
16245 SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
16246 SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
16247 SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
16248 SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
16249 /* FIXME: the below seems conflict */
16250 /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
16251 SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
16252 SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
16253 {}
16254 };
16255
16256 static struct alc_config_preset alc861_presets[] = {
16257 [ALC861_3ST] = {
16258 .mixers = { alc861_3ST_mixer },
16259 .init_verbs = { alc861_threestack_init_verbs },
16260 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
16261 .dac_nids = alc861_dac_nids,
16262 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
16263 .channel_mode = alc861_threestack_modes,
16264 .need_dac_fix = 1,
16265 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
16266 .adc_nids = alc861_adc_nids,
16267 .input_mux = &alc861_capture_source,
16268 },
16269 [ALC861_3ST_DIG] = {
16270 .mixers = { alc861_base_mixer },
16271 .init_verbs = { alc861_threestack_init_verbs },
16272 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
16273 .dac_nids = alc861_dac_nids,
16274 .dig_out_nid = ALC861_DIGOUT_NID,
16275 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
16276 .channel_mode = alc861_threestack_modes,
16277 .need_dac_fix = 1,
16278 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
16279 .adc_nids = alc861_adc_nids,
16280 .input_mux = &alc861_capture_source,
16281 },
16282 [ALC861_6ST_DIG] = {
16283 .mixers = { alc861_base_mixer },
16284 .init_verbs = { alc861_base_init_verbs },
16285 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
16286 .dac_nids = alc861_dac_nids,
16287 .dig_out_nid = ALC861_DIGOUT_NID,
16288 .num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
16289 .channel_mode = alc861_8ch_modes,
16290 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
16291 .adc_nids = alc861_adc_nids,
16292 .input_mux = &alc861_capture_source,
16293 },
16294 [ALC660_3ST] = {
16295 .mixers = { alc861_3ST_mixer },
16296 .init_verbs = { alc861_threestack_init_verbs },
16297 .num_dacs = ARRAY_SIZE(alc660_dac_nids),
16298 .dac_nids = alc660_dac_nids,
16299 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
16300 .channel_mode = alc861_threestack_modes,
16301 .need_dac_fix = 1,
16302 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
16303 .adc_nids = alc861_adc_nids,
16304 .input_mux = &alc861_capture_source,
16305 },
16306 [ALC861_UNIWILL_M31] = {
16307 .mixers = { alc861_uniwill_m31_mixer },
16308 .init_verbs = { alc861_uniwill_m31_init_verbs },
16309 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
16310 .dac_nids = alc861_dac_nids,
16311 .dig_out_nid = ALC861_DIGOUT_NID,
16312 .num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
16313 .channel_mode = alc861_uniwill_m31_modes,
16314 .need_dac_fix = 1,
16315 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
16316 .adc_nids = alc861_adc_nids,
16317 .input_mux = &alc861_capture_source,
16318 },
16319 [ALC861_TOSHIBA] = {
16320 .mixers = { alc861_toshiba_mixer },
16321 .init_verbs = { alc861_base_init_verbs,
16322 alc861_toshiba_init_verbs },
16323 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
16324 .dac_nids = alc861_dac_nids,
16325 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
16326 .channel_mode = alc883_3ST_2ch_modes,
16327 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
16328 .adc_nids = alc861_adc_nids,
16329 .input_mux = &alc861_capture_source,
16330 .unsol_event = alc861_toshiba_unsol_event,
16331 .init_hook = alc861_toshiba_automute,
16332 },
16333 [ALC861_ASUS] = {
16334 .mixers = { alc861_asus_mixer },
16335 .init_verbs = { alc861_asus_init_verbs },
16336 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
16337 .dac_nids = alc861_dac_nids,
16338 .dig_out_nid = ALC861_DIGOUT_NID,
16339 .num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
16340 .channel_mode = alc861_asus_modes,
16341 .need_dac_fix = 1,
16342 .hp_nid = 0x06,
16343 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
16344 .adc_nids = alc861_adc_nids,
16345 .input_mux = &alc861_capture_source,
16346 },
16347 [ALC861_ASUS_LAPTOP] = {
16348 .mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
16349 .init_verbs = { alc861_asus_init_verbs,
16350 alc861_asus_laptop_init_verbs },
16351 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
16352 .dac_nids = alc861_dac_nids,
16353 .dig_out_nid = ALC861_DIGOUT_NID,
16354 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
16355 .channel_mode = alc883_3ST_2ch_modes,
16356 .need_dac_fix = 1,
16357 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
16358 .adc_nids = alc861_adc_nids,
16359 .input_mux = &alc861_capture_source,
16360 },
16361 };
16362
16363 /* Pin config fixes */
16364 enum {
16365 PINFIX_FSC_AMILO_PI1505,
16366 };
16367
16368 static const struct alc_fixup alc861_fixups[] = {
16369 [PINFIX_FSC_AMILO_PI1505] = {
16370 .type = ALC_FIXUP_PINS,
16371 .v.pins = (const struct alc_pincfg[]) {
16372 { 0x0b, 0x0221101f }, /* HP */
16373 { 0x0f, 0x90170310 }, /* speaker */
16374 { }
16375 }
16376 },
16377 };
16378
16379 static struct snd_pci_quirk alc861_fixup_tbl[] = {
16380 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
16381 {}
16382 };
16383
16384 static int patch_alc861(struct hda_codec *codec)
16385 {
16386 struct alc_spec *spec;
16387 int board_config;
16388 int err;
16389
16390 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
16391 if (spec == NULL)
16392 return -ENOMEM;
16393
16394 codec->spec = spec;
16395
16396 board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
16397 alc861_models,
16398 alc861_cfg_tbl);
16399
16400 if (board_config < 0) {
16401 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
16402 codec->chip_name);
16403 board_config = ALC861_AUTO;
16404 }
16405
16406 if (board_config == ALC861_AUTO) {
16407 alc_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
16408 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
16409 }
16410
16411 if (board_config == ALC861_AUTO) {
16412 /* automatic parse from the BIOS config */
16413 err = alc861_parse_auto_config(codec);
16414 if (err < 0) {
16415 alc_free(codec);
16416 return err;
16417 } else if (!err) {
16418 printk(KERN_INFO
16419 "hda_codec: Cannot set up configuration "
16420 "from BIOS. Using base mode...\n");
16421 board_config = ALC861_3ST_DIG;
16422 }
16423 }
16424
16425 err = snd_hda_attach_beep_device(codec, 0x23);
16426 if (err < 0) {
16427 alc_free(codec);
16428 return err;
16429 }
16430
16431 if (board_config != ALC861_AUTO)
16432 setup_preset(codec, &alc861_presets[board_config]);
16433
16434 spec->stream_analog_playback = &alc861_pcm_analog_playback;
16435 spec->stream_analog_capture = &alc861_pcm_analog_capture;
16436
16437 spec->stream_digital_playback = &alc861_pcm_digital_playback;
16438 spec->stream_digital_capture = &alc861_pcm_digital_capture;
16439
16440 if (!spec->cap_mixer)
16441 set_capture_mixer(codec);
16442 set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
16443
16444 spec->vmaster_nid = 0x03;
16445
16446 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
16447
16448 codec->patch_ops = alc_patch_ops;
16449 if (board_config == ALC861_AUTO) {
16450 spec->init_hook = alc861_auto_init;
16451 #ifdef CONFIG_SND_HDA_POWER_SAVE
16452 spec->power_hook = alc_power_eapd;
16453 #endif
16454 }
16455 #ifdef CONFIG_SND_HDA_POWER_SAVE
16456 if (!spec->loopback.amplist)
16457 spec->loopback.amplist = alc861_loopbacks;
16458 #endif
16459
16460 return 0;
16461 }
16462
16463 /*
16464 * ALC861-VD support
16465 *
16466 * Based on ALC882
16467 *
16468 * In addition, an independent DAC
16469 */
16470 #define ALC861VD_DIGOUT_NID 0x06
16471
16472 static hda_nid_t alc861vd_dac_nids[4] = {
16473 /* front, surr, clfe, side surr */
16474 0x02, 0x03, 0x04, 0x05
16475 };
16476
16477 /* dac_nids for ALC660vd are in a different order - according to
16478 * Realtek's driver.
16479 * This should probably result in a different mixer for 6stack models
16480 * of ALC660vd codecs, but for now there is only 3stack mixer
16481 * - and it is the same as in 861vd.
16482 * adc_nids in ALC660vd are (is) the same as in 861vd
16483 */
16484 static hda_nid_t alc660vd_dac_nids[3] = {
16485 /* front, rear, clfe, rear_surr */
16486 0x02, 0x04, 0x03
16487 };
16488
16489 static hda_nid_t alc861vd_adc_nids[1] = {
16490 /* ADC0 */
16491 0x09,
16492 };
16493
16494 static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
16495
16496 /* input MUX */
16497 /* FIXME: should be a matrix-type input source selection */
16498 static struct hda_input_mux alc861vd_capture_source = {
16499 .num_items = 4,
16500 .items = {
16501 { "Mic", 0x0 },
16502 { "Front Mic", 0x1 },
16503 { "Line", 0x2 },
16504 { "CD", 0x4 },
16505 },
16506 };
16507
16508 static struct hda_input_mux alc861vd_dallas_capture_source = {
16509 .num_items = 2,
16510 .items = {
16511 { "Mic", 0x0 },
16512 { "Internal Mic", 0x1 },
16513 },
16514 };
16515
16516 static struct hda_input_mux alc861vd_hp_capture_source = {
16517 .num_items = 2,
16518 .items = {
16519 { "Front Mic", 0x0 },
16520 { "ATAPI Mic", 0x1 },
16521 },
16522 };
16523
16524 /*
16525 * 2ch mode
16526 */
16527 static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
16528 { 2, NULL }
16529 };
16530
16531 /*
16532 * 6ch mode
16533 */
16534 static struct hda_verb alc861vd_6stack_ch6_init[] = {
16535 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16536 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16537 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16538 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16539 { } /* end */
16540 };
16541
16542 /*
16543 * 8ch mode
16544 */
16545 static struct hda_verb alc861vd_6stack_ch8_init[] = {
16546 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16547 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16548 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16549 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16550 { } /* end */
16551 };
16552
16553 static struct hda_channel_mode alc861vd_6stack_modes[2] = {
16554 { 6, alc861vd_6stack_ch6_init },
16555 { 8, alc861vd_6stack_ch8_init },
16556 };
16557
16558 static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
16559 {
16560 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
16561 .name = "Channel Mode",
16562 .info = alc_ch_mode_info,
16563 .get = alc_ch_mode_get,
16564 .put = alc_ch_mode_put,
16565 },
16566 { } /* end */
16567 };
16568
16569 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
16570 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
16571 */
16572 static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
16573 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16574 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16575
16576 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16577 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
16578
16579 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
16580 HDA_OUTPUT),
16581 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
16582 HDA_OUTPUT),
16583 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
16584 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
16585
16586 HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
16587 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
16588
16589 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16590
16591 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
16592 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16593 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16594
16595 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
16596 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16597 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16598
16599 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16600 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16601
16602 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16603 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16604
16605 { } /* end */
16606 };
16607
16608 static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
16609 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16610 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16611
16612 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16613
16614 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
16615 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16616 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16617
16618 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
16619 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16620 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16621
16622 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16623 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16624
16625 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16626 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16627
16628 { } /* end */
16629 };
16630
16631 static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
16632 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16633 /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
16634 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16635
16636 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16637
16638 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
16639 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16640 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16641
16642 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
16643 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16644 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16645
16646 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16647 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16648
16649 { } /* end */
16650 };
16651
16652 /* Pin assignment: Speaker=0x14, HP = 0x15,
16653 * Mic=0x18, Internal Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
16654 */
16655 static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
16656 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16657 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
16658 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16659 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
16660 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
16661 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16662 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16663 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
16664 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16665 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16666 { } /* end */
16667 };
16668
16669 /* Pin assignment: Speaker=0x14, Line-out = 0x15,
16670 * Front Mic=0x18, ATAPI Mic = 0x19,
16671 */
16672 static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
16673 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16674 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16675 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16676 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
16677 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16678 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16679 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16680 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16681
16682 { } /* end */
16683 };
16684
16685 /*
16686 * generic initialization of ADC, input mixers and output mixers
16687 */
16688 static struct hda_verb alc861vd_volume_init_verbs[] = {
16689 /*
16690 * Unmute ADC0 and set the default input to mic-in
16691 */
16692 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16693 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16694
16695 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
16696 * the analog-loopback mixer widget
16697 */
16698 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
16699 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16700 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16701 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16702 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16703 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16704
16705 /* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
16706 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16707 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16708 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
16709 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
16710
16711 /*
16712 * Set up output mixers (0x02 - 0x05)
16713 */
16714 /* set vol=0 to output mixers */
16715 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16716 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16717 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16718 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16719
16720 /* set up input amps for analog loopback */
16721 /* Amp Indices: DAC = 0, mixer = 1 */
16722 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16723 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16724 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16725 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16726 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16727 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16728 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16729 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16730
16731 { }
16732 };
16733
16734 /*
16735 * 3-stack pin configuration:
16736 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
16737 */
16738 static struct hda_verb alc861vd_3stack_init_verbs[] = {
16739 /*
16740 * Set pin mode and muting
16741 */
16742 /* set front pin widgets 0x14 for output */
16743 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16744 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16745 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
16746
16747 /* Mic (rear) pin: input vref at 80% */
16748 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16749 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16750 /* Front Mic pin: input vref at 80% */
16751 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16752 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16753 /* Line In pin: input */
16754 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16755 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16756 /* Line-2 In: Headphone output (output 0 - 0x0c) */
16757 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16758 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16759 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16760 /* CD pin widget for input */
16761 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16762
16763 { }
16764 };
16765
16766 /*
16767 * 6-stack pin configuration:
16768 */
16769 static struct hda_verb alc861vd_6stack_init_verbs[] = {
16770 /*
16771 * Set pin mode and muting
16772 */
16773 /* set front pin widgets 0x14 for output */
16774 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16775 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16776 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
16777
16778 /* Rear Pin: output 1 (0x0d) */
16779 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16780 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16781 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
16782 /* CLFE Pin: output 2 (0x0e) */
16783 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16784 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16785 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
16786 /* Side Pin: output 3 (0x0f) */
16787 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16788 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16789 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
16790
16791 /* Mic (rear) pin: input vref at 80% */
16792 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16793 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16794 /* Front Mic pin: input vref at 80% */
16795 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16796 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16797 /* Line In pin: input */
16798 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16799 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16800 /* Line-2 In: Headphone output (output 0 - 0x0c) */
16801 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16802 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16803 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16804 /* CD pin widget for input */
16805 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16806
16807 { }
16808 };
16809
16810 static struct hda_verb alc861vd_eapd_verbs[] = {
16811 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16812 { }
16813 };
16814
16815 static struct hda_verb alc660vd_eapd_verbs[] = {
16816 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16817 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16818 { }
16819 };
16820
16821 static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
16822 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16823 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16824 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
16825 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16826 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16827 {}
16828 };
16829
16830 static void alc861vd_lenovo_setup(struct hda_codec *codec)
16831 {
16832 struct alc_spec *spec = codec->spec;
16833 spec->autocfg.hp_pins[0] = 0x1b;
16834 spec->autocfg.speaker_pins[0] = 0x14;
16835 }
16836
16837 static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
16838 {
16839 alc_automute_amp(codec);
16840 alc88x_simple_mic_automute(codec);
16841 }
16842
16843 static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
16844 unsigned int res)
16845 {
16846 switch (res >> 26) {
16847 case ALC880_MIC_EVENT:
16848 alc88x_simple_mic_automute(codec);
16849 break;
16850 default:
16851 alc_automute_amp_unsol_event(codec, res);
16852 break;
16853 }
16854 }
16855
16856 static struct hda_verb alc861vd_dallas_verbs[] = {
16857 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16858 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16859 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16860 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16861
16862 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16863 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16864 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16865 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16866 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16867 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16868 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16869 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16870
16871 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16872 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16873 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16874 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16875 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16876 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16877 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16878 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16879
16880 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16881 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16882 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16883 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16884 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16885 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16886 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16887 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16888
16889 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16890 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16891 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16892 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16893
16894 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16895 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16896 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16897
16898 { } /* end */
16899 };
16900
16901 /* toggle speaker-output according to the hp-jack state */
16902 static void alc861vd_dallas_setup(struct hda_codec *codec)
16903 {
16904 struct alc_spec *spec = codec->spec;
16905
16906 spec->autocfg.hp_pins[0] = 0x15;
16907 spec->autocfg.speaker_pins[0] = 0x14;
16908 }
16909
16910 #ifdef CONFIG_SND_HDA_POWER_SAVE
16911 #define alc861vd_loopbacks alc880_loopbacks
16912 #endif
16913
16914 /* pcm configuration: identical with ALC880 */
16915 #define alc861vd_pcm_analog_playback alc880_pcm_analog_playback
16916 #define alc861vd_pcm_analog_capture alc880_pcm_analog_capture
16917 #define alc861vd_pcm_digital_playback alc880_pcm_digital_playback
16918 #define alc861vd_pcm_digital_capture alc880_pcm_digital_capture
16919
16920 /*
16921 * configuration and preset
16922 */
16923 static const char * const alc861vd_models[ALC861VD_MODEL_LAST] = {
16924 [ALC660VD_3ST] = "3stack-660",
16925 [ALC660VD_3ST_DIG] = "3stack-660-digout",
16926 [ALC660VD_ASUS_V1S] = "asus-v1s",
16927 [ALC861VD_3ST] = "3stack",
16928 [ALC861VD_3ST_DIG] = "3stack-digout",
16929 [ALC861VD_6ST_DIG] = "6stack-digout",
16930 [ALC861VD_LENOVO] = "lenovo",
16931 [ALC861VD_DALLAS] = "dallas",
16932 [ALC861VD_HP] = "hp",
16933 [ALC861VD_AUTO] = "auto",
16934 };
16935
16936 static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
16937 SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
16938 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
16939 SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
16940 /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
16941 SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
16942 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
16943 SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
16944 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
16945 /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
16946 SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
16947 SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
16948 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
16949 SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
16950 SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
16951 SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
16952 {}
16953 };
16954
16955 static struct alc_config_preset alc861vd_presets[] = {
16956 [ALC660VD_3ST] = {
16957 .mixers = { alc861vd_3st_mixer },
16958 .init_verbs = { alc861vd_volume_init_verbs,
16959 alc861vd_3stack_init_verbs },
16960 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16961 .dac_nids = alc660vd_dac_nids,
16962 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16963 .channel_mode = alc861vd_3stack_2ch_modes,
16964 .input_mux = &alc861vd_capture_source,
16965 },
16966 [ALC660VD_3ST_DIG] = {
16967 .mixers = { alc861vd_3st_mixer },
16968 .init_verbs = { alc861vd_volume_init_verbs,
16969 alc861vd_3stack_init_verbs },
16970 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16971 .dac_nids = alc660vd_dac_nids,
16972 .dig_out_nid = ALC861VD_DIGOUT_NID,
16973 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16974 .channel_mode = alc861vd_3stack_2ch_modes,
16975 .input_mux = &alc861vd_capture_source,
16976 },
16977 [ALC861VD_3ST] = {
16978 .mixers = { alc861vd_3st_mixer },
16979 .init_verbs = { alc861vd_volume_init_verbs,
16980 alc861vd_3stack_init_verbs },
16981 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16982 .dac_nids = alc861vd_dac_nids,
16983 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16984 .channel_mode = alc861vd_3stack_2ch_modes,
16985 .input_mux = &alc861vd_capture_source,
16986 },
16987 [ALC861VD_3ST_DIG] = {
16988 .mixers = { alc861vd_3st_mixer },
16989 .init_verbs = { alc861vd_volume_init_verbs,
16990 alc861vd_3stack_init_verbs },
16991 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16992 .dac_nids = alc861vd_dac_nids,
16993 .dig_out_nid = ALC861VD_DIGOUT_NID,
16994 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16995 .channel_mode = alc861vd_3stack_2ch_modes,
16996 .input_mux = &alc861vd_capture_source,
16997 },
16998 [ALC861VD_6ST_DIG] = {
16999 .mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
17000 .init_verbs = { alc861vd_volume_init_verbs,
17001 alc861vd_6stack_init_verbs },
17002 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
17003 .dac_nids = alc861vd_dac_nids,
17004 .dig_out_nid = ALC861VD_DIGOUT_NID,
17005 .num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
17006 .channel_mode = alc861vd_6stack_modes,
17007 .input_mux = &alc861vd_capture_source,
17008 },
17009 [ALC861VD_LENOVO] = {
17010 .mixers = { alc861vd_lenovo_mixer },
17011 .init_verbs = { alc861vd_volume_init_verbs,
17012 alc861vd_3stack_init_verbs,
17013 alc861vd_eapd_verbs,
17014 alc861vd_lenovo_unsol_verbs },
17015 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
17016 .dac_nids = alc660vd_dac_nids,
17017 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
17018 .channel_mode = alc861vd_3stack_2ch_modes,
17019 .input_mux = &alc861vd_capture_source,
17020 .unsol_event = alc861vd_lenovo_unsol_event,
17021 .setup = alc861vd_lenovo_setup,
17022 .init_hook = alc861vd_lenovo_init_hook,
17023 },
17024 [ALC861VD_DALLAS] = {
17025 .mixers = { alc861vd_dallas_mixer },
17026 .init_verbs = { alc861vd_dallas_verbs },
17027 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
17028 .dac_nids = alc861vd_dac_nids,
17029 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
17030 .channel_mode = alc861vd_3stack_2ch_modes,
17031 .input_mux = &alc861vd_dallas_capture_source,
17032 .unsol_event = alc_automute_amp_unsol_event,
17033 .setup = alc861vd_dallas_setup,
17034 .init_hook = alc_automute_amp,
17035 },
17036 [ALC861VD_HP] = {
17037 .mixers = { alc861vd_hp_mixer },
17038 .init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
17039 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
17040 .dac_nids = alc861vd_dac_nids,
17041 .dig_out_nid = ALC861VD_DIGOUT_NID,
17042 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
17043 .channel_mode = alc861vd_3stack_2ch_modes,
17044 .input_mux = &alc861vd_hp_capture_source,
17045 .unsol_event = alc_automute_amp_unsol_event,
17046 .setup = alc861vd_dallas_setup,
17047 .init_hook = alc_automute_amp,
17048 },
17049 [ALC660VD_ASUS_V1S] = {
17050 .mixers = { alc861vd_lenovo_mixer },
17051 .init_verbs = { alc861vd_volume_init_verbs,
17052 alc861vd_3stack_init_verbs,
17053 alc861vd_eapd_verbs,
17054 alc861vd_lenovo_unsol_verbs },
17055 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
17056 .dac_nids = alc660vd_dac_nids,
17057 .dig_out_nid = ALC861VD_DIGOUT_NID,
17058 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
17059 .channel_mode = alc861vd_3stack_2ch_modes,
17060 .input_mux = &alc861vd_capture_source,
17061 .unsol_event = alc861vd_lenovo_unsol_event,
17062 .setup = alc861vd_lenovo_setup,
17063 .init_hook = alc861vd_lenovo_init_hook,
17064 },
17065 };
17066
17067 /*
17068 * BIOS auto configuration
17069 */
17070 static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
17071 const struct auto_pin_cfg *cfg)
17072 {
17073 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x22, 0);
17074 }
17075
17076
17077 static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
17078 hda_nid_t nid, int pin_type, int dac_idx)
17079 {
17080 alc_set_pin_output(codec, nid, pin_type);
17081 }
17082
17083 static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
17084 {
17085 struct alc_spec *spec = codec->spec;
17086 int i;
17087
17088 for (i = 0; i <= HDA_SIDE; i++) {
17089 hda_nid_t nid = spec->autocfg.line_out_pins[i];
17090 int pin_type = get_pin_type(spec->autocfg.line_out_type);
17091 if (nid)
17092 alc861vd_auto_set_output_and_unmute(codec, nid,
17093 pin_type, i);
17094 }
17095 }
17096
17097
17098 static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
17099 {
17100 struct alc_spec *spec = codec->spec;
17101 hda_nid_t pin;
17102
17103 pin = spec->autocfg.hp_pins[0];
17104 if (pin) /* connect to front and use dac 0 */
17105 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
17106 pin = spec->autocfg.speaker_pins[0];
17107 if (pin)
17108 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
17109 }
17110
17111 #define ALC861VD_PIN_CD_NID ALC880_PIN_CD_NID
17112
17113 static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
17114 {
17115 struct alc_spec *spec = codec->spec;
17116 struct auto_pin_cfg *cfg = &spec->autocfg;
17117 int i;
17118
17119 for (i = 0; i < cfg->num_inputs; i++) {
17120 hda_nid_t nid = cfg->inputs[i].pin;
17121 if (alc_is_input_pin(codec, nid)) {
17122 alc_set_input_pin(codec, nid, cfg->inputs[i].type);
17123 if (nid != ALC861VD_PIN_CD_NID &&
17124 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
17125 snd_hda_codec_write(codec, nid, 0,
17126 AC_VERB_SET_AMP_GAIN_MUTE,
17127 AMP_OUT_MUTE);
17128 }
17129 }
17130 }
17131
17132 #define alc861vd_auto_init_input_src alc882_auto_init_input_src
17133
17134 #define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02)
17135 #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c)
17136
17137 /* add playback controls from the parsed DAC table */
17138 /* Based on ALC880 version. But ALC861VD has separate,
17139 * different NIDs for mute/unmute switch and volume control */
17140 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
17141 const struct auto_pin_cfg *cfg)
17142 {
17143 static const char * const chname[4] = {
17144 "Front", "Surround", "CLFE", "Side"
17145 };
17146 const char *pfx = alc_get_line_out_pfx(cfg, true);
17147 hda_nid_t nid_v, nid_s;
17148 int i, err;
17149
17150 for (i = 0; i < cfg->line_outs; i++) {
17151 if (!spec->multiout.dac_nids[i])
17152 continue;
17153 nid_v = alc861vd_idx_to_mixer_vol(
17154 alc880_dac_to_idx(
17155 spec->multiout.dac_nids[i]));
17156 nid_s = alc861vd_idx_to_mixer_switch(
17157 alc880_dac_to_idx(
17158 spec->multiout.dac_nids[i]));
17159
17160 if (!pfx && i == 2) {
17161 /* Center/LFE */
17162 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
17163 "Center",
17164 HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
17165 HDA_OUTPUT));
17166 if (err < 0)
17167 return err;
17168 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
17169 "LFE",
17170 HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
17171 HDA_OUTPUT));
17172 if (err < 0)
17173 return err;
17174 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
17175 "Center",
17176 HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
17177 HDA_INPUT));
17178 if (err < 0)
17179 return err;
17180 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
17181 "LFE",
17182 HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
17183 HDA_INPUT));
17184 if (err < 0)
17185 return err;
17186 } else {
17187 const char *name = pfx;
17188 if (!name)
17189 name = chname[i];
17190 err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
17191 name, i,
17192 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
17193 HDA_OUTPUT));
17194 if (err < 0)
17195 return err;
17196 err = __add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
17197 name, i,
17198 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
17199 HDA_INPUT));
17200 if (err < 0)
17201 return err;
17202 }
17203 }
17204 return 0;
17205 }
17206
17207 /* add playback controls for speaker and HP outputs */
17208 /* Based on ALC880 version. But ALC861VD has separate,
17209 * different NIDs for mute/unmute switch and volume control */
17210 static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
17211 hda_nid_t pin, const char *pfx)
17212 {
17213 hda_nid_t nid_v, nid_s;
17214 int err;
17215
17216 if (!pin)
17217 return 0;
17218
17219 if (alc880_is_fixed_pin(pin)) {
17220 nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
17221 /* specify the DAC as the extra output */
17222 if (!spec->multiout.hp_nid)
17223 spec->multiout.hp_nid = nid_v;
17224 else
17225 spec->multiout.extra_out_nid[0] = nid_v;
17226 /* control HP volume/switch on the output mixer amp */
17227 nid_v = alc861vd_idx_to_mixer_vol(
17228 alc880_fixed_pin_idx(pin));
17229 nid_s = alc861vd_idx_to_mixer_switch(
17230 alc880_fixed_pin_idx(pin));
17231
17232 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
17233 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
17234 if (err < 0)
17235 return err;
17236 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
17237 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
17238 if (err < 0)
17239 return err;
17240 } else if (alc880_is_multi_pin(pin)) {
17241 /* set manual connection */
17242 /* we have only a switch on HP-out PIN */
17243 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
17244 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
17245 if (err < 0)
17246 return err;
17247 }
17248 return 0;
17249 }
17250
17251 /* parse the BIOS configuration and set up the alc_spec
17252 * return 1 if successful, 0 if the proper config is not found,
17253 * or a negative error code
17254 * Based on ALC880 version - had to change it to override
17255 * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
17256 static int alc861vd_parse_auto_config(struct hda_codec *codec)
17257 {
17258 struct alc_spec *spec = codec->spec;
17259 int err;
17260 static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
17261
17262 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
17263 alc861vd_ignore);
17264 if (err < 0)
17265 return err;
17266 if (!spec->autocfg.line_outs)
17267 return 0; /* can't find valid BIOS pin config */
17268
17269 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
17270 if (err < 0)
17271 return err;
17272 err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
17273 if (err < 0)
17274 return err;
17275 err = alc861vd_auto_create_extra_out(spec,
17276 spec->autocfg.speaker_pins[0],
17277 "Speaker");
17278 if (err < 0)
17279 return err;
17280 err = alc861vd_auto_create_extra_out(spec,
17281 spec->autocfg.hp_pins[0],
17282 "Headphone");
17283 if (err < 0)
17284 return err;
17285 err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
17286 if (err < 0)
17287 return err;
17288
17289 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
17290
17291 alc_auto_parse_digital(codec);
17292
17293 if (spec->kctls.list)
17294 add_mixer(spec, spec->kctls.list);
17295
17296 add_verb(spec, alc861vd_volume_init_verbs);
17297
17298 spec->num_mux_defs = 1;
17299 spec->input_mux = &spec->private_imux[0];
17300
17301 err = alc_auto_add_mic_boost(codec);
17302 if (err < 0)
17303 return err;
17304
17305 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
17306
17307 return 1;
17308 }
17309
17310 /* additional initialization for auto-configuration model */
17311 static void alc861vd_auto_init(struct hda_codec *codec)
17312 {
17313 struct alc_spec *spec = codec->spec;
17314 alc861vd_auto_init_multi_out(codec);
17315 alc861vd_auto_init_hp_out(codec);
17316 alc861vd_auto_init_analog_input(codec);
17317 alc861vd_auto_init_input_src(codec);
17318 alc_auto_init_digital(codec);
17319 if (spec->unsol_event)
17320 alc_inithook(codec);
17321 }
17322
17323 enum {
17324 ALC660VD_FIX_ASUS_GPIO1
17325 };
17326
17327 /* reset GPIO1 */
17328 static const struct alc_fixup alc861vd_fixups[] = {
17329 [ALC660VD_FIX_ASUS_GPIO1] = {
17330 .type = ALC_FIXUP_VERBS,
17331 .v.verbs = (const struct hda_verb[]) {
17332 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
17333 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
17334 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
17335 { }
17336 }
17337 },
17338 };
17339
17340 static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
17341 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
17342 {}
17343 };
17344
17345 static int patch_alc861vd(struct hda_codec *codec)
17346 {
17347 struct alc_spec *spec;
17348 int err, board_config;
17349
17350 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
17351 if (spec == NULL)
17352 return -ENOMEM;
17353
17354 codec->spec = spec;
17355
17356 board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
17357 alc861vd_models,
17358 alc861vd_cfg_tbl);
17359
17360 if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
17361 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
17362 codec->chip_name);
17363 board_config = ALC861VD_AUTO;
17364 }
17365
17366 if (board_config == ALC861VD_AUTO) {
17367 alc_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
17368 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
17369 }
17370
17371 if (board_config == ALC861VD_AUTO) {
17372 /* automatic parse from the BIOS config */
17373 err = alc861vd_parse_auto_config(codec);
17374 if (err < 0) {
17375 alc_free(codec);
17376 return err;
17377 } else if (!err) {
17378 printk(KERN_INFO
17379 "hda_codec: Cannot set up configuration "
17380 "from BIOS. Using base mode...\n");
17381 board_config = ALC861VD_3ST;
17382 }
17383 }
17384
17385 err = snd_hda_attach_beep_device(codec, 0x23);
17386 if (err < 0) {
17387 alc_free(codec);
17388 return err;
17389 }
17390
17391 if (board_config != ALC861VD_AUTO)
17392 setup_preset(codec, &alc861vd_presets[board_config]);
17393
17394 if (codec->vendor_id == 0x10ec0660) {
17395 /* always turn on EAPD */
17396 add_verb(spec, alc660vd_eapd_verbs);
17397 }
17398
17399 spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
17400 spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
17401
17402 spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
17403 spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
17404
17405 if (!spec->adc_nids) {
17406 spec->adc_nids = alc861vd_adc_nids;
17407 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
17408 }
17409 if (!spec->capsrc_nids)
17410 spec->capsrc_nids = alc861vd_capsrc_nids;
17411
17412 set_capture_mixer(codec);
17413 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
17414
17415 spec->vmaster_nid = 0x02;
17416
17417 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
17418
17419 codec->patch_ops = alc_patch_ops;
17420
17421 if (board_config == ALC861VD_AUTO)
17422 spec->init_hook = alc861vd_auto_init;
17423 #ifdef CONFIG_SND_HDA_POWER_SAVE
17424 if (!spec->loopback.amplist)
17425 spec->loopback.amplist = alc861vd_loopbacks;
17426 #endif
17427
17428 return 0;
17429 }
17430
17431 /*
17432 * ALC662 support
17433 *
17434 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
17435 * configuration. Each pin widget can choose any input DACs and a mixer.
17436 * Each ADC is connected from a mixer of all inputs. This makes possible
17437 * 6-channel independent captures.
17438 *
17439 * In addition, an independent DAC for the multi-playback (not used in this
17440 * driver yet).
17441 */
17442 #define ALC662_DIGOUT_NID 0x06
17443 #define ALC662_DIGIN_NID 0x0a
17444
17445 static hda_nid_t alc662_dac_nids[4] = {
17446 /* front, rear, clfe, rear_surr */
17447 0x02, 0x03, 0x04
17448 };
17449
17450 static hda_nid_t alc272_dac_nids[2] = {
17451 0x02, 0x03
17452 };
17453
17454 static hda_nid_t alc662_adc_nids[2] = {
17455 /* ADC1-2 */
17456 0x09, 0x08
17457 };
17458
17459 static hda_nid_t alc272_adc_nids[1] = {
17460 /* ADC1-2 */
17461 0x08,
17462 };
17463
17464 static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
17465 static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
17466
17467
17468 /* input MUX */
17469 /* FIXME: should be a matrix-type input source selection */
17470 static struct hda_input_mux alc662_capture_source = {
17471 .num_items = 4,
17472 .items = {
17473 { "Mic", 0x0 },
17474 { "Front Mic", 0x1 },
17475 { "Line", 0x2 },
17476 { "CD", 0x4 },
17477 },
17478 };
17479
17480 static struct hda_input_mux alc662_lenovo_101e_capture_source = {
17481 .num_items = 2,
17482 .items = {
17483 { "Mic", 0x1 },
17484 { "Line", 0x2 },
17485 },
17486 };
17487
17488 static struct hda_input_mux alc663_capture_source = {
17489 .num_items = 3,
17490 .items = {
17491 { "Mic", 0x0 },
17492 { "Front Mic", 0x1 },
17493 { "Line", 0x2 },
17494 },
17495 };
17496
17497 #if 0 /* set to 1 for testing other input sources below */
17498 static struct hda_input_mux alc272_nc10_capture_source = {
17499 .num_items = 16,
17500 .items = {
17501 { "Autoselect Mic", 0x0 },
17502 { "Internal Mic", 0x1 },
17503 { "In-0x02", 0x2 },
17504 { "In-0x03", 0x3 },
17505 { "In-0x04", 0x4 },
17506 { "In-0x05", 0x5 },
17507 { "In-0x06", 0x6 },
17508 { "In-0x07", 0x7 },
17509 { "In-0x08", 0x8 },
17510 { "In-0x09", 0x9 },
17511 { "In-0x0a", 0x0a },
17512 { "In-0x0b", 0x0b },
17513 { "In-0x0c", 0x0c },
17514 { "In-0x0d", 0x0d },
17515 { "In-0x0e", 0x0e },
17516 { "In-0x0f", 0x0f },
17517 },
17518 };
17519 #endif
17520
17521 /*
17522 * 2ch mode
17523 */
17524 static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
17525 { 2, NULL }
17526 };
17527
17528 /*
17529 * 2ch mode
17530 */
17531 static struct hda_verb alc662_3ST_ch2_init[] = {
17532 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
17533 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
17534 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
17535 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
17536 { } /* end */
17537 };
17538
17539 /*
17540 * 6ch mode
17541 */
17542 static struct hda_verb alc662_3ST_ch6_init[] = {
17543 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17544 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
17545 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
17546 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17547 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
17548 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
17549 { } /* end */
17550 };
17551
17552 static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
17553 { 2, alc662_3ST_ch2_init },
17554 { 6, alc662_3ST_ch6_init },
17555 };
17556
17557 /*
17558 * 2ch mode
17559 */
17560 static struct hda_verb alc662_sixstack_ch6_init[] = {
17561 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
17562 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
17563 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17564 { } /* end */
17565 };
17566
17567 /*
17568 * 6ch mode
17569 */
17570 static struct hda_verb alc662_sixstack_ch8_init[] = {
17571 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17572 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17573 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17574 { } /* end */
17575 };
17576
17577 static struct hda_channel_mode alc662_5stack_modes[2] = {
17578 { 2, alc662_sixstack_ch6_init },
17579 { 6, alc662_sixstack_ch8_init },
17580 };
17581
17582 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
17583 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
17584 */
17585
17586 static struct snd_kcontrol_new alc662_base_mixer[] = {
17587 /* output mixer control */
17588 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
17589 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
17590 HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
17591 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
17592 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
17593 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
17594 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
17595 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
17596 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17597
17598 /*Input mixer control */
17599 HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
17600 HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
17601 HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
17602 HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
17603 HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
17604 HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
17605 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
17606 HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
17607 { } /* end */
17608 };
17609
17610 static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
17611 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17612 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
17613 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17614 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
17615 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
17616 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17617 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17618 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17619 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17620 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17621 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17622 { } /* end */
17623 };
17624
17625 static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
17626 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17627 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
17628 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17629 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
17630 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
17631 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
17632 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
17633 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
17634 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17635 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
17636 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
17637 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17638 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17639 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17640 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17641 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17642 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17643 { } /* end */
17644 };
17645
17646 static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
17647 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17648 HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
17649 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17650 HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
17651 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17652 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17653 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17654 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17655 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17656 { } /* end */
17657 };
17658
17659 static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
17660 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17661 ALC262_HIPPO_MASTER_SWITCH,
17662
17663 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
17664 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17665 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17666
17667 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
17668 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17669 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17670 { } /* end */
17671 };
17672
17673 static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
17674 ALC262_HIPPO_MASTER_SWITCH,
17675 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17676 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17677 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
17678 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
17679 HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
17680 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17681 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17682 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17683 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17684 { } /* end */
17685 };
17686
17687 static struct hda_bind_ctls alc663_asus_bind_master_vol = {
17688 .ops = &snd_hda_bind_vol,
17689 .values = {
17690 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
17691 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
17692 0
17693 },
17694 };
17695
17696 static struct hda_bind_ctls alc663_asus_one_bind_switch = {
17697 .ops = &snd_hda_bind_sw,
17698 .values = {
17699 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17700 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
17701 0
17702 },
17703 };
17704
17705 static struct snd_kcontrol_new alc663_m51va_mixer[] = {
17706 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17707 HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
17708 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17709 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17710 { } /* end */
17711 };
17712
17713 static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
17714 .ops = &snd_hda_bind_sw,
17715 .values = {
17716 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17717 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
17718 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
17719 0
17720 },
17721 };
17722
17723 static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
17724 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17725 HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
17726 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17727 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17728 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17729 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17730
17731 { } /* end */
17732 };
17733
17734 static struct hda_bind_ctls alc663_asus_four_bind_switch = {
17735 .ops = &snd_hda_bind_sw,
17736 .values = {
17737 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17738 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
17739 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
17740 0
17741 },
17742 };
17743
17744 static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
17745 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17746 HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
17747 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17748 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17749 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17750 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17751 { } /* end */
17752 };
17753
17754 static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
17755 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17756 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17757 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17758 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17759 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17760 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17761 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17762 { } /* end */
17763 };
17764
17765 static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
17766 .ops = &snd_hda_bind_vol,
17767 .values = {
17768 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
17769 HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
17770 0
17771 },
17772 };
17773
17774 static struct hda_bind_ctls alc663_asus_two_bind_switch = {
17775 .ops = &snd_hda_bind_sw,
17776 .values = {
17777 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17778 HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
17779 0
17780 },
17781 };
17782
17783 static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
17784 HDA_BIND_VOL("Master Playback Volume",
17785 &alc663_asus_two_bind_master_vol),
17786 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
17787 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17788 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17789 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17790 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17791 { } /* end */
17792 };
17793
17794 static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
17795 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17796 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
17797 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17798 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17799 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17800 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17801 { } /* end */
17802 };
17803
17804 static struct snd_kcontrol_new alc663_g71v_mixer[] = {
17805 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17806 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17807 HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17808 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17809 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17810
17811 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17812 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17813 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17814 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17815 { } /* end */
17816 };
17817
17818 static struct snd_kcontrol_new alc663_g50v_mixer[] = {
17819 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17820 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17821 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17822
17823 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17824 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17825 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17826 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17827 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17828 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17829 { } /* end */
17830 };
17831
17832 static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
17833 .ops = &snd_hda_bind_sw,
17834 .values = {
17835 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17836 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
17837 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17838 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
17839 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
17840 0
17841 },
17842 };
17843
17844 static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
17845 .ops = &snd_hda_bind_sw,
17846 .values = {
17847 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17848 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17849 0
17850 },
17851 };
17852
17853 static struct snd_kcontrol_new alc663_mode7_mixer[] = {
17854 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17855 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17856 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17857 HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17858 HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17859 HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17860 HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17861 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17862 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17863 { } /* end */
17864 };
17865
17866 static struct snd_kcontrol_new alc663_mode8_mixer[] = {
17867 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17868 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17869 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17870 HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17871 HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17872 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17873 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17874 { } /* end */
17875 };
17876
17877
17878 static struct snd_kcontrol_new alc662_chmode_mixer[] = {
17879 {
17880 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
17881 .name = "Channel Mode",
17882 .info = alc_ch_mode_info,
17883 .get = alc_ch_mode_get,
17884 .put = alc_ch_mode_put,
17885 },
17886 { } /* end */
17887 };
17888
17889 static struct hda_verb alc662_init_verbs[] = {
17890 /* ADC: mute amp left and right */
17891 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17892 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
17893
17894 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17895 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17896 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17897 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17898 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17899 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17900
17901 /* Front Pin: output 0 (0x0c) */
17902 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17903 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17904
17905 /* Rear Pin: output 1 (0x0d) */
17906 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17907 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17908
17909 /* CLFE Pin: output 2 (0x0e) */
17910 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17911 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17912
17913 /* Mic (rear) pin: input vref at 80% */
17914 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17915 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17916 /* Front Mic pin: input vref at 80% */
17917 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17918 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17919 /* Line In pin: input */
17920 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17921 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17922 /* Line-2 In: Headphone output (output 0 - 0x0c) */
17923 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17924 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17925 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
17926 /* CD pin widget for input */
17927 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17928
17929 /* FIXME: use matrix-type input source selection */
17930 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
17931 /* Input mixer */
17932 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17933 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17934
17935 /* always trun on EAPD */
17936 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
17937 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
17938
17939 { }
17940 };
17941
17942 static struct hda_verb alc663_init_verbs[] = {
17943 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17944 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17945 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17946 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17947 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17948 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17949 { }
17950 };
17951
17952 static struct hda_verb alc272_init_verbs[] = {
17953 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17954 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17955 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17956 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17957 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17958 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17959 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17960 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17961 { }
17962 };
17963
17964 static struct hda_verb alc662_sue_init_verbs[] = {
17965 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17966 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17967 {}
17968 };
17969
17970 static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
17971 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17972 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17973 {}
17974 };
17975
17976 /* Set Unsolicited Event*/
17977 static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
17978 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17979 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17980 {}
17981 };
17982
17983 static struct hda_verb alc663_m51va_init_verbs[] = {
17984 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17985 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17986 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17987 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17988 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17989 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17990 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17991 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17992 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17993 {}
17994 };
17995
17996 static struct hda_verb alc663_21jd_amic_init_verbs[] = {
17997 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17998 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17999 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
18000 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
18001 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
18002 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
18003 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
18004 {}
18005 };
18006
18007 static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
18008 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18009 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18010 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18011 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
18012 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
18013 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
18014 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
18015 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
18016 {}
18017 };
18018
18019 static struct hda_verb alc663_15jd_amic_init_verbs[] = {
18020 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18021 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18022 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
18023 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
18024 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
18025 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
18026 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
18027 {}
18028 };
18029
18030 static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
18031 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18032 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18033 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18034 {0x21, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
18035 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18036 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18037 {0x15, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
18038 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
18039 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
18040 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
18041 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
18042 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
18043 {}
18044 };
18045
18046 static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
18047 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18048 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18049 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18050 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
18051 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18052 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18053 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
18054 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
18055 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
18056 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
18057 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
18058 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
18059 {}
18060 };
18061
18062 static struct hda_verb alc663_g71v_init_verbs[] = {
18063 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18064 /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
18065 /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
18066
18067 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18068 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18069 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
18070
18071 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
18072 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
18073 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
18074 {}
18075 };
18076
18077 static struct hda_verb alc663_g50v_init_verbs[] = {
18078 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18079 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18080 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
18081
18082 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
18083 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
18084 {}
18085 };
18086
18087 static struct hda_verb alc662_ecs_init_verbs[] = {
18088 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
18089 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
18090 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
18091 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
18092 {}
18093 };
18094
18095 static struct hda_verb alc272_dell_zm1_init_verbs[] = {
18096 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18097 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18098 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18099 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18100 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18101 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18102 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
18103 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
18104 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
18105 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
18106 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
18107 {}
18108 };
18109
18110 static struct hda_verb alc272_dell_init_verbs[] = {
18111 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18112 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18113 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18114 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18115 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18116 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18117 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
18118 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
18119 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
18120 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
18121 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
18122 {}
18123 };
18124
18125 static struct hda_verb alc663_mode7_init_verbs[] = {
18126 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18127 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18128 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
18129 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18130 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18131 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18132 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
18133 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18134 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18135 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
18136 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
18137 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
18138 {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
18139 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
18140 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
18141 {}
18142 };
18143
18144 static struct hda_verb alc663_mode8_init_verbs[] = {
18145 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18146 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18147 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18148 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
18149 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18150 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
18151 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18152 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
18153 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
18154 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
18155 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
18156 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
18157 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
18158 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
18159 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
18160 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
18161 {}
18162 };
18163
18164 static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
18165 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
18166 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
18167 { } /* end */
18168 };
18169
18170 static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
18171 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
18172 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
18173 { } /* end */
18174 };
18175
18176 static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
18177 {
18178 unsigned int present;
18179 unsigned char bits;
18180
18181 present = snd_hda_jack_detect(codec, 0x14);
18182 bits = present ? HDA_AMP_MUTE : 0;
18183
18184 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
18185 HDA_AMP_MUTE, bits);
18186 }
18187
18188 static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
18189 {
18190 unsigned int present;
18191 unsigned char bits;
18192
18193 present = snd_hda_jack_detect(codec, 0x1b);
18194 bits = present ? HDA_AMP_MUTE : 0;
18195
18196 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
18197 HDA_AMP_MUTE, bits);
18198 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
18199 HDA_AMP_MUTE, bits);
18200 }
18201
18202 static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
18203 unsigned int res)
18204 {
18205 if ((res >> 26) == ALC880_HP_EVENT)
18206 alc662_lenovo_101e_all_automute(codec);
18207 if ((res >> 26) == ALC880_FRONT_EVENT)
18208 alc662_lenovo_101e_ispeaker_automute(codec);
18209 }
18210
18211 /* unsolicited event for HP jack sensing */
18212 static void alc662_eeepc_unsol_event(struct hda_codec *codec,
18213 unsigned int res)
18214 {
18215 if ((res >> 26) == ALC880_MIC_EVENT)
18216 alc_mic_automute(codec);
18217 else
18218 alc262_hippo_unsol_event(codec, res);
18219 }
18220
18221 static void alc662_eeepc_setup(struct hda_codec *codec)
18222 {
18223 struct alc_spec *spec = codec->spec;
18224
18225 alc262_hippo1_setup(codec);
18226 spec->ext_mic.pin = 0x18;
18227 spec->ext_mic.mux_idx = 0;
18228 spec->int_mic.pin = 0x19;
18229 spec->int_mic.mux_idx = 1;
18230 spec->auto_mic = 1;
18231 }
18232
18233 static void alc662_eeepc_inithook(struct hda_codec *codec)
18234 {
18235 alc262_hippo_automute(codec);
18236 alc_mic_automute(codec);
18237 }
18238
18239 static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
18240 {
18241 struct alc_spec *spec = codec->spec;
18242
18243 spec->autocfg.hp_pins[0] = 0x14;
18244 spec->autocfg.speaker_pins[0] = 0x1b;
18245 }
18246
18247 #define alc662_eeepc_ep20_inithook alc262_hippo_master_update
18248
18249 static void alc663_m51va_speaker_automute(struct hda_codec *codec)
18250 {
18251 unsigned int present;
18252 unsigned char bits;
18253
18254 present = snd_hda_jack_detect(codec, 0x21);
18255 bits = present ? HDA_AMP_MUTE : 0;
18256 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
18257 HDA_AMP_MUTE, bits);
18258 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
18259 HDA_AMP_MUTE, bits);
18260 }
18261
18262 static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
18263 {
18264 unsigned int present;
18265 unsigned char bits;
18266
18267 present = snd_hda_jack_detect(codec, 0x21);
18268 bits = present ? HDA_AMP_MUTE : 0;
18269 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
18270 HDA_AMP_MUTE, bits);
18271 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
18272 HDA_AMP_MUTE, bits);
18273 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
18274 HDA_AMP_MUTE, bits);
18275 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
18276 HDA_AMP_MUTE, bits);
18277 }
18278
18279 static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
18280 {
18281 unsigned int present;
18282 unsigned char bits;
18283
18284 present = snd_hda_jack_detect(codec, 0x15);
18285 bits = present ? HDA_AMP_MUTE : 0;
18286 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
18287 HDA_AMP_MUTE, bits);
18288 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
18289 HDA_AMP_MUTE, bits);
18290 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
18291 HDA_AMP_MUTE, bits);
18292 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
18293 HDA_AMP_MUTE, bits);
18294 }
18295
18296 static void alc662_f5z_speaker_automute(struct hda_codec *codec)
18297 {
18298 unsigned int present;
18299 unsigned char bits;
18300
18301 present = snd_hda_jack_detect(codec, 0x1b);
18302 bits = present ? 0 : PIN_OUT;
18303 snd_hda_codec_write(codec, 0x14, 0,
18304 AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
18305 }
18306
18307 static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
18308 {
18309 unsigned int present1, present2;
18310
18311 present1 = snd_hda_jack_detect(codec, 0x21);
18312 present2 = snd_hda_jack_detect(codec, 0x15);
18313
18314 if (present1 || present2) {
18315 snd_hda_codec_write_cache(codec, 0x14, 0,
18316 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
18317 } else {
18318 snd_hda_codec_write_cache(codec, 0x14, 0,
18319 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
18320 }
18321 }
18322
18323 static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
18324 {
18325 unsigned int present1, present2;
18326
18327 present1 = snd_hda_jack_detect(codec, 0x1b);
18328 present2 = snd_hda_jack_detect(codec, 0x15);
18329
18330 if (present1 || present2) {
18331 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
18332 HDA_AMP_MUTE, HDA_AMP_MUTE);
18333 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
18334 HDA_AMP_MUTE, HDA_AMP_MUTE);
18335 } else {
18336 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
18337 HDA_AMP_MUTE, 0);
18338 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
18339 HDA_AMP_MUTE, 0);
18340 }
18341 }
18342
18343 static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
18344 {
18345 unsigned int present1, present2;
18346
18347 present1 = snd_hda_codec_read(codec, 0x1b, 0,
18348 AC_VERB_GET_PIN_SENSE, 0)
18349 & AC_PINSENSE_PRESENCE;
18350 present2 = snd_hda_codec_read(codec, 0x21, 0,
18351 AC_VERB_GET_PIN_SENSE, 0)
18352 & AC_PINSENSE_PRESENCE;
18353
18354 if (present1 || present2) {
18355 snd_hda_codec_write_cache(codec, 0x14, 0,
18356 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
18357 snd_hda_codec_write_cache(codec, 0x17, 0,
18358 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
18359 } else {
18360 snd_hda_codec_write_cache(codec, 0x14, 0,
18361 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
18362 snd_hda_codec_write_cache(codec, 0x17, 0,
18363 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
18364 }
18365 }
18366
18367 static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
18368 {
18369 unsigned int present1, present2;
18370
18371 present1 = snd_hda_codec_read(codec, 0x21, 0,
18372 AC_VERB_GET_PIN_SENSE, 0)
18373 & AC_PINSENSE_PRESENCE;
18374 present2 = snd_hda_codec_read(codec, 0x15, 0,
18375 AC_VERB_GET_PIN_SENSE, 0)
18376 & AC_PINSENSE_PRESENCE;
18377
18378 if (present1 || present2) {
18379 snd_hda_codec_write_cache(codec, 0x14, 0,
18380 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
18381 snd_hda_codec_write_cache(codec, 0x17, 0,
18382 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
18383 } else {
18384 snd_hda_codec_write_cache(codec, 0x14, 0,
18385 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
18386 snd_hda_codec_write_cache(codec, 0x17, 0,
18387 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
18388 }
18389 }
18390
18391 static void alc663_m51va_unsol_event(struct hda_codec *codec,
18392 unsigned int res)
18393 {
18394 switch (res >> 26) {
18395 case ALC880_HP_EVENT:
18396 alc663_m51va_speaker_automute(codec);
18397 break;
18398 case ALC880_MIC_EVENT:
18399 alc_mic_automute(codec);
18400 break;
18401 }
18402 }
18403
18404 static void alc663_m51va_setup(struct hda_codec *codec)
18405 {
18406 struct alc_spec *spec = codec->spec;
18407 spec->ext_mic.pin = 0x18;
18408 spec->ext_mic.mux_idx = 0;
18409 spec->int_mic.pin = 0x12;
18410 spec->int_mic.mux_idx = 9;
18411 spec->auto_mic = 1;
18412 }
18413
18414 static void alc663_m51va_inithook(struct hda_codec *codec)
18415 {
18416 alc663_m51va_speaker_automute(codec);
18417 alc_mic_automute(codec);
18418 }
18419
18420 /* ***************** Mode1 ******************************/
18421 #define alc663_mode1_unsol_event alc663_m51va_unsol_event
18422
18423 static void alc663_mode1_setup(struct hda_codec *codec)
18424 {
18425 struct alc_spec *spec = codec->spec;
18426 spec->ext_mic.pin = 0x18;
18427 spec->ext_mic.mux_idx = 0;
18428 spec->int_mic.pin = 0x19;
18429 spec->int_mic.mux_idx = 1;
18430 spec->auto_mic = 1;
18431 }
18432
18433 #define alc663_mode1_inithook alc663_m51va_inithook
18434
18435 /* ***************** Mode2 ******************************/
18436 static void alc662_mode2_unsol_event(struct hda_codec *codec,
18437 unsigned int res)
18438 {
18439 switch (res >> 26) {
18440 case ALC880_HP_EVENT:
18441 alc662_f5z_speaker_automute(codec);
18442 break;
18443 case ALC880_MIC_EVENT:
18444 alc_mic_automute(codec);
18445 break;
18446 }
18447 }
18448
18449 #define alc662_mode2_setup alc663_mode1_setup
18450
18451 static void alc662_mode2_inithook(struct hda_codec *codec)
18452 {
18453 alc662_f5z_speaker_automute(codec);
18454 alc_mic_automute(codec);
18455 }
18456 /* ***************** Mode3 ******************************/
18457 static void alc663_mode3_unsol_event(struct hda_codec *codec,
18458 unsigned int res)
18459 {
18460 switch (res >> 26) {
18461 case ALC880_HP_EVENT:
18462 alc663_two_hp_m1_speaker_automute(codec);
18463 break;
18464 case ALC880_MIC_EVENT:
18465 alc_mic_automute(codec);
18466 break;
18467 }
18468 }
18469
18470 #define alc663_mode3_setup alc663_mode1_setup
18471
18472 static void alc663_mode3_inithook(struct hda_codec *codec)
18473 {
18474 alc663_two_hp_m1_speaker_automute(codec);
18475 alc_mic_automute(codec);
18476 }
18477 /* ***************** Mode4 ******************************/
18478 static void alc663_mode4_unsol_event(struct hda_codec *codec,
18479 unsigned int res)
18480 {
18481 switch (res >> 26) {
18482 case ALC880_HP_EVENT:
18483 alc663_21jd_two_speaker_automute(codec);
18484 break;
18485 case ALC880_MIC_EVENT:
18486 alc_mic_automute(codec);
18487 break;
18488 }
18489 }
18490
18491 #define alc663_mode4_setup alc663_mode1_setup
18492
18493 static void alc663_mode4_inithook(struct hda_codec *codec)
18494 {
18495 alc663_21jd_two_speaker_automute(codec);
18496 alc_mic_automute(codec);
18497 }
18498 /* ***************** Mode5 ******************************/
18499 static void alc663_mode5_unsol_event(struct hda_codec *codec,
18500 unsigned int res)
18501 {
18502 switch (res >> 26) {
18503 case ALC880_HP_EVENT:
18504 alc663_15jd_two_speaker_automute(codec);
18505 break;
18506 case ALC880_MIC_EVENT:
18507 alc_mic_automute(codec);
18508 break;
18509 }
18510 }
18511
18512 #define alc663_mode5_setup alc663_mode1_setup
18513
18514 static void alc663_mode5_inithook(struct hda_codec *codec)
18515 {
18516 alc663_15jd_two_speaker_automute(codec);
18517 alc_mic_automute(codec);
18518 }
18519 /* ***************** Mode6 ******************************/
18520 static void alc663_mode6_unsol_event(struct hda_codec *codec,
18521 unsigned int res)
18522 {
18523 switch (res >> 26) {
18524 case ALC880_HP_EVENT:
18525 alc663_two_hp_m2_speaker_automute(codec);
18526 break;
18527 case ALC880_MIC_EVENT:
18528 alc_mic_automute(codec);
18529 break;
18530 }
18531 }
18532
18533 #define alc663_mode6_setup alc663_mode1_setup
18534
18535 static void alc663_mode6_inithook(struct hda_codec *codec)
18536 {
18537 alc663_two_hp_m2_speaker_automute(codec);
18538 alc_mic_automute(codec);
18539 }
18540
18541 /* ***************** Mode7 ******************************/
18542 static void alc663_mode7_unsol_event(struct hda_codec *codec,
18543 unsigned int res)
18544 {
18545 switch (res >> 26) {
18546 case ALC880_HP_EVENT:
18547 alc663_two_hp_m7_speaker_automute(codec);
18548 break;
18549 case ALC880_MIC_EVENT:
18550 alc_mic_automute(codec);
18551 break;
18552 }
18553 }
18554
18555 #define alc663_mode7_setup alc663_mode1_setup
18556
18557 static void alc663_mode7_inithook(struct hda_codec *codec)
18558 {
18559 alc663_two_hp_m7_speaker_automute(codec);
18560 alc_mic_automute(codec);
18561 }
18562
18563 /* ***************** Mode8 ******************************/
18564 static void alc663_mode8_unsol_event(struct hda_codec *codec,
18565 unsigned int res)
18566 {
18567 switch (res >> 26) {
18568 case ALC880_HP_EVENT:
18569 alc663_two_hp_m8_speaker_automute(codec);
18570 break;
18571 case ALC880_MIC_EVENT:
18572 alc_mic_automute(codec);
18573 break;
18574 }
18575 }
18576
18577 #define alc663_mode8_setup alc663_m51va_setup
18578
18579 static void alc663_mode8_inithook(struct hda_codec *codec)
18580 {
18581 alc663_two_hp_m8_speaker_automute(codec);
18582 alc_mic_automute(codec);
18583 }
18584
18585 static void alc663_g71v_hp_automute(struct hda_codec *codec)
18586 {
18587 unsigned int present;
18588 unsigned char bits;
18589
18590 present = snd_hda_jack_detect(codec, 0x21);
18591 bits = present ? HDA_AMP_MUTE : 0;
18592 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
18593 HDA_AMP_MUTE, bits);
18594 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
18595 HDA_AMP_MUTE, bits);
18596 }
18597
18598 static void alc663_g71v_front_automute(struct hda_codec *codec)
18599 {
18600 unsigned int present;
18601 unsigned char bits;
18602
18603 present = snd_hda_jack_detect(codec, 0x15);
18604 bits = present ? HDA_AMP_MUTE : 0;
18605 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
18606 HDA_AMP_MUTE, bits);
18607 }
18608
18609 static void alc663_g71v_unsol_event(struct hda_codec *codec,
18610 unsigned int res)
18611 {
18612 switch (res >> 26) {
18613 case ALC880_HP_EVENT:
18614 alc663_g71v_hp_automute(codec);
18615 break;
18616 case ALC880_FRONT_EVENT:
18617 alc663_g71v_front_automute(codec);
18618 break;
18619 case ALC880_MIC_EVENT:
18620 alc_mic_automute(codec);
18621 break;
18622 }
18623 }
18624
18625 #define alc663_g71v_setup alc663_m51va_setup
18626
18627 static void alc663_g71v_inithook(struct hda_codec *codec)
18628 {
18629 alc663_g71v_front_automute(codec);
18630 alc663_g71v_hp_automute(codec);
18631 alc_mic_automute(codec);
18632 }
18633
18634 static void alc663_g50v_unsol_event(struct hda_codec *codec,
18635 unsigned int res)
18636 {
18637 switch (res >> 26) {
18638 case ALC880_HP_EVENT:
18639 alc663_m51va_speaker_automute(codec);
18640 break;
18641 case ALC880_MIC_EVENT:
18642 alc_mic_automute(codec);
18643 break;
18644 }
18645 }
18646
18647 #define alc663_g50v_setup alc663_m51va_setup
18648
18649 static void alc663_g50v_inithook(struct hda_codec *codec)
18650 {
18651 alc663_m51va_speaker_automute(codec);
18652 alc_mic_automute(codec);
18653 }
18654
18655 static struct snd_kcontrol_new alc662_ecs_mixer[] = {
18656 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
18657 ALC262_HIPPO_MASTER_SWITCH,
18658
18659 HDA_CODEC_VOLUME("Mic/LineIn Boost Volume", 0x18, 0, HDA_INPUT),
18660 HDA_CODEC_VOLUME("Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
18661 HDA_CODEC_MUTE("Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
18662
18663 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
18664 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
18665 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
18666 { } /* end */
18667 };
18668
18669 static struct snd_kcontrol_new alc272_nc10_mixer[] = {
18670 /* Master Playback automatically created from Speaker and Headphone */
18671 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
18672 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
18673 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
18674 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
18675
18676 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
18677 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
18678 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
18679
18680 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
18681 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
18682 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
18683 { } /* end */
18684 };
18685
18686 #ifdef CONFIG_SND_HDA_POWER_SAVE
18687 #define alc662_loopbacks alc880_loopbacks
18688 #endif
18689
18690
18691 /* pcm configuration: identical with ALC880 */
18692 #define alc662_pcm_analog_playback alc880_pcm_analog_playback
18693 #define alc662_pcm_analog_capture alc880_pcm_analog_capture
18694 #define alc662_pcm_digital_playback alc880_pcm_digital_playback
18695 #define alc662_pcm_digital_capture alc880_pcm_digital_capture
18696
18697 /*
18698 * configuration and preset
18699 */
18700 static const char * const alc662_models[ALC662_MODEL_LAST] = {
18701 [ALC662_3ST_2ch_DIG] = "3stack-dig",
18702 [ALC662_3ST_6ch_DIG] = "3stack-6ch-dig",
18703 [ALC662_3ST_6ch] = "3stack-6ch",
18704 [ALC662_5ST_DIG] = "6stack-dig",
18705 [ALC662_LENOVO_101E] = "lenovo-101e",
18706 [ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
18707 [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
18708 [ALC662_ECS] = "ecs",
18709 [ALC663_ASUS_M51VA] = "m51va",
18710 [ALC663_ASUS_G71V] = "g71v",
18711 [ALC663_ASUS_H13] = "h13",
18712 [ALC663_ASUS_G50V] = "g50v",
18713 [ALC663_ASUS_MODE1] = "asus-mode1",
18714 [ALC662_ASUS_MODE2] = "asus-mode2",
18715 [ALC663_ASUS_MODE3] = "asus-mode3",
18716 [ALC663_ASUS_MODE4] = "asus-mode4",
18717 [ALC663_ASUS_MODE5] = "asus-mode5",
18718 [ALC663_ASUS_MODE6] = "asus-mode6",
18719 [ALC663_ASUS_MODE7] = "asus-mode7",
18720 [ALC663_ASUS_MODE8] = "asus-mode8",
18721 [ALC272_DELL] = "dell",
18722 [ALC272_DELL_ZM1] = "dell-zm1",
18723 [ALC272_SAMSUNG_NC10] = "samsung-nc10",
18724 [ALC662_AUTO] = "auto",
18725 };
18726
18727 static struct snd_pci_quirk alc662_cfg_tbl[] = {
18728 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
18729 SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
18730 SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
18731 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
18732 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
18733 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC663_ASUS_MODE1),
18734 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
18735 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
18736 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
18737 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
18738 SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
18739 SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
18740 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
18741 SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
18742 SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
18743 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
18744 SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
18745 SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
18746 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
18747 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
18748 SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
18749 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
18750 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
18751 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
18752 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
18753 SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
18754 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
18755 SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
18756 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
18757 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
18758 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
18759 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
18760 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
18761 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
18762 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
18763 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
18764 SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
18765 /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
18766 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
18767 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
18768 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
18769 SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC663_ASUS_MODE1),
18770 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
18771 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
18772 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
18773 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
18774 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
18775 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
18776 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
18777 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
18778 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
18779 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
18780 SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
18781 /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
18782 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
18783 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
18784 SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
18785 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
18786 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
18787 SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
18788 SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
18789 SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
18790 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
18791 SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
18792 ALC662_3ST_6ch_DIG),
18793 SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO),
18794 SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
18795 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
18796 ALC662_3ST_6ch_DIG),
18797 SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13),
18798 SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
18799 SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
18800 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
18801 SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
18802 ALC662_3ST_6ch_DIG),
18803 SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
18804 ALC663_ASUS_H13),
18805 {}
18806 };
18807
18808 static struct alc_config_preset alc662_presets[] = {
18809 [ALC662_3ST_2ch_DIG] = {
18810 .mixers = { alc662_3ST_2ch_mixer },
18811 .init_verbs = { alc662_init_verbs },
18812 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18813 .dac_nids = alc662_dac_nids,
18814 .dig_out_nid = ALC662_DIGOUT_NID,
18815 .dig_in_nid = ALC662_DIGIN_NID,
18816 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18817 .channel_mode = alc662_3ST_2ch_modes,
18818 .input_mux = &alc662_capture_source,
18819 },
18820 [ALC662_3ST_6ch_DIG] = {
18821 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18822 .init_verbs = { alc662_init_verbs },
18823 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18824 .dac_nids = alc662_dac_nids,
18825 .dig_out_nid = ALC662_DIGOUT_NID,
18826 .dig_in_nid = ALC662_DIGIN_NID,
18827 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18828 .channel_mode = alc662_3ST_6ch_modes,
18829 .need_dac_fix = 1,
18830 .input_mux = &alc662_capture_source,
18831 },
18832 [ALC662_3ST_6ch] = {
18833 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18834 .init_verbs = { alc662_init_verbs },
18835 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18836 .dac_nids = alc662_dac_nids,
18837 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18838 .channel_mode = alc662_3ST_6ch_modes,
18839 .need_dac_fix = 1,
18840 .input_mux = &alc662_capture_source,
18841 },
18842 [ALC662_5ST_DIG] = {
18843 .mixers = { alc662_base_mixer, alc662_chmode_mixer },
18844 .init_verbs = { alc662_init_verbs },
18845 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18846 .dac_nids = alc662_dac_nids,
18847 .dig_out_nid = ALC662_DIGOUT_NID,
18848 .dig_in_nid = ALC662_DIGIN_NID,
18849 .num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
18850 .channel_mode = alc662_5stack_modes,
18851 .input_mux = &alc662_capture_source,
18852 },
18853 [ALC662_LENOVO_101E] = {
18854 .mixers = { alc662_lenovo_101e_mixer },
18855 .init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
18856 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18857 .dac_nids = alc662_dac_nids,
18858 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18859 .channel_mode = alc662_3ST_2ch_modes,
18860 .input_mux = &alc662_lenovo_101e_capture_source,
18861 .unsol_event = alc662_lenovo_101e_unsol_event,
18862 .init_hook = alc662_lenovo_101e_all_automute,
18863 },
18864 [ALC662_ASUS_EEEPC_P701] = {
18865 .mixers = { alc662_eeepc_p701_mixer },
18866 .init_verbs = { alc662_init_verbs,
18867 alc662_eeepc_sue_init_verbs },
18868 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18869 .dac_nids = alc662_dac_nids,
18870 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18871 .channel_mode = alc662_3ST_2ch_modes,
18872 .unsol_event = alc662_eeepc_unsol_event,
18873 .setup = alc662_eeepc_setup,
18874 .init_hook = alc662_eeepc_inithook,
18875 },
18876 [ALC662_ASUS_EEEPC_EP20] = {
18877 .mixers = { alc662_eeepc_ep20_mixer,
18878 alc662_chmode_mixer },
18879 .init_verbs = { alc662_init_verbs,
18880 alc662_eeepc_ep20_sue_init_verbs },
18881 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18882 .dac_nids = alc662_dac_nids,
18883 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18884 .channel_mode = alc662_3ST_6ch_modes,
18885 .input_mux = &alc662_lenovo_101e_capture_source,
18886 .unsol_event = alc662_eeepc_unsol_event,
18887 .setup = alc662_eeepc_ep20_setup,
18888 .init_hook = alc662_eeepc_ep20_inithook,
18889 },
18890 [ALC662_ECS] = {
18891 .mixers = { alc662_ecs_mixer },
18892 .init_verbs = { alc662_init_verbs,
18893 alc662_ecs_init_verbs },
18894 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18895 .dac_nids = alc662_dac_nids,
18896 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18897 .channel_mode = alc662_3ST_2ch_modes,
18898 .unsol_event = alc662_eeepc_unsol_event,
18899 .setup = alc662_eeepc_setup,
18900 .init_hook = alc662_eeepc_inithook,
18901 },
18902 [ALC663_ASUS_M51VA] = {
18903 .mixers = { alc663_m51va_mixer },
18904 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18905 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18906 .dac_nids = alc662_dac_nids,
18907 .dig_out_nid = ALC662_DIGOUT_NID,
18908 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18909 .channel_mode = alc662_3ST_2ch_modes,
18910 .unsol_event = alc663_m51va_unsol_event,
18911 .setup = alc663_m51va_setup,
18912 .init_hook = alc663_m51va_inithook,
18913 },
18914 [ALC663_ASUS_G71V] = {
18915 .mixers = { alc663_g71v_mixer },
18916 .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
18917 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18918 .dac_nids = alc662_dac_nids,
18919 .dig_out_nid = ALC662_DIGOUT_NID,
18920 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18921 .channel_mode = alc662_3ST_2ch_modes,
18922 .unsol_event = alc663_g71v_unsol_event,
18923 .setup = alc663_g71v_setup,
18924 .init_hook = alc663_g71v_inithook,
18925 },
18926 [ALC663_ASUS_H13] = {
18927 .mixers = { alc663_m51va_mixer },
18928 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18929 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18930 .dac_nids = alc662_dac_nids,
18931 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18932 .channel_mode = alc662_3ST_2ch_modes,
18933 .unsol_event = alc663_m51va_unsol_event,
18934 .init_hook = alc663_m51va_inithook,
18935 },
18936 [ALC663_ASUS_G50V] = {
18937 .mixers = { alc663_g50v_mixer },
18938 .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
18939 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18940 .dac_nids = alc662_dac_nids,
18941 .dig_out_nid = ALC662_DIGOUT_NID,
18942 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18943 .channel_mode = alc662_3ST_6ch_modes,
18944 .input_mux = &alc663_capture_source,
18945 .unsol_event = alc663_g50v_unsol_event,
18946 .setup = alc663_g50v_setup,
18947 .init_hook = alc663_g50v_inithook,
18948 },
18949 [ALC663_ASUS_MODE1] = {
18950 .mixers = { alc663_m51va_mixer },
18951 .cap_mixer = alc662_auto_capture_mixer,
18952 .init_verbs = { alc662_init_verbs,
18953 alc663_21jd_amic_init_verbs },
18954 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18955 .hp_nid = 0x03,
18956 .dac_nids = alc662_dac_nids,
18957 .dig_out_nid = ALC662_DIGOUT_NID,
18958 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18959 .channel_mode = alc662_3ST_2ch_modes,
18960 .unsol_event = alc663_mode1_unsol_event,
18961 .setup = alc663_mode1_setup,
18962 .init_hook = alc663_mode1_inithook,
18963 },
18964 [ALC662_ASUS_MODE2] = {
18965 .mixers = { alc662_1bjd_mixer },
18966 .cap_mixer = alc662_auto_capture_mixer,
18967 .init_verbs = { alc662_init_verbs,
18968 alc662_1bjd_amic_init_verbs },
18969 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18970 .dac_nids = alc662_dac_nids,
18971 .dig_out_nid = ALC662_DIGOUT_NID,
18972 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18973 .channel_mode = alc662_3ST_2ch_modes,
18974 .unsol_event = alc662_mode2_unsol_event,
18975 .setup = alc662_mode2_setup,
18976 .init_hook = alc662_mode2_inithook,
18977 },
18978 [ALC663_ASUS_MODE3] = {
18979 .mixers = { alc663_two_hp_m1_mixer },
18980 .cap_mixer = alc662_auto_capture_mixer,
18981 .init_verbs = { alc662_init_verbs,
18982 alc663_two_hp_amic_m1_init_verbs },
18983 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18984 .hp_nid = 0x03,
18985 .dac_nids = alc662_dac_nids,
18986 .dig_out_nid = ALC662_DIGOUT_NID,
18987 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18988 .channel_mode = alc662_3ST_2ch_modes,
18989 .unsol_event = alc663_mode3_unsol_event,
18990 .setup = alc663_mode3_setup,
18991 .init_hook = alc663_mode3_inithook,
18992 },
18993 [ALC663_ASUS_MODE4] = {
18994 .mixers = { alc663_asus_21jd_clfe_mixer },
18995 .cap_mixer = alc662_auto_capture_mixer,
18996 .init_verbs = { alc662_init_verbs,
18997 alc663_21jd_amic_init_verbs},
18998 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18999 .hp_nid = 0x03,
19000 .dac_nids = alc662_dac_nids,
19001 .dig_out_nid = ALC662_DIGOUT_NID,
19002 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19003 .channel_mode = alc662_3ST_2ch_modes,
19004 .unsol_event = alc663_mode4_unsol_event,
19005 .setup = alc663_mode4_setup,
19006 .init_hook = alc663_mode4_inithook,
19007 },
19008 [ALC663_ASUS_MODE5] = {
19009 .mixers = { alc663_asus_15jd_clfe_mixer },
19010 .cap_mixer = alc662_auto_capture_mixer,
19011 .init_verbs = { alc662_init_verbs,
19012 alc663_15jd_amic_init_verbs },
19013 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
19014 .hp_nid = 0x03,
19015 .dac_nids = alc662_dac_nids,
19016 .dig_out_nid = ALC662_DIGOUT_NID,
19017 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19018 .channel_mode = alc662_3ST_2ch_modes,
19019 .unsol_event = alc663_mode5_unsol_event,
19020 .setup = alc663_mode5_setup,
19021 .init_hook = alc663_mode5_inithook,
19022 },
19023 [ALC663_ASUS_MODE6] = {
19024 .mixers = { alc663_two_hp_m2_mixer },
19025 .cap_mixer = alc662_auto_capture_mixer,
19026 .init_verbs = { alc662_init_verbs,
19027 alc663_two_hp_amic_m2_init_verbs },
19028 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
19029 .hp_nid = 0x03,
19030 .dac_nids = alc662_dac_nids,
19031 .dig_out_nid = ALC662_DIGOUT_NID,
19032 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19033 .channel_mode = alc662_3ST_2ch_modes,
19034 .unsol_event = alc663_mode6_unsol_event,
19035 .setup = alc663_mode6_setup,
19036 .init_hook = alc663_mode6_inithook,
19037 },
19038 [ALC663_ASUS_MODE7] = {
19039 .mixers = { alc663_mode7_mixer },
19040 .cap_mixer = alc662_auto_capture_mixer,
19041 .init_verbs = { alc662_init_verbs,
19042 alc663_mode7_init_verbs },
19043 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
19044 .hp_nid = 0x03,
19045 .dac_nids = alc662_dac_nids,
19046 .dig_out_nid = ALC662_DIGOUT_NID,
19047 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19048 .channel_mode = alc662_3ST_2ch_modes,
19049 .unsol_event = alc663_mode7_unsol_event,
19050 .setup = alc663_mode7_setup,
19051 .init_hook = alc663_mode7_inithook,
19052 },
19053 [ALC663_ASUS_MODE8] = {
19054 .mixers = { alc663_mode8_mixer },
19055 .cap_mixer = alc662_auto_capture_mixer,
19056 .init_verbs = { alc662_init_verbs,
19057 alc663_mode8_init_verbs },
19058 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
19059 .hp_nid = 0x03,
19060 .dac_nids = alc662_dac_nids,
19061 .dig_out_nid = ALC662_DIGOUT_NID,
19062 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19063 .channel_mode = alc662_3ST_2ch_modes,
19064 .unsol_event = alc663_mode8_unsol_event,
19065 .setup = alc663_mode8_setup,
19066 .init_hook = alc663_mode8_inithook,
19067 },
19068 [ALC272_DELL] = {
19069 .mixers = { alc663_m51va_mixer },
19070 .cap_mixer = alc272_auto_capture_mixer,
19071 .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
19072 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
19073 .dac_nids = alc662_dac_nids,
19074 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19075 .adc_nids = alc272_adc_nids,
19076 .num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
19077 .capsrc_nids = alc272_capsrc_nids,
19078 .channel_mode = alc662_3ST_2ch_modes,
19079 .unsol_event = alc663_m51va_unsol_event,
19080 .setup = alc663_m51va_setup,
19081 .init_hook = alc663_m51va_inithook,
19082 },
19083 [ALC272_DELL_ZM1] = {
19084 .mixers = { alc663_m51va_mixer },
19085 .cap_mixer = alc662_auto_capture_mixer,
19086 .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
19087 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
19088 .dac_nids = alc662_dac_nids,
19089 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19090 .adc_nids = alc662_adc_nids,
19091 .num_adc_nids = 1,
19092 .capsrc_nids = alc662_capsrc_nids,
19093 .channel_mode = alc662_3ST_2ch_modes,
19094 .unsol_event = alc663_m51va_unsol_event,
19095 .setup = alc663_m51va_setup,
19096 .init_hook = alc663_m51va_inithook,
19097 },
19098 [ALC272_SAMSUNG_NC10] = {
19099 .mixers = { alc272_nc10_mixer },
19100 .init_verbs = { alc662_init_verbs,
19101 alc663_21jd_amic_init_verbs },
19102 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
19103 .dac_nids = alc272_dac_nids,
19104 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
19105 .channel_mode = alc662_3ST_2ch_modes,
19106 /*.input_mux = &alc272_nc10_capture_source,*/
19107 .unsol_event = alc663_mode4_unsol_event,
19108 .setup = alc663_mode4_setup,
19109 .init_hook = alc663_mode4_inithook,
19110 },
19111 };
19112
19113
19114 /*
19115 * BIOS auto configuration
19116 */
19117
19118 /* convert from MIX nid to DAC */
19119 static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
19120 {
19121 if (nid == 0x0f)
19122 return 0x02;
19123 else if (nid >= 0x0c && nid <= 0x0e)
19124 return nid - 0x0c + 0x02;
19125 else if (nid == 0x26) /* ALC887-VD has this DAC too */
19126 return 0x25;
19127 else
19128 return 0;
19129 }
19130
19131 /* get MIX nid connected to the given pin targeted to DAC */
19132 static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
19133 hda_nid_t dac)
19134 {
19135 hda_nid_t mix[5];
19136 int i, num;
19137
19138 num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
19139 for (i = 0; i < num; i++) {
19140 if (alc662_mix_to_dac(mix[i]) == dac)
19141 return mix[i];
19142 }
19143 return 0;
19144 }
19145
19146 /* look for an empty DAC slot */
19147 static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
19148 {
19149 struct alc_spec *spec = codec->spec;
19150 hda_nid_t srcs[5];
19151 int i, j, num;
19152
19153 num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
19154 if (num < 0)
19155 return 0;
19156 for (i = 0; i < num; i++) {
19157 hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
19158 if (!nid)
19159 continue;
19160 for (j = 0; j < spec->multiout.num_dacs; j++)
19161 if (spec->multiout.dac_nids[j] == nid)
19162 break;
19163 if (j >= spec->multiout.num_dacs)
19164 return nid;
19165 }
19166 return 0;
19167 }
19168
19169 /* fill in the dac_nids table from the parsed pin configuration */
19170 static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
19171 const struct auto_pin_cfg *cfg)
19172 {
19173 struct alc_spec *spec = codec->spec;
19174 int i;
19175 hda_nid_t dac;
19176
19177 spec->multiout.dac_nids = spec->private_dac_nids;
19178 for (i = 0; i < cfg->line_outs; i++) {
19179 dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
19180 if (!dac)
19181 continue;
19182 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
19183 }
19184 return 0;
19185 }
19186
19187 static inline int __alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
19188 hda_nid_t nid, int idx, unsigned int chs)
19189 {
19190 return __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, idx,
19191 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
19192 }
19193
19194 static inline int __alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
19195 hda_nid_t nid, int idx, unsigned int chs)
19196 {
19197 return __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, idx,
19198 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
19199 }
19200
19201 #define alc662_add_vol_ctl(spec, pfx, nid, chs) \
19202 __alc662_add_vol_ctl(spec, pfx, nid, 0, chs)
19203 #define alc662_add_sw_ctl(spec, pfx, nid, chs) \
19204 __alc662_add_sw_ctl(spec, pfx, nid, 0, chs)
19205 #define alc662_add_stereo_vol(spec, pfx, nid) \
19206 alc662_add_vol_ctl(spec, pfx, nid, 3)
19207 #define alc662_add_stereo_sw(spec, pfx, nid) \
19208 alc662_add_sw_ctl(spec, pfx, nid, 3)
19209
19210 /* add playback controls from the parsed DAC table */
19211 static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
19212 const struct auto_pin_cfg *cfg)
19213 {
19214 struct alc_spec *spec = codec->spec;
19215 static const char * const chname[4] = {
19216 "Front", "Surround", NULL /*CLFE*/, "Side"
19217 };
19218 const char *pfx = alc_get_line_out_pfx(cfg, true);
19219 hda_nid_t nid, mix;
19220 int i, err;
19221
19222 for (i = 0; i < cfg->line_outs; i++) {
19223 nid = spec->multiout.dac_nids[i];
19224 if (!nid)
19225 continue;
19226 mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
19227 if (!mix)
19228 continue;
19229 if (!pfx && i == 2) {
19230 /* Center/LFE */
19231 err = alc662_add_vol_ctl(spec, "Center", nid, 1);
19232 if (err < 0)
19233 return err;
19234 err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
19235 if (err < 0)
19236 return err;
19237 err = alc662_add_sw_ctl(spec, "Center", mix, 1);
19238 if (err < 0)
19239 return err;
19240 err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
19241 if (err < 0)
19242 return err;
19243 } else {
19244 const char *name = pfx;
19245 if (!name)
19246 name = chname[i];
19247 err = __alc662_add_vol_ctl(spec, name, nid, i, 3);
19248 if (err < 0)
19249 return err;
19250 err = __alc662_add_sw_ctl(spec, name, mix, i, 3);
19251 if (err < 0)
19252 return err;
19253 }
19254 }
19255 return 0;
19256 }
19257
19258 /* add playback controls for speaker and HP outputs */
19259 /* return DAC nid if any new DAC is assigned */
19260 static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
19261 const char *pfx)
19262 {
19263 struct alc_spec *spec = codec->spec;
19264 hda_nid_t nid, mix;
19265 int err;
19266
19267 if (!pin)
19268 return 0;
19269 nid = alc662_look_for_dac(codec, pin);
19270 if (!nid) {
19271 /* the corresponding DAC is already occupied */
19272 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
19273 return 0; /* no way */
19274 /* create a switch only */
19275 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
19276 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
19277 }
19278
19279 mix = alc662_dac_to_mix(codec, pin, nid);
19280 if (!mix)
19281 return 0;
19282 err = alc662_add_vol_ctl(spec, pfx, nid, 3);
19283 if (err < 0)
19284 return err;
19285 err = alc662_add_sw_ctl(spec, pfx, mix, 3);
19286 if (err < 0)
19287 return err;
19288 return nid;
19289 }
19290
19291 /* create playback/capture controls for input pins */
19292 #define alc662_auto_create_input_ctls \
19293 alc882_auto_create_input_ctls
19294
19295 static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
19296 hda_nid_t nid, int pin_type,
19297 hda_nid_t dac)
19298 {
19299 int i, num;
19300 hda_nid_t srcs[HDA_MAX_CONNECTIONS];
19301
19302 alc_set_pin_output(codec, nid, pin_type);
19303 /* need the manual connection? */
19304 num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
19305 if (num <= 1)
19306 return;
19307 for (i = 0; i < num; i++) {
19308 if (alc662_mix_to_dac(srcs[i]) != dac)
19309 continue;
19310 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
19311 return;
19312 }
19313 }
19314
19315 static void alc662_auto_init_multi_out(struct hda_codec *codec)
19316 {
19317 struct alc_spec *spec = codec->spec;
19318 int pin_type = get_pin_type(spec->autocfg.line_out_type);
19319 int i;
19320
19321 for (i = 0; i <= HDA_SIDE; i++) {
19322 hda_nid_t nid = spec->autocfg.line_out_pins[i];
19323 if (nid)
19324 alc662_auto_set_output_and_unmute(codec, nid, pin_type,
19325 spec->multiout.dac_nids[i]);
19326 }
19327 }
19328
19329 static void alc662_auto_init_hp_out(struct hda_codec *codec)
19330 {
19331 struct alc_spec *spec = codec->spec;
19332 hda_nid_t pin;
19333
19334 pin = spec->autocfg.hp_pins[0];
19335 if (pin)
19336 alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
19337 spec->multiout.hp_nid);
19338 pin = spec->autocfg.speaker_pins[0];
19339 if (pin)
19340 alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
19341 spec->multiout.extra_out_nid[0]);
19342 }
19343
19344 #define ALC662_PIN_CD_NID ALC880_PIN_CD_NID
19345
19346 static void alc662_auto_init_analog_input(struct hda_codec *codec)
19347 {
19348 struct alc_spec *spec = codec->spec;
19349 struct auto_pin_cfg *cfg = &spec->autocfg;
19350 int i;
19351
19352 for (i = 0; i < cfg->num_inputs; i++) {
19353 hda_nid_t nid = cfg->inputs[i].pin;
19354 if (alc_is_input_pin(codec, nid)) {
19355 alc_set_input_pin(codec, nid, cfg->inputs[i].type);
19356 if (nid != ALC662_PIN_CD_NID &&
19357 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
19358 snd_hda_codec_write(codec, nid, 0,
19359 AC_VERB_SET_AMP_GAIN_MUTE,
19360 AMP_OUT_MUTE);
19361 }
19362 }
19363 }
19364
19365 #define alc662_auto_init_input_src alc882_auto_init_input_src
19366
19367 static int alc662_parse_auto_config(struct hda_codec *codec)
19368 {
19369 struct alc_spec *spec = codec->spec;
19370 int err;
19371 static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
19372
19373 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
19374 alc662_ignore);
19375 if (err < 0)
19376 return err;
19377 if (!spec->autocfg.line_outs)
19378 return 0; /* can't find valid BIOS pin config */
19379
19380 err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
19381 if (err < 0)
19382 return err;
19383 err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
19384 if (err < 0)
19385 return err;
19386 err = alc662_auto_create_extra_out(codec,
19387 spec->autocfg.speaker_pins[0],
19388 "Speaker");
19389 if (err < 0)
19390 return err;
19391 if (err)
19392 spec->multiout.extra_out_nid[0] = err;
19393 err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
19394 "Headphone");
19395 if (err < 0)
19396 return err;
19397 if (err)
19398 spec->multiout.hp_nid = err;
19399 err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
19400 if (err < 0)
19401 return err;
19402
19403 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
19404
19405 alc_auto_parse_digital(codec);
19406
19407 if (spec->kctls.list)
19408 add_mixer(spec, spec->kctls.list);
19409
19410 spec->num_mux_defs = 1;
19411 spec->input_mux = &spec->private_imux[0];
19412
19413 add_verb(spec, alc662_init_verbs);
19414 if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
19415 codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
19416 add_verb(spec, alc663_init_verbs);
19417
19418 if (codec->vendor_id == 0x10ec0272)
19419 add_verb(spec, alc272_init_verbs);
19420
19421 err = alc_auto_add_mic_boost(codec);
19422 if (err < 0)
19423 return err;
19424
19425 if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
19426 codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
19427 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0x21);
19428 else
19429 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
19430
19431 return 1;
19432 }
19433
19434 /* additional initialization for auto-configuration model */
19435 static void alc662_auto_init(struct hda_codec *codec)
19436 {
19437 struct alc_spec *spec = codec->spec;
19438 alc662_auto_init_multi_out(codec);
19439 alc662_auto_init_hp_out(codec);
19440 alc662_auto_init_analog_input(codec);
19441 alc662_auto_init_input_src(codec);
19442 alc_auto_init_digital(codec);
19443 if (spec->unsol_event)
19444 alc_inithook(codec);
19445 }
19446
19447 static void alc272_fixup_mario(struct hda_codec *codec,
19448 const struct alc_fixup *fix, int action)
19449 {
19450 if (action != ALC_FIXUP_ACT_PROBE)
19451 return;
19452 if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
19453 (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
19454 (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
19455 (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
19456 (0 << AC_AMPCAP_MUTE_SHIFT)))
19457 printk(KERN_WARNING
19458 "hda_codec: failed to override amp caps for NID 0x2\n");
19459 }
19460
19461 enum {
19462 ALC662_FIXUP_ASPIRE,
19463 ALC662_FIXUP_IDEAPAD,
19464 ALC272_FIXUP_MARIO,
19465 ALC662_FIXUP_CZC_P10T,
19466 };
19467
19468 static const struct alc_fixup alc662_fixups[] = {
19469 [ALC662_FIXUP_ASPIRE] = {
19470 .type = ALC_FIXUP_PINS,
19471 .v.pins = (const struct alc_pincfg[]) {
19472 { 0x15, 0x99130112 }, /* subwoofer */
19473 { }
19474 }
19475 },
19476 [ALC662_FIXUP_IDEAPAD] = {
19477 .type = ALC_FIXUP_PINS,
19478 .v.pins = (const struct alc_pincfg[]) {
19479 { 0x17, 0x99130112 }, /* subwoofer */
19480 { }
19481 }
19482 },
19483 [ALC272_FIXUP_MARIO] = {
19484 .type = ALC_FIXUP_FUNC,
19485 .v.func = alc272_fixup_mario,
19486 },
19487 [ALC662_FIXUP_CZC_P10T] = {
19488 .type = ALC_FIXUP_VERBS,
19489 .v.verbs = (const struct hda_verb[]) {
19490 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
19491 {}
19492 }
19493 },
19494 };
19495
19496 static struct snd_pci_quirk alc662_fixup_tbl[] = {
19497 SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
19498 SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
19499 SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
19500 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
19501 SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
19502 {}
19503 };
19504
19505 static const struct alc_model_fixup alc662_fixup_models[] = {
19506 {.id = ALC272_FIXUP_MARIO, .name = "mario"},
19507 {}
19508 };
19509
19510
19511 static int patch_alc662(struct hda_codec *codec)
19512 {
19513 struct alc_spec *spec;
19514 int err, board_config;
19515 int coef;
19516
19517 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
19518 if (!spec)
19519 return -ENOMEM;
19520
19521 codec->spec = spec;
19522
19523 alc_auto_parse_customize_define(codec);
19524
19525 alc_fix_pll_init(codec, 0x20, 0x04, 15);
19526
19527 coef = alc_read_coef_idx(codec, 0);
19528 if (coef == 0x8020 || coef == 0x8011)
19529 alc_codec_rename(codec, "ALC661");
19530 else if (coef & (1 << 14) &&
19531 codec->bus->pci->subsystem_vendor == 0x1025 &&
19532 spec->cdefine.platform_type == 1)
19533 alc_codec_rename(codec, "ALC272X");
19534 else if (coef == 0x4011)
19535 alc_codec_rename(codec, "ALC656");
19536
19537 board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
19538 alc662_models,
19539 alc662_cfg_tbl);
19540 if (board_config < 0) {
19541 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
19542 codec->chip_name);
19543 board_config = ALC662_AUTO;
19544 }
19545
19546 if (board_config == ALC662_AUTO) {
19547 alc_pick_fixup(codec, alc662_fixup_models,
19548 alc662_fixup_tbl, alc662_fixups);
19549 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
19550 /* automatic parse from the BIOS config */
19551 err = alc662_parse_auto_config(codec);
19552 if (err < 0) {
19553 alc_free(codec);
19554 return err;
19555 } else if (!err) {
19556 printk(KERN_INFO
19557 "hda_codec: Cannot set up configuration "
19558 "from BIOS. Using base mode...\n");
19559 board_config = ALC662_3ST_2ch_DIG;
19560 }
19561 }
19562
19563 if (has_cdefine_beep(codec)) {
19564 err = snd_hda_attach_beep_device(codec, 0x1);
19565 if (err < 0) {
19566 alc_free(codec);
19567 return err;
19568 }
19569 }
19570
19571 if (board_config != ALC662_AUTO)
19572 setup_preset(codec, &alc662_presets[board_config]);
19573
19574 spec->stream_analog_playback = &alc662_pcm_analog_playback;
19575 spec->stream_analog_capture = &alc662_pcm_analog_capture;
19576
19577 spec->stream_digital_playback = &alc662_pcm_digital_playback;
19578 spec->stream_digital_capture = &alc662_pcm_digital_capture;
19579
19580 if (!spec->adc_nids) {
19581 spec->adc_nids = alc662_adc_nids;
19582 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
19583 }
19584 if (!spec->capsrc_nids)
19585 spec->capsrc_nids = alc662_capsrc_nids;
19586
19587 if (!spec->cap_mixer)
19588 set_capture_mixer(codec);
19589
19590 if (has_cdefine_beep(codec)) {
19591 switch (codec->vendor_id) {
19592 case 0x10ec0662:
19593 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
19594 break;
19595 case 0x10ec0272:
19596 case 0x10ec0663:
19597 case 0x10ec0665:
19598 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
19599 break;
19600 case 0x10ec0273:
19601 set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
19602 break;
19603 }
19604 }
19605 spec->vmaster_nid = 0x02;
19606
19607 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
19608
19609 codec->patch_ops = alc_patch_ops;
19610 if (board_config == ALC662_AUTO)
19611 spec->init_hook = alc662_auto_init;
19612
19613 alc_init_jacks(codec);
19614
19615 #ifdef CONFIG_SND_HDA_POWER_SAVE
19616 if (!spec->loopback.amplist)
19617 spec->loopback.amplist = alc662_loopbacks;
19618 #endif
19619
19620 return 0;
19621 }
19622
19623 static int patch_alc888(struct hda_codec *codec)
19624 {
19625 if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
19626 kfree(codec->chip_name);
19627 if (codec->vendor_id == 0x10ec0887)
19628 codec->chip_name = kstrdup("ALC887-VD", GFP_KERNEL);
19629 else
19630 codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
19631 if (!codec->chip_name) {
19632 alc_free(codec);
19633 return -ENOMEM;
19634 }
19635 return patch_alc662(codec);
19636 }
19637 return patch_alc882(codec);
19638 }
19639
19640 /*
19641 * ALC680 support
19642 */
19643 #define ALC680_DIGIN_NID ALC880_DIGIN_NID
19644 #define ALC680_DIGOUT_NID ALC880_DIGOUT_NID
19645 #define alc680_modes alc260_modes
19646
19647 static hda_nid_t alc680_dac_nids[3] = {
19648 /* Lout1, Lout2, hp */
19649 0x02, 0x03, 0x04
19650 };
19651
19652 static hda_nid_t alc680_adc_nids[3] = {
19653 /* ADC0-2 */
19654 /* DMIC, MIC, Line-in*/
19655 0x07, 0x08, 0x09
19656 };
19657
19658 /*
19659 * Analog capture ADC cgange
19660 */
19661 static void alc680_rec_autoswitch(struct hda_codec *codec)
19662 {
19663 struct alc_spec *spec = codec->spec;
19664 struct auto_pin_cfg *cfg = &spec->autocfg;
19665 int pin_found = 0;
19666 int type_found = AUTO_PIN_LAST;
19667 hda_nid_t nid;
19668 int i;
19669
19670 for (i = 0; i < cfg->num_inputs; i++) {
19671 nid = cfg->inputs[i].pin;
19672 if (!(snd_hda_query_pin_caps(codec, nid) &
19673 AC_PINCAP_PRES_DETECT))
19674 continue;
19675 if (snd_hda_jack_detect(codec, nid)) {
19676 if (cfg->inputs[i].type < type_found) {
19677 type_found = cfg->inputs[i].type;
19678 pin_found = nid;
19679 }
19680 }
19681 }
19682
19683 nid = 0x07;
19684 if (pin_found)
19685 snd_hda_get_connections(codec, pin_found, &nid, 1);
19686
19687 if (nid != spec->cur_adc)
19688 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
19689 spec->cur_adc = nid;
19690 snd_hda_codec_setup_stream(codec, nid, spec->cur_adc_stream_tag, 0,
19691 spec->cur_adc_format);
19692 }
19693
19694 static int alc680_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
19695 struct hda_codec *codec,
19696 unsigned int stream_tag,
19697 unsigned int format,
19698 struct snd_pcm_substream *substream)
19699 {
19700 struct alc_spec *spec = codec->spec;
19701
19702 spec->cur_adc = 0x07;
19703 spec->cur_adc_stream_tag = stream_tag;
19704 spec->cur_adc_format = format;
19705
19706 alc680_rec_autoswitch(codec);
19707 return 0;
19708 }
19709
19710 static int alc680_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
19711 struct hda_codec *codec,
19712 struct snd_pcm_substream *substream)
19713 {
19714 snd_hda_codec_cleanup_stream(codec, 0x07);
19715 snd_hda_codec_cleanup_stream(codec, 0x08);
19716 snd_hda_codec_cleanup_stream(codec, 0x09);
19717 return 0;
19718 }
19719
19720 static struct hda_pcm_stream alc680_pcm_analog_auto_capture = {
19721 .substreams = 1, /* can be overridden */
19722 .channels_min = 2,
19723 .channels_max = 2,
19724 /* NID is set in alc_build_pcms */
19725 .ops = {
19726 .prepare = alc680_capture_pcm_prepare,
19727 .cleanup = alc680_capture_pcm_cleanup
19728 },
19729 };
19730
19731 static struct snd_kcontrol_new alc680_base_mixer[] = {
19732 /* output mixer control */
19733 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
19734 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
19735 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT),
19736 HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT),
19737 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x12, 0, HDA_INPUT),
19738 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
19739 HDA_CODEC_VOLUME("Line In Boost Volume", 0x19, 0, HDA_INPUT),
19740 { }
19741 };
19742
19743 static struct hda_bind_ctls alc680_bind_cap_vol = {
19744 .ops = &snd_hda_bind_vol,
19745 .values = {
19746 HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT),
19747 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
19748 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
19749 0
19750 },
19751 };
19752
19753 static struct hda_bind_ctls alc680_bind_cap_switch = {
19754 .ops = &snd_hda_bind_sw,
19755 .values = {
19756 HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT),
19757 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
19758 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
19759 0
19760 },
19761 };
19762
19763 static struct snd_kcontrol_new alc680_master_capture_mixer[] = {
19764 HDA_BIND_VOL("Capture Volume", &alc680_bind_cap_vol),
19765 HDA_BIND_SW("Capture Switch", &alc680_bind_cap_switch),
19766 { } /* end */
19767 };
19768
19769 /*
19770 * generic initialization of ADC, input mixers and output mixers
19771 */
19772 static struct hda_verb alc680_init_verbs[] = {
19773 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
19774 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
19775 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
19776
19777 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
19778 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
19779 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
19780 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
19781 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
19782 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
19783
19784 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
19785 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
19786 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
19787 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
19788 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
19789
19790 {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
19791 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
19792 {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
19793
19794 { }
19795 };
19796
19797 /* toggle speaker-output according to the hp-jack state */
19798 static void alc680_base_setup(struct hda_codec *codec)
19799 {
19800 struct alc_spec *spec = codec->spec;
19801
19802 spec->autocfg.hp_pins[0] = 0x16;
19803 spec->autocfg.speaker_pins[0] = 0x14;
19804 spec->autocfg.speaker_pins[1] = 0x15;
19805 spec->autocfg.num_inputs = 2;
19806 spec->autocfg.inputs[0].pin = 0x18;
19807 spec->autocfg.inputs[0].type = AUTO_PIN_MIC;
19808 spec->autocfg.inputs[1].pin = 0x19;
19809 spec->autocfg.inputs[1].type = AUTO_PIN_LINE_IN;
19810 }
19811
19812 static void alc680_unsol_event(struct hda_codec *codec,
19813 unsigned int res)
19814 {
19815 if ((res >> 26) == ALC880_HP_EVENT)
19816 alc_automute_amp(codec);
19817 if ((res >> 26) == ALC880_MIC_EVENT)
19818 alc680_rec_autoswitch(codec);
19819 }
19820
19821 static void alc680_inithook(struct hda_codec *codec)
19822 {
19823 alc_automute_amp(codec);
19824 alc680_rec_autoswitch(codec);
19825 }
19826
19827 /* create input playback/capture controls for the given pin */
19828 static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
19829 const char *ctlname, int idx)
19830 {
19831 hda_nid_t dac;
19832 int err;
19833
19834 switch (nid) {
19835 case 0x14:
19836 dac = 0x02;
19837 break;
19838 case 0x15:
19839 dac = 0x03;
19840 break;
19841 case 0x16:
19842 dac = 0x04;
19843 break;
19844 default:
19845 return 0;
19846 }
19847 if (spec->multiout.dac_nids[0] != dac &&
19848 spec->multiout.dac_nids[1] != dac) {
19849 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
19850 HDA_COMPOSE_AMP_VAL(dac, 3, idx,
19851 HDA_OUTPUT));
19852 if (err < 0)
19853 return err;
19854
19855 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
19856 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
19857
19858 if (err < 0)
19859 return err;
19860 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
19861 }
19862
19863 return 0;
19864 }
19865
19866 /* add playback controls from the parsed DAC table */
19867 static int alc680_auto_create_multi_out_ctls(struct alc_spec *spec,
19868 const struct auto_pin_cfg *cfg)
19869 {
19870 hda_nid_t nid;
19871 int err;
19872
19873 spec->multiout.dac_nids = spec->private_dac_nids;
19874
19875 nid = cfg->line_out_pins[0];
19876 if (nid) {
19877 const char *name;
19878 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
19879 name = "Speaker";
19880 else
19881 name = "Front";
19882 err = alc680_new_analog_output(spec, nid, name, 0);
19883 if (err < 0)
19884 return err;
19885 }
19886
19887 nid = cfg->speaker_pins[0];
19888 if (nid) {
19889 err = alc680_new_analog_output(spec, nid, "Speaker", 0);
19890 if (err < 0)
19891 return err;
19892 }
19893 nid = cfg->hp_pins[0];
19894 if (nid) {
19895 err = alc680_new_analog_output(spec, nid, "Headphone", 0);
19896 if (err < 0)
19897 return err;
19898 }
19899
19900 return 0;
19901 }
19902
19903 static void alc680_auto_set_output_and_unmute(struct hda_codec *codec,
19904 hda_nid_t nid, int pin_type)
19905 {
19906 alc_set_pin_output(codec, nid, pin_type);
19907 }
19908
19909 static void alc680_auto_init_multi_out(struct hda_codec *codec)
19910 {
19911 struct alc_spec *spec = codec->spec;
19912 hda_nid_t nid = spec->autocfg.line_out_pins[0];
19913 if (nid) {
19914 int pin_type = get_pin_type(spec->autocfg.line_out_type);
19915 alc680_auto_set_output_and_unmute(codec, nid, pin_type);
19916 }
19917 }
19918
19919 static void alc680_auto_init_hp_out(struct hda_codec *codec)
19920 {
19921 struct alc_spec *spec = codec->spec;
19922 hda_nid_t pin;
19923
19924 pin = spec->autocfg.hp_pins[0];
19925 if (pin)
19926 alc680_auto_set_output_and_unmute(codec, pin, PIN_HP);
19927 pin = spec->autocfg.speaker_pins[0];
19928 if (pin)
19929 alc680_auto_set_output_and_unmute(codec, pin, PIN_OUT);
19930 }
19931
19932 /* pcm configuration: identical with ALC880 */
19933 #define alc680_pcm_analog_playback alc880_pcm_analog_playback
19934 #define alc680_pcm_analog_capture alc880_pcm_analog_capture
19935 #define alc680_pcm_analog_alt_capture alc880_pcm_analog_alt_capture
19936 #define alc680_pcm_digital_playback alc880_pcm_digital_playback
19937 #define alc680_pcm_digital_capture alc880_pcm_digital_capture
19938
19939 /*
19940 * BIOS auto configuration
19941 */
19942 static int alc680_parse_auto_config(struct hda_codec *codec)
19943 {
19944 struct alc_spec *spec = codec->spec;
19945 int err;
19946 static hda_nid_t alc680_ignore[] = { 0 };
19947
19948 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
19949 alc680_ignore);
19950 if (err < 0)
19951 return err;
19952
19953 if (!spec->autocfg.line_outs) {
19954 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
19955 spec->multiout.max_channels = 2;
19956 spec->no_analog = 1;
19957 goto dig_only;
19958 }
19959 return 0; /* can't find valid BIOS pin config */
19960 }
19961 err = alc680_auto_create_multi_out_ctls(spec, &spec->autocfg);
19962 if (err < 0)
19963 return err;
19964
19965 spec->multiout.max_channels = 2;
19966
19967 dig_only:
19968 /* digital only support output */
19969 alc_auto_parse_digital(codec);
19970 if (spec->kctls.list)
19971 add_mixer(spec, spec->kctls.list);
19972
19973 add_verb(spec, alc680_init_verbs);
19974
19975 err = alc_auto_add_mic_boost(codec);
19976 if (err < 0)
19977 return err;
19978
19979 return 1;
19980 }
19981
19982 #define alc680_auto_init_analog_input alc882_auto_init_analog_input
19983
19984 /* init callback for auto-configuration model -- overriding the default init */
19985 static void alc680_auto_init(struct hda_codec *codec)
19986 {
19987 struct alc_spec *spec = codec->spec;
19988 alc680_auto_init_multi_out(codec);
19989 alc680_auto_init_hp_out(codec);
19990 alc680_auto_init_analog_input(codec);
19991 alc_auto_init_digital(codec);
19992 if (spec->unsol_event)
19993 alc_inithook(codec);
19994 }
19995
19996 /*
19997 * configuration and preset
19998 */
19999 static const char * const alc680_models[ALC680_MODEL_LAST] = {
20000 [ALC680_BASE] = "base",
20001 [ALC680_AUTO] = "auto",
20002 };
20003
20004 static struct snd_pci_quirk alc680_cfg_tbl[] = {
20005 SND_PCI_QUIRK(0x1043, 0x12f3, "ASUS NX90", ALC680_BASE),
20006 {}
20007 };
20008
20009 static struct alc_config_preset alc680_presets[] = {
20010 [ALC680_BASE] = {
20011 .mixers = { alc680_base_mixer },
20012 .cap_mixer = alc680_master_capture_mixer,
20013 .init_verbs = { alc680_init_verbs },
20014 .num_dacs = ARRAY_SIZE(alc680_dac_nids),
20015 .dac_nids = alc680_dac_nids,
20016 .dig_out_nid = ALC680_DIGOUT_NID,
20017 .num_channel_mode = ARRAY_SIZE(alc680_modes),
20018 .channel_mode = alc680_modes,
20019 .unsol_event = alc680_unsol_event,
20020 .setup = alc680_base_setup,
20021 .init_hook = alc680_inithook,
20022
20023 },
20024 };
20025
20026 static int patch_alc680(struct hda_codec *codec)
20027 {
20028 struct alc_spec *spec;
20029 int board_config;
20030 int err;
20031
20032 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
20033 if (spec == NULL)
20034 return -ENOMEM;
20035
20036 codec->spec = spec;
20037
20038 board_config = snd_hda_check_board_config(codec, ALC680_MODEL_LAST,
20039 alc680_models,
20040 alc680_cfg_tbl);
20041
20042 if (board_config < 0 || board_config >= ALC680_MODEL_LAST) {
20043 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
20044 codec->chip_name);
20045 board_config = ALC680_AUTO;
20046 }
20047
20048 if (board_config == ALC680_AUTO) {
20049 /* automatic parse from the BIOS config */
20050 err = alc680_parse_auto_config(codec);
20051 if (err < 0) {
20052 alc_free(codec);
20053 return err;
20054 } else if (!err) {
20055 printk(KERN_INFO
20056 "hda_codec: Cannot set up configuration "
20057 "from BIOS. Using base mode...\n");
20058 board_config = ALC680_BASE;
20059 }
20060 }
20061
20062 if (board_config != ALC680_AUTO)
20063 setup_preset(codec, &alc680_presets[board_config]);
20064
20065 spec->stream_analog_playback = &alc680_pcm_analog_playback;
20066 spec->stream_analog_capture = &alc680_pcm_analog_auto_capture;
20067 spec->stream_digital_playback = &alc680_pcm_digital_playback;
20068 spec->stream_digital_capture = &alc680_pcm_digital_capture;
20069
20070 if (!spec->adc_nids) {
20071 spec->adc_nids = alc680_adc_nids;
20072 spec->num_adc_nids = ARRAY_SIZE(alc680_adc_nids);
20073 }
20074
20075 if (!spec->cap_mixer)
20076 set_capture_mixer(codec);
20077
20078 spec->vmaster_nid = 0x02;
20079
20080 codec->patch_ops = alc_patch_ops;
20081 if (board_config == ALC680_AUTO)
20082 spec->init_hook = alc680_auto_init;
20083
20084 return 0;
20085 }
20086
20087 /*
20088 * patch entries
20089 */
20090 static struct hda_codec_preset snd_hda_preset_realtek[] = {
20091 { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
20092 { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
20093 { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
20094 { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
20095 { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
20096 { .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
20097 { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
20098 { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
20099 { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
20100 .patch = patch_alc861 },
20101 { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
20102 { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
20103 { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
20104 { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
20105 .patch = patch_alc882 },
20106 { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
20107 .patch = patch_alc662 },
20108 { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
20109 { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
20110 { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
20111 { .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 },
20112 { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
20113 { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
20114 { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
20115 { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
20116 .patch = patch_alc882 },
20117 { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
20118 .patch = patch_alc882 },
20119 { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
20120 { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc888 },
20121 { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
20122 .patch = patch_alc882 },
20123 { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
20124 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
20125 { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
20126 {} /* terminator */
20127 };
20128
20129 MODULE_ALIAS("snd-hda-codec-id:10ec*");
20130
20131 MODULE_LICENSE("GPL");
20132 MODULE_DESCRIPTION("Realtek HD-audio codec");
20133
20134 static struct hda_codec_preset_list realtek_list = {
20135 .preset = snd_hda_preset_realtek,
20136 .owner = THIS_MODULE,
20137 };
20138
20139 static int __init patch_realtek_init(void)
20140 {
20141 return snd_hda_add_codec_preset(&realtek_list);
20142 }
20143
20144 static void __exit patch_realtek_exit(void)
20145 {
20146 snd_hda_delete_codec_preset(&realtek_list);
20147 }
20148
20149 module_init(patch_realtek_init)
20150 module_exit(patch_realtek_exit)
This page took 0.547647 seconds and 5 git commands to generate.