50f4cbda219e070711f97f7da0319dd79522e416
[linux-flexiantxendom0.git] / sound / pci / hda / alc882_quirks.c
1 /*
2  * ALC882/ALC883/ALC888/ALC889 quirk models
3  * included by patch_realtek.c
4  */
5
6 /* ALC882 models */
7 enum {
8         ALC882_AUTO,
9         ALC882_3ST_DIG,
10         ALC882_6ST_DIG,
11         ALC882_ARIMA,
12         ALC882_W2JC,
13         ALC882_TARGA,
14         ALC882_ASUS_A7J,
15         ALC882_ASUS_A7M,
16         ALC885_MACPRO,
17         ALC885_MBA21,
18         ALC885_MBP3,
19         ALC885_MB5,
20         ALC885_MACMINI3,
21         ALC885_IMAC24,
22         ALC885_IMAC91,
23         ALC883_3ST_2ch_DIG,
24         ALC883_3ST_6ch_DIG,
25         ALC883_3ST_6ch,
26         ALC883_6ST_DIG,
27         ALC883_TARGA_DIG,
28         ALC883_TARGA_2ch_DIG,
29         ALC883_TARGA_8ch_DIG,
30         ALC883_ACER,
31         ALC883_ACER_ASPIRE,
32         ALC888_ACER_ASPIRE_4930G,
33         ALC888_ACER_ASPIRE_6530G,
34         ALC888_ACER_ASPIRE_8930G,
35         ALC888_ACER_ASPIRE_7730G,
36         ALC883_MEDION,
37         ALC883_MEDION_WIM2160,
38         ALC883_LAPTOP_EAPD,
39         ALC883_LENOVO_101E_2ch,
40         ALC883_LENOVO_NB0763,
41         ALC888_LENOVO_MS7195_DIG,
42         ALC888_LENOVO_SKY,
43         ALC883_HAIER_W66,
44         ALC888_3ST_HP,
45         ALC888_6ST_DELL,
46         ALC883_MITAC,
47         ALC883_CLEVO_M540R,
48         ALC883_CLEVO_M720,
49         ALC883_FUJITSU_PI2515,
50         ALC888_FUJITSU_XA3530,
51         ALC883_3ST_6ch_INTEL,
52         ALC889A_INTEL,
53         ALC889_INTEL,
54         ALC888_ASUS_M90V,
55         ALC888_ASUS_EEE1601,
56         ALC889A_MB31,
57         ALC1200_ASUS_P5Q,
58         ALC883_SONY_VAIO_TT,
59         ALC882_MODEL_LAST,
60 };
61
62 /*
63  * 2ch mode
64  */
65 static const struct hda_verb alc888_4ST_ch2_intel_init[] = {
66 /* Mic-in jack as mic in */
67         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
68         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
69 /* Line-in jack as Line in */
70         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
71         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
72 /* Line-Out as Front */
73         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
74         { } /* end */
75 };
76
77 /*
78  * 4ch mode
79  */
80 static const struct hda_verb alc888_4ST_ch4_intel_init[] = {
81 /* Mic-in jack as mic in */
82         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
83         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
84 /* Line-in jack as Surround */
85         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
86         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
87 /* Line-Out as Front */
88         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
89         { } /* end */
90 };
91
92 /*
93  * 6ch mode
94  */
95 static const struct hda_verb alc888_4ST_ch6_intel_init[] = {
96 /* Mic-in jack as CLFE */
97         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
98         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
99 /* Line-in jack as Surround */
100         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
101         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
102 /* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
103         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
104         { } /* end */
105 };
106
107 /*
108  * 8ch mode
109  */
110 static const struct hda_verb alc888_4ST_ch8_intel_init[] = {
111 /* Mic-in jack as CLFE */
112         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
113         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
114 /* Line-in jack as Surround */
115         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
116         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
117 /* Line-Out as Side */
118         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
119         { } /* end */
120 };
121
122 static const struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
123         { 2, alc888_4ST_ch2_intel_init },
124         { 4, alc888_4ST_ch4_intel_init },
125         { 6, alc888_4ST_ch6_intel_init },
126         { 8, alc888_4ST_ch8_intel_init },
127 };
128
129 /*
130  * ALC888 Fujitsu Siemens Amillo xa3530
131  */
132
133 static const struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
134 /* Front Mic: set to PIN_IN (empty by default) */
135         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
136 /* Connect Internal HP to Front */
137         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
138         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
139         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
140 /* Connect Bass HP to Front */
141         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
142         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
143         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
144 /* Connect Line-Out side jack (SPDIF) to Side */
145         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
146         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
147         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
148 /* Connect Mic jack to CLFE */
149         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
150         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
151         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
152 /* Connect Line-in jack to Surround */
153         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
154         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
155         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
156 /* Connect HP out jack to Front */
157         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
158         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
159         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
160 /* Enable unsolicited event for HP jack and Line-out jack */
161         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
162         {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
163         {}
164 };
165
166 static void alc889_automute_setup(struct hda_codec *codec)
167 {
168         struct alc_spec *spec = codec->spec;
169
170         spec->autocfg.hp_pins[0] = 0x15;
171         spec->autocfg.speaker_pins[0] = 0x14;
172         spec->autocfg.speaker_pins[1] = 0x16;
173         spec->autocfg.speaker_pins[2] = 0x17;
174         spec->autocfg.speaker_pins[3] = 0x19;
175         spec->autocfg.speaker_pins[4] = 0x1a;
176         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
177 }
178
179 static void alc889_intel_init_hook(struct hda_codec *codec)
180 {
181         alc889_coef_init(codec);
182         alc_hp_automute(codec);
183 }
184
185 static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
186 {
187         struct alc_spec *spec = codec->spec;
188
189         spec->autocfg.hp_pins[0] = 0x17; /* line-out */
190         spec->autocfg.hp_pins[1] = 0x1b; /* hp */
191         spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
192         spec->autocfg.speaker_pins[1] = 0x15; /* bass */
193         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
194 }
195
196 /*
197  * ALC888 Acer Aspire 4930G model
198  */
199
200 static const struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
201 /* Front Mic: set to PIN_IN (empty by default) */
202         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
203 /* Unselect Front Mic by default in input mixer 3 */
204         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
205 /* Enable unsolicited event for HP jack */
206         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
207 /* Connect Internal HP to front */
208         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
209         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
210         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
211 /* Connect HP out to front */
212         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
213         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
214         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
215         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
216         { }
217 };
218
219 /*
220  * ALC888 Acer Aspire 6530G model
221  */
222
223 static const struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
224 /* Route to built-in subwoofer as well as speakers */
225         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
226         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
227         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
228         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
229 /* Bias voltage on for external mic port */
230         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
231 /* Front Mic: set to PIN_IN (empty by default) */
232         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
233 /* Unselect Front Mic by default in input mixer 3 */
234         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
235 /* Enable unsolicited event for HP jack */
236         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
237 /* Enable speaker output */
238         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
239         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
240         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
241 /* Enable headphone output */
242         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
243         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
244         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
245         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
246         { }
247 };
248
249 /*
250  *ALC888 Acer Aspire 7730G model
251  */
252
253 static const struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
254 /* Bias voltage on for external mic port */
255         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
256 /* Front Mic: set to PIN_IN (empty by default) */
257         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
258 /* Unselect Front Mic by default in input mixer 3 */
259         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
260 /* Enable unsolicited event for HP jack */
261         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
262 /* Enable speaker output */
263         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
264         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
265         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
266 /* Enable headphone output */
267         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
268         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
269         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
270         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
271 /*Enable internal subwoofer */
272         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
273         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
274         {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
275         {0x17, AC_VERB_SET_EAPD_BTLENABLE, 2},
276         { }
277 };
278
279 /*
280  * ALC889 Acer Aspire 8930G model
281  */
282
283 static const struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
284 /* Front Mic: set to PIN_IN (empty by default) */
285         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
286 /* Unselect Front Mic by default in input mixer 3 */
287         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
288 /* Enable unsolicited event for HP jack */
289         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
290 /* Connect Internal Front to Front */
291         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
292         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
293         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
294 /* Connect Internal Rear to Rear */
295         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
296         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
297         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
298 /* Connect Internal CLFE to CLFE */
299         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
300         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
301         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
302 /* Connect HP out to Front */
303         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
304         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
305         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
306 /* Enable all DACs */
307 /*  DAC DISABLE/MUTE 1? */
308 /*  setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
309         {0x20, AC_VERB_SET_COEF_INDEX, 0x03},
310         {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
311 /*  DAC DISABLE/MUTE 2? */
312 /*  some bit here disables the other DACs. Init=0x4900 */
313         {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
314         {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
315 /* DMIC fix
316  * This laptop has a stereo digital microphone. The mics are only 1cm apart
317  * which makes the stereo useless. However, either the mic or the ALC889
318  * makes the signal become a difference/sum signal instead of standard
319  * stereo, which is annoying. So instead we flip this bit which makes the
320  * codec replicate the sum signal to both channels, turning it into a
321  * normal mono mic.
322  */
323 /*  DMIC_CONTROL? Init value = 0x0001 */
324         {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
325         {0x20, AC_VERB_SET_PROC_COEF, 0x0003},
326         { }
327 };
328
329 static const struct hda_input_mux alc888_2_capture_sources[2] = {
330         /* Front mic only available on one ADC */
331         {
332                 .num_items = 4,
333                 .items = {
334                         { "Mic", 0x0 },
335                         { "Line", 0x2 },
336                         { "CD", 0x4 },
337                         { "Front Mic", 0xb },
338                 },
339         },
340         {
341                 .num_items = 3,
342                 .items = {
343                         { "Mic", 0x0 },
344                         { "Line", 0x2 },
345                         { "CD", 0x4 },
346                 },
347         }
348 };
349
350 static const struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
351         /* Interal mic only available on one ADC */
352         {
353                 .num_items = 5,
354                 .items = {
355                         { "Mic", 0x0 },
356                         { "Line In", 0x2 },
357                         { "CD", 0x4 },
358                         { "Input Mix", 0xa },
359                         { "Internal Mic", 0xb },
360                 },
361         },
362         {
363                 .num_items = 4,
364                 .items = {
365                         { "Mic", 0x0 },
366                         { "Line In", 0x2 },
367                         { "CD", 0x4 },
368                         { "Input Mix", 0xa },
369                 },
370         }
371 };
372
373 static const struct hda_input_mux alc889_capture_sources[3] = {
374         /* Digital mic only available on first "ADC" */
375         {
376                 .num_items = 5,
377                 .items = {
378                         { "Mic", 0x0 },
379                         { "Line", 0x2 },
380                         { "CD", 0x4 },
381                         { "Front Mic", 0xb },
382                         { "Input Mix", 0xa },
383                 },
384         },
385         {
386                 .num_items = 4,
387                 .items = {
388                         { "Mic", 0x0 },
389                         { "Line", 0x2 },
390                         { "CD", 0x4 },
391                         { "Input Mix", 0xa },
392                 },
393         },
394         {
395                 .num_items = 4,
396                 .items = {
397                         { "Mic", 0x0 },
398                         { "Line", 0x2 },
399                         { "CD", 0x4 },
400                         { "Input Mix", 0xa },
401                 },
402         }
403 };
404
405 static const struct snd_kcontrol_new alc888_base_mixer[] = {
406         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
407         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
408         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
409         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
410         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
411                 HDA_OUTPUT),
412         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
413         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
414         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
415         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
416         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
417         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
418         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
419         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
420         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
421         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
422         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
423         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
424         { } /* end */
425 };
426
427 static const struct snd_kcontrol_new alc888_acer_aspire_4930g_mixer[] = {
428         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
429         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
430         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
431         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
432         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
433                 HDA_OUTPUT),
434         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
435         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
436         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
437         HDA_CODEC_VOLUME_MONO("Internal LFE Playback Volume", 0x0f, 1, 0x0, HDA_OUTPUT),
438         HDA_BIND_MUTE_MONO("Internal LFE Playback Switch", 0x0f, 1, 2, HDA_INPUT),
439         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
440         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
441         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
442         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
443         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
444         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
445         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
446         { } /* end */
447 };
448
449 static const struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
450         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
451         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
452         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
453         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
454         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
455                 HDA_OUTPUT),
456         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
457         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
458         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
459         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
460         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
461         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
462         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
463         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
464         { } /* end */
465 };
466
467
468 static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
469 {
470         struct alc_spec *spec = codec->spec;
471
472         spec->autocfg.hp_pins[0] = 0x15;
473         spec->autocfg.speaker_pins[0] = 0x14;
474         spec->autocfg.speaker_pins[1] = 0x16;
475         spec->autocfg.speaker_pins[2] = 0x17;
476         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
477 }
478
479 static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
480 {
481         struct alc_spec *spec = codec->spec;
482
483         spec->autocfg.hp_pins[0] = 0x15;
484         spec->autocfg.speaker_pins[0] = 0x14;
485         spec->autocfg.speaker_pins[1] = 0x16;
486         spec->autocfg.speaker_pins[2] = 0x17;
487         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
488 }
489
490 static void alc888_acer_aspire_7730g_setup(struct hda_codec *codec)
491 {
492         struct alc_spec *spec = codec->spec;
493
494         spec->autocfg.hp_pins[0] = 0x15;
495         spec->autocfg.speaker_pins[0] = 0x14;
496         spec->autocfg.speaker_pins[1] = 0x16;
497         spec->autocfg.speaker_pins[2] = 0x17;
498         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
499 }
500
501 static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
502 {
503         struct alc_spec *spec = codec->spec;
504
505         spec->autocfg.hp_pins[0] = 0x15;
506         spec->autocfg.speaker_pins[0] = 0x14;
507         spec->autocfg.speaker_pins[1] = 0x16;
508         spec->autocfg.speaker_pins[2] = 0x1b;
509         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
510 }
511
512 #define ALC882_DIGOUT_NID       0x06
513 #define ALC882_DIGIN_NID        0x0a
514 #define ALC883_DIGOUT_NID       ALC882_DIGOUT_NID
515 #define ALC883_DIGIN_NID        ALC882_DIGIN_NID
516 #define ALC1200_DIGOUT_NID      0x10
517
518
519 static const struct hda_channel_mode alc882_ch_modes[1] = {
520         { 8, NULL }
521 };
522
523 /* DACs */
524 static const hda_nid_t alc882_dac_nids[4] = {
525         /* front, rear, clfe, rear_surr */
526         0x02, 0x03, 0x04, 0x05
527 };
528 #define alc883_dac_nids         alc882_dac_nids
529
530 /* ADCs */
531 #define alc882_adc_nids         alc880_adc_nids
532 #define alc882_adc_nids_alt     alc880_adc_nids_alt
533 #define alc883_adc_nids         alc882_adc_nids_alt
534 static const hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
535 static const hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
536 #define alc889_adc_nids         alc880_adc_nids
537
538 static const hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
539 static const hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
540 #define alc883_capsrc_nids      alc882_capsrc_nids_alt
541 static const hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
542 #define alc889_capsrc_nids      alc882_capsrc_nids
543
544 /* input MUX */
545 /* FIXME: should be a matrix-type input source selection */
546
547 static const struct hda_input_mux alc882_capture_source = {
548         .num_items = 4,
549         .items = {
550                 { "Mic", 0x0 },
551                 { "Front Mic", 0x1 },
552                 { "Line", 0x2 },
553                 { "CD", 0x4 },
554         },
555 };
556
557 #define alc883_capture_source   alc882_capture_source
558
559 static const struct hda_input_mux alc889_capture_source = {
560         .num_items = 3,
561         .items = {
562                 { "Front Mic", 0x0 },
563                 { "Mic", 0x3 },
564                 { "Line", 0x2 },
565         },
566 };
567
568 static const struct hda_input_mux mb5_capture_source = {
569         .num_items = 3,
570         .items = {
571                 { "Mic", 0x1 },
572                 { "Line", 0x7 },
573                 { "CD", 0x4 },
574         },
575 };
576
577 static const struct hda_input_mux macmini3_capture_source = {
578         .num_items = 2,
579         .items = {
580                 { "Line", 0x2 },
581                 { "CD", 0x4 },
582         },
583 };
584
585 static const struct hda_input_mux alc883_3stack_6ch_intel = {
586         .num_items = 4,
587         .items = {
588                 { "Mic", 0x1 },
589                 { "Front Mic", 0x0 },
590                 { "Line", 0x2 },
591                 { "CD", 0x4 },
592         },
593 };
594
595 static const struct hda_input_mux alc883_lenovo_101e_capture_source = {
596         .num_items = 2,
597         .items = {
598                 { "Mic", 0x1 },
599                 { "Line", 0x2 },
600         },
601 };
602
603 static const struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
604         .num_items = 4,
605         .items = {
606                 { "Mic", 0x0 },
607                 { "Internal Mic", 0x1 },
608                 { "Line", 0x2 },
609                 { "CD", 0x4 },
610         },
611 };
612
613 static const struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
614         .num_items = 2,
615         .items = {
616                 { "Mic", 0x0 },
617                 { "Internal Mic", 0x1 },
618         },
619 };
620
621 static const struct hda_input_mux alc883_lenovo_sky_capture_source = {
622         .num_items = 3,
623         .items = {
624                 { "Mic", 0x0 },
625                 { "Front Mic", 0x1 },
626                 { "Line", 0x4 },
627         },
628 };
629
630 static const struct hda_input_mux alc883_asus_eee1601_capture_source = {
631         .num_items = 2,
632         .items = {
633                 { "Mic", 0x0 },
634                 { "Line", 0x2 },
635         },
636 };
637
638 static const struct hda_input_mux alc889A_mb31_capture_source = {
639         .num_items = 2,
640         .items = {
641                 { "Mic", 0x0 },
642                 /* Front Mic (0x01) unused */
643                 { "Line", 0x2 },
644                 /* Line 2 (0x03) unused */
645                 /* CD (0x04) unused? */
646         },
647 };
648
649 static const struct hda_input_mux alc889A_imac91_capture_source = {
650         .num_items = 2,
651         .items = {
652                 { "Mic", 0x01 },
653                 { "Line", 0x2 }, /* Not sure! */
654         },
655 };
656
657 /*
658  * 2ch mode
659  */
660 static const struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
661         { 2, NULL }
662 };
663
664 /*
665  * 2ch mode
666  */
667 static const struct hda_verb alc882_3ST_ch2_init[] = {
668         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
669         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
670         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
671         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
672         { } /* end */
673 };
674
675 /*
676  * 4ch mode
677  */
678 static const struct hda_verb alc882_3ST_ch4_init[] = {
679         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
680         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
681         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
682         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
683         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
684         { } /* end */
685 };
686
687 /*
688  * 6ch mode
689  */
690 static const struct hda_verb alc882_3ST_ch6_init[] = {
691         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
692         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
693         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
694         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
695         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
696         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
697         { } /* end */
698 };
699
700 static const struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
701         { 2, alc882_3ST_ch2_init },
702         { 4, alc882_3ST_ch4_init },
703         { 6, alc882_3ST_ch6_init },
704 };
705
706 #define alc883_3ST_6ch_modes    alc882_3ST_6ch_modes
707
708 /*
709  * 2ch mode
710  */
711 static const struct hda_verb alc883_3ST_ch2_clevo_init[] = {
712         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
713         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
714         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
715         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
716         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
717         { } /* end */
718 };
719
720 /*
721  * 4ch mode
722  */
723 static const struct hda_verb alc883_3ST_ch4_clevo_init[] = {
724         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
725         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
726         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
727         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
728         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
729         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
730         { } /* end */
731 };
732
733 /*
734  * 6ch mode
735  */
736 static const struct hda_verb alc883_3ST_ch6_clevo_init[] = {
737         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
738         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
739         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
740         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
741         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
742         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
743         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
744         { } /* end */
745 };
746
747 static const struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
748         { 2, alc883_3ST_ch2_clevo_init },
749         { 4, alc883_3ST_ch4_clevo_init },
750         { 6, alc883_3ST_ch6_clevo_init },
751 };
752
753
754 /*
755  * 6ch mode
756  */
757 static const struct hda_verb alc882_sixstack_ch6_init[] = {
758         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
759         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
760         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
761         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
762         { } /* end */
763 };
764
765 /*
766  * 8ch mode
767  */
768 static const struct hda_verb alc882_sixstack_ch8_init[] = {
769         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
770         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
771         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
772         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
773         { } /* end */
774 };
775
776 static const struct hda_channel_mode alc882_sixstack_modes[2] = {
777         { 6, alc882_sixstack_ch6_init },
778         { 8, alc882_sixstack_ch8_init },
779 };
780
781
782 /* Macbook Air 2,1 */
783
784 static const struct hda_channel_mode alc885_mba21_ch_modes[1] = {
785       { 2, NULL },
786 };
787
788 /*
789  * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
790  */
791
792 /*
793  * 2ch mode
794  */
795 static const struct hda_verb alc885_mbp_ch2_init[] = {
796         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
797         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
798         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
799         { } /* end */
800 };
801
802 /*
803  * 4ch mode
804  */
805 static const struct hda_verb alc885_mbp_ch4_init[] = {
806         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
807         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
808         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
809         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
810         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
811         { } /* end */
812 };
813
814 static const struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
815         { 2, alc885_mbp_ch2_init },
816         { 4, alc885_mbp_ch4_init },
817 };
818
819 /*
820  * 2ch
821  * Speakers/Woofer/HP = Front
822  * LineIn = Input
823  */
824 static const struct hda_verb alc885_mb5_ch2_init[] = {
825         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
826         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
827         { } /* end */
828 };
829
830 /*
831  * 6ch mode
832  * Speakers/HP = Front
833  * Woofer = LFE
834  * LineIn = Surround
835  */
836 static const struct hda_verb alc885_mb5_ch6_init[] = {
837         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
838         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
839         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
840         { } /* end */
841 };
842
843 static const struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
844         { 2, alc885_mb5_ch2_init },
845         { 6, alc885_mb5_ch6_init },
846 };
847
848 #define alc885_macmini3_6ch_modes       alc885_mb5_6ch_modes
849
850 /*
851  * 2ch mode
852  */
853 static const struct hda_verb alc883_4ST_ch2_init[] = {
854         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
855         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
856         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
857         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
858         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
859         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
860         { } /* end */
861 };
862
863 /*
864  * 4ch mode
865  */
866 static const struct hda_verb alc883_4ST_ch4_init[] = {
867         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
868         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
869         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
870         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
871         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
872         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
873         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
874         { } /* end */
875 };
876
877 /*
878  * 6ch mode
879  */
880 static const struct hda_verb alc883_4ST_ch6_init[] = {
881         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
882         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
883         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
884         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
885         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
886         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
887         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
888         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
889         { } /* end */
890 };
891
892 /*
893  * 8ch mode
894  */
895 static const struct hda_verb alc883_4ST_ch8_init[] = {
896         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
897         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
898         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
899         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
900         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
901         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
902         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
903         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
904         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
905         { } /* end */
906 };
907
908 static const struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
909         { 2, alc883_4ST_ch2_init },
910         { 4, alc883_4ST_ch4_init },
911         { 6, alc883_4ST_ch6_init },
912         { 8, alc883_4ST_ch8_init },
913 };
914
915
916 /*
917  * 2ch mode
918  */
919 static const struct hda_verb alc883_3ST_ch2_intel_init[] = {
920         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
921         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
922         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
923         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
924         { } /* end */
925 };
926
927 /*
928  * 4ch mode
929  */
930 static const struct hda_verb alc883_3ST_ch4_intel_init[] = {
931         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
932         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
933         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
934         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
935         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
936         { } /* end */
937 };
938
939 /*
940  * 6ch mode
941  */
942 static const struct hda_verb alc883_3ST_ch6_intel_init[] = {
943         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
944         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
945         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
946         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
947         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
948         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
949         { } /* end */
950 };
951
952 static const struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
953         { 2, alc883_3ST_ch2_intel_init },
954         { 4, alc883_3ST_ch4_intel_init },
955         { 6, alc883_3ST_ch6_intel_init },
956 };
957
958 /*
959  * 2ch mode
960  */
961 static const struct hda_verb alc889_ch2_intel_init[] = {
962         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
963         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
964         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
965         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
966         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
967         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
968         { } /* end */
969 };
970
971 /*
972  * 6ch mode
973  */
974 static const struct hda_verb alc889_ch6_intel_init[] = {
975         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
976         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
977         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
978         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
979         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
980         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
981         { } /* end */
982 };
983
984 /*
985  * 8ch mode
986  */
987 static const struct hda_verb alc889_ch8_intel_init[] = {
988         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
989         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
990         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
991         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
992         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
993         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
994         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
995         { } /* end */
996 };
997
998 static const struct hda_channel_mode alc889_8ch_intel_modes[3] = {
999         { 2, alc889_ch2_intel_init },
1000         { 6, alc889_ch6_intel_init },
1001         { 8, alc889_ch8_intel_init },
1002 };
1003
1004 /*
1005  * 6ch mode
1006  */
1007 static const struct hda_verb alc883_sixstack_ch6_init[] = {
1008         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
1009         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1010         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1011         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1012         { } /* end */
1013 };
1014
1015 /*
1016  * 8ch mode
1017  */
1018 static const struct hda_verb alc883_sixstack_ch8_init[] = {
1019         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1020         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1021         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1022         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1023         { } /* end */
1024 };
1025
1026 static const struct hda_channel_mode alc883_sixstack_modes[2] = {
1027         { 6, alc883_sixstack_ch6_init },
1028         { 8, alc883_sixstack_ch8_init },
1029 };
1030
1031
1032 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
1033  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
1034  */
1035 static const struct snd_kcontrol_new alc882_base_mixer[] = {
1036         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1037         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1038         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1039         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1040         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1041         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1042         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1043         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1044         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1045         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1046         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
1047         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1048         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1049         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1050         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1051         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1052         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
1053         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1054         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
1055         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
1056         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
1057         { } /* end */
1058 };
1059
1060 /* Macbook Air 2,1 same control for HP and internal Speaker */
1061
1062 static const struct snd_kcontrol_new alc885_mba21_mixer[] = {
1063       HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
1064       HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
1065      { }
1066 };
1067
1068
1069 static const struct snd_kcontrol_new alc885_mbp3_mixer[] = {
1070         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
1071         HDA_BIND_MUTE   ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
1072         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
1073         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
1074         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
1075         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1076         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1077         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
1078         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
1079         HDA_CODEC_VOLUME("Line Boost Volume", 0x1a, 0x00, HDA_INPUT),
1080         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0x00, HDA_INPUT),
1081         { } /* end */
1082 };
1083
1084 static const struct snd_kcontrol_new alc885_mb5_mixer[] = {
1085         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
1086         HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
1087         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
1088         HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
1089         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
1090         HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
1091         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
1092         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
1093         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
1094         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
1095         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
1096         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
1097         HDA_CODEC_VOLUME("Line Boost Volume", 0x15, 0x00, HDA_INPUT),
1098         HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0x00, HDA_INPUT),
1099         { } /* end */
1100 };
1101
1102 static const struct snd_kcontrol_new alc885_macmini3_mixer[] = {
1103         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
1104         HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
1105         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
1106         HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
1107         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
1108         HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
1109         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
1110         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
1111         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
1112         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
1113         HDA_CODEC_VOLUME("Line Boost Volume", 0x15, 0x00, HDA_INPUT),
1114         { } /* end */
1115 };
1116
1117 static const struct snd_kcontrol_new alc885_imac91_mixer[] = {
1118         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
1119         HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
1120         { } /* end */
1121 };
1122
1123
1124 static const struct snd_kcontrol_new alc882_w2jc_mixer[] = {
1125         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1126         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1127         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1128         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1129         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1130         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1131         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1132         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
1133         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1134         { } /* end */
1135 };
1136
1137 static const struct snd_kcontrol_new alc882_targa_mixer[] = {
1138         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1139         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1140         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
1141         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1142         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1143         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1144         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1145         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1146         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1147         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
1148         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
1149         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
1150         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
1151         { } /* end */
1152 };
1153
1154 /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
1155  *                 Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
1156  */
1157 static const struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
1158         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1159         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
1160         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
1161         HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
1162         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1163         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1164         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1165         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1166         HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
1167         HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
1168         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1169         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1170         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
1171         { } /* end */
1172 };
1173
1174 static const struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
1175         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1176         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1177         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
1178         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1179         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1180         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1181         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1182         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1183         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
1184         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1185         { } /* end */
1186 };
1187
1188 static const struct snd_kcontrol_new alc882_chmode_mixer[] = {
1189         {
1190                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1191                 .name = "Channel Mode",
1192                 .info = alc_ch_mode_info,
1193                 .get = alc_ch_mode_get,
1194                 .put = alc_ch_mode_put,
1195         },
1196         { } /* end */
1197 };
1198
1199 static const struct hda_verb alc882_base_init_verbs[] = {
1200         /* Front mixer: unmute input/output amp left and right (volume = 0) */
1201         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1202         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1203         /* Rear mixer */
1204         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1205         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1206         /* CLFE mixer */
1207         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1208         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1209         /* Side mixer */
1210         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1211         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1212
1213         /* Front Pin: output 0 (0x0c) */
1214         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1215         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1216         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1217         /* Rear Pin: output 1 (0x0d) */
1218         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1219         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1220         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
1221         /* CLFE Pin: output 2 (0x0e) */
1222         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1223         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1224         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1225         /* Side Pin: output 3 (0x0f) */
1226         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1227         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1228         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1229         /* Mic (rear) pin: input vref at 80% */
1230         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1231         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1232         /* Front Mic pin: input vref at 80% */
1233         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1234         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1235         /* Line In pin: input */
1236         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1237         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1238         /* Line-2 In: Headphone output (output 0 - 0x0c) */
1239         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1240         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1241         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1242         /* CD pin widget for input */
1243         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1244
1245         /* FIXME: use matrix-type input source selection */
1246         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
1247         /* Input mixer2 */
1248         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1249         /* Input mixer3 */
1250         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1251         /* ADC2: mute amp left and right */
1252         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1253         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
1254         /* ADC3: mute amp left and right */
1255         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1256         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
1257
1258         { }
1259 };
1260
1261 static const struct hda_verb alc882_adc1_init_verbs[] = {
1262         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
1263         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1264         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
1265         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
1266         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
1267         /* ADC1: mute amp left and right */
1268         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1269         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
1270         { }
1271 };
1272
1273 static const struct hda_verb alc882_eapd_verbs[] = {
1274         /* change to EAPD mode */
1275         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
1276         {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
1277         { }
1278 };
1279
1280 static const struct hda_verb alc889_eapd_verbs[] = {
1281         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
1282         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
1283         { }
1284 };
1285
1286 static const struct hda_verb alc_hp15_unsol_verbs[] = {
1287         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
1288         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1289         {}
1290 };
1291
1292 static const struct hda_verb alc885_init_verbs[] = {
1293         /* Front mixer: unmute input/output amp left and right (volume = 0) */
1294         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1295         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1296         /* Rear mixer */
1297         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1298         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1299         /* CLFE mixer */
1300         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1301         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1302         /* Side mixer */
1303         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1304         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1305
1306         /* Front HP Pin: output 0 (0x0c) */
1307         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1308         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1309         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1310         /* Front Pin: output 0 (0x0c) */
1311         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1312         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1313         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1314         /* Rear Pin: output 1 (0x0d) */
1315         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1316         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1317         {0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
1318         /* CLFE Pin: output 2 (0x0e) */
1319         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1320         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1321         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1322         /* Side Pin: output 3 (0x0f) */
1323         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1324         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1325         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1326         /* Mic (rear) pin: input vref at 80% */
1327         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1328         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1329         /* Front Mic pin: input vref at 80% */
1330         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1331         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1332         /* Line In pin: input */
1333         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1334         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1335
1336         /* Mixer elements: 0x18, , 0x1a, 0x1b */
1337         /* Input mixer1 */
1338         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1339         /* Input mixer2 */
1340         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1341         /* Input mixer3 */
1342         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1343         /* ADC2: mute amp left and right */
1344         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1345         /* ADC3: mute amp left and right */
1346         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1347
1348         { }
1349 };
1350
1351 static const struct hda_verb alc885_init_input_verbs[] = {
1352         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1353         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
1354         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
1355         { }
1356 };
1357
1358
1359 /* Unmute Selector 24h and set the default input to front mic */
1360 static const struct hda_verb alc889_init_input_verbs[] = {
1361         {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
1362         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1363         { }
1364 };
1365
1366
1367 #define alc883_init_verbs       alc882_base_init_verbs
1368
1369 /* Mac Pro test */
1370 static const struct snd_kcontrol_new alc882_macpro_mixer[] = {
1371         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1372         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1373         HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
1374         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
1375         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
1376         /* FIXME: this looks suspicious...
1377         HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
1378         HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
1379         */
1380         { } /* end */
1381 };
1382
1383 static const struct hda_verb alc882_macpro_init_verbs[] = {
1384         /* Front mixer: unmute input/output amp left and right (volume = 0) */
1385         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1386         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1387         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1388         /* Front Pin: output 0 (0x0c) */
1389         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1390         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1391         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1392         /* Front Mic pin: input vref at 80% */
1393         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1394         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1395         /* Speaker:  output */
1396         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1397         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1398         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
1399         /* Headphone output (output 0 - 0x0c) */
1400         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1401         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1402         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
1403
1404         /* FIXME: use matrix-type input source selection */
1405         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
1406         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
1407         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1408         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
1409         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
1410         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
1411         /* Input mixer2 */
1412         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1413         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
1414         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
1415         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
1416         /* Input mixer3 */
1417         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1418         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
1419         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
1420         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
1421         /* ADC1: mute amp left and right */
1422         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1423         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
1424         /* ADC2: mute amp left and right */
1425         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1426         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
1427         /* ADC3: mute amp left and right */
1428         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1429         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
1430
1431         { }
1432 };
1433
1434 /* Macbook 5,1 */
1435 static const struct hda_verb alc885_mb5_init_verbs[] = {
1436         /* DACs */
1437         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1438         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1439         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1440         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1441         /* Front mixer */
1442         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1443         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1444         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1445         /* Surround mixer */
1446         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1447         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1448         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1449         /* LFE mixer */
1450         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1451         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1452         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1453         /* HP mixer */
1454         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1455         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1456         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1457         /* Front Pin (0x0c) */
1458         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
1459         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1460         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
1461         /* LFE Pin (0x0e) */
1462         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
1463         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1464         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
1465         /* HP Pin (0x0f) */
1466         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1467         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1468         {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
1469         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
1470         /* Front Mic pin: input vref at 80% */
1471         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1472         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1473         /* Line In pin */
1474         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1475         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1476
1477         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0x1)},
1478         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x7)},
1479         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x4)},
1480         { }
1481 };
1482
1483 /* Macmini 3,1 */
1484 static const struct hda_verb alc885_macmini3_init_verbs[] = {
1485         /* DACs */
1486         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1487         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1488         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1489         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1490         /* Front mixer */
1491         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1492         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1493         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1494         /* Surround mixer */
1495         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1496         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1497         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1498         /* LFE mixer */
1499         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1500         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1501         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1502         /* HP mixer */
1503         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1504         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1505         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1506         /* Front Pin (0x0c) */
1507         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
1508         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1509         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
1510         /* LFE Pin (0x0e) */
1511         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
1512         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1513         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
1514         /* HP Pin (0x0f) */
1515         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1516         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1517         {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
1518         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
1519         /* Line In pin */
1520         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1521         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1522
1523         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1524         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
1525         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
1526         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
1527         { }
1528 };
1529
1530
1531 static const struct hda_verb alc885_mba21_init_verbs[] = {
1532         /*Internal and HP Speaker Mixer*/
1533         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1534         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1535         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1536         /*Internal Speaker Pin (0x0c)*/
1537         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
1538         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1539         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
1540         /* HP Pin: output 0 (0x0e) */
1541         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
1542         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1543         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1544         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC_HP_EVENT | AC_USRSP_EN)},
1545         /* Line in (is hp when jack connected)*/
1546         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
1547         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1548
1549         { }
1550  };
1551
1552
1553 /* Macbook Pro rev3 */
1554 static const struct hda_verb alc885_mbp3_init_verbs[] = {
1555         /* Front mixer: unmute input/output amp left and right (volume = 0) */
1556         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1557         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1558         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1559         /* Rear mixer */
1560         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1561         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1562         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1563         /* HP mixer */
1564         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1565         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1566         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1567         /* Front Pin: output 0 (0x0c) */
1568         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1569         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1570         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1571         /* HP Pin: output 0 (0x0e) */
1572         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
1573         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1574         {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
1575         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
1576         /* Mic (rear) pin: input vref at 80% */
1577         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1578         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1579         /* Front Mic pin: input vref at 80% */
1580         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1581         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1582         /* Line In pin: use output 1 when in LineOut mode */
1583         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1584         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1585         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1586
1587         /* FIXME: use matrix-type input source selection */
1588         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
1589         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
1590         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1591         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
1592         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
1593         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
1594         /* Input mixer2 */
1595         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1596         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
1597         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
1598         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
1599         /* Input mixer3 */
1600         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1601         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
1602         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
1603         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
1604         /* ADC1: mute amp left and right */
1605         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1606         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
1607         /* ADC2: mute amp left and right */
1608         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1609         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
1610         /* ADC3: mute amp left and right */
1611         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1612         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
1613
1614         { }
1615 };
1616
1617 /* iMac 9,1 */
1618 static const struct hda_verb alc885_imac91_init_verbs[] = {
1619         /* Internal Speaker Pin (0x0c) */
1620         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
1621         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1622         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
1623         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
1624         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1625         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
1626         /* HP Pin: Rear */
1627         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1628         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1629         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1630         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC_HP_EVENT | AC_USRSP_EN)},
1631         /* Line in Rear */
1632         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
1633         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1634         /* Front Mic pin: input vref at 80% */
1635         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1636         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1637         /* Rear mixer */
1638         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1639         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1640         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1641         /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
1642         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
1643         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1644         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1645         /* 0x24 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
1646         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1647         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
1648         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
1649         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
1650         /* 0x23 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
1651         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1652         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
1653         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
1654         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
1655         /* 0x22 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
1656         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1657         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
1658         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
1659         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
1660         /* 0x07 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
1661         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1662         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
1663         /* 0x08 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
1664         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1665         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
1666         /* 0x09 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
1667         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
1668         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
1669         { }
1670 };
1671
1672 /* iMac 24 mixer. */
1673 static const struct snd_kcontrol_new alc885_imac24_mixer[] = {
1674         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
1675         HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
1676         { } /* end */
1677 };
1678
1679 /* iMac 24 init verbs. */
1680 static const struct hda_verb alc885_imac24_init_verbs[] = {
1681         /* Internal speakers: output 0 (0x0c) */
1682         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1683         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1684         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
1685         /* Internal speakers: output 0 (0x0c) */
1686         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1687         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1688         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
1689         /* Headphone: output 0 (0x0c) */
1690         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1691         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1692         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1693         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
1694         /* Front Mic: input vref at 80% */
1695         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1696         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1697         { }
1698 };
1699
1700 /* Toggle speaker-output according to the hp-jack state */
1701 static void alc885_imac24_setup(struct hda_codec *codec)
1702 {
1703         struct alc_spec *spec = codec->spec;
1704
1705         spec->autocfg.hp_pins[0] = 0x14;
1706         spec->autocfg.speaker_pins[0] = 0x18;
1707         spec->autocfg.speaker_pins[1] = 0x1a;
1708         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
1709 }
1710
1711 #define alc885_mb5_setup        alc885_imac24_setup
1712 #define alc885_macmini3_setup   alc885_imac24_setup
1713
1714 /* Macbook Air 2,1 */
1715 static void alc885_mba21_setup(struct hda_codec *codec)
1716 {
1717         struct alc_spec *spec = codec->spec;
1718
1719         spec->autocfg.hp_pins[0] = 0x14;
1720         spec->autocfg.speaker_pins[0] = 0x18;
1721         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
1722 }
1723
1724
1725
1726 static void alc885_mbp3_setup(struct hda_codec *codec)
1727 {
1728         struct alc_spec *spec = codec->spec;
1729
1730         spec->autocfg.hp_pins[0] = 0x15;
1731         spec->autocfg.speaker_pins[0] = 0x14;
1732         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
1733 }
1734
1735 static void alc885_imac91_setup(struct hda_codec *codec)
1736 {
1737         struct alc_spec *spec = codec->spec;
1738
1739         spec->autocfg.hp_pins[0] = 0x14;
1740         spec->autocfg.speaker_pins[0] = 0x18;
1741         spec->autocfg.speaker_pins[1] = 0x1a;
1742         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
1743 }
1744
1745 static const struct hda_verb alc882_targa_verbs[] = {
1746         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1747         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1748
1749         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1750         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1751
1752         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
1753         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
1754         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
1755
1756         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
1757         { } /* end */
1758 };
1759
1760 /* toggle speaker-output according to the hp-jack state */
1761 static void alc882_targa_automute(struct hda_codec *codec)
1762 {
1763         struct alc_spec *spec = codec->spec;
1764         alc_hp_automute(codec);
1765         snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
1766                                   spec->hp_jack_present ? 1 : 3);
1767 }
1768
1769 static void alc882_targa_setup(struct hda_codec *codec)
1770 {
1771         struct alc_spec *spec = codec->spec;
1772
1773         spec->autocfg.hp_pins[0] = 0x14;
1774         spec->autocfg.speaker_pins[0] = 0x1b;
1775         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
1776 }
1777
1778 static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
1779 {
1780         if ((res >> 26) == ALC_HP_EVENT)
1781                 alc882_targa_automute(codec);
1782 }
1783
1784 static const struct hda_verb alc882_asus_a7j_verbs[] = {
1785         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1786         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1787
1788         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1789         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1790         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1791
1792         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
1793         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
1794         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
1795
1796         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
1797         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
1798         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
1799         { } /* end */
1800 };
1801
1802 static const struct hda_verb alc882_asus_a7m_verbs[] = {
1803         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1804         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1805
1806         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1807         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1808         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1809
1810         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
1811         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
1812         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
1813
1814         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
1815         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
1816         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
1817         { } /* end */
1818 };
1819
1820 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
1821 {
1822         unsigned int gpiostate, gpiomask, gpiodir;
1823
1824         gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
1825                                        AC_VERB_GET_GPIO_DATA, 0);
1826
1827         if (!muted)
1828                 gpiostate |= (1 << pin);
1829         else
1830                 gpiostate &= ~(1 << pin);
1831
1832         gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
1833                                       AC_VERB_GET_GPIO_MASK, 0);
1834         gpiomask |= (1 << pin);
1835
1836         gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
1837                                      AC_VERB_GET_GPIO_DIRECTION, 0);
1838         gpiodir |= (1 << pin);
1839
1840
1841         snd_hda_codec_write(codec, codec->afg, 0,
1842                             AC_VERB_SET_GPIO_MASK, gpiomask);
1843         snd_hda_codec_write(codec, codec->afg, 0,
1844                             AC_VERB_SET_GPIO_DIRECTION, gpiodir);
1845
1846         msleep(1);
1847
1848         snd_hda_codec_write(codec, codec->afg, 0,
1849                             AC_VERB_SET_GPIO_DATA, gpiostate);
1850 }
1851
1852 /* set up GPIO at initialization */
1853 static void alc885_macpro_init_hook(struct hda_codec *codec)
1854 {
1855         alc882_gpio_mute(codec, 0, 0);
1856         alc882_gpio_mute(codec, 1, 0);
1857 }
1858
1859 /* set up GPIO and update auto-muting at initialization */
1860 static void alc885_imac24_init_hook(struct hda_codec *codec)
1861 {
1862         alc885_macpro_init_hook(codec);
1863         alc_hp_automute(codec);
1864 }
1865
1866 /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
1867 static const struct hda_verb alc889A_mb31_ch2_init[] = {
1868         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
1869         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
1870         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
1871         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
1872         { } /* end */
1873 };
1874
1875 /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
1876 static const struct hda_verb alc889A_mb31_ch4_init[] = {
1877         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
1878         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
1879         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
1880         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
1881         { } /* end */
1882 };
1883
1884 /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
1885 static const struct hda_verb alc889A_mb31_ch5_init[] = {
1886         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as rear */
1887         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
1888         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
1889         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
1890         { } /* end */
1891 };
1892
1893 /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
1894 static const struct hda_verb alc889A_mb31_ch6_init[] = {
1895         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as front */
1896         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Subwoofer off */
1897         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
1898         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
1899         { } /* end */
1900 };
1901
1902 static const struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
1903         { 2, alc889A_mb31_ch2_init },
1904         { 4, alc889A_mb31_ch4_init },
1905         { 5, alc889A_mb31_ch5_init },
1906         { 6, alc889A_mb31_ch6_init },
1907 };
1908
1909 static const struct hda_verb alc883_medion_eapd_verbs[] = {
1910         /* eanable EAPD on medion laptop */
1911         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
1912         {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
1913         { }
1914 };
1915
1916 #define alc883_base_mixer       alc882_base_mixer
1917
1918 static const struct snd_kcontrol_new alc883_mitac_mixer[] = {
1919         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1920         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1921         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1922         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1923         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1924         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1925         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
1926         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1927         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
1928         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1929         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
1930         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
1931         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
1932         { } /* end */
1933 };
1934
1935 static const struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
1936         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1937         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
1938         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1939         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
1940         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1941         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
1942         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1943         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
1944         HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
1945         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
1946         { } /* end */
1947 };
1948
1949 static const struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
1950         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1951         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
1952         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1953         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
1954         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1955         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
1956         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1957         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
1958         HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
1959         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
1960         { } /* end */
1961 };
1962
1963 static const struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
1964         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1965         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1966         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
1967         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1968         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1969         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1970         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1971         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1972         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
1973         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1974         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
1975         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
1976         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
1977         { } /* end */
1978 };
1979
1980 static const struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
1981         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1982         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1983         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1984         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1985         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1986         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1987         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1988         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1989         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
1990         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1991         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1992         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1993         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1994         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1995         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
1996         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1997         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
1998         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
1999         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2000         { } /* end */
2001 };
2002
2003 static const struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
2004         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2005         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2006         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2007         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2008         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
2009                               HDA_OUTPUT),
2010         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2011         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2012         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2013         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
2014         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2015         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2016         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2017         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2018         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2019         HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0, HDA_INPUT),
2020         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2021         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2022         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x18, 0, HDA_INPUT),
2023         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2024         { } /* end */
2025 };
2026
2027 static const struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
2028         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2029         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2030         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2031         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2032         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
2033                               HDA_OUTPUT),
2034         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2035         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2036         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2037         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2038         HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
2039         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
2040         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2041         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2042         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
2043         HDA_CODEC_VOLUME("Mic Boost Volume", 0x1b, 0, HDA_INPUT),
2044         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
2045         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2046         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x18, 0, HDA_INPUT),
2047         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2048         { } /* end */
2049 };
2050
2051 static const struct snd_kcontrol_new alc883_fivestack_mixer[] = {
2052         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2053         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2054         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2055         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2056         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2057         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2058         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2059         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2060         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2061         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2062         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2063         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2064         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2065         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2066         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
2067         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2068         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2069         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
2070         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2071         { } /* end */
2072 };
2073
2074 static const struct snd_kcontrol_new alc883_targa_mixer[] = {
2075         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2076         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2077         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2078         HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2079         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2080         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2081         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2082         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2083         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2084         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2085         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2086         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2087         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2088         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2089         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2090         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
2091         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2092         { } /* end */
2093 };
2094
2095 static const struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
2096         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2097         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2098         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2099         HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2100         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2101         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2102         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2103         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
2104         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2105         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2106         HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
2107         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2108         { } /* end */
2109 };
2110
2111 static const struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
2112         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2113         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2114         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2115         HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
2116         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2117         { } /* end */
2118 };
2119
2120 static const struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
2121         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2122         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2123         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2124         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2125         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2126         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2127         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
2128         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2129         { } /* end */
2130 };
2131
2132 static const struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
2133         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2134         HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
2135         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2136         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2137         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2138         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2139         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2140         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2141         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2142         { } /* end */
2143 };
2144
2145 static const struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = {
2146         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2147         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2148         HDA_CODEC_MUTE("Speaker Playback Switch", 0x15, 0x0, HDA_OUTPUT),
2149         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT),
2150         HDA_CODEC_VOLUME("Line Playback Volume", 0x08, 0x0, HDA_INPUT),
2151         HDA_CODEC_MUTE("Line Playback Switch", 0x08, 0x0, HDA_INPUT),
2152         { } /* end */
2153 };
2154
2155 static const struct hda_verb alc883_medion_wim2160_verbs[] = {
2156         /* Unmute front mixer */
2157         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2158         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2159
2160         /* Set speaker pin to front mixer */
2161         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
2162
2163         /* Init headphone pin */
2164         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2165         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2166         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
2167         {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2168
2169         { } /* end */
2170 };
2171
2172 /* toggle speaker-output according to the hp-jack state */
2173 static void alc883_medion_wim2160_setup(struct hda_codec *codec)
2174 {
2175         struct alc_spec *spec = codec->spec;
2176
2177         spec->autocfg.hp_pins[0] = 0x1a;
2178         spec->autocfg.speaker_pins[0] = 0x15;
2179         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
2180 }
2181
2182 static const struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
2183         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2184         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2185         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2186         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2187         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2188         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2189         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
2190         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2191         { } /* end */
2192 };
2193
2194 static const struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
2195         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2196         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2197         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2198         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2199         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2200         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2201         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2202         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
2203         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2204         { } /* end */
2205 };
2206
2207 static const struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
2208         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2209         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2210         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
2211         HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
2212         HDA_CODEC_VOLUME_MONO("Center Playback Volume",
2213                                                 0x0d, 1, 0x0, HDA_OUTPUT),
2214         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
2215         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
2216         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
2217         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2218         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2219         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2220         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2221         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2222         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2223         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2224         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
2225         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2226         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2227         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
2228         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2229         { } /* end */
2230 };
2231
2232 static const struct snd_kcontrol_new alc889A_mb31_mixer[] = {
2233         /* Output mixers */
2234         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
2235         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
2236         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
2237         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
2238         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
2239                 HDA_OUTPUT),
2240         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
2241         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
2242         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
2243         /* Output switches */
2244         HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
2245         HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
2246         HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
2247         /* Boost mixers */
2248         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0x00, HDA_INPUT),
2249         HDA_CODEC_VOLUME("Line Boost Volume", 0x1a, 0x00, HDA_INPUT),
2250         /* Input mixers */
2251         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
2252         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
2253         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2254         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2255         { } /* end */
2256 };
2257
2258 static const struct snd_kcontrol_new alc883_vaiott_mixer[] = {
2259         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2260         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2261         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
2262         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2263         HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0, HDA_INPUT),
2264         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2265         { } /* end */
2266 };
2267
2268 static const struct hda_bind_ctls alc883_bind_cap_vol = {
2269         .ops = &snd_hda_bind_vol,
2270         .values = {
2271                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
2272                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
2273                 0
2274         },
2275 };
2276
2277 static const struct hda_bind_ctls alc883_bind_cap_switch = {
2278         .ops = &snd_hda_bind_sw,
2279         .values = {
2280                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
2281                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
2282                 0
2283         },
2284 };
2285
2286 static const struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
2287         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2288         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2289         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2290         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2291         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2292         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2293         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
2294         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2295         { } /* end */
2296 };
2297
2298 static const struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
2299         HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
2300         HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
2301         {
2302                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2303                 /* .name = "Capture Source", */
2304                 .name = "Input Source",
2305                 .count = 1,
2306                 .info = alc_mux_enum_info,
2307                 .get = alc_mux_enum_get,
2308                 .put = alc_mux_enum_put,
2309         },
2310         { } /* end */
2311 };
2312
2313 static const struct snd_kcontrol_new alc883_chmode_mixer[] = {
2314         {
2315                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2316                 .name = "Channel Mode",
2317                 .info = alc_ch_mode_info,
2318                 .get = alc_ch_mode_get,
2319                 .put = alc_ch_mode_put,
2320         },
2321         { } /* end */
2322 };
2323
2324 /* toggle speaker-output according to the hp-jack state */
2325 static void alc883_mitac_setup(struct hda_codec *codec)
2326 {
2327         struct alc_spec *spec = codec->spec;
2328
2329         spec->autocfg.hp_pins[0] = 0x15;
2330         spec->autocfg.speaker_pins[0] = 0x14;
2331         spec->autocfg.speaker_pins[1] = 0x17;
2332         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
2333 }
2334
2335 static const struct hda_verb alc883_mitac_verbs[] = {
2336         /* HP */
2337         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
2338         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2339         /* Subwoofer */
2340         {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
2341         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2342
2343         /* enable unsolicited event */
2344         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2345         /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_MIC_EVENT | AC_USRSP_EN}, */
2346
2347         { } /* end */
2348 };
2349
2350 static const struct hda_verb alc883_clevo_m540r_verbs[] = {
2351         /* HP */
2352         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
2353         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2354         /* Int speaker */
2355         /*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
2356
2357         /* enable unsolicited event */
2358         /*
2359         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2360         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_MIC_EVENT | AC_USRSP_EN},
2361         */
2362
2363         { } /* end */
2364 };
2365
2366 static const struct hda_verb alc883_clevo_m720_verbs[] = {
2367         /* HP */
2368         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
2369         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2370         /* Int speaker */
2371         {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
2372         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2373
2374         /* enable unsolicited event */
2375         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2376         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_MIC_EVENT | AC_USRSP_EN},
2377
2378         { } /* end */
2379 };
2380
2381 static const struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
2382         /* HP */
2383         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
2384         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2385         /* Subwoofer */
2386         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
2387         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2388
2389         /* enable unsolicited event */
2390         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2391
2392         { } /* end */
2393 };
2394
2395 static const struct hda_verb alc883_targa_verbs[] = {
2396         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2397         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2398
2399         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2400         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2401
2402 /* Connect Line-Out side jack (SPDIF) to Side */
2403         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2404         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2405         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
2406 /* Connect Mic jack to CLFE */
2407         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2408         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2409         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
2410 /* Connect Line-in jack to Surround */
2411         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2412         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2413         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
2414 /* Connect HP out jack to Front */
2415         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2416         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2417         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
2418
2419         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2420
2421         { } /* end */
2422 };
2423
2424 static const struct hda_verb alc883_lenovo_101e_verbs[] = {
2425         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
2426         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_FRONT_EVENT|AC_USRSP_EN},
2427         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT|AC_USRSP_EN},
2428         { } /* end */
2429 };
2430
2431 static const struct hda_verb alc883_lenovo_nb0763_verbs[] = {
2432         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
2433         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2434         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2435         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2436         { } /* end */
2437 };
2438
2439 static const struct hda_verb alc888_lenovo_ms7195_verbs[] = {
2440         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2441         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2442         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
2443         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_FRONT_EVENT | AC_USRSP_EN},
2444         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT    | AC_USRSP_EN},
2445         { } /* end */
2446 };
2447
2448 static const struct hda_verb alc883_haier_w66_verbs[] = {
2449         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2450         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2451
2452         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2453
2454         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
2455         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2456         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2457         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2458         { } /* end */
2459 };
2460
2461 static const struct hda_verb alc888_lenovo_sky_verbs[] = {
2462         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2463         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2464         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2465         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2466         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2467         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2468         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
2469         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2470         { } /* end */
2471 };
2472
2473 static const struct hda_verb alc888_6st_dell_verbs[] = {
2474         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2475         { }
2476 };
2477
2478 static const struct hda_verb alc883_vaiott_verbs[] = {
2479         /* HP */
2480         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
2481         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2482
2483         /* enable unsolicited event */
2484         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2485
2486         { } /* end */
2487 };
2488
2489 static void alc888_3st_hp_setup(struct hda_codec *codec)
2490 {
2491         struct alc_spec *spec = codec->spec;
2492
2493         spec->autocfg.hp_pins[0] = 0x1b;
2494         spec->autocfg.speaker_pins[0] = 0x14;
2495         spec->autocfg.speaker_pins[1] = 0x16;
2496         spec->autocfg.speaker_pins[2] = 0x18;
2497         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
2498 }
2499
2500 static const struct hda_verb alc888_3st_hp_verbs[] = {
2501         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Front: output 0 (0x0c) */
2502         {0x16, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Rear : output 1 (0x0d) */
2503         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},  /* CLFE : output 2 (0x0e) */
2504         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2505         { } /* end */
2506 };
2507
2508 /*
2509  * 2ch mode
2510  */
2511 static const struct hda_verb alc888_3st_hp_2ch_init[] = {
2512         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
2513         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2514         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2515         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2516         { } /* end */
2517 };
2518
2519 /*
2520  * 4ch mode
2521  */
2522 static const struct hda_verb alc888_3st_hp_4ch_init[] = {
2523         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
2524         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2525         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2526         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2527         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
2528         { } /* end */
2529 };
2530
2531 /*
2532  * 6ch mode
2533  */
2534 static const struct hda_verb alc888_3st_hp_6ch_init[] = {
2535         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2536         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2537         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
2538         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2539         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2540         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
2541         { } /* end */
2542 };
2543
2544 static const struct hda_channel_mode alc888_3st_hp_modes[3] = {
2545         { 2, alc888_3st_hp_2ch_init },
2546         { 4, alc888_3st_hp_4ch_init },
2547         { 6, alc888_3st_hp_6ch_init },
2548 };
2549
2550 static void alc888_lenovo_ms7195_setup(struct hda_codec *codec)
2551 {
2552         struct alc_spec *spec = codec->spec;
2553
2554         spec->autocfg.hp_pins[0] = 0x1b;
2555         spec->autocfg.line_out_pins[0] = 0x14;
2556         spec->autocfg.speaker_pins[0] = 0x15;
2557         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
2558 }
2559
2560 /* toggle speaker-output according to the hp-jack state */
2561 static void alc883_lenovo_nb0763_setup(struct hda_codec *codec)
2562 {
2563         struct alc_spec *spec = codec->spec;
2564
2565         spec->autocfg.hp_pins[0] = 0x14;
2566         spec->autocfg.speaker_pins[0] = 0x15;
2567         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
2568 }
2569
2570 /* toggle speaker-output according to the hp-jack state */
2571 #define alc883_targa_init_hook          alc882_targa_init_hook
2572 #define alc883_targa_unsol_event        alc882_targa_unsol_event
2573
2574 static void alc883_clevo_m720_setup(struct hda_codec *codec)
2575 {
2576         struct alc_spec *spec = codec->spec;
2577
2578         spec->autocfg.hp_pins[0] = 0x15;
2579         spec->autocfg.speaker_pins[0] = 0x14;
2580         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
2581 }
2582
2583 static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
2584 {
2585         alc_hp_automute(codec);
2586         alc88x_simple_mic_automute(codec);
2587 }
2588
2589 static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
2590                                            unsigned int res)
2591 {
2592         switch (res >> 26) {
2593         case ALC_MIC_EVENT:
2594                 alc88x_simple_mic_automute(codec);
2595                 break;
2596         default:
2597                 alc_sku_unsol_event(codec, res);
2598                 break;
2599         }
2600 }
2601
2602 /* toggle speaker-output according to the hp-jack state */
2603 static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
2604 {
2605         struct alc_spec *spec = codec->spec;
2606
2607         spec->autocfg.hp_pins[0] = 0x14;
2608         spec->autocfg.speaker_pins[0] = 0x15;
2609         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
2610 }
2611
2612 static void alc883_haier_w66_setup(struct hda_codec *codec)
2613 {
2614         struct alc_spec *spec = codec->spec;
2615
2616         spec->autocfg.hp_pins[0] = 0x1b;
2617         spec->autocfg.speaker_pins[0] = 0x14;
2618         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
2619 }
2620
2621 static void alc883_lenovo_101e_setup(struct hda_codec *codec)
2622 {
2623         struct alc_spec *spec = codec->spec;
2624
2625         spec->autocfg.hp_pins[0] = 0x1b;
2626         spec->autocfg.line_out_pins[0] = 0x14;
2627         spec->autocfg.speaker_pins[0] = 0x15;
2628         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
2629 }
2630
2631 /* toggle speaker-output according to the hp-jack state */
2632 static void alc883_acer_aspire_setup(struct hda_codec *codec)
2633 {
2634         struct alc_spec *spec = codec->spec;
2635
2636         spec->autocfg.hp_pins[0] = 0x14;
2637         spec->autocfg.speaker_pins[0] = 0x15;
2638         spec->autocfg.speaker_pins[1] = 0x16;
2639         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
2640 }
2641
2642 static const struct hda_verb alc883_acer_eapd_verbs[] = {
2643         /* HP Pin: output 0 (0x0c) */
2644         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2645         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2646         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
2647         /* Front Pin: output 0 (0x0c) */
2648         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2649         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
2650         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2651         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
2652         /* eanable EAPD on medion laptop */
2653         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
2654         {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
2655         /* enable unsolicited event */
2656         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2657         { }
2658 };
2659
2660 static void alc888_6st_dell_setup(struct hda_codec *codec)
2661 {
2662         struct alc_spec *spec = codec->spec;
2663
2664         spec->autocfg.hp_pins[0] = 0x1b;
2665         spec->autocfg.speaker_pins[0] = 0x14;
2666         spec->autocfg.speaker_pins[1] = 0x15;
2667         spec->autocfg.speaker_pins[2] = 0x16;
2668         spec->autocfg.speaker_pins[3] = 0x17;
2669         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
2670 }
2671
2672 static void alc888_lenovo_sky_setup(struct hda_codec *codec)
2673 {
2674         struct alc_spec *spec = codec->spec;
2675
2676         spec->autocfg.hp_pins[0] = 0x1b;
2677         spec->autocfg.speaker_pins[0] = 0x14;
2678         spec->autocfg.speaker_pins[1] = 0x15;
2679         spec->autocfg.speaker_pins[2] = 0x16;
2680         spec->autocfg.speaker_pins[3] = 0x17;
2681         spec->autocfg.speaker_pins[4] = 0x1a;
2682         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
2683 }
2684
2685 static void alc883_vaiott_setup(struct hda_codec *codec)
2686 {
2687         struct alc_spec *spec = codec->spec;
2688
2689         spec->autocfg.hp_pins[0] = 0x15;
2690         spec->autocfg.speaker_pins[0] = 0x14;
2691         spec->autocfg.speaker_pins[1] = 0x17;
2692         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
2693 }
2694
2695 static const struct hda_verb alc888_asus_m90v_verbs[] = {
2696         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2697         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2698         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2699         /* enable unsolicited event */
2700         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2701         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_MIC_EVENT | AC_USRSP_EN},
2702         { } /* end */
2703 };
2704
2705 static void alc883_mode2_setup(struct hda_codec *codec)
2706 {
2707         struct alc_spec *spec = codec->spec;
2708
2709         spec->autocfg.hp_pins[0] = 0x1b;
2710         spec->autocfg.speaker_pins[0] = 0x14;
2711         spec->autocfg.speaker_pins[1] = 0x15;
2712         spec->autocfg.speaker_pins[2] = 0x16;
2713         spec->ext_mic_pin = 0x18;
2714         spec->int_mic_pin = 0x19;
2715         spec->auto_mic = 1;
2716         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
2717 }
2718
2719 static const struct hda_verb alc888_asus_eee1601_verbs[] = {
2720         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2721         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2722         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2723         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2724         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2725         {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
2726         {0x20, AC_VERB_SET_PROC_COEF,  0x0838},
2727         /* enable unsolicited event */
2728         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2729         { } /* end */
2730 };
2731
2732 static void alc883_eee1601_inithook(struct hda_codec *codec)
2733 {
2734         struct alc_spec *spec = codec->spec;
2735
2736         spec->autocfg.hp_pins[0] = 0x14;
2737         spec->autocfg.speaker_pins[0] = 0x1b;
2738         alc_hp_automute(codec);
2739 }
2740
2741 static const struct hda_verb alc889A_mb31_verbs[] = {
2742         /* Init rear pin (used as headphone output) */
2743         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},    /* Apple Headphones */
2744         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},           /* Connect to front */
2745         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2746         /* Init line pin (used as output in 4ch and 6ch mode) */
2747         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},           /* Connect to CLFE */
2748         /* Init line 2 pin (used as headphone out by default) */
2749         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},  /* Use as input */
2750         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
2751         { } /* end */
2752 };
2753
2754 /* Mute speakers according to the headphone jack state */
2755 static void alc889A_mb31_automute(struct hda_codec *codec)
2756 {
2757         unsigned int present;
2758
2759         /* Mute only in 2ch or 4ch mode */
2760         if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
2761             == 0x00) {
2762                 present = snd_hda_jack_detect(codec, 0x15);
2763                 snd_hda_codec_amp_stereo(codec, 0x14,  HDA_OUTPUT, 0,
2764                         HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
2765                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
2766                         HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
2767         }
2768 }
2769
2770 static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
2771 {
2772         if ((res >> 26) == ALC_HP_EVENT)
2773                 alc889A_mb31_automute(codec);
2774 }
2775
2776
2777 static const hda_nid_t alc883_slave_dig_outs[] = {
2778         ALC1200_DIGOUT_NID, 0,
2779 };
2780
2781 static const hda_nid_t alc1200_slave_dig_outs[] = {
2782         ALC883_DIGOUT_NID, 0,
2783 };
2784
2785 static void alc882_unsol_event(struct hda_codec *codec, unsigned int res)
2786 {
2787         alc_exec_unsol_event(codec, res >> 26);
2788 }
2789
2790 /*
2791  * configuration and preset
2792  */
2793 static const char * const alc882_models[ALC882_MODEL_LAST] = {
2794         [ALC882_3ST_DIG]        = "3stack-dig",
2795         [ALC882_6ST_DIG]        = "6stack-dig",
2796         [ALC882_ARIMA]          = "arima",
2797         [ALC882_W2JC]           = "w2jc",
2798         [ALC882_TARGA]          = "targa",
2799         [ALC882_ASUS_A7J]       = "asus-a7j",
2800         [ALC882_ASUS_A7M]       = "asus-a7m",
2801         [ALC885_MACPRO]         = "macpro",
2802         [ALC885_MB5]            = "mb5",
2803         [ALC885_MACMINI3]       = "macmini3",
2804         [ALC885_MBA21]          = "mba21",
2805         [ALC885_MBP3]           = "mbp3",
2806         [ALC885_IMAC24]         = "imac24",
2807         [ALC885_IMAC91]         = "imac91",
2808         [ALC883_3ST_2ch_DIG]    = "3stack-2ch-dig",
2809         [ALC883_3ST_6ch_DIG]    = "3stack-6ch-dig",
2810         [ALC883_3ST_6ch]        = "3stack-6ch",
2811         [ALC883_6ST_DIG]        = "alc883-6stack-dig",
2812         [ALC883_TARGA_DIG]      = "targa-dig",
2813         [ALC883_TARGA_2ch_DIG]  = "targa-2ch-dig",
2814         [ALC883_TARGA_8ch_DIG]  = "targa-8ch-dig",
2815         [ALC883_ACER]           = "acer",
2816         [ALC883_ACER_ASPIRE]    = "acer-aspire",
2817         [ALC888_ACER_ASPIRE_4930G]      = "acer-aspire-4930g",
2818         [ALC888_ACER_ASPIRE_6530G]      = "acer-aspire-6530g",
2819         [ALC888_ACER_ASPIRE_8930G]      = "acer-aspire-8930g",
2820         [ALC888_ACER_ASPIRE_7730G]      = "acer-aspire-7730g",
2821         [ALC883_MEDION]         = "medion",
2822         [ALC883_MEDION_WIM2160] = "medion-wim2160",
2823         [ALC883_LAPTOP_EAPD]    = "laptop-eapd",
2824         [ALC883_LENOVO_101E_2ch] = "lenovo-101e",
2825         [ALC883_LENOVO_NB0763]  = "lenovo-nb0763",
2826         [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
2827         [ALC888_LENOVO_SKY] = "lenovo-sky",
2828         [ALC883_HAIER_W66]      = "haier-w66",
2829         [ALC888_3ST_HP]         = "3stack-hp",
2830         [ALC888_6ST_DELL]       = "6stack-dell",
2831         [ALC883_MITAC]          = "mitac",
2832         [ALC883_CLEVO_M540R]    = "clevo-m540r",
2833         [ALC883_CLEVO_M720]     = "clevo-m720",
2834         [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
2835         [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
2836         [ALC883_3ST_6ch_INTEL]  = "3stack-6ch-intel",
2837         [ALC889A_INTEL]         = "intel-alc889a",
2838         [ALC889_INTEL]          = "intel-x58",
2839         [ALC1200_ASUS_P5Q]      = "asus-p5q",
2840         [ALC889A_MB31]          = "mb31",
2841         [ALC883_SONY_VAIO_TT]   = "sony-vaio-tt",
2842         [ALC882_AUTO]           = "auto",
2843 };
2844
2845 static const struct snd_pci_quirk alc882_cfg_tbl[] = {
2846         SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
2847
2848         SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
2849         SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
2850         SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
2851         SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
2852         SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
2853         SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
2854         SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2855                 ALC888_ACER_ASPIRE_4930G),
2856         SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2857                 ALC888_ACER_ASPIRE_4930G),
2858         SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2859                 ALC888_ACER_ASPIRE_8930G),
2860         SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2861                 ALC888_ACER_ASPIRE_8930G),
2862         SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
2863         SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
2864         SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2865                 ALC888_ACER_ASPIRE_6530G),
2866         SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2867                 ALC888_ACER_ASPIRE_6530G),
2868         SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2869                 ALC888_ACER_ASPIRE_7730G),
2870         /* default Acer -- disabled as it causes more problems.
2871          *    model=auto should work fine now
2872          */
2873         /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
2874
2875         SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
2876
2877         SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavilion", ALC883_6ST_DIG),
2878         SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
2879         SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
2880         SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
2881         SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
2882         SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
2883
2884         SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
2885         SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
2886         SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
2887         SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
2888         SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
2889         SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
2890         SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
2891         SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
2892         SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
2893         SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
2894         SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
2895
2896         SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
2897         SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
2898         SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
2899         SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
2900         SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
2901         SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
2902         SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
2903         SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
2904         SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
2905
2906         SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
2907         SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
2908         SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
2909         SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8  */
2910         SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
2911         SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
2912         SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
2913         SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
2914         SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
2915         SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
2916         SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
2917         SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
2918         SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
2919         SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
2920         SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
2921         SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
2922         SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
2923         SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
2924         SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG),
2925         SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
2926         SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
2927         SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
2928         SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
2929         SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
2930         SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
2931         SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
2932         SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
2933         SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
2934         SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG),
2935         SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
2936         SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
2937
2938         SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
2939         SND_PCI_QUIRK(0x1558, 0x0571, "Clevo laptop M570U", ALC883_3ST_6ch_DIG),
2940         SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
2941         SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
2942         SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
2943         SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
2944         SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
2945         /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
2946         SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
2947         SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
2948                       ALC883_FUJITSU_PI2515),
2949         SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
2950                 ALC888_FUJITSU_XA3530),
2951         SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
2952         SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
2953         SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
2954         SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
2955         SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
2956         SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
2957         SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
2958         SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
2959
2960         SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
2961         SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
2962         SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
2963         SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
2964         SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
2965         SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
2966         SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG),
2967
2968         {}
2969 };
2970
2971 /* codec SSID table for Intel Mac */
2972 static const struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
2973         SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
2974         SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
2975         SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
2976         SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
2977         SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
2978         SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
2979         SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
2980         SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31),
2981         SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_ASUS_A7M),
2982         SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC885_MBP3),
2983         SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC885_MBA21),
2984         SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
2985         SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
2986         SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
2987         SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
2988         SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
2989         SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC885_MB5),
2990         /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
2991          * so apparently no perfect solution yet
2992          */
2993         SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
2994         SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
2995         SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3),
2996         {} /* terminator */
2997 };
2998
2999 static const struct alc_config_preset alc882_presets[] = {
3000         [ALC882_3ST_DIG] = {
3001                 .mixers = { alc882_base_mixer },
3002                 .init_verbs = { alc882_base_init_verbs,
3003                                 alc882_adc1_init_verbs },
3004                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3005                 .dac_nids = alc882_dac_nids,
3006                 .dig_out_nid = ALC882_DIGOUT_NID,
3007                 .dig_in_nid = ALC882_DIGIN_NID,
3008                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
3009                 .channel_mode = alc882_ch_modes,
3010                 .need_dac_fix = 1,
3011                 .input_mux = &alc882_capture_source,
3012         },
3013         [ALC882_6ST_DIG] = {
3014                 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
3015                 .init_verbs = { alc882_base_init_verbs,
3016                                 alc882_adc1_init_verbs },
3017                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3018                 .dac_nids = alc882_dac_nids,
3019                 .dig_out_nid = ALC882_DIGOUT_NID,
3020                 .dig_in_nid = ALC882_DIGIN_NID,
3021                 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
3022                 .channel_mode = alc882_sixstack_modes,
3023                 .input_mux = &alc882_capture_source,
3024         },
3025         [ALC882_ARIMA] = {
3026                 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
3027                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
3028                                 alc882_eapd_verbs },
3029                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3030                 .dac_nids = alc882_dac_nids,
3031                 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
3032                 .channel_mode = alc882_sixstack_modes,
3033                 .input_mux = &alc882_capture_source,
3034         },
3035         [ALC882_W2JC] = {
3036                 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
3037                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
3038                                 alc882_eapd_verbs, alc880_gpio1_init_verbs },
3039                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3040                 .dac_nids = alc882_dac_nids,
3041                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
3042                 .channel_mode = alc880_threestack_modes,
3043                 .need_dac_fix = 1,
3044                 .input_mux = &alc882_capture_source,
3045                 .dig_out_nid = ALC882_DIGOUT_NID,
3046         },
3047            [ALC885_MBA21] = {
3048                         .mixers = { alc885_mba21_mixer },
3049                         .init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
3050                         .num_dacs = 2,
3051                         .dac_nids = alc882_dac_nids,
3052                         .channel_mode = alc885_mba21_ch_modes,
3053                         .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
3054                         .input_mux = &alc882_capture_source,
3055                         .unsol_event = alc882_unsol_event,
3056                         .setup = alc885_mba21_setup,
3057                         .init_hook = alc_hp_automute,
3058        },
3059         [ALC885_MBP3] = {
3060                 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
3061                 .init_verbs = { alc885_mbp3_init_verbs,
3062                                 alc880_gpio1_init_verbs },
3063                 .num_dacs = 2,
3064                 .dac_nids = alc882_dac_nids,
3065                 .hp_nid = 0x04,
3066                 .channel_mode = alc885_mbp_4ch_modes,
3067                 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
3068                 .input_mux = &alc882_capture_source,
3069                 .dig_out_nid = ALC882_DIGOUT_NID,
3070                 .dig_in_nid = ALC882_DIGIN_NID,
3071                 .unsol_event = alc882_unsol_event,
3072                 .setup = alc885_mbp3_setup,
3073                 .init_hook = alc_hp_automute,
3074         },
3075         [ALC885_MB5] = {
3076                 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
3077                 .init_verbs = { alc885_mb5_init_verbs,
3078                                 alc880_gpio1_init_verbs },
3079                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3080                 .dac_nids = alc882_dac_nids,
3081                 .channel_mode = alc885_mb5_6ch_modes,
3082                 .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
3083                 .input_mux = &mb5_capture_source,
3084                 .dig_out_nid = ALC882_DIGOUT_NID,
3085                 .dig_in_nid = ALC882_DIGIN_NID,
3086                 .unsol_event = alc882_unsol_event,
3087                 .setup = alc885_mb5_setup,
3088                 .init_hook = alc_hp_automute,
3089         },
3090         [ALC885_MACMINI3] = {
3091                 .mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
3092                 .init_verbs = { alc885_macmini3_init_verbs,
3093                                 alc880_gpio1_init_verbs },
3094                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3095                 .dac_nids = alc882_dac_nids,
3096                 .channel_mode = alc885_macmini3_6ch_modes,
3097                 .num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes),
3098                 .input_mux = &macmini3_capture_source,
3099                 .dig_out_nid = ALC882_DIGOUT_NID,
3100                 .dig_in_nid = ALC882_DIGIN_NID,
3101                 .unsol_event = alc882_unsol_event,
3102                 .setup = alc885_macmini3_setup,
3103                 .init_hook = alc_hp_automute,
3104         },
3105         [ALC885_MACPRO] = {
3106                 .mixers = { alc882_macpro_mixer },
3107                 .init_verbs = { alc882_macpro_init_verbs },
3108                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3109                 .dac_nids = alc882_dac_nids,
3110                 .dig_out_nid = ALC882_DIGOUT_NID,
3111                 .dig_in_nid = ALC882_DIGIN_NID,
3112                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
3113                 .channel_mode = alc882_ch_modes,
3114                 .input_mux = &alc882_capture_source,
3115                 .init_hook = alc885_macpro_init_hook,
3116         },
3117         [ALC885_IMAC24] = {
3118                 .mixers = { alc885_imac24_mixer },
3119                 .init_verbs = { alc885_imac24_init_verbs },
3120                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3121                 .dac_nids = alc882_dac_nids,
3122                 .dig_out_nid = ALC882_DIGOUT_NID,
3123                 .dig_in_nid = ALC882_DIGIN_NID,
3124                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
3125                 .channel_mode = alc882_ch_modes,
3126                 .input_mux = &alc882_capture_source,
3127                 .unsol_event = alc_sku_unsol_event,
3128                 .setup = alc885_imac24_setup,
3129                 .init_hook = alc885_imac24_init_hook,
3130         },
3131         [ALC885_IMAC91] = {
3132                 .mixers = {alc885_imac91_mixer},
3133                 .init_verbs = { alc885_imac91_init_verbs,
3134                                 alc880_gpio1_init_verbs },
3135                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3136                 .dac_nids = alc882_dac_nids,
3137                 .channel_mode = alc885_mba21_ch_modes,
3138                 .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
3139                 .input_mux = &alc889A_imac91_capture_source,
3140                 .dig_out_nid = ALC882_DIGOUT_NID,
3141                 .dig_in_nid = ALC882_DIGIN_NID,
3142                 .unsol_event = alc882_unsol_event,
3143                 .setup = alc885_imac91_setup,
3144                 .init_hook = alc_hp_automute,
3145         },
3146         [ALC882_TARGA] = {
3147                 .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
3148                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
3149                                 alc880_gpio3_init_verbs, alc882_targa_verbs},
3150                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3151                 .dac_nids = alc882_dac_nids,
3152                 .dig_out_nid = ALC882_DIGOUT_NID,
3153                 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
3154                 .adc_nids = alc882_adc_nids,
3155                 .capsrc_nids = alc882_capsrc_nids,
3156                 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
3157                 .channel_mode = alc882_3ST_6ch_modes,
3158                 .need_dac_fix = 1,
3159                 .input_mux = &alc882_capture_source,
3160                 .unsol_event = alc_sku_unsol_event,
3161                 .setup = alc882_targa_setup,
3162                 .init_hook = alc882_targa_automute,
3163         },
3164         [ALC882_ASUS_A7J] = {
3165                 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
3166                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
3167                                 alc882_asus_a7j_verbs},
3168                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3169                 .dac_nids = alc882_dac_nids,
3170                 .dig_out_nid = ALC882_DIGOUT_NID,
3171                 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
3172                 .adc_nids = alc882_adc_nids,
3173                 .capsrc_nids = alc882_capsrc_nids,
3174                 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
3175                 .channel_mode = alc882_3ST_6ch_modes,
3176                 .need_dac_fix = 1,
3177                 .input_mux = &alc882_capture_source,
3178         },
3179         [ALC882_ASUS_A7M] = {
3180                 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
3181                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
3182                                 alc882_eapd_verbs, alc880_gpio1_init_verbs,
3183                                 alc882_asus_a7m_verbs },
3184                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3185                 .dac_nids = alc882_dac_nids,
3186                 .dig_out_nid = ALC882_DIGOUT_NID,
3187                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
3188                 .channel_mode = alc880_threestack_modes,
3189                 .need_dac_fix = 1,
3190                 .input_mux = &alc882_capture_source,
3191         },
3192         [ALC883_3ST_2ch_DIG] = {
3193                 .mixers = { alc883_3ST_2ch_mixer },
3194                 .init_verbs = { alc883_init_verbs },
3195                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3196                 .dac_nids = alc883_dac_nids,
3197                 .dig_out_nid = ALC883_DIGOUT_NID,
3198                 .dig_in_nid = ALC883_DIGIN_NID,
3199                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3200                 .channel_mode = alc883_3ST_2ch_modes,
3201                 .input_mux = &alc883_capture_source,
3202         },
3203         [ALC883_3ST_6ch_DIG] = {
3204                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
3205                 .init_verbs = { alc883_init_verbs },
3206                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3207                 .dac_nids = alc883_dac_nids,
3208                 .dig_out_nid = ALC883_DIGOUT_NID,
3209                 .dig_in_nid = ALC883_DIGIN_NID,
3210                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3211                 .channel_mode = alc883_3ST_6ch_modes,
3212                 .need_dac_fix = 1,
3213                 .input_mux = &alc883_capture_source,
3214         },
3215         [ALC883_3ST_6ch] = {
3216                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
3217                 .init_verbs = { alc883_init_verbs },
3218                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3219                 .dac_nids = alc883_dac_nids,
3220                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3221                 .channel_mode = alc883_3ST_6ch_modes,
3222                 .need_dac_fix = 1,
3223                 .input_mux = &alc883_capture_source,
3224         },
3225         [ALC883_3ST_6ch_INTEL] = {
3226                 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
3227                 .init_verbs = { alc883_init_verbs },
3228                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3229                 .dac_nids = alc883_dac_nids,
3230                 .dig_out_nid = ALC883_DIGOUT_NID,
3231                 .dig_in_nid = ALC883_DIGIN_NID,
3232                 .slave_dig_outs = alc883_slave_dig_outs,
3233                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
3234                 .channel_mode = alc883_3ST_6ch_intel_modes,
3235                 .need_dac_fix = 1,
3236                 .input_mux = &alc883_3stack_6ch_intel,
3237         },
3238         [ALC889A_INTEL] = {
3239                 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
3240                 .init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
3241                                 alc_hp15_unsol_verbs },
3242                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3243                 .dac_nids = alc883_dac_nids,
3244                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
3245                 .adc_nids = alc889_adc_nids,
3246                 .dig_out_nid = ALC883_DIGOUT_NID,
3247                 .dig_in_nid = ALC883_DIGIN_NID,
3248                 .slave_dig_outs = alc883_slave_dig_outs,
3249                 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
3250                 .channel_mode = alc889_8ch_intel_modes,
3251                 .capsrc_nids = alc889_capsrc_nids,
3252                 .input_mux = &alc889_capture_source,
3253                 .setup = alc889_automute_setup,
3254                 .init_hook = alc_hp_automute,
3255                 .unsol_event = alc_sku_unsol_event,
3256                 .need_dac_fix = 1,
3257         },
3258         [ALC889_INTEL] = {
3259                 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
3260                 .init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
3261                                 alc889_eapd_verbs, alc_hp15_unsol_verbs},
3262                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3263                 .dac_nids = alc883_dac_nids,
3264                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
3265                 .adc_nids = alc889_adc_nids,
3266                 .dig_out_nid = ALC883_DIGOUT_NID,
3267                 .dig_in_nid = ALC883_DIGIN_NID,
3268                 .slave_dig_outs = alc883_slave_dig_outs,
3269                 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
3270                 .channel_mode = alc889_8ch_intel_modes,
3271                 .capsrc_nids = alc889_capsrc_nids,
3272                 .input_mux = &alc889_capture_source,
3273                 .setup = alc889_automute_setup,
3274                 .init_hook = alc889_intel_init_hook,
3275                 .unsol_event = alc_sku_unsol_event,
3276                 .need_dac_fix = 1,
3277         },
3278         [ALC883_6ST_DIG] = {
3279                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
3280                 .init_verbs = { alc883_init_verbs },
3281                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3282                 .dac_nids = alc883_dac_nids,
3283                 .dig_out_nid = ALC883_DIGOUT_NID,
3284                 .dig_in_nid = ALC883_DIGIN_NID,
3285                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
3286                 .channel_mode = alc883_sixstack_modes,
3287                 .input_mux = &alc883_capture_source,
3288         },
3289         [ALC883_TARGA_DIG] = {
3290                 .mixers = { alc883_targa_mixer, alc883_chmode_mixer },
3291                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
3292                                 alc883_targa_verbs},
3293                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3294                 .dac_nids = alc883_dac_nids,
3295                 .dig_out_nid = ALC883_DIGOUT_NID,
3296                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3297                 .channel_mode = alc883_3ST_6ch_modes,
3298                 .need_dac_fix = 1,
3299                 .input_mux = &alc883_capture_source,
3300                 .unsol_event = alc883_targa_unsol_event,
3301                 .setup = alc882_targa_setup,
3302                 .init_hook = alc882_targa_automute,
3303         },
3304         [ALC883_TARGA_2ch_DIG] = {
3305                 .mixers = { alc883_targa_2ch_mixer},
3306                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
3307                                 alc883_targa_verbs},
3308                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3309                 .dac_nids = alc883_dac_nids,
3310                 .adc_nids = alc883_adc_nids_alt,
3311                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
3312                 .capsrc_nids = alc883_capsrc_nids,
3313                 .dig_out_nid = ALC883_DIGOUT_NID,
3314                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3315                 .channel_mode = alc883_3ST_2ch_modes,
3316                 .input_mux = &alc883_capture_source,
3317                 .unsol_event = alc883_targa_unsol_event,
3318                 .setup = alc882_targa_setup,
3319                 .init_hook = alc882_targa_automute,
3320         },
3321         [ALC883_TARGA_8ch_DIG] = {
3322                 .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
3323                             alc883_chmode_mixer },
3324                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
3325                                 alc883_targa_verbs },
3326                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3327                 .dac_nids = alc883_dac_nids,
3328                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
3329                 .adc_nids = alc883_adc_nids_rev,
3330                 .capsrc_nids = alc883_capsrc_nids_rev,
3331                 .dig_out_nid = ALC883_DIGOUT_NID,
3332                 .dig_in_nid = ALC883_DIGIN_NID,
3333                 .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
3334                 .channel_mode = alc883_4ST_8ch_modes,
3335                 .need_dac_fix = 1,
3336                 .input_mux = &alc883_capture_source,
3337                 .unsol_event = alc883_targa_unsol_event,
3338                 .setup = alc882_targa_setup,
3339                 .init_hook = alc882_targa_automute,
3340         },
3341         [ALC883_ACER] = {
3342                 .mixers = { alc883_base_mixer },
3343                 /* On TravelMate laptops, GPIO 0 enables the internal speaker
3344                  * and the headphone jack.  Turn this on and rely on the
3345                  * standard mute methods whenever the user wants to turn
3346                  * these outputs off.
3347                  */
3348                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
3349                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3350                 .dac_nids = alc883_dac_nids,
3351                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3352                 .channel_mode = alc883_3ST_2ch_modes,
3353                 .input_mux = &alc883_capture_source,
3354         },
3355         [ALC883_ACER_ASPIRE] = {
3356                 .mixers = { alc883_acer_aspire_mixer },
3357                 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
3358                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3359                 .dac_nids = alc883_dac_nids,
3360                 .dig_out_nid = ALC883_DIGOUT_NID,
3361                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3362                 .channel_mode = alc883_3ST_2ch_modes,
3363                 .input_mux = &alc883_capture_source,
3364                 .unsol_event = alc_sku_unsol_event,
3365                 .setup = alc883_acer_aspire_setup,
3366                 .init_hook = alc_hp_automute,
3367         },
3368         [ALC888_ACER_ASPIRE_4930G] = {
3369                 .mixers = { alc888_acer_aspire_4930g_mixer,
3370                                 alc883_chmode_mixer },
3371                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
3372                                 alc888_acer_aspire_4930g_verbs },
3373                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3374                 .dac_nids = alc883_dac_nids,
3375                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
3376                 .adc_nids = alc883_adc_nids_rev,
3377                 .capsrc_nids = alc883_capsrc_nids_rev,
3378                 .dig_out_nid = ALC883_DIGOUT_NID,
3379                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3380                 .channel_mode = alc883_3ST_6ch_modes,
3381                 .need_dac_fix = 1,
3382                 .const_channel_count = 6,
3383                 .num_mux_defs =
3384                         ARRAY_SIZE(alc888_2_capture_sources),
3385                 .input_mux = alc888_2_capture_sources,
3386                 .unsol_event = alc_sku_unsol_event,
3387                 .setup = alc888_acer_aspire_4930g_setup,
3388                 .init_hook = alc_hp_automute,
3389         },
3390         [ALC888_ACER_ASPIRE_6530G] = {
3391                 .mixers = { alc888_acer_aspire_6530_mixer },
3392                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
3393                                 alc888_acer_aspire_6530g_verbs },
3394                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3395                 .dac_nids = alc883_dac_nids,
3396                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
3397                 .adc_nids = alc883_adc_nids_rev,
3398                 .capsrc_nids = alc883_capsrc_nids_rev,
3399                 .dig_out_nid = ALC883_DIGOUT_NID,
3400                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3401                 .channel_mode = alc883_3ST_2ch_modes,
3402                 .num_mux_defs =
3403                         ARRAY_SIZE(alc888_2_capture_sources),
3404                 .input_mux = alc888_acer_aspire_6530_sources,
3405                 .unsol_event = alc_sku_unsol_event,
3406                 .setup = alc888_acer_aspire_6530g_setup,
3407                 .init_hook = alc_hp_automute,
3408         },
3409         [ALC888_ACER_ASPIRE_8930G] = {
3410                 .mixers = { alc889_acer_aspire_8930g_mixer,
3411                                 alc883_chmode_mixer },
3412                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
3413                                 alc889_acer_aspire_8930g_verbs,
3414                                 alc889_eapd_verbs},
3415                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3416                 .dac_nids = alc883_dac_nids,
3417                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
3418                 .adc_nids = alc889_adc_nids,
3419                 .capsrc_nids = alc889_capsrc_nids,
3420                 .dig_out_nid = ALC883_DIGOUT_NID,
3421                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3422                 .channel_mode = alc883_3ST_6ch_modes,
3423                 .need_dac_fix = 1,
3424                 .const_channel_count = 6,
3425                 .num_mux_defs =
3426                         ARRAY_SIZE(alc889_capture_sources),
3427                 .input_mux = alc889_capture_sources,
3428                 .unsol_event = alc_sku_unsol_event,
3429                 .setup = alc889_acer_aspire_8930g_setup,
3430                 .init_hook = alc_hp_automute,
3431 #ifdef CONFIG_SND_HDA_POWER_SAVE
3432                 .power_hook = alc_power_eapd,
3433 #endif
3434         },
3435         [ALC888_ACER_ASPIRE_7730G] = {
3436                 .mixers = { alc883_3ST_6ch_mixer,
3437                                 alc883_chmode_mixer },
3438                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
3439                                 alc888_acer_aspire_7730G_verbs },
3440                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3441                 .dac_nids = alc883_dac_nids,
3442                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
3443                 .adc_nids = alc883_adc_nids_rev,
3444                 .capsrc_nids = alc883_capsrc_nids_rev,
3445                 .dig_out_nid = ALC883_DIGOUT_NID,
3446                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3447                 .channel_mode = alc883_3ST_6ch_modes,
3448                 .need_dac_fix = 1,
3449                 .const_channel_count = 6,
3450                 .input_mux = &alc883_capture_source,
3451                 .unsol_event = alc_sku_unsol_event,
3452                 .setup = alc888_acer_aspire_7730g_setup,
3453                 .init_hook = alc_hp_automute,
3454         },
3455         [ALC883_MEDION] = {
3456                 .mixers = { alc883_fivestack_mixer,
3457                             alc883_chmode_mixer },
3458                 .init_verbs = { alc883_init_verbs,
3459                                 alc883_medion_eapd_verbs },
3460                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3461                 .dac_nids = alc883_dac_nids,
3462                 .adc_nids = alc883_adc_nids_alt,
3463                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
3464                 .capsrc_nids = alc883_capsrc_nids,
3465                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
3466                 .channel_mode = alc883_sixstack_modes,
3467                 .input_mux = &alc883_capture_source,
3468         },
3469         [ALC883_MEDION_WIM2160] = {
3470                 .mixers = { alc883_medion_wim2160_mixer },
3471                 .init_verbs = { alc883_init_verbs, alc883_medion_wim2160_verbs },
3472                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3473                 .dac_nids = alc883_dac_nids,
3474                 .dig_out_nid = ALC883_DIGOUT_NID,
3475                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
3476                 .adc_nids = alc883_adc_nids,
3477                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3478                 .channel_mode = alc883_3ST_2ch_modes,
3479                 .input_mux = &alc883_capture_source,
3480                 .unsol_event = alc_sku_unsol_event,
3481                 .setup = alc883_medion_wim2160_setup,
3482                 .init_hook = alc_hp_automute,
3483         },
3484         [ALC883_LAPTOP_EAPD] = {
3485                 .mixers = { alc883_base_mixer },
3486                 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
3487                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3488                 .dac_nids = alc883_dac_nids,
3489                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3490                 .channel_mode = alc883_3ST_2ch_modes,
3491                 .input_mux = &alc883_capture_source,
3492         },
3493         [ALC883_CLEVO_M540R] = {
3494                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
3495                 .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
3496                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3497                 .dac_nids = alc883_dac_nids,
3498                 .dig_out_nid = ALC883_DIGOUT_NID,
3499                 .dig_in_nid = ALC883_DIGIN_NID,
3500                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
3501                 .channel_mode = alc883_3ST_6ch_clevo_modes,
3502                 .need_dac_fix = 1,
3503                 .input_mux = &alc883_capture_source,
3504                 /* This machine has the hardware HP auto-muting, thus
3505                  * we need no software mute via unsol event
3506                  */
3507         },
3508         [ALC883_CLEVO_M720] = {
3509                 .mixers = { alc883_clevo_m720_mixer },
3510                 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
3511                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3512                 .dac_nids = alc883_dac_nids,
3513                 .dig_out_nid = ALC883_DIGOUT_NID,
3514                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3515                 .channel_mode = alc883_3ST_2ch_modes,
3516                 .input_mux = &alc883_capture_source,
3517                 .unsol_event = alc883_clevo_m720_unsol_event,
3518                 .setup = alc883_clevo_m720_setup,
3519                 .init_hook = alc883_clevo_m720_init_hook,
3520         },
3521         [ALC883_LENOVO_101E_2ch] = {
3522                 .mixers = { alc883_lenovo_101e_2ch_mixer},
3523                 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
3524                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3525                 .dac_nids = alc883_dac_nids,
3526                 .adc_nids = alc883_adc_nids_alt,
3527                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
3528                 .capsrc_nids = alc883_capsrc_nids,
3529                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3530                 .channel_mode = alc883_3ST_2ch_modes,
3531                 .input_mux = &alc883_lenovo_101e_capture_source,
3532                 .setup = alc883_lenovo_101e_setup,
3533                 .unsol_event = alc_sku_unsol_event,
3534                 .init_hook = alc_inithook,
3535         },
3536         [ALC883_LENOVO_NB0763] = {
3537                 .mixers = { alc883_lenovo_nb0763_mixer },
3538                 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
3539                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3540                 .dac_nids = alc883_dac_nids,
3541                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3542                 .channel_mode = alc883_3ST_2ch_modes,
3543                 .need_dac_fix = 1,
3544                 .input_mux = &alc883_lenovo_nb0763_capture_source,
3545                 .unsol_event = alc_sku_unsol_event,
3546                 .setup = alc883_lenovo_nb0763_setup,
3547                 .init_hook = alc_hp_automute,
3548         },
3549         [ALC888_LENOVO_MS7195_DIG] = {
3550                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
3551                 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
3552                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3553                 .dac_nids = alc883_dac_nids,
3554                 .dig_out_nid = ALC883_DIGOUT_NID,
3555                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3556                 .channel_mode = alc883_3ST_6ch_modes,
3557                 .need_dac_fix = 1,
3558                 .input_mux = &alc883_capture_source,
3559                 .unsol_event = alc_sku_unsol_event,
3560                 .setup = alc888_lenovo_ms7195_setup,
3561                 .init_hook = alc_inithook,
3562         },
3563         [ALC883_HAIER_W66] = {
3564                 .mixers = { alc883_targa_2ch_mixer},
3565                 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
3566                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3567                 .dac_nids = alc883_dac_nids,
3568                 .dig_out_nid = ALC883_DIGOUT_NID,
3569                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3570                 .channel_mode = alc883_3ST_2ch_modes,
3571                 .input_mux = &alc883_capture_source,
3572                 .unsol_event = alc_sku_unsol_event,
3573                 .setup = alc883_haier_w66_setup,
3574                 .init_hook = alc_hp_automute,
3575         },
3576         [ALC888_3ST_HP] = {
3577                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
3578                 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
3579                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3580                 .dac_nids = alc883_dac_nids,
3581                 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
3582                 .channel_mode = alc888_3st_hp_modes,
3583                 .need_dac_fix = 1,
3584                 .input_mux = &alc883_capture_source,
3585                 .unsol_event = alc_sku_unsol_event,
3586                 .setup = alc888_3st_hp_setup,
3587                 .init_hook = alc_hp_automute,
3588         },
3589         [ALC888_6ST_DELL] = {
3590                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
3591                 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
3592                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3593                 .dac_nids = alc883_dac_nids,
3594                 .dig_out_nid = ALC883_DIGOUT_NID,
3595                 .dig_in_nid = ALC883_DIGIN_NID,
3596                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
3597                 .channel_mode = alc883_sixstack_modes,
3598                 .input_mux = &alc883_capture_source,
3599                 .unsol_event = alc_sku_unsol_event,
3600                 .setup = alc888_6st_dell_setup,
3601                 .init_hook = alc_hp_automute,
3602         },
3603         [ALC883_MITAC] = {
3604                 .mixers = { alc883_mitac_mixer },
3605                 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
3606                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3607                 .dac_nids = alc883_dac_nids,
3608                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3609                 .channel_mode = alc883_3ST_2ch_modes,
3610                 .input_mux = &alc883_capture_source,
3611                 .unsol_event = alc_sku_unsol_event,
3612                 .setup = alc883_mitac_setup,
3613                 .init_hook = alc_hp_automute,
3614         },
3615         [ALC883_FUJITSU_PI2515] = {
3616                 .mixers = { alc883_2ch_fujitsu_pi2515_mixer },
3617                 .init_verbs = { alc883_init_verbs,
3618                                 alc883_2ch_fujitsu_pi2515_verbs},
3619                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3620                 .dac_nids = alc883_dac_nids,
3621                 .dig_out_nid = ALC883_DIGOUT_NID,
3622                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3623                 .channel_mode = alc883_3ST_2ch_modes,
3624                 .input_mux = &alc883_fujitsu_pi2515_capture_source,
3625                 .unsol_event = alc_sku_unsol_event,
3626                 .setup = alc883_2ch_fujitsu_pi2515_setup,
3627                 .init_hook = alc_hp_automute,
3628         },
3629         [ALC888_FUJITSU_XA3530] = {
3630                 .mixers = { alc888_base_mixer, alc883_chmode_mixer },
3631                 .init_verbs = { alc883_init_verbs,
3632                         alc888_fujitsu_xa3530_verbs },
3633                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3634                 .dac_nids = alc883_dac_nids,
3635                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
3636                 .adc_nids = alc883_adc_nids_rev,
3637                 .capsrc_nids = alc883_capsrc_nids_rev,
3638                 .dig_out_nid = ALC883_DIGOUT_NID,
3639                 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
3640                 .channel_mode = alc888_4ST_8ch_intel_modes,
3641                 .num_mux_defs =
3642                         ARRAY_SIZE(alc888_2_capture_sources),
3643                 .input_mux = alc888_2_capture_sources,
3644                 .unsol_event = alc_sku_unsol_event,
3645                 .setup = alc888_fujitsu_xa3530_setup,
3646                 .init_hook = alc_hp_automute,
3647         },
3648         [ALC888_LENOVO_SKY] = {
3649                 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
3650                 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
3651                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3652                 .dac_nids = alc883_dac_nids,
3653                 .dig_out_nid = ALC883_DIGOUT_NID,
3654                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
3655                 .channel_mode = alc883_sixstack_modes,
3656                 .need_dac_fix = 1,
3657                 .input_mux = &alc883_lenovo_sky_capture_source,
3658                 .unsol_event = alc_sku_unsol_event,
3659                 .setup = alc888_lenovo_sky_setup,
3660                 .init_hook = alc_hp_automute,
3661         },
3662         [ALC888_ASUS_M90V] = {
3663                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
3664                 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
3665                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3666                 .dac_nids = alc883_dac_nids,
3667                 .dig_out_nid = ALC883_DIGOUT_NID,
3668                 .dig_in_nid = ALC883_DIGIN_NID,
3669                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3670                 .channel_mode = alc883_3ST_6ch_modes,
3671                 .need_dac_fix = 1,
3672                 .input_mux = &alc883_fujitsu_pi2515_capture_source,
3673                 .unsol_event = alc_sku_unsol_event,
3674                 .setup = alc883_mode2_setup,
3675                 .init_hook = alc_inithook,
3676         },
3677         [ALC888_ASUS_EEE1601] = {
3678                 .mixers = { alc883_asus_eee1601_mixer },
3679                 .cap_mixer = alc883_asus_eee1601_cap_mixer,
3680                 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
3681                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3682                 .dac_nids = alc883_dac_nids,
3683                 .dig_out_nid = ALC883_DIGOUT_NID,
3684                 .dig_in_nid = ALC883_DIGIN_NID,
3685                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3686                 .channel_mode = alc883_3ST_2ch_modes,
3687                 .need_dac_fix = 1,
3688                 .input_mux = &alc883_asus_eee1601_capture_source,
3689                 .unsol_event = alc_sku_unsol_event,
3690                 .init_hook = alc883_eee1601_inithook,
3691         },
3692         [ALC1200_ASUS_P5Q] = {
3693                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
3694                 .init_verbs = { alc883_init_verbs },
3695                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3696                 .dac_nids = alc883_dac_nids,
3697                 .dig_out_nid = ALC1200_DIGOUT_NID,
3698                 .dig_in_nid = ALC883_DIGIN_NID,
3699                 .slave_dig_outs = alc1200_slave_dig_outs,
3700                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
3701                 .channel_mode = alc883_sixstack_modes,
3702                 .input_mux = &alc883_capture_source,
3703         },
3704         [ALC889A_MB31] = {
3705                 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
3706                 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
3707                         alc880_gpio1_init_verbs },
3708                 .adc_nids = alc883_adc_nids,
3709                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
3710                 .capsrc_nids = alc883_capsrc_nids,
3711                 .dac_nids = alc883_dac_nids,
3712                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3713                 .channel_mode = alc889A_mb31_6ch_modes,
3714                 .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
3715                 .input_mux = &alc889A_mb31_capture_source,
3716                 .dig_out_nid = ALC883_DIGOUT_NID,
3717                 .unsol_event = alc889A_mb31_unsol_event,
3718                 .init_hook = alc889A_mb31_automute,
3719         },
3720         [ALC883_SONY_VAIO_TT] = {
3721                 .mixers = { alc883_vaiott_mixer },
3722                 .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
3723                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3724                 .dac_nids = alc883_dac_nids,
3725                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3726                 .channel_mode = alc883_3ST_2ch_modes,
3727                 .input_mux = &alc883_capture_source,
3728                 .unsol_event = alc_sku_unsol_event,
3729                 .setup = alc883_vaiott_setup,
3730                 .init_hook = alc_hp_automute,
3731         },
3732 };
3733
3734