2 * ALC660/ALC861 quirk models
3 * included by patch_realtek.c
21 * ALC861 channel source setting (2/6 channel selection for 3-stack)
25 * set the path ways for 2 channel output
26 * need to set the codec line out and mic 1 pin widgets to inputs
28 static const struct hda_verb alc861_threestack_ch2_init
[] = {
29 /* set pin widget 1Ah (line in) for input */
30 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x20 },
31 /* set pin widget 18h (mic1/2) for input, for mic also enable
34 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24 },
36 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb00c },
38 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x01 << 8)) }, /*mic*/
39 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x02 << 8)) }, /*line-in*/
45 * need to set the codec line out and mic 1 pin widgets to outputs
47 static const struct hda_verb alc861_threestack_ch6_init
[] = {
48 /* set pin widget 1Ah (line in) for output (Back Surround)*/
49 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40 },
50 /* set pin widget 18h (mic1) for output (CLFE)*/
51 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40 },
53 { 0x0c, AC_VERB_SET_CONNECT_SEL
, 0x00 },
54 { 0x0d, AC_VERB_SET_CONNECT_SEL
, 0x00 },
56 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb080 },
58 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7080 | (0x01 << 8)) }, /*mic*/
59 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7080 | (0x02 << 8)) }, /*line in*/
64 static const struct hda_channel_mode alc861_threestack_modes
[2] = {
65 { 2, alc861_threestack_ch2_init
},
66 { 6, alc861_threestack_ch6_init
},
68 /* Set mic1 as input and unmute the mixer */
69 static const struct hda_verb alc861_uniwill_m31_ch2_init
[] = {
70 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24 },
71 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7080 | (0x01 << 8)) }, /*mic*/
74 /* Set mic1 as output and mute mixer */
75 static const struct hda_verb alc861_uniwill_m31_ch4_init
[] = {
76 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40 },
77 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x01 << 8)) }, /*mic*/
81 static const struct hda_channel_mode alc861_uniwill_m31_modes
[2] = {
82 { 2, alc861_uniwill_m31_ch2_init
},
83 { 4, alc861_uniwill_m31_ch4_init
},
86 /* Set mic1 and line-in as input and unmute the mixer */
87 static const struct hda_verb alc861_asus_ch2_init
[] = {
88 /* set pin widget 1Ah (line in) for input */
89 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x20 },
90 /* set pin widget 18h (mic1/2) for input, for mic also enable
93 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24 },
95 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb00c },
97 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x01 << 8)) }, /*mic*/
98 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x02 << 8)) }, /*line-in*/
102 /* Set mic1 nad line-in as output and mute mixer */
103 static const struct hda_verb alc861_asus_ch6_init
[] = {
104 /* set pin widget 1Ah (line in) for output (Back Surround)*/
105 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40 },
106 /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
107 /* set pin widget 18h (mic1) for output (CLFE)*/
108 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40 },
109 /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
110 { 0x0c, AC_VERB_SET_CONNECT_SEL
, 0x00 },
111 { 0x0d, AC_VERB_SET_CONNECT_SEL
, 0x00 },
113 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb080 },
115 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7080 | (0x01 << 8)) }, /*mic*/
116 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7080 | (0x02 << 8)) }, /*line in*/
121 static const struct hda_channel_mode alc861_asus_modes
[2] = {
122 { 2, alc861_asus_ch2_init
},
123 { 6, alc861_asus_ch6_init
},
128 static const struct snd_kcontrol_new alc861_base_mixer
[] = {
129 /* output mixer control */
130 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT
),
131 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT
),
132 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT
),
133 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT
),
134 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT
),
136 /*Input mixer control */
137 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
138 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
139 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT
),
140 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT
),
141 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT
),
142 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT
),
143 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT
),
144 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT
),
145 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT
),
146 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT
),
151 static const struct snd_kcontrol_new alc861_3ST_mixer
[] = {
152 /* output mixer control */
153 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT
),
154 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT
),
155 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT
),
156 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT
),
157 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
159 /* Input mixer control */
160 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
161 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
162 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT
),
163 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT
),
164 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT
),
165 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT
),
166 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT
),
167 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT
),
168 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT
),
169 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT
),
172 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
173 .name
= "Channel Mode",
174 .info
= alc_ch_mode_info
,
175 .get
= alc_ch_mode_get
,
176 .put
= alc_ch_mode_put
,
177 .private_value
= ARRAY_SIZE(alc861_threestack_modes
),
182 static const struct snd_kcontrol_new alc861_toshiba_mixer
[] = {
183 /* output mixer control */
184 HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT
),
185 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT
),
186 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT
),
191 static const struct snd_kcontrol_new alc861_uniwill_m31_mixer
[] = {
192 /* output mixer control */
193 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT
),
194 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT
),
195 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT
),
196 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT
),
197 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
199 /* Input mixer control */
200 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
201 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
202 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT
),
203 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT
),
204 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT
),
205 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT
),
206 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT
),
207 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT
),
208 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT
),
209 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT
),
212 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
213 .name
= "Channel Mode",
214 .info
= alc_ch_mode_info
,
215 .get
= alc_ch_mode_get
,
216 .put
= alc_ch_mode_put
,
217 .private_value
= ARRAY_SIZE(alc861_uniwill_m31_modes
),
222 static const struct snd_kcontrol_new alc861_asus_mixer
[] = {
223 /* output mixer control */
224 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT
),
225 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT
),
226 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT
),
227 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT
),
228 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT
),
230 /* Input mixer control */
231 HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT
),
232 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT
),
233 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT
),
234 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT
),
235 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT
),
236 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT
),
237 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT
),
238 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT
),
239 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT
),
240 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT
),
243 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
244 .name
= "Channel Mode",
245 .info
= alc_ch_mode_info
,
246 .get
= alc_ch_mode_get
,
247 .put
= alc_ch_mode_put
,
248 .private_value
= ARRAY_SIZE(alc861_asus_modes
),
253 /* additional mixer */
254 static const struct snd_kcontrol_new alc861_asus_laptop_mixer
[] = {
255 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT
),
256 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT
),
261 * generic initialization of ADC, input mixers and output mixers
263 static const struct hda_verb alc861_base_init_verbs
[] = {
265 * Unmute ADC0 and set the default input to mic-in
267 /* port-A for surround (rear panel) */
268 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40 },
269 { 0x0e, AC_VERB_SET_CONNECT_SEL
, 0x00 },
270 /* port-B for mic-in (rear panel) with vref */
271 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24 },
272 /* port-C for line-in (rear panel) */
273 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x20 },
274 /* port-D for Front */
275 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40 },
276 { 0x0b, AC_VERB_SET_CONNECT_SEL
, 0x00 },
277 /* port-E for HP out (front panel) */
278 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0xc0 },
279 /* route front PCM to HP */
280 { 0x0f, AC_VERB_SET_CONNECT_SEL
, 0x00 },
281 /* port-F for mic-in (front panel) with vref */
282 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24 },
283 /* port-G for CLFE (rear panel) */
284 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40 },
285 { 0x1f, AC_VERB_SET_CONNECT_SEL
, 0x00 },
286 /* port-H for side (rear panel) */
287 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40 },
288 { 0x20, AC_VERB_SET_CONNECT_SEL
, 0x00 },
290 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x20 },
291 /* route front mic to ADC1*/
292 {0x08, AC_VERB_SET_CONNECT_SEL
, 0x00},
293 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
295 /* Unmute DAC0~3 & spdif out*/
296 {0x03, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
297 {0x04, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
298 {0x05, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
299 {0x06, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
300 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
302 /* Unmute Mixer 14 (mic) 1c (Line in)*/
303 {0x014, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
304 {0x014, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
305 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
306 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
308 /* Unmute Stereo Mixer 15 */
309 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
310 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
311 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(2)},
312 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb00c}, /* Output 0~12 step */
314 {0x16, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
315 {0x16, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
316 {0x17, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
317 {0x17, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
318 {0x18, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
319 {0x18, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
320 {0x19, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
321 {0x19, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
322 /* hp used DAC 3 (Front) */
323 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(3)},
324 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(2)},
329 static const struct hda_verb alc861_threestack_init_verbs
[] = {
331 * Unmute ADC0 and set the default input to mic-in
333 /* port-A for surround (rear panel) */
334 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x00 },
335 /* port-B for mic-in (rear panel) with vref */
336 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24 },
337 /* port-C for line-in (rear panel) */
338 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x20 },
339 /* port-D for Front */
340 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40 },
341 { 0x0b, AC_VERB_SET_CONNECT_SEL
, 0x00 },
342 /* port-E for HP out (front panel) */
343 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0xc0 },
344 /* route front PCM to HP */
345 { 0x0f, AC_VERB_SET_CONNECT_SEL
, 0x00 },
346 /* port-F for mic-in (front panel) with vref */
347 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24 },
348 /* port-G for CLFE (rear panel) */
349 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x00 },
350 /* port-H for side (rear panel) */
351 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x00 },
353 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x20 },
354 /* route front mic to ADC1*/
355 {0x08, AC_VERB_SET_CONNECT_SEL
, 0x00},
356 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
357 /* Unmute DAC0~3 & spdif out*/
358 {0x03, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
359 {0x04, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
360 {0x05, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
361 {0x06, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
362 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
364 /* Unmute Mixer 14 (mic) 1c (Line in)*/
365 {0x014, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
366 {0x014, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
367 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
368 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
370 /* Unmute Stereo Mixer 15 */
371 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
372 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
373 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(2)},
374 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb00c}, /* Output 0~12 step */
376 {0x16, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
377 {0x16, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
378 {0x17, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
379 {0x17, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
380 {0x18, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
381 {0x18, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
382 {0x19, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
383 {0x19, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
384 /* hp used DAC 3 (Front) */
385 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(3)},
386 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(2)},
390 static const struct hda_verb alc861_uniwill_m31_init_verbs
[] = {
392 * Unmute ADC0 and set the default input to mic-in
394 /* port-A for surround (rear panel) */
395 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x00 },
396 /* port-B for mic-in (rear panel) with vref */
397 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24 },
398 /* port-C for line-in (rear panel) */
399 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x20 },
400 /* port-D for Front */
401 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40 },
402 { 0x0b, AC_VERB_SET_CONNECT_SEL
, 0x00 },
403 /* port-E for HP out (front panel) */
404 /* this has to be set to VREF80 */
405 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24 },
406 /* route front PCM to HP */
407 { 0x0f, AC_VERB_SET_CONNECT_SEL
, 0x00 },
408 /* port-F for mic-in (front panel) with vref */
409 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24 },
410 /* port-G for CLFE (rear panel) */
411 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x00 },
412 /* port-H for side (rear panel) */
413 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x00 },
415 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x20 },
416 /* route front mic to ADC1*/
417 {0x08, AC_VERB_SET_CONNECT_SEL
, 0x00},
418 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
419 /* Unmute DAC0~3 & spdif out*/
420 {0x03, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
421 {0x04, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
422 {0x05, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
423 {0x06, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
424 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
426 /* Unmute Mixer 14 (mic) 1c (Line in)*/
427 {0x014, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
428 {0x014, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
429 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
430 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
432 /* Unmute Stereo Mixer 15 */
433 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
434 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
435 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(2)},
436 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb00c}, /* Output 0~12 step */
438 {0x16, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
439 {0x16, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
440 {0x17, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
441 {0x17, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
442 {0x18, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
443 {0x18, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
444 {0x19, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
445 {0x19, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
446 /* hp used DAC 3 (Front) */
447 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(3)},
448 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(2)},
452 static const struct hda_verb alc861_asus_init_verbs
[] = {
454 * Unmute ADC0 and set the default input to mic-in
456 /* port-A for surround (rear panel)
457 * according to codec#0 this is the HP jack
459 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0xc0 }, /* was 0x00 */
460 /* route front PCM to HP */
461 { 0x0e, AC_VERB_SET_CONNECT_SEL
, 0x01 },
462 /* port-B for mic-in (rear panel) with vref */
463 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24 },
464 /* port-C for line-in (rear panel) */
465 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x20 },
466 /* port-D for Front */
467 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40 },
468 { 0x0b, AC_VERB_SET_CONNECT_SEL
, 0x00 },
469 /* port-E for HP out (front panel) */
470 /* this has to be set to VREF80 */
471 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24 },
472 /* route front PCM to HP */
473 { 0x0f, AC_VERB_SET_CONNECT_SEL
, 0x00 },
474 /* port-F for mic-in (front panel) with vref */
475 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24 },
476 /* port-G for CLFE (rear panel) */
477 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40 },
478 /* port-H for side (rear panel) */
479 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40 },
481 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x20 },
482 /* route front mic to ADC1*/
483 {0x08, AC_VERB_SET_CONNECT_SEL
, 0x00},
484 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
485 /* Unmute DAC0~3 & spdif out*/
486 {0x03, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
487 {0x04, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
488 {0x05, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
489 {0x06, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
490 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
491 /* Unmute Mixer 14 (mic) 1c (Line in)*/
492 {0x014, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
493 {0x014, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
494 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
495 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
497 /* Unmute Stereo Mixer 15 */
498 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
499 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
500 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(2)},
501 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb00c}, /* Output 0~12 step */
503 {0x16, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
504 {0x16, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
505 {0x17, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
506 {0x17, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
507 {0x18, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
508 {0x18, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
509 {0x19, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
510 {0x19, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
511 /* hp used DAC 3 (Front) */
512 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(3)},
513 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(2)},
517 /* additional init verbs for ASUS laptops */
518 static const struct hda_verb alc861_asus_laptop_init_verbs
[] = {
519 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x45 }, /* HP-out */
520 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(2) }, /* mute line-in */
524 static const struct hda_verb alc861_toshiba_init_verbs
[] = {
525 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_HP_EVENT
},
530 /* toggle speaker-output according to the hp-jack state */
531 static void alc861_toshiba_automute(struct hda_codec
*codec
)
533 unsigned int present
= snd_hda_jack_detect(codec
, 0x0f);
535 snd_hda_codec_amp_stereo(codec
, 0x16, HDA_INPUT
, 0,
536 HDA_AMP_MUTE
, present
? HDA_AMP_MUTE
: 0);
537 snd_hda_codec_amp_stereo(codec
, 0x1a, HDA_INPUT
, 3,
538 HDA_AMP_MUTE
, present
? 0 : HDA_AMP_MUTE
);
541 static void alc861_toshiba_unsol_event(struct hda_codec
*codec
,
544 if ((res
>> 26) == ALC_HP_EVENT
)
545 alc861_toshiba_automute(codec
);
548 #define ALC861_DIGOUT_NID 0x07
550 static const struct hda_channel_mode alc861_8ch_modes
[1] = {
554 static const hda_nid_t alc861_dac_nids
[4] = {
555 /* front, surround, clfe, side */
556 0x03, 0x06, 0x05, 0x04
559 static const hda_nid_t alc660_dac_nids
[3] = {
560 /* front, clfe, surround */
564 static const hda_nid_t alc861_adc_nids
[1] = {
569 static const struct hda_input_mux alc861_capture_source
= {
573 { "Front Mic", 0x3 },
581 * configuration and preset
583 static const char * const alc861_models
[ALC861_MODEL_LAST
] = {
584 [ALC861_3ST
] = "3stack",
585 [ALC660_3ST
] = "3stack-660",
586 [ALC861_3ST_DIG
] = "3stack-dig",
587 [ALC861_6ST_DIG
] = "6stack-dig",
588 [ALC861_UNIWILL_M31
] = "uniwill-m31",
589 [ALC861_TOSHIBA
] = "toshiba",
590 [ALC861_ASUS
] = "asus",
591 [ALC861_ASUS_LAPTOP
] = "asus-laptop",
592 [ALC861_AUTO
] = "auto",
595 static const struct snd_pci_quirk alc861_cfg_tbl
[] = {
596 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST
),
597 SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP
),
598 SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP
),
599 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS
),
600 SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP
),
601 SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG
),
602 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA
),
603 /* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
604 * Any other models that need this preset?
606 /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
607 SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST
),
608 SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST
),
609 SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31
),
610 SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31
),
611 SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP
),
612 /* FIXME: the below seems conflict */
613 /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
614 SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST
),
615 SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST
),
619 static const struct alc_config_preset alc861_presets
[] = {
621 .mixers
= { alc861_3ST_mixer
},
622 .init_verbs
= { alc861_threestack_init_verbs
},
623 .num_dacs
= ARRAY_SIZE(alc861_dac_nids
),
624 .dac_nids
= alc861_dac_nids
,
625 .num_channel_mode
= ARRAY_SIZE(alc861_threestack_modes
),
626 .channel_mode
= alc861_threestack_modes
,
628 .num_adc_nids
= ARRAY_SIZE(alc861_adc_nids
),
629 .adc_nids
= alc861_adc_nids
,
630 .input_mux
= &alc861_capture_source
,
633 .mixers
= { alc861_base_mixer
},
634 .init_verbs
= { alc861_threestack_init_verbs
},
635 .num_dacs
= ARRAY_SIZE(alc861_dac_nids
),
636 .dac_nids
= alc861_dac_nids
,
637 .dig_out_nid
= ALC861_DIGOUT_NID
,
638 .num_channel_mode
= ARRAY_SIZE(alc861_threestack_modes
),
639 .channel_mode
= alc861_threestack_modes
,
641 .num_adc_nids
= ARRAY_SIZE(alc861_adc_nids
),
642 .adc_nids
= alc861_adc_nids
,
643 .input_mux
= &alc861_capture_source
,
646 .mixers
= { alc861_base_mixer
},
647 .init_verbs
= { alc861_base_init_verbs
},
648 .num_dacs
= ARRAY_SIZE(alc861_dac_nids
),
649 .dac_nids
= alc861_dac_nids
,
650 .dig_out_nid
= ALC861_DIGOUT_NID
,
651 .num_channel_mode
= ARRAY_SIZE(alc861_8ch_modes
),
652 .channel_mode
= alc861_8ch_modes
,
653 .num_adc_nids
= ARRAY_SIZE(alc861_adc_nids
),
654 .adc_nids
= alc861_adc_nids
,
655 .input_mux
= &alc861_capture_source
,
658 .mixers
= { alc861_3ST_mixer
},
659 .init_verbs
= { alc861_threestack_init_verbs
},
660 .num_dacs
= ARRAY_SIZE(alc660_dac_nids
),
661 .dac_nids
= alc660_dac_nids
,
662 .num_channel_mode
= ARRAY_SIZE(alc861_threestack_modes
),
663 .channel_mode
= alc861_threestack_modes
,
665 .num_adc_nids
= ARRAY_SIZE(alc861_adc_nids
),
666 .adc_nids
= alc861_adc_nids
,
667 .input_mux
= &alc861_capture_source
,
669 [ALC861_UNIWILL_M31
] = {
670 .mixers
= { alc861_uniwill_m31_mixer
},
671 .init_verbs
= { alc861_uniwill_m31_init_verbs
},
672 .num_dacs
= ARRAY_SIZE(alc861_dac_nids
),
673 .dac_nids
= alc861_dac_nids
,
674 .dig_out_nid
= ALC861_DIGOUT_NID
,
675 .num_channel_mode
= ARRAY_SIZE(alc861_uniwill_m31_modes
),
676 .channel_mode
= alc861_uniwill_m31_modes
,
678 .num_adc_nids
= ARRAY_SIZE(alc861_adc_nids
),
679 .adc_nids
= alc861_adc_nids
,
680 .input_mux
= &alc861_capture_source
,
683 .mixers
= { alc861_toshiba_mixer
},
684 .init_verbs
= { alc861_base_init_verbs
,
685 alc861_toshiba_init_verbs
},
686 .num_dacs
= ARRAY_SIZE(alc861_dac_nids
),
687 .dac_nids
= alc861_dac_nids
,
688 .num_channel_mode
= ARRAY_SIZE(alc883_3ST_2ch_modes
),
689 .channel_mode
= alc883_3ST_2ch_modes
,
690 .num_adc_nids
= ARRAY_SIZE(alc861_adc_nids
),
691 .adc_nids
= alc861_adc_nids
,
692 .input_mux
= &alc861_capture_source
,
693 .unsol_event
= alc861_toshiba_unsol_event
,
694 .init_hook
= alc861_toshiba_automute
,
697 .mixers
= { alc861_asus_mixer
},
698 .init_verbs
= { alc861_asus_init_verbs
},
699 .num_dacs
= ARRAY_SIZE(alc861_dac_nids
),
700 .dac_nids
= alc861_dac_nids
,
701 .dig_out_nid
= ALC861_DIGOUT_NID
,
702 .num_channel_mode
= ARRAY_SIZE(alc861_asus_modes
),
703 .channel_mode
= alc861_asus_modes
,
706 .num_adc_nids
= ARRAY_SIZE(alc861_adc_nids
),
707 .adc_nids
= alc861_adc_nids
,
708 .input_mux
= &alc861_capture_source
,
710 [ALC861_ASUS_LAPTOP
] = {
711 .mixers
= { alc861_toshiba_mixer
, alc861_asus_laptop_mixer
},
712 .init_verbs
= { alc861_asus_init_verbs
,
713 alc861_asus_laptop_init_verbs
},
714 .num_dacs
= ARRAY_SIZE(alc861_dac_nids
),
715 .dac_nids
= alc861_dac_nids
,
716 .dig_out_nid
= ALC861_DIGOUT_NID
,
717 .num_channel_mode
= ARRAY_SIZE(alc883_3ST_2ch_modes
),
718 .channel_mode
= alc883_3ST_2ch_modes
,
720 .num_adc_nids
= ARRAY_SIZE(alc861_adc_nids
),
721 .adc_nids
= alc861_adc_nids
,
722 .input_mux
= &alc861_capture_source
,