aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/alc882_quirks.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/pci/hda/alc882_quirks.c')
-rw-r--r--sound/pci/hda/alc882_quirks.c2867
1 files changed, 0 insertions, 2867 deletions
diff --git a/sound/pci/hda/alc882_quirks.c b/sound/pci/hda/alc882_quirks.c
index e251514a26a..bdf0ed4ab3e 100644
--- a/sound/pci/hda/alc882_quirks.c
+++ b/sound/pci/hda/alc882_quirks.c
@@ -6,509 +6,15 @@
6/* ALC882 models */ 6/* ALC882 models */
7enum { 7enum {
8 ALC882_AUTO, 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, 9 ALC885_MBA21,
18 ALC885_MBP3, 10 ALC885_MBP3,
19 ALC885_MB5, 11 ALC885_MB5,
20 ALC885_MACMINI3, 12 ALC885_MACMINI3,
21 ALC885_IMAC24,
22 ALC885_IMAC91, 13 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, 14 ALC889A_MB31,
57 ALC1200_ASUS_P5Q,
58 ALC883_SONY_VAIO_TT,
59 ALC882_MODEL_LAST, 15 ALC882_MODEL_LAST,
60}; 16};
61 17
62/*
63 * 2ch mode
64 */
65static 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 */
80static 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 */
95static 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 */
110static 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
122static 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
133static 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
166static 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
179static void alc889_intel_init_hook(struct hda_codec *codec)
180{
181 alc889_coef_init(codec);
182 alc_hp_automute(codec);
183}
184
185static 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
200static 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
223static 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
253static 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
283static 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
329static 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
350static 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
373static 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
405static 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
427static 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
449static 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
468static 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
479static 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
490static 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
501static 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 18#define ALC882_DIGOUT_NID 0x06
513#define ALC882_DIGIN_NID 0x0a 19#define ALC882_DIGIN_NID 0x0a
514#define ALC883_DIGOUT_NID ALC882_DIGOUT_NID 20#define ALC883_DIGOUT_NID ALC882_DIGOUT_NID
@@ -531,15 +37,9 @@ static const hda_nid_t alc882_dac_nids[4] = {
531#define alc882_adc_nids alc880_adc_nids 37#define alc882_adc_nids alc880_adc_nids
532#define alc882_adc_nids_alt alc880_adc_nids_alt 38#define alc882_adc_nids_alt alc880_adc_nids_alt
533#define alc883_adc_nids alc882_adc_nids_alt 39#define alc883_adc_nids alc882_adc_nids_alt
534static const hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
535static const hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
536#define alc889_adc_nids alc880_adc_nids
537 40
538static const hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
539static const hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 }; 41static const hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
540#define alc883_capsrc_nids alc882_capsrc_nids_alt 42#define alc883_capsrc_nids alc882_capsrc_nids_alt
541static const hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
542#define alc889_capsrc_nids alc882_capsrc_nids
543 43
544/* input MUX */ 44/* input MUX */
545/* FIXME: should be a matrix-type input source selection */ 45/* FIXME: should be a matrix-type input source selection */
@@ -556,15 +56,6 @@ static const struct hda_input_mux alc882_capture_source = {
556 56
557#define alc883_capture_source alc882_capture_source 57#define alc883_capture_source alc882_capture_source
558 58
559static 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
568static const struct hda_input_mux mb5_capture_source = { 59static const struct hda_input_mux mb5_capture_source = {
569 .num_items = 3, 60 .num_items = 3,
570 .items = { 61 .items = {
@@ -592,49 +83,6 @@ static const struct hda_input_mux alc883_3stack_6ch_intel = {
592 }, 83 },
593}; 84};
594 85
595static 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
603static 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
613static 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
621static 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
630static 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
638static const struct hda_input_mux alc889A_mb31_capture_source = { 86static const struct hda_input_mux alc889A_mb31_capture_source = {
639 .num_items = 2, 87 .num_items = 2,
640 .items = { 88 .items = {
@@ -654,131 +102,6 @@ static const struct hda_input_mux alc889A_imac91_capture_source = {
654 }, 102 },
655}; 103};
656 104
657/*
658 * 2ch mode
659 */
660static const struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
661 { 2, NULL }
662};
663
664/*
665 * 2ch mode
666 */
667static 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 */
678static 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 */
690static 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
700static 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 */
711static 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 */
723static 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 */
736static 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
747static 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 */
757static 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 */
768static 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
776static 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 */ 105/* Macbook Air 2,1 */
783 106
784static const struct hda_channel_mode alc885_mba21_ch_modes[1] = { 107static const struct hda_channel_mode alc885_mba21_ch_modes[1] = {
@@ -847,216 +170,6 @@ static const struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
847 170
848#define alc885_macmini3_6ch_modes alc885_mb5_6ch_modes 171#define alc885_macmini3_6ch_modes alc885_mb5_6ch_modes
849 172
850/*
851 * 2ch mode
852 */
853static 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 */
866static 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 */
880static 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 */
895static 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
908static 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 */
919static 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 */
930static 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 */
942static 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
952static 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 */
961static 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 */
974static 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 */
987static 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
998static 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 */
1007static 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 */
1018static 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
1026static 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 */
1035static 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 */ 173/* Macbook Air 2,1 same control for HP and internal Speaker */
1061 174
1062static const struct snd_kcontrol_new alc885_mba21_mixer[] = { 175static const struct snd_kcontrol_new alc885_mba21_mixer[] = {
@@ -1121,70 +234,6 @@ static const struct snd_kcontrol_new alc885_imac91_mixer[] = {
1121}; 234};
1122 235
1123 236
1124static 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
1137static 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 */
1157static 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
1174static 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
1188static const struct snd_kcontrol_new alc882_chmode_mixer[] = { 237static const struct snd_kcontrol_new alc882_chmode_mixer[] = {
1189 { 238 {
1190 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 239 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
@@ -1258,179 +307,8 @@ static const struct hda_verb alc882_base_init_verbs[] = {
1258 { } 307 { }
1259}; 308};
1260 309
1261static 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
1273static 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
1280static 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
1286static 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
1292static 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
1351static 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 */
1360static 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 310#define alc883_init_verbs alc882_base_init_verbs
1368 311
1369/* Mac Pro test */
1370static 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
1383static 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 */ 312/* Macbook 5,1 */
1435static const struct hda_verb alc885_mb5_init_verbs[] = { 313static const struct hda_verb alc885_mb5_init_verbs[] = {
1436 /* DACs */ 314 /* DACs */
@@ -1669,34 +547,6 @@ static const struct hda_verb alc885_imac91_init_verbs[] = {
1669 { } 547 { }
1670}; 548};
1671 549
1672/* iMac 24 mixer. */
1673static 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. */
1680static 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 */ 550/* Toggle speaker-output according to the hp-jack state */
1701static void alc885_imac24_setup(struct hda_codec *codec) 551static void alc885_imac24_setup(struct hda_codec *codec)
1702{ 552{
@@ -1742,127 +592,6 @@ static void alc885_imac91_setup(struct hda_codec *codec)
1742 alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP); 592 alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
1743} 593}
1744 594
1745static 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 */
1761static 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
1769static 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
1778static 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
1784static 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
1802static 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
1820static 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 */
1853static 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 */
1860static 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) */ 595/* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
1867static const struct hda_verb alc889A_mb31_ch2_init[] = { 596static const struct hda_verb alc889A_mb31_ch2_init[] = {
1868 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */ 597 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
@@ -1906,77 +635,6 @@ static const struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
1906 { 6, alc889A_mb31_ch6_init }, 635 { 6, alc889A_mb31_ch6_init },
1907}; 636};
1908 637
1909static 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
1918static 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
1935static 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
1949static 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
1963static 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
1980static const struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = { 638static const struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
1981 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 639 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1982 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 640 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
@@ -2000,235 +658,6 @@ static const struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
2000 { } /* end */ 658 { } /* end */
2001}; 659};
2002 660
2003static 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
2027static 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
2051static 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
2074static 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
2095static 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
2111static 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
2120static 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
2132static 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
2145static 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
2155static 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 */
2173static 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
2182static 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
2194static 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
2207static 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
2232static const struct snd_kcontrol_new alc889A_mb31_mixer[] = { 661static const struct snd_kcontrol_new alc889A_mb31_mixer[] = {
2233 /* Output mixers */ 662 /* Output mixers */
2234 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 663 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
@@ -2255,61 +684,6 @@ static const struct snd_kcontrol_new alc889A_mb31_mixer[] = {
2255 { } /* end */ 684 { } /* end */
2256}; 685};
2257 686
2258static 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
2268static 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
2277static 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
2286static 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
2298static 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
2313static const struct snd_kcontrol_new alc883_chmode_mixer[] = { 687static const struct snd_kcontrol_new alc883_chmode_mixer[] = {
2314 { 688 {
2315 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 689 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
@@ -2321,423 +695,6 @@ static const struct snd_kcontrol_new alc883_chmode_mixer[] = {
2321 { } /* end */ 695 { } /* end */
2322}; 696};
2323 697
2324/* toggle speaker-output according to the hp-jack state */
2325static 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
2335static 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
2350static 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
2366static 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
2381static 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
2395static 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
2424static 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
2431static 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
2439static 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
2448static 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
2461static 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
2473static const struct hda_verb alc888_6st_dell_verbs[] = {
2474 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
2475 { }
2476};
2477
2478static 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
2489static 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
2500static 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 */
2511static 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 */
2522static 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 */
2534static 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
2544static 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
2550static 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 */
2561static 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
2574static 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
2583static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
2584{
2585 alc_hp_automute(codec);
2586 alc88x_simple_mic_automute(codec);
2587}
2588
2589static 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 */
2603static 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
2612static 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
2621static 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 */
2632static 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
2642static 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
2660static 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
2672static 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
2685static 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
2695static 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
2705static 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
2719static 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
2732static 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
2741static const struct hda_verb alc889A_mb31_verbs[] = { 698static const struct hda_verb alc889A_mb31_verbs[] = {
2742 /* Init rear pin (used as headphone output) */ 699 /* Init rear pin (used as headphone output) */
2743 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */ 700 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */
@@ -2773,211 +730,30 @@ static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
2773 alc889A_mb31_automute(codec); 730 alc889A_mb31_automute(codec);
2774} 731}
2775 732
2776static const hda_nid_t alc883_slave_dig_outs[] = {
2777 ALC1200_DIGOUT_NID, 0,
2778};
2779
2780static const hda_nid_t alc1200_slave_dig_outs[] = {
2781 ALC883_DIGOUT_NID, 0,
2782};
2783
2784/* 733/*
2785 * configuration and preset 734 * configuration and preset
2786 */ 735 */
2787static const char * const alc882_models[ALC882_MODEL_LAST] = { 736static const char * const alc882_models[ALC882_MODEL_LAST] = {
2788 [ALC882_3ST_DIG] = "3stack-dig",
2789 [ALC882_6ST_DIG] = "6stack-dig",
2790 [ALC882_ARIMA] = "arima",
2791 [ALC882_W2JC] = "w2jc",
2792 [ALC882_TARGA] = "targa",
2793 [ALC882_ASUS_A7J] = "asus-a7j",
2794 [ALC882_ASUS_A7M] = "asus-a7m",
2795 [ALC885_MACPRO] = "macpro",
2796 [ALC885_MB5] = "mb5", 737 [ALC885_MB5] = "mb5",
2797 [ALC885_MACMINI3] = "macmini3", 738 [ALC885_MACMINI3] = "macmini3",
2798 [ALC885_MBA21] = "mba21", 739 [ALC885_MBA21] = "mba21",
2799 [ALC885_MBP3] = "mbp3", 740 [ALC885_MBP3] = "mbp3",
2800 [ALC885_IMAC24] = "imac24",
2801 [ALC885_IMAC91] = "imac91", 741 [ALC885_IMAC91] = "imac91",
2802 [ALC883_3ST_2ch_DIG] = "3stack-2ch-dig",
2803 [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig",
2804 [ALC883_3ST_6ch] = "3stack-6ch",
2805 [ALC883_6ST_DIG] = "alc883-6stack-dig",
2806 [ALC883_TARGA_DIG] = "targa-dig",
2807 [ALC883_TARGA_2ch_DIG] = "targa-2ch-dig",
2808 [ALC883_TARGA_8ch_DIG] = "targa-8ch-dig",
2809 [ALC883_ACER] = "acer",
2810 [ALC883_ACER_ASPIRE] = "acer-aspire",
2811 [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g",
2812 [ALC888_ACER_ASPIRE_6530G] = "acer-aspire-6530g",
2813 [ALC888_ACER_ASPIRE_8930G] = "acer-aspire-8930g",
2814 [ALC888_ACER_ASPIRE_7730G] = "acer-aspire-7730g",
2815 [ALC883_MEDION] = "medion",
2816 [ALC883_MEDION_WIM2160] = "medion-wim2160",
2817 [ALC883_LAPTOP_EAPD] = "laptop-eapd",
2818 [ALC883_LENOVO_101E_2ch] = "lenovo-101e",
2819 [ALC883_LENOVO_NB0763] = "lenovo-nb0763",
2820 [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
2821 [ALC888_LENOVO_SKY] = "lenovo-sky",
2822 [ALC883_HAIER_W66] = "haier-w66",
2823 [ALC888_3ST_HP] = "3stack-hp",
2824 [ALC888_6ST_DELL] = "6stack-dell",
2825 [ALC883_MITAC] = "mitac",
2826 [ALC883_CLEVO_M540R] = "clevo-m540r",
2827 [ALC883_CLEVO_M720] = "clevo-m720",
2828 [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
2829 [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
2830 [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel",
2831 [ALC889A_INTEL] = "intel-alc889a",
2832 [ALC889_INTEL] = "intel-x58",
2833 [ALC1200_ASUS_P5Q] = "asus-p5q",
2834 [ALC889A_MB31] = "mb31", 742 [ALC889A_MB31] = "mb31",
2835 [ALC883_SONY_VAIO_TT] = "sony-vaio-tt",
2836 [ALC882_AUTO] = "auto", 743 [ALC882_AUTO] = "auto",
2837}; 744};
2838 745
2839static const struct snd_pci_quirk alc882_cfg_tbl[] = {
2840 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
2841
2842 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
2843 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
2844 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
2845 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
2846 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
2847 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
2848 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2849 ALC888_ACER_ASPIRE_4930G),
2850 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2851 ALC888_ACER_ASPIRE_4930G),
2852 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2853 ALC888_ACER_ASPIRE_8930G),
2854 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2855 ALC888_ACER_ASPIRE_8930G),
2856 SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
2857 SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
2858 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2859 ALC888_ACER_ASPIRE_6530G),
2860 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2861 ALC888_ACER_ASPIRE_6530G),
2862 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2863 ALC888_ACER_ASPIRE_7730G),
2864 /* default Acer -- disabled as it causes more problems.
2865 * model=auto should work fine now
2866 */
2867 /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
2868
2869 SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
2870
2871 SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavilion", ALC883_6ST_DIG),
2872 SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
2873 SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
2874 SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
2875 SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
2876 SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
2877
2878 SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
2879 SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
2880 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
2881 SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
2882 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
2883 SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
2884 SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
2885 SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
2886 SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
2887 SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
2888 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
2889
2890 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
2891 SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
2892 SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
2893 SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
2894 SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
2895 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
2896 SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
2897 SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
2898 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
2899
2900 SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
2901 SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
2902 SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
2903 SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */
2904 SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
2905 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
2906 SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
2907 SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
2908 SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
2909 SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
2910 SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
2911 SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
2912 SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
2913 SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
2914 SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
2915 SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
2916 SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
2917 SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
2918 SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG),
2919 SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
2920 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
2921 SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
2922 SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
2923 SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
2924 SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
2925 SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
2926 SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
2927 SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
2928 SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG),
2929 SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
2930 SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
2931
2932 SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
2933 SND_PCI_QUIRK(0x1558, 0x0571, "Clevo laptop M570U", ALC883_3ST_6ch_DIG),
2934 SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
2935 SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
2936 SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
2937 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
2938 SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
2939 /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
2940 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
2941 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
2942 ALC883_FUJITSU_PI2515),
2943 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
2944 ALC888_FUJITSU_XA3530),
2945 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
2946 SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
2947 SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
2948 SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
2949 SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
2950 SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
2951 SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
2952 SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
2953
2954 SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
2955 SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
2956 SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
2957 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
2958 SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
2959 SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
2960 SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG),
2961
2962 {}
2963};
2964
2965/* codec SSID table for Intel Mac */ 746/* codec SSID table for Intel Mac */
2966static const struct snd_pci_quirk alc882_ssid_cfg_tbl[] = { 747static const struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
2967 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3), 748 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
2968 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3), 749 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
2969 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3), 750 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
2970 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
2971 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
2972 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
2973 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3), 751 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
2974 SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31), 752 SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31),
2975 SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_ASUS_A7M),
2976 SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC885_MBP3), 753 SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC885_MBP3),
2977 SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC885_MBA21), 754 SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC885_MBA21),
2978 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31), 755 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
2979 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3), 756 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
2980 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
2981 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91), 757 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
2982 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5), 758 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
2983 SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC885_MB5), 759 SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC885_MB5),
@@ -2991,53 +767,6 @@ static const struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
2991}; 767};
2992 768
2993static const struct alc_config_preset alc882_presets[] = { 769static const struct alc_config_preset alc882_presets[] = {
2994 [ALC882_3ST_DIG] = {
2995 .mixers = { alc882_base_mixer },
2996 .init_verbs = { alc882_base_init_verbs,
2997 alc882_adc1_init_verbs },
2998 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
2999 .dac_nids = alc882_dac_nids,
3000 .dig_out_nid = ALC882_DIGOUT_NID,
3001 .dig_in_nid = ALC882_DIGIN_NID,
3002 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
3003 .channel_mode = alc882_ch_modes,
3004 .need_dac_fix = 1,
3005 .input_mux = &alc882_capture_source,
3006 },
3007 [ALC882_6ST_DIG] = {
3008 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
3009 .init_verbs = { alc882_base_init_verbs,
3010 alc882_adc1_init_verbs },
3011 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3012 .dac_nids = alc882_dac_nids,
3013 .dig_out_nid = ALC882_DIGOUT_NID,
3014 .dig_in_nid = ALC882_DIGIN_NID,
3015 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
3016 .channel_mode = alc882_sixstack_modes,
3017 .input_mux = &alc882_capture_source,
3018 },
3019 [ALC882_ARIMA] = {
3020 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
3021 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
3022 alc882_eapd_verbs },
3023 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3024 .dac_nids = alc882_dac_nids,
3025 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
3026 .channel_mode = alc882_sixstack_modes,
3027 .input_mux = &alc882_capture_source,
3028 },
3029 [ALC882_W2JC] = {
3030 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
3031 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
3032 alc882_eapd_verbs, alc880_gpio1_init_verbs },
3033 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3034 .dac_nids = alc882_dac_nids,
3035 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
3036 .channel_mode = alc880_threestack_modes,
3037 .need_dac_fix = 1,
3038 .input_mux = &alc882_capture_source,
3039 .dig_out_nid = ALC882_DIGOUT_NID,
3040 },
3041 [ALC885_MBA21] = { 770 [ALC885_MBA21] = {
3042 .mixers = { alc885_mba21_mixer }, 771 .mixers = { alc885_mba21_mixer },
3043 .init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs }, 772 .init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
@@ -3096,32 +825,6 @@ static const struct alc_config_preset alc882_presets[] = {
3096 .setup = alc885_macmini3_setup, 825 .setup = alc885_macmini3_setup,
3097 .init_hook = alc_hp_automute, 826 .init_hook = alc_hp_automute,
3098 }, 827 },
3099 [ALC885_MACPRO] = {
3100 .mixers = { alc882_macpro_mixer },
3101 .init_verbs = { alc882_macpro_init_verbs },
3102 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3103 .dac_nids = alc882_dac_nids,
3104 .dig_out_nid = ALC882_DIGOUT_NID,
3105 .dig_in_nid = ALC882_DIGIN_NID,
3106 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
3107 .channel_mode = alc882_ch_modes,
3108 .input_mux = &alc882_capture_source,
3109 .init_hook = alc885_macpro_init_hook,
3110 },
3111 [ALC885_IMAC24] = {
3112 .mixers = { alc885_imac24_mixer },
3113 .init_verbs = { alc885_imac24_init_verbs },
3114 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3115 .dac_nids = alc882_dac_nids,
3116 .dig_out_nid = ALC882_DIGOUT_NID,
3117 .dig_in_nid = ALC882_DIGIN_NID,
3118 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
3119 .channel_mode = alc882_ch_modes,
3120 .input_mux = &alc882_capture_source,
3121 .unsol_event = alc_sku_unsol_event,
3122 .setup = alc885_imac24_setup,
3123 .init_hook = alc885_imac24_init_hook,
3124 },
3125 [ALC885_IMAC91] = { 828 [ALC885_IMAC91] = {
3126 .mixers = {alc885_imac91_mixer}, 829 .mixers = {alc885_imac91_mixer},
3127 .init_verbs = { alc885_imac91_init_verbs, 830 .init_verbs = { alc885_imac91_init_verbs,
@@ -3137,564 +840,6 @@ static const struct alc_config_preset alc882_presets[] = {
3137 .setup = alc885_imac91_setup, 840 .setup = alc885_imac91_setup,
3138 .init_hook = alc_hp_automute, 841 .init_hook = alc_hp_automute,
3139 }, 842 },
3140 [ALC882_TARGA] = {
3141 .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
3142 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
3143 alc880_gpio3_init_verbs, alc882_targa_verbs},
3144 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3145 .dac_nids = alc882_dac_nids,
3146 .dig_out_nid = ALC882_DIGOUT_NID,
3147 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
3148 .adc_nids = alc882_adc_nids,
3149 .capsrc_nids = alc882_capsrc_nids,
3150 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
3151 .channel_mode = alc882_3ST_6ch_modes,
3152 .need_dac_fix = 1,
3153 .input_mux = &alc882_capture_source,
3154 .unsol_event = alc_sku_unsol_event,
3155 .setup = alc882_targa_setup,
3156 .init_hook = alc882_targa_automute,
3157 },
3158 [ALC882_ASUS_A7J] = {
3159 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
3160 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
3161 alc882_asus_a7j_verbs},
3162 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3163 .dac_nids = alc882_dac_nids,
3164 .dig_out_nid = ALC882_DIGOUT_NID,
3165 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
3166 .adc_nids = alc882_adc_nids,
3167 .capsrc_nids = alc882_capsrc_nids,
3168 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
3169 .channel_mode = alc882_3ST_6ch_modes,
3170 .need_dac_fix = 1,
3171 .input_mux = &alc882_capture_source,
3172 },
3173 [ALC882_ASUS_A7M] = {
3174 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
3175 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
3176 alc882_eapd_verbs, alc880_gpio1_init_verbs,
3177 alc882_asus_a7m_verbs },
3178 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
3179 .dac_nids = alc882_dac_nids,
3180 .dig_out_nid = ALC882_DIGOUT_NID,
3181 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
3182 .channel_mode = alc880_threestack_modes,
3183 .need_dac_fix = 1,
3184 .input_mux = &alc882_capture_source,
3185 },
3186 [ALC883_3ST_2ch_DIG] = {
3187 .mixers = { alc883_3ST_2ch_mixer },
3188 .init_verbs = { alc883_init_verbs },
3189 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3190 .dac_nids = alc883_dac_nids,
3191 .dig_out_nid = ALC883_DIGOUT_NID,
3192 .dig_in_nid = ALC883_DIGIN_NID,
3193 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3194 .channel_mode = alc883_3ST_2ch_modes,
3195 .input_mux = &alc883_capture_source,
3196 },
3197 [ALC883_3ST_6ch_DIG] = {
3198 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
3199 .init_verbs = { alc883_init_verbs },
3200 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3201 .dac_nids = alc883_dac_nids,
3202 .dig_out_nid = ALC883_DIGOUT_NID,
3203 .dig_in_nid = ALC883_DIGIN_NID,
3204 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3205 .channel_mode = alc883_3ST_6ch_modes,
3206 .need_dac_fix = 1,
3207 .input_mux = &alc883_capture_source,
3208 },
3209 [ALC883_3ST_6ch] = {
3210 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
3211 .init_verbs = { alc883_init_verbs },
3212 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3213 .dac_nids = alc883_dac_nids,
3214 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3215 .channel_mode = alc883_3ST_6ch_modes,
3216 .need_dac_fix = 1,
3217 .input_mux = &alc883_capture_source,
3218 },
3219 [ALC883_3ST_6ch_INTEL] = {
3220 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
3221 .init_verbs = { alc883_init_verbs },
3222 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3223 .dac_nids = alc883_dac_nids,
3224 .dig_out_nid = ALC883_DIGOUT_NID,
3225 .dig_in_nid = ALC883_DIGIN_NID,
3226 .slave_dig_outs = alc883_slave_dig_outs,
3227 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
3228 .channel_mode = alc883_3ST_6ch_intel_modes,
3229 .need_dac_fix = 1,
3230 .input_mux = &alc883_3stack_6ch_intel,
3231 },
3232 [ALC889A_INTEL] = {
3233 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
3234 .init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
3235 alc_hp15_unsol_verbs },
3236 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3237 .dac_nids = alc883_dac_nids,
3238 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
3239 .adc_nids = alc889_adc_nids,
3240 .dig_out_nid = ALC883_DIGOUT_NID,
3241 .dig_in_nid = ALC883_DIGIN_NID,
3242 .slave_dig_outs = alc883_slave_dig_outs,
3243 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
3244 .channel_mode = alc889_8ch_intel_modes,
3245 .capsrc_nids = alc889_capsrc_nids,
3246 .input_mux = &alc889_capture_source,
3247 .setup = alc889_automute_setup,
3248 .init_hook = alc_hp_automute,
3249 .unsol_event = alc_sku_unsol_event,
3250 .need_dac_fix = 1,
3251 },
3252 [ALC889_INTEL] = {
3253 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
3254 .init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
3255 alc889_eapd_verbs, alc_hp15_unsol_verbs},
3256 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3257 .dac_nids = alc883_dac_nids,
3258 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
3259 .adc_nids = alc889_adc_nids,
3260 .dig_out_nid = ALC883_DIGOUT_NID,
3261 .dig_in_nid = ALC883_DIGIN_NID,
3262 .slave_dig_outs = alc883_slave_dig_outs,
3263 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
3264 .channel_mode = alc889_8ch_intel_modes,
3265 .capsrc_nids = alc889_capsrc_nids,
3266 .input_mux = &alc889_capture_source,
3267 .setup = alc889_automute_setup,
3268 .init_hook = alc889_intel_init_hook,
3269 .unsol_event = alc_sku_unsol_event,
3270 .need_dac_fix = 1,
3271 },
3272 [ALC883_6ST_DIG] = {
3273 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
3274 .init_verbs = { alc883_init_verbs },
3275 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3276 .dac_nids = alc883_dac_nids,
3277 .dig_out_nid = ALC883_DIGOUT_NID,
3278 .dig_in_nid = ALC883_DIGIN_NID,
3279 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
3280 .channel_mode = alc883_sixstack_modes,
3281 .input_mux = &alc883_capture_source,
3282 },
3283 [ALC883_TARGA_DIG] = {
3284 .mixers = { alc883_targa_mixer, alc883_chmode_mixer },
3285 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
3286 alc883_targa_verbs},
3287 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3288 .dac_nids = alc883_dac_nids,
3289 .dig_out_nid = ALC883_DIGOUT_NID,
3290 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3291 .channel_mode = alc883_3ST_6ch_modes,
3292 .need_dac_fix = 1,
3293 .input_mux = &alc883_capture_source,
3294 .unsol_event = alc883_targa_unsol_event,
3295 .setup = alc882_targa_setup,
3296 .init_hook = alc882_targa_automute,
3297 },
3298 [ALC883_TARGA_2ch_DIG] = {
3299 .mixers = { alc883_targa_2ch_mixer},
3300 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
3301 alc883_targa_verbs},
3302 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3303 .dac_nids = alc883_dac_nids,
3304 .adc_nids = alc883_adc_nids_alt,
3305 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
3306 .capsrc_nids = alc883_capsrc_nids,
3307 .dig_out_nid = ALC883_DIGOUT_NID,
3308 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3309 .channel_mode = alc883_3ST_2ch_modes,
3310 .input_mux = &alc883_capture_source,
3311 .unsol_event = alc883_targa_unsol_event,
3312 .setup = alc882_targa_setup,
3313 .init_hook = alc882_targa_automute,
3314 },
3315 [ALC883_TARGA_8ch_DIG] = {
3316 .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
3317 alc883_chmode_mixer },
3318 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
3319 alc883_targa_verbs },
3320 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3321 .dac_nids = alc883_dac_nids,
3322 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
3323 .adc_nids = alc883_adc_nids_rev,
3324 .capsrc_nids = alc883_capsrc_nids_rev,
3325 .dig_out_nid = ALC883_DIGOUT_NID,
3326 .dig_in_nid = ALC883_DIGIN_NID,
3327 .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
3328 .channel_mode = alc883_4ST_8ch_modes,
3329 .need_dac_fix = 1,
3330 .input_mux = &alc883_capture_source,
3331 .unsol_event = alc883_targa_unsol_event,
3332 .setup = alc882_targa_setup,
3333 .init_hook = alc882_targa_automute,
3334 },
3335 [ALC883_ACER] = {
3336 .mixers = { alc883_base_mixer },
3337 /* On TravelMate laptops, GPIO 0 enables the internal speaker
3338 * and the headphone jack. Turn this on and rely on the
3339 * standard mute methods whenever the user wants to turn
3340 * these outputs off.
3341 */
3342 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
3343 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3344 .dac_nids = alc883_dac_nids,
3345 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3346 .channel_mode = alc883_3ST_2ch_modes,
3347 .input_mux = &alc883_capture_source,
3348 },
3349 [ALC883_ACER_ASPIRE] = {
3350 .mixers = { alc883_acer_aspire_mixer },
3351 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
3352 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3353 .dac_nids = alc883_dac_nids,
3354 .dig_out_nid = ALC883_DIGOUT_NID,
3355 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3356 .channel_mode = alc883_3ST_2ch_modes,
3357 .input_mux = &alc883_capture_source,
3358 .unsol_event = alc_sku_unsol_event,
3359 .setup = alc883_acer_aspire_setup,
3360 .init_hook = alc_hp_automute,
3361 },
3362 [ALC888_ACER_ASPIRE_4930G] = {
3363 .mixers = { alc888_acer_aspire_4930g_mixer,
3364 alc883_chmode_mixer },
3365 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
3366 alc888_acer_aspire_4930g_verbs },
3367 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3368 .dac_nids = alc883_dac_nids,
3369 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
3370 .adc_nids = alc883_adc_nids_rev,
3371 .capsrc_nids = alc883_capsrc_nids_rev,
3372 .dig_out_nid = ALC883_DIGOUT_NID,
3373 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3374 .channel_mode = alc883_3ST_6ch_modes,
3375 .need_dac_fix = 1,
3376 .const_channel_count = 6,
3377 .num_mux_defs =
3378 ARRAY_SIZE(alc888_2_capture_sources),
3379 .input_mux = alc888_2_capture_sources,
3380 .unsol_event = alc_sku_unsol_event,
3381 .setup = alc888_acer_aspire_4930g_setup,
3382 .init_hook = alc_hp_automute,
3383 },
3384 [ALC888_ACER_ASPIRE_6530G] = {
3385 .mixers = { alc888_acer_aspire_6530_mixer },
3386 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
3387 alc888_acer_aspire_6530g_verbs },
3388 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3389 .dac_nids = alc883_dac_nids,
3390 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
3391 .adc_nids = alc883_adc_nids_rev,
3392 .capsrc_nids = alc883_capsrc_nids_rev,
3393 .dig_out_nid = ALC883_DIGOUT_NID,
3394 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3395 .channel_mode = alc883_3ST_2ch_modes,
3396 .num_mux_defs =
3397 ARRAY_SIZE(alc888_2_capture_sources),
3398 .input_mux = alc888_acer_aspire_6530_sources,
3399 .unsol_event = alc_sku_unsol_event,
3400 .setup = alc888_acer_aspire_6530g_setup,
3401 .init_hook = alc_hp_automute,
3402 },
3403 [ALC888_ACER_ASPIRE_8930G] = {
3404 .mixers = { alc889_acer_aspire_8930g_mixer,
3405 alc883_chmode_mixer },
3406 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
3407 alc889_acer_aspire_8930g_verbs,
3408 alc889_eapd_verbs},
3409 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3410 .dac_nids = alc883_dac_nids,
3411 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
3412 .adc_nids = alc889_adc_nids,
3413 .capsrc_nids = alc889_capsrc_nids,
3414 .dig_out_nid = ALC883_DIGOUT_NID,
3415 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3416 .channel_mode = alc883_3ST_6ch_modes,
3417 .need_dac_fix = 1,
3418 .const_channel_count = 6,
3419 .num_mux_defs =
3420 ARRAY_SIZE(alc889_capture_sources),
3421 .input_mux = alc889_capture_sources,
3422 .unsol_event = alc_sku_unsol_event,
3423 .setup = alc889_acer_aspire_8930g_setup,
3424 .init_hook = alc_hp_automute,
3425#ifdef CONFIG_SND_HDA_POWER_SAVE
3426 .power_hook = alc_power_eapd,
3427#endif
3428 },
3429 [ALC888_ACER_ASPIRE_7730G] = {
3430 .mixers = { alc883_3ST_6ch_mixer,
3431 alc883_chmode_mixer },
3432 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
3433 alc888_acer_aspire_7730G_verbs },
3434 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3435 .dac_nids = alc883_dac_nids,
3436 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
3437 .adc_nids = alc883_adc_nids_rev,
3438 .capsrc_nids = alc883_capsrc_nids_rev,
3439 .dig_out_nid = ALC883_DIGOUT_NID,
3440 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3441 .channel_mode = alc883_3ST_6ch_modes,
3442 .need_dac_fix = 1,
3443 .const_channel_count = 6,
3444 .input_mux = &alc883_capture_source,
3445 .unsol_event = alc_sku_unsol_event,
3446 .setup = alc888_acer_aspire_7730g_setup,
3447 .init_hook = alc_hp_automute,
3448 },
3449 [ALC883_MEDION] = {
3450 .mixers = { alc883_fivestack_mixer,
3451 alc883_chmode_mixer },
3452 .init_verbs = { alc883_init_verbs,
3453 alc883_medion_eapd_verbs },
3454 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3455 .dac_nids = alc883_dac_nids,
3456 .adc_nids = alc883_adc_nids_alt,
3457 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
3458 .capsrc_nids = alc883_capsrc_nids,
3459 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
3460 .channel_mode = alc883_sixstack_modes,
3461 .input_mux = &alc883_capture_source,
3462 },
3463 [ALC883_MEDION_WIM2160] = {
3464 .mixers = { alc883_medion_wim2160_mixer },
3465 .init_verbs = { alc883_init_verbs, alc883_medion_wim2160_verbs },
3466 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3467 .dac_nids = alc883_dac_nids,
3468 .dig_out_nid = ALC883_DIGOUT_NID,
3469 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
3470 .adc_nids = alc883_adc_nids,
3471 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3472 .channel_mode = alc883_3ST_2ch_modes,
3473 .input_mux = &alc883_capture_source,
3474 .unsol_event = alc_sku_unsol_event,
3475 .setup = alc883_medion_wim2160_setup,
3476 .init_hook = alc_hp_automute,
3477 },
3478 [ALC883_LAPTOP_EAPD] = {
3479 .mixers = { alc883_base_mixer },
3480 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
3481 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3482 .dac_nids = alc883_dac_nids,
3483 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3484 .channel_mode = alc883_3ST_2ch_modes,
3485 .input_mux = &alc883_capture_source,
3486 },
3487 [ALC883_CLEVO_M540R] = {
3488 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
3489 .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
3490 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3491 .dac_nids = alc883_dac_nids,
3492 .dig_out_nid = ALC883_DIGOUT_NID,
3493 .dig_in_nid = ALC883_DIGIN_NID,
3494 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
3495 .channel_mode = alc883_3ST_6ch_clevo_modes,
3496 .need_dac_fix = 1,
3497 .input_mux = &alc883_capture_source,
3498 /* This machine has the hardware HP auto-muting, thus
3499 * we need no software mute via unsol event
3500 */
3501 },
3502 [ALC883_CLEVO_M720] = {
3503 .mixers = { alc883_clevo_m720_mixer },
3504 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
3505 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3506 .dac_nids = alc883_dac_nids,
3507 .dig_out_nid = ALC883_DIGOUT_NID,
3508 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3509 .channel_mode = alc883_3ST_2ch_modes,
3510 .input_mux = &alc883_capture_source,
3511 .unsol_event = alc883_clevo_m720_unsol_event,
3512 .setup = alc883_clevo_m720_setup,
3513 .init_hook = alc883_clevo_m720_init_hook,
3514 },
3515 [ALC883_LENOVO_101E_2ch] = {
3516 .mixers = { alc883_lenovo_101e_2ch_mixer},
3517 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
3518 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3519 .dac_nids = alc883_dac_nids,
3520 .adc_nids = alc883_adc_nids_alt,
3521 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
3522 .capsrc_nids = alc883_capsrc_nids,
3523 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3524 .channel_mode = alc883_3ST_2ch_modes,
3525 .input_mux = &alc883_lenovo_101e_capture_source,
3526 .setup = alc883_lenovo_101e_setup,
3527 .unsol_event = alc_sku_unsol_event,
3528 .init_hook = alc_inithook,
3529 },
3530 [ALC883_LENOVO_NB0763] = {
3531 .mixers = { alc883_lenovo_nb0763_mixer },
3532 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
3533 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3534 .dac_nids = alc883_dac_nids,
3535 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3536 .channel_mode = alc883_3ST_2ch_modes,
3537 .need_dac_fix = 1,
3538 .input_mux = &alc883_lenovo_nb0763_capture_source,
3539 .unsol_event = alc_sku_unsol_event,
3540 .setup = alc883_lenovo_nb0763_setup,
3541 .init_hook = alc_hp_automute,
3542 },
3543 [ALC888_LENOVO_MS7195_DIG] = {
3544 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
3545 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
3546 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3547 .dac_nids = alc883_dac_nids,
3548 .dig_out_nid = ALC883_DIGOUT_NID,
3549 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3550 .channel_mode = alc883_3ST_6ch_modes,
3551 .need_dac_fix = 1,
3552 .input_mux = &alc883_capture_source,
3553 .unsol_event = alc_sku_unsol_event,
3554 .setup = alc888_lenovo_ms7195_setup,
3555 .init_hook = alc_inithook,
3556 },
3557 [ALC883_HAIER_W66] = {
3558 .mixers = { alc883_targa_2ch_mixer},
3559 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
3560 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3561 .dac_nids = alc883_dac_nids,
3562 .dig_out_nid = ALC883_DIGOUT_NID,
3563 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3564 .channel_mode = alc883_3ST_2ch_modes,
3565 .input_mux = &alc883_capture_source,
3566 .unsol_event = alc_sku_unsol_event,
3567 .setup = alc883_haier_w66_setup,
3568 .init_hook = alc_hp_automute,
3569 },
3570 [ALC888_3ST_HP] = {
3571 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
3572 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
3573 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3574 .dac_nids = alc883_dac_nids,
3575 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
3576 .channel_mode = alc888_3st_hp_modes,
3577 .need_dac_fix = 1,
3578 .input_mux = &alc883_capture_source,
3579 .unsol_event = alc_sku_unsol_event,
3580 .setup = alc888_3st_hp_setup,
3581 .init_hook = alc_hp_automute,
3582 },
3583 [ALC888_6ST_DELL] = {
3584 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
3585 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
3586 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3587 .dac_nids = alc883_dac_nids,
3588 .dig_out_nid = ALC883_DIGOUT_NID,
3589 .dig_in_nid = ALC883_DIGIN_NID,
3590 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
3591 .channel_mode = alc883_sixstack_modes,
3592 .input_mux = &alc883_capture_source,
3593 .unsol_event = alc_sku_unsol_event,
3594 .setup = alc888_6st_dell_setup,
3595 .init_hook = alc_hp_automute,
3596 },
3597 [ALC883_MITAC] = {
3598 .mixers = { alc883_mitac_mixer },
3599 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
3600 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3601 .dac_nids = alc883_dac_nids,
3602 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3603 .channel_mode = alc883_3ST_2ch_modes,
3604 .input_mux = &alc883_capture_source,
3605 .unsol_event = alc_sku_unsol_event,
3606 .setup = alc883_mitac_setup,
3607 .init_hook = alc_hp_automute,
3608 },
3609 [ALC883_FUJITSU_PI2515] = {
3610 .mixers = { alc883_2ch_fujitsu_pi2515_mixer },
3611 .init_verbs = { alc883_init_verbs,
3612 alc883_2ch_fujitsu_pi2515_verbs},
3613 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3614 .dac_nids = alc883_dac_nids,
3615 .dig_out_nid = ALC883_DIGOUT_NID,
3616 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3617 .channel_mode = alc883_3ST_2ch_modes,
3618 .input_mux = &alc883_fujitsu_pi2515_capture_source,
3619 .unsol_event = alc_sku_unsol_event,
3620 .setup = alc883_2ch_fujitsu_pi2515_setup,
3621 .init_hook = alc_hp_automute,
3622 },
3623 [ALC888_FUJITSU_XA3530] = {
3624 .mixers = { alc888_base_mixer, alc883_chmode_mixer },
3625 .init_verbs = { alc883_init_verbs,
3626 alc888_fujitsu_xa3530_verbs },
3627 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3628 .dac_nids = alc883_dac_nids,
3629 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
3630 .adc_nids = alc883_adc_nids_rev,
3631 .capsrc_nids = alc883_capsrc_nids_rev,
3632 .dig_out_nid = ALC883_DIGOUT_NID,
3633 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
3634 .channel_mode = alc888_4ST_8ch_intel_modes,
3635 .num_mux_defs =
3636 ARRAY_SIZE(alc888_2_capture_sources),
3637 .input_mux = alc888_2_capture_sources,
3638 .unsol_event = alc_sku_unsol_event,
3639 .setup = alc888_fujitsu_xa3530_setup,
3640 .init_hook = alc_hp_automute,
3641 },
3642 [ALC888_LENOVO_SKY] = {
3643 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
3644 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
3645 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3646 .dac_nids = alc883_dac_nids,
3647 .dig_out_nid = ALC883_DIGOUT_NID,
3648 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
3649 .channel_mode = alc883_sixstack_modes,
3650 .need_dac_fix = 1,
3651 .input_mux = &alc883_lenovo_sky_capture_source,
3652 .unsol_event = alc_sku_unsol_event,
3653 .setup = alc888_lenovo_sky_setup,
3654 .init_hook = alc_hp_automute,
3655 },
3656 [ALC888_ASUS_M90V] = {
3657 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
3658 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
3659 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3660 .dac_nids = alc883_dac_nids,
3661 .dig_out_nid = ALC883_DIGOUT_NID,
3662 .dig_in_nid = ALC883_DIGIN_NID,
3663 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
3664 .channel_mode = alc883_3ST_6ch_modes,
3665 .need_dac_fix = 1,
3666 .input_mux = &alc883_fujitsu_pi2515_capture_source,
3667 .unsol_event = alc_sku_unsol_event,
3668 .setup = alc883_mode2_setup,
3669 .init_hook = alc_inithook,
3670 },
3671 [ALC888_ASUS_EEE1601] = {
3672 .mixers = { alc883_asus_eee1601_mixer },
3673 .cap_mixer = alc883_asus_eee1601_cap_mixer,
3674 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
3675 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3676 .dac_nids = alc883_dac_nids,
3677 .dig_out_nid = ALC883_DIGOUT_NID,
3678 .dig_in_nid = ALC883_DIGIN_NID,
3679 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3680 .channel_mode = alc883_3ST_2ch_modes,
3681 .need_dac_fix = 1,
3682 .input_mux = &alc883_asus_eee1601_capture_source,
3683 .unsol_event = alc_sku_unsol_event,
3684 .init_hook = alc883_eee1601_inithook,
3685 },
3686 [ALC1200_ASUS_P5Q] = {
3687 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
3688 .init_verbs = { alc883_init_verbs },
3689 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3690 .dac_nids = alc883_dac_nids,
3691 .dig_out_nid = ALC1200_DIGOUT_NID,
3692 .dig_in_nid = ALC883_DIGIN_NID,
3693 .slave_dig_outs = alc1200_slave_dig_outs,
3694 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
3695 .channel_mode = alc883_sixstack_modes,
3696 .input_mux = &alc883_capture_source,
3697 },
3698 [ALC889A_MB31] = { 843 [ALC889A_MB31] = {
3699 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer}, 844 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
3700 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs, 845 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
@@ -3711,18 +856,6 @@ static const struct alc_config_preset alc882_presets[] = {
3711 .unsol_event = alc889A_mb31_unsol_event, 856 .unsol_event = alc889A_mb31_unsol_event,
3712 .init_hook = alc889A_mb31_automute, 857 .init_hook = alc889A_mb31_automute,
3713 }, 858 },
3714 [ALC883_SONY_VAIO_TT] = {
3715 .mixers = { alc883_vaiott_mixer },
3716 .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
3717 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
3718 .dac_nids = alc883_dac_nids,
3719 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
3720 .channel_mode = alc883_3ST_2ch_modes,
3721 .input_mux = &alc883_capture_source,
3722 .unsol_event = alc_sku_unsol_event,
3723 .setup = alc883_vaiott_setup,
3724 .init_hook = alc_hp_automute,
3725 },
3726}; 859};
3727 860
3728 861