]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - sound/pci/hda/alc882_quirks.c
usb: ch9.h: usb_endpoint_maxp() uses __le16_to_cpu()
[karo-tx-linux.git] / sound / pci / hda / alc882_quirks.c
1 /*
2  * ALC882/ALC883/ALC888/ALC889 quirk models
3  * included by patch_realtek.c
4  */
5
6 /* ALC882 models */
7 enum {
8         ALC882_AUTO,
9         ALC885_MBA21,
10         ALC885_MBP3,
11         ALC885_MB5,
12         ALC885_MACMINI3,
13         ALC885_IMAC91,
14         ALC889A_MB31,
15         ALC882_MODEL_LAST,
16 };
17
18 #define ALC882_DIGOUT_NID       0x06
19 #define ALC882_DIGIN_NID        0x0a
20 #define ALC883_DIGOUT_NID       ALC882_DIGOUT_NID
21 #define ALC883_DIGIN_NID        ALC882_DIGIN_NID
22 #define ALC1200_DIGOUT_NID      0x10
23
24
25 static const struct hda_channel_mode alc882_ch_modes[1] = {
26         { 8, NULL }
27 };
28
29 /* DACs */
30 static const hda_nid_t alc882_dac_nids[4] = {
31         /* front, rear, clfe, rear_surr */
32         0x02, 0x03, 0x04, 0x05
33 };
34 #define alc883_dac_nids         alc882_dac_nids
35
36 /* ADCs */
37 #define alc882_adc_nids         alc880_adc_nids
38 #define alc882_adc_nids_alt     alc880_adc_nids_alt
39 #define alc883_adc_nids         alc882_adc_nids_alt
40
41 static const hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
42 #define alc883_capsrc_nids      alc882_capsrc_nids_alt
43
44 /* input MUX */
45 /* FIXME: should be a matrix-type input source selection */
46
47 static const struct hda_input_mux alc882_capture_source = {
48         .num_items = 4,
49         .items = {
50                 { "Mic", 0x0 },
51                 { "Front Mic", 0x1 },
52                 { "Line", 0x2 },
53                 { "CD", 0x4 },
54         },
55 };
56
57 #define alc883_capture_source   alc882_capture_source
58
59 static const struct hda_input_mux mb5_capture_source = {
60         .num_items = 3,
61         .items = {
62                 { "Mic", 0x1 },
63                 { "Line", 0x7 },
64                 { "CD", 0x4 },
65         },
66 };
67
68 static const struct hda_input_mux macmini3_capture_source = {
69         .num_items = 2,
70         .items = {
71                 { "Line", 0x2 },
72                 { "CD", 0x4 },
73         },
74 };
75
76 static const struct hda_input_mux alc883_3stack_6ch_intel = {
77         .num_items = 4,
78         .items = {
79                 { "Mic", 0x1 },
80                 { "Front Mic", 0x0 },
81                 { "Line", 0x2 },
82                 { "CD", 0x4 },
83         },
84 };
85
86 static const struct hda_input_mux alc889A_mb31_capture_source = {
87         .num_items = 2,
88         .items = {
89                 { "Mic", 0x0 },
90                 /* Front Mic (0x01) unused */
91                 { "Line", 0x2 },
92                 /* Line 2 (0x03) unused */
93                 /* CD (0x04) unused? */
94         },
95 };
96
97 static const struct hda_input_mux alc889A_imac91_capture_source = {
98         .num_items = 2,
99         .items = {
100                 { "Mic", 0x01 },
101                 { "Line", 0x2 }, /* Not sure! */
102         },
103 };
104
105 /* Macbook Air 2,1 */
106
107 static const struct hda_channel_mode alc885_mba21_ch_modes[1] = {
108       { 2, NULL },
109 };
110
111 /*
112  * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
113  */
114
115 /*
116  * 2ch mode
117  */
118 static const struct hda_verb alc885_mbp_ch2_init[] = {
119         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
120         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
121         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
122         { } /* end */
123 };
124
125 /*
126  * 4ch mode
127  */
128 static const struct hda_verb alc885_mbp_ch4_init[] = {
129         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
130         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
131         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
132         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
133         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
134         { } /* end */
135 };
136
137 static const struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
138         { 2, alc885_mbp_ch2_init },
139         { 4, alc885_mbp_ch4_init },
140 };
141
142 /*
143  * 2ch
144  * Speakers/Woofer/HP = Front
145  * LineIn = Input
146  */
147 static const struct hda_verb alc885_mb5_ch2_init[] = {
148         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
149         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
150         { } /* end */
151 };
152
153 /*
154  * 6ch mode
155  * Speakers/HP = Front
156  * Woofer = LFE
157  * LineIn = Surround
158  */
159 static const struct hda_verb alc885_mb5_ch6_init[] = {
160         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
161         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
162         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
163         { } /* end */
164 };
165
166 static const struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
167         { 2, alc885_mb5_ch2_init },
168         { 6, alc885_mb5_ch6_init },
169 };
170
171 #define alc885_macmini3_6ch_modes       alc885_mb5_6ch_modes
172
173 /* Macbook Air 2,1 same control for HP and internal Speaker */
174
175 static const struct snd_kcontrol_new alc885_mba21_mixer[] = {
176       HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
177       HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
178      { }
179 };
180
181
182 static const struct snd_kcontrol_new alc885_mbp3_mixer[] = {
183         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
184         HDA_BIND_MUTE   ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
185         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
186         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
187         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
188         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
189         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
190         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
191         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
192         HDA_CODEC_VOLUME("Line Boost Volume", 0x1a, 0x00, HDA_INPUT),
193         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0x00, HDA_INPUT),
194         { } /* end */
195 };
196
197 static const struct snd_kcontrol_new alc885_mb5_mixer[] = {
198         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
199         HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
200         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
201         HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
202         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
203         HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
204         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
205         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
206         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
207         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
208         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
209         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
210         HDA_CODEC_VOLUME("Line Boost Volume", 0x15, 0x00, HDA_INPUT),
211         HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0x00, HDA_INPUT),
212         { } /* end */
213 };
214
215 static const struct snd_kcontrol_new alc885_macmini3_mixer[] = {
216         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
217         HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
218         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
219         HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
220         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
221         HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
222         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
223         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
224         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
225         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
226         HDA_CODEC_VOLUME("Line Boost Volume", 0x15, 0x00, HDA_INPUT),
227         { } /* end */
228 };
229
230 static const struct snd_kcontrol_new alc885_imac91_mixer[] = {
231         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
232         HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
233         { } /* end */
234 };
235
236
237 static const struct snd_kcontrol_new alc882_chmode_mixer[] = {
238         {
239                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
240                 .name = "Channel Mode",
241                 .info = alc_ch_mode_info,
242                 .get = alc_ch_mode_get,
243                 .put = alc_ch_mode_put,
244         },
245         { } /* end */
246 };
247
248 static const struct hda_verb alc882_base_init_verbs[] = {
249         /* Front mixer: unmute input/output amp left and right (volume = 0) */
250         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
251         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
252         /* Rear mixer */
253         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
254         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
255         /* CLFE mixer */
256         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
257         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
258         /* Side mixer */
259         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
260         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
261
262         /* Front Pin: output 0 (0x0c) */
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_CONNECT_SEL, 0x00},
266         /* Rear Pin: output 1 (0x0d) */
267         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
268         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
269         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
270         /* CLFE Pin: output 2 (0x0e) */
271         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
272         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
273         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
274         /* Side Pin: output 3 (0x0f) */
275         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
276         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
277         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
278         /* Mic (rear) pin: input vref at 80% */
279         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
280         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
281         /* Front Mic pin: input vref at 80% */
282         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
283         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
284         /* Line In pin: input */
285         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
286         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
287         /* Line-2 In: Headphone output (output 0 - 0x0c) */
288         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
289         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
290         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
291         /* CD pin widget for input */
292         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
293
294         /* FIXME: use matrix-type input source selection */
295         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
296         /* Input mixer2 */
297         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
298         /* Input mixer3 */
299         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
300         /* ADC2: mute amp left and right */
301         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
302         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
303         /* ADC3: mute amp left and right */
304         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
305         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
306
307         { }
308 };
309
310 #define alc883_init_verbs       alc882_base_init_verbs
311
312 /* Macbook 5,1 */
313 static const struct hda_verb alc885_mb5_init_verbs[] = {
314         /* DACs */
315         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
316         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
317         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
318         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
319         /* Front mixer */
320         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
321         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
322         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
323         /* Surround mixer */
324         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
325         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
326         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
327         /* LFE mixer */
328         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
329         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
330         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
331         /* HP mixer */
332         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
333         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
334         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
335         /* Front Pin (0x0c) */
336         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
337         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
338         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
339         /* LFE Pin (0x0e) */
340         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
341         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
342         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
343         /* HP Pin (0x0f) */
344         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
345         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
346         {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
347         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
348         /* Front Mic pin: input vref at 80% */
349         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
350         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
351         /* Line In pin */
352         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
353         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
354
355         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0x1)},
356         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x7)},
357         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x4)},
358         { }
359 };
360
361 /* Macmini 3,1 */
362 static const struct hda_verb alc885_macmini3_init_verbs[] = {
363         /* DACs */
364         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
365         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
366         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
367         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
368         /* Front mixer */
369         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
370         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
371         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
372         /* Surround mixer */
373         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
374         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
375         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
376         /* LFE mixer */
377         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
378         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
379         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
380         /* HP mixer */
381         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
382         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
383         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
384         /* Front Pin (0x0c) */
385         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
386         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
387         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
388         /* LFE Pin (0x0e) */
389         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
390         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
391         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
392         /* HP Pin (0x0f) */
393         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
394         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
395         {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
396         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
397         /* Line In pin */
398         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
399         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
400
401         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
402         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
403         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
404         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
405         { }
406 };
407
408
409 static const struct hda_verb alc885_mba21_init_verbs[] = {
410         /*Internal and HP Speaker Mixer*/
411         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
412         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
413         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
414         /*Internal Speaker Pin (0x0c)*/
415         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
416         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
417         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
418         /* HP Pin: output 0 (0x0e) */
419         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
420         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
421         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
422         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC_HP_EVENT | AC_USRSP_EN)},
423         /* Line in (is hp when jack connected)*/
424         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
425         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
426
427         { }
428  };
429
430
431 /* Macbook Pro rev3 */
432 static const struct hda_verb alc885_mbp3_init_verbs[] = {
433         /* Front mixer: unmute input/output amp left and right (volume = 0) */
434         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
435         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
436         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
437         /* Rear mixer */
438         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
439         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
440         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
441         /* HP mixer */
442         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
443         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
444         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
445         /* Front Pin: output 0 (0x0c) */
446         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
447         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
448         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
449         /* HP Pin: output 0 (0x0e) */
450         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
451         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
452         {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
453         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
454         /* Mic (rear) pin: input vref at 80% */
455         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
456         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
457         /* Front Mic pin: input vref at 80% */
458         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
459         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
460         /* Line In pin: use output 1 when in LineOut mode */
461         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
462         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
463         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
464
465         /* FIXME: use matrix-type input source selection */
466         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
467         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
468         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
469         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
470         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
471         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
472         /* Input mixer2 */
473         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
474         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
475         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
476         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
477         /* Input mixer3 */
478         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
479         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
480         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
481         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
482         /* ADC1: mute amp left and right */
483         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
484         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
485         /* ADC2: mute amp left and right */
486         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
487         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
488         /* ADC3: mute amp left and right */
489         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
490         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
491
492         { }
493 };
494
495 /* iMac 9,1 */
496 static const struct hda_verb alc885_imac91_init_verbs[] = {
497         /* Internal Speaker Pin (0x0c) */
498         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
499         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
500         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
501         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
502         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
503         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
504         /* HP Pin: Rear */
505         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
506         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
507         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
508         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC_HP_EVENT | AC_USRSP_EN)},
509         /* Line in Rear */
510         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
511         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
512         /* Front Mic pin: input vref at 80% */
513         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
514         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
515         /* Rear mixer */
516         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
517         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
518         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
519         /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
520         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
521         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
522         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
523         /* 0x24 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
524         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
525         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
526         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
527         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
528         /* 0x23 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
529         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
530         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
531         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
532         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
533         /* 0x22 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
534         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
535         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
536         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
537         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
538         /* 0x07 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
539         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
540         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
541         /* 0x08 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
542         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
543         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
544         /* 0x09 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
545         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
546         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
547         { }
548 };
549
550 /* Toggle speaker-output according to the hp-jack state */
551 static void alc885_imac24_setup(struct hda_codec *codec)
552 {
553         struct alc_spec *spec = codec->spec;
554
555         spec->autocfg.hp_pins[0] = 0x14;
556         spec->autocfg.speaker_pins[0] = 0x18;
557         spec->autocfg.speaker_pins[1] = 0x1a;
558         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
559 }
560
561 #define alc885_mb5_setup        alc885_imac24_setup
562 #define alc885_macmini3_setup   alc885_imac24_setup
563
564 /* Macbook Air 2,1 */
565 static void alc885_mba21_setup(struct hda_codec *codec)
566 {
567         struct alc_spec *spec = codec->spec;
568
569         spec->autocfg.hp_pins[0] = 0x14;
570         spec->autocfg.speaker_pins[0] = 0x18;
571         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
572 }
573
574
575
576 static void alc885_mbp3_setup(struct hda_codec *codec)
577 {
578         struct alc_spec *spec = codec->spec;
579
580         spec->autocfg.hp_pins[0] = 0x15;
581         spec->autocfg.speaker_pins[0] = 0x14;
582         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
583 }
584
585 static void alc885_imac91_setup(struct hda_codec *codec)
586 {
587         struct alc_spec *spec = codec->spec;
588
589         spec->autocfg.hp_pins[0] = 0x14;
590         spec->autocfg.speaker_pins[0] = 0x18;
591         spec->autocfg.speaker_pins[1] = 0x1a;
592         alc_simple_setup_automute(spec, ALC_AUTOMUTE_AMP);
593 }
594
595 /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
596 static const struct hda_verb alc889A_mb31_ch2_init[] = {
597         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
598         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
599         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
600         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
601         { } /* end */
602 };
603
604 /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
605 static const struct hda_verb alc889A_mb31_ch4_init[] = {
606         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
607         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
608         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
609         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
610         { } /* end */
611 };
612
613 /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
614 static const struct hda_verb alc889A_mb31_ch5_init[] = {
615         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as rear */
616         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
617         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
618         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
619         { } /* end */
620 };
621
622 /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
623 static const struct hda_verb alc889A_mb31_ch6_init[] = {
624         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as front */
625         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Subwoofer off */
626         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
627         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
628         { } /* end */
629 };
630
631 static const struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
632         { 2, alc889A_mb31_ch2_init },
633         { 4, alc889A_mb31_ch4_init },
634         { 5, alc889A_mb31_ch5_init },
635         { 6, alc889A_mb31_ch6_init },
636 };
637
638 static const struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
639         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
640         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
641         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
642         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
643         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
644         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
645         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
646         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
647         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
648         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
649         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
650         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
651         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
652         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
653         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
654         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
655         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
656         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
657         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
658         { } /* end */
659 };
660
661 static const struct snd_kcontrol_new alc889A_mb31_mixer[] = {
662         /* Output mixers */
663         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
664         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
665         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
666         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
667         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
668                 HDA_OUTPUT),
669         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
670         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
671         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
672         /* Output switches */
673         HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
674         HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
675         HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
676         /* Boost mixers */
677         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0x00, HDA_INPUT),
678         HDA_CODEC_VOLUME("Line Boost Volume", 0x1a, 0x00, HDA_INPUT),
679         /* Input mixers */
680         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
681         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
682         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
683         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
684         { } /* end */
685 };
686
687 static const struct snd_kcontrol_new alc883_chmode_mixer[] = {
688         {
689                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
690                 .name = "Channel Mode",
691                 .info = alc_ch_mode_info,
692                 .get = alc_ch_mode_get,
693                 .put = alc_ch_mode_put,
694         },
695         { } /* end */
696 };
697
698 static const struct hda_verb alc889A_mb31_verbs[] = {
699         /* Init rear pin (used as headphone output) */
700         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},    /* Apple Headphones */
701         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},           /* Connect to front */
702         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
703         /* Init line pin (used as output in 4ch and 6ch mode) */
704         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},           /* Connect to CLFE */
705         /* Init line 2 pin (used as headphone out by default) */
706         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},  /* Use as input */
707         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
708         { } /* end */
709 };
710
711 /* Mute speakers according to the headphone jack state */
712 static void alc889A_mb31_automute(struct hda_codec *codec)
713 {
714         unsigned int present;
715
716         /* Mute only in 2ch or 4ch mode */
717         if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
718             == 0x00) {
719                 present = snd_hda_jack_detect(codec, 0x15);
720                 snd_hda_codec_amp_stereo(codec, 0x14,  HDA_OUTPUT, 0,
721                         HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
722                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
723                         HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
724         }
725 }
726
727 static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
728 {
729         if ((res >> 26) == ALC_HP_EVENT)
730                 alc889A_mb31_automute(codec);
731 }
732
733 /*
734  * configuration and preset
735  */
736 static const char * const alc882_models[ALC882_MODEL_LAST] = {
737         [ALC885_MB5]            = "mb5",
738         [ALC885_MACMINI3]       = "macmini3",
739         [ALC885_MBA21]          = "mba21",
740         [ALC885_MBP3]           = "mbp3",
741         [ALC885_IMAC91]         = "imac91",
742         [ALC889A_MB31]          = "mb31",
743         [ALC882_AUTO]           = "auto",
744 };
745
746 /* codec SSID table for Intel Mac */
747 static const struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
748         SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
749         SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
750         SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
751         SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
752         SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31),
753         SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC885_MBP3),
754         SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC885_MBA21),
755         SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
756         SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
757         SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
758         SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
759         SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC885_MB5),
760         /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
761          * so apparently no perfect solution yet
762          */
763         SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
764         SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
765         SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3),
766         {} /* terminator */
767 };
768
769 static const struct alc_config_preset alc882_presets[] = {
770            [ALC885_MBA21] = {
771                         .mixers = { alc885_mba21_mixer },
772                         .init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
773                         .num_dacs = 2,
774                         .dac_nids = alc882_dac_nids,
775                         .channel_mode = alc885_mba21_ch_modes,
776                         .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
777                         .input_mux = &alc882_capture_source,
778                         .unsol_event = alc_sku_unsol_event,
779                         .setup = alc885_mba21_setup,
780                         .init_hook = alc_hp_automute,
781        },
782         [ALC885_MBP3] = {
783                 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
784                 .init_verbs = { alc885_mbp3_init_verbs,
785                                 alc880_gpio1_init_verbs },
786                 .num_dacs = 2,
787                 .dac_nids = alc882_dac_nids,
788                 .hp_nid = 0x04,
789                 .channel_mode = alc885_mbp_4ch_modes,
790                 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
791                 .input_mux = &alc882_capture_source,
792                 .dig_out_nid = ALC882_DIGOUT_NID,
793                 .dig_in_nid = ALC882_DIGIN_NID,
794                 .unsol_event = alc_sku_unsol_event,
795                 .setup = alc885_mbp3_setup,
796                 .init_hook = alc_hp_automute,
797         },
798         [ALC885_MB5] = {
799                 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
800                 .init_verbs = { alc885_mb5_init_verbs,
801                                 alc880_gpio1_init_verbs },
802                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
803                 .dac_nids = alc882_dac_nids,
804                 .channel_mode = alc885_mb5_6ch_modes,
805                 .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
806                 .input_mux = &mb5_capture_source,
807                 .dig_out_nid = ALC882_DIGOUT_NID,
808                 .dig_in_nid = ALC882_DIGIN_NID,
809                 .unsol_event = alc_sku_unsol_event,
810                 .setup = alc885_mb5_setup,
811                 .init_hook = alc_hp_automute,
812         },
813         [ALC885_MACMINI3] = {
814                 .mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
815                 .init_verbs = { alc885_macmini3_init_verbs,
816                                 alc880_gpio1_init_verbs },
817                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
818                 .dac_nids = alc882_dac_nids,
819                 .channel_mode = alc885_macmini3_6ch_modes,
820                 .num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes),
821                 .input_mux = &macmini3_capture_source,
822                 .dig_out_nid = ALC882_DIGOUT_NID,
823                 .dig_in_nid = ALC882_DIGIN_NID,
824                 .unsol_event = alc_sku_unsol_event,
825                 .setup = alc885_macmini3_setup,
826                 .init_hook = alc_hp_automute,
827         },
828         [ALC885_IMAC91] = {
829                 .mixers = {alc885_imac91_mixer},
830                 .init_verbs = { alc885_imac91_init_verbs,
831                                 alc880_gpio1_init_verbs },
832                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
833                 .dac_nids = alc882_dac_nids,
834                 .channel_mode = alc885_mba21_ch_modes,
835                 .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
836                 .input_mux = &alc889A_imac91_capture_source,
837                 .dig_out_nid = ALC882_DIGOUT_NID,
838                 .dig_in_nid = ALC882_DIGIN_NID,
839                 .unsol_event = alc_sku_unsol_event,
840                 .setup = alc885_imac91_setup,
841                 .init_hook = alc_hp_automute,
842         },
843         [ALC889A_MB31] = {
844                 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
845                 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
846                         alc880_gpio1_init_verbs },
847                 .adc_nids = alc883_adc_nids,
848                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
849                 .capsrc_nids = alc883_capsrc_nids,
850                 .dac_nids = alc883_dac_nids,
851                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
852                 .channel_mode = alc889A_mb31_6ch_modes,
853                 .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
854                 .input_mux = &alc889A_mb31_capture_source,
855                 .dig_out_nid = ALC883_DIGOUT_NID,
856                 .unsol_event = alc889A_mb31_unsol_event,
857                 .init_hook = alc889A_mb31_automute,
858         },
859 };
860
861