]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - sound/pci/hda/patch_realtek.c
ALSA: hda - Change quirk for Acer Aspire 5930G
[mirror_ubuntu-bionic-kernel.git] / sound / pci / hda / patch_realtek.c
CommitLineData
1da177e4
LT
1/*
2 * Universal Interface for Intel High Definition Audio Codec
3 *
4 * HD audio interface patch for ALC 260/880/882 codecs
5 *
df694daa
KY
6 * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
7 * PeiSen Hou <pshou@realtek.com.tw>
1da177e4 8 * Takashi Iwai <tiwai@suse.de>
7cf51e48 9 * Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
1da177e4
LT
10 *
11 * This driver is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This driver is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 */
25
1da177e4
LT
26#include <linux/init.h>
27#include <linux/delay.h>
28#include <linux/slab.h>
29#include <linux/pci.h>
30#include <sound/core.h>
31#include "hda_codec.h"
32#include "hda_local.h"
680cd536 33#include "hda_beep.h"
1da177e4 34
ccc656ce
KY
35#define ALC880_FRONT_EVENT 0x01
36#define ALC880_DCVOL_EVENT 0x02
37#define ALC880_HP_EVENT 0x04
38#define ALC880_MIC_EVENT 0x08
1da177e4
LT
39
40/* ALC880 board config type */
41enum {
1da177e4
LT
42 ALC880_3ST,
43 ALC880_3ST_DIG,
44 ALC880_5ST,
45 ALC880_5ST_DIG,
46 ALC880_W810,
dfc0ff62 47 ALC880_Z71V,
b6482d48 48 ALC880_6ST,
16ded525
TI
49 ALC880_6ST_DIG,
50 ALC880_F1734,
51 ALC880_ASUS,
52 ALC880_ASUS_DIG,
53 ALC880_ASUS_W1V,
df694daa 54 ALC880_ASUS_DIG2,
2cf9f0fc 55 ALC880_FUJITSU,
16ded525 56 ALC880_UNIWILL_DIG,
ccc656ce
KY
57 ALC880_UNIWILL,
58 ALC880_UNIWILL_P53,
df694daa
KY
59 ALC880_CLEVO,
60 ALC880_TCL_S700,
ae6b813a 61 ALC880_LG,
d681518a 62 ALC880_LG_LW,
df99cd33 63 ALC880_MEDION_RIM,
e9edcee0
TI
64#ifdef CONFIG_SND_DEBUG
65 ALC880_TEST,
66#endif
df694daa 67 ALC880_AUTO,
16ded525
TI
68 ALC880_MODEL_LAST /* last tag */
69};
70
71/* ALC260 models */
72enum {
73 ALC260_BASIC,
74 ALC260_HP,
3f878308 75 ALC260_HP_DC7600,
df694daa
KY
76 ALC260_HP_3013,
77 ALC260_FUJITSU_S702X,
0bfc90e9 78 ALC260_ACER,
bc9f98a9
KY
79 ALC260_WILL,
80 ALC260_REPLACER_672V,
cc959489 81 ALC260_FAVORIT100,
7cf51e48
JW
82#ifdef CONFIG_SND_DEBUG
83 ALC260_TEST,
84#endif
df694daa 85 ALC260_AUTO,
16ded525 86 ALC260_MODEL_LAST /* last tag */
1da177e4
LT
87};
88
df694daa
KY
89/* ALC262 models */
90enum {
91 ALC262_BASIC,
ccc656ce
KY
92 ALC262_HIPPO,
93 ALC262_HIPPO_1,
834be88d 94 ALC262_FUJITSU,
9c7f852e 95 ALC262_HP_BPC,
cd7509a4
KY
96 ALC262_HP_BPC_D7000_WL,
97 ALC262_HP_BPC_D7000_WF,
66d2a9d6 98 ALC262_HP_TC_T5735,
8c427226 99 ALC262_HP_RP5700,
304dcaac 100 ALC262_BENQ_ED8,
272a527c 101 ALC262_SONY_ASSAMD,
83c34218 102 ALC262_BENQ_T31,
f651b50b 103 ALC262_ULTRA,
0e31daf7 104 ALC262_LENOVO_3000,
e8f9ae2a 105 ALC262_NEC,
4e555fe5 106 ALC262_TOSHIBA_S06,
9f99a638 107 ALC262_TOSHIBA_RX1,
ba340e82 108 ALC262_TYAN,
df694daa
KY
109 ALC262_AUTO,
110 ALC262_MODEL_LAST /* last tag */
111};
112
a361d84b
KY
113/* ALC268 models */
114enum {
eb5a6621 115 ALC267_QUANTA_IL1,
a361d84b 116 ALC268_3ST,
d1a991a6 117 ALC268_TOSHIBA,
d273809e 118 ALC268_ACER,
c238b4f4 119 ALC268_ACER_DMIC,
8ef355da 120 ALC268_ACER_ASPIRE_ONE,
3866f0b0 121 ALC268_DELL,
f12462c5 122 ALC268_ZEPTO,
86c53bd2
JW
123#ifdef CONFIG_SND_DEBUG
124 ALC268_TEST,
125#endif
a361d84b
KY
126 ALC268_AUTO,
127 ALC268_MODEL_LAST /* last tag */
128};
129
f6a92248
KY
130/* ALC269 models */
131enum {
132 ALC269_BASIC,
60db6b53 133 ALC269_QUANTA_FL1,
f53281e6
KY
134 ALC269_ASUS_EEEPC_P703,
135 ALC269_ASUS_EEEPC_P901,
26f5df26 136 ALC269_FUJITSU,
64154835 137 ALC269_LIFEBOOK,
f6a92248
KY
138 ALC269_AUTO,
139 ALC269_MODEL_LAST /* last tag */
140};
141
df694daa
KY
142/* ALC861 models */
143enum {
144 ALC861_3ST,
9c7f852e 145 ALC660_3ST,
df694daa
KY
146 ALC861_3ST_DIG,
147 ALC861_6ST_DIG,
22309c3e 148 ALC861_UNIWILL_M31,
a53d1aec 149 ALC861_TOSHIBA,
7cdbff94 150 ALC861_ASUS,
56bb0cab 151 ALC861_ASUS_LAPTOP,
df694daa
KY
152 ALC861_AUTO,
153 ALC861_MODEL_LAST,
154};
155
f32610ed
JS
156/* ALC861-VD models */
157enum {
158 ALC660VD_3ST,
6963f84c 159 ALC660VD_3ST_DIG,
13c94744 160 ALC660VD_ASUS_V1S,
f32610ed
JS
161 ALC861VD_3ST,
162 ALC861VD_3ST_DIG,
163 ALC861VD_6ST_DIG,
bdd148a3 164 ALC861VD_LENOVO,
272a527c 165 ALC861VD_DALLAS,
d1a991a6 166 ALC861VD_HP,
f32610ed
JS
167 ALC861VD_AUTO,
168 ALC861VD_MODEL_LAST,
169};
170
bc9f98a9
KY
171/* ALC662 models */
172enum {
173 ALC662_3ST_2ch_DIG,
174 ALC662_3ST_6ch_DIG,
175 ALC662_3ST_6ch,
176 ALC662_5ST_DIG,
177 ALC662_LENOVO_101E,
291702f0 178 ALC662_ASUS_EEEPC_P701,
8c427226 179 ALC662_ASUS_EEEPC_EP20,
6dda9f4a
KY
180 ALC663_ASUS_M51VA,
181 ALC663_ASUS_G71V,
182 ALC663_ASUS_H13,
183 ALC663_ASUS_G50V,
f1d4e28b
KY
184 ALC662_ECS,
185 ALC663_ASUS_MODE1,
186 ALC662_ASUS_MODE2,
187 ALC663_ASUS_MODE3,
188 ALC663_ASUS_MODE4,
189 ALC663_ASUS_MODE5,
190 ALC663_ASUS_MODE6,
622e84cd
KY
191 ALC272_DELL,
192 ALC272_DELL_ZM1,
9541ba1d 193 ALC272_SAMSUNG_NC10,
bc9f98a9
KY
194 ALC662_AUTO,
195 ALC662_MODEL_LAST,
196};
197
df694daa
KY
198/* ALC882 models */
199enum {
200 ALC882_3ST_DIG,
201 ALC882_6ST_DIG,
4b146cb0 202 ALC882_ARIMA,
bdd148a3 203 ALC882_W2JC,
272a527c
KY
204 ALC882_TARGA,
205 ALC882_ASUS_A7J,
914759b7 206 ALC882_ASUS_A7M,
9102cd1c 207 ALC885_MACPRO,
87350ad0 208 ALC885_MBP3,
41d5545d 209 ALC885_MB5,
c54728d8 210 ALC885_IMAC24,
9c7f852e
TI
211 ALC883_3ST_2ch_DIG,
212 ALC883_3ST_6ch_DIG,
213 ALC883_3ST_6ch,
214 ALC883_6ST_DIG,
ccc656ce
KY
215 ALC883_TARGA_DIG,
216 ALC883_TARGA_2ch_DIG,
64a8be74 217 ALC883_TARGA_8ch_DIG,
bab282b9 218 ALC883_ACER,
2880a867 219 ALC883_ACER_ASPIRE,
5b2d1eca 220 ALC888_ACER_ASPIRE_4930G,
d2fd4b09 221 ALC888_ACER_ASPIRE_6530G,
3b315d70 222 ALC888_ACER_ASPIRE_8930G,
fc86f954 223 ALC888_ACER_ASPIRE_7730G,
c07584c8 224 ALC883_MEDION,
ea1fb29a 225 ALC883_MEDION_MD2,
b373bdeb 226 ALC883_LAPTOP_EAPD,
bc9f98a9 227 ALC883_LENOVO_101E_2ch,
272a527c 228 ALC883_LENOVO_NB0763,
189609ae 229 ALC888_LENOVO_MS7195_DIG,
e2757d5e 230 ALC888_LENOVO_SKY,
ea1fb29a 231 ALC883_HAIER_W66,
4723c022 232 ALC888_3ST_HP,
5795b9e6 233 ALC888_6ST_DELL,
a8848bd6 234 ALC883_MITAC,
a65cc60f 235 ALC883_CLEVO_M540R,
0c4cc443 236 ALC883_CLEVO_M720,
fb97dc67 237 ALC883_FUJITSU_PI2515,
ef8ef5fb 238 ALC888_FUJITSU_XA3530,
17bba1b7 239 ALC883_3ST_6ch_INTEL,
87a8c370
JK
240 ALC889A_INTEL,
241 ALC889_INTEL,
e2757d5e
KY
242 ALC888_ASUS_M90V,
243 ALC888_ASUS_EEE1601,
eb4c41d3 244 ALC889A_MB31,
3ab90935 245 ALC1200_ASUS_P5Q,
3e1647c5 246 ALC883_SONY_VAIO_TT,
4953550a
TI
247 ALC882_AUTO,
248 ALC882_MODEL_LAST,
9c7f852e
TI
249};
250
df694daa
KY
251/* for GPIO Poll */
252#define GPIO_MASK 0x03
253
4a79ba34
TI
254/* extra amp-initialization sequence types */
255enum {
256 ALC_INIT_NONE,
257 ALC_INIT_DEFAULT,
258 ALC_INIT_GPIO1,
259 ALC_INIT_GPIO2,
260 ALC_INIT_GPIO3,
261};
262
6c819492
TI
263struct alc_mic_route {
264 hda_nid_t pin;
265 unsigned char mux_idx;
266 unsigned char amix_idx;
267};
268
269#define MUX_IDX_UNDEF ((unsigned char)-1)
270
1da177e4
LT
271struct alc_spec {
272 /* codec parameterization */
df694daa 273 struct snd_kcontrol_new *mixers[5]; /* mixer arrays */
1da177e4 274 unsigned int num_mixers;
f9e336f6 275 struct snd_kcontrol_new *cap_mixer; /* capture mixer */
45bdd1c1 276 unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */
1da177e4 277
2d9c6482 278 const struct hda_verb *init_verbs[10]; /* initialization verbs
9c7f852e
TI
279 * don't forget NULL
280 * termination!
e9edcee0
TI
281 */
282 unsigned int num_init_verbs;
1da177e4 283
aa563af7 284 char stream_name_analog[32]; /* analog PCM stream */
1da177e4
LT
285 struct hda_pcm_stream *stream_analog_playback;
286 struct hda_pcm_stream *stream_analog_capture;
6330079f
TI
287 struct hda_pcm_stream *stream_analog_alt_playback;
288 struct hda_pcm_stream *stream_analog_alt_capture;
1da177e4 289
aa563af7 290 char stream_name_digital[32]; /* digital PCM stream */
1da177e4
LT
291 struct hda_pcm_stream *stream_digital_playback;
292 struct hda_pcm_stream *stream_digital_capture;
293
294 /* playback */
16ded525
TI
295 struct hda_multi_out multiout; /* playback set-up
296 * max_channels, dacs must be set
297 * dig_out_nid and hp_nid are optional
298 */
6330079f 299 hda_nid_t alt_dac_nid;
6a05ac4a 300 hda_nid_t slave_dig_outs[3]; /* optional - for auto-parsing */
8c441982 301 int dig_out_type;
1da177e4
LT
302
303 /* capture */
304 unsigned int num_adc_nids;
305 hda_nid_t *adc_nids;
e1406348 306 hda_nid_t *capsrc_nids;
16ded525 307 hda_nid_t dig_in_nid; /* digital-in NID; optional */
1da177e4
LT
308
309 /* capture source */
a1e8d2da 310 unsigned int num_mux_defs;
1da177e4
LT
311 const struct hda_input_mux *input_mux;
312 unsigned int cur_mux[3];
6c819492
TI
313 struct alc_mic_route ext_mic;
314 struct alc_mic_route int_mic;
1da177e4
LT
315
316 /* channel model */
d2a6d7dc 317 const struct hda_channel_mode *channel_mode;
1da177e4 318 int num_channel_mode;
4e195a7b 319 int need_dac_fix;
3b315d70
HM
320 int const_channel_count;
321 int ext_channel_count;
1da177e4
LT
322
323 /* PCM information */
4c5186ed 324 struct hda_pcm pcm_rec[3]; /* used in alc_build_pcms() */
41e41f1f 325
e9edcee0
TI
326 /* dynamic controls, init_verbs and input_mux */
327 struct auto_pin_cfg autocfg;
603c4019 328 struct snd_array kctls;
61b9b9b1 329 struct hda_input_mux private_imux[3];
41923e44 330 hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
4953550a
TI
331 hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
332 hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
834be88d 333
ae6b813a
TI
334 /* hooks */
335 void (*init_hook)(struct hda_codec *codec);
336 void (*unsol_event)(struct hda_codec *codec, unsigned int res);
337
834be88d
TI
338 /* for pin sensing */
339 unsigned int sense_updated: 1;
340 unsigned int jack_present: 1;
bec15c3a 341 unsigned int master_sw: 1;
6c819492 342 unsigned int auto_mic:1;
cb53c626 343
e64f14f4
TI
344 /* other flags */
345 unsigned int no_analog :1; /* digital I/O only */
4a79ba34 346 int init_amp;
e64f14f4 347
2134ea4f
TI
348 /* for virtual master */
349 hda_nid_t vmaster_nid;
cb53c626
TI
350#ifdef CONFIG_SND_HDA_POWER_SAVE
351 struct hda_loopback_check loopback;
352#endif
2c3bf9ab
TI
353
354 /* for PLL fix */
355 hda_nid_t pll_nid;
356 unsigned int pll_coef_idx, pll_coef_bit;
df694daa
KY
357};
358
359/*
360 * configuration template - to be copied to the spec instance
361 */
362struct alc_config_preset {
9c7f852e
TI
363 struct snd_kcontrol_new *mixers[5]; /* should be identical size
364 * with spec
365 */
f9e336f6 366 struct snd_kcontrol_new *cap_mixer; /* capture mixer */
df694daa
KY
367 const struct hda_verb *init_verbs[5];
368 unsigned int num_dacs;
369 hda_nid_t *dac_nids;
370 hda_nid_t dig_out_nid; /* optional */
371 hda_nid_t hp_nid; /* optional */
b25c9da1 372 hda_nid_t *slave_dig_outs;
df694daa
KY
373 unsigned int num_adc_nids;
374 hda_nid_t *adc_nids;
e1406348 375 hda_nid_t *capsrc_nids;
df694daa
KY
376 hda_nid_t dig_in_nid;
377 unsigned int num_channel_mode;
378 const struct hda_channel_mode *channel_mode;
4e195a7b 379 int need_dac_fix;
3b315d70 380 int const_channel_count;
a1e8d2da 381 unsigned int num_mux_defs;
df694daa 382 const struct hda_input_mux *input_mux;
ae6b813a 383 void (*unsol_event)(struct hda_codec *, unsigned int);
e9c364c0 384 void (*setup)(struct hda_codec *);
ae6b813a 385 void (*init_hook)(struct hda_codec *);
cb53c626
TI
386#ifdef CONFIG_SND_HDA_POWER_SAVE
387 struct hda_amp_list *loopbacks;
388#endif
1da177e4
LT
389};
390
1da177e4
LT
391
392/*
393 * input MUX handling
394 */
9c7f852e
TI
395static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
396 struct snd_ctl_elem_info *uinfo)
1da177e4
LT
397{
398 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
399 struct alc_spec *spec = codec->spec;
a1e8d2da
JW
400 unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
401 if (mux_idx >= spec->num_mux_defs)
402 mux_idx = 0;
403 return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
1da177e4
LT
404}
405
9c7f852e
TI
406static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
407 struct snd_ctl_elem_value *ucontrol)
1da177e4
LT
408{
409 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
410 struct alc_spec *spec = codec->spec;
411 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
412
413 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
414 return 0;
415}
416
9c7f852e
TI
417static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
418 struct snd_ctl_elem_value *ucontrol)
1da177e4
LT
419{
420 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
421 struct alc_spec *spec = codec->spec;
cd896c33 422 const struct hda_input_mux *imux;
1da177e4 423 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
cd896c33 424 unsigned int mux_idx;
e1406348
TI
425 hda_nid_t nid = spec->capsrc_nids ?
426 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
0169b6b3 427 unsigned int type;
1da177e4 428
cd896c33
TI
429 mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
430 imux = &spec->input_mux[mux_idx];
431
a22d543a 432 type = get_wcaps_type(get_wcaps(codec, nid));
0169b6b3 433 if (type == AC_WID_AUD_MIX) {
54cbc9ab
TI
434 /* Matrix-mixer style (e.g. ALC882) */
435 unsigned int *cur_val = &spec->cur_mux[adc_idx];
436 unsigned int i, idx;
437
438 idx = ucontrol->value.enumerated.item[0];
439 if (idx >= imux->num_items)
440 idx = imux->num_items - 1;
441 if (*cur_val == idx)
442 return 0;
443 for (i = 0; i < imux->num_items; i++) {
444 unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
445 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
446 imux->items[i].index,
447 HDA_AMP_MUTE, v);
448 }
449 *cur_val = idx;
450 return 1;
451 } else {
452 /* MUX style (e.g. ALC880) */
cd896c33 453 return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
54cbc9ab
TI
454 &spec->cur_mux[adc_idx]);
455 }
456}
e9edcee0 457
1da177e4
LT
458/*
459 * channel mode setting
460 */
9c7f852e
TI
461static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
462 struct snd_ctl_elem_info *uinfo)
1da177e4
LT
463{
464 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
465 struct alc_spec *spec = codec->spec;
d2a6d7dc
TI
466 return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
467 spec->num_channel_mode);
1da177e4
LT
468}
469
9c7f852e
TI
470static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
471 struct snd_ctl_elem_value *ucontrol)
1da177e4
LT
472{
473 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
474 struct alc_spec *spec = codec->spec;
d2a6d7dc 475 return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
9c7f852e 476 spec->num_channel_mode,
3b315d70 477 spec->ext_channel_count);
1da177e4
LT
478}
479
9c7f852e
TI
480static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
481 struct snd_ctl_elem_value *ucontrol)
1da177e4
LT
482{
483 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
484 struct alc_spec *spec = codec->spec;
4e195a7b
TI
485 int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
486 spec->num_channel_mode,
3b315d70
HM
487 &spec->ext_channel_count);
488 if (err >= 0 && !spec->const_channel_count) {
489 spec->multiout.max_channels = spec->ext_channel_count;
490 if (spec->need_dac_fix)
491 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
492 }
4e195a7b 493 return err;
1da177e4
LT
494}
495
a9430dd8 496/*
4c5186ed 497 * Control the mode of pin widget settings via the mixer. "pc" is used
ea1fb29a 498 * instead of "%" to avoid consequences of accidently treating the % as
4c5186ed
JW
499 * being part of a format specifier. Maximum allowed length of a value is
500 * 63 characters plus NULL terminator.
7cf51e48
JW
501 *
502 * Note: some retasking pin complexes seem to ignore requests for input
503 * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
504 * are requested. Therefore order this list so that this behaviour will not
505 * cause problems when mixer clients move through the enum sequentially.
a1e8d2da
JW
506 * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
507 * March 2006.
4c5186ed
JW
508 */
509static char *alc_pin_mode_names[] = {
7cf51e48
JW
510 "Mic 50pc bias", "Mic 80pc bias",
511 "Line in", "Line out", "Headphone out",
4c5186ed
JW
512};
513static unsigned char alc_pin_mode_values[] = {
7cf51e48 514 PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
4c5186ed
JW
515};
516/* The control can present all 5 options, or it can limit the options based
a1e8d2da
JW
517 * in the pin being assumed to be exclusively an input or an output pin. In
518 * addition, "input" pins may or may not process the mic bias option
519 * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
520 * accept requests for bias as of chip versions up to March 2006) and/or
521 * wiring in the computer.
a9430dd8 522 */
a1e8d2da
JW
523#define ALC_PIN_DIR_IN 0x00
524#define ALC_PIN_DIR_OUT 0x01
525#define ALC_PIN_DIR_INOUT 0x02
526#define ALC_PIN_DIR_IN_NOMICBIAS 0x03
527#define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
4c5186ed 528
ea1fb29a 529/* Info about the pin modes supported by the different pin direction modes.
4c5186ed
JW
530 * For each direction the minimum and maximum values are given.
531 */
a1e8d2da 532static signed char alc_pin_mode_dir_info[5][2] = {
4c5186ed
JW
533 { 0, 2 }, /* ALC_PIN_DIR_IN */
534 { 3, 4 }, /* ALC_PIN_DIR_OUT */
535 { 0, 4 }, /* ALC_PIN_DIR_INOUT */
a1e8d2da
JW
536 { 2, 2 }, /* ALC_PIN_DIR_IN_NOMICBIAS */
537 { 2, 4 }, /* ALC_PIN_DIR_INOUT_NOMICBIAS */
4c5186ed
JW
538};
539#define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
540#define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
541#define alc_pin_mode_n_items(_dir) \
542 (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
543
9c7f852e
TI
544static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
545 struct snd_ctl_elem_info *uinfo)
a9430dd8 546{
4c5186ed
JW
547 unsigned int item_num = uinfo->value.enumerated.item;
548 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
549
550 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
a9430dd8 551 uinfo->count = 1;
4c5186ed
JW
552 uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
553
554 if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
555 item_num = alc_pin_mode_min(dir);
556 strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
a9430dd8
JW
557 return 0;
558}
559
9c7f852e
TI
560static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
561 struct snd_ctl_elem_value *ucontrol)
a9430dd8 562{
4c5186ed 563 unsigned int i;
a9430dd8
JW
564 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
565 hda_nid_t nid = kcontrol->private_value & 0xffff;
4c5186ed 566 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
a9430dd8 567 long *valp = ucontrol->value.integer.value;
9c7f852e
TI
568 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
569 AC_VERB_GET_PIN_WIDGET_CONTROL,
570 0x00);
a9430dd8 571
4c5186ed
JW
572 /* Find enumerated value for current pinctl setting */
573 i = alc_pin_mode_min(dir);
4b35d2ca 574 while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
4c5186ed 575 i++;
9c7f852e 576 *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
a9430dd8
JW
577 return 0;
578}
579
9c7f852e
TI
580static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
581 struct snd_ctl_elem_value *ucontrol)
a9430dd8 582{
4c5186ed 583 signed int change;
a9430dd8
JW
584 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
585 hda_nid_t nid = kcontrol->private_value & 0xffff;
4c5186ed
JW
586 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
587 long val = *ucontrol->value.integer.value;
9c7f852e
TI
588 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
589 AC_VERB_GET_PIN_WIDGET_CONTROL,
590 0x00);
a9430dd8 591
f12ab1e0 592 if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
4c5186ed
JW
593 val = alc_pin_mode_min(dir);
594
595 change = pinctl != alc_pin_mode_values[val];
cdcd9268
JW
596 if (change) {
597 /* Set pin mode to that requested */
82beb8fd
TI
598 snd_hda_codec_write_cache(codec, nid, 0,
599 AC_VERB_SET_PIN_WIDGET_CONTROL,
600 alc_pin_mode_values[val]);
cdcd9268 601
ea1fb29a 602 /* Also enable the retasking pin's input/output as required
cdcd9268
JW
603 * for the requested pin mode. Enum values of 2 or less are
604 * input modes.
605 *
606 * Dynamically switching the input/output buffers probably
a1e8d2da
JW
607 * reduces noise slightly (particularly on input) so we'll
608 * do it. However, having both input and output buffers
609 * enabled simultaneously doesn't seem to be problematic if
610 * this turns out to be necessary in the future.
cdcd9268
JW
611 */
612 if (val <= 2) {
47fd830a
TI
613 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
614 HDA_AMP_MUTE, HDA_AMP_MUTE);
615 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
616 HDA_AMP_MUTE, 0);
cdcd9268 617 } else {
47fd830a
TI
618 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
619 HDA_AMP_MUTE, HDA_AMP_MUTE);
620 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
621 HDA_AMP_MUTE, 0);
cdcd9268
JW
622 }
623 }
a9430dd8
JW
624 return change;
625}
626
4c5186ed 627#define ALC_PIN_MODE(xname, nid, dir) \
a9430dd8 628 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
4c5186ed
JW
629 .info = alc_pin_mode_info, \
630 .get = alc_pin_mode_get, \
631 .put = alc_pin_mode_put, \
632 .private_value = nid | (dir<<16) }
df694daa 633
5c8f858d
JW
634/* A switch control for ALC260 GPIO pins. Multiple GPIOs can be ganged
635 * together using a mask with more than one bit set. This control is
636 * currently used only by the ALC260 test model. At this stage they are not
637 * needed for any "production" models.
638 */
639#ifdef CONFIG_SND_DEBUG
a5ce8890 640#define alc_gpio_data_info snd_ctl_boolean_mono_info
f12ab1e0 641
9c7f852e
TI
642static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
643 struct snd_ctl_elem_value *ucontrol)
5c8f858d
JW
644{
645 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
646 hda_nid_t nid = kcontrol->private_value & 0xffff;
647 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
648 long *valp = ucontrol->value.integer.value;
9c7f852e
TI
649 unsigned int val = snd_hda_codec_read(codec, nid, 0,
650 AC_VERB_GET_GPIO_DATA, 0x00);
5c8f858d
JW
651
652 *valp = (val & mask) != 0;
653 return 0;
654}
9c7f852e
TI
655static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
656 struct snd_ctl_elem_value *ucontrol)
5c8f858d
JW
657{
658 signed int change;
659 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
660 hda_nid_t nid = kcontrol->private_value & 0xffff;
661 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
662 long val = *ucontrol->value.integer.value;
9c7f852e
TI
663 unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
664 AC_VERB_GET_GPIO_DATA,
665 0x00);
5c8f858d
JW
666
667 /* Set/unset the masked GPIO bit(s) as needed */
9c7f852e
TI
668 change = (val == 0 ? 0 : mask) != (gpio_data & mask);
669 if (val == 0)
5c8f858d
JW
670 gpio_data &= ~mask;
671 else
672 gpio_data |= mask;
82beb8fd
TI
673 snd_hda_codec_write_cache(codec, nid, 0,
674 AC_VERB_SET_GPIO_DATA, gpio_data);
5c8f858d
JW
675
676 return change;
677}
678#define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
679 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
680 .info = alc_gpio_data_info, \
681 .get = alc_gpio_data_get, \
682 .put = alc_gpio_data_put, \
683 .private_value = nid | (mask<<16) }
684#endif /* CONFIG_SND_DEBUG */
685
92621f13
JW
686/* A switch control to allow the enabling of the digital IO pins on the
687 * ALC260. This is incredibly simplistic; the intention of this control is
688 * to provide something in the test model allowing digital outputs to be
689 * identified if present. If models are found which can utilise these
690 * outputs a more complete mixer control can be devised for those models if
691 * necessary.
692 */
693#ifdef CONFIG_SND_DEBUG
a5ce8890 694#define alc_spdif_ctrl_info snd_ctl_boolean_mono_info
f12ab1e0 695
9c7f852e
TI
696static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
697 struct snd_ctl_elem_value *ucontrol)
92621f13
JW
698{
699 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
700 hda_nid_t nid = kcontrol->private_value & 0xffff;
701 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
702 long *valp = ucontrol->value.integer.value;
9c7f852e 703 unsigned int val = snd_hda_codec_read(codec, nid, 0,
3982d17e 704 AC_VERB_GET_DIGI_CONVERT_1, 0x00);
92621f13
JW
705
706 *valp = (val & mask) != 0;
707 return 0;
708}
9c7f852e
TI
709static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
710 struct snd_ctl_elem_value *ucontrol)
92621f13
JW
711{
712 signed int change;
713 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
714 hda_nid_t nid = kcontrol->private_value & 0xffff;
715 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
716 long val = *ucontrol->value.integer.value;
9c7f852e 717 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
3982d17e 718 AC_VERB_GET_DIGI_CONVERT_1,
9c7f852e 719 0x00);
92621f13
JW
720
721 /* Set/unset the masked control bit(s) as needed */
9c7f852e 722 change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
92621f13
JW
723 if (val==0)
724 ctrl_data &= ~mask;
725 else
726 ctrl_data |= mask;
82beb8fd
TI
727 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
728 ctrl_data);
92621f13
JW
729
730 return change;
731}
732#define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
733 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
734 .info = alc_spdif_ctrl_info, \
735 .get = alc_spdif_ctrl_get, \
736 .put = alc_spdif_ctrl_put, \
737 .private_value = nid | (mask<<16) }
738#endif /* CONFIG_SND_DEBUG */
739
f8225f6d
JW
740/* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
741 * Again, this is only used in the ALC26x test models to help identify when
742 * the EAPD line must be asserted for features to work.
743 */
744#ifdef CONFIG_SND_DEBUG
745#define alc_eapd_ctrl_info snd_ctl_boolean_mono_info
746
747static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
748 struct snd_ctl_elem_value *ucontrol)
749{
750 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
751 hda_nid_t nid = kcontrol->private_value & 0xffff;
752 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
753 long *valp = ucontrol->value.integer.value;
754 unsigned int val = snd_hda_codec_read(codec, nid, 0,
755 AC_VERB_GET_EAPD_BTLENABLE, 0x00);
756
757 *valp = (val & mask) != 0;
758 return 0;
759}
760
761static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
762 struct snd_ctl_elem_value *ucontrol)
763{
764 int change;
765 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
766 hda_nid_t nid = kcontrol->private_value & 0xffff;
767 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
768 long val = *ucontrol->value.integer.value;
769 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
770 AC_VERB_GET_EAPD_BTLENABLE,
771 0x00);
772
773 /* Set/unset the masked control bit(s) as needed */
774 change = (!val ? 0 : mask) != (ctrl_data & mask);
775 if (!val)
776 ctrl_data &= ~mask;
777 else
778 ctrl_data |= mask;
779 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
780 ctrl_data);
781
782 return change;
783}
784
785#define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
786 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
787 .info = alc_eapd_ctrl_info, \
788 .get = alc_eapd_ctrl_get, \
789 .put = alc_eapd_ctrl_put, \
790 .private_value = nid | (mask<<16) }
791#endif /* CONFIG_SND_DEBUG */
792
23f0c048
TI
793/*
794 * set up the input pin config (depending on the given auto-pin type)
795 */
796static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
797 int auto_pin_type)
798{
799 unsigned int val = PIN_IN;
800
801 if (auto_pin_type <= AUTO_PIN_FRONT_MIC) {
802 unsigned int pincap;
1327a32b 803 pincap = snd_hda_query_pin_caps(codec, nid);
23f0c048
TI
804 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
805 if (pincap & AC_PINCAP_VREF_80)
806 val = PIN_VREF80;
461c6c3a
TI
807 else if (pincap & AC_PINCAP_VREF_50)
808 val = PIN_VREF50;
809 else if (pincap & AC_PINCAP_VREF_100)
810 val = PIN_VREF100;
811 else if (pincap & AC_PINCAP_VREF_GRD)
812 val = PIN_VREFGRD;
23f0c048
TI
813 }
814 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
815}
816
d88897ea
TI
817/*
818 */
819static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
820{
821 if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
822 return;
823 spec->mixers[spec->num_mixers++] = mix;
824}
825
826static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
827{
828 if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
829 return;
830 spec->init_verbs[spec->num_init_verbs++] = verb;
831}
832
daead538
TI
833#ifdef CONFIG_PROC_FS
834/*
835 * hook for proc
836 */
837static void print_realtek_coef(struct snd_info_buffer *buffer,
838 struct hda_codec *codec, hda_nid_t nid)
839{
840 int coeff;
841
842 if (nid != 0x20)
843 return;
844 coeff = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
845 snd_iprintf(buffer, " Processing Coefficient: 0x%02x\n", coeff);
846 coeff = snd_hda_codec_read(codec, nid, 0,
847 AC_VERB_GET_COEF_INDEX, 0);
848 snd_iprintf(buffer, " Coefficient Index: 0x%02x\n", coeff);
849}
850#else
851#define print_realtek_coef NULL
852#endif
853
df694daa
KY
854/*
855 * set up from the preset table
856 */
e9c364c0 857static void setup_preset(struct hda_codec *codec,
9c7f852e 858 const struct alc_config_preset *preset)
df694daa 859{
e9c364c0 860 struct alc_spec *spec = codec->spec;
df694daa
KY
861 int i;
862
863 for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
d88897ea 864 add_mixer(spec, preset->mixers[i]);
f9e336f6 865 spec->cap_mixer = preset->cap_mixer;
9c7f852e
TI
866 for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
867 i++)
d88897ea 868 add_verb(spec, preset->init_verbs[i]);
ea1fb29a 869
df694daa
KY
870 spec->channel_mode = preset->channel_mode;
871 spec->num_channel_mode = preset->num_channel_mode;
4e195a7b 872 spec->need_dac_fix = preset->need_dac_fix;
3b315d70 873 spec->const_channel_count = preset->const_channel_count;
df694daa 874
3b315d70
HM
875 if (preset->const_channel_count)
876 spec->multiout.max_channels = preset->const_channel_count;
877 else
878 spec->multiout.max_channels = spec->channel_mode[0].channels;
879 spec->ext_channel_count = spec->channel_mode[0].channels;
df694daa
KY
880
881 spec->multiout.num_dacs = preset->num_dacs;
882 spec->multiout.dac_nids = preset->dac_nids;
883 spec->multiout.dig_out_nid = preset->dig_out_nid;
b25c9da1 884 spec->multiout.slave_dig_outs = preset->slave_dig_outs;
df694daa 885 spec->multiout.hp_nid = preset->hp_nid;
ea1fb29a 886
a1e8d2da 887 spec->num_mux_defs = preset->num_mux_defs;
f12ab1e0 888 if (!spec->num_mux_defs)
a1e8d2da 889 spec->num_mux_defs = 1;
df694daa
KY
890 spec->input_mux = preset->input_mux;
891
892 spec->num_adc_nids = preset->num_adc_nids;
893 spec->adc_nids = preset->adc_nids;
e1406348 894 spec->capsrc_nids = preset->capsrc_nids;
df694daa 895 spec->dig_in_nid = preset->dig_in_nid;
ae6b813a
TI
896
897 spec->unsol_event = preset->unsol_event;
898 spec->init_hook = preset->init_hook;
cb53c626
TI
899#ifdef CONFIG_SND_HDA_POWER_SAVE
900 spec->loopback.amplist = preset->loopbacks;
901#endif
e9c364c0
TI
902
903 if (preset->setup)
904 preset->setup(codec);
df694daa
KY
905}
906
bc9f98a9
KY
907/* Enable GPIO mask and set output */
908static struct hda_verb alc_gpio1_init_verbs[] = {
909 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
910 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
911 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
912 { }
913};
914
915static struct hda_verb alc_gpio2_init_verbs[] = {
916 {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
917 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
918 {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
919 { }
920};
921
bdd148a3
KY
922static struct hda_verb alc_gpio3_init_verbs[] = {
923 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
924 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
925 {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
926 { }
927};
928
2c3bf9ab
TI
929/*
930 * Fix hardware PLL issue
931 * On some codecs, the analog PLL gating control must be off while
932 * the default value is 1.
933 */
934static void alc_fix_pll(struct hda_codec *codec)
935{
936 struct alc_spec *spec = codec->spec;
937 unsigned int val;
938
939 if (!spec->pll_nid)
940 return;
941 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
942 spec->pll_coef_idx);
943 val = snd_hda_codec_read(codec, spec->pll_nid, 0,
944 AC_VERB_GET_PROC_COEF, 0);
945 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
946 spec->pll_coef_idx);
947 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
948 val & ~(1 << spec->pll_coef_bit));
949}
950
951static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
952 unsigned int coef_idx, unsigned int coef_bit)
953{
954 struct alc_spec *spec = codec->spec;
955 spec->pll_nid = nid;
956 spec->pll_coef_idx = coef_idx;
957 spec->pll_coef_bit = coef_bit;
958 alc_fix_pll(codec);
959}
960
a9fd4f3f 961static void alc_automute_pin(struct hda_codec *codec)
c9b58006
KY
962{
963 struct alc_spec *spec = codec->spec;
a9fd4f3f
TI
964 unsigned int nid = spec->autocfg.hp_pins[0];
965 int i;
c9b58006 966
ad87c64f
TI
967 if (!nid)
968 return;
864f92be 969 spec->jack_present = snd_hda_jack_detect(codec, nid);
a9fd4f3f
TI
970 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
971 nid = spec->autocfg.speaker_pins[i];
972 if (!nid)
973 break;
974 snd_hda_codec_write(codec, nid, 0,
975 AC_VERB_SET_PIN_WIDGET_CONTROL,
976 spec->jack_present ? 0 : PIN_OUT);
977 }
c9b58006
KY
978}
979
6c819492
TI
980static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
981 hda_nid_t nid)
982{
983 hda_nid_t conn[HDA_MAX_NUM_INPUTS];
984 int i, nums;
985
986 nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
987 for (i = 0; i < nums; i++)
988 if (conn[i] == nid)
989 return i;
990 return -1;
991}
992
7fb0d78f
KY
993static void alc_mic_automute(struct hda_codec *codec)
994{
995 struct alc_spec *spec = codec->spec;
6c819492
TI
996 struct alc_mic_route *dead, *alive;
997 unsigned int present, type;
998 hda_nid_t cap_nid;
999
b59bdf3b
TI
1000 if (!spec->auto_mic)
1001 return;
6c819492
TI
1002 if (!spec->int_mic.pin || !spec->ext_mic.pin)
1003 return;
1004 if (snd_BUG_ON(!spec->adc_nids))
1005 return;
1006
1007 cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1008
864f92be 1009 present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
6c819492
TI
1010 if (present) {
1011 alive = &spec->ext_mic;
1012 dead = &spec->int_mic;
1013 } else {
1014 alive = &spec->int_mic;
1015 dead = &spec->ext_mic;
1016 }
1017
6c819492
TI
1018 type = get_wcaps_type(get_wcaps(codec, cap_nid));
1019 if (type == AC_WID_AUD_MIX) {
1020 /* Matrix-mixer style (e.g. ALC882) */
1021 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1022 alive->mux_idx,
1023 HDA_AMP_MUTE, 0);
1024 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1025 dead->mux_idx,
1026 HDA_AMP_MUTE, HDA_AMP_MUTE);
1027 } else {
1028 /* MUX style (e.g. ALC880) */
1029 snd_hda_codec_write_cache(codec, cap_nid, 0,
1030 AC_VERB_SET_CONNECT_SEL,
1031 alive->mux_idx);
1032 }
1033
1034 /* FIXME: analog mixer */
7fb0d78f
KY
1035}
1036
c9b58006
KY
1037/* unsolicited event for HP jack sensing */
1038static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1039{
1040 if (codec->vendor_id == 0x10ec0880)
1041 res >>= 28;
1042 else
1043 res >>= 26;
a9fd4f3f
TI
1044 switch (res) {
1045 case ALC880_HP_EVENT:
1046 alc_automute_pin(codec);
1047 break;
1048 case ALC880_MIC_EVENT:
7fb0d78f 1049 alc_mic_automute(codec);
a9fd4f3f
TI
1050 break;
1051 }
7fb0d78f
KY
1052}
1053
1054static void alc_inithook(struct hda_codec *codec)
1055{
a9fd4f3f 1056 alc_automute_pin(codec);
7fb0d78f 1057 alc_mic_automute(codec);
c9b58006
KY
1058}
1059
f9423e7a
KY
1060/* additional initialization for ALC888 variants */
1061static void alc888_coef_init(struct hda_codec *codec)
1062{
1063 unsigned int tmp;
1064
1065 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1066 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1067 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
37db623a 1068 if ((tmp & 0xf0) == 0x20)
f9423e7a
KY
1069 /* alc888S-VC */
1070 snd_hda_codec_read(codec, 0x20, 0,
1071 AC_VERB_SET_PROC_COEF, 0x830);
1072 else
1073 /* alc888-VB */
1074 snd_hda_codec_read(codec, 0x20, 0,
1075 AC_VERB_SET_PROC_COEF, 0x3030);
1076}
1077
87a8c370
JK
1078static void alc889_coef_init(struct hda_codec *codec)
1079{
1080 unsigned int tmp;
1081
1082 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1083 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1084 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1085 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1086}
1087
4a79ba34 1088static void alc_auto_init_amp(struct hda_codec *codec, int type)
bc9f98a9 1089{
4a79ba34 1090 unsigned int tmp;
bc9f98a9 1091
4a79ba34
TI
1092 switch (type) {
1093 case ALC_INIT_GPIO1:
bc9f98a9
KY
1094 snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1095 break;
4a79ba34 1096 case ALC_INIT_GPIO2:
bc9f98a9
KY
1097 snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1098 break;
4a79ba34 1099 case ALC_INIT_GPIO3:
bdd148a3
KY
1100 snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1101 break;
4a79ba34 1102 case ALC_INIT_DEFAULT:
bdd148a3 1103 switch (codec->vendor_id) {
c9b58006
KY
1104 case 0x10ec0260:
1105 snd_hda_codec_write(codec, 0x0f, 0,
1106 AC_VERB_SET_EAPD_BTLENABLE, 2);
1107 snd_hda_codec_write(codec, 0x10, 0,
1108 AC_VERB_SET_EAPD_BTLENABLE, 2);
1109 break;
1110 case 0x10ec0262:
bdd148a3
KY
1111 case 0x10ec0267:
1112 case 0x10ec0268:
c9b58006 1113 case 0x10ec0269:
c6e8f2da 1114 case 0x10ec0272:
f9423e7a
KY
1115 case 0x10ec0660:
1116 case 0x10ec0662:
1117 case 0x10ec0663:
c9b58006 1118 case 0x10ec0862:
20a3a05d 1119 case 0x10ec0889:
bdd148a3
KY
1120 snd_hda_codec_write(codec, 0x14, 0,
1121 AC_VERB_SET_EAPD_BTLENABLE, 2);
1122 snd_hda_codec_write(codec, 0x15, 0,
1123 AC_VERB_SET_EAPD_BTLENABLE, 2);
c9b58006 1124 break;
bdd148a3 1125 }
c9b58006
KY
1126 switch (codec->vendor_id) {
1127 case 0x10ec0260:
1128 snd_hda_codec_write(codec, 0x1a, 0,
1129 AC_VERB_SET_COEF_INDEX, 7);
1130 tmp = snd_hda_codec_read(codec, 0x1a, 0,
1131 AC_VERB_GET_PROC_COEF, 0);
1132 snd_hda_codec_write(codec, 0x1a, 0,
1133 AC_VERB_SET_COEF_INDEX, 7);
1134 snd_hda_codec_write(codec, 0x1a, 0,
1135 AC_VERB_SET_PROC_COEF,
1136 tmp | 0x2010);
1137 break;
1138 case 0x10ec0262:
1139 case 0x10ec0880:
1140 case 0x10ec0882:
1141 case 0x10ec0883:
1142 case 0x10ec0885:
4a5a4c56 1143 case 0x10ec0887:
20a3a05d 1144 case 0x10ec0889:
87a8c370 1145 alc889_coef_init(codec);
c9b58006 1146 break;
f9423e7a 1147 case 0x10ec0888:
4a79ba34 1148 alc888_coef_init(codec);
f9423e7a 1149 break;
c9b58006
KY
1150 case 0x10ec0267:
1151 case 0x10ec0268:
1152 snd_hda_codec_write(codec, 0x20, 0,
1153 AC_VERB_SET_COEF_INDEX, 7);
1154 tmp = snd_hda_codec_read(codec, 0x20, 0,
1155 AC_VERB_GET_PROC_COEF, 0);
1156 snd_hda_codec_write(codec, 0x20, 0,
ea1fb29a 1157 AC_VERB_SET_COEF_INDEX, 7);
c9b58006
KY
1158 snd_hda_codec_write(codec, 0x20, 0,
1159 AC_VERB_SET_PROC_COEF,
1160 tmp | 0x3000);
1161 break;
bc9f98a9 1162 }
4a79ba34
TI
1163 break;
1164 }
1165}
1166
1167static void alc_init_auto_hp(struct hda_codec *codec)
1168{
1169 struct alc_spec *spec = codec->spec;
1170
1171 if (!spec->autocfg.hp_pins[0])
1172 return;
1173
1174 if (!spec->autocfg.speaker_pins[0]) {
2a2ed0df
TI
1175 if (spec->autocfg.line_out_pins[0] &&
1176 spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
4a79ba34
TI
1177 spec->autocfg.speaker_pins[0] =
1178 spec->autocfg.line_out_pins[0];
1179 else
1180 return;
1181 }
1182
2a2ed0df
TI
1183 snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1184 spec->autocfg.hp_pins[0]);
4a79ba34
TI
1185 snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0,
1186 AC_VERB_SET_UNSOLICITED_ENABLE,
1187 AC_USRSP_EN | ALC880_HP_EVENT);
1188 spec->unsol_event = alc_sku_unsol_event;
1189}
1190
6c819492
TI
1191static void alc_init_auto_mic(struct hda_codec *codec)
1192{
1193 struct alc_spec *spec = codec->spec;
1194 struct auto_pin_cfg *cfg = &spec->autocfg;
1195 hda_nid_t fixed, ext;
1196 int i;
1197
1198 /* there must be only two mic inputs exclusively */
1199 for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++)
1200 if (cfg->input_pins[i])
1201 return;
1202
1203 fixed = ext = 0;
1204 for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) {
1205 hda_nid_t nid = cfg->input_pins[i];
1206 unsigned int defcfg;
1207 if (!nid)
1208 return;
1209 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1210 switch (get_defcfg_connect(defcfg)) {
1211 case AC_JACK_PORT_FIXED:
1212 if (fixed)
1213 return; /* already occupied */
1214 fixed = nid;
1215 break;
1216 case AC_JACK_PORT_COMPLEX:
1217 if (ext)
1218 return; /* already occupied */
1219 ext = nid;
1220 break;
1221 default:
1222 return; /* invalid entry */
1223 }
1224 }
1225 if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1226 return; /* no unsol support */
1227 snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1228 ext, fixed);
1229 spec->ext_mic.pin = ext;
1230 spec->int_mic.pin = fixed;
1231 spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1232 spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1233 spec->auto_mic = 1;
1234 snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1235 AC_VERB_SET_UNSOLICITED_ENABLE,
1236 AC_USRSP_EN | ALC880_MIC_EVENT);
1237 spec->unsol_event = alc_sku_unsol_event;
1238}
1239
4a79ba34
TI
1240/* check subsystem ID and set up device-specific initialization;
1241 * return 1 if initialized, 0 if invalid SSID
1242 */
1243/* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1244 * 31 ~ 16 : Manufacture ID
1245 * 15 ~ 8 : SKU ID
1246 * 7 ~ 0 : Assembly ID
1247 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1248 */
1249static int alc_subsystem_id(struct hda_codec *codec,
1250 hda_nid_t porta, hda_nid_t porte,
1251 hda_nid_t portd)
1252{
1253 unsigned int ass, tmp, i;
1254 unsigned nid;
1255 struct alc_spec *spec = codec->spec;
1256
1257 ass = codec->subsystem_id & 0xffff;
1258 if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1259 goto do_sku;
1260
1261 /* invalid SSID, check the special NID pin defcfg instead */
1262 /*
def319f9 1263 * 31~30 : port connectivity
4a79ba34
TI
1264 * 29~21 : reserve
1265 * 20 : PCBEEP input
1266 * 19~16 : Check sum (15:1)
1267 * 15~1 : Custom
1268 * 0 : override
1269 */
1270 nid = 0x1d;
1271 if (codec->vendor_id == 0x10ec0260)
1272 nid = 0x17;
1273 ass = snd_hda_codec_get_pincfg(codec, nid);
1274 snd_printd("realtek: No valid SSID, "
1275 "checking pincfg 0x%08x for NID 0x%x\n",
cb6605c1 1276 ass, nid);
4a79ba34
TI
1277 if (!(ass & 1) && !(ass & 0x100000))
1278 return 0;
1279 if ((ass >> 30) != 1) /* no physical connection */
1280 return 0;
1281
1282 /* check sum */
1283 tmp = 0;
1284 for (i = 1; i < 16; i++) {
1285 if ((ass >> i) & 1)
1286 tmp++;
1287 }
1288 if (((ass >> 16) & 0xf) != tmp)
1289 return 0;
1290do_sku:
1291 snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1292 ass & 0xffff, codec->vendor_id);
1293 /*
1294 * 0 : override
1295 * 1 : Swap Jack
1296 * 2 : 0 --> Desktop, 1 --> Laptop
1297 * 3~5 : External Amplifier control
1298 * 7~6 : Reserved
1299 */
1300 tmp = (ass & 0x38) >> 3; /* external Amp control */
1301 switch (tmp) {
1302 case 1:
1303 spec->init_amp = ALC_INIT_GPIO1;
1304 break;
1305 case 3:
1306 spec->init_amp = ALC_INIT_GPIO2;
1307 break;
1308 case 7:
1309 spec->init_amp = ALC_INIT_GPIO3;
1310 break;
1311 case 5:
1312 spec->init_amp = ALC_INIT_DEFAULT;
bc9f98a9
KY
1313 break;
1314 }
ea1fb29a 1315
8c427226 1316 /* is laptop or Desktop and enable the function "Mute internal speaker
c9b58006
KY
1317 * when the external headphone out jack is plugged"
1318 */
8c427226 1319 if (!(ass & 0x8000))
4a79ba34 1320 return 1;
c9b58006
KY
1321 /*
1322 * 10~8 : Jack location
1323 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1324 * 14~13: Resvered
1325 * 15 : 1 --> enable the function "Mute internal speaker
1326 * when the external headphone out jack is plugged"
1327 */
c9b58006 1328 if (!spec->autocfg.hp_pins[0]) {
01d4825d 1329 hda_nid_t nid;
c9b58006
KY
1330 tmp = (ass >> 11) & 0x3; /* HP to chassis */
1331 if (tmp == 0)
01d4825d 1332 nid = porta;
c9b58006 1333 else if (tmp == 1)
01d4825d 1334 nid = porte;
c9b58006 1335 else if (tmp == 2)
01d4825d 1336 nid = portd;
c9b58006 1337 else
4a79ba34 1338 return 1;
01d4825d
TI
1339 for (i = 0; i < spec->autocfg.line_outs; i++)
1340 if (spec->autocfg.line_out_pins[i] == nid)
1341 return 1;
1342 spec->autocfg.hp_pins[0] = nid;
c9b58006
KY
1343 }
1344
4a79ba34 1345 alc_init_auto_hp(codec);
6c819492 1346 alc_init_auto_mic(codec);
4a79ba34
TI
1347 return 1;
1348}
ea1fb29a 1349
4a79ba34
TI
1350static void alc_ssid_check(struct hda_codec *codec,
1351 hda_nid_t porta, hda_nid_t porte, hda_nid_t portd)
1352{
1353 if (!alc_subsystem_id(codec, porta, porte, portd)) {
1354 struct alc_spec *spec = codec->spec;
1355 snd_printd("realtek: "
1356 "Enable default setup for auto mode as fallback\n");
1357 spec->init_amp = ALC_INIT_DEFAULT;
1358 alc_init_auto_hp(codec);
6c819492 1359 alc_init_auto_mic(codec);
4a79ba34 1360 }
bc9f98a9
KY
1361}
1362
f95474ec 1363/*
f8f25ba3 1364 * Fix-up pin default configurations and add default verbs
f95474ec
TI
1365 */
1366
1367struct alc_pincfg {
1368 hda_nid_t nid;
1369 u32 val;
1370};
1371
f8f25ba3
TI
1372struct alc_fixup {
1373 const struct alc_pincfg *pins;
1374 const struct hda_verb *verbs;
1375};
1376
1377static void alc_pick_fixup(struct hda_codec *codec,
f95474ec 1378 const struct snd_pci_quirk *quirk,
f8f25ba3 1379 const struct alc_fixup *fix)
f95474ec
TI
1380{
1381 const struct alc_pincfg *cfg;
1382
1383 quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1384 if (!quirk)
1385 return;
1386
f8f25ba3
TI
1387 fix += quirk->value;
1388 cfg = fix->pins;
1389 if (cfg) {
1390 for (; cfg->nid; cfg++)
1391 snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1392 }
1393 if (fix->verbs)
1394 add_verb(codec->spec, fix->verbs);
f95474ec
TI
1395}
1396
ef8ef5fb
VP
1397/*
1398 * ALC888
1399 */
1400
1401/*
1402 * 2ch mode
1403 */
1404static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1405/* Mic-in jack as mic in */
1406 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1407 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1408/* Line-in jack as Line in */
1409 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1410 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1411/* Line-Out as Front */
1412 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1413 { } /* end */
1414};
1415
1416/*
1417 * 4ch mode
1418 */
1419static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1420/* Mic-in jack as mic in */
1421 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1422 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1423/* Line-in jack as Surround */
1424 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1425 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1426/* Line-Out as Front */
1427 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1428 { } /* end */
1429};
1430
1431/*
1432 * 6ch mode
1433 */
1434static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1435/* Mic-in jack as CLFE */
1436 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1437 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1438/* Line-in jack as Surround */
1439 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1440 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1441/* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1442 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1443 { } /* end */
1444};
1445
1446/*
1447 * 8ch mode
1448 */
1449static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1450/* Mic-in jack as CLFE */
1451 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1452 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1453/* Line-in jack as Surround */
1454 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1455 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1456/* Line-Out as Side */
1457 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1458 { } /* end */
1459};
1460
1461static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1462 { 2, alc888_4ST_ch2_intel_init },
1463 { 4, alc888_4ST_ch4_intel_init },
1464 { 6, alc888_4ST_ch6_intel_init },
1465 { 8, alc888_4ST_ch8_intel_init },
1466};
1467
1468/*
1469 * ALC888 Fujitsu Siemens Amillo xa3530
1470 */
1471
1472static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1473/* Front Mic: set to PIN_IN (empty by default) */
1474 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1475/* Connect Internal HP to Front */
1476 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1477 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1478 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1479/* Connect Bass HP to Front */
1480 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1481 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1482 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1483/* Connect Line-Out side jack (SPDIF) to Side */
1484 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1485 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1486 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1487/* Connect Mic jack to CLFE */
1488 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1489 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1490 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1491/* Connect Line-in jack to Surround */
1492 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1493 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1494 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1495/* Connect HP out jack to Front */
1496 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1497 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1498 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1499/* Enable unsolicited event for HP jack and Line-out jack */
1500 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1501 {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1502 {}
1503};
1504
a9fd4f3f 1505static void alc_automute_amp(struct hda_codec *codec)
ef8ef5fb 1506{
a9fd4f3f 1507 struct alc_spec *spec = codec->spec;
864f92be 1508 unsigned int mute;
a9fd4f3f
TI
1509 hda_nid_t nid;
1510 int i;
1511
1512 spec->jack_present = 0;
1513 for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1514 nid = spec->autocfg.hp_pins[i];
1515 if (!nid)
1516 break;
864f92be 1517 if (snd_hda_jack_detect(codec, nid)) {
a9fd4f3f
TI
1518 spec->jack_present = 1;
1519 break;
1520 }
1521 }
1522
1523 mute = spec->jack_present ? HDA_AMP_MUTE : 0;
ef8ef5fb 1524 /* Toggle internal speakers muting */
a9fd4f3f
TI
1525 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1526 nid = spec->autocfg.speaker_pins[i];
1527 if (!nid)
1528 break;
1529 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1530 HDA_AMP_MUTE, mute);
1531 }
ef8ef5fb
VP
1532}
1533
a9fd4f3f
TI
1534static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1535 unsigned int res)
ef8ef5fb 1536{
a9fd4f3f
TI
1537 if (codec->vendor_id == 0x10ec0880)
1538 res >>= 28;
1539 else
1540 res >>= 26;
1541 if (res == ALC880_HP_EVENT)
1542 alc_automute_amp(codec);
ef8ef5fb
VP
1543}
1544
4f5d1706 1545static void alc889_automute_setup(struct hda_codec *codec)
6732bd0d
WF
1546{
1547 struct alc_spec *spec = codec->spec;
1548
1549 spec->autocfg.hp_pins[0] = 0x15;
1550 spec->autocfg.speaker_pins[0] = 0x14;
1551 spec->autocfg.speaker_pins[1] = 0x16;
1552 spec->autocfg.speaker_pins[2] = 0x17;
1553 spec->autocfg.speaker_pins[3] = 0x19;
1554 spec->autocfg.speaker_pins[4] = 0x1a;
6732bd0d
WF
1555}
1556
1557static void alc889_intel_init_hook(struct hda_codec *codec)
1558{
1559 alc889_coef_init(codec);
4f5d1706 1560 alc_automute_amp(codec);
6732bd0d
WF
1561}
1562
4f5d1706 1563static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
a9fd4f3f
TI
1564{
1565 struct alc_spec *spec = codec->spec;
1566
1567 spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1568 spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1569 spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1570 spec->autocfg.speaker_pins[1] = 0x15; /* bass */
a9fd4f3f 1571}
ef8ef5fb 1572
5b2d1eca
VP
1573/*
1574 * ALC888 Acer Aspire 4930G model
1575 */
1576
1577static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1578/* Front Mic: set to PIN_IN (empty by default) */
1579 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1580/* Unselect Front Mic by default in input mixer 3 */
1581 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
ef8ef5fb 1582/* Enable unsolicited event for HP jack */
5b2d1eca
VP
1583 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1584/* Connect Internal HP to front */
1585 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1586 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1587 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1588/* Connect HP out to front */
1589 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1590 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1591 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1592 { }
1593};
1594
d2fd4b09
TV
1595/*
1596 * ALC888 Acer Aspire 6530G model
1597 */
1598
1599static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
1600/* Bias voltage on for external mic port */
1601 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
320d5920
EL
1602/* Front Mic: set to PIN_IN (empty by default) */
1603 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1604/* Unselect Front Mic by default in input mixer 3 */
1605 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
d2fd4b09
TV
1606/* Enable unsolicited event for HP jack */
1607 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1608/* Enable speaker output */
1609 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1610 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1611/* Enable headphone output */
1612 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1613 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1614 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1615 { }
1616};
1617
3b315d70 1618/*
018df418 1619 * ALC889 Acer Aspire 8930G model
3b315d70
HM
1620 */
1621
018df418 1622static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
3b315d70
HM
1623/* Front Mic: set to PIN_IN (empty by default) */
1624 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1625/* Unselect Front Mic by default in input mixer 3 */
1626 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1627/* Enable unsolicited event for HP jack */
1628 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1629/* Connect Internal Front to Front */
1630 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1631 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1632 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1633/* Connect Internal Rear to Rear */
1634 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1635 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1636 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1637/* Connect Internal CLFE to CLFE */
1638 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1639 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1640 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1641/* Connect HP out to Front */
018df418 1642 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
3b315d70
HM
1643 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1644 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1645/* Enable all DACs */
1646/* DAC DISABLE/MUTE 1? */
1647/* setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1648 {0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1649 {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1650/* DAC DISABLE/MUTE 2? */
1651/* some bit here disables the other DACs. Init=0x4900 */
1652 {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1653 {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1654/* Enable amplifiers */
1655 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
1656 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
018df418
HM
1657/* DMIC fix
1658 * This laptop has a stereo digital microphone. The mics are only 1cm apart
1659 * which makes the stereo useless. However, either the mic or the ALC889
1660 * makes the signal become a difference/sum signal instead of standard
1661 * stereo, which is annoying. So instead we flip this bit which makes the
1662 * codec replicate the sum signal to both channels, turning it into a
1663 * normal mono mic.
1664 */
1665/* DMIC_CONTROL? Init value = 0x0001 */
1666 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
1667 {0x20, AC_VERB_SET_PROC_COEF, 0x0003},
3b315d70
HM
1668 { }
1669};
1670
ef8ef5fb 1671static struct hda_input_mux alc888_2_capture_sources[2] = {
5b2d1eca
VP
1672 /* Front mic only available on one ADC */
1673 {
1674 .num_items = 4,
1675 .items = {
1676 { "Mic", 0x0 },
1677 { "Line", 0x2 },
1678 { "CD", 0x4 },
1679 { "Front Mic", 0xb },
1680 },
1681 },
1682 {
1683 .num_items = 3,
1684 .items = {
1685 { "Mic", 0x0 },
1686 { "Line", 0x2 },
1687 { "CD", 0x4 },
1688 },
1689 }
1690};
1691
d2fd4b09
TV
1692static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
1693 /* Interal mic only available on one ADC */
1694 {
684a8842 1695 .num_items = 5,
d2fd4b09
TV
1696 .items = {
1697 { "Ext Mic", 0x0 },
684a8842 1698 { "Line In", 0x2 },
d2fd4b09 1699 { "CD", 0x4 },
684a8842 1700 { "Input Mix", 0xa },
d2fd4b09
TV
1701 { "Int Mic", 0xb },
1702 },
1703 },
1704 {
684a8842 1705 .num_items = 4,
d2fd4b09
TV
1706 .items = {
1707 { "Ext Mic", 0x0 },
684a8842 1708 { "Line In", 0x2 },
d2fd4b09 1709 { "CD", 0x4 },
684a8842 1710 { "Input Mix", 0xa },
d2fd4b09
TV
1711 },
1712 }
1713};
1714
018df418
HM
1715static struct hda_input_mux alc889_capture_sources[3] = {
1716 /* Digital mic only available on first "ADC" */
1717 {
1718 .num_items = 5,
1719 .items = {
1720 { "Mic", 0x0 },
1721 { "Line", 0x2 },
1722 { "CD", 0x4 },
1723 { "Front Mic", 0xb },
1724 { "Input Mix", 0xa },
1725 },
1726 },
1727 {
1728 .num_items = 4,
1729 .items = {
1730 { "Mic", 0x0 },
1731 { "Line", 0x2 },
1732 { "CD", 0x4 },
1733 { "Input Mix", 0xa },
1734 },
1735 },
1736 {
1737 .num_items = 4,
1738 .items = {
1739 { "Mic", 0x0 },
1740 { "Line", 0x2 },
1741 { "CD", 0x4 },
1742 { "Input Mix", 0xa },
1743 },
1744 }
1745};
1746
ef8ef5fb 1747static struct snd_kcontrol_new alc888_base_mixer[] = {
5b2d1eca
VP
1748 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1749 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1750 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1751 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1752 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1753 HDA_OUTPUT),
1754 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1755 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1756 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1757 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1758 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1759 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1760 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1761 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1762 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1763 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1764 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1765 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
5b2d1eca
VP
1766 { } /* end */
1767};
1768
4f5d1706 1769static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
5b2d1eca 1770{
a9fd4f3f 1771 struct alc_spec *spec = codec->spec;
5b2d1eca 1772
a9fd4f3f
TI
1773 spec->autocfg.hp_pins[0] = 0x15;
1774 spec->autocfg.speaker_pins[0] = 0x14;
5b2d1eca
VP
1775}
1776
4f5d1706 1777static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
320d5920
EL
1778{
1779 struct alc_spec *spec = codec->spec;
1780
1781 spec->autocfg.hp_pins[0] = 0x15;
1782 spec->autocfg.speaker_pins[0] = 0x14;
1783 spec->autocfg.speaker_pins[1] = 0x16;
1784 spec->autocfg.speaker_pins[2] = 0x17;
320d5920
EL
1785}
1786
4f5d1706 1787static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
3b315d70
HM
1788{
1789 struct alc_spec *spec = codec->spec;
1790
1791 spec->autocfg.hp_pins[0] = 0x15;
1792 spec->autocfg.speaker_pins[0] = 0x14;
1793 spec->autocfg.speaker_pins[1] = 0x16;
1794 spec->autocfg.speaker_pins[2] = 0x1b;
3b315d70
HM
1795}
1796
1da177e4 1797/*
e9edcee0
TI
1798 * ALC880 3-stack model
1799 *
1800 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
9c7f852e
TI
1801 * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
1802 * F-Mic = 0x1b, HP = 0x19
1da177e4
LT
1803 */
1804
e9edcee0
TI
1805static hda_nid_t alc880_dac_nids[4] = {
1806 /* front, rear, clfe, rear_surr */
1807 0x02, 0x05, 0x04, 0x03
1808};
1809
1810static hda_nid_t alc880_adc_nids[3] = {
1811 /* ADC0-2 */
1812 0x07, 0x08, 0x09,
1813};
1814
1815/* The datasheet says the node 0x07 is connected from inputs,
1816 * but it shows zero connection in the real implementation on some devices.
df694daa 1817 * Note: this is a 915GAV bug, fixed on 915GLV
1da177e4 1818 */
e9edcee0
TI
1819static hda_nid_t alc880_adc_nids_alt[2] = {
1820 /* ADC1-2 */
1821 0x08, 0x09,
1822};
1823
1824#define ALC880_DIGOUT_NID 0x06
1825#define ALC880_DIGIN_NID 0x0a
1826
1827static struct hda_input_mux alc880_capture_source = {
1828 .num_items = 4,
1829 .items = {
1830 { "Mic", 0x0 },
1831 { "Front Mic", 0x3 },
1832 { "Line", 0x2 },
1833 { "CD", 0x4 },
1834 },
1835};
1836
1837/* channel source setting (2/6 channel selection for 3-stack) */
1838/* 2ch mode */
1839static struct hda_verb alc880_threestack_ch2_init[] = {
1840 /* set line-in to input, mute it */
1841 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1842 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1843 /* set mic-in to input vref 80%, mute it */
1844 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1845 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1846 { } /* end */
1847};
1848
1849/* 6ch mode */
1850static struct hda_verb alc880_threestack_ch6_init[] = {
1851 /* set line-in to output, unmute it */
1852 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1853 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1854 /* set mic-in to output, unmute it */
1855 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1856 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1857 { } /* end */
1858};
1859
d2a6d7dc 1860static struct hda_channel_mode alc880_threestack_modes[2] = {
e9edcee0
TI
1861 { 2, alc880_threestack_ch2_init },
1862 { 6, alc880_threestack_ch6_init },
1863};
1864
c8b6bf9b 1865static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
05acb863 1866 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 1867 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
05acb863 1868 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
985be54b 1869 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
05acb863
TI
1870 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1871 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
985be54b
TI
1872 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1873 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1da177e4
LT
1874 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1875 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1876 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1877 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1878 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1879 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1880 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
1881 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
e9edcee0
TI
1882 HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
1883 {
1884 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1885 .name = "Channel Mode",
df694daa
KY
1886 .info = alc_ch_mode_info,
1887 .get = alc_ch_mode_get,
1888 .put = alc_ch_mode_put,
e9edcee0
TI
1889 },
1890 { } /* end */
1891};
1892
1893/* capture mixer elements */
f9e336f6
TI
1894static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
1895 struct snd_ctl_elem_info *uinfo)
1896{
1897 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1898 struct alc_spec *spec = codec->spec;
1899 int err;
1da177e4 1900
5a9e02e9 1901 mutex_lock(&codec->control_mutex);
f9e336f6
TI
1902 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1903 HDA_INPUT);
1904 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
5a9e02e9 1905 mutex_unlock(&codec->control_mutex);
f9e336f6
TI
1906 return err;
1907}
1908
1909static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
1910 unsigned int size, unsigned int __user *tlv)
1911{
1912 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1913 struct alc_spec *spec = codec->spec;
1914 int err;
1da177e4 1915
5a9e02e9 1916 mutex_lock(&codec->control_mutex);
f9e336f6
TI
1917 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1918 HDA_INPUT);
1919 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
5a9e02e9 1920 mutex_unlock(&codec->control_mutex);
f9e336f6
TI
1921 return err;
1922}
1923
1924typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
1925 struct snd_ctl_elem_value *ucontrol);
1926
1927static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
1928 struct snd_ctl_elem_value *ucontrol,
1929 getput_call_t func)
1930{
1931 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1932 struct alc_spec *spec = codec->spec;
1933 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1934 int err;
1935
5a9e02e9 1936 mutex_lock(&codec->control_mutex);
f9e336f6
TI
1937 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
1938 3, 0, HDA_INPUT);
1939 err = func(kcontrol, ucontrol);
5a9e02e9 1940 mutex_unlock(&codec->control_mutex);
f9e336f6
TI
1941 return err;
1942}
1943
1944static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
1945 struct snd_ctl_elem_value *ucontrol)
1946{
1947 return alc_cap_getput_caller(kcontrol, ucontrol,
1948 snd_hda_mixer_amp_volume_get);
1949}
1950
1951static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
1952 struct snd_ctl_elem_value *ucontrol)
1953{
1954 return alc_cap_getput_caller(kcontrol, ucontrol,
1955 snd_hda_mixer_amp_volume_put);
1956}
1957
1958/* capture mixer elements */
1959#define alc_cap_sw_info snd_ctl_boolean_stereo_info
1960
1961static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
1962 struct snd_ctl_elem_value *ucontrol)
1963{
1964 return alc_cap_getput_caller(kcontrol, ucontrol,
1965 snd_hda_mixer_amp_switch_get);
1966}
1967
1968static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
1969 struct snd_ctl_elem_value *ucontrol)
1970{
1971 return alc_cap_getput_caller(kcontrol, ucontrol,
1972 snd_hda_mixer_amp_switch_put);
1973}
1974
a23b688f 1975#define _DEFINE_CAPMIX(num) \
f9e336f6
TI
1976 { \
1977 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1978 .name = "Capture Switch", \
1979 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
1980 .count = num, \
1981 .info = alc_cap_sw_info, \
1982 .get = alc_cap_sw_get, \
1983 .put = alc_cap_sw_put, \
1984 }, \
1985 { \
1986 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1987 .name = "Capture Volume", \
1988 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
1989 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
1990 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
1991 .count = num, \
1992 .info = alc_cap_vol_info, \
1993 .get = alc_cap_vol_get, \
1994 .put = alc_cap_vol_put, \
1995 .tlv = { .c = alc_cap_vol_tlv }, \
a23b688f
TI
1996 }
1997
1998#define _DEFINE_CAPSRC(num) \
3c3e9892
TI
1999 { \
2000 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2001 /* .name = "Capture Source", */ \
2002 .name = "Input Source", \
2003 .count = num, \
2004 .info = alc_mux_enum_info, \
2005 .get = alc_mux_enum_get, \
2006 .put = alc_mux_enum_put, \
a23b688f
TI
2007 }
2008
2009#define DEFINE_CAPMIX(num) \
2010static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2011 _DEFINE_CAPMIX(num), \
2012 _DEFINE_CAPSRC(num), \
2013 { } /* end */ \
2014}
2015
2016#define DEFINE_CAPMIX_NOSRC(num) \
2017static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2018 _DEFINE_CAPMIX(num), \
2019 { } /* end */ \
f9e336f6
TI
2020}
2021
2022/* up to three ADCs */
2023DEFINE_CAPMIX(1);
2024DEFINE_CAPMIX(2);
2025DEFINE_CAPMIX(3);
a23b688f
TI
2026DEFINE_CAPMIX_NOSRC(1);
2027DEFINE_CAPMIX_NOSRC(2);
2028DEFINE_CAPMIX_NOSRC(3);
e9edcee0
TI
2029
2030/*
2031 * ALC880 5-stack model
2032 *
9c7f852e
TI
2033 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2034 * Side = 0x02 (0xd)
e9edcee0
TI
2035 * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2036 * Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2037 */
2038
2039/* additional mixers to alc880_three_stack_mixer */
c8b6bf9b 2040static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
e9edcee0 2041 HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 2042 HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
1da177e4
LT
2043 { } /* end */
2044};
2045
e9edcee0
TI
2046/* channel source setting (6/8 channel selection for 5-stack) */
2047/* 6ch mode */
2048static struct hda_verb alc880_fivestack_ch6_init[] = {
2049 /* set line-in to input, mute it */
2050 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2051 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
dfc0ff62
TI
2052 { } /* end */
2053};
2054
e9edcee0
TI
2055/* 8ch mode */
2056static struct hda_verb alc880_fivestack_ch8_init[] = {
2057 /* set line-in to output, unmute it */
2058 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2059 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2060 { } /* end */
2061};
2062
d2a6d7dc 2063static struct hda_channel_mode alc880_fivestack_modes[2] = {
e9edcee0
TI
2064 { 6, alc880_fivestack_ch6_init },
2065 { 8, alc880_fivestack_ch8_init },
2066};
2067
2068
2069/*
2070 * ALC880 6-stack model
2071 *
9c7f852e
TI
2072 * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2073 * Side = 0x05 (0x0f)
e9edcee0
TI
2074 * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2075 * Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2076 */
2077
2078static hda_nid_t alc880_6st_dac_nids[4] = {
2079 /* front, rear, clfe, rear_surr */
2080 0x02, 0x03, 0x04, 0x05
f12ab1e0 2081};
e9edcee0
TI
2082
2083static struct hda_input_mux alc880_6stack_capture_source = {
2084 .num_items = 4,
2085 .items = {
2086 { "Mic", 0x0 },
2087 { "Front Mic", 0x1 },
2088 { "Line", 0x2 },
2089 { "CD", 0x4 },
2090 },
2091};
2092
2093/* fixed 8-channels */
d2a6d7dc 2094static struct hda_channel_mode alc880_sixstack_modes[1] = {
e9edcee0
TI
2095 { 8, NULL },
2096};
2097
c8b6bf9b 2098static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
16ded525 2099 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2100 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16ded525 2101 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 2102 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
16ded525
TI
2103 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2104 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
985be54b
TI
2105 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2106 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
16ded525 2107 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
985be54b 2108 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
16ded525
TI
2109 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2110 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2111 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2112 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2113 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2114 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2115 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2116 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16ded525
TI
2117 {
2118 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2119 .name = "Channel Mode",
df694daa
KY
2120 .info = alc_ch_mode_info,
2121 .get = alc_ch_mode_get,
2122 .put = alc_ch_mode_put,
16ded525
TI
2123 },
2124 { } /* end */
2125};
2126
e9edcee0
TI
2127
2128/*
2129 * ALC880 W810 model
2130 *
2131 * W810 has rear IO for:
2132 * Front (DAC 02)
2133 * Surround (DAC 03)
2134 * Center/LFE (DAC 04)
2135 * Digital out (06)
2136 *
2137 * The system also has a pair of internal speakers, and a headphone jack.
2138 * These are both connected to Line2 on the codec, hence to DAC 02.
ea1fb29a 2139 *
e9edcee0
TI
2140 * There is a variable resistor to control the speaker or headphone
2141 * volume. This is a hardware-only device without a software API.
2142 *
2143 * Plugging headphones in will disable the internal speakers. This is
2144 * implemented in hardware, not via the driver using jack sense. In
2145 * a similar fashion, plugging into the rear socket marked "front" will
2146 * disable both the speakers and headphones.
2147 *
2148 * For input, there's a microphone jack, and an "audio in" jack.
2149 * These may not do anything useful with this driver yet, because I
2150 * haven't setup any initialization verbs for these yet...
2151 */
2152
2153static hda_nid_t alc880_w810_dac_nids[3] = {
2154 /* front, rear/surround, clfe */
2155 0x02, 0x03, 0x04
16ded525
TI
2156};
2157
e9edcee0 2158/* fixed 6 channels */
d2a6d7dc 2159static struct hda_channel_mode alc880_w810_modes[1] = {
e9edcee0
TI
2160 { 6, NULL }
2161};
2162
2163/* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
c8b6bf9b 2164static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
16ded525 2165 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2166 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16ded525 2167 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 2168 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
16ded525
TI
2169 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2170 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
985be54b
TI
2171 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2172 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
e9edcee0
TI
2173 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2174 { } /* end */
2175};
2176
2177
2178/*
2179 * Z710V model
2180 *
2181 * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
9c7f852e
TI
2182 * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2183 * Line = 0x1a
e9edcee0
TI
2184 */
2185
2186static hda_nid_t alc880_z71v_dac_nids[1] = {
2187 0x02
2188};
2189#define ALC880_Z71V_HP_DAC 0x03
2190
2191/* fixed 2 channels */
d2a6d7dc 2192static struct hda_channel_mode alc880_2_jack_modes[1] = {
e9edcee0
TI
2193 { 2, NULL }
2194};
2195
c8b6bf9b 2196static struct snd_kcontrol_new alc880_z71v_mixer[] = {
e9edcee0 2197 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2198 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
e9edcee0 2199 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 2200 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
16ded525
TI
2201 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2202 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16ded525
TI
2203 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2204 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16ded525
TI
2205 { } /* end */
2206};
2207
e9edcee0 2208
e9edcee0
TI
2209/*
2210 * ALC880 F1734 model
2211 *
2212 * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2213 * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2214 */
2215
2216static hda_nid_t alc880_f1734_dac_nids[1] = {
2217 0x03
2218};
2219#define ALC880_F1734_HP_DAC 0x02
2220
c8b6bf9b 2221static struct snd_kcontrol_new alc880_f1734_mixer[] = {
e9edcee0 2222 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2223 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2134ea4f
TI
2224 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2225 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
e9edcee0
TI
2226 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2227 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
937b4160
TI
2228 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2229 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
e9edcee0
TI
2230 { } /* end */
2231};
2232
937b4160
TI
2233static struct hda_input_mux alc880_f1734_capture_source = {
2234 .num_items = 2,
2235 .items = {
2236 { "Mic", 0x1 },
2237 { "CD", 0x4 },
2238 },
2239};
2240
e9edcee0 2241
e9edcee0
TI
2242/*
2243 * ALC880 ASUS model
2244 *
2245 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2246 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2247 * Mic = 0x18, Line = 0x1a
2248 */
2249
2250#define alc880_asus_dac_nids alc880_w810_dac_nids /* identical with w810 */
2251#define alc880_asus_modes alc880_threestack_modes /* 2/6 channel mode */
2252
c8b6bf9b 2253static struct snd_kcontrol_new alc880_asus_mixer[] = {
16ded525 2254 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2255 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16ded525 2256 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 2257 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
16ded525
TI
2258 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2259 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
985be54b
TI
2260 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2261 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
16ded525
TI
2262 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2263 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2264 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2265 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16ded525
TI
2266 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2267 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16ded525
TI
2268 {
2269 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2270 .name = "Channel Mode",
df694daa
KY
2271 .info = alc_ch_mode_info,
2272 .get = alc_ch_mode_get,
2273 .put = alc_ch_mode_put,
16ded525
TI
2274 },
2275 { } /* end */
2276};
e9edcee0 2277
e9edcee0
TI
2278/*
2279 * ALC880 ASUS W1V model
2280 *
2281 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2282 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2283 * Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2284 */
2285
2286/* additional mixers to alc880_asus_mixer */
c8b6bf9b 2287static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
e9edcee0
TI
2288 HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2289 HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2290 { } /* end */
2291};
2292
df694daa
KY
2293/* TCL S700 */
2294static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2295 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2296 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2297 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2298 HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
2299 HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
2300 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2301 HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2302 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2303 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
df694daa
KY
2304 { } /* end */
2305};
2306
ccc656ce
KY
2307/* Uniwill */
2308static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2134ea4f
TI
2309 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2310 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2311 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2312 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
ccc656ce
KY
2313 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2314 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2315 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2316 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2317 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2318 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2319 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2320 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2321 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2322 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2323 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2324 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
ccc656ce
KY
2325 {
2326 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2327 .name = "Channel Mode",
2328 .info = alc_ch_mode_info,
2329 .get = alc_ch_mode_get,
2330 .put = alc_ch_mode_put,
2331 },
2332 { } /* end */
2333};
2334
2cf9f0fc
TD
2335static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2336 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2337 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2338 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2339 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2340 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2341 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2342 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2343 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2344 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2345 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2346 { } /* end */
2347};
2348
ccc656ce 2349static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2134ea4f
TI
2350 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2351 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2352 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2353 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
ccc656ce
KY
2354 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2355 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2356 { } /* end */
2357};
2358
2134ea4f
TI
2359/*
2360 * virtual master controls
2361 */
2362
2363/*
2364 * slave controls for virtual master
2365 */
2366static const char *alc_slave_vols[] = {
2367 "Front Playback Volume",
2368 "Surround Playback Volume",
2369 "Center Playback Volume",
2370 "LFE Playback Volume",
2371 "Side Playback Volume",
2372 "Headphone Playback Volume",
2373 "Speaker Playback Volume",
2374 "Mono Playback Volume",
2134ea4f 2375 "Line-Out Playback Volume",
26f5df26 2376 "PCM Playback Volume",
2134ea4f
TI
2377 NULL,
2378};
2379
2380static const char *alc_slave_sws[] = {
2381 "Front Playback Switch",
2382 "Surround Playback Switch",
2383 "Center Playback Switch",
2384 "LFE Playback Switch",
2385 "Side Playback Switch",
2386 "Headphone Playback Switch",
2387 "Speaker Playback Switch",
2388 "Mono Playback Switch",
edb54a55 2389 "IEC958 Playback Switch",
2134ea4f
TI
2390 NULL,
2391};
2392
1da177e4 2393/*
e9edcee0 2394 * build control elements
1da177e4 2395 */
603c4019
TI
2396
2397static void alc_free_kctls(struct hda_codec *codec);
2398
67d634c0 2399#ifdef CONFIG_SND_HDA_INPUT_BEEP
45bdd1c1
TI
2400/* additional beep mixers; the actual parameters are overwritten at build */
2401static struct snd_kcontrol_new alc_beep_mixer[] = {
2402 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
123c07ae 2403 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
45bdd1c1
TI
2404 { } /* end */
2405};
67d634c0 2406#endif
45bdd1c1 2407
1da177e4
LT
2408static int alc_build_controls(struct hda_codec *codec)
2409{
2410 struct alc_spec *spec = codec->spec;
2411 int err;
2412 int i;
2413
2414 for (i = 0; i < spec->num_mixers; i++) {
2415 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2416 if (err < 0)
2417 return err;
2418 }
f9e336f6
TI
2419 if (spec->cap_mixer) {
2420 err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2421 if (err < 0)
2422 return err;
2423 }
1da177e4 2424 if (spec->multiout.dig_out_nid) {
9c7f852e
TI
2425 err = snd_hda_create_spdif_out_ctls(codec,
2426 spec->multiout.dig_out_nid);
1da177e4
LT
2427 if (err < 0)
2428 return err;
e64f14f4
TI
2429 if (!spec->no_analog) {
2430 err = snd_hda_create_spdif_share_sw(codec,
2431 &spec->multiout);
2432 if (err < 0)
2433 return err;
2434 spec->multiout.share_spdif = 1;
2435 }
1da177e4
LT
2436 }
2437 if (spec->dig_in_nid) {
2438 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2439 if (err < 0)
2440 return err;
2441 }
2134ea4f 2442
67d634c0 2443#ifdef CONFIG_SND_HDA_INPUT_BEEP
45bdd1c1
TI
2444 /* create beep controls if needed */
2445 if (spec->beep_amp) {
2446 struct snd_kcontrol_new *knew;
2447 for (knew = alc_beep_mixer; knew->name; knew++) {
2448 struct snd_kcontrol *kctl;
2449 kctl = snd_ctl_new1(knew, codec);
2450 if (!kctl)
2451 return -ENOMEM;
2452 kctl->private_value = spec->beep_amp;
3911a4c1
JK
2453 err = snd_hda_ctl_add(codec,
2454 get_amp_nid_(spec->beep_amp), kctl);
45bdd1c1
TI
2455 if (err < 0)
2456 return err;
2457 }
2458 }
67d634c0 2459#endif
45bdd1c1 2460
2134ea4f 2461 /* if we have no master control, let's create it */
e64f14f4
TI
2462 if (!spec->no_analog &&
2463 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
1c82ed1b 2464 unsigned int vmaster_tlv[4];
2134ea4f 2465 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
1c82ed1b 2466 HDA_OUTPUT, vmaster_tlv);
2134ea4f 2467 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
1c82ed1b 2468 vmaster_tlv, alc_slave_vols);
2134ea4f
TI
2469 if (err < 0)
2470 return err;
2471 }
e64f14f4
TI
2472 if (!spec->no_analog &&
2473 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2134ea4f
TI
2474 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2475 NULL, alc_slave_sws);
2476 if (err < 0)
2477 return err;
2478 }
2479
603c4019 2480 alc_free_kctls(codec); /* no longer needed */
1da177e4
LT
2481 return 0;
2482}
2483
e9edcee0 2484
1da177e4
LT
2485/*
2486 * initialize the codec volumes, etc
2487 */
2488
e9edcee0
TI
2489/*
2490 * generic initialization of ADC, input mixers and output mixers
2491 */
2492static struct hda_verb alc880_volume_init_verbs[] = {
2493 /*
2494 * Unmute ADC0-2 and set the default input to mic-in
2495 */
71fe7b82 2496 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
e9edcee0 2497 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
71fe7b82 2498 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
e9edcee0 2499 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
71fe7b82 2500 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
e9edcee0 2501 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1da177e4 2502
e9edcee0
TI
2503 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2504 * mixer widget
9c7f852e
TI
2505 * Note: PASD motherboards uses the Line In 2 as the input for front
2506 * panel mic (mic 2)
1da177e4 2507 */
e9edcee0 2508 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
2509 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2510 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2511 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2512 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2513 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2514 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2515 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
1da177e4 2516
e9edcee0
TI
2517 /*
2518 * Set up output mixers (0x0c - 0x0f)
1da177e4 2519 */
e9edcee0
TI
2520 /* set vol=0 to output mixers */
2521 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2522 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2523 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2524 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2525 /* set up input amps for analog loopback */
2526 /* Amp Indices: DAC = 0, mixer = 1 */
05acb863
TI
2527 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2528 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
05acb863
TI
2529 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2530 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
05acb863
TI
2531 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2532 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
05acb863
TI
2533 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2534 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4
LT
2535
2536 { }
2537};
2538
e9edcee0
TI
2539/*
2540 * 3-stack pin configuration:
2541 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2542 */
2543static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2544 /*
2545 * preset connection lists of input pins
2546 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2547 */
2548 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2549 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2550 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2551
2552 /*
2553 * Set pin mode and muting
2554 */
2555 /* set front pin widgets 0x14 for output */
05acb863 2556 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0
TI
2557 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2558 /* Mic1 (rear panel) pin widget for input and vref at 80% */
2559 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2560 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2561 /* Mic2 (as headphone out) for HP output */
2562 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2563 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 2564 /* Line In pin widget for input */
05acb863 2565 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
e9edcee0
TI
2566 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2567 /* Line2 (as front mic) pin widget for input and vref at 80% */
2568 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2569 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1da177e4 2570 /* CD pin widget for input */
05acb863 2571 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1da177e4 2572
e9edcee0
TI
2573 { }
2574};
1da177e4 2575
e9edcee0
TI
2576/*
2577 * 5-stack pin configuration:
2578 * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
2579 * line-in/side = 0x1a, f-mic = 0x1b
2580 */
2581static struct hda_verb alc880_pin_5stack_init_verbs[] = {
2582 /*
2583 * preset connection lists of input pins
2584 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
1da177e4 2585 */
e9edcee0
TI
2586 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2587 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
1da177e4 2588
e9edcee0
TI
2589 /*
2590 * Set pin mode and muting
1da177e4 2591 */
e9edcee0
TI
2592 /* set pin widgets 0x14-0x17 for output */
2593 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2594 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2595 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2596 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2597 /* unmute pins for output (no gain on this amp) */
2598 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2599 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2600 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2601 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2602
2603 /* Mic1 (rear panel) pin widget for input and vref at 80% */
2604 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2605 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2606 /* Mic2 (as headphone out) for HP output */
2607 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2608 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2609 /* Line In pin widget for input */
2610 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2611 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2612 /* Line2 (as front mic) pin widget for input and vref at 80% */
2613 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2614 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2615 /* CD pin widget for input */
2616 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1da177e4
LT
2617
2618 { }
2619};
2620
e9edcee0
TI
2621/*
2622 * W810 pin configuration:
2623 * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
2624 */
2625static struct hda_verb alc880_pin_w810_init_verbs[] = {
2626 /* hphone/speaker input selector: front DAC */
2627 {0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
1da177e4 2628
05acb863 2629 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2630 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
05acb863 2631 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2632 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
05acb863 2633 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2634 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 2635
e9edcee0 2636 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
05acb863 2637 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1da177e4 2638
1da177e4
LT
2639 { }
2640};
2641
e9edcee0
TI
2642/*
2643 * Z71V pin configuration:
2644 * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
2645 */
2646static struct hda_verb alc880_pin_z71v_init_verbs[] = {
05acb863 2647 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2648 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
05acb863 2649 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
e9edcee0 2650 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
dfc0ff62 2651
16ded525 2652 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0 2653 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16ded525 2654 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0 2655 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16ded525
TI
2656
2657 { }
2658};
2659
e9edcee0
TI
2660/*
2661 * 6-stack pin configuration:
9c7f852e
TI
2662 * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
2663 * f-mic = 0x19, line = 0x1a, HP = 0x1b
e9edcee0
TI
2664 */
2665static struct hda_verb alc880_pin_6stack_init_verbs[] = {
2666 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2667
16ded525 2668 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2669 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2670 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2671 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2672 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2673 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2674 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0
TI
2675 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2676
16ded525 2677 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0 2678 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16ded525 2679 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0 2680 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16ded525 2681 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
e9edcee0 2682 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16ded525 2683 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
e9edcee0 2684 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2685 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
ea1fb29a 2686
e9edcee0
TI
2687 { }
2688};
2689
ccc656ce
KY
2690/*
2691 * Uniwill pin configuration:
2692 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
2693 * line = 0x1a
2694 */
2695static struct hda_verb alc880_uniwill_init_verbs[] = {
2696 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2697
2698 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2699 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2700 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2701 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2702 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2703 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2704 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2705 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2706 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2707 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2708 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2709 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2710 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2711 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2712
2713 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2714 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2715 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2716 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2717 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2718 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2719 /* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
2720 /* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
2721 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2722
2723 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2724 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
2725
2726 { }
2727};
2728
2729/*
2730* Uniwill P53
ea1fb29a 2731* HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
ccc656ce
KY
2732 */
2733static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
2734 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2735
2736 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2737 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2738 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2739 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2740 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2741 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2742 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2743 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2744 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2745 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2746 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2747 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2748
2749 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2750 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2751 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2752 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2753 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2754 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2755
2756 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2757 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
2758
2759 { }
2760};
2761
2cf9f0fc
TD
2762static struct hda_verb alc880_beep_init_verbs[] = {
2763 { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
2764 { }
2765};
2766
458a4fab
TI
2767/* auto-toggle front mic */
2768static void alc880_uniwill_mic_automute(struct hda_codec *codec)
2769{
2770 unsigned int present;
2771 unsigned char bits;
ccc656ce 2772
864f92be 2773 present = snd_hda_jack_detect(codec, 0x18);
47fd830a
TI
2774 bits = present ? HDA_AMP_MUTE : 0;
2775 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
458a4fab
TI
2776}
2777
4f5d1706 2778static void alc880_uniwill_setup(struct hda_codec *codec)
458a4fab 2779{
a9fd4f3f
TI
2780 struct alc_spec *spec = codec->spec;
2781
2782 spec->autocfg.hp_pins[0] = 0x14;
2783 spec->autocfg.speaker_pins[0] = 0x15;
2784 spec->autocfg.speaker_pins[0] = 0x16;
4f5d1706
TI
2785}
2786
2787static void alc880_uniwill_init_hook(struct hda_codec *codec)
2788{
a9fd4f3f 2789 alc_automute_amp(codec);
458a4fab 2790 alc880_uniwill_mic_automute(codec);
ccc656ce
KY
2791}
2792
2793static void alc880_uniwill_unsol_event(struct hda_codec *codec,
2794 unsigned int res)
2795{
2796 /* Looks like the unsol event is incompatible with the standard
2797 * definition. 4bit tag is placed at 28 bit!
2798 */
458a4fab 2799 switch (res >> 28) {
458a4fab
TI
2800 case ALC880_MIC_EVENT:
2801 alc880_uniwill_mic_automute(codec);
2802 break;
a9fd4f3f
TI
2803 default:
2804 alc_automute_amp_unsol_event(codec, res);
2805 break;
458a4fab 2806 }
ccc656ce
KY
2807}
2808
4f5d1706 2809static void alc880_uniwill_p53_setup(struct hda_codec *codec)
ccc656ce 2810{
a9fd4f3f 2811 struct alc_spec *spec = codec->spec;
ccc656ce 2812
a9fd4f3f
TI
2813 spec->autocfg.hp_pins[0] = 0x14;
2814 spec->autocfg.speaker_pins[0] = 0x15;
ccc656ce
KY
2815}
2816
2817static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
2818{
2819 unsigned int present;
ea1fb29a 2820
ccc656ce 2821 present = snd_hda_codec_read(codec, 0x21, 0,
47fd830a
TI
2822 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
2823 present &= HDA_AMP_VOLMASK;
2824 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
2825 HDA_AMP_VOLMASK, present);
2826 snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
2827 HDA_AMP_VOLMASK, present);
ccc656ce 2828}
47fd830a 2829
ccc656ce
KY
2830static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
2831 unsigned int res)
2832{
2833 /* Looks like the unsol event is incompatible with the standard
2834 * definition. 4bit tag is placed at 28 bit!
2835 */
f12ab1e0 2836 if ((res >> 28) == ALC880_DCVOL_EVENT)
ccc656ce 2837 alc880_uniwill_p53_dcvol_automute(codec);
a9fd4f3f
TI
2838 else
2839 alc_automute_amp_unsol_event(codec, res);
ccc656ce
KY
2840}
2841
e9edcee0
TI
2842/*
2843 * F1734 pin configuration:
2844 * HP = 0x14, speaker-out = 0x15, mic = 0x18
2845 */
2846static struct hda_verb alc880_pin_f1734_init_verbs[] = {
ee7a9c7c 2847 {0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
16ded525
TI
2848 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
2849 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
2850 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
2851 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
2852
e9edcee0 2853 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16ded525 2854 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
e9edcee0 2855 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16ded525 2856 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2857
e9edcee0
TI
2858 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2859 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
ee7a9c7c 2860 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
e9edcee0 2861 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16ded525 2862 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2863 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2864 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2865 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2866 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
dfc0ff62 2867
937b4160
TI
2868 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
2869 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
2870
dfc0ff62
TI
2871 { }
2872};
2873
e9edcee0
TI
2874/*
2875 * ASUS pin configuration:
2876 * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
2877 */
2878static struct hda_verb alc880_pin_asus_init_verbs[] = {
16ded525
TI
2879 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
2880 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
2881 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
2882 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
2883
2884 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
e9edcee0 2885 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2886 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2887 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2888 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2889 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2890 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0
TI
2891 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2892
2893 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2894 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2895 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2896 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2897 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2898 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16ded525 2899 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2900 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2901 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
ea1fb29a 2902
e9edcee0
TI
2903 { }
2904};
16ded525 2905
e9edcee0 2906/* Enable GPIO mask and set output */
bc9f98a9
KY
2907#define alc880_gpio1_init_verbs alc_gpio1_init_verbs
2908#define alc880_gpio2_init_verbs alc_gpio2_init_verbs
64a8be74 2909#define alc880_gpio3_init_verbs alc_gpio3_init_verbs
df694daa
KY
2910
2911/* Clevo m520g init */
2912static struct hda_verb alc880_pin_clevo_init_verbs[] = {
2913 /* headphone output */
2914 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
2915 /* line-out */
2916 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2917 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2918 /* Line-in */
2919 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2920 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2921 /* CD */
2922 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2923 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2924 /* Mic1 (rear panel) */
2925 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2926 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2927 /* Mic2 (front panel) */
2928 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2929 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2930 /* headphone */
2931 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2932 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2933 /* change to EAPD mode */
2934 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
2935 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
2936
2937 { }
16ded525
TI
2938};
2939
df694daa 2940static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
4b146cb0
TI
2941 /* change to EAPD mode */
2942 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
2943 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
2944
df694daa
KY
2945 /* Headphone output */
2946 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2947 /* Front output*/
2948 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2949 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
2950
2951 /* Line In pin widget for input */
2952 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2953 /* CD pin widget for input */
2954 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2955 /* Mic1 (rear panel) pin widget for input and vref at 80% */
2956 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2957
2958 /* change to EAPD mode */
2959 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
2960 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
2961
2962 { }
2963};
16ded525 2964
e9edcee0 2965/*
ae6b813a
TI
2966 * LG m1 express dual
2967 *
2968 * Pin assignment:
2969 * Rear Line-In/Out (blue): 0x14
2970 * Build-in Mic-In: 0x15
2971 * Speaker-out: 0x17
2972 * HP-Out (green): 0x1b
2973 * Mic-In/Out (red): 0x19
2974 * SPDIF-Out: 0x1e
2975 */
2976
2977/* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
2978static hda_nid_t alc880_lg_dac_nids[3] = {
2979 0x05, 0x02, 0x03
2980};
2981
2982/* seems analog CD is not working */
2983static struct hda_input_mux alc880_lg_capture_source = {
2984 .num_items = 3,
2985 .items = {
2986 { "Mic", 0x1 },
2987 { "Line", 0x5 },
2988 { "Internal Mic", 0x6 },
2989 },
2990};
2991
2992/* 2,4,6 channel modes */
2993static struct hda_verb alc880_lg_ch2_init[] = {
2994 /* set line-in and mic-in to input */
2995 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2996 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
2997 { }
2998};
2999
3000static struct hda_verb alc880_lg_ch4_init[] = {
3001 /* set line-in to out and mic-in to input */
3002 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3003 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3004 { }
3005};
3006
3007static struct hda_verb alc880_lg_ch6_init[] = {
3008 /* set line-in and mic-in to output */
3009 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3010 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3011 { }
3012};
3013
3014static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3015 { 2, alc880_lg_ch2_init },
3016 { 4, alc880_lg_ch4_init },
3017 { 6, alc880_lg_ch6_init },
3018};
3019
3020static struct snd_kcontrol_new alc880_lg_mixer[] = {
2134ea4f
TI
3021 HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3022 HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
ae6b813a
TI
3023 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3024 HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3025 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3026 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3027 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3028 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3029 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3030 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3031 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3032 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3033 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3034 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3035 {
3036 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3037 .name = "Channel Mode",
3038 .info = alc_ch_mode_info,
3039 .get = alc_ch_mode_get,
3040 .put = alc_ch_mode_put,
3041 },
3042 { } /* end */
3043};
3044
3045static struct hda_verb alc880_lg_init_verbs[] = {
3046 /* set capture source to mic-in */
3047 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3048 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3049 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3050 /* mute all amp mixer inputs */
3051 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
cb53c626
TI
3052 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3053 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
ae6b813a
TI
3054 /* line-in to input */
3055 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3056 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3057 /* built-in mic */
3058 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3059 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3060 /* speaker-out */
3061 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3062 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3063 /* mic-in to input */
3064 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3065 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3066 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3067 /* HP-out */
3068 {0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3069 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3070 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3071 /* jack sense */
a9fd4f3f 3072 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
ae6b813a
TI
3073 { }
3074};
3075
3076/* toggle speaker-output according to the hp-jack state */
4f5d1706 3077static void alc880_lg_setup(struct hda_codec *codec)
ae6b813a 3078{
a9fd4f3f 3079 struct alc_spec *spec = codec->spec;
ae6b813a 3080
a9fd4f3f
TI
3081 spec->autocfg.hp_pins[0] = 0x1b;
3082 spec->autocfg.speaker_pins[0] = 0x17;
ae6b813a
TI
3083}
3084
d681518a
TI
3085/*
3086 * LG LW20
3087 *
3088 * Pin assignment:
3089 * Speaker-out: 0x14
3090 * Mic-In: 0x18
e4f41da9
CM
3091 * Built-in Mic-In: 0x19
3092 * Line-In: 0x1b
3093 * HP-Out: 0x1a
d681518a
TI
3094 * SPDIF-Out: 0x1e
3095 */
3096
d681518a 3097static struct hda_input_mux alc880_lg_lw_capture_source = {
e4f41da9 3098 .num_items = 3,
d681518a
TI
3099 .items = {
3100 { "Mic", 0x0 },
3101 { "Internal Mic", 0x1 },
e4f41da9 3102 { "Line In", 0x2 },
d681518a
TI
3103 },
3104};
3105
0a8c5da3
CM
3106#define alc880_lg_lw_modes alc880_threestack_modes
3107
d681518a 3108static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
0a8c5da3
CM
3109 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3110 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3111 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3112 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3113 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3114 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3115 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3116 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3117 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3118 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
d681518a
TI
3119 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3120 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3121 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3122 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
0a8c5da3
CM
3123 {
3124 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3125 .name = "Channel Mode",
3126 .info = alc_ch_mode_info,
3127 .get = alc_ch_mode_get,
3128 .put = alc_ch_mode_put,
3129 },
d681518a
TI
3130 { } /* end */
3131};
3132
3133static struct hda_verb alc880_lg_lw_init_verbs[] = {
0a8c5da3
CM
3134 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3135 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3136 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3137
d681518a
TI
3138 /* set capture source to mic-in */
3139 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3140 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3141 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
cb53c626 3142 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
d681518a
TI
3143 /* speaker-out */
3144 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3145 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3146 /* HP-out */
d681518a
TI
3147 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3148 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3149 /* mic-in to input */
3150 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3151 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3152 /* built-in mic */
3153 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3154 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3155 /* jack sense */
a9fd4f3f 3156 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
d681518a
TI
3157 { }
3158};
3159
3160/* toggle speaker-output according to the hp-jack state */
4f5d1706 3161static void alc880_lg_lw_setup(struct hda_codec *codec)
d681518a 3162{
a9fd4f3f 3163 struct alc_spec *spec = codec->spec;
d681518a 3164
a9fd4f3f
TI
3165 spec->autocfg.hp_pins[0] = 0x1b;
3166 spec->autocfg.speaker_pins[0] = 0x14;
d681518a
TI
3167}
3168
df99cd33
TI
3169static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3170 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3171 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3172 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3173 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3174 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3175 HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3176 { } /* end */
3177};
3178
3179static struct hda_input_mux alc880_medion_rim_capture_source = {
3180 .num_items = 2,
3181 .items = {
3182 { "Mic", 0x0 },
3183 { "Internal Mic", 0x1 },
3184 },
3185};
3186
3187static struct hda_verb alc880_medion_rim_init_verbs[] = {
3188 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3189
3190 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3191 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3192
3193 /* Mic1 (rear panel) pin widget for input and vref at 80% */
3194 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3195 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3196 /* Mic2 (as headphone out) for HP output */
3197 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3198 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3199 /* Internal Speaker */
3200 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3201 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3202
3203 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3204 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
3205
3206 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3207 { }
3208};
3209
3210/* toggle speaker-output according to the hp-jack state */
3211static void alc880_medion_rim_automute(struct hda_codec *codec)
3212{
a9fd4f3f
TI
3213 struct alc_spec *spec = codec->spec;
3214 alc_automute_amp(codec);
3215 /* toggle EAPD */
3216 if (spec->jack_present)
df99cd33
TI
3217 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3218 else
3219 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3220}
3221
3222static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3223 unsigned int res)
3224{
3225 /* Looks like the unsol event is incompatible with the standard
3226 * definition. 4bit tag is placed at 28 bit!
3227 */
3228 if ((res >> 28) == ALC880_HP_EVENT)
3229 alc880_medion_rim_automute(codec);
3230}
3231
4f5d1706 3232static void alc880_medion_rim_setup(struct hda_codec *codec)
a9fd4f3f
TI
3233{
3234 struct alc_spec *spec = codec->spec;
3235
3236 spec->autocfg.hp_pins[0] = 0x14;
3237 spec->autocfg.speaker_pins[0] = 0x1b;
a9fd4f3f
TI
3238}
3239
cb53c626
TI
3240#ifdef CONFIG_SND_HDA_POWER_SAVE
3241static struct hda_amp_list alc880_loopbacks[] = {
3242 { 0x0b, HDA_INPUT, 0 },
3243 { 0x0b, HDA_INPUT, 1 },
3244 { 0x0b, HDA_INPUT, 2 },
3245 { 0x0b, HDA_INPUT, 3 },
3246 { 0x0b, HDA_INPUT, 4 },
3247 { } /* end */
3248};
3249
3250static struct hda_amp_list alc880_lg_loopbacks[] = {
3251 { 0x0b, HDA_INPUT, 1 },
3252 { 0x0b, HDA_INPUT, 6 },
3253 { 0x0b, HDA_INPUT, 7 },
3254 { } /* end */
3255};
3256#endif
3257
ae6b813a
TI
3258/*
3259 * Common callbacks
e9edcee0
TI
3260 */
3261
1da177e4
LT
3262static int alc_init(struct hda_codec *codec)
3263{
3264 struct alc_spec *spec = codec->spec;
e9edcee0
TI
3265 unsigned int i;
3266
2c3bf9ab 3267 alc_fix_pll(codec);
4a79ba34 3268 alc_auto_init_amp(codec, spec->init_amp);
2c3bf9ab 3269
e9edcee0
TI
3270 for (i = 0; i < spec->num_init_verbs; i++)
3271 snd_hda_sequence_write(codec, spec->init_verbs[i]);
ae6b813a
TI
3272
3273 if (spec->init_hook)
3274 spec->init_hook(codec);
3275
1da177e4
LT
3276 return 0;
3277}
3278
ae6b813a
TI
3279static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3280{
3281 struct alc_spec *spec = codec->spec;
3282
3283 if (spec->unsol_event)
3284 spec->unsol_event(codec, res);
3285}
3286
cb53c626
TI
3287#ifdef CONFIG_SND_HDA_POWER_SAVE
3288static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3289{
3290 struct alc_spec *spec = codec->spec;
3291 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3292}
3293#endif
3294
1da177e4
LT
3295/*
3296 * Analog playback callbacks
3297 */
3298static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3299 struct hda_codec *codec,
c8b6bf9b 3300 struct snd_pcm_substream *substream)
1da177e4
LT
3301{
3302 struct alc_spec *spec = codec->spec;
9a08160b
TI
3303 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3304 hinfo);
1da177e4
LT
3305}
3306
3307static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3308 struct hda_codec *codec,
3309 unsigned int stream_tag,
3310 unsigned int format,
c8b6bf9b 3311 struct snd_pcm_substream *substream)
1da177e4
LT
3312{
3313 struct alc_spec *spec = codec->spec;
9c7f852e
TI
3314 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3315 stream_tag, format, substream);
1da177e4
LT
3316}
3317
3318static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3319 struct hda_codec *codec,
c8b6bf9b 3320 struct snd_pcm_substream *substream)
1da177e4
LT
3321{
3322 struct alc_spec *spec = codec->spec;
3323 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3324}
3325
3326/*
3327 * Digital out
3328 */
3329static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3330 struct hda_codec *codec,
c8b6bf9b 3331 struct snd_pcm_substream *substream)
1da177e4
LT
3332{
3333 struct alc_spec *spec = codec->spec;
3334 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3335}
3336
6b97eb45
TI
3337static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3338 struct hda_codec *codec,
3339 unsigned int stream_tag,
3340 unsigned int format,
3341 struct snd_pcm_substream *substream)
3342{
3343 struct alc_spec *spec = codec->spec;
3344 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3345 stream_tag, format, substream);
3346}
3347
9b5f12e5
TI
3348static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3349 struct hda_codec *codec,
3350 struct snd_pcm_substream *substream)
3351{
3352 struct alc_spec *spec = codec->spec;
3353 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3354}
3355
1da177e4
LT
3356static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3357 struct hda_codec *codec,
c8b6bf9b 3358 struct snd_pcm_substream *substream)
1da177e4
LT
3359{
3360 struct alc_spec *spec = codec->spec;
3361 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3362}
3363
3364/*
3365 * Analog capture
3366 */
6330079f 3367static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
1da177e4
LT
3368 struct hda_codec *codec,
3369 unsigned int stream_tag,
3370 unsigned int format,
c8b6bf9b 3371 struct snd_pcm_substream *substream)
1da177e4
LT
3372{
3373 struct alc_spec *spec = codec->spec;
3374
6330079f 3375 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
1da177e4
LT
3376 stream_tag, 0, format);
3377 return 0;
3378}
3379
6330079f 3380static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
1da177e4 3381 struct hda_codec *codec,
c8b6bf9b 3382 struct snd_pcm_substream *substream)
1da177e4
LT
3383{
3384 struct alc_spec *spec = codec->spec;
3385
888afa15
TI
3386 snd_hda_codec_cleanup_stream(codec,
3387 spec->adc_nids[substream->number + 1]);
1da177e4
LT
3388 return 0;
3389}
3390
3391
3392/*
3393 */
3394static struct hda_pcm_stream alc880_pcm_analog_playback = {
3395 .substreams = 1,
3396 .channels_min = 2,
3397 .channels_max = 8,
e9edcee0 3398 /* NID is set in alc_build_pcms */
1da177e4
LT
3399 .ops = {
3400 .open = alc880_playback_pcm_open,
3401 .prepare = alc880_playback_pcm_prepare,
3402 .cleanup = alc880_playback_pcm_cleanup
3403 },
3404};
3405
3406static struct hda_pcm_stream alc880_pcm_analog_capture = {
6330079f
TI
3407 .substreams = 1,
3408 .channels_min = 2,
3409 .channels_max = 2,
3410 /* NID is set in alc_build_pcms */
3411};
3412
3413static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3414 .substreams = 1,
3415 .channels_min = 2,
3416 .channels_max = 2,
3417 /* NID is set in alc_build_pcms */
3418};
3419
3420static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3421 .substreams = 2, /* can be overridden */
1da177e4
LT
3422 .channels_min = 2,
3423 .channels_max = 2,
e9edcee0 3424 /* NID is set in alc_build_pcms */
1da177e4 3425 .ops = {
6330079f
TI
3426 .prepare = alc880_alt_capture_pcm_prepare,
3427 .cleanup = alc880_alt_capture_pcm_cleanup
1da177e4
LT
3428 },
3429};
3430
3431static struct hda_pcm_stream alc880_pcm_digital_playback = {
3432 .substreams = 1,
3433 .channels_min = 2,
3434 .channels_max = 2,
3435 /* NID is set in alc_build_pcms */
3436 .ops = {
3437 .open = alc880_dig_playback_pcm_open,
6b97eb45 3438 .close = alc880_dig_playback_pcm_close,
9b5f12e5
TI
3439 .prepare = alc880_dig_playback_pcm_prepare,
3440 .cleanup = alc880_dig_playback_pcm_cleanup
1da177e4
LT
3441 },
3442};
3443
3444static struct hda_pcm_stream alc880_pcm_digital_capture = {
3445 .substreams = 1,
3446 .channels_min = 2,
3447 .channels_max = 2,
3448 /* NID is set in alc_build_pcms */
3449};
3450
4c5186ed 3451/* Used by alc_build_pcms to flag that a PCM has no playback stream */
6330079f 3452static struct hda_pcm_stream alc_pcm_null_stream = {
4c5186ed
JW
3453 .substreams = 0,
3454 .channels_min = 0,
3455 .channels_max = 0,
3456};
3457
1da177e4
LT
3458static int alc_build_pcms(struct hda_codec *codec)
3459{
3460 struct alc_spec *spec = codec->spec;
3461 struct hda_pcm *info = spec->pcm_rec;
3462 int i;
3463
3464 codec->num_pcms = 1;
3465 codec->pcm_info = info;
3466
e64f14f4
TI
3467 if (spec->no_analog)
3468 goto skip_analog;
3469
812a2cca
TI
3470 snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3471 "%s Analog", codec->chip_name);
1da177e4 3472 info->name = spec->stream_name_analog;
812a2cca 3473
4a471b7d 3474 if (spec->stream_analog_playback) {
da3cec35
TI
3475 if (snd_BUG_ON(!spec->multiout.dac_nids))
3476 return -EINVAL;
4a471b7d
TI
3477 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3478 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3479 }
3480 if (spec->stream_analog_capture) {
da3cec35
TI
3481 if (snd_BUG_ON(!spec->adc_nids))
3482 return -EINVAL;
4a471b7d
TI
3483 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3484 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3485 }
3486
3487 if (spec->channel_mode) {
3488 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3489 for (i = 0; i < spec->num_channel_mode; i++) {
3490 if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3491 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3492 }
1da177e4
LT
3493 }
3494 }
3495
e64f14f4 3496 skip_analog:
e08a007d 3497 /* SPDIF for stream index #1 */
1da177e4 3498 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
812a2cca
TI
3499 snprintf(spec->stream_name_digital,
3500 sizeof(spec->stream_name_digital),
3501 "%s Digital", codec->chip_name);
e08a007d 3502 codec->num_pcms = 2;
b25c9da1 3503 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
c06134d7 3504 info = spec->pcm_rec + 1;
1da177e4 3505 info->name = spec->stream_name_digital;
8c441982
TI
3506 if (spec->dig_out_type)
3507 info->pcm_type = spec->dig_out_type;
3508 else
3509 info->pcm_type = HDA_PCM_TYPE_SPDIF;
4a471b7d
TI
3510 if (spec->multiout.dig_out_nid &&
3511 spec->stream_digital_playback) {
1da177e4
LT
3512 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3513 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3514 }
4a471b7d
TI
3515 if (spec->dig_in_nid &&
3516 spec->stream_digital_capture) {
1da177e4
LT
3517 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3518 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3519 }
963f803f
TI
3520 /* FIXME: do we need this for all Realtek codec models? */
3521 codec->spdif_status_reset = 1;
1da177e4
LT
3522 }
3523
e64f14f4
TI
3524 if (spec->no_analog)
3525 return 0;
3526
e08a007d
TI
3527 /* If the use of more than one ADC is requested for the current
3528 * model, configure a second analog capture-only PCM.
3529 */
3530 /* Additional Analaog capture for index #2 */
6330079f
TI
3531 if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
3532 (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
e08a007d 3533 codec->num_pcms = 3;
c06134d7 3534 info = spec->pcm_rec + 2;
e08a007d 3535 info->name = spec->stream_name_analog;
6330079f
TI
3536 if (spec->alt_dac_nid) {
3537 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3538 *spec->stream_analog_alt_playback;
3539 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3540 spec->alt_dac_nid;
3541 } else {
3542 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3543 alc_pcm_null_stream;
3544 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3545 }
3546 if (spec->num_adc_nids > 1) {
3547 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3548 *spec->stream_analog_alt_capture;
3549 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3550 spec->adc_nids[1];
3551 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3552 spec->num_adc_nids - 1;
3553 } else {
3554 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3555 alc_pcm_null_stream;
3556 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
e08a007d
TI
3557 }
3558 }
3559
1da177e4
LT
3560 return 0;
3561}
3562
603c4019
TI
3563static void alc_free_kctls(struct hda_codec *codec)
3564{
3565 struct alc_spec *spec = codec->spec;
3566
3567 if (spec->kctls.list) {
3568 struct snd_kcontrol_new *kctl = spec->kctls.list;
3569 int i;
3570 for (i = 0; i < spec->kctls.used; i++)
3571 kfree(kctl[i].name);
3572 }
3573 snd_array_free(&spec->kctls);
3574}
3575
1da177e4
LT
3576static void alc_free(struct hda_codec *codec)
3577{
e9edcee0 3578 struct alc_spec *spec = codec->spec;
e9edcee0 3579
f12ab1e0 3580 if (!spec)
e9edcee0
TI
3581 return;
3582
603c4019 3583 alc_free_kctls(codec);
e9edcee0 3584 kfree(spec);
680cd536 3585 snd_hda_detach_beep_device(codec);
1da177e4
LT
3586}
3587
e044c39a 3588#ifdef SND_HDA_NEEDS_RESUME
e044c39a
TI
3589static int alc_resume(struct hda_codec *codec)
3590{
e044c39a
TI
3591 codec->patch_ops.init(codec);
3592 snd_hda_codec_resume_amp(codec);
3593 snd_hda_codec_resume_cache(codec);
3594 return 0;
3595}
e044c39a
TI
3596#endif
3597
1da177e4
LT
3598/*
3599 */
3600static struct hda_codec_ops alc_patch_ops = {
3601 .build_controls = alc_build_controls,
3602 .build_pcms = alc_build_pcms,
3603 .init = alc_init,
3604 .free = alc_free,
ae6b813a 3605 .unsol_event = alc_unsol_event,
e044c39a
TI
3606#ifdef SND_HDA_NEEDS_RESUME
3607 .resume = alc_resume,
3608#endif
cb53c626
TI
3609#ifdef CONFIG_SND_HDA_POWER_SAVE
3610 .check_power_status = alc_check_power_status,
3611#endif
1da177e4
LT
3612};
3613
2fa522be
TI
3614
3615/*
3616 * Test configuration for debugging
3617 *
3618 * Almost all inputs/outputs are enabled. I/O pins can be configured via
3619 * enum controls.
3620 */
3621#ifdef CONFIG_SND_DEBUG
3622static hda_nid_t alc880_test_dac_nids[4] = {
3623 0x02, 0x03, 0x04, 0x05
3624};
3625
3626static struct hda_input_mux alc880_test_capture_source = {
ae6b813a 3627 .num_items = 7,
2fa522be
TI
3628 .items = {
3629 { "In-1", 0x0 },
3630 { "In-2", 0x1 },
3631 { "In-3", 0x2 },
3632 { "In-4", 0x3 },
3633 { "CD", 0x4 },
ae6b813a
TI
3634 { "Front", 0x5 },
3635 { "Surround", 0x6 },
2fa522be
TI
3636 },
3637};
3638
d2a6d7dc 3639static struct hda_channel_mode alc880_test_modes[4] = {
2fa522be 3640 { 2, NULL },
fd2c326d 3641 { 4, NULL },
2fa522be 3642 { 6, NULL },
fd2c326d 3643 { 8, NULL },
2fa522be
TI
3644};
3645
9c7f852e
TI
3646static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
3647 struct snd_ctl_elem_info *uinfo)
2fa522be
TI
3648{
3649 static char *texts[] = {
3650 "N/A", "Line Out", "HP Out",
3651 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
3652 };
3653 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3654 uinfo->count = 1;
3655 uinfo->value.enumerated.items = 8;
3656 if (uinfo->value.enumerated.item >= 8)
3657 uinfo->value.enumerated.item = 7;
3658 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3659 return 0;
3660}
3661
9c7f852e
TI
3662static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
3663 struct snd_ctl_elem_value *ucontrol)
2fa522be
TI
3664{
3665 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3666 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3667 unsigned int pin_ctl, item = 0;
3668
3669 pin_ctl = snd_hda_codec_read(codec, nid, 0,
3670 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3671 if (pin_ctl & AC_PINCTL_OUT_EN) {
3672 if (pin_ctl & AC_PINCTL_HP_EN)
3673 item = 2;
3674 else
3675 item = 1;
3676 } else if (pin_ctl & AC_PINCTL_IN_EN) {
3677 switch (pin_ctl & AC_PINCTL_VREFEN) {
3678 case AC_PINCTL_VREF_HIZ: item = 3; break;
3679 case AC_PINCTL_VREF_50: item = 4; break;
3680 case AC_PINCTL_VREF_GRD: item = 5; break;
3681 case AC_PINCTL_VREF_80: item = 6; break;
3682 case AC_PINCTL_VREF_100: item = 7; break;
3683 }
3684 }
3685 ucontrol->value.enumerated.item[0] = item;
3686 return 0;
3687}
3688
9c7f852e
TI
3689static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
3690 struct snd_ctl_elem_value *ucontrol)
2fa522be
TI
3691{
3692 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3693 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3694 static unsigned int ctls[] = {
3695 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
3696 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
3697 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
3698 AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
3699 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
3700 AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
3701 };
3702 unsigned int old_ctl, new_ctl;
3703
3704 old_ctl = snd_hda_codec_read(codec, nid, 0,
3705 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3706 new_ctl = ctls[ucontrol->value.enumerated.item[0]];
3707 if (old_ctl != new_ctl) {
82beb8fd
TI
3708 int val;
3709 snd_hda_codec_write_cache(codec, nid, 0,
3710 AC_VERB_SET_PIN_WIDGET_CONTROL,
3711 new_ctl);
47fd830a
TI
3712 val = ucontrol->value.enumerated.item[0] >= 3 ?
3713 HDA_AMP_MUTE : 0;
3714 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3715 HDA_AMP_MUTE, val);
2fa522be
TI
3716 return 1;
3717 }
3718 return 0;
3719}
3720
9c7f852e
TI
3721static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
3722 struct snd_ctl_elem_info *uinfo)
2fa522be
TI
3723{
3724 static char *texts[] = {
3725 "Front", "Surround", "CLFE", "Side"
3726 };
3727 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3728 uinfo->count = 1;
3729 uinfo->value.enumerated.items = 4;
3730 if (uinfo->value.enumerated.item >= 4)
3731 uinfo->value.enumerated.item = 3;
3732 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3733 return 0;
3734}
3735
9c7f852e
TI
3736static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
3737 struct snd_ctl_elem_value *ucontrol)
2fa522be
TI
3738{
3739 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3740 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3741 unsigned int sel;
3742
3743 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
3744 ucontrol->value.enumerated.item[0] = sel & 3;
3745 return 0;
3746}
3747
9c7f852e
TI
3748static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
3749 struct snd_ctl_elem_value *ucontrol)
2fa522be
TI
3750{
3751 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3752 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3753 unsigned int sel;
3754
3755 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
3756 if (ucontrol->value.enumerated.item[0] != sel) {
3757 sel = ucontrol->value.enumerated.item[0] & 3;
82beb8fd
TI
3758 snd_hda_codec_write_cache(codec, nid, 0,
3759 AC_VERB_SET_CONNECT_SEL, sel);
2fa522be
TI
3760 return 1;
3761 }
3762 return 0;
3763}
3764
3765#define PIN_CTL_TEST(xname,nid) { \
3766 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3767 .name = xname, \
3768 .info = alc_test_pin_ctl_info, \
3769 .get = alc_test_pin_ctl_get, \
3770 .put = alc_test_pin_ctl_put, \
3771 .private_value = nid \
3772 }
3773
3774#define PIN_SRC_TEST(xname,nid) { \
3775 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3776 .name = xname, \
3777 .info = alc_test_pin_src_info, \
3778 .get = alc_test_pin_src_get, \
3779 .put = alc_test_pin_src_put, \
3780 .private_value = nid \
3781 }
3782
c8b6bf9b 3783static struct snd_kcontrol_new alc880_test_mixer[] = {
05acb863
TI
3784 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3785 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
3786 HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
3787 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
985be54b
TI
3788 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3789 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
3790 HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
3791 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2fa522be
TI
3792 PIN_CTL_TEST("Front Pin Mode", 0x14),
3793 PIN_CTL_TEST("Surround Pin Mode", 0x15),
3794 PIN_CTL_TEST("CLFE Pin Mode", 0x16),
3795 PIN_CTL_TEST("Side Pin Mode", 0x17),
3796 PIN_CTL_TEST("In-1 Pin Mode", 0x18),
3797 PIN_CTL_TEST("In-2 Pin Mode", 0x19),
3798 PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
3799 PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
3800 PIN_SRC_TEST("In-1 Pin Source", 0x18),
3801 PIN_SRC_TEST("In-2 Pin Source", 0x19),
3802 PIN_SRC_TEST("In-3 Pin Source", 0x1a),
3803 PIN_SRC_TEST("In-4 Pin Source", 0x1b),
3804 HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
3805 HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
3806 HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
3807 HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
3808 HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
3809 HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
3810 HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
3811 HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
3812 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
3813 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
2fa522be
TI
3814 {
3815 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3816 .name = "Channel Mode",
df694daa
KY
3817 .info = alc_ch_mode_info,
3818 .get = alc_ch_mode_get,
3819 .put = alc_ch_mode_put,
2fa522be
TI
3820 },
3821 { } /* end */
3822};
3823
3824static struct hda_verb alc880_test_init_verbs[] = {
3825 /* Unmute inputs of 0x0c - 0x0f */
05acb863
TI
3826 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3827 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3828 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3829 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3830 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3831 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3832 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3833 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2fa522be 3834 /* Vol output for 0x0c-0x0f */
05acb863
TI
3835 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3836 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3837 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3838 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2fa522be 3839 /* Set output pins 0x14-0x17 */
05acb863
TI
3840 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3841 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3842 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3843 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2fa522be 3844 /* Unmute output pins 0x14-0x17 */
05acb863
TI
3845 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3846 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3847 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3848 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2fa522be 3849 /* Set input pins 0x18-0x1c */
16ded525
TI
3850 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3851 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
05acb863
TI
3852 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3853 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3854 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2fa522be 3855 /* Mute input pins 0x18-0x1b */
05acb863
TI
3856 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3857 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3858 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3859 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
71fe7b82 3860 /* ADC set up */
05acb863 3861 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
71fe7b82 3862 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
05acb863 3863 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
71fe7b82 3864 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
05acb863 3865 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
71fe7b82 3866 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
05acb863
TI
3867 /* Analog input/passthru */
3868 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3869 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3870 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
3871 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
3872 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2fa522be
TI
3873 { }
3874};
3875#endif
3876
1da177e4
LT
3877/*
3878 */
3879
f5fcc13c
TI
3880static const char *alc880_models[ALC880_MODEL_LAST] = {
3881 [ALC880_3ST] = "3stack",
3882 [ALC880_TCL_S700] = "tcl",
3883 [ALC880_3ST_DIG] = "3stack-digout",
3884 [ALC880_CLEVO] = "clevo",
3885 [ALC880_5ST] = "5stack",
3886 [ALC880_5ST_DIG] = "5stack-digout",
3887 [ALC880_W810] = "w810",
3888 [ALC880_Z71V] = "z71v",
3889 [ALC880_6ST] = "6stack",
3890 [ALC880_6ST_DIG] = "6stack-digout",
3891 [ALC880_ASUS] = "asus",
3892 [ALC880_ASUS_W1V] = "asus-w1v",
3893 [ALC880_ASUS_DIG] = "asus-dig",
3894 [ALC880_ASUS_DIG2] = "asus-dig2",
3895 [ALC880_UNIWILL_DIG] = "uniwill",
2cf9f0fc
TD
3896 [ALC880_UNIWILL_P53] = "uniwill-p53",
3897 [ALC880_FUJITSU] = "fujitsu",
f5fcc13c
TI
3898 [ALC880_F1734] = "F1734",
3899 [ALC880_LG] = "lg",
3900 [ALC880_LG_LW] = "lg-lw",
df99cd33 3901 [ALC880_MEDION_RIM] = "medion",
2fa522be 3902#ifdef CONFIG_SND_DEBUG
f5fcc13c 3903 [ALC880_TEST] = "test",
2fa522be 3904#endif
f5fcc13c
TI
3905 [ALC880_AUTO] = "auto",
3906};
3907
3908static struct snd_pci_quirk alc880_cfg_tbl[] = {
ac3e3741 3909 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
f5fcc13c
TI
3910 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
3911 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
3912 SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
3913 SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
3914 SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
3915 SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
3916 SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
3917 SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
f5fcc13c
TI
3918 SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
3919 SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
f5fcc13c
TI
3920 SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
3921 SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
3922 SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
3923 SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
3924 SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
3925 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
3926 SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
3927 /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
3928 SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
3929 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
186c3117 3930 SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
f5fcc13c
TI
3931 SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
3932 SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
3933 SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
dea0a509 3934 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
f5fcc13c 3935 SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
ac3e3741
TI
3936 SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
3937 SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
f5fcc13c
TI
3938 SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
3939 SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
f5fcc13c
TI
3940 SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
3941 SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
3942 SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
3943 SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
ac3e3741
TI
3944 SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
3945 SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
f5fcc13c 3946 SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
ac3e3741 3947 SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
f5fcc13c 3948 SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
ac3e3741 3949 SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
f5fcc13c
TI
3950 SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
3951 SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
ac3e3741 3952 SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
df99cd33 3953 SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
ac3e3741 3954 SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
f5fcc13c 3955 SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
f5fcc13c 3956 SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
1d11604e 3957 SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
ac3e3741 3958 SND_PCI_QUIRK(0x1734, 0x10ac, "FSC", ALC880_UNIWILL),
2cf9f0fc 3959 SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
ac3e3741 3960 SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
f5fcc13c
TI
3961 SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
3962 SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
f5fcc13c 3963 SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
ac3e3741
TI
3964 SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
3965 SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
3966 SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
3967 SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
f5fcc13c
TI
3968 SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
3969 SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
ac3e3741 3970 SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
f5fcc13c 3971 SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
ac3e3741
TI
3972 SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
3973 SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
f5fcc13c
TI
3974 SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
3975 SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
3976 SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
dea0a509
TI
3977 /* default Intel */
3978 SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
ac3e3741
TI
3979 SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
3980 SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
1da177e4
LT
3981 {}
3982};
3983
16ded525 3984/*
df694daa 3985 * ALC880 codec presets
16ded525 3986 */
16ded525
TI
3987static struct alc_config_preset alc880_presets[] = {
3988 [ALC880_3ST] = {
e9edcee0 3989 .mixers = { alc880_three_stack_mixer },
f12ab1e0
TI
3990 .init_verbs = { alc880_volume_init_verbs,
3991 alc880_pin_3stack_init_verbs },
16ded525 3992 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
16ded525 3993 .dac_nids = alc880_dac_nids,
16ded525
TI
3994 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
3995 .channel_mode = alc880_threestack_modes,
4e195a7b 3996 .need_dac_fix = 1,
16ded525
TI
3997 .input_mux = &alc880_capture_source,
3998 },
3999 [ALC880_3ST_DIG] = {
e9edcee0 4000 .mixers = { alc880_three_stack_mixer },
f12ab1e0
TI
4001 .init_verbs = { alc880_volume_init_verbs,
4002 alc880_pin_3stack_init_verbs },
16ded525 4003 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
16ded525
TI
4004 .dac_nids = alc880_dac_nids,
4005 .dig_out_nid = ALC880_DIGOUT_NID,
16ded525
TI
4006 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4007 .channel_mode = alc880_threestack_modes,
4e195a7b 4008 .need_dac_fix = 1,
16ded525
TI
4009 .input_mux = &alc880_capture_source,
4010 },
df694daa
KY
4011 [ALC880_TCL_S700] = {
4012 .mixers = { alc880_tcl_s700_mixer },
4013 .init_verbs = { alc880_volume_init_verbs,
4014 alc880_pin_tcl_S700_init_verbs,
4015 alc880_gpio2_init_verbs },
4016 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4017 .dac_nids = alc880_dac_nids,
f9e336f6
TI
4018 .adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4019 .num_adc_nids = 1, /* single ADC */
df694daa
KY
4020 .hp_nid = 0x03,
4021 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4022 .channel_mode = alc880_2_jack_modes,
4023 .input_mux = &alc880_capture_source,
4024 },
16ded525 4025 [ALC880_5ST] = {
f12ab1e0
TI
4026 .mixers = { alc880_three_stack_mixer,
4027 alc880_five_stack_mixer},
4028 .init_verbs = { alc880_volume_init_verbs,
4029 alc880_pin_5stack_init_verbs },
16ded525
TI
4030 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4031 .dac_nids = alc880_dac_nids,
16ded525
TI
4032 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4033 .channel_mode = alc880_fivestack_modes,
4034 .input_mux = &alc880_capture_source,
4035 },
4036 [ALC880_5ST_DIG] = {
f12ab1e0
TI
4037 .mixers = { alc880_three_stack_mixer,
4038 alc880_five_stack_mixer },
4039 .init_verbs = { alc880_volume_init_verbs,
4040 alc880_pin_5stack_init_verbs },
16ded525
TI
4041 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4042 .dac_nids = alc880_dac_nids,
4043 .dig_out_nid = ALC880_DIGOUT_NID,
16ded525
TI
4044 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4045 .channel_mode = alc880_fivestack_modes,
4046 .input_mux = &alc880_capture_source,
4047 },
b6482d48
TI
4048 [ALC880_6ST] = {
4049 .mixers = { alc880_six_stack_mixer },
f12ab1e0
TI
4050 .init_verbs = { alc880_volume_init_verbs,
4051 alc880_pin_6stack_init_verbs },
b6482d48
TI
4052 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4053 .dac_nids = alc880_6st_dac_nids,
4054 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4055 .channel_mode = alc880_sixstack_modes,
4056 .input_mux = &alc880_6stack_capture_source,
4057 },
16ded525 4058 [ALC880_6ST_DIG] = {
e9edcee0 4059 .mixers = { alc880_six_stack_mixer },
f12ab1e0
TI
4060 .init_verbs = { alc880_volume_init_verbs,
4061 alc880_pin_6stack_init_verbs },
16ded525
TI
4062 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4063 .dac_nids = alc880_6st_dac_nids,
4064 .dig_out_nid = ALC880_DIGOUT_NID,
16ded525
TI
4065 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4066 .channel_mode = alc880_sixstack_modes,
4067 .input_mux = &alc880_6stack_capture_source,
4068 },
4069 [ALC880_W810] = {
e9edcee0 4070 .mixers = { alc880_w810_base_mixer },
f12ab1e0
TI
4071 .init_verbs = { alc880_volume_init_verbs,
4072 alc880_pin_w810_init_verbs,
b0af0de5 4073 alc880_gpio2_init_verbs },
16ded525
TI
4074 .num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4075 .dac_nids = alc880_w810_dac_nids,
4076 .dig_out_nid = ALC880_DIGOUT_NID,
16ded525
TI
4077 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4078 .channel_mode = alc880_w810_modes,
4079 .input_mux = &alc880_capture_source,
4080 },
4081 [ALC880_Z71V] = {
e9edcee0 4082 .mixers = { alc880_z71v_mixer },
f12ab1e0
TI
4083 .init_verbs = { alc880_volume_init_verbs,
4084 alc880_pin_z71v_init_verbs },
16ded525
TI
4085 .num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4086 .dac_nids = alc880_z71v_dac_nids,
4087 .dig_out_nid = ALC880_DIGOUT_NID,
4088 .hp_nid = 0x03,
e9edcee0
TI
4089 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4090 .channel_mode = alc880_2_jack_modes,
16ded525
TI
4091 .input_mux = &alc880_capture_source,
4092 },
4093 [ALC880_F1734] = {
e9edcee0 4094 .mixers = { alc880_f1734_mixer },
f12ab1e0
TI
4095 .init_verbs = { alc880_volume_init_verbs,
4096 alc880_pin_f1734_init_verbs },
e9edcee0
TI
4097 .num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4098 .dac_nids = alc880_f1734_dac_nids,
4099 .hp_nid = 0x02,
4100 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4101 .channel_mode = alc880_2_jack_modes,
937b4160
TI
4102 .input_mux = &alc880_f1734_capture_source,
4103 .unsol_event = alc880_uniwill_p53_unsol_event,
4f5d1706
TI
4104 .setup = alc880_uniwill_p53_setup,
4105 .init_hook = alc_automute_amp,
16ded525
TI
4106 },
4107 [ALC880_ASUS] = {
e9edcee0 4108 .mixers = { alc880_asus_mixer },
f12ab1e0
TI
4109 .init_verbs = { alc880_volume_init_verbs,
4110 alc880_pin_asus_init_verbs,
e9edcee0
TI
4111 alc880_gpio1_init_verbs },
4112 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4113 .dac_nids = alc880_asus_dac_nids,
4114 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4115 .channel_mode = alc880_asus_modes,
4e195a7b 4116 .need_dac_fix = 1,
16ded525
TI
4117 .input_mux = &alc880_capture_source,
4118 },
4119 [ALC880_ASUS_DIG] = {
e9edcee0 4120 .mixers = { alc880_asus_mixer },
f12ab1e0
TI
4121 .init_verbs = { alc880_volume_init_verbs,
4122 alc880_pin_asus_init_verbs,
e9edcee0
TI
4123 alc880_gpio1_init_verbs },
4124 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4125 .dac_nids = alc880_asus_dac_nids,
16ded525 4126 .dig_out_nid = ALC880_DIGOUT_NID,
e9edcee0
TI
4127 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4128 .channel_mode = alc880_asus_modes,
4e195a7b 4129 .need_dac_fix = 1,
16ded525
TI
4130 .input_mux = &alc880_capture_source,
4131 },
df694daa
KY
4132 [ALC880_ASUS_DIG2] = {
4133 .mixers = { alc880_asus_mixer },
f12ab1e0
TI
4134 .init_verbs = { alc880_volume_init_verbs,
4135 alc880_pin_asus_init_verbs,
df694daa
KY
4136 alc880_gpio2_init_verbs }, /* use GPIO2 */
4137 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4138 .dac_nids = alc880_asus_dac_nids,
4139 .dig_out_nid = ALC880_DIGOUT_NID,
4140 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4141 .channel_mode = alc880_asus_modes,
4e195a7b 4142 .need_dac_fix = 1,
df694daa
KY
4143 .input_mux = &alc880_capture_source,
4144 },
16ded525 4145 [ALC880_ASUS_W1V] = {
e9edcee0 4146 .mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
f12ab1e0
TI
4147 .init_verbs = { alc880_volume_init_verbs,
4148 alc880_pin_asus_init_verbs,
e9edcee0
TI
4149 alc880_gpio1_init_verbs },
4150 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4151 .dac_nids = alc880_asus_dac_nids,
16ded525 4152 .dig_out_nid = ALC880_DIGOUT_NID,
e9edcee0
TI
4153 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4154 .channel_mode = alc880_asus_modes,
4e195a7b 4155 .need_dac_fix = 1,
16ded525
TI
4156 .input_mux = &alc880_capture_source,
4157 },
4158 [ALC880_UNIWILL_DIG] = {
45bdd1c1 4159 .mixers = { alc880_asus_mixer },
ccc656ce
KY
4160 .init_verbs = { alc880_volume_init_verbs,
4161 alc880_pin_asus_init_verbs },
e9edcee0
TI
4162 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4163 .dac_nids = alc880_asus_dac_nids,
16ded525 4164 .dig_out_nid = ALC880_DIGOUT_NID,
e9edcee0
TI
4165 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4166 .channel_mode = alc880_asus_modes,
4e195a7b 4167 .need_dac_fix = 1,
16ded525
TI
4168 .input_mux = &alc880_capture_source,
4169 },
ccc656ce
KY
4170 [ALC880_UNIWILL] = {
4171 .mixers = { alc880_uniwill_mixer },
4172 .init_verbs = { alc880_volume_init_verbs,
4173 alc880_uniwill_init_verbs },
4174 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4175 .dac_nids = alc880_asus_dac_nids,
4176 .dig_out_nid = ALC880_DIGOUT_NID,
4177 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4178 .channel_mode = alc880_threestack_modes,
4179 .need_dac_fix = 1,
4180 .input_mux = &alc880_capture_source,
4181 .unsol_event = alc880_uniwill_unsol_event,
4f5d1706 4182 .setup = alc880_uniwill_setup,
a9fd4f3f 4183 .init_hook = alc880_uniwill_init_hook,
ccc656ce
KY
4184 },
4185 [ALC880_UNIWILL_P53] = {
4186 .mixers = { alc880_uniwill_p53_mixer },
4187 .init_verbs = { alc880_volume_init_verbs,
4188 alc880_uniwill_p53_init_verbs },
4189 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4190 .dac_nids = alc880_asus_dac_nids,
4191 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
2cf9f0fc
TD
4192 .channel_mode = alc880_threestack_modes,
4193 .input_mux = &alc880_capture_source,
4194 .unsol_event = alc880_uniwill_p53_unsol_event,
4f5d1706
TI
4195 .setup = alc880_uniwill_p53_setup,
4196 .init_hook = alc_automute_amp,
2cf9f0fc
TD
4197 },
4198 [ALC880_FUJITSU] = {
45bdd1c1 4199 .mixers = { alc880_fujitsu_mixer },
2cf9f0fc
TD
4200 .init_verbs = { alc880_volume_init_verbs,
4201 alc880_uniwill_p53_init_verbs,
4202 alc880_beep_init_verbs },
4203 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4204 .dac_nids = alc880_dac_nids,
d53d7d9e 4205 .dig_out_nid = ALC880_DIGOUT_NID,
2cf9f0fc
TD
4206 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4207 .channel_mode = alc880_2_jack_modes,
ccc656ce
KY
4208 .input_mux = &alc880_capture_source,
4209 .unsol_event = alc880_uniwill_p53_unsol_event,
4f5d1706
TI
4210 .setup = alc880_uniwill_p53_setup,
4211 .init_hook = alc_automute_amp,
ccc656ce 4212 },
df694daa
KY
4213 [ALC880_CLEVO] = {
4214 .mixers = { alc880_three_stack_mixer },
4215 .init_verbs = { alc880_volume_init_verbs,
4216 alc880_pin_clevo_init_verbs },
4217 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4218 .dac_nids = alc880_dac_nids,
4219 .hp_nid = 0x03,
4220 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4221 .channel_mode = alc880_threestack_modes,
4e195a7b 4222 .need_dac_fix = 1,
df694daa
KY
4223 .input_mux = &alc880_capture_source,
4224 },
ae6b813a
TI
4225 [ALC880_LG] = {
4226 .mixers = { alc880_lg_mixer },
4227 .init_verbs = { alc880_volume_init_verbs,
4228 alc880_lg_init_verbs },
4229 .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4230 .dac_nids = alc880_lg_dac_nids,
4231 .dig_out_nid = ALC880_DIGOUT_NID,
4232 .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4233 .channel_mode = alc880_lg_ch_modes,
4e195a7b 4234 .need_dac_fix = 1,
ae6b813a 4235 .input_mux = &alc880_lg_capture_source,
a9fd4f3f 4236 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
4237 .setup = alc880_lg_setup,
4238 .init_hook = alc_automute_amp,
cb53c626
TI
4239#ifdef CONFIG_SND_HDA_POWER_SAVE
4240 .loopbacks = alc880_lg_loopbacks,
4241#endif
ae6b813a 4242 },
d681518a
TI
4243 [ALC880_LG_LW] = {
4244 .mixers = { alc880_lg_lw_mixer },
4245 .init_verbs = { alc880_volume_init_verbs,
4246 alc880_lg_lw_init_verbs },
0a8c5da3 4247 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
d681518a
TI
4248 .dac_nids = alc880_dac_nids,
4249 .dig_out_nid = ALC880_DIGOUT_NID,
0a8c5da3
CM
4250 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4251 .channel_mode = alc880_lg_lw_modes,
d681518a 4252 .input_mux = &alc880_lg_lw_capture_source,
a9fd4f3f 4253 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
4254 .setup = alc880_lg_lw_setup,
4255 .init_hook = alc_automute_amp,
d681518a 4256 },
df99cd33
TI
4257 [ALC880_MEDION_RIM] = {
4258 .mixers = { alc880_medion_rim_mixer },
4259 .init_verbs = { alc880_volume_init_verbs,
4260 alc880_medion_rim_init_verbs,
4261 alc_gpio2_init_verbs },
4262 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4263 .dac_nids = alc880_dac_nids,
4264 .dig_out_nid = ALC880_DIGOUT_NID,
4265 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4266 .channel_mode = alc880_2_jack_modes,
4267 .input_mux = &alc880_medion_rim_capture_source,
4268 .unsol_event = alc880_medion_rim_unsol_event,
4f5d1706
TI
4269 .setup = alc880_medion_rim_setup,
4270 .init_hook = alc880_medion_rim_automute,
df99cd33 4271 },
16ded525
TI
4272#ifdef CONFIG_SND_DEBUG
4273 [ALC880_TEST] = {
e9edcee0
TI
4274 .mixers = { alc880_test_mixer },
4275 .init_verbs = { alc880_test_init_verbs },
16ded525
TI
4276 .num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4277 .dac_nids = alc880_test_dac_nids,
4278 .dig_out_nid = ALC880_DIGOUT_NID,
16ded525
TI
4279 .num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4280 .channel_mode = alc880_test_modes,
4281 .input_mux = &alc880_test_capture_source,
4282 },
4283#endif
4284};
4285
e9edcee0
TI
4286/*
4287 * Automatic parse of I/O pins from the BIOS configuration
4288 */
4289
e9edcee0
TI
4290enum {
4291 ALC_CTL_WIDGET_VOL,
4292 ALC_CTL_WIDGET_MUTE,
4293 ALC_CTL_BIND_MUTE,
4294};
c8b6bf9b 4295static struct snd_kcontrol_new alc880_control_templates[] = {
e9edcee0
TI
4296 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4297 HDA_CODEC_MUTE(NULL, 0, 0, 0),
985be54b 4298 HDA_BIND_MUTE(NULL, 0, 0, 0),
e9edcee0
TI
4299};
4300
4301/* add dynamic controls */
f12ab1e0
TI
4302static int add_control(struct alc_spec *spec, int type, const char *name,
4303 unsigned long val)
e9edcee0 4304{
c8b6bf9b 4305 struct snd_kcontrol_new *knew;
e9edcee0 4306
603c4019
TI
4307 snd_array_init(&spec->kctls, sizeof(*knew), 32);
4308 knew = snd_array_new(&spec->kctls);
4309 if (!knew)
4310 return -ENOMEM;
e9edcee0 4311 *knew = alc880_control_templates[type];
543537bd 4312 knew->name = kstrdup(name, GFP_KERNEL);
f12ab1e0 4313 if (!knew->name)
e9edcee0 4314 return -ENOMEM;
4d02d1b6 4315 if (get_amp_nid_(val))
9c96fa59 4316 knew->subdevice = HDA_SUBDEV_NID_FLAG | get_amp_nid_(val);
e9edcee0 4317 knew->private_value = val;
e9edcee0
TI
4318 return 0;
4319}
4320
0afe5f89
TI
4321static int add_control_with_pfx(struct alc_spec *spec, int type,
4322 const char *pfx, const char *dir,
4323 const char *sfx, unsigned long val)
4324{
4325 char name[32];
4326 snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
4327 return add_control(spec, type, name, val);
4328}
4329
4330#define add_pb_vol_ctrl(spec, type, pfx, val) \
4331 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val)
4332#define add_pb_sw_ctrl(spec, type, pfx, val) \
4333 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val)
4334
e9edcee0
TI
4335#define alc880_is_fixed_pin(nid) ((nid) >= 0x14 && (nid) <= 0x17)
4336#define alc880_fixed_pin_idx(nid) ((nid) - 0x14)
4337#define alc880_is_multi_pin(nid) ((nid) >= 0x18)
4338#define alc880_multi_pin_idx(nid) ((nid) - 0x18)
e9edcee0
TI
4339#define alc880_idx_to_dac(nid) ((nid) + 0x02)
4340#define alc880_dac_to_idx(nid) ((nid) - 0x02)
4341#define alc880_idx_to_mixer(nid) ((nid) + 0x0c)
4342#define alc880_idx_to_selector(nid) ((nid) + 0x10)
4343#define ALC880_PIN_CD_NID 0x1c
4344
4345/* fill in the dac_nids table from the parsed pin configuration */
f12ab1e0
TI
4346static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4347 const struct auto_pin_cfg *cfg)
e9edcee0
TI
4348{
4349 hda_nid_t nid;
4350 int assigned[4];
4351 int i, j;
4352
4353 memset(assigned, 0, sizeof(assigned));
b0af0de5 4354 spec->multiout.dac_nids = spec->private_dac_nids;
e9edcee0
TI
4355
4356 /* check the pins hardwired to audio widget */
4357 for (i = 0; i < cfg->line_outs; i++) {
4358 nid = cfg->line_out_pins[i];
4359 if (alc880_is_fixed_pin(nid)) {
4360 int idx = alc880_fixed_pin_idx(nid);
5014f193 4361 spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
e9edcee0
TI
4362 assigned[idx] = 1;
4363 }
4364 }
4365 /* left pins can be connect to any audio widget */
4366 for (i = 0; i < cfg->line_outs; i++) {
4367 nid = cfg->line_out_pins[i];
4368 if (alc880_is_fixed_pin(nid))
4369 continue;
4370 /* search for an empty channel */
4371 for (j = 0; j < cfg->line_outs; j++) {
f12ab1e0
TI
4372 if (!assigned[j]) {
4373 spec->multiout.dac_nids[i] =
4374 alc880_idx_to_dac(j);
e9edcee0
TI
4375 assigned[j] = 1;
4376 break;
4377 }
4378 }
4379 }
4380 spec->multiout.num_dacs = cfg->line_outs;
4381 return 0;
4382}
4383
4384/* add playback controls from the parsed DAC table */
df694daa
KY
4385static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4386 const struct auto_pin_cfg *cfg)
e9edcee0 4387{
f12ab1e0
TI
4388 static const char *chname[4] = {
4389 "Front", "Surround", NULL /*CLFE*/, "Side"
4390 };
e9edcee0
TI
4391 hda_nid_t nid;
4392 int i, err;
4393
4394 for (i = 0; i < cfg->line_outs; i++) {
f12ab1e0 4395 if (!spec->multiout.dac_nids[i])
e9edcee0
TI
4396 continue;
4397 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4398 if (i == 2) {
4399 /* Center/LFE */
0afe5f89
TI
4400 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4401 "Center",
f12ab1e0
TI
4402 HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4403 HDA_OUTPUT));
4404 if (err < 0)
e9edcee0 4405 return err;
0afe5f89
TI
4406 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4407 "LFE",
f12ab1e0
TI
4408 HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4409 HDA_OUTPUT));
4410 if (err < 0)
e9edcee0 4411 return err;
0afe5f89
TI
4412 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4413 "Center",
f12ab1e0
TI
4414 HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4415 HDA_INPUT));
4416 if (err < 0)
e9edcee0 4417 return err;
0afe5f89
TI
4418 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4419 "LFE",
f12ab1e0
TI
4420 HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4421 HDA_INPUT));
4422 if (err < 0)
e9edcee0
TI
4423 return err;
4424 } else {
cb162b6b
TI
4425 const char *pfx;
4426 if (cfg->line_outs == 1 &&
4427 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4428 pfx = "Speaker";
4429 else
4430 pfx = chname[i];
0afe5f89 4431 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
f12ab1e0
TI
4432 HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4433 HDA_OUTPUT));
4434 if (err < 0)
e9edcee0 4435 return err;
0afe5f89 4436 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
f12ab1e0
TI
4437 HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4438 HDA_INPUT));
4439 if (err < 0)
e9edcee0
TI
4440 return err;
4441 }
4442 }
e9edcee0
TI
4443 return 0;
4444}
4445
8d88bc3d
TI
4446/* add playback controls for speaker and HP outputs */
4447static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4448 const char *pfx)
e9edcee0
TI
4449{
4450 hda_nid_t nid;
4451 int err;
4452
f12ab1e0 4453 if (!pin)
e9edcee0
TI
4454 return 0;
4455
4456 if (alc880_is_fixed_pin(pin)) {
4457 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
82bc955f 4458 /* specify the DAC as the extra output */
f12ab1e0 4459 if (!spec->multiout.hp_nid)
e9edcee0 4460 spec->multiout.hp_nid = nid;
82bc955f
TI
4461 else
4462 spec->multiout.extra_out_nid[0] = nid;
e9edcee0
TI
4463 /* control HP volume/switch on the output mixer amp */
4464 nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
0afe5f89 4465 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
f12ab1e0
TI
4466 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
4467 if (err < 0)
e9edcee0 4468 return err;
0afe5f89 4469 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
f12ab1e0
TI
4470 HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
4471 if (err < 0)
e9edcee0
TI
4472 return err;
4473 } else if (alc880_is_multi_pin(pin)) {
4474 /* set manual connection */
e9edcee0 4475 /* we have only a switch on HP-out PIN */
0afe5f89 4476 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
f12ab1e0
TI
4477 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
4478 if (err < 0)
e9edcee0
TI
4479 return err;
4480 }
4481 return 0;
4482}
4483
4484/* create input playback/capture controls for the given pin */
f12ab1e0
TI
4485static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
4486 const char *ctlname,
df694daa 4487 int idx, hda_nid_t mix_nid)
e9edcee0 4488{
df694daa 4489 int err;
e9edcee0 4490
0afe5f89 4491 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
f12ab1e0
TI
4492 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4493 if (err < 0)
e9edcee0 4494 return err;
0afe5f89 4495 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
f12ab1e0
TI
4496 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4497 if (err < 0)
e9edcee0
TI
4498 return err;
4499 return 0;
4500}
4501
05f5f477
TI
4502static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
4503{
4504 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
4505 return (pincap & AC_PINCAP_IN) != 0;
4506}
4507
e9edcee0 4508/* create playback/capture controls for input pins */
05f5f477
TI
4509static int alc_auto_create_input_ctls(struct hda_codec *codec,
4510 const struct auto_pin_cfg *cfg,
4511 hda_nid_t mixer,
4512 hda_nid_t cap1, hda_nid_t cap2)
e9edcee0 4513{
05f5f477 4514 struct alc_spec *spec = codec->spec;
61b9b9b1 4515 struct hda_input_mux *imux = &spec->private_imux[0];
df694daa 4516 int i, err, idx;
e9edcee0
TI
4517
4518 for (i = 0; i < AUTO_PIN_LAST; i++) {
05f5f477
TI
4519 hda_nid_t pin;
4520
4521 pin = cfg->input_pins[i];
4522 if (!alc_is_input_pin(codec, pin))
4523 continue;
4524
4525 if (mixer) {
4526 idx = get_connection_index(codec, mixer, pin);
4527 if (idx >= 0) {
4528 err = new_analog_input(spec, pin,
4529 auto_pin_cfg_labels[i],
4530 idx, mixer);
4531 if (err < 0)
4532 return err;
4533 }
4534 }
4535
4536 if (!cap1)
4537 continue;
4538 idx = get_connection_index(codec, cap1, pin);
4539 if (idx < 0 && cap2)
4540 idx = get_connection_index(codec, cap2, pin);
4541 if (idx >= 0) {
f12ab1e0
TI
4542 imux->items[imux->num_items].label =
4543 auto_pin_cfg_labels[i];
05f5f477 4544 imux->items[imux->num_items].index = idx;
e9edcee0
TI
4545 imux->num_items++;
4546 }
4547 }
4548 return 0;
4549}
4550
05f5f477
TI
4551static int alc880_auto_create_input_ctls(struct hda_codec *codec,
4552 const struct auto_pin_cfg *cfg)
4553{
4554 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
4555}
4556
f6c7e546
TI
4557static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
4558 unsigned int pin_type)
4559{
4560 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4561 pin_type);
4562 /* unmute pin */
d260cdf6
TI
4563 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4564 AMP_OUT_UNMUTE);
f6c7e546
TI
4565}
4566
df694daa
KY
4567static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
4568 hda_nid_t nid, int pin_type,
e9edcee0
TI
4569 int dac_idx)
4570{
f6c7e546 4571 alc_set_pin_output(codec, nid, pin_type);
e9edcee0
TI
4572 /* need the manual connection? */
4573 if (alc880_is_multi_pin(nid)) {
4574 struct alc_spec *spec = codec->spec;
4575 int idx = alc880_multi_pin_idx(nid);
4576 snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
4577 AC_VERB_SET_CONNECT_SEL,
4578 alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
4579 }
4580}
4581
baba8ee9
TI
4582static int get_pin_type(int line_out_type)
4583{
4584 if (line_out_type == AUTO_PIN_HP_OUT)
4585 return PIN_HP;
4586 else
4587 return PIN_OUT;
4588}
4589
e9edcee0
TI
4590static void alc880_auto_init_multi_out(struct hda_codec *codec)
4591{
4592 struct alc_spec *spec = codec->spec;
4593 int i;
ea1fb29a 4594
e9edcee0
TI
4595 for (i = 0; i < spec->autocfg.line_outs; i++) {
4596 hda_nid_t nid = spec->autocfg.line_out_pins[i];
baba8ee9
TI
4597 int pin_type = get_pin_type(spec->autocfg.line_out_type);
4598 alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
e9edcee0
TI
4599 }
4600}
4601
8d88bc3d 4602static void alc880_auto_init_extra_out(struct hda_codec *codec)
e9edcee0
TI
4603{
4604 struct alc_spec *spec = codec->spec;
4605 hda_nid_t pin;
4606
82bc955f 4607 pin = spec->autocfg.speaker_pins[0];
8d88bc3d
TI
4608 if (pin) /* connect to front */
4609 alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
eb06ed8f 4610 pin = spec->autocfg.hp_pins[0];
e9edcee0
TI
4611 if (pin) /* connect to front */
4612 alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
4613}
4614
4615static void alc880_auto_init_analog_input(struct hda_codec *codec)
4616{
4617 struct alc_spec *spec = codec->spec;
4618 int i;
4619
4620 for (i = 0; i < AUTO_PIN_LAST; i++) {
4621 hda_nid_t nid = spec->autocfg.input_pins[i];
05f5f477 4622 if (alc_is_input_pin(codec, nid)) {
23f0c048 4623 alc_set_input_pin(codec, nid, i);
e82c025b
TI
4624 if (nid != ALC880_PIN_CD_NID &&
4625 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
f12ab1e0
TI
4626 snd_hda_codec_write(codec, nid, 0,
4627 AC_VERB_SET_AMP_GAIN_MUTE,
e9edcee0
TI
4628 AMP_OUT_MUTE);
4629 }
4630 }
4631}
4632
4633/* parse the BIOS configuration and set up the alc_spec */
f12ab1e0
TI
4634/* return 1 if successful, 0 if the proper config is not found,
4635 * or a negative error code
4636 */
e9edcee0
TI
4637static int alc880_parse_auto_config(struct hda_codec *codec)
4638{
4639 struct alc_spec *spec = codec->spec;
6a05ac4a 4640 int i, err;
df694daa 4641 static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
e9edcee0 4642
f12ab1e0
TI
4643 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4644 alc880_ignore);
4645 if (err < 0)
e9edcee0 4646 return err;
f12ab1e0 4647 if (!spec->autocfg.line_outs)
e9edcee0 4648 return 0; /* can't find valid BIOS pin config */
df694daa 4649
f12ab1e0
TI
4650 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
4651 if (err < 0)
4652 return err;
4653 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
4654 if (err < 0)
4655 return err;
4656 err = alc880_auto_create_extra_out(spec,
4657 spec->autocfg.speaker_pins[0],
4658 "Speaker");
4659 if (err < 0)
4660 return err;
4661 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
4662 "Headphone");
4663 if (err < 0)
4664 return err;
05f5f477 4665 err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 4666 if (err < 0)
e9edcee0
TI
4667 return err;
4668
4669 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4670
6a05ac4a
TI
4671 /* check multiple SPDIF-out (for recent codecs) */
4672 for (i = 0; i < spec->autocfg.dig_outs; i++) {
4673 hda_nid_t dig_nid;
4674 err = snd_hda_get_connections(codec,
4675 spec->autocfg.dig_out_pins[i],
4676 &dig_nid, 1);
4677 if (err < 0)
4678 continue;
4679 if (!i)
4680 spec->multiout.dig_out_nid = dig_nid;
4681 else {
4682 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
71121d9f 4683 if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
6a05ac4a 4684 break;
71121d9f 4685 spec->slave_dig_outs[i - 1] = dig_nid;
6a05ac4a
TI
4686 }
4687 }
e9edcee0
TI
4688 if (spec->autocfg.dig_in_pin)
4689 spec->dig_in_nid = ALC880_DIGIN_NID;
4690
603c4019 4691 if (spec->kctls.list)
d88897ea 4692 add_mixer(spec, spec->kctls.list);
e9edcee0 4693
d88897ea 4694 add_verb(spec, alc880_volume_init_verbs);
e9edcee0 4695
a1e8d2da 4696 spec->num_mux_defs = 1;
61b9b9b1 4697 spec->input_mux = &spec->private_imux[0];
e9edcee0 4698
4a79ba34
TI
4699 alc_ssid_check(codec, 0x15, 0x1b, 0x14);
4700
e9edcee0
TI
4701 return 1;
4702}
4703
ae6b813a
TI
4704/* additional initialization for auto-configuration model */
4705static void alc880_auto_init(struct hda_codec *codec)
e9edcee0 4706{
f6c7e546 4707 struct alc_spec *spec = codec->spec;
e9edcee0 4708 alc880_auto_init_multi_out(codec);
8d88bc3d 4709 alc880_auto_init_extra_out(codec);
e9edcee0 4710 alc880_auto_init_analog_input(codec);
f6c7e546 4711 if (spec->unsol_event)
7fb0d78f 4712 alc_inithook(codec);
e9edcee0
TI
4713}
4714
b59bdf3b
TI
4715/* check the ADC/MUX contains all input pins; some ADC/MUX contains only
4716 * one of two digital mic pins, e.g. on ALC272
4717 */
4718static void fixup_automic_adc(struct hda_codec *codec)
4719{
4720 struct alc_spec *spec = codec->spec;
4721 int i;
4722
4723 for (i = 0; i < spec->num_adc_nids; i++) {
4724 hda_nid_t cap = spec->capsrc_nids ?
4725 spec->capsrc_nids[i] : spec->adc_nids[i];
4726 int iidx, eidx;
4727
4728 iidx = get_connection_index(codec, cap, spec->int_mic.pin);
4729 if (iidx < 0)
4730 continue;
4731 eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
4732 if (eidx < 0)
4733 continue;
4734 spec->int_mic.mux_idx = iidx;
4735 spec->ext_mic.mux_idx = eidx;
4736 if (spec->capsrc_nids)
4737 spec->capsrc_nids += i;
4738 spec->adc_nids += i;
4739 spec->num_adc_nids = 1;
4740 return;
4741 }
4742 snd_printd(KERN_INFO "hda_codec: %s: "
4743 "No ADC/MUX containing both 0x%x and 0x%x pins\n",
4744 codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
4745 spec->auto_mic = 0; /* disable auto-mic to be sure */
4746}
4747
4748static void set_capture_mixer(struct hda_codec *codec)
f9e336f6 4749{
b59bdf3b 4750 struct alc_spec *spec = codec->spec;
a23b688f
TI
4751 static struct snd_kcontrol_new *caps[2][3] = {
4752 { alc_capture_mixer_nosrc1,
4753 alc_capture_mixer_nosrc2,
4754 alc_capture_mixer_nosrc3 },
4755 { alc_capture_mixer1,
4756 alc_capture_mixer2,
4757 alc_capture_mixer3 },
f9e336f6 4758 };
a23b688f
TI
4759 if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
4760 int mux;
2a22d3f8
TI
4761 if (spec->auto_mic) {
4762 mux = 0;
b59bdf3b 4763 fixup_automic_adc(codec);
2a22d3f8 4764 } else if (spec->input_mux && spec->input_mux->num_items > 1)
a23b688f
TI
4765 mux = 1;
4766 else
4767 mux = 0;
4768 spec->cap_mixer = caps[mux][spec->num_adc_nids - 1];
4769 }
f9e336f6
TI
4770}
4771
67d634c0 4772#ifdef CONFIG_SND_HDA_INPUT_BEEP
45bdd1c1
TI
4773#define set_beep_amp(spec, nid, idx, dir) \
4774 ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
67d634c0
TI
4775#else
4776#define set_beep_amp(spec, nid, idx, dir) /* NOP */
4777#endif
45bdd1c1
TI
4778
4779/*
4780 * OK, here we have finally the patch for ALC880
4781 */
4782
1da177e4
LT
4783static int patch_alc880(struct hda_codec *codec)
4784{
4785 struct alc_spec *spec;
4786 int board_config;
df694daa 4787 int err;
1da177e4 4788
e560d8d8 4789 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1da177e4
LT
4790 if (spec == NULL)
4791 return -ENOMEM;
4792
4793 codec->spec = spec;
4794
f5fcc13c
TI
4795 board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
4796 alc880_models,
4797 alc880_cfg_tbl);
4798 if (board_config < 0) {
9a11f1aa
TI
4799 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4800 codec->chip_name);
e9edcee0 4801 board_config = ALC880_AUTO;
1da177e4 4802 }
1da177e4 4803
e9edcee0
TI
4804 if (board_config == ALC880_AUTO) {
4805 /* automatic parse from the BIOS config */
4806 err = alc880_parse_auto_config(codec);
4807 if (err < 0) {
4808 alc_free(codec);
4809 return err;
f12ab1e0 4810 } else if (!err) {
9c7f852e
TI
4811 printk(KERN_INFO
4812 "hda_codec: Cannot set up configuration "
4813 "from BIOS. Using 3-stack mode...\n");
e9edcee0
TI
4814 board_config = ALC880_3ST;
4815 }
1da177e4
LT
4816 }
4817
680cd536
KK
4818 err = snd_hda_attach_beep_device(codec, 0x1);
4819 if (err < 0) {
4820 alc_free(codec);
4821 return err;
4822 }
4823
df694daa 4824 if (board_config != ALC880_AUTO)
e9c364c0 4825 setup_preset(codec, &alc880_presets[board_config]);
1da177e4 4826
1da177e4
LT
4827 spec->stream_analog_playback = &alc880_pcm_analog_playback;
4828 spec->stream_analog_capture = &alc880_pcm_analog_capture;
6330079f 4829 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
1da177e4 4830
1da177e4
LT
4831 spec->stream_digital_playback = &alc880_pcm_digital_playback;
4832 spec->stream_digital_capture = &alc880_pcm_digital_capture;
4833
f12ab1e0 4834 if (!spec->adc_nids && spec->input_mux) {
e9edcee0 4835 /* check whether NID 0x07 is valid */
54d17403 4836 unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
f12ab1e0 4837 /* get type */
a22d543a 4838 wcap = get_wcaps_type(wcap);
e9edcee0
TI
4839 if (wcap != AC_WID_AUD_IN) {
4840 spec->adc_nids = alc880_adc_nids_alt;
4841 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
e9edcee0
TI
4842 } else {
4843 spec->adc_nids = alc880_adc_nids;
4844 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
e9edcee0
TI
4845 }
4846 }
b59bdf3b 4847 set_capture_mixer(codec);
45bdd1c1 4848 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1da177e4 4849
2134ea4f
TI
4850 spec->vmaster_nid = 0x0c;
4851
1da177e4 4852 codec->patch_ops = alc_patch_ops;
e9edcee0 4853 if (board_config == ALC880_AUTO)
ae6b813a 4854 spec->init_hook = alc880_auto_init;
cb53c626
TI
4855#ifdef CONFIG_SND_HDA_POWER_SAVE
4856 if (!spec->loopback.amplist)
4857 spec->loopback.amplist = alc880_loopbacks;
4858#endif
daead538 4859 codec->proc_widget_hook = print_realtek_coef;
1da177e4
LT
4860
4861 return 0;
4862}
4863
e9edcee0 4864
1da177e4
LT
4865/*
4866 * ALC260 support
4867 */
4868
e9edcee0
TI
4869static hda_nid_t alc260_dac_nids[1] = {
4870 /* front */
4871 0x02,
4872};
4873
4874static hda_nid_t alc260_adc_nids[1] = {
4875 /* ADC0 */
4876 0x04,
4877};
4878
df694daa 4879static hda_nid_t alc260_adc_nids_alt[1] = {
e9edcee0
TI
4880 /* ADC1 */
4881 0x05,
4882};
4883
d57fdac0
JW
4884/* NIDs used when simultaneous access to both ADCs makes sense. Note that
4885 * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
4886 */
4887static hda_nid_t alc260_dual_adc_nids[2] = {
4c5186ed
JW
4888 /* ADC0, ADC1 */
4889 0x04, 0x05
4890};
4891
e9edcee0
TI
4892#define ALC260_DIGOUT_NID 0x03
4893#define ALC260_DIGIN_NID 0x06
4894
4895static struct hda_input_mux alc260_capture_source = {
4896 .num_items = 4,
4897 .items = {
4898 { "Mic", 0x0 },
4899 { "Front Mic", 0x1 },
4900 { "Line", 0x2 },
4901 { "CD", 0x4 },
4902 },
4903};
4904
17e7aec6 4905/* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
a1e8d2da
JW
4906 * headphone jack and the internal CD lines since these are the only pins at
4907 * which audio can appear. For flexibility, also allow the option of
4908 * recording the mixer output on the second ADC (ADC0 doesn't have a
4909 * connection to the mixer output).
a9430dd8 4910 */
a1e8d2da
JW
4911static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
4912 {
4913 .num_items = 3,
4914 .items = {
4915 { "Mic/Line", 0x0 },
4916 { "CD", 0x4 },
4917 { "Headphone", 0x2 },
4918 },
a9430dd8 4919 },
a1e8d2da
JW
4920 {
4921 .num_items = 4,
4922 .items = {
4923 { "Mic/Line", 0x0 },
4924 { "CD", 0x4 },
4925 { "Headphone", 0x2 },
4926 { "Mixer", 0x5 },
4927 },
4928 },
4929
a9430dd8
JW
4930};
4931
a1e8d2da
JW
4932/* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
4933 * the Fujitsu S702x, but jacks are marked differently.
0bfc90e9 4934 */
a1e8d2da
JW
4935static struct hda_input_mux alc260_acer_capture_sources[2] = {
4936 {
4937 .num_items = 4,
4938 .items = {
4939 { "Mic", 0x0 },
4940 { "Line", 0x2 },
4941 { "CD", 0x4 },
4942 { "Headphone", 0x5 },
4943 },
4944 },
4945 {
4946 .num_items = 5,
4947 .items = {
4948 { "Mic", 0x0 },
4949 { "Line", 0x2 },
4950 { "CD", 0x4 },
4951 { "Headphone", 0x6 },
4952 { "Mixer", 0x5 },
4953 },
0bfc90e9
JW
4954 },
4955};
cc959489
MS
4956
4957/* Maxdata Favorit 100XS */
4958static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
4959 {
4960 .num_items = 2,
4961 .items = {
4962 { "Line/Mic", 0x0 },
4963 { "CD", 0x4 },
4964 },
4965 },
4966 {
4967 .num_items = 3,
4968 .items = {
4969 { "Line/Mic", 0x0 },
4970 { "CD", 0x4 },
4971 { "Mixer", 0x5 },
4972 },
4973 },
4974};
4975
1da177e4
LT
4976/*
4977 * This is just place-holder, so there's something for alc_build_pcms to look
4978 * at when it calculates the maximum number of channels. ALC260 has no mixer
4979 * element which allows changing the channel mode, so the verb list is
4980 * never used.
4981 */
d2a6d7dc 4982static struct hda_channel_mode alc260_modes[1] = {
1da177e4
LT
4983 { 2, NULL },
4984};
4985
df694daa
KY
4986
4987/* Mixer combinations
4988 *
4989 * basic: base_output + input + pc_beep + capture
4990 * HP: base_output + input + capture_alt
4991 * HP_3013: hp_3013 + input + capture
4992 * fujitsu: fujitsu + capture
0bfc90e9 4993 * acer: acer + capture
df694daa
KY
4994 */
4995
4996static struct snd_kcontrol_new alc260_base_output_mixer[] = {
05acb863 4997 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
985be54b 4998 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
05acb863 4999 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
985be54b 5000 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
05acb863 5001 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
985be54b 5002 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
1da177e4 5003 { } /* end */
f12ab1e0 5004};
1da177e4 5005
df694daa 5006static struct snd_kcontrol_new alc260_input_mixer[] = {
16ded525
TI
5007 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5008 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5009 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5010 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5011 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5012 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5013 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5014 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
df694daa
KY
5015 { } /* end */
5016};
5017
bec15c3a
TI
5018/* update HP, line and mono out pins according to the master switch */
5019static void alc260_hp_master_update(struct hda_codec *codec,
5020 hda_nid_t hp, hda_nid_t line,
5021 hda_nid_t mono)
5022{
5023 struct alc_spec *spec = codec->spec;
5024 unsigned int val = spec->master_sw ? PIN_HP : 0;
5025 /* change HP and line-out pins */
30cde0aa 5026 snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
bec15c3a 5027 val);
30cde0aa 5028 snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
bec15c3a
TI
5029 val);
5030 /* mono (speaker) depending on the HP jack sense */
5031 val = (val && !spec->jack_present) ? PIN_OUT : 0;
30cde0aa 5032 snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
bec15c3a
TI
5033 val);
5034}
5035
5036static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5037 struct snd_ctl_elem_value *ucontrol)
5038{
5039 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5040 struct alc_spec *spec = codec->spec;
5041 *ucontrol->value.integer.value = spec->master_sw;
5042 return 0;
5043}
5044
5045static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5046 struct snd_ctl_elem_value *ucontrol)
5047{
5048 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5049 struct alc_spec *spec = codec->spec;
5050 int val = !!*ucontrol->value.integer.value;
5051 hda_nid_t hp, line, mono;
5052
5053 if (val == spec->master_sw)
5054 return 0;
5055 spec->master_sw = val;
5056 hp = (kcontrol->private_value >> 16) & 0xff;
5057 line = (kcontrol->private_value >> 8) & 0xff;
5058 mono = kcontrol->private_value & 0xff;
5059 alc260_hp_master_update(codec, hp, line, mono);
5060 return 1;
5061}
5062
5063static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5064 {
5065 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5066 .name = "Master Playback Switch",
5067 .info = snd_ctl_boolean_mono_info,
5068 .get = alc260_hp_master_sw_get,
5069 .put = alc260_hp_master_sw_put,
5070 .private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5071 },
5072 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5073 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5074 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5075 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5076 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5077 HDA_OUTPUT),
5078 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5079 { } /* end */
5080};
5081
5082static struct hda_verb alc260_hp_unsol_verbs[] = {
5083 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5084 {},
5085};
5086
5087static void alc260_hp_automute(struct hda_codec *codec)
5088{
5089 struct alc_spec *spec = codec->spec;
bec15c3a 5090
864f92be 5091 spec->jack_present = snd_hda_jack_detect(codec, 0x10);
bec15c3a
TI
5092 alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5093}
5094
5095static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5096{
5097 if ((res >> 26) == ALC880_HP_EVENT)
5098 alc260_hp_automute(codec);
5099}
5100
df694daa 5101static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
bec15c3a
TI
5102 {
5103 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5104 .name = "Master Playback Switch",
5105 .info = snd_ctl_boolean_mono_info,
5106 .get = alc260_hp_master_sw_get,
5107 .put = alc260_hp_master_sw_put,
30cde0aa 5108 .private_value = (0x15 << 16) | (0x10 << 8) | 0x11
bec15c3a 5109 },
df694daa
KY
5110 HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5111 HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5112 HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5113 HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5114 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5115 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
86cd9298
TI
5116 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5117 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
16ded525
TI
5118 { } /* end */
5119};
5120
3f878308
KY
5121static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5122 .ops = &snd_hda_bind_vol,
5123 .values = {
5124 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5125 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5126 HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5127 0
5128 },
5129};
5130
5131static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5132 .ops = &snd_hda_bind_sw,
5133 .values = {
5134 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5135 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5136 0
5137 },
5138};
5139
5140static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5141 HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5142 HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5143 HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5144 HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5145 { } /* end */
5146};
5147
bec15c3a
TI
5148static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5149 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5150 {},
5151};
5152
5153static void alc260_hp_3013_automute(struct hda_codec *codec)
5154{
5155 struct alc_spec *spec = codec->spec;
bec15c3a 5156
864f92be 5157 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
30cde0aa 5158 alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
bec15c3a
TI
5159}
5160
5161static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5162 unsigned int res)
5163{
5164 if ((res >> 26) == ALC880_HP_EVENT)
5165 alc260_hp_3013_automute(codec);
5166}
5167
3f878308
KY
5168static void alc260_hp_3012_automute(struct hda_codec *codec)
5169{
864f92be 5170 unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
3f878308 5171
3f878308
KY
5172 snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5173 bits);
5174 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5175 bits);
5176 snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5177 bits);
5178}
5179
5180static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5181 unsigned int res)
5182{
5183 if ((res >> 26) == ALC880_HP_EVENT)
5184 alc260_hp_3012_automute(codec);
5185}
5186
5187/* Fujitsu S702x series laptops. ALC260 pin usage: Mic/Line jack = 0x12,
a1e8d2da
JW
5188 * HP jack = 0x14, CD audio = 0x16, internal speaker = 0x10.
5189 */
c8b6bf9b 5190static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
a9430dd8 5191 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
985be54b 5192 HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
4c5186ed 5193 ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
a9430dd8
JW
5194 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5195 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5196 HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5197 HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
4c5186ed 5198 ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
31bffaa9
TI
5199 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5200 HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
df694daa
KY
5201 { } /* end */
5202};
5203
a1e8d2da
JW
5204/* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks. Note that current
5205 * versions of the ALC260 don't act on requests to enable mic bias from NID
5206 * 0x0f (used to drive the headphone jack in these laptops). The ALC260
5207 * datasheet doesn't mention this restriction. At this stage it's not clear
5208 * whether this behaviour is intentional or is a hardware bug in chip
5209 * revisions available in early 2006. Therefore for now allow the
5210 * "Headphone Jack Mode" control to span all choices, but if it turns out
5211 * that the lack of mic bias for this NID is intentional we could change the
5212 * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5213 *
5214 * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5215 * don't appear to make the mic bias available from the "line" jack, even
5216 * though the NID used for this jack (0x14) can supply it. The theory is
5217 * that perhaps Acer have included blocking capacitors between the ALC260
5218 * and the output jack. If this turns out to be the case for all such
5219 * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5220 * to ALC_PIN_DIR_INOUT_NOMICBIAS.
bd869485
JW
5221 *
5222 * The C20x Tablet series have a mono internal speaker which is controlled
5223 * via the chip's Mono sum widget and pin complex, so include the necessary
5224 * controls for such models. On models without a "mono speaker" the control
5225 * won't do anything.
a1e8d2da 5226 */
0bfc90e9
JW
5227static struct snd_kcontrol_new alc260_acer_mixer[] = {
5228 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5229 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
a1e8d2da 5230 ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
31bffaa9 5231 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
bd869485 5232 HDA_OUTPUT),
31bffaa9 5233 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
bd869485 5234 HDA_INPUT),
0bfc90e9
JW
5235 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5236 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5237 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5238 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5239 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5240 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5241 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5242 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
0bfc90e9
JW
5243 { } /* end */
5244};
5245
cc959489
MS
5246/* Maxdata Favorit 100XS: one output and one input (0x12) jack
5247 */
5248static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5249 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5250 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5251 ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5252 HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5253 HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5254 ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5255 { } /* end */
5256};
5257
bc9f98a9
KY
5258/* Packard bell V7900 ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5259 * Line In jack = 0x14, CD audio = 0x16, pc beep = 0x17.
5260 */
5261static struct snd_kcontrol_new alc260_will_mixer[] = {
5262 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5263 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5264 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5265 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5266 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5267 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5268 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5269 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5270 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5271 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
bc9f98a9
KY
5272 { } /* end */
5273};
5274
5275/* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5276 * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5277 */
5278static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5279 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5280 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5281 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5282 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5283 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5284 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5285 HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5286 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5287 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5288 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5289 { } /* end */
5290};
5291
df694daa
KY
5292/*
5293 * initialization verbs
5294 */
1da177e4
LT
5295static struct hda_verb alc260_init_verbs[] = {
5296 /* Line In pin widget for input */
05acb863 5297 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1da177e4 5298 /* CD pin widget for input */
05acb863 5299 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1da177e4 5300 /* Mic1 (rear panel) pin widget for input and vref at 80% */
16ded525 5301 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1da177e4 5302 /* Mic2 (front panel) pin widget for input and vref at 80% */
16ded525 5303 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1da177e4 5304 /* LINE-2 is used for line-out in rear */
05acb863 5305 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1da177e4 5306 /* select line-out */
fd56f2db 5307 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
1da177e4 5308 /* LINE-OUT pin */
05acb863 5309 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1da177e4 5310 /* enable HP */
05acb863 5311 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1da177e4 5312 /* enable Mono */
05acb863
TI
5313 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5314 /* mute capture amp left and right */
16ded525 5315 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1da177e4
LT
5316 /* set connection select to line in (default select for this ADC) */
5317 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
16ded525
TI
5318 /* mute capture amp left and right */
5319 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5320 /* set connection select to line in (default select for this ADC) */
5321 {0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
05acb863
TI
5322 /* set vol=0 Line-Out mixer amp left and right */
5323 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5324 /* unmute pin widget amp left and right (no gain on this amp) */
5325 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5326 /* set vol=0 HP mixer amp left and right */
5327 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5328 /* unmute pin widget amp left and right (no gain on this amp) */
5329 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5330 /* set vol=0 Mono mixer amp left and right */
5331 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5332 /* unmute pin widget amp left and right (no gain on this amp) */
5333 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5334 /* unmute LINE-2 out pin */
5335 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
f12ab1e0
TI
5336 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5337 * Line In 2 = 0x03
5338 */
cb53c626
TI
5339 /* mute analog inputs */
5340 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5341 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5342 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5343 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5344 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
1da177e4 5345 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
05acb863
TI
5346 /* mute Front out path */
5347 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5348 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5349 /* mute Headphone out path */
5350 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5351 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5352 /* mute Mono out path */
5353 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5354 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4
LT
5355 { }
5356};
5357
474167d6 5358#if 0 /* should be identical with alc260_init_verbs? */
df694daa
KY
5359static struct hda_verb alc260_hp_init_verbs[] = {
5360 /* Headphone and output */
5361 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5362 /* mono output */
5363 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5364 /* Mic1 (rear panel) pin widget for input and vref at 80% */
5365 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5366 /* Mic2 (front panel) pin widget for input and vref at 80% */
5367 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5368 /* Line In pin widget for input */
5369 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5370 /* Line-2 pin widget for output */
5371 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5372 /* CD pin widget for input */
5373 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5374 /* unmute amp left and right */
5375 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5376 /* set connection select to line in (default select for this ADC) */
5377 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5378 /* unmute Line-Out mixer amp left and right (volume = 0) */
5379 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5380 /* mute pin widget amp left and right (no gain on this amp) */
5381 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5382 /* unmute HP mixer amp left and right (volume = 0) */
5383 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5384 /* mute pin widget amp left and right (no gain on this amp) */
5385 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
f12ab1e0
TI
5386 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5387 * Line In 2 = 0x03
5388 */
cb53c626
TI
5389 /* mute analog inputs */
5390 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5391 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5392 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5393 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5394 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
df694daa
KY
5395 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5396 /* Unmute Front out path */
5397 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5398 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5399 /* Unmute Headphone out path */
5400 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5401 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5402 /* Unmute Mono out path */
5403 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5404 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5405 { }
5406};
474167d6 5407#endif
df694daa
KY
5408
5409static struct hda_verb alc260_hp_3013_init_verbs[] = {
5410 /* Line out and output */
5411 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5412 /* mono output */
5413 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5414 /* Mic1 (rear panel) pin widget for input and vref at 80% */
5415 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5416 /* Mic2 (front panel) pin widget for input and vref at 80% */
5417 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5418 /* Line In pin widget for input */
5419 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5420 /* Headphone pin widget for output */
5421 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5422 /* CD pin widget for input */
5423 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5424 /* unmute amp left and right */
5425 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5426 /* set connection select to line in (default select for this ADC) */
5427 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5428 /* unmute Line-Out mixer amp left and right (volume = 0) */
5429 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5430 /* mute pin widget amp left and right (no gain on this amp) */
5431 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5432 /* unmute HP mixer amp left and right (volume = 0) */
5433 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5434 /* mute pin widget amp left and right (no gain on this amp) */
5435 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
f12ab1e0
TI
5436 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5437 * Line In 2 = 0x03
5438 */
cb53c626
TI
5439 /* mute analog inputs */
5440 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5441 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5442 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5443 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5444 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
df694daa
KY
5445 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5446 /* Unmute Front out path */
5447 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5448 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5449 /* Unmute Headphone out path */
5450 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5451 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5452 /* Unmute Mono out path */
5453 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5454 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5455 { }
5456};
5457
a9430dd8 5458/* Initialisation sequence for ALC260 as configured in Fujitsu S702x
a1e8d2da
JW
5459 * laptops. ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
5460 * audio = 0x16, internal speaker = 0x10.
a9430dd8
JW
5461 */
5462static struct hda_verb alc260_fujitsu_init_verbs[] = {
5463 /* Disable all GPIOs */
5464 {0x01, AC_VERB_SET_GPIO_MASK, 0},
5465 /* Internal speaker is connected to headphone pin */
5466 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5467 /* Headphone/Line-out jack connects to Line1 pin; make it an output */
5468 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
f7ace40d
JW
5469 /* Mic/Line-in jack is connected to mic1 pin, so make it an input */
5470 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5471 /* Ensure all other unused pins are disabled and muted. */
5472 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5473 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
a9430dd8 5474 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
f7ace40d 5475 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
a9430dd8 5476 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
f7ace40d
JW
5477 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5478 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5479 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5480
5481 /* Disable digital (SPDIF) pins */
5482 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5483 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
a9430dd8 5484
ea1fb29a 5485 /* Ensure Line1 pin widget takes its input from the OUT1 sum bus
f7ace40d
JW
5486 * when acting as an output.
5487 */
5488 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
4c5186ed 5489
f7ace40d 5490 /* Start with output sum widgets muted and their output gains at min */
8b33a5aa
TI
5491 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5492 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5493 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5494 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5495 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5496 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5497 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5498 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5499 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
a9430dd8 5500
f7ace40d
JW
5501 /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
5502 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5503 /* Unmute Line1 pin widget output buffer since it starts as an output.
5504 * If the pin mode is changed by the user the pin mode control will
5505 * take care of enabling the pin's input/output buffers as needed.
5506 * Therefore there's no need to enable the input buffer at this
5507 * stage.
cdcd9268 5508 */
f7ace40d 5509 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
ea1fb29a 5510 /* Unmute input buffer of pin widget used for Line-in (no equiv
cdcd9268
JW
5511 * mixer ctrl)
5512 */
f7ace40d
JW
5513 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5514
5515 /* Mute capture amp left and right */
5516 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
ea1fb29a 5517 /* Set ADC connection select to match default mixer setting - line
f7ace40d
JW
5518 * in (on mic1 pin)
5519 */
5520 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5521
5522 /* Do the same for the second ADC: mute capture input amp and
5523 * set ADC connection to line in (on mic1 pin)
5524 */
5525 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5526 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5527
5528 /* Mute all inputs to mixer widget (even unconnected ones) */
5529 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5530 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5531 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5532 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5533 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5534 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5535 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5536 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
4a471b7d
TI
5537
5538 { }
a9430dd8
JW
5539};
5540
0bfc90e9
JW
5541/* Initialisation sequence for ALC260 as configured in Acer TravelMate and
5542 * similar laptops (adapted from Fujitsu init verbs).
5543 */
5544static struct hda_verb alc260_acer_init_verbs[] = {
5545 /* On TravelMate laptops, GPIO 0 enables the internal speaker and
5546 * the headphone jack. Turn this on and rely on the standard mute
5547 * methods whenever the user wants to turn these outputs off.
5548 */
5549 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5550 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5551 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5552 /* Internal speaker/Headphone jack is connected to Line-out pin */
5553 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5554 /* Internal microphone/Mic jack is connected to Mic1 pin */
5555 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5556 /* Line In jack is connected to Line1 pin */
5557 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
bd869485
JW
5558 /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
5559 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
0bfc90e9
JW
5560 /* Ensure all other unused pins are disabled and muted. */
5561 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5562 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
0bfc90e9
JW
5563 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5564 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5565 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5566 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5567 /* Disable digital (SPDIF) pins */
5568 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5569 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5570
ea1fb29a 5571 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
0bfc90e9
JW
5572 * bus when acting as outputs.
5573 */
5574 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5575 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5576
5577 /* Start with output sum widgets muted and their output gains at min */
5578 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5579 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5580 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5581 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5582 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5583 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5584 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5585 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5586 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5587
f12ab1e0
TI
5588 /* Unmute Line-out pin widget amp left and right
5589 * (no equiv mixer ctrl)
5590 */
0bfc90e9 5591 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
bd869485
JW
5592 /* Unmute mono pin widget amp output (no equiv mixer ctrl) */
5593 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
0bfc90e9
JW
5594 /* Unmute Mic1 and Line1 pin widget input buffers since they start as
5595 * inputs. If the pin mode is changed by the user the pin mode control
5596 * will take care of enabling the pin's input/output buffers as needed.
5597 * Therefore there's no need to enable the input buffer at this
5598 * stage.
5599 */
5600 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5601 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5602
5603 /* Mute capture amp left and right */
5604 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5605 /* Set ADC connection select to match default mixer setting - mic
5606 * (on mic1 pin)
5607 */
5608 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5609
5610 /* Do similar with the second ADC: mute capture input amp and
a1e8d2da 5611 * set ADC connection to mic to match ALSA's default state.
0bfc90e9
JW
5612 */
5613 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
a1e8d2da 5614 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
0bfc90e9
JW
5615
5616 /* Mute all inputs to mixer widget (even unconnected ones) */
5617 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5618 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5619 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5620 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5621 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5622 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5623 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5624 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5625
5626 { }
5627};
5628
cc959489
MS
5629/* Initialisation sequence for Maxdata Favorit 100XS
5630 * (adapted from Acer init verbs).
5631 */
5632static struct hda_verb alc260_favorit100_init_verbs[] = {
5633 /* GPIO 0 enables the output jack.
5634 * Turn this on and rely on the standard mute
5635 * methods whenever the user wants to turn these outputs off.
5636 */
5637 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5638 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5639 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5640 /* Line/Mic input jack is connected to Mic1 pin */
5641 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5642 /* Ensure all other unused pins are disabled and muted. */
5643 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5644 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5645 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5646 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5647 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5648 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5649 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5650 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5651 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5652 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5653 /* Disable digital (SPDIF) pins */
5654 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5655 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5656
5657 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5658 * bus when acting as outputs.
5659 */
5660 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5661 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5662
5663 /* Start with output sum widgets muted and their output gains at min */
5664 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5665 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5666 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5667 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5668 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5669 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5670 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5671 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5672 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5673
5674 /* Unmute Line-out pin widget amp left and right
5675 * (no equiv mixer ctrl)
5676 */
5677 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5678 /* Unmute Mic1 and Line1 pin widget input buffers since they start as
5679 * inputs. If the pin mode is changed by the user the pin mode control
5680 * will take care of enabling the pin's input/output buffers as needed.
5681 * Therefore there's no need to enable the input buffer at this
5682 * stage.
5683 */
5684 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5685
5686 /* Mute capture amp left and right */
5687 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5688 /* Set ADC connection select to match default mixer setting - mic
5689 * (on mic1 pin)
5690 */
5691 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5692
5693 /* Do similar with the second ADC: mute capture input amp and
5694 * set ADC connection to mic to match ALSA's default state.
5695 */
5696 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5697 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5698
5699 /* Mute all inputs to mixer widget (even unconnected ones) */
5700 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5701 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5702 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5703 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5704 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5705 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5706 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5707 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5708
5709 { }
5710};
5711
bc9f98a9
KY
5712static struct hda_verb alc260_will_verbs[] = {
5713 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5714 {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
5715 {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
5716 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
5717 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
5718 {0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
5719 {}
5720};
5721
5722static struct hda_verb alc260_replacer_672v_verbs[] = {
5723 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
5724 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
5725 {0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
5726
5727 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5728 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5729 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
5730
5731 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5732 {}
5733};
5734
5735/* toggle speaker-output according to the hp-jack state */
5736static void alc260_replacer_672v_automute(struct hda_codec *codec)
5737{
5738 unsigned int present;
5739
5740 /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
864f92be 5741 present = snd_hda_jack_detect(codec, 0x0f);
bc9f98a9 5742 if (present) {
82beb8fd
TI
5743 snd_hda_codec_write_cache(codec, 0x01, 0,
5744 AC_VERB_SET_GPIO_DATA, 1);
5745 snd_hda_codec_write_cache(codec, 0x0f, 0,
5746 AC_VERB_SET_PIN_WIDGET_CONTROL,
5747 PIN_HP);
bc9f98a9 5748 } else {
82beb8fd
TI
5749 snd_hda_codec_write_cache(codec, 0x01, 0,
5750 AC_VERB_SET_GPIO_DATA, 0);
5751 snd_hda_codec_write_cache(codec, 0x0f, 0,
5752 AC_VERB_SET_PIN_WIDGET_CONTROL,
5753 PIN_OUT);
bc9f98a9
KY
5754 }
5755}
5756
5757static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
5758 unsigned int res)
5759{
5760 if ((res >> 26) == ALC880_HP_EVENT)
5761 alc260_replacer_672v_automute(codec);
5762}
5763
3f878308
KY
5764static struct hda_verb alc260_hp_dc7600_verbs[] = {
5765 {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
5766 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
5767 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5768 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5769 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5770 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5771 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5772 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5773 {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5774 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5775 {}
5776};
5777
7cf51e48
JW
5778/* Test configuration for debugging, modelled after the ALC880 test
5779 * configuration.
5780 */
5781#ifdef CONFIG_SND_DEBUG
5782static hda_nid_t alc260_test_dac_nids[1] = {
5783 0x02,
5784};
5785static hda_nid_t alc260_test_adc_nids[2] = {
5786 0x04, 0x05,
5787};
a1e8d2da 5788/* For testing the ALC260, each input MUX needs its own definition since
ea1fb29a 5789 * the signal assignments are different. This assumes that the first ADC
a1e8d2da 5790 * is NID 0x04.
17e7aec6 5791 */
a1e8d2da
JW
5792static struct hda_input_mux alc260_test_capture_sources[2] = {
5793 {
5794 .num_items = 7,
5795 .items = {
5796 { "MIC1 pin", 0x0 },
5797 { "MIC2 pin", 0x1 },
5798 { "LINE1 pin", 0x2 },
5799 { "LINE2 pin", 0x3 },
5800 { "CD pin", 0x4 },
5801 { "LINE-OUT pin", 0x5 },
5802 { "HP-OUT pin", 0x6 },
5803 },
5804 },
5805 {
5806 .num_items = 8,
5807 .items = {
5808 { "MIC1 pin", 0x0 },
5809 { "MIC2 pin", 0x1 },
5810 { "LINE1 pin", 0x2 },
5811 { "LINE2 pin", 0x3 },
5812 { "CD pin", 0x4 },
5813 { "Mixer", 0x5 },
5814 { "LINE-OUT pin", 0x6 },
5815 { "HP-OUT pin", 0x7 },
5816 },
7cf51e48
JW
5817 },
5818};
5819static struct snd_kcontrol_new alc260_test_mixer[] = {
5820 /* Output driver widgets */
5821 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5822 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5823 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5824 HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
5825 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5826 HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
5827
a1e8d2da
JW
5828 /* Modes for retasking pin widgets
5829 * Note: the ALC260 doesn't seem to act on requests to enable mic
5830 * bias from NIDs 0x0f and 0x10. The ALC260 datasheet doesn't
5831 * mention this restriction. At this stage it's not clear whether
5832 * this behaviour is intentional or is a hardware bug in chip
5833 * revisions available at least up until early 2006. Therefore for
5834 * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
5835 * choices, but if it turns out that the lack of mic bias for these
5836 * NIDs is intentional we could change their modes from
5837 * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5838 */
7cf51e48
JW
5839 ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
5840 ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
5841 ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
5842 ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
5843 ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
5844 ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
5845
5846 /* Loopback mixer controls */
5847 HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
5848 HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
5849 HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
5850 HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
5851 HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
5852 HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
5853 HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
5854 HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
5855 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5856 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
7cf51e48
JW
5857 HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
5858 HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
5859 HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
5860 HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
5c8f858d
JW
5861
5862 /* Controls for GPIO pins, assuming they are configured as outputs */
5863 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
5864 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
5865 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
5866 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
5867
92621f13
JW
5868 /* Switches to allow the digital IO pins to be enabled. The datasheet
5869 * is ambigious as to which NID is which; testing on laptops which
ea1fb29a 5870 * make this output available should provide clarification.
92621f13
JW
5871 */
5872 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
5873 ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
5874
f8225f6d
JW
5875 /* A switch allowing EAPD to be enabled. Some laptops seem to use
5876 * this output to turn on an external amplifier.
5877 */
5878 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
5879 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
5880
7cf51e48
JW
5881 { } /* end */
5882};
5883static struct hda_verb alc260_test_init_verbs[] = {
5c8f858d
JW
5884 /* Enable all GPIOs as outputs with an initial value of 0 */
5885 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
5886 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
5887 {0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
5888
7cf51e48
JW
5889 /* Enable retasking pins as output, initially without power amp */
5890 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5891 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5892 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5893 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5894 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5895 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5896
92621f13
JW
5897 /* Disable digital (SPDIF) pins initially, but users can enable
5898 * them via a mixer switch. In the case of SPDIF-out, this initverb
5899 * payload also sets the generation to 0, output to be in "consumer"
5900 * PCM format, copyright asserted, no pre-emphasis and no validity
5901 * control.
5902 */
7cf51e48
JW
5903 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5904 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5905
ea1fb29a 5906 /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
7cf51e48
JW
5907 * OUT1 sum bus when acting as an output.
5908 */
5909 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5910 {0x0c, AC_VERB_SET_CONNECT_SEL, 0},
5911 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5912 {0x0e, AC_VERB_SET_CONNECT_SEL, 0},
5913
5914 /* Start with output sum widgets muted and their output gains at min */
5915 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5916 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5917 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5918 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5919 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5920 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5921 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5922 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5923 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5924
cdcd9268
JW
5925 /* Unmute retasking pin widget output buffers since the default
5926 * state appears to be output. As the pin mode is changed by the
5927 * user the pin mode control will take care of enabling the pin's
5928 * input/output buffers as needed.
5929 */
7cf51e48
JW
5930 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5931 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5932 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5933 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5934 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5935 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5936 /* Also unmute the mono-out pin widget */
5937 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5938
7cf51e48
JW
5939 /* Mute capture amp left and right */
5940 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
f7ace40d
JW
5941 /* Set ADC connection select to match default mixer setting (mic1
5942 * pin)
7cf51e48
JW
5943 */
5944 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5945
5946 /* Do the same for the second ADC: mute capture input amp and
f7ace40d 5947 * set ADC connection to mic1 pin
7cf51e48
JW
5948 */
5949 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5950 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5951
5952 /* Mute all inputs to mixer widget (even unconnected ones) */
5953 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5954 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5955 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5956 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5957 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5958 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5959 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5960 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5961
5962 { }
5963};
5964#endif
5965
6330079f
TI
5966#define alc260_pcm_analog_playback alc880_pcm_analog_alt_playback
5967#define alc260_pcm_analog_capture alc880_pcm_analog_capture
1da177e4 5968
a3bcba38
TI
5969#define alc260_pcm_digital_playback alc880_pcm_digital_playback
5970#define alc260_pcm_digital_capture alc880_pcm_digital_capture
5971
df694daa
KY
5972/*
5973 * for BIOS auto-configuration
5974 */
16ded525 5975
df694daa 5976static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
863b4518 5977 const char *pfx, int *vol_bits)
df694daa
KY
5978{
5979 hda_nid_t nid_vol;
5980 unsigned long vol_val, sw_val;
df694daa
KY
5981 int err;
5982
5983 if (nid >= 0x0f && nid < 0x11) {
5984 nid_vol = nid - 0x7;
5985 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
5986 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
5987 } else if (nid == 0x11) {
5988 nid_vol = nid - 0x7;
5989 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
5990 sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
5991 } else if (nid >= 0x12 && nid <= 0x15) {
5992 nid_vol = 0x08;
5993 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
5994 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
5995 } else
5996 return 0; /* N/A */
ea1fb29a 5997
863b4518
TI
5998 if (!(*vol_bits & (1 << nid_vol))) {
5999 /* first control for the volume widget */
0afe5f89 6000 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
863b4518
TI
6001 if (err < 0)
6002 return err;
6003 *vol_bits |= (1 << nid_vol);
6004 }
0afe5f89 6005 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
f12ab1e0 6006 if (err < 0)
df694daa
KY
6007 return err;
6008 return 1;
6009}
6010
6011/* add playback controls from the parsed DAC table */
6012static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6013 const struct auto_pin_cfg *cfg)
6014{
6015 hda_nid_t nid;
6016 int err;
863b4518 6017 int vols = 0;
df694daa
KY
6018
6019 spec->multiout.num_dacs = 1;
6020 spec->multiout.dac_nids = spec->private_dac_nids;
6021 spec->multiout.dac_nids[0] = 0x02;
6022
6023 nid = cfg->line_out_pins[0];
6024 if (nid) {
23112d6d
TI
6025 const char *pfx;
6026 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6027 pfx = "Master";
6028 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6029 pfx = "Speaker";
6030 else
6031 pfx = "Front";
6032 err = alc260_add_playback_controls(spec, nid, pfx, &vols);
df694daa
KY
6033 if (err < 0)
6034 return err;
6035 }
6036
82bc955f 6037 nid = cfg->speaker_pins[0];
df694daa 6038 if (nid) {
863b4518 6039 err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
df694daa
KY
6040 if (err < 0)
6041 return err;
6042 }
6043
eb06ed8f 6044 nid = cfg->hp_pins[0];
df694daa 6045 if (nid) {
863b4518
TI
6046 err = alc260_add_playback_controls(spec, nid, "Headphone",
6047 &vols);
df694daa
KY
6048 if (err < 0)
6049 return err;
6050 }
f12ab1e0 6051 return 0;
df694daa
KY
6052}
6053
6054/* create playback/capture controls for input pins */
05f5f477 6055static int alc260_auto_create_input_ctls(struct hda_codec *codec,
df694daa
KY
6056 const struct auto_pin_cfg *cfg)
6057{
05f5f477 6058 return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
df694daa
KY
6059}
6060
6061static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6062 hda_nid_t nid, int pin_type,
6063 int sel_idx)
6064{
f6c7e546 6065 alc_set_pin_output(codec, nid, pin_type);
df694daa
KY
6066 /* need the manual connection? */
6067 if (nid >= 0x12) {
6068 int idx = nid - 0x12;
6069 snd_hda_codec_write(codec, idx + 0x0b, 0,
6070 AC_VERB_SET_CONNECT_SEL, sel_idx);
df694daa
KY
6071 }
6072}
6073
6074static void alc260_auto_init_multi_out(struct hda_codec *codec)
6075{
6076 struct alc_spec *spec = codec->spec;
6077 hda_nid_t nid;
6078
f12ab1e0 6079 nid = spec->autocfg.line_out_pins[0];
baba8ee9
TI
6080 if (nid) {
6081 int pin_type = get_pin_type(spec->autocfg.line_out_type);
6082 alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6083 }
ea1fb29a 6084
82bc955f 6085 nid = spec->autocfg.speaker_pins[0];
df694daa
KY
6086 if (nid)
6087 alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6088
eb06ed8f 6089 nid = spec->autocfg.hp_pins[0];
df694daa 6090 if (nid)
baba8ee9 6091 alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
f12ab1e0 6092}
df694daa
KY
6093
6094#define ALC260_PIN_CD_NID 0x16
6095static void alc260_auto_init_analog_input(struct hda_codec *codec)
6096{
6097 struct alc_spec *spec = codec->spec;
6098 int i;
6099
6100 for (i = 0; i < AUTO_PIN_LAST; i++) {
6101 hda_nid_t nid = spec->autocfg.input_pins[i];
6102 if (nid >= 0x12) {
23f0c048 6103 alc_set_input_pin(codec, nid, i);
e82c025b
TI
6104 if (nid != ALC260_PIN_CD_NID &&
6105 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
f12ab1e0
TI
6106 snd_hda_codec_write(codec, nid, 0,
6107 AC_VERB_SET_AMP_GAIN_MUTE,
df694daa
KY
6108 AMP_OUT_MUTE);
6109 }
6110 }
6111}
6112
6113/*
6114 * generic initialization of ADC, input mixers and output mixers
6115 */
6116static struct hda_verb alc260_volume_init_verbs[] = {
6117 /*
6118 * Unmute ADC0-1 and set the default input to mic-in
6119 */
6120 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6121 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6122 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6123 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
ea1fb29a 6124
df694daa
KY
6125 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6126 * mixer widget
f12ab1e0
TI
6127 * Note: PASD motherboards uses the Line In 2 as the input for
6128 * front panel mic (mic 2)
df694daa
KY
6129 */
6130 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
6131 /* mute analog inputs */
6132 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6133 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6134 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6135 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6136 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
df694daa
KY
6137
6138 /*
6139 * Set up output mixers (0x08 - 0x0a)
6140 */
6141 /* set vol=0 to output mixers */
6142 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6143 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6144 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6145 /* set up input amps for analog loopback */
6146 /* Amp Indices: DAC = 0, mixer = 1 */
6147 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6148 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6149 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6150 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6151 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6152 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 6153
df694daa
KY
6154 { }
6155};
6156
6157static int alc260_parse_auto_config(struct hda_codec *codec)
6158{
6159 struct alc_spec *spec = codec->spec;
df694daa
KY
6160 int err;
6161 static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6162
f12ab1e0
TI
6163 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6164 alc260_ignore);
6165 if (err < 0)
df694daa 6166 return err;
f12ab1e0
TI
6167 err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6168 if (err < 0)
4a471b7d 6169 return err;
603c4019 6170 if (!spec->kctls.list)
df694daa 6171 return 0; /* can't find valid BIOS pin config */
05f5f477 6172 err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 6173 if (err < 0)
df694daa
KY
6174 return err;
6175
6176 spec->multiout.max_channels = 2;
6177
0852d7a6 6178 if (spec->autocfg.dig_outs)
df694daa 6179 spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
603c4019 6180 if (spec->kctls.list)
d88897ea 6181 add_mixer(spec, spec->kctls.list);
df694daa 6182
d88897ea 6183 add_verb(spec, alc260_volume_init_verbs);
df694daa 6184
a1e8d2da 6185 spec->num_mux_defs = 1;
61b9b9b1 6186 spec->input_mux = &spec->private_imux[0];
df694daa 6187
4a79ba34
TI
6188 alc_ssid_check(codec, 0x10, 0x15, 0x0f);
6189
df694daa
KY
6190 return 1;
6191}
6192
ae6b813a
TI
6193/* additional initialization for auto-configuration model */
6194static void alc260_auto_init(struct hda_codec *codec)
df694daa 6195{
f6c7e546 6196 struct alc_spec *spec = codec->spec;
df694daa
KY
6197 alc260_auto_init_multi_out(codec);
6198 alc260_auto_init_analog_input(codec);
f6c7e546 6199 if (spec->unsol_event)
7fb0d78f 6200 alc_inithook(codec);
df694daa
KY
6201}
6202
cb53c626
TI
6203#ifdef CONFIG_SND_HDA_POWER_SAVE
6204static struct hda_amp_list alc260_loopbacks[] = {
6205 { 0x07, HDA_INPUT, 0 },
6206 { 0x07, HDA_INPUT, 1 },
6207 { 0x07, HDA_INPUT, 2 },
6208 { 0x07, HDA_INPUT, 3 },
6209 { 0x07, HDA_INPUT, 4 },
6210 { } /* end */
6211};
6212#endif
6213
df694daa
KY
6214/*
6215 * ALC260 configurations
6216 */
f5fcc13c
TI
6217static const char *alc260_models[ALC260_MODEL_LAST] = {
6218 [ALC260_BASIC] = "basic",
6219 [ALC260_HP] = "hp",
6220 [ALC260_HP_3013] = "hp-3013",
2922c9af 6221 [ALC260_HP_DC7600] = "hp-dc7600",
f5fcc13c
TI
6222 [ALC260_FUJITSU_S702X] = "fujitsu",
6223 [ALC260_ACER] = "acer",
bc9f98a9
KY
6224 [ALC260_WILL] = "will",
6225 [ALC260_REPLACER_672V] = "replacer",
cc959489 6226 [ALC260_FAVORIT100] = "favorit100",
7cf51e48 6227#ifdef CONFIG_SND_DEBUG
f5fcc13c 6228 [ALC260_TEST] = "test",
7cf51e48 6229#endif
f5fcc13c
TI
6230 [ALC260_AUTO] = "auto",
6231};
6232
6233static struct snd_pci_quirk alc260_cfg_tbl[] = {
bd869485 6234 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
f5fcc13c 6235 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
cc959489 6236 SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
9720b718 6237 SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
4ac55982 6238 SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
f5fcc13c 6239 SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
34ec8a0a 6240 SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
3f878308 6241 SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
f5fcc13c
TI
6242 SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6243 SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6244 SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6245 SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6246 SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6247 SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6248 SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6249 SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6250 SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
bc9f98a9 6251 SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
ac3e3741 6252 SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
df694daa
KY
6253 {}
6254};
6255
6256static struct alc_config_preset alc260_presets[] = {
6257 [ALC260_BASIC] = {
6258 .mixers = { alc260_base_output_mixer,
45bdd1c1 6259 alc260_input_mixer },
df694daa
KY
6260 .init_verbs = { alc260_init_verbs },
6261 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6262 .dac_nids = alc260_dac_nids,
f9e336f6 6263 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
df694daa
KY
6264 .adc_nids = alc260_adc_nids,
6265 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6266 .channel_mode = alc260_modes,
6267 .input_mux = &alc260_capture_source,
6268 },
6269 [ALC260_HP] = {
bec15c3a 6270 .mixers = { alc260_hp_output_mixer,
f9e336f6 6271 alc260_input_mixer },
bec15c3a
TI
6272 .init_verbs = { alc260_init_verbs,
6273 alc260_hp_unsol_verbs },
df694daa
KY
6274 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6275 .dac_nids = alc260_dac_nids,
f9e336f6
TI
6276 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6277 .adc_nids = alc260_adc_nids_alt,
df694daa
KY
6278 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6279 .channel_mode = alc260_modes,
6280 .input_mux = &alc260_capture_source,
bec15c3a
TI
6281 .unsol_event = alc260_hp_unsol_event,
6282 .init_hook = alc260_hp_automute,
df694daa 6283 },
3f878308
KY
6284 [ALC260_HP_DC7600] = {
6285 .mixers = { alc260_hp_dc7600_mixer,
f9e336f6 6286 alc260_input_mixer },
3f878308
KY
6287 .init_verbs = { alc260_init_verbs,
6288 alc260_hp_dc7600_verbs },
6289 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6290 .dac_nids = alc260_dac_nids,
f9e336f6
TI
6291 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6292 .adc_nids = alc260_adc_nids_alt,
3f878308
KY
6293 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6294 .channel_mode = alc260_modes,
6295 .input_mux = &alc260_capture_source,
6296 .unsol_event = alc260_hp_3012_unsol_event,
6297 .init_hook = alc260_hp_3012_automute,
6298 },
df694daa
KY
6299 [ALC260_HP_3013] = {
6300 .mixers = { alc260_hp_3013_mixer,
f9e336f6 6301 alc260_input_mixer },
bec15c3a
TI
6302 .init_verbs = { alc260_hp_3013_init_verbs,
6303 alc260_hp_3013_unsol_verbs },
df694daa
KY
6304 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6305 .dac_nids = alc260_dac_nids,
f9e336f6
TI
6306 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6307 .adc_nids = alc260_adc_nids_alt,
df694daa
KY
6308 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6309 .channel_mode = alc260_modes,
6310 .input_mux = &alc260_capture_source,
bec15c3a
TI
6311 .unsol_event = alc260_hp_3013_unsol_event,
6312 .init_hook = alc260_hp_3013_automute,
df694daa
KY
6313 },
6314 [ALC260_FUJITSU_S702X] = {
f9e336f6 6315 .mixers = { alc260_fujitsu_mixer },
df694daa
KY
6316 .init_verbs = { alc260_fujitsu_init_verbs },
6317 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6318 .dac_nids = alc260_dac_nids,
d57fdac0
JW
6319 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6320 .adc_nids = alc260_dual_adc_nids,
df694daa
KY
6321 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6322 .channel_mode = alc260_modes,
a1e8d2da
JW
6323 .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
6324 .input_mux = alc260_fujitsu_capture_sources,
df694daa 6325 },
0bfc90e9 6326 [ALC260_ACER] = {
f9e336f6 6327 .mixers = { alc260_acer_mixer },
0bfc90e9
JW
6328 .init_verbs = { alc260_acer_init_verbs },
6329 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6330 .dac_nids = alc260_dac_nids,
6331 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6332 .adc_nids = alc260_dual_adc_nids,
6333 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6334 .channel_mode = alc260_modes,
a1e8d2da
JW
6335 .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
6336 .input_mux = alc260_acer_capture_sources,
0bfc90e9 6337 },
cc959489
MS
6338 [ALC260_FAVORIT100] = {
6339 .mixers = { alc260_favorit100_mixer },
6340 .init_verbs = { alc260_favorit100_init_verbs },
6341 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6342 .dac_nids = alc260_dac_nids,
6343 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6344 .adc_nids = alc260_dual_adc_nids,
6345 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6346 .channel_mode = alc260_modes,
6347 .num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
6348 .input_mux = alc260_favorit100_capture_sources,
6349 },
bc9f98a9 6350 [ALC260_WILL] = {
f9e336f6 6351 .mixers = { alc260_will_mixer },
bc9f98a9
KY
6352 .init_verbs = { alc260_init_verbs, alc260_will_verbs },
6353 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6354 .dac_nids = alc260_dac_nids,
6355 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6356 .adc_nids = alc260_adc_nids,
6357 .dig_out_nid = ALC260_DIGOUT_NID,
6358 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6359 .channel_mode = alc260_modes,
6360 .input_mux = &alc260_capture_source,
6361 },
6362 [ALC260_REPLACER_672V] = {
f9e336f6 6363 .mixers = { alc260_replacer_672v_mixer },
bc9f98a9
KY
6364 .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
6365 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6366 .dac_nids = alc260_dac_nids,
6367 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6368 .adc_nids = alc260_adc_nids,
6369 .dig_out_nid = ALC260_DIGOUT_NID,
6370 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6371 .channel_mode = alc260_modes,
6372 .input_mux = &alc260_capture_source,
6373 .unsol_event = alc260_replacer_672v_unsol_event,
6374 .init_hook = alc260_replacer_672v_automute,
6375 },
7cf51e48
JW
6376#ifdef CONFIG_SND_DEBUG
6377 [ALC260_TEST] = {
f9e336f6 6378 .mixers = { alc260_test_mixer },
7cf51e48
JW
6379 .init_verbs = { alc260_test_init_verbs },
6380 .num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
6381 .dac_nids = alc260_test_dac_nids,
6382 .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
6383 .adc_nids = alc260_test_adc_nids,
6384 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6385 .channel_mode = alc260_modes,
a1e8d2da
JW
6386 .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
6387 .input_mux = alc260_test_capture_sources,
7cf51e48
JW
6388 },
6389#endif
df694daa
KY
6390};
6391
6392static int patch_alc260(struct hda_codec *codec)
1da177e4
LT
6393{
6394 struct alc_spec *spec;
df694daa 6395 int err, board_config;
1da177e4 6396
e560d8d8 6397 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1da177e4
LT
6398 if (spec == NULL)
6399 return -ENOMEM;
6400
6401 codec->spec = spec;
6402
f5fcc13c
TI
6403 board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
6404 alc260_models,
6405 alc260_cfg_tbl);
6406 if (board_config < 0) {
9a11f1aa 6407 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6c627f39 6408 codec->chip_name);
df694daa 6409 board_config = ALC260_AUTO;
16ded525 6410 }
1da177e4 6411
df694daa
KY
6412 if (board_config == ALC260_AUTO) {
6413 /* automatic parse from the BIOS config */
6414 err = alc260_parse_auto_config(codec);
6415 if (err < 0) {
6416 alc_free(codec);
6417 return err;
f12ab1e0 6418 } else if (!err) {
9c7f852e
TI
6419 printk(KERN_INFO
6420 "hda_codec: Cannot set up configuration "
6421 "from BIOS. Using base mode...\n");
df694daa
KY
6422 board_config = ALC260_BASIC;
6423 }
a9430dd8 6424 }
e9edcee0 6425
680cd536
KK
6426 err = snd_hda_attach_beep_device(codec, 0x1);
6427 if (err < 0) {
6428 alc_free(codec);
6429 return err;
6430 }
6431
df694daa 6432 if (board_config != ALC260_AUTO)
e9c364c0 6433 setup_preset(codec, &alc260_presets[board_config]);
1da177e4 6434
1da177e4
LT
6435 spec->stream_analog_playback = &alc260_pcm_analog_playback;
6436 spec->stream_analog_capture = &alc260_pcm_analog_capture;
6437
a3bcba38
TI
6438 spec->stream_digital_playback = &alc260_pcm_digital_playback;
6439 spec->stream_digital_capture = &alc260_pcm_digital_capture;
6440
4ef0ef19
TI
6441 if (!spec->adc_nids && spec->input_mux) {
6442 /* check whether NID 0x04 is valid */
6443 unsigned int wcap = get_wcaps(codec, 0x04);
a22d543a 6444 wcap = get_wcaps_type(wcap);
4ef0ef19
TI
6445 /* get type */
6446 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
6447 spec->adc_nids = alc260_adc_nids_alt;
6448 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
6449 } else {
6450 spec->adc_nids = alc260_adc_nids;
6451 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
6452 }
6453 }
b59bdf3b 6454 set_capture_mixer(codec);
45bdd1c1 6455 set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
f9e336f6 6456
2134ea4f
TI
6457 spec->vmaster_nid = 0x08;
6458
1da177e4 6459 codec->patch_ops = alc_patch_ops;
df694daa 6460 if (board_config == ALC260_AUTO)
ae6b813a 6461 spec->init_hook = alc260_auto_init;
cb53c626
TI
6462#ifdef CONFIG_SND_HDA_POWER_SAVE
6463 if (!spec->loopback.amplist)
6464 spec->loopback.amplist = alc260_loopbacks;
6465#endif
daead538 6466 codec->proc_widget_hook = print_realtek_coef;
1da177e4
LT
6467
6468 return 0;
6469}
6470
e9edcee0 6471
1da177e4 6472/*
4953550a 6473 * ALC882/883/885/888/889 support
1da177e4
LT
6474 *
6475 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
6476 * configuration. Each pin widget can choose any input DACs and a mixer.
6477 * Each ADC is connected from a mixer of all inputs. This makes possible
6478 * 6-channel independent captures.
6479 *
6480 * In addition, an independent DAC for the multi-playback (not used in this
6481 * driver yet).
6482 */
df694daa
KY
6483#define ALC882_DIGOUT_NID 0x06
6484#define ALC882_DIGIN_NID 0x0a
4953550a
TI
6485#define ALC883_DIGOUT_NID ALC882_DIGOUT_NID
6486#define ALC883_DIGIN_NID ALC882_DIGIN_NID
6487#define ALC1200_DIGOUT_NID 0x10
6488
1da177e4 6489
d2a6d7dc 6490static struct hda_channel_mode alc882_ch_modes[1] = {
1da177e4
LT
6491 { 8, NULL }
6492};
6493
4953550a 6494/* DACs */
1da177e4
LT
6495static hda_nid_t alc882_dac_nids[4] = {
6496 /* front, rear, clfe, rear_surr */
6497 0x02, 0x03, 0x04, 0x05
6498};
4953550a 6499#define alc883_dac_nids alc882_dac_nids
1da177e4 6500
4953550a 6501/* ADCs */
df694daa
KY
6502#define alc882_adc_nids alc880_adc_nids
6503#define alc882_adc_nids_alt alc880_adc_nids_alt
4953550a
TI
6504#define alc883_adc_nids alc882_adc_nids_alt
6505static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
6506static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
6507#define alc889_adc_nids alc880_adc_nids
1da177e4 6508
e1406348
TI
6509static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
6510static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
4953550a
TI
6511#define alc883_capsrc_nids alc882_capsrc_nids_alt
6512static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
6513#define alc889_capsrc_nids alc882_capsrc_nids
e1406348 6514
1da177e4
LT
6515/* input MUX */
6516/* FIXME: should be a matrix-type input source selection */
6517
6518static struct hda_input_mux alc882_capture_source = {
6519 .num_items = 4,
6520 .items = {
6521 { "Mic", 0x0 },
6522 { "Front Mic", 0x1 },
6523 { "Line", 0x2 },
6524 { "CD", 0x4 },
6525 },
6526};
41d5545d 6527
4953550a
TI
6528#define alc883_capture_source alc882_capture_source
6529
87a8c370
JK
6530static struct hda_input_mux alc889_capture_source = {
6531 .num_items = 3,
6532 .items = {
6533 { "Front Mic", 0x0 },
6534 { "Mic", 0x3 },
6535 { "Line", 0x2 },
6536 },
6537};
6538
41d5545d
KS
6539static struct hda_input_mux mb5_capture_source = {
6540 .num_items = 3,
6541 .items = {
6542 { "Mic", 0x1 },
6543 { "Line", 0x2 },
6544 { "CD", 0x4 },
6545 },
6546};
6547
4953550a
TI
6548static struct hda_input_mux alc883_3stack_6ch_intel = {
6549 .num_items = 4,
6550 .items = {
6551 { "Mic", 0x1 },
6552 { "Front Mic", 0x0 },
6553 { "Line", 0x2 },
6554 { "CD", 0x4 },
6555 },
6556};
6557
6558static struct hda_input_mux alc883_lenovo_101e_capture_source = {
6559 .num_items = 2,
6560 .items = {
6561 { "Mic", 0x1 },
6562 { "Line", 0x2 },
6563 },
6564};
6565
6566static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
6567 .num_items = 4,
6568 .items = {
6569 { "Mic", 0x0 },
6570 { "iMic", 0x1 },
6571 { "Line", 0x2 },
6572 { "CD", 0x4 },
6573 },
6574};
6575
6576static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
6577 .num_items = 2,
6578 .items = {
6579 { "Mic", 0x0 },
6580 { "Int Mic", 0x1 },
6581 },
6582};
6583
6584static struct hda_input_mux alc883_lenovo_sky_capture_source = {
6585 .num_items = 3,
6586 .items = {
6587 { "Mic", 0x0 },
6588 { "Front Mic", 0x1 },
6589 { "Line", 0x4 },
6590 },
6591};
6592
6593static struct hda_input_mux alc883_asus_eee1601_capture_source = {
6594 .num_items = 2,
6595 .items = {
6596 { "Mic", 0x0 },
6597 { "Line", 0x2 },
6598 },
6599};
6600
6601static struct hda_input_mux alc889A_mb31_capture_source = {
6602 .num_items = 2,
6603 .items = {
6604 { "Mic", 0x0 },
6605 /* Front Mic (0x01) unused */
6606 { "Line", 0x2 },
6607 /* Line 2 (0x03) unused */
6608 /* CD (0x04) unsused? */
6609 },
6610};
6611
6612/*
6613 * 2ch mode
6614 */
6615static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
6616 { 2, NULL }
6617};
6618
272a527c
KY
6619/*
6620 * 2ch mode
6621 */
6622static struct hda_verb alc882_3ST_ch2_init[] = {
6623 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6624 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6625 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6626 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6627 { } /* end */
6628};
6629
4953550a
TI
6630/*
6631 * 4ch mode
6632 */
6633static struct hda_verb alc882_3ST_ch4_init[] = {
6634 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6635 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6636 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6637 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6638 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6639 { } /* end */
6640};
6641
272a527c
KY
6642/*
6643 * 6ch mode
6644 */
6645static struct hda_verb alc882_3ST_ch6_init[] = {
6646 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6647 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6648 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6649 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6650 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6651 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6652 { } /* end */
6653};
6654
4953550a 6655static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
272a527c 6656 { 2, alc882_3ST_ch2_init },
4953550a 6657 { 4, alc882_3ST_ch4_init },
272a527c
KY
6658 { 6, alc882_3ST_ch6_init },
6659};
6660
4953550a
TI
6661#define alc883_3ST_6ch_modes alc882_3ST_6ch_modes
6662
a65cc60f 6663/*
6664 * 2ch mode
6665 */
6666static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
6667 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
6668 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6669 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6670 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6671 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6672 { } /* end */
6673};
6674
6675/*
6676 * 4ch mode
6677 */
6678static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
6679 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6680 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6681 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6682 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6683 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6684 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6685 { } /* end */
6686};
6687
6688/*
6689 * 6ch mode
6690 */
6691static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
6692 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6693 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6694 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6695 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6696 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6697 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6698 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6699 { } /* end */
6700};
6701
6702static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
6703 { 2, alc883_3ST_ch2_clevo_init },
6704 { 4, alc883_3ST_ch4_clevo_init },
6705 { 6, alc883_3ST_ch6_clevo_init },
6706};
6707
6708
df694daa
KY
6709/*
6710 * 6ch mode
6711 */
6712static struct hda_verb alc882_sixstack_ch6_init[] = {
6713 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
6714 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6715 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6716 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6717 { } /* end */
6718};
6719
6720/*
6721 * 8ch mode
6722 */
6723static struct hda_verb alc882_sixstack_ch8_init[] = {
6724 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6725 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6726 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6727 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6728 { } /* end */
6729};
6730
6731static struct hda_channel_mode alc882_sixstack_modes[2] = {
6732 { 6, alc882_sixstack_ch6_init },
6733 { 8, alc882_sixstack_ch8_init },
6734};
6735
87350ad0 6736/*
def319f9 6737 * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
87350ad0
TI
6738 */
6739
6740/*
6741 * 2ch mode
6742 */
6743static struct hda_verb alc885_mbp_ch2_init[] = {
6744 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6745 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6746 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6747 { } /* end */
6748};
6749
6750/*
a3f730af 6751 * 4ch mode
87350ad0 6752 */
a3f730af 6753static struct hda_verb alc885_mbp_ch4_init[] = {
87350ad0
TI
6754 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6755 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6756 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6757 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6758 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6759 { } /* end */
6760};
6761
a3f730af 6762static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
87350ad0 6763 { 2, alc885_mbp_ch2_init },
a3f730af 6764 { 4, alc885_mbp_ch4_init },
87350ad0
TI
6765};
6766
92b9de83
KS
6767/*
6768 * 2ch
6769 * Speakers/Woofer/HP = Front
6770 * LineIn = Input
6771 */
6772static struct hda_verb alc885_mb5_ch2_init[] = {
6773 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6774 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
6775 { } /* end */
6776};
6777
6778/*
6779 * 6ch mode
6780 * Speakers/HP = Front
6781 * Woofer = LFE
6782 * LineIn = Surround
6783 */
6784static struct hda_verb alc885_mb5_ch6_init[] = {
6785 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6786 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6787 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6788 { } /* end */
6789};
6790
6791static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
6792 { 2, alc885_mb5_ch2_init },
6793 { 6, alc885_mb5_ch6_init },
6794};
87350ad0 6795
4953550a
TI
6796
6797/*
6798 * 2ch mode
6799 */
6800static struct hda_verb alc883_4ST_ch2_init[] = {
6801 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6802 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6803 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6804 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6805 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6806 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6807 { } /* end */
6808};
6809
6810/*
6811 * 4ch mode
6812 */
6813static struct hda_verb alc883_4ST_ch4_init[] = {
6814 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6815 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6816 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6817 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6818 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6819 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6820 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6821 { } /* end */
6822};
6823
6824/*
6825 * 6ch mode
6826 */
6827static struct hda_verb alc883_4ST_ch6_init[] = {
6828 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6829 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6830 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6831 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6832 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6833 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6834 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6835 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6836 { } /* end */
6837};
6838
6839/*
6840 * 8ch mode
6841 */
6842static struct hda_verb alc883_4ST_ch8_init[] = {
6843 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6844 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6845 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
6846 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6847 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6848 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6849 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6850 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6851 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6852 { } /* end */
6853};
6854
6855static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
6856 { 2, alc883_4ST_ch2_init },
6857 { 4, alc883_4ST_ch4_init },
6858 { 6, alc883_4ST_ch6_init },
6859 { 8, alc883_4ST_ch8_init },
6860};
6861
6862
6863/*
6864 * 2ch mode
6865 */
6866static struct hda_verb alc883_3ST_ch2_intel_init[] = {
6867 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6868 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6869 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6870 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6871 { } /* end */
6872};
6873
6874/*
6875 * 4ch mode
6876 */
6877static struct hda_verb alc883_3ST_ch4_intel_init[] = {
6878 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6879 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6880 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6881 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6882 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6883 { } /* end */
6884};
6885
6886/*
6887 * 6ch mode
6888 */
6889static struct hda_verb alc883_3ST_ch6_intel_init[] = {
6890 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6891 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6892 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
6893 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6894 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6895 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6896 { } /* end */
6897};
6898
6899static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
6900 { 2, alc883_3ST_ch2_intel_init },
6901 { 4, alc883_3ST_ch4_intel_init },
6902 { 6, alc883_3ST_ch6_intel_init },
6903};
6904
dd7714c9
WF
6905/*
6906 * 2ch mode
6907 */
6908static struct hda_verb alc889_ch2_intel_init[] = {
6909 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
6910 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
6911 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
6912 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
6913 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6914 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6915 { } /* end */
6916};
6917
87a8c370
JK
6918/*
6919 * 6ch mode
6920 */
6921static struct hda_verb alc889_ch6_intel_init[] = {
dd7714c9
WF
6922 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
6923 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
6924 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
6925 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
6926 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
87a8c370
JK
6927 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6928 { } /* end */
6929};
6930
6931/*
6932 * 8ch mode
6933 */
6934static struct hda_verb alc889_ch8_intel_init[] = {
dd7714c9
WF
6935 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
6936 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
6937 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
6938 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
6939 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
87a8c370
JK
6940 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6941 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
87a8c370
JK
6942 { } /* end */
6943};
6944
dd7714c9
WF
6945static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
6946 { 2, alc889_ch2_intel_init },
87a8c370
JK
6947 { 6, alc889_ch6_intel_init },
6948 { 8, alc889_ch8_intel_init },
6949};
6950
4953550a
TI
6951/*
6952 * 6ch mode
6953 */
6954static struct hda_verb alc883_sixstack_ch6_init[] = {
6955 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
6956 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6957 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6958 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6959 { } /* end */
6960};
6961
6962/*
6963 * 8ch mode
6964 */
6965static struct hda_verb alc883_sixstack_ch8_init[] = {
6966 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6967 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6968 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6969 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6970 { } /* end */
6971};
6972
6973static struct hda_channel_mode alc883_sixstack_modes[2] = {
6974 { 6, alc883_sixstack_ch6_init },
6975 { 8, alc883_sixstack_ch8_init },
6976};
6977
6978
1da177e4
LT
6979/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
6980 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
6981 */
c8b6bf9b 6982static struct snd_kcontrol_new alc882_base_mixer[] = {
05acb863 6983 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 6984 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
05acb863 6985 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 6986 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
05acb863
TI
6987 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
6988 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
985be54b
TI
6989 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
6990 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
05acb863 6991 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
985be54b 6992 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1da177e4
LT
6993 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
6994 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
6995 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
6996 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
6997 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
6998 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 6999 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1da177e4
LT
7000 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7001 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
32360416 7002 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
1da177e4 7003 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
1da177e4
LT
7004 { } /* end */
7005};
7006
87350ad0 7007static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
a3f730af
TI
7008 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7009 HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7010 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7011 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7012 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
2134ea4f
TI
7013 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7014 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
87350ad0
TI
7015 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7016 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
2134ea4f 7017 HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
87350ad0
TI
7018 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7019 { } /* end */
7020};
41d5545d
KS
7021
7022static struct snd_kcontrol_new alc885_mb5_mixer[] = {
92b9de83
KS
7023 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7024 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7025 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7026 HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7027 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7028 HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7029 HDA_CODEC_VOLUME("HP Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7030 HDA_BIND_MUTE ("HP Playback Switch", 0x0f, 0x02, HDA_INPUT),
41d5545d
KS
7031 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7032 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7033 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7034 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7035 HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7036 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7037 { } /* end */
7038};
92b9de83 7039
bdd148a3
KY
7040static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7041 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7042 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7043 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7044 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7045 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7046 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7047 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7048 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7049 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
bdd148a3
KY
7050 { } /* end */
7051};
7052
272a527c
KY
7053static struct snd_kcontrol_new alc882_targa_mixer[] = {
7054 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7055 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7056 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7057 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7058 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7059 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7060 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7061 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7062 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
96fe7cc8 7063 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
272a527c
KY
7064 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7065 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
96fe7cc8 7066 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
272a527c
KY
7067 { } /* end */
7068};
7069
7070/* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7071 * Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7072 */
7073static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7074 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7075 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7076 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7077 HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7078 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7079 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7080 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7081 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7082 HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7083 HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7084 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7085 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
96fe7cc8 7086 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
272a527c
KY
7087 { } /* end */
7088};
7089
914759b7
TI
7090static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7091 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7092 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7093 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7094 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7095 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7096 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7097 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7098 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7099 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7100 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
914759b7
TI
7101 { } /* end */
7102};
7103
df694daa
KY
7104static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7105 {
7106 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7107 .name = "Channel Mode",
7108 .info = alc_ch_mode_info,
7109 .get = alc_ch_mode_get,
7110 .put = alc_ch_mode_put,
7111 },
7112 { } /* end */
7113};
7114
4953550a 7115static struct hda_verb alc882_base_init_verbs[] = {
1da177e4 7116 /* Front mixer: unmute input/output amp left and right (volume = 0) */
05acb863
TI
7117 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7118 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7119 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4 7120 /* Rear mixer */
05acb863
TI
7121 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7122 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7123 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4 7124 /* CLFE mixer */
05acb863
TI
7125 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7126 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7127 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4 7128 /* Side mixer */
05acb863
TI
7129 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7130 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7131 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4 7132
cb638122
TI
7133 /* mute analog input loopbacks */
7134 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7135 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7136 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7137 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7138 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7139
e9edcee0 7140 /* Front Pin: output 0 (0x0c) */
05acb863 7141 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
05acb863 7142 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 7143 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
e9edcee0 7144 /* Rear Pin: output 1 (0x0d) */
05acb863 7145 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
05acb863 7146 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 7147 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
e9edcee0 7148 /* CLFE Pin: output 2 (0x0e) */
05acb863 7149 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
05acb863 7150 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 7151 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
e9edcee0 7152 /* Side Pin: output 3 (0x0f) */
05acb863 7153 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
05acb863 7154 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 7155 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
e9edcee0 7156 /* Mic (rear) pin: input vref at 80% */
16ded525 7157 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0
TI
7158 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7159 /* Front Mic pin: input vref at 80% */
16ded525 7160 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0
TI
7161 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7162 /* Line In pin: input */
05acb863 7163 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
e9edcee0
TI
7164 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7165 /* Line-2 In: Headphone output (output 0 - 0x0c) */
7166 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7167 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7168 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1da177e4 7169 /* CD pin widget for input */
05acb863 7170 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1da177e4
LT
7171
7172 /* FIXME: use matrix-type input source selection */
7173 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
1da177e4 7174 /* Input mixer2 */
05acb863
TI
7175 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7176 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7177 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7178 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
1da177e4 7179 /* Input mixer3 */
05acb863
TI
7180 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7181 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7182 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7183 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
05acb863
TI
7184 /* ADC2: mute amp left and right */
7185 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
71fe7b82 7186 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
05acb863
TI
7187 /* ADC3: mute amp left and right */
7188 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
71fe7b82 7189 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
1da177e4
LT
7190
7191 { }
7192};
7193
4953550a
TI
7194static struct hda_verb alc882_adc1_init_verbs[] = {
7195 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7196 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7197 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7198 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7199 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7200 /* ADC1: mute amp left and right */
7201 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7202 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7203 { }
7204};
7205
4b146cb0
TI
7206static struct hda_verb alc882_eapd_verbs[] = {
7207 /* change to EAPD mode */
7208 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
b373bdeb 7209 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
f12ab1e0 7210 { }
4b146cb0
TI
7211};
7212
87a8c370
JK
7213static struct hda_verb alc889_eapd_verbs[] = {
7214 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7215 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7216 { }
7217};
7218
6732bd0d
WF
7219static struct hda_verb alc_hp15_unsol_verbs[] = {
7220 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7221 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7222 {}
7223};
87a8c370
JK
7224
7225static struct hda_verb alc885_init_verbs[] = {
7226 /* Front mixer: unmute input/output amp left and right (volume = 0) */
7227 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7228 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7229 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7230 /* Rear mixer */
7231 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7232 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7233 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7234 /* CLFE mixer */
7235 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7236 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7237 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7238 /* Side mixer */
7239 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7240 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7241 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7242
7243 /* mute analog input loopbacks */
7244 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7245 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7246 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7247
7248 /* Front HP Pin: output 0 (0x0c) */
6732bd0d 7249 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
87a8c370
JK
7250 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7251 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7252 /* Front Pin: output 0 (0x0c) */
7253 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7254 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7255 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7256 /* Rear Pin: output 1 (0x0d) */
7257 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7258 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7259 {0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
7260 /* CLFE Pin: output 2 (0x0e) */
7261 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7262 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7263 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7264 /* Side Pin: output 3 (0x0f) */
7265 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7266 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7267 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7268 /* Mic (rear) pin: input vref at 80% */
7269 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7270 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7271 /* Front Mic pin: input vref at 80% */
7272 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7273 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7274 /* Line In pin: input */
7275 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7276 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7277
7278 /* Mixer elements: 0x18, , 0x1a, 0x1b */
7279 /* Input mixer1 */
7280 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7281 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7282 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7283 /* Input mixer2 */
7284 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7285 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7286 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7287 /* Input mixer3 */
7288 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7289 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7290 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7291 /* ADC2: mute amp left and right */
7292 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7293 /* ADC3: mute amp left and right */
7294 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7295
7296 { }
7297};
7298
7299static struct hda_verb alc885_init_input_verbs[] = {
7300 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7301 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7302 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7303 { }
7304};
7305
7306
7307/* Unmute Selector 24h and set the default input to front mic */
7308static struct hda_verb alc889_init_input_verbs[] = {
7309 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
7310 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7311 { }
7312};
7313
7314
4953550a
TI
7315#define alc883_init_verbs alc882_base_init_verbs
7316
9102cd1c
TD
7317/* Mac Pro test */
7318static struct snd_kcontrol_new alc882_macpro_mixer[] = {
7319 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7320 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7321 HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
7322 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
7323 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
45bdd1c1 7324 /* FIXME: this looks suspicious...
d355c82a
JK
7325 HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
7326 HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
45bdd1c1 7327 */
9102cd1c
TD
7328 { } /* end */
7329};
7330
7331static struct hda_verb alc882_macpro_init_verbs[] = {
7332 /* Front mixer: unmute input/output amp left and right (volume = 0) */
7333 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7334 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7335 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7336 /* Front Pin: output 0 (0x0c) */
7337 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7338 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7339 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7340 /* Front Mic pin: input vref at 80% */
7341 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7342 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7343 /* Speaker: output */
7344 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7345 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7346 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
7347 /* Headphone output (output 0 - 0x0c) */
7348 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7349 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7350 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7351
7352 /* FIXME: use matrix-type input source selection */
7353 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7354 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7355 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7356 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7357 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7358 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7359 /* Input mixer2 */
7360 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7361 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7362 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7363 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7364 /* Input mixer3 */
7365 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7366 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7367 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7368 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7369 /* ADC1: mute amp left and right */
7370 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7371 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7372 /* ADC2: mute amp left and right */
7373 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7374 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7375 /* ADC3: mute amp left and right */
7376 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7377 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7378
7379 { }
7380};
f12ab1e0 7381
41d5545d
KS
7382/* Macbook 5,1 */
7383static struct hda_verb alc885_mb5_init_verbs[] = {
92b9de83
KS
7384 /* DACs */
7385 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7386 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7387 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7388 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
41d5545d 7389 /* Front mixer */
41d5545d
KS
7390 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7391 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7392 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
92b9de83
KS
7393 /* Surround mixer */
7394 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7395 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7396 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7397 /* LFE mixer */
7398 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7399 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7400 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7401 /* HP mixer */
7402 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7403 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7404 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7405 /* Front Pin (0x0c) */
41d5545d
KS
7406 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7407 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
92b9de83
KS
7408 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7409 /* LFE Pin (0x0e) */
7410 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7411 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7412 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7413 /* HP Pin (0x0f) */
41d5545d
KS
7414 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7415 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
92b9de83 7416 {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
41d5545d
KS
7417 /* Front Mic pin: input vref at 80% */
7418 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7419 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7420 /* Line In pin */
7421 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7422 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7423
7424 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7425 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7426 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7427 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7428 { }
7429};
7430
87350ad0
TI
7431/* Macbook Pro rev3 */
7432static struct hda_verb alc885_mbp3_init_verbs[] = {
7433 /* Front mixer: unmute input/output amp left and right (volume = 0) */
7434 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7435 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7436 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7437 /* Rear mixer */
7438 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7439 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7440 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
a3f730af
TI
7441 /* HP mixer */
7442 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7443 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7444 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
87350ad0
TI
7445 /* Front Pin: output 0 (0x0c) */
7446 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7447 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7448 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
a3f730af 7449 /* HP Pin: output 0 (0x0e) */
87350ad0 7450 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
a3f730af
TI
7451 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7452 {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
87350ad0
TI
7453 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7454 /* Mic (rear) pin: input vref at 80% */
7455 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7456 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7457 /* Front Mic pin: input vref at 80% */
7458 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7459 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7460 /* Line In pin: use output 1 when in LineOut mode */
7461 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7462 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7463 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7464
7465 /* FIXME: use matrix-type input source selection */
7466 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7467 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7468 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7469 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7470 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7471 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7472 /* Input mixer2 */
7473 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7474 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7475 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7476 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7477 /* Input mixer3 */
7478 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7479 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7480 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7481 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7482 /* ADC1: mute amp left and right */
7483 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7484 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7485 /* ADC2: mute amp left and right */
7486 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7487 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7488 /* ADC3: mute amp left and right */
7489 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7490 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7491
7492 { }
7493};
7494
c54728d8
NF
7495/* iMac 24 mixer. */
7496static struct snd_kcontrol_new alc885_imac24_mixer[] = {
7497 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7498 HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
7499 { } /* end */
7500};
7501
7502/* iMac 24 init verbs. */
7503static struct hda_verb alc885_imac24_init_verbs[] = {
7504 /* Internal speakers: output 0 (0x0c) */
7505 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7506 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7507 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7508 /* Internal speakers: output 0 (0x0c) */
7509 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7510 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7511 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
7512 /* Headphone: output 0 (0x0c) */
7513 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7514 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7515 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7516 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7517 /* Front Mic: input vref at 80% */
7518 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7519 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7520 { }
7521};
7522
7523/* Toggle speaker-output according to the hp-jack state */
4f5d1706 7524static void alc885_imac24_setup(struct hda_codec *codec)
c54728d8 7525{
a9fd4f3f 7526 struct alc_spec *spec = codec->spec;
c54728d8 7527
a9fd4f3f
TI
7528 spec->autocfg.hp_pins[0] = 0x14;
7529 spec->autocfg.speaker_pins[0] = 0x18;
7530 spec->autocfg.speaker_pins[1] = 0x1a;
c54728d8
NF
7531}
7532
4f5d1706 7533static void alc885_mbp3_setup(struct hda_codec *codec)
87350ad0 7534{
a9fd4f3f 7535 struct alc_spec *spec = codec->spec;
87350ad0 7536
a9fd4f3f
TI
7537 spec->autocfg.hp_pins[0] = 0x15;
7538 spec->autocfg.speaker_pins[0] = 0x14;
87350ad0
TI
7539}
7540
7541
272a527c
KY
7542static struct hda_verb alc882_targa_verbs[] = {
7543 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7544 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7545
7546 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7547 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
ea1fb29a 7548
272a527c
KY
7549 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7550 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7551 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7552
7553 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
272a527c
KY
7554 { } /* end */
7555};
7556
7557/* toggle speaker-output according to the hp-jack state */
7558static void alc882_targa_automute(struct hda_codec *codec)
7559{
a9fd4f3f
TI
7560 struct alc_spec *spec = codec->spec;
7561 alc_automute_amp(codec);
82beb8fd 7562 snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
a9fd4f3f
TI
7563 spec->jack_present ? 1 : 3);
7564}
7565
4f5d1706 7566static void alc882_targa_setup(struct hda_codec *codec)
a9fd4f3f
TI
7567{
7568 struct alc_spec *spec = codec->spec;
7569
7570 spec->autocfg.hp_pins[0] = 0x14;
7571 spec->autocfg.speaker_pins[0] = 0x1b;
272a527c
KY
7572}
7573
7574static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
7575{
a9fd4f3f 7576 if ((res >> 26) == ALC880_HP_EVENT)
272a527c 7577 alc882_targa_automute(codec);
272a527c
KY
7578}
7579
7580static struct hda_verb alc882_asus_a7j_verbs[] = {
7581 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7582 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7583
7584 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7585 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7586 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
ea1fb29a 7587
272a527c
KY
7588 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7589 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7590 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7591
7592 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7593 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7594 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7595 { } /* end */
7596};
7597
914759b7
TI
7598static struct hda_verb alc882_asus_a7m_verbs[] = {
7599 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7600 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7601
7602 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7603 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7604 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
ea1fb29a 7605
914759b7
TI
7606 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7607 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7608 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7609
7610 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7611 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7612 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7613 { } /* end */
7614};
7615
9102cd1c
TD
7616static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
7617{
7618 unsigned int gpiostate, gpiomask, gpiodir;
7619
7620 gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
7621 AC_VERB_GET_GPIO_DATA, 0);
7622
7623 if (!muted)
7624 gpiostate |= (1 << pin);
7625 else
7626 gpiostate &= ~(1 << pin);
7627
7628 gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
7629 AC_VERB_GET_GPIO_MASK, 0);
7630 gpiomask |= (1 << pin);
7631
7632 gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
7633 AC_VERB_GET_GPIO_DIRECTION, 0);
7634 gpiodir |= (1 << pin);
7635
7636
7637 snd_hda_codec_write(codec, codec->afg, 0,
7638 AC_VERB_SET_GPIO_MASK, gpiomask);
7639 snd_hda_codec_write(codec, codec->afg, 0,
7640 AC_VERB_SET_GPIO_DIRECTION, gpiodir);
7641
7642 msleep(1);
7643
7644 snd_hda_codec_write(codec, codec->afg, 0,
7645 AC_VERB_SET_GPIO_DATA, gpiostate);
7646}
7647
7debbe51
TI
7648/* set up GPIO at initialization */
7649static void alc885_macpro_init_hook(struct hda_codec *codec)
7650{
7651 alc882_gpio_mute(codec, 0, 0);
7652 alc882_gpio_mute(codec, 1, 0);
7653}
7654
7655/* set up GPIO and update auto-muting at initialization */
7656static void alc885_imac24_init_hook(struct hda_codec *codec)
7657{
7658 alc885_macpro_init_hook(codec);
4f5d1706 7659 alc_automute_amp(codec);
7debbe51
TI
7660}
7661
df694daa
KY
7662/*
7663 * generic initialization of ADC, input mixers and output mixers
7664 */
4953550a 7665static struct hda_verb alc883_auto_init_verbs[] = {
df694daa
KY
7666 /*
7667 * Unmute ADC0-2 and set the default input to mic-in
7668 */
4953550a
TI
7669 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7670 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7671 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7672 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17bba1b7 7673
4953550a
TI
7674 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
7675 * mixer widget
7676 * Note: PASD motherboards uses the Line In 2 as the input for
7677 * front panel mic (mic 2)
7678 */
7679 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
7680 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7681 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7682 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7683 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7684 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
17bba1b7 7685
4953550a
TI
7686 /*
7687 * Set up output mixers (0x0c - 0x0f)
7688 */
7689 /* set vol=0 to output mixers */
7690 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7691 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7692 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7693 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7694 /* set up input amps for analog loopback */
7695 /* Amp Indices: DAC = 0, mixer = 1 */
7696 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7697 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7698 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7699 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7700 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7701 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7702 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7703 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7704 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7705 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9c7f852e 7706
4953550a
TI
7707 /* FIXME: use matrix-type input source selection */
7708 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7709 /* Input mixer2 */
7710 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
7711 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
7712 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
7713 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
7714 /* Input mixer3 */
7715 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
7716 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
7717 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
7718 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
9c7f852e 7719
4953550a 7720 { }
9c7f852e
TI
7721};
7722
eb4c41d3
TS
7723/* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
7724static struct hda_verb alc889A_mb31_ch2_init[] = {
7725 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
7726 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7727 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
7728 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
7729 { } /* end */
7730};
7731
7732/* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
7733static struct hda_verb alc889A_mb31_ch4_init[] = {
7734 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
7735 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7736 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
7737 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
7738 { } /* end */
7739};
7740
7741/* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
7742static struct hda_verb alc889A_mb31_ch5_init[] = {
7743 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as rear */
7744 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7745 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
7746 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
7747 { } /* end */
7748};
7749
7750/* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
7751static struct hda_verb alc889A_mb31_ch6_init[] = {
7752 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as front */
7753 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Subwoofer off */
7754 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
7755 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
7756 { } /* end */
7757};
7758
7759static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
7760 { 2, alc889A_mb31_ch2_init },
7761 { 4, alc889A_mb31_ch4_init },
7762 { 5, alc889A_mb31_ch5_init },
7763 { 6, alc889A_mb31_ch6_init },
7764};
7765
b373bdeb
AN
7766static struct hda_verb alc883_medion_eapd_verbs[] = {
7767 /* eanable EAPD on medion laptop */
7768 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7769 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
7770 { }
7771};
7772
4953550a 7773#define alc883_base_mixer alc882_base_mixer
834be88d 7774
a8848bd6
AS
7775static struct snd_kcontrol_new alc883_mitac_mixer[] = {
7776 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7777 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7778 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7779 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7780 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7781 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7782 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7783 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7784 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7785 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7786 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7787 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7788 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
a8848bd6
AS
7789 { } /* end */
7790};
7791
0c4cc443 7792static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
368c7a95
J
7793 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7794 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
7795 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7796 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
7797 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7798 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7799 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7800 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7801 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
7802 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
368c7a95
J
7803 { } /* end */
7804};
7805
fb97dc67
J
7806static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
7807 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7808 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
7809 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7810 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
7811 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7812 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7813 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7814 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7815 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
7816 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
fb97dc67
J
7817 { } /* end */
7818};
7819
9c7f852e
TI
7820static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
7821 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7822 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7823 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7824 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7825 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7826 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7827 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7828 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 7829 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9c7f852e
TI
7830 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7831 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
32360416 7832 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
9c7f852e 7833 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
9c7f852e
TI
7834 { } /* end */
7835};
df694daa 7836
9c7f852e
TI
7837static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
7838 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7839 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7840 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7841 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7842 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7843 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7844 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7845 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7846 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7847 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7848 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7849 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7850 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7851 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 7852 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9c7f852e
TI
7853 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7854 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
32360416 7855 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
9c7f852e 7856 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
9c7f852e
TI
7857 { } /* end */
7858};
7859
17bba1b7
J
7860static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
7861 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7862 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7863 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7864 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7865 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
7866 HDA_OUTPUT),
7867 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7868 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7869 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7870 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7871 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7872 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7873 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7874 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7875 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7876 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
7877 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7878 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7879 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
7880 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17bba1b7
J
7881 { } /* end */
7882};
7883
87a8c370
JK
7884static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
7885 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7886 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7887 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7888 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7889 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
7890 HDA_OUTPUT),
7891 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7892 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7893 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7894 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7895 HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
7896 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7897 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7898 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7899 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
7900 HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
7901 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
7902 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7903 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
7904 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7905 { } /* end */
7906};
7907
d1d985f0 7908static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
c07584c8 7909 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
0701e064 7910 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
c07584c8 7911 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
0701e064 7912 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
c07584c8
TD
7913 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7914 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
0701e064
TI
7915 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7916 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
c07584c8
TD
7917 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7918 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7919 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7920 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7921 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7922 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 7923 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
c07584c8
TD
7924 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7925 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
32360416 7926 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
c07584c8 7927 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
c07584c8
TD
7928 { } /* end */
7929};
7930
c259249f 7931static struct snd_kcontrol_new alc883_targa_mixer[] = {
ccc656ce 7932 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
b99dba34 7933 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
ccc656ce 7934 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
b99dba34 7935 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
ccc656ce
KY
7936 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7937 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7938 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7939 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7940 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7941 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7942 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7943 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7944 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7945 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7946 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 7947 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
ccc656ce 7948 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
ccc656ce 7949 { } /* end */
f12ab1e0 7950};
ccc656ce 7951
c259249f 7952static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
ccc656ce 7953 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
b99dba34 7954 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
ccc656ce 7955 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
b99dba34 7956 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
ccc656ce
KY
7957 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7958 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7959 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 7960 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
ccc656ce 7961 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
4383fae0
J
7962 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7963 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
7964 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
ccc656ce 7965 { } /* end */
f12ab1e0 7966};
ccc656ce 7967
b99dba34
TI
7968static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
7969 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7970 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7971 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7972 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
7973 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7974 { } /* end */
7975};
7976
bc9f98a9
KY
7977static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
7978 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7979 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
86cd9298
TI
7980 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7981 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
bc9f98a9
KY
7982 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7983 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7984 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7985 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
bc9f98a9 7986 { } /* end */
f12ab1e0 7987};
bc9f98a9 7988
272a527c
KY
7989static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
7990 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7991 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
7992 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7993 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7994 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7995 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7996 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7997 HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7998 HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT),
272a527c
KY
7999 { } /* end */
8000};
8001
8002static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8003 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8004 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8005 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8006 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8007 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8008 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8009 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8010 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8011 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
272a527c 8012 { } /* end */
ea1fb29a 8013};
272a527c 8014
2880a867 8015static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
d1a991a6
KY
8016 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8017 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2880a867 8018 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2880a867
TD
8019 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8020 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
d1a991a6
KY
8021 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8022 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8023 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2880a867 8024 { } /* end */
d1a991a6 8025};
2880a867 8026
d2fd4b09
TV
8027static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8028 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8029 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8030 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8031 HDA_BIND_MUTE("LFE Playback Switch", 0x0f, 2, HDA_INPUT),
684a8842
TV
8032 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8033 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
d2fd4b09
TV
8034 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8035 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8036 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8037 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8038 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8039 { } /* end */
8040};
8041
e2757d5e
KY
8042static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8043 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8044 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8045 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8046 HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8047 HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8048 0x0d, 1, 0x0, HDA_OUTPUT),
8049 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8050 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8051 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8052 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8053 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
e2757d5e
KY
8054 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8055 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8056 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8057 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8058 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8059 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8060 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8061 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8062 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8063 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
e2757d5e
KY
8064 { } /* end */
8065};
8066
eb4c41d3
TS
8067static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8068 /* Output mixers */
8069 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8070 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8071 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8072 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8073 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8074 HDA_OUTPUT),
8075 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8076 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8077 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8078 /* Output switches */
8079 HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8080 HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8081 HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8082 /* Boost mixers */
8083 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8084 HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8085 /* Input mixers */
8086 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8087 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8088 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8089 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8090 { } /* end */
8091};
8092
3e1647c5
GG
8093static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
8094 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8095 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8096 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8097 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8098 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8099 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8100 { } /* end */
8101};
8102
e2757d5e
KY
8103static struct hda_bind_ctls alc883_bind_cap_vol = {
8104 .ops = &snd_hda_bind_vol,
8105 .values = {
8106 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8107 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8108 0
8109 },
8110};
8111
8112static struct hda_bind_ctls alc883_bind_cap_switch = {
8113 .ops = &snd_hda_bind_sw,
8114 .values = {
8115 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8116 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8117 0
8118 },
8119};
8120
8121static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
8122 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8123 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8124 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8125 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8126 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8127 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
4953550a
TI
8128 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8129 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8130 { } /* end */
8131};
df694daa 8132
4953550a
TI
8133static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
8134 HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
8135 HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
8136 {
8137 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8138 /* .name = "Capture Source", */
8139 .name = "Input Source",
8140 .count = 1,
8141 .info = alc_mux_enum_info,
8142 .get = alc_mux_enum_get,
8143 .put = alc_mux_enum_put,
8144 },
8145 { } /* end */
8146};
9c7f852e 8147
4953550a
TI
8148static struct snd_kcontrol_new alc883_chmode_mixer[] = {
8149 {
8150 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8151 .name = "Channel Mode",
8152 .info = alc_ch_mode_info,
8153 .get = alc_ch_mode_get,
8154 .put = alc_ch_mode_put,
8155 },
8156 { } /* end */
9c7f852e
TI
8157};
8158
a8848bd6 8159/* toggle speaker-output according to the hp-jack state */
4f5d1706 8160static void alc883_mitac_setup(struct hda_codec *codec)
a8848bd6 8161{
a9fd4f3f 8162 struct alc_spec *spec = codec->spec;
a8848bd6 8163
a9fd4f3f
TI
8164 spec->autocfg.hp_pins[0] = 0x15;
8165 spec->autocfg.speaker_pins[0] = 0x14;
8166 spec->autocfg.speaker_pins[1] = 0x17;
a8848bd6
AS
8167}
8168
8169/* auto-toggle front mic */
8170/*
8171static void alc883_mitac_mic_automute(struct hda_codec *codec)
8172{
864f92be 8173 unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0;
a8848bd6 8174
a8848bd6
AS
8175 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
8176}
8177*/
8178
a8848bd6
AS
8179static struct hda_verb alc883_mitac_verbs[] = {
8180 /* HP */
8181 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8182 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8183 /* Subwoofer */
8184 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8185 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8186
8187 /* enable unsolicited event */
8188 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8189 /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
8190
8191 { } /* end */
8192};
8193
a65cc60f 8194static struct hda_verb alc883_clevo_m540r_verbs[] = {
8195 /* HP */
8196 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8197 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8198 /* Int speaker */
8199 /*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
8200
8201 /* enable unsolicited event */
8202 /*
8203 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8204 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8205 */
8206
8207 { } /* end */
8208};
8209
0c4cc443 8210static struct hda_verb alc883_clevo_m720_verbs[] = {
368c7a95
J
8211 /* HP */
8212 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8213 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8214 /* Int speaker */
8215 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
8216 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8217
8218 /* enable unsolicited event */
8219 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
0c4cc443 8220 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
368c7a95
J
8221
8222 { } /* end */
8223};
8224
fb97dc67
J
8225static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
8226 /* HP */
8227 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8228 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8229 /* Subwoofer */
8230 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
8231 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8232
8233 /* enable unsolicited event */
8234 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8235
8236 { } /* end */
8237};
8238
c259249f 8239static struct hda_verb alc883_targa_verbs[] = {
ccc656ce
KY
8240 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8241 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8242
8243 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8244 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
ea1fb29a 8245
64a8be74
DH
8246/* Connect Line-Out side jack (SPDIF) to Side */
8247 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8248 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8249 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8250/* Connect Mic jack to CLFE */
8251 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8252 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8253 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
8254/* Connect Line-in jack to Surround */
8255 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8256 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8257 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8258/* Connect HP out jack to Front */
8259 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8260 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8261 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
ccc656ce
KY
8262
8263 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
ccc656ce
KY
8264
8265 { } /* end */
8266};
8267
bc9f98a9
KY
8268static struct hda_verb alc883_lenovo_101e_verbs[] = {
8269 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8270 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
8271 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
8272 { } /* end */
8273};
8274
272a527c
KY
8275static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
8276 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8277 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8278 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8279 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8280 { } /* end */
8281};
8282
8283static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
8284 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8285 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8286 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8287 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
8288 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8289 { } /* end */
8290};
8291
189609ae
KY
8292static struct hda_verb alc883_haier_w66_verbs[] = {
8293 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8294 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8295
8296 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8297
8298 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8299 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8300 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8301 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8302 { } /* end */
8303};
8304
e2757d5e
KY
8305static struct hda_verb alc888_lenovo_sky_verbs[] = {
8306 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8307 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8308 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8309 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8310 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8311 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8312 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8313 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8314 { } /* end */
8315};
8316
8718b700
HRK
8317static struct hda_verb alc888_6st_dell_verbs[] = {
8318 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8319 { }
8320};
8321
3e1647c5
GG
8322static struct hda_verb alc883_vaiott_verbs[] = {
8323 /* HP */
8324 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8325 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8326
8327 /* enable unsolicited event */
8328 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8329
8330 { } /* end */
8331};
8332
4f5d1706 8333static void alc888_3st_hp_setup(struct hda_codec *codec)
8718b700 8334{
a9fd4f3f 8335 struct alc_spec *spec = codec->spec;
8718b700 8336
a9fd4f3f
TI
8337 spec->autocfg.hp_pins[0] = 0x1b;
8338 spec->autocfg.speaker_pins[0] = 0x14;
8339 spec->autocfg.speaker_pins[1] = 0x16;
8340 spec->autocfg.speaker_pins[2] = 0x18;
8718b700
HRK
8341}
8342
4723c022 8343static struct hda_verb alc888_3st_hp_verbs[] = {
8341de60 8344 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */
f32a19e3
HRK
8345 {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */
8346 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */
5795b9e6 8347 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8718b700 8348 { } /* end */
5795b9e6
CM
8349};
8350
3ea0d7cf
HRK
8351/*
8352 * 2ch mode
8353 */
4723c022 8354static struct hda_verb alc888_3st_hp_2ch_init[] = {
8341de60
CM
8355 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8356 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8357 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
8358 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
3ea0d7cf 8359 { } /* end */
8341de60
CM
8360};
8361
3ea0d7cf
HRK
8362/*
8363 * 4ch mode
8364 */
8365static struct hda_verb alc888_3st_hp_4ch_init[] = {
8366 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8367 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8368 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8369 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8370 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8371 { } /* end */
8372};
8373
8374/*
8375 * 6ch mode
8376 */
4723c022 8377static struct hda_verb alc888_3st_hp_6ch_init[] = {
8341de60
CM
8378 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8379 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
3ea0d7cf 8380 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
8341de60
CM
8381 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8382 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
3ea0d7cf
HRK
8383 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8384 { } /* end */
8341de60
CM
8385};
8386
3ea0d7cf 8387static struct hda_channel_mode alc888_3st_hp_modes[3] = {
4723c022 8388 { 2, alc888_3st_hp_2ch_init },
3ea0d7cf 8389 { 4, alc888_3st_hp_4ch_init },
4723c022 8390 { 6, alc888_3st_hp_6ch_init },
8341de60
CM
8391};
8392
272a527c
KY
8393/* toggle front-jack and RCA according to the hp-jack state */
8394static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
8395{
864f92be 8396 unsigned int present = snd_hda_jack_detect(codec, 0x1b);
ea1fb29a 8397
47fd830a
TI
8398 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8399 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8400 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8401 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
272a527c
KY
8402}
8403
8404/* toggle RCA according to the front-jack state */
8405static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
8406{
864f92be 8407 unsigned int present = snd_hda_jack_detect(codec, 0x14);
ea1fb29a 8408
47fd830a
TI
8409 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8410 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
272a527c 8411}
47fd830a 8412
272a527c
KY
8413static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
8414 unsigned int res)
8415{
8416 if ((res >> 26) == ALC880_HP_EVENT)
8417 alc888_lenovo_ms7195_front_automute(codec);
8418 if ((res >> 26) == ALC880_FRONT_EVENT)
8419 alc888_lenovo_ms7195_rca_automute(codec);
8420}
8421
8422static struct hda_verb alc883_medion_md2_verbs[] = {
8423 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8424 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8425
8426 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8427
8428 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8429 { } /* end */
8430};
8431
8432/* toggle speaker-output according to the hp-jack state */
4f5d1706 8433static void alc883_medion_md2_setup(struct hda_codec *codec)
272a527c 8434{
a9fd4f3f 8435 struct alc_spec *spec = codec->spec;
272a527c 8436
a9fd4f3f
TI
8437 spec->autocfg.hp_pins[0] = 0x14;
8438 spec->autocfg.speaker_pins[0] = 0x15;
272a527c
KY
8439}
8440
ccc656ce 8441/* toggle speaker-output according to the hp-jack state */
c259249f
SA
8442#define alc883_targa_init_hook alc882_targa_init_hook
8443#define alc883_targa_unsol_event alc882_targa_unsol_event
368c7a95 8444
0c4cc443
HRK
8445static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
8446{
8447 unsigned int present;
8448
d56757ab 8449 present = snd_hda_jack_detect(codec, 0x18);
0c4cc443
HRK
8450 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
8451 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8452}
8453
4f5d1706 8454static void alc883_clevo_m720_setup(struct hda_codec *codec)
0c4cc443 8455{
a9fd4f3f
TI
8456 struct alc_spec *spec = codec->spec;
8457
8458 spec->autocfg.hp_pins[0] = 0x15;
8459 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
8460}
8461
8462static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
8463{
a9fd4f3f 8464 alc_automute_amp(codec);
0c4cc443
HRK
8465 alc883_clevo_m720_mic_automute(codec);
8466}
8467
8468static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
368c7a95
J
8469 unsigned int res)
8470{
0c4cc443 8471 switch (res >> 26) {
0c4cc443
HRK
8472 case ALC880_MIC_EVENT:
8473 alc883_clevo_m720_mic_automute(codec);
8474 break;
a9fd4f3f
TI
8475 default:
8476 alc_automute_amp_unsol_event(codec, res);
8477 break;
0c4cc443 8478 }
368c7a95
J
8479}
8480
fb97dc67 8481/* toggle speaker-output according to the hp-jack state */
4f5d1706 8482static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
fb97dc67 8483{
a9fd4f3f 8484 struct alc_spec *spec = codec->spec;
fb97dc67 8485
a9fd4f3f
TI
8486 spec->autocfg.hp_pins[0] = 0x14;
8487 spec->autocfg.speaker_pins[0] = 0x15;
fb97dc67
J
8488}
8489
4f5d1706 8490static void alc883_haier_w66_setup(struct hda_codec *codec)
fb97dc67 8491{
a9fd4f3f 8492 struct alc_spec *spec = codec->spec;
189609ae 8493
a9fd4f3f
TI
8494 spec->autocfg.hp_pins[0] = 0x1b;
8495 spec->autocfg.speaker_pins[0] = 0x14;
189609ae
KY
8496}
8497
bc9f98a9
KY
8498static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
8499{
864f92be 8500 int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
bc9f98a9 8501
47fd830a
TI
8502 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8503 HDA_AMP_MUTE, bits);
bc9f98a9
KY
8504}
8505
8506static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
8507{
864f92be 8508 int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
bc9f98a9 8509
47fd830a
TI
8510 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8511 HDA_AMP_MUTE, bits);
8512 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8513 HDA_AMP_MUTE, bits);
bc9f98a9
KY
8514}
8515
8516static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
8517 unsigned int res)
8518{
8519 if ((res >> 26) == ALC880_HP_EVENT)
8520 alc883_lenovo_101e_all_automute(codec);
8521 if ((res >> 26) == ALC880_FRONT_EVENT)
8522 alc883_lenovo_101e_ispeaker_automute(codec);
8523}
8524
676a9b53 8525/* toggle speaker-output according to the hp-jack state */
4f5d1706 8526static void alc883_acer_aspire_setup(struct hda_codec *codec)
676a9b53 8527{
a9fd4f3f 8528 struct alc_spec *spec = codec->spec;
676a9b53 8529
a9fd4f3f
TI
8530 spec->autocfg.hp_pins[0] = 0x14;
8531 spec->autocfg.speaker_pins[0] = 0x15;
8532 spec->autocfg.speaker_pins[1] = 0x16;
676a9b53
TI
8533}
8534
d1a991a6
KY
8535static struct hda_verb alc883_acer_eapd_verbs[] = {
8536 /* HP Pin: output 0 (0x0c) */
8537 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8538 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8539 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8540 /* Front Pin: output 0 (0x0c) */
676a9b53
TI
8541 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8542 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
d1a991a6 8543 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
d1a991a6
KY
8544 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
8545 /* eanable EAPD on medion laptop */
8546 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8547 {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
676a9b53
TI
8548 /* enable unsolicited event */
8549 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
d1a991a6
KY
8550 { }
8551};
8552
fc86f954
DK
8553static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
8554 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8555 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8556 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8557 { } /* end */
8558};
8559
4f5d1706 8560static void alc888_6st_dell_setup(struct hda_codec *codec)
5795b9e6 8561{
a9fd4f3f 8562 struct alc_spec *spec = codec->spec;
5795b9e6 8563
a9fd4f3f
TI
8564 spec->autocfg.hp_pins[0] = 0x1b;
8565 spec->autocfg.speaker_pins[0] = 0x14;
8566 spec->autocfg.speaker_pins[1] = 0x15;
8567 spec->autocfg.speaker_pins[2] = 0x16;
8568 spec->autocfg.speaker_pins[3] = 0x17;
5795b9e6
CM
8569}
8570
4f5d1706 8571static void alc888_lenovo_sky_setup(struct hda_codec *codec)
e2757d5e 8572{
a9fd4f3f 8573 struct alc_spec *spec = codec->spec;
e2757d5e 8574
a9fd4f3f
TI
8575 spec->autocfg.hp_pins[0] = 0x1b;
8576 spec->autocfg.speaker_pins[0] = 0x14;
8577 spec->autocfg.speaker_pins[1] = 0x15;
8578 spec->autocfg.speaker_pins[2] = 0x16;
8579 spec->autocfg.speaker_pins[3] = 0x17;
8580 spec->autocfg.speaker_pins[4] = 0x1a;
e2757d5e
KY
8581}
8582
4f5d1706 8583static void alc883_vaiott_setup(struct hda_codec *codec)
3e1647c5
GG
8584{
8585 struct alc_spec *spec = codec->spec;
8586
8587 spec->autocfg.hp_pins[0] = 0x15;
8588 spec->autocfg.speaker_pins[0] = 0x14;
8589 spec->autocfg.speaker_pins[1] = 0x17;
3e1647c5
GG
8590}
8591
e2757d5e
KY
8592static struct hda_verb alc888_asus_m90v_verbs[] = {
8593 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8594 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8595 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8596 /* enable unsolicited event */
8597 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8598 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8599 { } /* end */
8600};
8601
4f5d1706 8602static void alc883_mode2_setup(struct hda_codec *codec)
e2757d5e 8603{
a9fd4f3f 8604 struct alc_spec *spec = codec->spec;
e2757d5e 8605
a9fd4f3f
TI
8606 spec->autocfg.hp_pins[0] = 0x1b;
8607 spec->autocfg.speaker_pins[0] = 0x14;
8608 spec->autocfg.speaker_pins[1] = 0x15;
8609 spec->autocfg.speaker_pins[2] = 0x16;
4f5d1706
TI
8610 spec->ext_mic.pin = 0x18;
8611 spec->int_mic.pin = 0x19;
8612 spec->ext_mic.mux_idx = 0;
8613 spec->int_mic.mux_idx = 1;
8614 spec->auto_mic = 1;
e2757d5e
KY
8615}
8616
8617static struct hda_verb alc888_asus_eee1601_verbs[] = {
8618 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8619 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8620 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8621 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8622 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8623 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
8624 {0x20, AC_VERB_SET_PROC_COEF, 0x0838},
8625 /* enable unsolicited event */
8626 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8627 { } /* end */
8628};
8629
e2757d5e
KY
8630static void alc883_eee1601_inithook(struct hda_codec *codec)
8631{
a9fd4f3f
TI
8632 struct alc_spec *spec = codec->spec;
8633
8634 spec->autocfg.hp_pins[0] = 0x14;
8635 spec->autocfg.speaker_pins[0] = 0x1b;
8636 alc_automute_pin(codec);
e2757d5e
KY
8637}
8638
eb4c41d3
TS
8639static struct hda_verb alc889A_mb31_verbs[] = {
8640 /* Init rear pin (used as headphone output) */
8641 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */
8642 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Connect to front */
8643 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8644 /* Init line pin (used as output in 4ch and 6ch mode) */
8645 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, /* Connect to CLFE */
8646 /* Init line 2 pin (used as headphone out by default) */
8647 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Use as input */
8648 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
8649 { } /* end */
8650};
8651
8652/* Mute speakers according to the headphone jack state */
8653static void alc889A_mb31_automute(struct hda_codec *codec)
8654{
8655 unsigned int present;
8656
8657 /* Mute only in 2ch or 4ch mode */
8658 if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
8659 == 0x00) {
864f92be 8660 present = snd_hda_jack_detect(codec, 0x15);
eb4c41d3
TS
8661 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8662 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8663 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
8664 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8665 }
8666}
8667
8668static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
8669{
8670 if ((res >> 26) == ALC880_HP_EVENT)
8671 alc889A_mb31_automute(codec);
8672}
8673
4953550a 8674
cb53c626 8675#ifdef CONFIG_SND_HDA_POWER_SAVE
4953550a 8676#define alc882_loopbacks alc880_loopbacks
cb53c626
TI
8677#endif
8678
def319f9 8679/* pcm configuration: identical with ALC880 */
4953550a
TI
8680#define alc882_pcm_analog_playback alc880_pcm_analog_playback
8681#define alc882_pcm_analog_capture alc880_pcm_analog_capture
8682#define alc882_pcm_digital_playback alc880_pcm_digital_playback
8683#define alc882_pcm_digital_capture alc880_pcm_digital_capture
8684
8685static hda_nid_t alc883_slave_dig_outs[] = {
8686 ALC1200_DIGOUT_NID, 0,
8687};
8688
8689static hda_nid_t alc1200_slave_dig_outs[] = {
8690 ALC883_DIGOUT_NID, 0,
8691};
9c7f852e
TI
8692
8693/*
8694 * configuration and preset
8695 */
4953550a
TI
8696static const char *alc882_models[ALC882_MODEL_LAST] = {
8697 [ALC882_3ST_DIG] = "3stack-dig",
8698 [ALC882_6ST_DIG] = "6stack-dig",
8699 [ALC882_ARIMA] = "arima",
8700 [ALC882_W2JC] = "w2jc",
8701 [ALC882_TARGA] = "targa",
8702 [ALC882_ASUS_A7J] = "asus-a7j",
8703 [ALC882_ASUS_A7M] = "asus-a7m",
8704 [ALC885_MACPRO] = "macpro",
8705 [ALC885_MB5] = "mb5",
8706 [ALC885_MBP3] = "mbp3",
8707 [ALC885_IMAC24] = "imac24",
8708 [ALC883_3ST_2ch_DIG] = "3stack-2ch-dig",
f5fcc13c
TI
8709 [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig",
8710 [ALC883_3ST_6ch] = "3stack-6ch",
4953550a 8711 [ALC883_6ST_DIG] = "alc883-6stack-dig",
f5fcc13c
TI
8712 [ALC883_TARGA_DIG] = "targa-dig",
8713 [ALC883_TARGA_2ch_DIG] = "targa-2ch-dig",
64a8be74 8714 [ALC883_TARGA_8ch_DIG] = "targa-8ch-dig",
f5fcc13c 8715 [ALC883_ACER] = "acer",
2880a867 8716 [ALC883_ACER_ASPIRE] = "acer-aspire",
5b2d1eca 8717 [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g",
b1a91469 8718 [ALC888_ACER_ASPIRE_6530G] = "acer-aspire-6530g",
3b315d70 8719 [ALC888_ACER_ASPIRE_8930G] = "acer-aspire-8930g",
fc86f954 8720 [ALC888_ACER_ASPIRE_7730G] = "acer-aspire-7730g",
f5fcc13c 8721 [ALC883_MEDION] = "medion",
272a527c 8722 [ALC883_MEDION_MD2] = "medion-md2",
f5fcc13c 8723 [ALC883_LAPTOP_EAPD] = "laptop-eapd",
bc9f98a9 8724 [ALC883_LENOVO_101E_2ch] = "lenovo-101e",
272a527c
KY
8725 [ALC883_LENOVO_NB0763] = "lenovo-nb0763",
8726 [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
e2757d5e 8727 [ALC888_LENOVO_SKY] = "lenovo-sky",
189609ae 8728 [ALC883_HAIER_W66] = "haier-w66",
4723c022 8729 [ALC888_3ST_HP] = "3stack-hp",
5795b9e6 8730 [ALC888_6ST_DELL] = "6stack-dell",
a8848bd6 8731 [ALC883_MITAC] = "mitac",
a65cc60f 8732 [ALC883_CLEVO_M540R] = "clevo-m540r",
0c4cc443 8733 [ALC883_CLEVO_M720] = "clevo-m720",
fb97dc67 8734 [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
ef8ef5fb 8735 [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
17bba1b7 8736 [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel",
87a8c370
JK
8737 [ALC889A_INTEL] = "intel-alc889a",
8738 [ALC889_INTEL] = "intel-x58",
3ab90935 8739 [ALC1200_ASUS_P5Q] = "asus-p5q",
eb4c41d3 8740 [ALC889A_MB31] = "mb31",
3e1647c5 8741 [ALC883_SONY_VAIO_TT] = "sony-vaio-tt",
4953550a 8742 [ALC882_AUTO] = "auto",
f5fcc13c
TI
8743};
8744
4953550a
TI
8745static struct snd_pci_quirk alc882_cfg_tbl[] = {
8746 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
8747
ac3e3741 8748 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
69e50282 8749 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
9b6682ff 8750 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
ac3e3741
TI
8751 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
8752 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
0b18cb18 8753 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
5b2d1eca
VP
8754 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
8755 ALC888_ACER_ASPIRE_4930G),
a8e4f9dd 8756 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
f2624791 8757 ALC888_ACER_ASPIRE_6530G),
3b315d70
HM
8758 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
8759 ALC888_ACER_ASPIRE_8930G),
e46b0c8c
TI
8760 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
8761 ALC888_ACER_ASPIRE_8930G),
4953550a
TI
8762 SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
8763 SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
a8e4f9dd 8764 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
dde65356 8765 ALC888_ACER_ASPIRE_6530G),
cc374c47 8766 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
d2fd4b09 8767 ALC888_ACER_ASPIRE_6530G),
fc86f954
DK
8768 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
8769 ALC888_ACER_ASPIRE_7730G),
22b530e0
TI
8770 /* default Acer -- disabled as it causes more problems.
8771 * model=auto should work fine now
8772 */
8773 /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
4953550a 8774
5795b9e6 8775 SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
4953550a 8776
febe3375 8777 SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
ac3e3741
TI
8778 SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
8779 SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
5d85f8d0 8780 SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
06bf3e15 8781 SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
7ec30f0e 8782 SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
4953550a
TI
8783
8784 SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
8785 SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
8786 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
a01c30cb 8787 SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
4953550a
TI
8788 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
8789 SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
8790 SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
ac3e3741 8791 SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
44a678d0 8792 SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
3ab90935 8793 SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
e2757d5e 8794 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
4953550a
TI
8795
8796 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
97ec710c 8797 SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
4953550a 8798 SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
2de686d2 8799 SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
ac3e3741
TI
8800 SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
8801 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
e2757d5e 8802 SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
ac3e3741 8803 SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
4953550a
TI
8804 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
8805
6f3bf657 8806 SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
bba8dee7 8807 SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
ac3e3741 8808 SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
4953550a 8809 SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */
4383fae0 8810 SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC883_TARGA_2ch_DIG),
4953550a 8811 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
dd146a60 8812 SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
82808236 8813 SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
f5fcc13c 8814 SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
ac3e3741 8815 SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
f5fcc13c
TI
8816 SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
8817 SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
ac3e3741 8818 SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
64ca1c29 8819 SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
b1e4422f 8820 SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
f5fcc13c
TI
8821 SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
8822 SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
8823 SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
64a8be74 8824 SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
ac3e3741
TI
8825 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
8826 SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
8827 SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
ee09543c 8828 SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
86d34b7e 8829 SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
ac3e3741
TI
8830 SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
8831 SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
df01b8af 8832 SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
f5fcc13c 8833 SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
b1e4422f 8834 SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
4953550a 8835
ac3e3741 8836 SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
0c4cc443
HRK
8837 SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
8838 SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
a65cc60f 8839 SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
dea0a509 8840 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
e60623b4 8841 SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
4953550a 8842 /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
f5fcc13c 8843 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
bfb53037 8844 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
f67d8176 8845 ALC883_FUJITSU_PI2515),
bfb53037 8846 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
ef8ef5fb 8847 ALC888_FUJITSU_XA3530),
272a527c 8848 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
272a527c 8849 SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
ac3e3741
TI
8850 SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
8851 SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
e2757d5e 8852 SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
272a527c 8853 SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
959973b9 8854 SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
0b167bf4 8855 SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
189609ae 8856 SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
4953550a 8857
17bba1b7
J
8858 SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
8859 SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
2de686d2 8860 SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
87a8c370
JK
8861 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
8862 SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
8863 SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
ac3e3741 8864 SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch),
9c7f852e 8865
4953550a 8866 {}
f3cd3f5d
WF
8867};
8868
4953550a
TI
8869/* codec SSID table for Intel Mac */
8870static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
8871 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
8872 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
8873 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
8874 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
8875 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
8876 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
8877 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
8878 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
8879 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
8880 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
8881 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
46ef6ec9
DC
8882 /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
8883 * so apparently no perfect solution yet
4953550a
TI
8884 */
8885 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
46ef6ec9 8886 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
4953550a 8887 {} /* terminator */
b25c9da1
WF
8888};
8889
4953550a
TI
8890static struct alc_config_preset alc882_presets[] = {
8891 [ALC882_3ST_DIG] = {
8892 .mixers = { alc882_base_mixer },
8ab9e0af
TI
8893 .init_verbs = { alc882_base_init_verbs,
8894 alc882_adc1_init_verbs },
4953550a
TI
8895 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
8896 .dac_nids = alc882_dac_nids,
8897 .dig_out_nid = ALC882_DIGOUT_NID,
8898 .dig_in_nid = ALC882_DIGIN_NID,
8899 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
8900 .channel_mode = alc882_ch_modes,
8901 .need_dac_fix = 1,
8902 .input_mux = &alc882_capture_source,
8903 },
8904 [ALC882_6ST_DIG] = {
8905 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
8ab9e0af
TI
8906 .init_verbs = { alc882_base_init_verbs,
8907 alc882_adc1_init_verbs },
4953550a
TI
8908 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
8909 .dac_nids = alc882_dac_nids,
8910 .dig_out_nid = ALC882_DIGOUT_NID,
8911 .dig_in_nid = ALC882_DIGIN_NID,
8912 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
8913 .channel_mode = alc882_sixstack_modes,
8914 .input_mux = &alc882_capture_source,
8915 },
8916 [ALC882_ARIMA] = {
8917 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
8ab9e0af
TI
8918 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
8919 alc882_eapd_verbs },
4953550a
TI
8920 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
8921 .dac_nids = alc882_dac_nids,
8922 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
8923 .channel_mode = alc882_sixstack_modes,
8924 .input_mux = &alc882_capture_source,
8925 },
8926 [ALC882_W2JC] = {
8927 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
8ab9e0af
TI
8928 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
8929 alc882_eapd_verbs, alc880_gpio1_init_verbs },
4953550a
TI
8930 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
8931 .dac_nids = alc882_dac_nids,
8932 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
8933 .channel_mode = alc880_threestack_modes,
8934 .need_dac_fix = 1,
8935 .input_mux = &alc882_capture_source,
8936 .dig_out_nid = ALC882_DIGOUT_NID,
8937 },
8938 [ALC885_MBP3] = {
8939 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
8940 .init_verbs = { alc885_mbp3_init_verbs,
8941 alc880_gpio1_init_verbs },
be0ae923 8942 .num_dacs = 2,
4953550a 8943 .dac_nids = alc882_dac_nids,
be0ae923
TI
8944 .hp_nid = 0x04,
8945 .channel_mode = alc885_mbp_4ch_modes,
8946 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
4953550a
TI
8947 .input_mux = &alc882_capture_source,
8948 .dig_out_nid = ALC882_DIGOUT_NID,
8949 .dig_in_nid = ALC882_DIGIN_NID,
8950 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
8951 .setup = alc885_mbp3_setup,
8952 .init_hook = alc_automute_amp,
4953550a
TI
8953 },
8954 [ALC885_MB5] = {
8955 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
8956 .init_verbs = { alc885_mb5_init_verbs,
8957 alc880_gpio1_init_verbs },
8958 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
8959 .dac_nids = alc882_dac_nids,
8960 .channel_mode = alc885_mb5_6ch_modes,
8961 .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
8962 .input_mux = &mb5_capture_source,
8963 .dig_out_nid = ALC882_DIGOUT_NID,
8964 .dig_in_nid = ALC882_DIGIN_NID,
8965 },
8966 [ALC885_MACPRO] = {
8967 .mixers = { alc882_macpro_mixer },
8968 .init_verbs = { alc882_macpro_init_verbs },
8969 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
8970 .dac_nids = alc882_dac_nids,
8971 .dig_out_nid = ALC882_DIGOUT_NID,
8972 .dig_in_nid = ALC882_DIGIN_NID,
8973 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
8974 .channel_mode = alc882_ch_modes,
8975 .input_mux = &alc882_capture_source,
8976 .init_hook = alc885_macpro_init_hook,
8977 },
8978 [ALC885_IMAC24] = {
8979 .mixers = { alc885_imac24_mixer },
8980 .init_verbs = { alc885_imac24_init_verbs },
8981 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
8982 .dac_nids = alc882_dac_nids,
8983 .dig_out_nid = ALC882_DIGOUT_NID,
8984 .dig_in_nid = ALC882_DIGIN_NID,
8985 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
8986 .channel_mode = alc882_ch_modes,
8987 .input_mux = &alc882_capture_source,
8988 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706 8989 .setup = alc885_imac24_setup,
4953550a
TI
8990 .init_hook = alc885_imac24_init_hook,
8991 },
8992 [ALC882_TARGA] = {
8993 .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
8ab9e0af 8994 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
31909b83 8995 alc880_gpio3_init_verbs, alc882_targa_verbs},
4953550a
TI
8996 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
8997 .dac_nids = alc882_dac_nids,
8998 .dig_out_nid = ALC882_DIGOUT_NID,
8999 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9000 .adc_nids = alc882_adc_nids,
9001 .capsrc_nids = alc882_capsrc_nids,
9002 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9003 .channel_mode = alc882_3ST_6ch_modes,
9004 .need_dac_fix = 1,
9005 .input_mux = &alc882_capture_source,
9006 .unsol_event = alc882_targa_unsol_event,
4f5d1706
TI
9007 .setup = alc882_targa_setup,
9008 .init_hook = alc882_targa_automute,
4953550a
TI
9009 },
9010 [ALC882_ASUS_A7J] = {
9011 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
8ab9e0af
TI
9012 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9013 alc882_asus_a7j_verbs},
4953550a
TI
9014 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9015 .dac_nids = alc882_dac_nids,
9016 .dig_out_nid = ALC882_DIGOUT_NID,
9017 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9018 .adc_nids = alc882_adc_nids,
9019 .capsrc_nids = alc882_capsrc_nids,
9020 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9021 .channel_mode = alc882_3ST_6ch_modes,
9022 .need_dac_fix = 1,
9023 .input_mux = &alc882_capture_source,
9024 },
9025 [ALC882_ASUS_A7M] = {
9026 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
8ab9e0af
TI
9027 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9028 alc882_eapd_verbs, alc880_gpio1_init_verbs,
4953550a
TI
9029 alc882_asus_a7m_verbs },
9030 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9031 .dac_nids = alc882_dac_nids,
9032 .dig_out_nid = ALC882_DIGOUT_NID,
9033 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9034 .channel_mode = alc880_threestack_modes,
9035 .need_dac_fix = 1,
9036 .input_mux = &alc882_capture_source,
9037 },
9c7f852e
TI
9038 [ALC883_3ST_2ch_DIG] = {
9039 .mixers = { alc883_3ST_2ch_mixer },
9040 .init_verbs = { alc883_init_verbs },
9041 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9042 .dac_nids = alc883_dac_nids,
9043 .dig_out_nid = ALC883_DIGOUT_NID,
9c7f852e
TI
9044 .dig_in_nid = ALC883_DIGIN_NID,
9045 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9046 .channel_mode = alc883_3ST_2ch_modes,
9047 .input_mux = &alc883_capture_source,
9048 },
9049 [ALC883_3ST_6ch_DIG] = {
9050 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9051 .init_verbs = { alc883_init_verbs },
9052 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9053 .dac_nids = alc883_dac_nids,
9054 .dig_out_nid = ALC883_DIGOUT_NID,
9c7f852e
TI
9055 .dig_in_nid = ALC883_DIGIN_NID,
9056 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9057 .channel_mode = alc883_3ST_6ch_modes,
4e195a7b 9058 .need_dac_fix = 1,
9c7f852e 9059 .input_mux = &alc883_capture_source,
f12ab1e0 9060 },
9c7f852e
TI
9061 [ALC883_3ST_6ch] = {
9062 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9063 .init_verbs = { alc883_init_verbs },
9064 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9065 .dac_nids = alc883_dac_nids,
9c7f852e
TI
9066 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9067 .channel_mode = alc883_3ST_6ch_modes,
4e195a7b 9068 .need_dac_fix = 1,
9c7f852e 9069 .input_mux = &alc883_capture_source,
f12ab1e0 9070 },
17bba1b7
J
9071 [ALC883_3ST_6ch_INTEL] = {
9072 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
9073 .init_verbs = { alc883_init_verbs },
9074 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9075 .dac_nids = alc883_dac_nids,
9076 .dig_out_nid = ALC883_DIGOUT_NID,
9077 .dig_in_nid = ALC883_DIGIN_NID,
f3cd3f5d 9078 .slave_dig_outs = alc883_slave_dig_outs,
17bba1b7
J
9079 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
9080 .channel_mode = alc883_3ST_6ch_intel_modes,
9081 .need_dac_fix = 1,
9082 .input_mux = &alc883_3stack_6ch_intel,
9083 },
87a8c370
JK
9084 [ALC889A_INTEL] = {
9085 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
6732bd0d
WF
9086 .init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
9087 alc_hp15_unsol_verbs },
87a8c370
JK
9088 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9089 .dac_nids = alc883_dac_nids,
9090 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9091 .adc_nids = alc889_adc_nids,
9092 .dig_out_nid = ALC883_DIGOUT_NID,
9093 .dig_in_nid = ALC883_DIGIN_NID,
9094 .slave_dig_outs = alc883_slave_dig_outs,
9095 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9096 .channel_mode = alc889_8ch_intel_modes,
9097 .capsrc_nids = alc889_capsrc_nids,
9098 .input_mux = &alc889_capture_source,
4f5d1706
TI
9099 .setup = alc889_automute_setup,
9100 .init_hook = alc_automute_amp,
6732bd0d 9101 .unsol_event = alc_automute_amp_unsol_event,
87a8c370
JK
9102 .need_dac_fix = 1,
9103 },
9104 [ALC889_INTEL] = {
9105 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9106 .init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
6732bd0d 9107 alc889_eapd_verbs, alc_hp15_unsol_verbs},
87a8c370
JK
9108 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9109 .dac_nids = alc883_dac_nids,
9110 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9111 .adc_nids = alc889_adc_nids,
9112 .dig_out_nid = ALC883_DIGOUT_NID,
9113 .dig_in_nid = ALC883_DIGIN_NID,
9114 .slave_dig_outs = alc883_slave_dig_outs,
9115 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9116 .channel_mode = alc889_8ch_intel_modes,
9117 .capsrc_nids = alc889_capsrc_nids,
9118 .input_mux = &alc889_capture_source,
4f5d1706 9119 .setup = alc889_automute_setup,
6732bd0d
WF
9120 .init_hook = alc889_intel_init_hook,
9121 .unsol_event = alc_automute_amp_unsol_event,
87a8c370
JK
9122 .need_dac_fix = 1,
9123 },
9c7f852e
TI
9124 [ALC883_6ST_DIG] = {
9125 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9126 .init_verbs = { alc883_init_verbs },
9127 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9128 .dac_nids = alc883_dac_nids,
9129 .dig_out_nid = ALC883_DIGOUT_NID,
9c7f852e
TI
9130 .dig_in_nid = ALC883_DIGIN_NID,
9131 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9132 .channel_mode = alc883_sixstack_modes,
9133 .input_mux = &alc883_capture_source,
9134 },
ccc656ce 9135 [ALC883_TARGA_DIG] = {
c259249f 9136 .mixers = { alc883_targa_mixer, alc883_chmode_mixer },
005b1076
DH
9137 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9138 alc883_targa_verbs},
ccc656ce
KY
9139 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9140 .dac_nids = alc883_dac_nids,
9141 .dig_out_nid = ALC883_DIGOUT_NID,
ccc656ce
KY
9142 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9143 .channel_mode = alc883_3ST_6ch_modes,
9144 .need_dac_fix = 1,
9145 .input_mux = &alc883_capture_source,
c259249f 9146 .unsol_event = alc883_targa_unsol_event,
4f5d1706
TI
9147 .setup = alc882_targa_setup,
9148 .init_hook = alc882_targa_automute,
ccc656ce
KY
9149 },
9150 [ALC883_TARGA_2ch_DIG] = {
c259249f 9151 .mixers = { alc883_targa_2ch_mixer},
005b1076
DH
9152 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9153 alc883_targa_verbs},
ccc656ce
KY
9154 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9155 .dac_nids = alc883_dac_nids,
f9e336f6
TI
9156 .adc_nids = alc883_adc_nids_alt,
9157 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
ccc656ce 9158 .dig_out_nid = ALC883_DIGOUT_NID,
ccc656ce
KY
9159 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9160 .channel_mode = alc883_3ST_2ch_modes,
9161 .input_mux = &alc883_capture_source,
c259249f 9162 .unsol_event = alc883_targa_unsol_event,
4f5d1706
TI
9163 .setup = alc882_targa_setup,
9164 .init_hook = alc882_targa_automute,
ccc656ce 9165 },
64a8be74 9166 [ALC883_TARGA_8ch_DIG] = {
b99dba34
TI
9167 .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
9168 alc883_chmode_mixer },
64a8be74 9169 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
c259249f 9170 alc883_targa_verbs },
64a8be74
DH
9171 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9172 .dac_nids = alc883_dac_nids,
9173 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9174 .adc_nids = alc883_adc_nids_rev,
9175 .capsrc_nids = alc883_capsrc_nids_rev,
9176 .dig_out_nid = ALC883_DIGOUT_NID,
9177 .dig_in_nid = ALC883_DIGIN_NID,
9178 .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
9179 .channel_mode = alc883_4ST_8ch_modes,
9180 .need_dac_fix = 1,
9181 .input_mux = &alc883_capture_source,
c259249f 9182 .unsol_event = alc883_targa_unsol_event,
4f5d1706
TI
9183 .setup = alc882_targa_setup,
9184 .init_hook = alc882_targa_automute,
64a8be74 9185 },
bab282b9 9186 [ALC883_ACER] = {
676a9b53 9187 .mixers = { alc883_base_mixer },
bab282b9
VA
9188 /* On TravelMate laptops, GPIO 0 enables the internal speaker
9189 * and the headphone jack. Turn this on and rely on the
9190 * standard mute methods whenever the user wants to turn
9191 * these outputs off.
9192 */
9193 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
9194 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9195 .dac_nids = alc883_dac_nids,
bab282b9
VA
9196 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9197 .channel_mode = alc883_3ST_2ch_modes,
9198 .input_mux = &alc883_capture_source,
9199 },
2880a867 9200 [ALC883_ACER_ASPIRE] = {
676a9b53 9201 .mixers = { alc883_acer_aspire_mixer },
d1a991a6 9202 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
2880a867
TD
9203 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9204 .dac_nids = alc883_dac_nids,
9205 .dig_out_nid = ALC883_DIGOUT_NID,
2880a867
TD
9206 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9207 .channel_mode = alc883_3ST_2ch_modes,
9208 .input_mux = &alc883_capture_source,
a9fd4f3f 9209 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9210 .setup = alc883_acer_aspire_setup,
9211 .init_hook = alc_automute_amp,
d1a991a6 9212 },
5b2d1eca 9213 [ALC888_ACER_ASPIRE_4930G] = {
ef8ef5fb 9214 .mixers = { alc888_base_mixer,
5b2d1eca
VP
9215 alc883_chmode_mixer },
9216 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9217 alc888_acer_aspire_4930g_verbs },
9218 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9219 .dac_nids = alc883_dac_nids,
9220 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9221 .adc_nids = alc883_adc_nids_rev,
9222 .capsrc_nids = alc883_capsrc_nids_rev,
9223 .dig_out_nid = ALC883_DIGOUT_NID,
9224 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9225 .channel_mode = alc883_3ST_6ch_modes,
9226 .need_dac_fix = 1,
9227 .num_mux_defs =
ef8ef5fb
VP
9228 ARRAY_SIZE(alc888_2_capture_sources),
9229 .input_mux = alc888_2_capture_sources,
d2fd4b09 9230 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9231 .setup = alc888_acer_aspire_4930g_setup,
9232 .init_hook = alc_automute_amp,
d2fd4b09
TV
9233 },
9234 [ALC888_ACER_ASPIRE_6530G] = {
9235 .mixers = { alc888_acer_aspire_6530_mixer },
9236 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9237 alc888_acer_aspire_6530g_verbs },
9238 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9239 .dac_nids = alc883_dac_nids,
9240 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9241 .adc_nids = alc883_adc_nids_rev,
9242 .capsrc_nids = alc883_capsrc_nids_rev,
9243 .dig_out_nid = ALC883_DIGOUT_NID,
9244 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9245 .channel_mode = alc883_3ST_2ch_modes,
9246 .num_mux_defs =
9247 ARRAY_SIZE(alc888_2_capture_sources),
9248 .input_mux = alc888_acer_aspire_6530_sources,
a9fd4f3f 9249 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9250 .setup = alc888_acer_aspire_6530g_setup,
9251 .init_hook = alc_automute_amp,
5b2d1eca 9252 },
3b315d70
HM
9253 [ALC888_ACER_ASPIRE_8930G] = {
9254 .mixers = { alc888_base_mixer,
9255 alc883_chmode_mixer },
9256 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
018df418 9257 alc889_acer_aspire_8930g_verbs },
3b315d70
HM
9258 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9259 .dac_nids = alc883_dac_nids,
018df418
HM
9260 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9261 .adc_nids = alc889_adc_nids,
9262 .capsrc_nids = alc889_capsrc_nids,
3b315d70
HM
9263 .dig_out_nid = ALC883_DIGOUT_NID,
9264 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9265 .channel_mode = alc883_3ST_6ch_modes,
9266 .need_dac_fix = 1,
9267 .const_channel_count = 6,
9268 .num_mux_defs =
018df418
HM
9269 ARRAY_SIZE(alc889_capture_sources),
9270 .input_mux = alc889_capture_sources,
3b315d70 9271 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9272 .setup = alc889_acer_aspire_8930g_setup,
9273 .init_hook = alc_automute_amp,
3b315d70 9274 },
fc86f954
DK
9275 [ALC888_ACER_ASPIRE_7730G] = {
9276 .mixers = { alc883_3ST_6ch_mixer,
9277 alc883_chmode_mixer },
9278 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9279 alc888_acer_aspire_7730G_verbs },
9280 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9281 .dac_nids = alc883_dac_nids,
9282 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9283 .adc_nids = alc883_adc_nids_rev,
9284 .capsrc_nids = alc883_capsrc_nids_rev,
9285 .dig_out_nid = ALC883_DIGOUT_NID,
9286 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9287 .channel_mode = alc883_3ST_6ch_modes,
9288 .need_dac_fix = 1,
9289 .const_channel_count = 6,
9290 .input_mux = &alc883_capture_source,
9291 .unsol_event = alc_automute_amp_unsol_event,
9292 .setup = alc888_acer_aspire_6530g_setup,
9293 .init_hook = alc_automute_amp,
9294 },
c07584c8
TD
9295 [ALC883_MEDION] = {
9296 .mixers = { alc883_fivestack_mixer,
9297 alc883_chmode_mixer },
9298 .init_verbs = { alc883_init_verbs,
b373bdeb 9299 alc883_medion_eapd_verbs },
c07584c8
TD
9300 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9301 .dac_nids = alc883_dac_nids,
f9e336f6
TI
9302 .adc_nids = alc883_adc_nids_alt,
9303 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
c07584c8
TD
9304 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9305 .channel_mode = alc883_sixstack_modes,
9306 .input_mux = &alc883_capture_source,
b373bdeb 9307 },
272a527c
KY
9308 [ALC883_MEDION_MD2] = {
9309 .mixers = { alc883_medion_md2_mixer},
9310 .init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
9311 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9312 .dac_nids = alc883_dac_nids,
9313 .dig_out_nid = ALC883_DIGOUT_NID,
272a527c
KY
9314 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9315 .channel_mode = alc883_3ST_2ch_modes,
9316 .input_mux = &alc883_capture_source,
a9fd4f3f 9317 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9318 .setup = alc883_medion_md2_setup,
9319 .init_hook = alc_automute_amp,
ea1fb29a 9320 },
b373bdeb 9321 [ALC883_LAPTOP_EAPD] = {
676a9b53 9322 .mixers = { alc883_base_mixer },
b373bdeb
AN
9323 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
9324 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9325 .dac_nids = alc883_dac_nids,
b373bdeb
AN
9326 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9327 .channel_mode = alc883_3ST_2ch_modes,
9328 .input_mux = &alc883_capture_source,
9329 },
a65cc60f 9330 [ALC883_CLEVO_M540R] = {
9331 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9332 .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
9333 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9334 .dac_nids = alc883_dac_nids,
9335 .dig_out_nid = ALC883_DIGOUT_NID,
9336 .dig_in_nid = ALC883_DIGIN_NID,
9337 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
9338 .channel_mode = alc883_3ST_6ch_clevo_modes,
9339 .need_dac_fix = 1,
9340 .input_mux = &alc883_capture_source,
9341 /* This machine has the hardware HP auto-muting, thus
9342 * we need no software mute via unsol event
9343 */
9344 },
0c4cc443
HRK
9345 [ALC883_CLEVO_M720] = {
9346 .mixers = { alc883_clevo_m720_mixer },
9347 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
368c7a95
J
9348 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9349 .dac_nids = alc883_dac_nids,
9350 .dig_out_nid = ALC883_DIGOUT_NID,
9351 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9352 .channel_mode = alc883_3ST_2ch_modes,
9353 .input_mux = &alc883_capture_source,
0c4cc443 9354 .unsol_event = alc883_clevo_m720_unsol_event,
4f5d1706 9355 .setup = alc883_clevo_m720_setup,
a9fd4f3f 9356 .init_hook = alc883_clevo_m720_init_hook,
368c7a95 9357 },
bc9f98a9
KY
9358 [ALC883_LENOVO_101E_2ch] = {
9359 .mixers = { alc883_lenovo_101e_2ch_mixer},
9360 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
9361 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9362 .dac_nids = alc883_dac_nids,
f9e336f6
TI
9363 .adc_nids = alc883_adc_nids_alt,
9364 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
bc9f98a9
KY
9365 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9366 .channel_mode = alc883_3ST_2ch_modes,
9367 .input_mux = &alc883_lenovo_101e_capture_source,
9368 .unsol_event = alc883_lenovo_101e_unsol_event,
9369 .init_hook = alc883_lenovo_101e_all_automute,
9370 },
272a527c
KY
9371 [ALC883_LENOVO_NB0763] = {
9372 .mixers = { alc883_lenovo_nb0763_mixer },
9373 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
9374 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9375 .dac_nids = alc883_dac_nids,
272a527c
KY
9376 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9377 .channel_mode = alc883_3ST_2ch_modes,
9378 .need_dac_fix = 1,
9379 .input_mux = &alc883_lenovo_nb0763_capture_source,
a9fd4f3f 9380 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9381 .setup = alc883_medion_md2_setup,
9382 .init_hook = alc_automute_amp,
272a527c
KY
9383 },
9384 [ALC888_LENOVO_MS7195_DIG] = {
9385 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9386 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
9387 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9388 .dac_nids = alc883_dac_nids,
9389 .dig_out_nid = ALC883_DIGOUT_NID,
272a527c
KY
9390 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9391 .channel_mode = alc883_3ST_6ch_modes,
9392 .need_dac_fix = 1,
9393 .input_mux = &alc883_capture_source,
9394 .unsol_event = alc883_lenovo_ms7195_unsol_event,
9395 .init_hook = alc888_lenovo_ms7195_front_automute,
189609ae
KY
9396 },
9397 [ALC883_HAIER_W66] = {
c259249f 9398 .mixers = { alc883_targa_2ch_mixer},
189609ae
KY
9399 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
9400 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9401 .dac_nids = alc883_dac_nids,
9402 .dig_out_nid = ALC883_DIGOUT_NID,
189609ae
KY
9403 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9404 .channel_mode = alc883_3ST_2ch_modes,
9405 .input_mux = &alc883_capture_source,
a9fd4f3f 9406 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9407 .setup = alc883_haier_w66_setup,
9408 .init_hook = alc_automute_amp,
eea6419e 9409 },
4723c022 9410 [ALC888_3ST_HP] = {
eea6419e 9411 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
4723c022 9412 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
8341de60
CM
9413 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9414 .dac_nids = alc883_dac_nids,
4723c022
CM
9415 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
9416 .channel_mode = alc888_3st_hp_modes,
8341de60
CM
9417 .need_dac_fix = 1,
9418 .input_mux = &alc883_capture_source,
a9fd4f3f 9419 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9420 .setup = alc888_3st_hp_setup,
9421 .init_hook = alc_automute_amp,
8341de60 9422 },
5795b9e6 9423 [ALC888_6ST_DELL] = {
f24dbdc6 9424 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
5795b9e6
CM
9425 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
9426 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9427 .dac_nids = alc883_dac_nids,
9428 .dig_out_nid = ALC883_DIGOUT_NID,
5795b9e6
CM
9429 .dig_in_nid = ALC883_DIGIN_NID,
9430 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9431 .channel_mode = alc883_sixstack_modes,
9432 .input_mux = &alc883_capture_source,
a9fd4f3f 9433 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9434 .setup = alc888_6st_dell_setup,
9435 .init_hook = alc_automute_amp,
5795b9e6 9436 },
a8848bd6
AS
9437 [ALC883_MITAC] = {
9438 .mixers = { alc883_mitac_mixer },
9439 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
9440 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9441 .dac_nids = alc883_dac_nids,
a8848bd6
AS
9442 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9443 .channel_mode = alc883_3ST_2ch_modes,
9444 .input_mux = &alc883_capture_source,
a9fd4f3f 9445 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9446 .setup = alc883_mitac_setup,
9447 .init_hook = alc_automute_amp,
a8848bd6 9448 },
fb97dc67
J
9449 [ALC883_FUJITSU_PI2515] = {
9450 .mixers = { alc883_2ch_fujitsu_pi2515_mixer },
9451 .init_verbs = { alc883_init_verbs,
9452 alc883_2ch_fujitsu_pi2515_verbs},
9453 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9454 .dac_nids = alc883_dac_nids,
9455 .dig_out_nid = ALC883_DIGOUT_NID,
9456 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9457 .channel_mode = alc883_3ST_2ch_modes,
9458 .input_mux = &alc883_fujitsu_pi2515_capture_source,
a9fd4f3f 9459 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9460 .setup = alc883_2ch_fujitsu_pi2515_setup,
9461 .init_hook = alc_automute_amp,
fb97dc67 9462 },
ef8ef5fb
VP
9463 [ALC888_FUJITSU_XA3530] = {
9464 .mixers = { alc888_base_mixer, alc883_chmode_mixer },
9465 .init_verbs = { alc883_init_verbs,
9466 alc888_fujitsu_xa3530_verbs },
9467 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9468 .dac_nids = alc883_dac_nids,
9469 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9470 .adc_nids = alc883_adc_nids_rev,
9471 .capsrc_nids = alc883_capsrc_nids_rev,
9472 .dig_out_nid = ALC883_DIGOUT_NID,
9473 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
9474 .channel_mode = alc888_4ST_8ch_intel_modes,
9475 .num_mux_defs =
9476 ARRAY_SIZE(alc888_2_capture_sources),
9477 .input_mux = alc888_2_capture_sources,
a9fd4f3f 9478 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9479 .setup = alc888_fujitsu_xa3530_setup,
9480 .init_hook = alc_automute_amp,
ef8ef5fb 9481 },
e2757d5e
KY
9482 [ALC888_LENOVO_SKY] = {
9483 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
9484 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
9485 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9486 .dac_nids = alc883_dac_nids,
9487 .dig_out_nid = ALC883_DIGOUT_NID,
e2757d5e
KY
9488 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9489 .channel_mode = alc883_sixstack_modes,
9490 .need_dac_fix = 1,
9491 .input_mux = &alc883_lenovo_sky_capture_source,
a9fd4f3f 9492 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9493 .setup = alc888_lenovo_sky_setup,
9494 .init_hook = alc_automute_amp,
e2757d5e
KY
9495 },
9496 [ALC888_ASUS_M90V] = {
9497 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9498 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
9499 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9500 .dac_nids = alc883_dac_nids,
9501 .dig_out_nid = ALC883_DIGOUT_NID,
9502 .dig_in_nid = ALC883_DIGIN_NID,
9503 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9504 .channel_mode = alc883_3ST_6ch_modes,
9505 .need_dac_fix = 1,
9506 .input_mux = &alc883_fujitsu_pi2515_capture_source,
4f5d1706
TI
9507 .unsol_event = alc_sku_unsol_event,
9508 .setup = alc883_mode2_setup,
9509 .init_hook = alc_inithook,
e2757d5e
KY
9510 },
9511 [ALC888_ASUS_EEE1601] = {
9512 .mixers = { alc883_asus_eee1601_mixer },
f9e336f6 9513 .cap_mixer = alc883_asus_eee1601_cap_mixer,
e2757d5e
KY
9514 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
9515 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9516 .dac_nids = alc883_dac_nids,
9517 .dig_out_nid = ALC883_DIGOUT_NID,
9518 .dig_in_nid = ALC883_DIGIN_NID,
9519 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9520 .channel_mode = alc883_3ST_2ch_modes,
9521 .need_dac_fix = 1,
9522 .input_mux = &alc883_asus_eee1601_capture_source,
a9fd4f3f 9523 .unsol_event = alc_sku_unsol_event,
e2757d5e
KY
9524 .init_hook = alc883_eee1601_inithook,
9525 },
3ab90935
WF
9526 [ALC1200_ASUS_P5Q] = {
9527 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9528 .init_verbs = { alc883_init_verbs },
9529 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9530 .dac_nids = alc883_dac_nids,
9531 .dig_out_nid = ALC1200_DIGOUT_NID,
9532 .dig_in_nid = ALC883_DIGIN_NID,
b25c9da1 9533 .slave_dig_outs = alc1200_slave_dig_outs,
3ab90935
WF
9534 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9535 .channel_mode = alc883_sixstack_modes,
9536 .input_mux = &alc883_capture_source,
9537 },
eb4c41d3
TS
9538 [ALC889A_MB31] = {
9539 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
9540 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
9541 alc880_gpio1_init_verbs },
9542 .adc_nids = alc883_adc_nids,
9543 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
9544 .dac_nids = alc883_dac_nids,
9545 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9546 .channel_mode = alc889A_mb31_6ch_modes,
9547 .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
9548 .input_mux = &alc889A_mb31_capture_source,
9549 .dig_out_nid = ALC883_DIGOUT_NID,
9550 .unsol_event = alc889A_mb31_unsol_event,
9551 .init_hook = alc889A_mb31_automute,
9552 },
3e1647c5
GG
9553 [ALC883_SONY_VAIO_TT] = {
9554 .mixers = { alc883_vaiott_mixer },
9555 .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
9556 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9557 .dac_nids = alc883_dac_nids,
9558 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9559 .channel_mode = alc883_3ST_2ch_modes,
9560 .input_mux = &alc883_capture_source,
9561 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9562 .setup = alc883_vaiott_setup,
9563 .init_hook = alc_automute_amp,
3e1647c5 9564 },
9c7f852e
TI
9565};
9566
9567
4953550a
TI
9568/*
9569 * Pin config fixes
9570 */
9571enum {
9572 PINFIX_ABIT_AW9D_MAX
9573};
9574
9575static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
9576 { 0x15, 0x01080104 }, /* side */
9577 { 0x16, 0x01011012 }, /* rear */
9578 { 0x17, 0x01016011 }, /* clfe */
9579 { }
9580};
9581
f8f25ba3
TI
9582static const struct alc_fixup alc882_fixups[] = {
9583 [PINFIX_ABIT_AW9D_MAX] = {
9584 .pins = alc882_abit_aw9d_pinfix
9585 },
4953550a
TI
9586};
9587
f8f25ba3 9588static struct snd_pci_quirk alc882_fixup_tbl[] = {
4953550a
TI
9589 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
9590 {}
9591};
9592
9c7f852e
TI
9593/*
9594 * BIOS auto configuration
9595 */
05f5f477
TI
9596static int alc882_auto_create_input_ctls(struct hda_codec *codec,
9597 const struct auto_pin_cfg *cfg)
9598{
9599 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
9600}
9601
4953550a 9602static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
9c7f852e
TI
9603 hda_nid_t nid, int pin_type,
9604 int dac_idx)
9605{
9606 /* set as output */
9607 struct alc_spec *spec = codec->spec;
f12ab1e0
TI
9608 int idx;
9609
f6c7e546 9610 alc_set_pin_output(codec, nid, pin_type);
9c7f852e
TI
9611 if (spec->multiout.dac_nids[dac_idx] == 0x25)
9612 idx = 4;
9613 else
9614 idx = spec->multiout.dac_nids[dac_idx] - 2;
9c7f852e
TI
9615 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
9616
9617}
9618
4953550a 9619static void alc882_auto_init_multi_out(struct hda_codec *codec)
9c7f852e
TI
9620{
9621 struct alc_spec *spec = codec->spec;
9622 int i;
9623
9624 for (i = 0; i <= HDA_SIDE; i++) {
f12ab1e0 9625 hda_nid_t nid = spec->autocfg.line_out_pins[i];
baba8ee9 9626 int pin_type = get_pin_type(spec->autocfg.line_out_type);
9c7f852e 9627 if (nid)
4953550a 9628 alc882_auto_set_output_and_unmute(codec, nid, pin_type,
f12ab1e0 9629 i);
9c7f852e
TI
9630 }
9631}
9632
4953550a 9633static void alc882_auto_init_hp_out(struct hda_codec *codec)
9c7f852e
TI
9634{
9635 struct alc_spec *spec = codec->spec;
9636 hda_nid_t pin;
9637
eb06ed8f 9638 pin = spec->autocfg.hp_pins[0];
9c7f852e
TI
9639 if (pin) /* connect to front */
9640 /* use dac 0 */
4953550a 9641 alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
f6c7e546
TI
9642 pin = spec->autocfg.speaker_pins[0];
9643 if (pin)
4953550a 9644 alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
9c7f852e
TI
9645}
9646
4953550a 9647static void alc882_auto_init_analog_input(struct hda_codec *codec)
9c7f852e
TI
9648{
9649 struct alc_spec *spec = codec->spec;
9650 int i;
9651
9652 for (i = 0; i < AUTO_PIN_LAST; i++) {
9653 hda_nid_t nid = spec->autocfg.input_pins[i];
4953550a
TI
9654 if (!nid)
9655 continue;
0d971c9f 9656 alc_set_input_pin(codec, nid, i);
4953550a
TI
9657 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
9658 snd_hda_codec_write(codec, nid, 0,
9659 AC_VERB_SET_AMP_GAIN_MUTE,
9660 AMP_OUT_MUTE);
9661 }
9662}
9663
9664static void alc882_auto_init_input_src(struct hda_codec *codec)
9665{
9666 struct alc_spec *spec = codec->spec;
9667 int c;
9668
9669 for (c = 0; c < spec->num_adc_nids; c++) {
9670 hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
9671 hda_nid_t nid = spec->capsrc_nids[c];
9672 unsigned int mux_idx;
9673 const struct hda_input_mux *imux;
9674 int conns, mute, idx, item;
9675
9676 conns = snd_hda_get_connections(codec, nid, conn_list,
9677 ARRAY_SIZE(conn_list));
9678 if (conns < 0)
9679 continue;
9680 mux_idx = c >= spec->num_mux_defs ? 0 : c;
9681 imux = &spec->input_mux[mux_idx];
9682 for (idx = 0; idx < conns; idx++) {
9683 /* if the current connection is the selected one,
9684 * unmute it as default - otherwise mute it
9685 */
9686 mute = AMP_IN_MUTE(idx);
9687 for (item = 0; item < imux->num_items; item++) {
9688 if (imux->items[item].index == idx) {
9689 if (spec->cur_mux[c] == item)
9690 mute = AMP_IN_UNMUTE(idx);
9691 break;
9692 }
9693 }
9694 /* check if we have a selector or mixer
9695 * we could check for the widget type instead, but
9696 * just check for Amp-In presence (in case of mixer
9697 * without amp-in there is something wrong, this
9698 * function shouldn't be used or capsrc nid is wrong)
9699 */
9700 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
9c7f852e
TI
9701 snd_hda_codec_write(codec, nid, 0,
9702 AC_VERB_SET_AMP_GAIN_MUTE,
4953550a
TI
9703 mute);
9704 else if (mute != AMP_IN_MUTE(idx))
9705 snd_hda_codec_write(codec, nid, 0,
9706 AC_VERB_SET_CONNECT_SEL,
9707 idx);
9c7f852e
TI
9708 }
9709 }
9710}
9711
4953550a
TI
9712/* add mic boosts if needed */
9713static int alc_auto_add_mic_boost(struct hda_codec *codec)
9714{
9715 struct alc_spec *spec = codec->spec;
9716 int err;
9717 hda_nid_t nid;
9718
9719 nid = spec->autocfg.input_pins[AUTO_PIN_MIC];
9720 if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
9721 err = add_control(spec, ALC_CTL_WIDGET_VOL,
9722 "Mic Boost",
9723 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
9724 if (err < 0)
9725 return err;
9726 }
9727 nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC];
9728 if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
9729 err = add_control(spec, ALC_CTL_WIDGET_VOL,
9730 "Front Mic Boost",
9731 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
9732 if (err < 0)
9733 return err;
9734 }
9735 return 0;
9736}
f511b01c 9737
9c7f852e 9738/* almost identical with ALC880 parser... */
4953550a 9739static int alc882_parse_auto_config(struct hda_codec *codec)
9c7f852e
TI
9740{
9741 struct alc_spec *spec = codec->spec;
05f5f477
TI
9742 static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
9743 int i, err;
9c7f852e 9744
05f5f477
TI
9745 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
9746 alc882_ignore);
9c7f852e
TI
9747 if (err < 0)
9748 return err;
05f5f477
TI
9749 if (!spec->autocfg.line_outs)
9750 return 0; /* can't find valid BIOS pin config */
776e184e 9751
05f5f477
TI
9752 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
9753 if (err < 0)
9754 return err;
9755 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
9756 if (err < 0)
9757 return err;
9758 err = alc880_auto_create_extra_out(spec,
9759 spec->autocfg.speaker_pins[0],
9760 "Speaker");
9761 if (err < 0)
9762 return err;
9763 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
9764 "Headphone");
9765 if (err < 0)
9766 return err;
9767 err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
776e184e
TI
9768 if (err < 0)
9769 return err;
9770
05f5f477
TI
9771 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
9772
9773 /* check multiple SPDIF-out (for recent codecs) */
9774 for (i = 0; i < spec->autocfg.dig_outs; i++) {
9775 hda_nid_t dig_nid;
9776 err = snd_hda_get_connections(codec,
9777 spec->autocfg.dig_out_pins[i],
9778 &dig_nid, 1);
9779 if (err < 0)
9780 continue;
9781 if (!i)
9782 spec->multiout.dig_out_nid = dig_nid;
9783 else {
9784 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
71121d9f 9785 if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
05f5f477 9786 break;
71121d9f 9787 spec->slave_dig_outs[i - 1] = dig_nid;
05f5f477
TI
9788 }
9789 }
9790 if (spec->autocfg.dig_in_pin)
9791 spec->dig_in_nid = ALC880_DIGIN_NID;
9792
9793 if (spec->kctls.list)
9794 add_mixer(spec, spec->kctls.list);
9795
9796 add_verb(spec, alc883_auto_init_verbs);
4953550a 9797 /* if ADC 0x07 is available, initialize it, too */
05f5f477 9798 if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
4953550a 9799 add_verb(spec, alc882_adc1_init_verbs);
776e184e 9800
05f5f477
TI
9801 spec->num_mux_defs = 1;
9802 spec->input_mux = &spec->private_imux[0];
9803
9804 alc_ssid_check(codec, 0x15, 0x1b, 0x14);
9805
9806 err = alc_auto_add_mic_boost(codec);
9807 if (err < 0)
9808 return err;
61b9b9b1 9809
776e184e 9810 return 1; /* config found */
9c7f852e
TI
9811}
9812
9813/* additional initialization for auto-configuration model */
4953550a 9814static void alc882_auto_init(struct hda_codec *codec)
9c7f852e 9815{
f6c7e546 9816 struct alc_spec *spec = codec->spec;
4953550a
TI
9817 alc882_auto_init_multi_out(codec);
9818 alc882_auto_init_hp_out(codec);
9819 alc882_auto_init_analog_input(codec);
9820 alc882_auto_init_input_src(codec);
f6c7e546 9821 if (spec->unsol_event)
7fb0d78f 9822 alc_inithook(codec);
9c7f852e
TI
9823}
9824
4953550a 9825static int patch_alc882(struct hda_codec *codec)
9c7f852e
TI
9826{
9827 struct alc_spec *spec;
9828 int err, board_config;
9829
9830 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
9831 if (spec == NULL)
9832 return -ENOMEM;
9833
9834 codec->spec = spec;
9835
4953550a
TI
9836 switch (codec->vendor_id) {
9837 case 0x10ec0882:
9838 case 0x10ec0885:
9839 break;
9840 default:
9841 /* ALC883 and variants */
9842 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
9843 break;
9844 }
2c3bf9ab 9845
4953550a
TI
9846 board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
9847 alc882_models,
9848 alc882_cfg_tbl);
9849
9850 if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
9851 board_config = snd_hda_check_board_codec_sid_config(codec,
9852 ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
9853
9854 if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
9a11f1aa 9855 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4953550a
TI
9856 codec->chip_name);
9857 board_config = ALC882_AUTO;
9c7f852e
TI
9858 }
9859
f8f25ba3 9860 alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups);
4953550a
TI
9861
9862 if (board_config == ALC882_AUTO) {
9c7f852e 9863 /* automatic parse from the BIOS config */
4953550a 9864 err = alc882_parse_auto_config(codec);
9c7f852e
TI
9865 if (err < 0) {
9866 alc_free(codec);
9867 return err;
f12ab1e0 9868 } else if (!err) {
9c7f852e
TI
9869 printk(KERN_INFO
9870 "hda_codec: Cannot set up configuration "
9871 "from BIOS. Using base mode...\n");
4953550a 9872 board_config = ALC882_3ST_DIG;
9c7f852e
TI
9873 }
9874 }
9875
680cd536
KK
9876 err = snd_hda_attach_beep_device(codec, 0x1);
9877 if (err < 0) {
9878 alc_free(codec);
9879 return err;
9880 }
9881
4953550a 9882 if (board_config != ALC882_AUTO)
e9c364c0 9883 setup_preset(codec, &alc882_presets[board_config]);
9c7f852e 9884
4953550a
TI
9885 spec->stream_analog_playback = &alc882_pcm_analog_playback;
9886 spec->stream_analog_capture = &alc882_pcm_analog_capture;
9887 /* FIXME: setup DAC5 */
9888 /*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
9889 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
9890
9891 spec->stream_digital_playback = &alc882_pcm_digital_playback;
9892 spec->stream_digital_capture = &alc882_pcm_digital_capture;
9893
9894 if (codec->vendor_id == 0x10ec0888)
4a79ba34 9895 spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */
4953550a
TI
9896
9897 if (!spec->adc_nids && spec->input_mux) {
9898 int i;
9899 spec->num_adc_nids = 0;
9900 for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
9901 hda_nid_t cap;
9902 hda_nid_t nid = alc882_adc_nids[i];
9903 unsigned int wcap = get_wcaps(codec, nid);
9904 /* get type */
a22d543a 9905 wcap = get_wcaps_type(wcap);
4953550a
TI
9906 if (wcap != AC_WID_AUD_IN)
9907 continue;
9908 spec->private_adc_nids[spec->num_adc_nids] = nid;
9909 err = snd_hda_get_connections(codec, nid, &cap, 1);
9910 if (err < 0)
9911 continue;
9912 spec->private_capsrc_nids[spec->num_adc_nids] = cap;
9913 spec->num_adc_nids++;
61b9b9b1 9914 }
4953550a
TI
9915 spec->adc_nids = spec->private_adc_nids;
9916 spec->capsrc_nids = spec->private_capsrc_nids;
2f893286
KY
9917 }
9918
b59bdf3b 9919 set_capture_mixer(codec);
45bdd1c1 9920 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
9c7f852e 9921
2134ea4f
TI
9922 spec->vmaster_nid = 0x0c;
9923
9c7f852e 9924 codec->patch_ops = alc_patch_ops;
4953550a
TI
9925 if (board_config == ALC882_AUTO)
9926 spec->init_hook = alc882_auto_init;
cb53c626
TI
9927#ifdef CONFIG_SND_HDA_POWER_SAVE
9928 if (!spec->loopback.amplist)
4953550a 9929 spec->loopback.amplist = alc882_loopbacks;
cb53c626 9930#endif
daead538 9931 codec->proc_widget_hook = print_realtek_coef;
9c7f852e
TI
9932
9933 return 0;
9934}
9935
4953550a 9936
9c7f852e
TI
9937/*
9938 * ALC262 support
9939 */
9940
9941#define ALC262_DIGOUT_NID ALC880_DIGOUT_NID
9942#define ALC262_DIGIN_NID ALC880_DIGIN_NID
9943
9944#define alc262_dac_nids alc260_dac_nids
9945#define alc262_adc_nids alc882_adc_nids
9946#define alc262_adc_nids_alt alc882_adc_nids_alt
88c71a99
TI
9947#define alc262_capsrc_nids alc882_capsrc_nids
9948#define alc262_capsrc_nids_alt alc882_capsrc_nids_alt
9c7f852e
TI
9949
9950#define alc262_modes alc260_modes
9951#define alc262_capture_source alc882_capture_source
9952
4e555fe5
KY
9953static hda_nid_t alc262_dmic_adc_nids[1] = {
9954 /* ADC0 */
9955 0x09
9956};
9957
9958static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
9959
9c7f852e
TI
9960static struct snd_kcontrol_new alc262_base_mixer[] = {
9961 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9962 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
9963 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
9964 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
9965 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
9966 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
9967 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
9968 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
cc69d12d 9969 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9c7f852e
TI
9970 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
9971 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
cc69d12d 9972 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
9c7f852e
TI
9973 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
9974 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
9975 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
9976 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
9977 { } /* end */
9978};
9979
ce875f07
TI
9980/* update HP, line and mono-out pins according to the master switch */
9981static void alc262_hp_master_update(struct hda_codec *codec)
9982{
9983 struct alc_spec *spec = codec->spec;
9984 int val = spec->master_sw;
9985
9986 /* HP & line-out */
9987 snd_hda_codec_write_cache(codec, 0x1b, 0,
9988 AC_VERB_SET_PIN_WIDGET_CONTROL,
9989 val ? PIN_HP : 0);
9990 snd_hda_codec_write_cache(codec, 0x15, 0,
9991 AC_VERB_SET_PIN_WIDGET_CONTROL,
9992 val ? PIN_HP : 0);
9993 /* mono (speaker) depending on the HP jack sense */
9994 val = val && !spec->jack_present;
9995 snd_hda_codec_write_cache(codec, 0x16, 0,
9996 AC_VERB_SET_PIN_WIDGET_CONTROL,
9997 val ? PIN_OUT : 0);
9998}
9999
10000static void alc262_hp_bpc_automute(struct hda_codec *codec)
10001{
10002 struct alc_spec *spec = codec->spec;
864f92be
WF
10003
10004 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
ce875f07
TI
10005 alc262_hp_master_update(codec);
10006}
10007
10008static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
10009{
10010 if ((res >> 26) != ALC880_HP_EVENT)
10011 return;
10012 alc262_hp_bpc_automute(codec);
10013}
10014
10015static void alc262_hp_wildwest_automute(struct hda_codec *codec)
10016{
10017 struct alc_spec *spec = codec->spec;
864f92be
WF
10018
10019 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
ce875f07
TI
10020 alc262_hp_master_update(codec);
10021}
10022
10023static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
10024 unsigned int res)
10025{
10026 if ((res >> 26) != ALC880_HP_EVENT)
10027 return;
10028 alc262_hp_wildwest_automute(codec);
10029}
10030
b72519b5 10031#define alc262_hp_master_sw_get alc260_hp_master_sw_get
ce875f07
TI
10032
10033static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
10034 struct snd_ctl_elem_value *ucontrol)
10035{
10036 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10037 struct alc_spec *spec = codec->spec;
10038 int val = !!*ucontrol->value.integer.value;
10039
10040 if (val == spec->master_sw)
10041 return 0;
10042 spec->master_sw = val;
10043 alc262_hp_master_update(codec);
10044 return 1;
10045}
10046
b72519b5
TI
10047#define ALC262_HP_MASTER_SWITCH \
10048 { \
10049 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
10050 .name = "Master Playback Switch", \
10051 .info = snd_ctl_boolean_mono_info, \
10052 .get = alc262_hp_master_sw_get, \
10053 .put = alc262_hp_master_sw_put, \
10054 }
10055
9c7f852e 10056static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
b72519b5 10057 ALC262_HP_MASTER_SWITCH,
9c7f852e
TI
10058 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10059 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10060 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
ce875f07
TI
10061 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10062 HDA_OUTPUT),
10063 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10064 HDA_OUTPUT),
9c7f852e
TI
10065 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10066 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
cc69d12d 10067 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9c7f852e
TI
10068 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10069 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
cc69d12d 10070 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
9c7f852e
TI
10071 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10072 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10073 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10074 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
9c7f852e
TI
10075 HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
10076 HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
10077 { } /* end */
10078};
10079
cd7509a4 10080static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
b72519b5 10081 ALC262_HP_MASTER_SWITCH,
cd7509a4
KY
10082 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10083 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10084 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10085 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
ce875f07
TI
10086 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10087 HDA_OUTPUT),
10088 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10089 HDA_OUTPUT),
cd7509a4
KY
10090 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
10091 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
cc69d12d 10092 HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
cd7509a4
KY
10093 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10094 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10095 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10096 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
cd7509a4
KY
10097 { } /* end */
10098};
10099
10100static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
10101 HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10102 HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
cc69d12d 10103 HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
cd7509a4
KY
10104 { } /* end */
10105};
10106
66d2a9d6 10107/* mute/unmute internal speaker according to the hp jack and mute state */
4f5d1706 10108static void alc262_hp_t5735_setup(struct hda_codec *codec)
66d2a9d6
KY
10109{
10110 struct alc_spec *spec = codec->spec;
66d2a9d6 10111
a9fd4f3f
TI
10112 spec->autocfg.hp_pins[0] = 0x15;
10113 spec->autocfg.speaker_pins[0] = 0x0c; /* HACK: not actually a pin */
66d2a9d6
KY
10114}
10115
66d2a9d6 10116static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
86cd9298
TI
10117 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10118 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
66d2a9d6
KY
10119 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10120 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10121 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10122 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10123 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10124 { } /* end */
10125};
10126
10127static struct hda_verb alc262_hp_t5735_verbs[] = {
10128 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10129 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10130
10131 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
10132 { }
10133};
10134
8c427226 10135static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
f2f48e18
TI
10136 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10137 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
86cd9298
TI
10138 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
10139 HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
8c427226
KY
10140 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10141 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10142 { } /* end */
10143};
10144
10145static struct hda_verb alc262_hp_rp5700_verbs[] = {
10146 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10147 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10148 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10149 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10150 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10151 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10152 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10153 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10154 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10155 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10156 {}
10157};
10158
10159static struct hda_input_mux alc262_hp_rp5700_capture_source = {
10160 .num_items = 1,
10161 .items = {
10162 { "Line", 0x1 },
10163 },
10164};
10165
42171c17
TI
10166/* bind hp and internal speaker mute (with plug check) as master switch */
10167static void alc262_hippo_master_update(struct hda_codec *codec)
0724ea2a 10168{
42171c17
TI
10169 struct alc_spec *spec = codec->spec;
10170 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10171 hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
10172 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
10173 unsigned int mute;
0724ea2a 10174
42171c17
TI
10175 /* HP */
10176 mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
10177 snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
10178 HDA_AMP_MUTE, mute);
10179 /* mute internal speaker per jack sense */
10180 if (spec->jack_present)
10181 mute = HDA_AMP_MUTE;
10182 if (line_nid)
10183 snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
10184 HDA_AMP_MUTE, mute);
10185 if (speaker_nid && speaker_nid != line_nid)
10186 snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
0724ea2a 10187 HDA_AMP_MUTE, mute);
42171c17
TI
10188}
10189
10190#define alc262_hippo_master_sw_get alc262_hp_master_sw_get
10191
10192static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
10193 struct snd_ctl_elem_value *ucontrol)
10194{
10195 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10196 struct alc_spec *spec = codec->spec;
10197 int val = !!*ucontrol->value.integer.value;
10198
10199 if (val == spec->master_sw)
10200 return 0;
10201 spec->master_sw = val;
10202 alc262_hippo_master_update(codec);
10203 return 1;
10204}
10205
10206#define ALC262_HIPPO_MASTER_SWITCH \
10207 { \
10208 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
10209 .name = "Master Playback Switch", \
10210 .info = snd_ctl_boolean_mono_info, \
10211 .get = alc262_hippo_master_sw_get, \
10212 .put = alc262_hippo_master_sw_put, \
0724ea2a 10213 }
42171c17
TI
10214
10215static struct snd_kcontrol_new alc262_hippo_mixer[] = {
10216 ALC262_HIPPO_MASTER_SWITCH,
10217 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10218 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10219 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10220 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10221 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10222 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10223 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10224 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10225 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10226 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10227 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10228 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10229 { } /* end */
10230};
10231
10232static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
10233 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10234 ALC262_HIPPO_MASTER_SWITCH,
10235 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10236 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10237 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10238 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10239 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10240 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10241 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10242 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10243 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10244 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10245 { } /* end */
10246};
10247
10248/* mute/unmute internal speaker according to the hp jack and mute state */
10249static void alc262_hippo_automute(struct hda_codec *codec)
10250{
10251 struct alc_spec *spec = codec->spec;
10252 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
42171c17 10253
864f92be 10254 spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
42171c17 10255 alc262_hippo_master_update(codec);
0724ea2a 10256}
5b31954e 10257
42171c17
TI
10258static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
10259{
10260 if ((res >> 26) != ALC880_HP_EVENT)
10261 return;
10262 alc262_hippo_automute(codec);
10263}
10264
4f5d1706 10265static void alc262_hippo_setup(struct hda_codec *codec)
42171c17
TI
10266{
10267 struct alc_spec *spec = codec->spec;
10268
10269 spec->autocfg.hp_pins[0] = 0x15;
10270 spec->autocfg.speaker_pins[0] = 0x14;
42171c17
TI
10271}
10272
4f5d1706 10273static void alc262_hippo1_setup(struct hda_codec *codec)
42171c17
TI
10274{
10275 struct alc_spec *spec = codec->spec;
10276
10277 spec->autocfg.hp_pins[0] = 0x1b;
10278 spec->autocfg.speaker_pins[0] = 0x14;
42171c17
TI
10279}
10280
10281
272a527c 10282static struct snd_kcontrol_new alc262_sony_mixer[] = {
0724ea2a 10283 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
42171c17 10284 ALC262_HIPPO_MASTER_SWITCH,
272a527c
KY
10285 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10286 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10287 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10288 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10289 { } /* end */
10290};
10291
83c34218 10292static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
42171c17
TI
10293 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10294 ALC262_HIPPO_MASTER_SWITCH,
83c34218
KY
10295 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10296 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10297 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10298 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10299 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10300 { } /* end */
10301};
272a527c 10302
ba340e82
TV
10303static struct snd_kcontrol_new alc262_tyan_mixer[] = {
10304 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10305 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
10306 HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
10307 HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
10308 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10309 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10310 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10311 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10312 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10313 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10314 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10315 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10316 { } /* end */
10317};
10318
10319static struct hda_verb alc262_tyan_verbs[] = {
10320 /* Headphone automute */
10321 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10322 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10323 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10324
10325 /* P11 AUX_IN, white 4-pin connector */
10326 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10327 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
10328 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
10329 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
10330
10331 {}
10332};
10333
10334/* unsolicited event for HP jack sensing */
4f5d1706 10335static void alc262_tyan_setup(struct hda_codec *codec)
ba340e82 10336{
a9fd4f3f 10337 struct alc_spec *spec = codec->spec;
ba340e82 10338
a9fd4f3f
TI
10339 spec->autocfg.hp_pins[0] = 0x1b;
10340 spec->autocfg.speaker_pins[0] = 0x15;
ba340e82
TV
10341}
10342
ba340e82 10343
9c7f852e
TI
10344#define alc262_capture_mixer alc882_capture_mixer
10345#define alc262_capture_alt_mixer alc882_capture_alt_mixer
10346
10347/*
10348 * generic initialization of ADC, input mixers and output mixers
10349 */
10350static struct hda_verb alc262_init_verbs[] = {
10351 /*
10352 * Unmute ADC0-2 and set the default input to mic-in
10353 */
10354 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
10355 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10356 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
10357 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10358 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
10359 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10360
cb53c626 10361 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
9c7f852e 10362 * mixer widget
f12ab1e0
TI
10363 * Note: PASD motherboards uses the Line In 2 as the input for
10364 * front panel mic (mic 2)
9c7f852e
TI
10365 */
10366 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
10367 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10368 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10369 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
10370 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
10371 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
9c7f852e
TI
10372
10373 /*
df694daa
KY
10374 * Set up output mixers (0x0c - 0x0e)
10375 */
10376 /* set vol=0 to output mixers */
10377 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10378 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10379 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10380 /* set up input amps for analog loopback */
10381 /* Amp Indices: DAC = 0, mixer = 1 */
10382 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10383 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10384 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10385 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10386 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10387 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10388
10389 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10390 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10391 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10392 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10393 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10394 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10395
10396 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10397 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10398 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10399 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10400 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
ea1fb29a 10401
df694daa
KY
10402 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
10403 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
ea1fb29a 10404
df694daa
KY
10405 /* FIXME: use matrix-type input source selection */
10406 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
10407 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
10408 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10409 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10410 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10411 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10412 /* Input mixer2 */
10413 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10414 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10415 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10416 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10417 /* Input mixer3 */
10418 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10419 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10420 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
f12ab1e0 10421 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
df694daa
KY
10422
10423 { }
10424};
1da177e4 10425
4e555fe5
KY
10426static struct hda_verb alc262_eapd_verbs[] = {
10427 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
10428 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
10429 { }
10430};
10431
ccc656ce
KY
10432static struct hda_verb alc262_hippo1_unsol_verbs[] = {
10433 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10434 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10435 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10436
10437 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10438 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10439 {}
10440};
10441
272a527c
KY
10442static struct hda_verb alc262_sony_unsol_verbs[] = {
10443 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10444 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10445 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, // Front Mic
10446
10447 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10448 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7b1e8795 10449 {}
272a527c
KY
10450};
10451
4e555fe5
KY
10452static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
10453 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10454 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10455 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10456 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10457 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
4e555fe5
KY
10458 { } /* end */
10459};
10460
10461static struct hda_verb alc262_toshiba_s06_verbs[] = {
10462 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10463 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10464 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10465 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10466 {0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
10467 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10468 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
10469 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10470 {}
10471};
10472
4f5d1706 10473static void alc262_toshiba_s06_setup(struct hda_codec *codec)
4e555fe5 10474{
a9fd4f3f
TI
10475 struct alc_spec *spec = codec->spec;
10476
10477 spec->autocfg.hp_pins[0] = 0x15;
10478 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
10479 spec->ext_mic.pin = 0x18;
10480 spec->ext_mic.mux_idx = 0;
10481 spec->int_mic.pin = 0x12;
10482 spec->int_mic.mux_idx = 9;
10483 spec->auto_mic = 1;
4e555fe5
KY
10484}
10485
e8f9ae2a
PT
10486/*
10487 * nec model
10488 * 0x15 = headphone
10489 * 0x16 = internal speaker
10490 * 0x18 = external mic
10491 */
10492
10493static struct snd_kcontrol_new alc262_nec_mixer[] = {
10494 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
10495 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
10496
10497 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10498 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10499 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10500
10501 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10502 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10503 { } /* end */
10504};
10505
10506static struct hda_verb alc262_nec_verbs[] = {
10507 /* Unmute Speaker */
10508 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10509
10510 /* Headphone */
10511 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10512 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10513
10514 /* External mic to headphone */
10515 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10516 /* External mic to speaker */
10517 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10518 {}
10519};
10520
834be88d
TI
10521/*
10522 * fujitsu model
5d9fab2d
TV
10523 * 0x14 = headphone/spdif-out, 0x15 = internal speaker,
10524 * 0x1b = port replicator headphone out
834be88d
TI
10525 */
10526
10527#define ALC_HP_EVENT 0x37
10528
10529static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
10530 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10531 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5d9fab2d
TV
10532 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10533 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
834be88d
TI
10534 {}
10535};
10536
0e31daf7
J
10537static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
10538 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10539 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10540 {}
10541};
10542
834be88d 10543static struct hda_input_mux alc262_fujitsu_capture_source = {
39d3ed38 10544 .num_items = 3,
834be88d
TI
10545 .items = {
10546 { "Mic", 0x0 },
39d3ed38 10547 { "Int Mic", 0x1 },
834be88d
TI
10548 { "CD", 0x4 },
10549 },
10550};
10551
9c7f852e
TI
10552static struct hda_input_mux alc262_HP_capture_source = {
10553 .num_items = 5,
10554 .items = {
10555 { "Mic", 0x0 },
accbe498 10556 { "Front Mic", 0x1 },
9c7f852e
TI
10557 { "Line", 0x2 },
10558 { "CD", 0x4 },
10559 { "AUX IN", 0x6 },
10560 },
10561};
10562
accbe498 10563static struct hda_input_mux alc262_HP_D7000_capture_source = {
10564 .num_items = 4,
10565 .items = {
10566 { "Mic", 0x0 },
10567 { "Front Mic", 0x2 },
10568 { "Line", 0x1 },
10569 { "CD", 0x4 },
10570 },
10571};
10572
ebc7a406 10573/* mute/unmute internal speaker according to the hp jacks and mute state */
834be88d
TI
10574static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
10575{
10576 struct alc_spec *spec = codec->spec;
10577 unsigned int mute;
10578
f12ab1e0 10579 if (force || !spec->sense_updated) {
864f92be
WF
10580 spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
10581 snd_hda_jack_detect(codec, 0x1b);
834be88d
TI
10582 spec->sense_updated = 1;
10583 }
ebc7a406
TI
10584 /* unmute internal speaker only if both HPs are unplugged and
10585 * master switch is on
10586 */
10587 if (spec->jack_present)
10588 mute = HDA_AMP_MUTE;
10589 else
834be88d 10590 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
ebc7a406
TI
10591 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
10592 HDA_AMP_MUTE, mute);
834be88d
TI
10593}
10594
10595/* unsolicited event for HP jack sensing */
10596static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
10597 unsigned int res)
10598{
10599 if ((res >> 26) != ALC_HP_EVENT)
10600 return;
10601 alc262_fujitsu_automute(codec, 1);
10602}
10603
ebc7a406
TI
10604static void alc262_fujitsu_init_hook(struct hda_codec *codec)
10605{
10606 alc262_fujitsu_automute(codec, 1);
10607}
10608
834be88d 10609/* bind volumes of both NID 0x0c and 0x0d */
cca3b371
TI
10610static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
10611 .ops = &snd_hda_bind_vol,
10612 .values = {
10613 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
10614 HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
10615 0
10616 },
10617};
834be88d 10618
0e31daf7
J
10619/* mute/unmute internal speaker according to the hp jack and mute state */
10620static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
10621{
10622 struct alc_spec *spec = codec->spec;
10623 unsigned int mute;
10624
10625 if (force || !spec->sense_updated) {
864f92be 10626 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
0e31daf7
J
10627 spec->sense_updated = 1;
10628 }
10629 if (spec->jack_present) {
10630 /* mute internal speaker */
10631 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
10632 HDA_AMP_MUTE, HDA_AMP_MUTE);
10633 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
10634 HDA_AMP_MUTE, HDA_AMP_MUTE);
10635 } else {
10636 /* unmute internal speaker if necessary */
10637 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
10638 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
10639 HDA_AMP_MUTE, mute);
10640 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
10641 HDA_AMP_MUTE, mute);
10642 }
10643}
10644
10645/* unsolicited event for HP jack sensing */
10646static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
10647 unsigned int res)
10648{
10649 if ((res >> 26) != ALC_HP_EVENT)
10650 return;
10651 alc262_lenovo_3000_automute(codec, 1);
10652}
10653
8de56b7d
TI
10654static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
10655 int dir, int idx, long *valp)
10656{
10657 int i, change = 0;
10658
10659 for (i = 0; i < 2; i++, valp++)
10660 change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
10661 HDA_AMP_MUTE,
10662 *valp ? 0 : HDA_AMP_MUTE);
10663 return change;
10664}
10665
834be88d
TI
10666/* bind hp and internal speaker mute (with plug check) */
10667static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
10668 struct snd_ctl_elem_value *ucontrol)
10669{
10670 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10671 long *valp = ucontrol->value.integer.value;
10672 int change;
10673
8de56b7d
TI
10674 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
10675 change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
82beb8fd
TI
10676 if (change)
10677 alc262_fujitsu_automute(codec, 0);
834be88d
TI
10678 return change;
10679}
10680
10681static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
cca3b371 10682 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
834be88d
TI
10683 {
10684 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
10685 .name = "Master Playback Switch",
10686 .info = snd_hda_mixer_amp_switch_info,
10687 .get = snd_hda_mixer_amp_switch_get,
10688 .put = alc262_fujitsu_master_sw_put,
10689 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
10690 },
10691 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10692 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10693 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10694 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10695 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
39d3ed38
TI
10696 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
10697 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
10698 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
834be88d
TI
10699 { } /* end */
10700};
10701
0e31daf7
J
10702/* bind hp and internal speaker mute (with plug check) */
10703static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
10704 struct snd_ctl_elem_value *ucontrol)
10705{
10706 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10707 long *valp = ucontrol->value.integer.value;
10708 int change;
10709
8de56b7d 10710 change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
0e31daf7
J
10711 if (change)
10712 alc262_lenovo_3000_automute(codec, 0);
10713 return change;
10714}
10715
10716static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
10717 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
10718 {
10719 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
10720 .name = "Master Playback Switch",
10721 .info = snd_hda_mixer_amp_switch_info,
10722 .get = snd_hda_mixer_amp_switch_get,
10723 .put = alc262_lenovo_3000_master_sw_put,
10724 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
10725 },
10726 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10727 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10728 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10729 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10730 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10731 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
10732 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
10733 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
10734 { } /* end */
10735};
10736
9f99a638
HM
10737static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
10738 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
42171c17 10739 ALC262_HIPPO_MASTER_SWITCH,
9f99a638
HM
10740 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10741 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10742 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10743 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10744 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10745 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10746 { } /* end */
10747};
10748
304dcaac
TI
10749/* additional init verbs for Benq laptops */
10750static struct hda_verb alc262_EAPD_verbs[] = {
10751 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
10752 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
10753 {}
10754};
10755
83c34218
KY
10756static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
10757 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10758 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10759
10760 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
10761 {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
10762 {}
10763};
10764
f651b50b
TD
10765/* Samsung Q1 Ultra Vista model setup */
10766static struct snd_kcontrol_new alc262_ultra_mixer[] = {
bb9f76cd
TI
10767 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10768 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
f651b50b
TD
10769 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10770 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10771 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
bb9f76cd 10772 HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
f651b50b
TD
10773 { } /* end */
10774};
10775
10776static struct hda_verb alc262_ultra_verbs[] = {
bb9f76cd
TI
10777 /* output mixer */
10778 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10779 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10780 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10781 /* speaker */
10782 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10783 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
10784 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10785 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
10786 /* HP */
f651b50b 10787 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
bb9f76cd
TI
10788 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
10789 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10790 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10791 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10792 /* internal mic */
10793 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
10794 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10795 /* ADC, choose mic */
10796 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10797 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10798 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10799 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
10800 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
10801 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
10802 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
10803 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
10804 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
10805 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
f651b50b
TD
10806 {}
10807};
10808
f651b50b
TD
10809/* mute/unmute internal speaker according to the hp jack and mute state */
10810static void alc262_ultra_automute(struct hda_codec *codec)
10811{
10812 struct alc_spec *spec = codec->spec;
10813 unsigned int mute;
f651b50b 10814
bb9f76cd
TI
10815 mute = 0;
10816 /* auto-mute only when HP is used as HP */
10817 if (!spec->cur_mux[0]) {
864f92be 10818 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
bb9f76cd
TI
10819 if (spec->jack_present)
10820 mute = HDA_AMP_MUTE;
f651b50b 10821 }
bb9f76cd
TI
10822 /* mute/unmute internal speaker */
10823 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
10824 HDA_AMP_MUTE, mute);
10825 /* mute/unmute HP */
10826 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
10827 HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
f651b50b
TD
10828}
10829
10830/* unsolicited event for HP jack sensing */
10831static void alc262_ultra_unsol_event(struct hda_codec *codec,
10832 unsigned int res)
10833{
10834 if ((res >> 26) != ALC880_HP_EVENT)
10835 return;
10836 alc262_ultra_automute(codec);
10837}
10838
bb9f76cd
TI
10839static struct hda_input_mux alc262_ultra_capture_source = {
10840 .num_items = 2,
10841 .items = {
10842 { "Mic", 0x1 },
10843 { "Headphone", 0x7 },
10844 },
10845};
10846
10847static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
10848 struct snd_ctl_elem_value *ucontrol)
10849{
10850 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10851 struct alc_spec *spec = codec->spec;
10852 int ret;
10853
54cbc9ab 10854 ret = alc_mux_enum_put(kcontrol, ucontrol);
bb9f76cd
TI
10855 if (!ret)
10856 return 0;
10857 /* reprogram the HP pin as mic or HP according to the input source */
10858 snd_hda_codec_write_cache(codec, 0x15, 0,
10859 AC_VERB_SET_PIN_WIDGET_CONTROL,
10860 spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
10861 alc262_ultra_automute(codec); /* mute/unmute HP */
10862 return ret;
10863}
10864
10865static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
10866 HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
10867 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
10868 {
10869 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
10870 .name = "Capture Source",
54cbc9ab
TI
10871 .info = alc_mux_enum_info,
10872 .get = alc_mux_enum_get,
bb9f76cd
TI
10873 .put = alc262_ultra_mux_enum_put,
10874 },
10875 { } /* end */
10876};
10877
c3fc1f50
TI
10878/* We use two mixers depending on the output pin; 0x16 is a mono output
10879 * and thus it's bound with a different mixer.
10880 * This function returns which mixer amp should be used.
10881 */
10882static int alc262_check_volbit(hda_nid_t nid)
10883{
10884 if (!nid)
10885 return 0;
10886 else if (nid == 0x16)
10887 return 2;
10888 else
10889 return 1;
10890}
10891
10892static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
10893 const char *pfx, int *vbits)
10894{
c3fc1f50
TI
10895 unsigned long val;
10896 int vbit;
10897
10898 vbit = alc262_check_volbit(nid);
10899 if (!vbit)
10900 return 0;
10901 if (*vbits & vbit) /* a volume control for this mixer already there */
10902 return 0;
10903 *vbits |= vbit;
c3fc1f50
TI
10904 if (vbit == 2)
10905 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
10906 else
10907 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
0afe5f89 10908 return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, val);
c3fc1f50
TI
10909}
10910
10911static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
10912 const char *pfx)
10913{
c3fc1f50
TI
10914 unsigned long val;
10915
10916 if (!nid)
10917 return 0;
c3fc1f50
TI
10918 if (nid == 0x16)
10919 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
10920 else
10921 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
0afe5f89 10922 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val);
c3fc1f50
TI
10923}
10924
df694daa 10925/* add playback controls from the parsed DAC table */
f12ab1e0
TI
10926static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
10927 const struct auto_pin_cfg *cfg)
df694daa 10928{
c3fc1f50
TI
10929 const char *pfx;
10930 int vbits;
df694daa
KY
10931 int err;
10932
10933 spec->multiout.num_dacs = 1; /* only use one dac */
10934 spec->multiout.dac_nids = spec->private_dac_nids;
10935 spec->multiout.dac_nids[0] = 2;
10936
c3fc1f50
TI
10937 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
10938 pfx = "Master";
10939 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
10940 pfx = "Speaker";
10941 else
10942 pfx = "Front";
10943 err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx);
10944 if (err < 0)
10945 return err;
10946 err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker");
10947 if (err < 0)
10948 return err;
10949 err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone");
10950 if (err < 0)
10951 return err;
df694daa 10952
c3fc1f50
TI
10953 vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
10954 alc262_check_volbit(cfg->speaker_pins[0]) |
10955 alc262_check_volbit(cfg->hp_pins[0]);
10956 if (vbits == 1 || vbits == 2)
10957 pfx = "Master"; /* only one mixer is used */
10958 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
10959 pfx = "Speaker";
10960 else
10961 pfx = "Front";
10962 vbits = 0;
10963 err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits);
10964 if (err < 0)
10965 return err;
10966 err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker",
10967 &vbits);
10968 if (err < 0)
10969 return err;
10970 err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone",
10971 &vbits);
10972 if (err < 0)
10973 return err;
f12ab1e0 10974 return 0;
df694daa
KY
10975}
10976
05f5f477
TI
10977#define alc262_auto_create_input_ctls \
10978 alc880_auto_create_input_ctls
df694daa
KY
10979
10980/*
10981 * generic initialization of ADC, input mixers and output mixers
10982 */
10983static struct hda_verb alc262_volume_init_verbs[] = {
10984 /*
10985 * Unmute ADC0-2 and set the default input to mic-in
10986 */
10987 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
10988 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10989 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
10990 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10991 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
10992 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10993
cb53c626 10994 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
df694daa 10995 * mixer widget
f12ab1e0
TI
10996 * Note: PASD motherboards uses the Line In 2 as the input for
10997 * front panel mic (mic 2)
df694daa
KY
10998 */
10999 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
11000 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11001 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11002 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11003 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11004 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
df694daa
KY
11005
11006 /*
11007 * Set up output mixers (0x0c - 0x0f)
11008 */
11009 /* set vol=0 to output mixers */
11010 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11011 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11012 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
ea1fb29a 11013
df694daa
KY
11014 /* set up input amps for analog loopback */
11015 /* Amp Indices: DAC = 0, mixer = 1 */
11016 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11017 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11018 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11019 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11020 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11021 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11022
11023 /* FIXME: use matrix-type input source selection */
11024 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11025 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11026 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11027 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11028 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11029 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11030 /* Input mixer2 */
11031 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11032 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11033 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11034 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11035 /* Input mixer3 */
11036 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11037 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11038 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11039 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11040
11041 { }
11042};
11043
9c7f852e
TI
11044static struct hda_verb alc262_HP_BPC_init_verbs[] = {
11045 /*
11046 * Unmute ADC0-2 and set the default input to mic-in
11047 */
11048 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11049 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11050 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11051 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11052 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11053 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11054
cb53c626 11055 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
9c7f852e 11056 * mixer widget
f12ab1e0
TI
11057 * Note: PASD motherboards uses the Line In 2 as the input for
11058 * front panel mic (mic 2)
9c7f852e
TI
11059 */
11060 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
11061 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11062 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11063 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11064 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11065 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11066 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11067 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
ea1fb29a 11068
9c7f852e
TI
11069 /*
11070 * Set up output mixers (0x0c - 0x0e)
11071 */
11072 /* set vol=0 to output mixers */
11073 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11074 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11075 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11076
11077 /* set up input amps for analog loopback */
11078 /* Amp Indices: DAC = 0, mixer = 1 */
11079 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11080 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11081 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11082 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11083 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11084 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11085
ce875f07 11086 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9c7f852e
TI
11087 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11088 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11089
11090 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11091 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11092
11093 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11094 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11095
11096 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11097 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11098 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11099 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11100 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11101
0e4835c1 11102 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
9c7f852e
TI
11103 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11104 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
0e4835c1 11105 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
9c7f852e
TI
11106 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11107 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11108
11109
11110 /* FIXME: use matrix-type input source selection */
0e4835c1
JK
11111 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
11112 /* Input mixer1: only unmute Mic */
9c7f852e 11113 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
0e4835c1
JK
11114 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11115 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11116 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11117 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11118 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11119 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11120 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11121 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
9c7f852e
TI
11122 /* Input mixer2 */
11123 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
0e4835c1
JK
11124 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11125 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11126 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11127 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11128 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11129 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11130 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11131 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
9c7f852e
TI
11132 /* Input mixer3 */
11133 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
0e4835c1
JK
11134 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11135 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11136 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11137 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11138 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11139 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11140 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11141 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
9c7f852e 11142
ce875f07
TI
11143 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11144
9c7f852e
TI
11145 { }
11146};
11147
cd7509a4
KY
11148static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
11149 /*
11150 * Unmute ADC0-2 and set the default input to mic-in
11151 */
11152 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11153 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11154 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11155 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11156 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11157 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11158
cb53c626 11159 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
cd7509a4
KY
11160 * mixer widget
11161 * Note: PASD motherboards uses the Line In 2 as the input for front
11162 * panel mic (mic 2)
11163 */
11164 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
11165 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11166 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11167 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11168 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11169 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11170 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11171 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11172 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
cd7509a4
KY
11173 /*
11174 * Set up output mixers (0x0c - 0x0e)
11175 */
11176 /* set vol=0 to output mixers */
11177 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11178 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11179 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11180
11181 /* set up input amps for analog loopback */
11182 /* Amp Indices: DAC = 0, mixer = 1 */
11183 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11184 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11185 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11186 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11187 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11188 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11189
11190
11191 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP */
11192 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Mono */
11193 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* rear MIC */
11194 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* Line in */
11195 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
11196 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Line out */
11197 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD in */
11198
11199 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11200 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11201
11202 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11203 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11204
11205 /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
11206 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11207 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11208 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
11209 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11210 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11211
11212 /* FIXME: use matrix-type input source selection */
11213 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11214 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11215 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
11216 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
11217 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
11218 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
11219 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
11220 /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11221 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
11222 /* Input mixer2 */
11223 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11224 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11225 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11226 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11227 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11228 /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11229 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11230 /* Input mixer3 */
11231 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11232 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11233 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11234 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11235 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11236 /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11237 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11238
ce875f07
TI
11239 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11240
cd7509a4
KY
11241 { }
11242};
11243
9f99a638
HM
11244static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
11245
11246 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Front Speaker */
11247 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11248 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
11249
11250 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* MIC jack */
11251 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
11252 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11253 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11254
11255 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP jack */
11256 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11257 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11258 {}
11259};
11260
11261
cb53c626
TI
11262#ifdef CONFIG_SND_HDA_POWER_SAVE
11263#define alc262_loopbacks alc880_loopbacks
11264#endif
11265
def319f9 11266/* pcm configuration: identical with ALC880 */
df694daa
KY
11267#define alc262_pcm_analog_playback alc880_pcm_analog_playback
11268#define alc262_pcm_analog_capture alc880_pcm_analog_capture
11269#define alc262_pcm_digital_playback alc880_pcm_digital_playback
11270#define alc262_pcm_digital_capture alc880_pcm_digital_capture
11271
11272/*
11273 * BIOS auto configuration
11274 */
11275static int alc262_parse_auto_config(struct hda_codec *codec)
11276{
11277 struct alc_spec *spec = codec->spec;
11278 int err;
11279 static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
11280
f12ab1e0
TI
11281 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
11282 alc262_ignore);
11283 if (err < 0)
df694daa 11284 return err;
e64f14f4 11285 if (!spec->autocfg.line_outs) {
0852d7a6 11286 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
e64f14f4
TI
11287 spec->multiout.max_channels = 2;
11288 spec->no_analog = 1;
11289 goto dig_only;
11290 }
df694daa 11291 return 0; /* can't find valid BIOS pin config */
e64f14f4 11292 }
f12ab1e0
TI
11293 err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
11294 if (err < 0)
11295 return err;
05f5f477 11296 err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 11297 if (err < 0)
df694daa
KY
11298 return err;
11299
11300 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
11301
e64f14f4 11302 dig_only:
0852d7a6 11303 if (spec->autocfg.dig_outs) {
df694daa 11304 spec->multiout.dig_out_nid = ALC262_DIGOUT_NID;
0852d7a6 11305 spec->dig_out_type = spec->autocfg.dig_out_type[0];
e64f14f4 11306 }
df694daa
KY
11307 if (spec->autocfg.dig_in_pin)
11308 spec->dig_in_nid = ALC262_DIGIN_NID;
11309
603c4019 11310 if (spec->kctls.list)
d88897ea 11311 add_mixer(spec, spec->kctls.list);
df694daa 11312
d88897ea 11313 add_verb(spec, alc262_volume_init_verbs);
a1e8d2da 11314 spec->num_mux_defs = 1;
61b9b9b1 11315 spec->input_mux = &spec->private_imux[0];
df694daa 11316
776e184e
TI
11317 err = alc_auto_add_mic_boost(codec);
11318 if (err < 0)
11319 return err;
11320
4a79ba34
TI
11321 alc_ssid_check(codec, 0x15, 0x14, 0x1b);
11322
df694daa
KY
11323 return 1;
11324}
11325
11326#define alc262_auto_init_multi_out alc882_auto_init_multi_out
11327#define alc262_auto_init_hp_out alc882_auto_init_hp_out
11328#define alc262_auto_init_analog_input alc882_auto_init_analog_input
f511b01c 11329#define alc262_auto_init_input_src alc882_auto_init_input_src
df694daa
KY
11330
11331
11332/* init callback for auto-configuration model -- overriding the default init */
ae6b813a 11333static void alc262_auto_init(struct hda_codec *codec)
df694daa 11334{
f6c7e546 11335 struct alc_spec *spec = codec->spec;
df694daa
KY
11336 alc262_auto_init_multi_out(codec);
11337 alc262_auto_init_hp_out(codec);
11338 alc262_auto_init_analog_input(codec);
f511b01c 11339 alc262_auto_init_input_src(codec);
f6c7e546 11340 if (spec->unsol_event)
7fb0d78f 11341 alc_inithook(codec);
df694daa
KY
11342}
11343
11344/*
11345 * configuration and preset
11346 */
f5fcc13c
TI
11347static const char *alc262_models[ALC262_MODEL_LAST] = {
11348 [ALC262_BASIC] = "basic",
11349 [ALC262_HIPPO] = "hippo",
11350 [ALC262_HIPPO_1] = "hippo_1",
11351 [ALC262_FUJITSU] = "fujitsu",
11352 [ALC262_HP_BPC] = "hp-bpc",
cd7509a4 11353 [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
61dc35de 11354 [ALC262_HP_TC_T5735] = "hp-tc-t5735",
8c427226 11355 [ALC262_HP_RP5700] = "hp-rp5700",
f5fcc13c 11356 [ALC262_BENQ_ED8] = "benq",
0f40502e
TI
11357 [ALC262_BENQ_T31] = "benq-t31",
11358 [ALC262_SONY_ASSAMD] = "sony-assamd",
2922c9af 11359 [ALC262_TOSHIBA_S06] = "toshiba-s06",
9f99a638 11360 [ALC262_TOSHIBA_RX1] = "toshiba-rx1",
f651b50b 11361 [ALC262_ULTRA] = "ultra",
0e31daf7 11362 [ALC262_LENOVO_3000] = "lenovo-3000",
e8f9ae2a 11363 [ALC262_NEC] = "nec",
ba340e82 11364 [ALC262_TYAN] = "tyan",
f5fcc13c
TI
11365 [ALC262_AUTO] = "auto",
11366};
11367
11368static struct snd_pci_quirk alc262_cfg_tbl[] = {
11369 SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
e8f9ae2a 11370 SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
dea0a509
TI
11371 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
11372 ALC262_HP_BPC),
11373 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
11374 ALC262_HP_BPC),
53eff7e1
TI
11375 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
11376 ALC262_HP_BPC),
cd7509a4 11377 SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
cd7509a4 11378 SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
ac3e3741 11379 SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
cd7509a4 11380 SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
ac3e3741 11381 SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
cd7509a4 11382 SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
ac3e3741 11383 SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
cd7509a4 11384 SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
ac3e3741
TI
11385 SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
11386 SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
11387 SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
66d2a9d6
KY
11388 SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
11389 ALC262_HP_TC_T5735),
8c427226 11390 SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
ac3e3741 11391 SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
f5fcc13c 11392 SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
5b31954e 11393 SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
bd6afe3f 11394 SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
376b508f 11395 SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
95491d90 11396 SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
12929bae 11397 SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
c5b5165c 11398#if 0 /* disable the quirk since model=auto works better in recent versions */
f872a919
TI
11399 SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
11400 ALC262_SONY_ASSAMD),
c5b5165c 11401#endif
36ca6e13 11402 SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
9f99a638 11403 ALC262_TOSHIBA_RX1),
80ffe869 11404 SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
ac3e3741 11405 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
3f1eeaed 11406 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
ba340e82 11407 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
dea0a509
TI
11408 SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
11409 ALC262_ULTRA),
3e420e78 11410 SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
0e31daf7 11411 SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
ac3e3741
TI
11412 SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
11413 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
11414 SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
df694daa
KY
11415 {}
11416};
11417
11418static struct alc_config_preset alc262_presets[] = {
11419 [ALC262_BASIC] = {
11420 .mixers = { alc262_base_mixer },
11421 .init_verbs = { alc262_init_verbs },
11422 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11423 .dac_nids = alc262_dac_nids,
11424 .hp_nid = 0x03,
11425 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11426 .channel_mode = alc262_modes,
a3bcba38 11427 .input_mux = &alc262_capture_source,
df694daa 11428 },
ccc656ce 11429 [ALC262_HIPPO] = {
42171c17 11430 .mixers = { alc262_hippo_mixer },
6732bd0d 11431 .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
ccc656ce
KY
11432 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11433 .dac_nids = alc262_dac_nids,
11434 .hp_nid = 0x03,
11435 .dig_out_nid = ALC262_DIGOUT_NID,
11436 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11437 .channel_mode = alc262_modes,
11438 .input_mux = &alc262_capture_source,
11439 .unsol_event = alc262_hippo_unsol_event,
4f5d1706
TI
11440 .setup = alc262_hippo_setup,
11441 .init_hook = alc262_hippo_automute,
ccc656ce
KY
11442 },
11443 [ALC262_HIPPO_1] = {
11444 .mixers = { alc262_hippo1_mixer },
11445 .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
11446 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11447 .dac_nids = alc262_dac_nids,
11448 .hp_nid = 0x02,
11449 .dig_out_nid = ALC262_DIGOUT_NID,
11450 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11451 .channel_mode = alc262_modes,
11452 .input_mux = &alc262_capture_source,
42171c17 11453 .unsol_event = alc262_hippo_unsol_event,
4f5d1706
TI
11454 .setup = alc262_hippo1_setup,
11455 .init_hook = alc262_hippo_automute,
ccc656ce 11456 },
834be88d
TI
11457 [ALC262_FUJITSU] = {
11458 .mixers = { alc262_fujitsu_mixer },
39d3ed38
TI
11459 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
11460 alc262_fujitsu_unsol_verbs },
834be88d
TI
11461 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11462 .dac_nids = alc262_dac_nids,
11463 .hp_nid = 0x03,
11464 .dig_out_nid = ALC262_DIGOUT_NID,
11465 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11466 .channel_mode = alc262_modes,
11467 .input_mux = &alc262_fujitsu_capture_source,
ae6b813a 11468 .unsol_event = alc262_fujitsu_unsol_event,
ebc7a406 11469 .init_hook = alc262_fujitsu_init_hook,
834be88d 11470 },
9c7f852e
TI
11471 [ALC262_HP_BPC] = {
11472 .mixers = { alc262_HP_BPC_mixer },
11473 .init_verbs = { alc262_HP_BPC_init_verbs },
11474 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11475 .dac_nids = alc262_dac_nids,
11476 .hp_nid = 0x03,
11477 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11478 .channel_mode = alc262_modes,
11479 .input_mux = &alc262_HP_capture_source,
ce875f07
TI
11480 .unsol_event = alc262_hp_bpc_unsol_event,
11481 .init_hook = alc262_hp_bpc_automute,
f12ab1e0 11482 },
cd7509a4
KY
11483 [ALC262_HP_BPC_D7000_WF] = {
11484 .mixers = { alc262_HP_BPC_WildWest_mixer },
11485 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
11486 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11487 .dac_nids = alc262_dac_nids,
11488 .hp_nid = 0x03,
11489 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11490 .channel_mode = alc262_modes,
accbe498 11491 .input_mux = &alc262_HP_D7000_capture_source,
ce875f07
TI
11492 .unsol_event = alc262_hp_wildwest_unsol_event,
11493 .init_hook = alc262_hp_wildwest_automute,
f12ab1e0 11494 },
cd7509a4
KY
11495 [ALC262_HP_BPC_D7000_WL] = {
11496 .mixers = { alc262_HP_BPC_WildWest_mixer,
11497 alc262_HP_BPC_WildWest_option_mixer },
11498 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
11499 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11500 .dac_nids = alc262_dac_nids,
11501 .hp_nid = 0x03,
11502 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11503 .channel_mode = alc262_modes,
accbe498 11504 .input_mux = &alc262_HP_D7000_capture_source,
ce875f07
TI
11505 .unsol_event = alc262_hp_wildwest_unsol_event,
11506 .init_hook = alc262_hp_wildwest_automute,
f12ab1e0 11507 },
66d2a9d6
KY
11508 [ALC262_HP_TC_T5735] = {
11509 .mixers = { alc262_hp_t5735_mixer },
11510 .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
11511 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11512 .dac_nids = alc262_dac_nids,
11513 .hp_nid = 0x03,
11514 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11515 .channel_mode = alc262_modes,
11516 .input_mux = &alc262_capture_source,
a9fd4f3f 11517 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
11518 .setup = alc262_hp_t5735_setup,
11519 .init_hook = alc_automute_amp,
8c427226
KY
11520 },
11521 [ALC262_HP_RP5700] = {
11522 .mixers = { alc262_hp_rp5700_mixer },
11523 .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
11524 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11525 .dac_nids = alc262_dac_nids,
11526 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11527 .channel_mode = alc262_modes,
11528 .input_mux = &alc262_hp_rp5700_capture_source,
66d2a9d6 11529 },
304dcaac
TI
11530 [ALC262_BENQ_ED8] = {
11531 .mixers = { alc262_base_mixer },
11532 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
11533 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11534 .dac_nids = alc262_dac_nids,
11535 .hp_nid = 0x03,
11536 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11537 .channel_mode = alc262_modes,
11538 .input_mux = &alc262_capture_source,
f12ab1e0 11539 },
272a527c
KY
11540 [ALC262_SONY_ASSAMD] = {
11541 .mixers = { alc262_sony_mixer },
11542 .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
11543 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11544 .dac_nids = alc262_dac_nids,
11545 .hp_nid = 0x02,
11546 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11547 .channel_mode = alc262_modes,
11548 .input_mux = &alc262_capture_source,
11549 .unsol_event = alc262_hippo_unsol_event,
4f5d1706
TI
11550 .setup = alc262_hippo_setup,
11551 .init_hook = alc262_hippo_automute,
83c34218
KY
11552 },
11553 [ALC262_BENQ_T31] = {
11554 .mixers = { alc262_benq_t31_mixer },
6732bd0d
WF
11555 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
11556 alc_hp15_unsol_verbs },
83c34218
KY
11557 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11558 .dac_nids = alc262_dac_nids,
11559 .hp_nid = 0x03,
11560 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11561 .channel_mode = alc262_modes,
11562 .input_mux = &alc262_capture_source,
11563 .unsol_event = alc262_hippo_unsol_event,
4f5d1706
TI
11564 .setup = alc262_hippo_setup,
11565 .init_hook = alc262_hippo_automute,
ea1fb29a 11566 },
f651b50b 11567 [ALC262_ULTRA] = {
f9e336f6
TI
11568 .mixers = { alc262_ultra_mixer },
11569 .cap_mixer = alc262_ultra_capture_mixer,
bb9f76cd 11570 .init_verbs = { alc262_ultra_verbs },
f651b50b
TD
11571 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11572 .dac_nids = alc262_dac_nids,
f651b50b
TD
11573 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11574 .channel_mode = alc262_modes,
11575 .input_mux = &alc262_ultra_capture_source,
bb9f76cd
TI
11576 .adc_nids = alc262_adc_nids, /* ADC0 */
11577 .capsrc_nids = alc262_capsrc_nids,
11578 .num_adc_nids = 1, /* single ADC */
f651b50b
TD
11579 .unsol_event = alc262_ultra_unsol_event,
11580 .init_hook = alc262_ultra_automute,
11581 },
0e31daf7
J
11582 [ALC262_LENOVO_3000] = {
11583 .mixers = { alc262_lenovo_3000_mixer },
11584 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
11585 alc262_lenovo_3000_unsol_verbs },
11586 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11587 .dac_nids = alc262_dac_nids,
11588 .hp_nid = 0x03,
11589 .dig_out_nid = ALC262_DIGOUT_NID,
11590 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11591 .channel_mode = alc262_modes,
11592 .input_mux = &alc262_fujitsu_capture_source,
11593 .unsol_event = alc262_lenovo_3000_unsol_event,
11594 },
e8f9ae2a
PT
11595 [ALC262_NEC] = {
11596 .mixers = { alc262_nec_mixer },
11597 .init_verbs = { alc262_nec_verbs },
11598 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11599 .dac_nids = alc262_dac_nids,
11600 .hp_nid = 0x03,
11601 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11602 .channel_mode = alc262_modes,
11603 .input_mux = &alc262_capture_source,
11604 },
4e555fe5
KY
11605 [ALC262_TOSHIBA_S06] = {
11606 .mixers = { alc262_toshiba_s06_mixer },
11607 .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
11608 alc262_eapd_verbs },
11609 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11610 .capsrc_nids = alc262_dmic_capsrc_nids,
11611 .dac_nids = alc262_dac_nids,
11612 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
ae14ef68 11613 .num_adc_nids = 1, /* single ADC */
4e555fe5
KY
11614 .dig_out_nid = ALC262_DIGOUT_NID,
11615 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11616 .channel_mode = alc262_modes,
4f5d1706
TI
11617 .unsol_event = alc_sku_unsol_event,
11618 .setup = alc262_toshiba_s06_setup,
11619 .init_hook = alc_inithook,
4e555fe5 11620 },
9f99a638
HM
11621 [ALC262_TOSHIBA_RX1] = {
11622 .mixers = { alc262_toshiba_rx1_mixer },
11623 .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
11624 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11625 .dac_nids = alc262_dac_nids,
11626 .hp_nid = 0x03,
11627 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11628 .channel_mode = alc262_modes,
11629 .input_mux = &alc262_capture_source,
11630 .unsol_event = alc262_hippo_unsol_event,
4f5d1706
TI
11631 .setup = alc262_hippo_setup,
11632 .init_hook = alc262_hippo_automute,
9f99a638 11633 },
ba340e82
TV
11634 [ALC262_TYAN] = {
11635 .mixers = { alc262_tyan_mixer },
11636 .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
11637 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11638 .dac_nids = alc262_dac_nids,
11639 .hp_nid = 0x02,
11640 .dig_out_nid = ALC262_DIGOUT_NID,
11641 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11642 .channel_mode = alc262_modes,
11643 .input_mux = &alc262_capture_source,
a9fd4f3f 11644 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
11645 .setup = alc262_tyan_setup,
11646 .init_hook = alc_automute_amp,
ba340e82 11647 },
df694daa
KY
11648};
11649
11650static int patch_alc262(struct hda_codec *codec)
11651{
11652 struct alc_spec *spec;
11653 int board_config;
11654 int err;
11655
dc041e0b 11656 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
df694daa
KY
11657 if (spec == NULL)
11658 return -ENOMEM;
11659
11660 codec->spec = spec;
11661#if 0
f12ab1e0
TI
11662 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is
11663 * under-run
11664 */
df694daa
KY
11665 {
11666 int tmp;
11667 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
11668 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
11669 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
11670 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
11671 }
11672#endif
11673
2c3bf9ab
TI
11674 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
11675
f5fcc13c
TI
11676 board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
11677 alc262_models,
11678 alc262_cfg_tbl);
cd7509a4 11679
f5fcc13c 11680 if (board_config < 0) {
9a11f1aa
TI
11681 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
11682 codec->chip_name);
df694daa
KY
11683 board_config = ALC262_AUTO;
11684 }
11685
11686 if (board_config == ALC262_AUTO) {
11687 /* automatic parse from the BIOS config */
11688 err = alc262_parse_auto_config(codec);
11689 if (err < 0) {
11690 alc_free(codec);
11691 return err;
f12ab1e0 11692 } else if (!err) {
9c7f852e
TI
11693 printk(KERN_INFO
11694 "hda_codec: Cannot set up configuration "
11695 "from BIOS. Using base mode...\n");
df694daa
KY
11696 board_config = ALC262_BASIC;
11697 }
11698 }
11699
07eba61d
TI
11700 if (!spec->no_analog) {
11701 err = snd_hda_attach_beep_device(codec, 0x1);
11702 if (err < 0) {
11703 alc_free(codec);
11704 return err;
11705 }
680cd536
KK
11706 }
11707
df694daa 11708 if (board_config != ALC262_AUTO)
e9c364c0 11709 setup_preset(codec, &alc262_presets[board_config]);
df694daa 11710
df694daa
KY
11711 spec->stream_analog_playback = &alc262_pcm_analog_playback;
11712 spec->stream_analog_capture = &alc262_pcm_analog_capture;
ea1fb29a 11713
df694daa
KY
11714 spec->stream_digital_playback = &alc262_pcm_digital_playback;
11715 spec->stream_digital_capture = &alc262_pcm_digital_capture;
11716
f12ab1e0 11717 if (!spec->adc_nids && spec->input_mux) {
8c927b4a
TI
11718 int i;
11719 /* check whether the digital-mic has to be supported */
11720 for (i = 0; i < spec->input_mux->num_items; i++) {
11721 if (spec->input_mux->items[i].index >= 9)
11722 break;
11723 }
11724 if (i < spec->input_mux->num_items) {
11725 /* use only ADC0 */
11726 spec->adc_nids = alc262_dmic_adc_nids;
11727 spec->num_adc_nids = 1;
11728 spec->capsrc_nids = alc262_dmic_capsrc_nids;
df694daa 11729 } else {
8c927b4a
TI
11730 /* all analog inputs */
11731 /* check whether NID 0x07 is valid */
11732 unsigned int wcap = get_wcaps(codec, 0x07);
11733
11734 /* get type */
a22d543a 11735 wcap = get_wcaps_type(wcap);
8c927b4a
TI
11736 if (wcap != AC_WID_AUD_IN) {
11737 spec->adc_nids = alc262_adc_nids_alt;
11738 spec->num_adc_nids =
11739 ARRAY_SIZE(alc262_adc_nids_alt);
11740 spec->capsrc_nids = alc262_capsrc_nids_alt;
11741 } else {
11742 spec->adc_nids = alc262_adc_nids;
11743 spec->num_adc_nids =
11744 ARRAY_SIZE(alc262_adc_nids);
11745 spec->capsrc_nids = alc262_capsrc_nids;
11746 }
df694daa
KY
11747 }
11748 }
e64f14f4 11749 if (!spec->cap_mixer && !spec->no_analog)
b59bdf3b 11750 set_capture_mixer(codec);
07eba61d
TI
11751 if (!spec->no_analog)
11752 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
df694daa 11753
2134ea4f
TI
11754 spec->vmaster_nid = 0x0c;
11755
df694daa
KY
11756 codec->patch_ops = alc_patch_ops;
11757 if (board_config == ALC262_AUTO)
ae6b813a 11758 spec->init_hook = alc262_auto_init;
cb53c626
TI
11759#ifdef CONFIG_SND_HDA_POWER_SAVE
11760 if (!spec->loopback.amplist)
11761 spec->loopback.amplist = alc262_loopbacks;
11762#endif
daead538 11763 codec->proc_widget_hook = print_realtek_coef;
ea1fb29a 11764
df694daa
KY
11765 return 0;
11766}
11767
a361d84b
KY
11768/*
11769 * ALC268 channel source setting (2 channel)
11770 */
11771#define ALC268_DIGOUT_NID ALC880_DIGOUT_NID
11772#define alc268_modes alc260_modes
ea1fb29a 11773
a361d84b
KY
11774static hda_nid_t alc268_dac_nids[2] = {
11775 /* front, hp */
11776 0x02, 0x03
11777};
11778
11779static hda_nid_t alc268_adc_nids[2] = {
11780 /* ADC0-1 */
11781 0x08, 0x07
11782};
11783
11784static hda_nid_t alc268_adc_nids_alt[1] = {
11785 /* ADC0 */
11786 0x08
11787};
11788
e1406348
TI
11789static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
11790
a361d84b
KY
11791static struct snd_kcontrol_new alc268_base_mixer[] = {
11792 /* output mixer control */
11793 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
11794 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11795 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
11796 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
33bf17ab
TI
11797 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11798 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11799 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
a361d84b
KY
11800 { }
11801};
11802
42171c17
TI
11803static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
11804 /* output mixer control */
11805 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
11806 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
11807 ALC262_HIPPO_MASTER_SWITCH,
11808 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11809 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11810 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
11811 { }
11812};
11813
aef9d318
TI
11814/* bind Beep switches of both NID 0x0f and 0x10 */
11815static struct hda_bind_ctls alc268_bind_beep_sw = {
11816 .ops = &snd_hda_bind_sw,
11817 .values = {
11818 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
11819 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
11820 0
11821 },
11822};
11823
11824static struct snd_kcontrol_new alc268_beep_mixer[] = {
11825 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
11826 HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
11827 { }
11828};
11829
d1a991a6
KY
11830static struct hda_verb alc268_eapd_verbs[] = {
11831 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
11832 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
11833 { }
11834};
11835
d273809e 11836/* Toshiba specific */
d273809e
TI
11837static struct hda_verb alc268_toshiba_verbs[] = {
11838 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11839 { } /* end */
11840};
11841
11842/* Acer specific */
889c4395 11843/* bind volumes of both NID 0x02 and 0x03 */
6bc96857
TI
11844static struct hda_bind_ctls alc268_acer_bind_master_vol = {
11845 .ops = &snd_hda_bind_vol,
11846 .values = {
11847 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
11848 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
11849 0
11850 },
11851};
11852
889c4395
TI
11853/* mute/unmute internal speaker according to the hp jack and mute state */
11854static void alc268_acer_automute(struct hda_codec *codec, int force)
11855{
11856 struct alc_spec *spec = codec->spec;
11857 unsigned int mute;
11858
11859 if (force || !spec->sense_updated) {
864f92be 11860 spec->jack_present = snd_hda_jack_detect(codec, 0x14);
889c4395
TI
11861 spec->sense_updated = 1;
11862 }
11863 if (spec->jack_present)
11864 mute = HDA_AMP_MUTE; /* mute internal speaker */
11865 else /* unmute internal speaker if necessary */
11866 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
11867 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11868 HDA_AMP_MUTE, mute);
11869}
11870
11871
11872/* bind hp and internal speaker mute (with plug check) */
11873static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
11874 struct snd_ctl_elem_value *ucontrol)
11875{
11876 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11877 long *valp = ucontrol->value.integer.value;
11878 int change;
11879
8de56b7d 11880 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
889c4395
TI
11881 if (change)
11882 alc268_acer_automute(codec, 0);
11883 return change;
11884}
d273809e 11885
8ef355da
KY
11886static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
11887 /* output mixer control */
11888 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
11889 {
11890 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11891 .name = "Master Playback Switch",
11892 .info = snd_hda_mixer_amp_switch_info,
11893 .get = snd_hda_mixer_amp_switch_get,
11894 .put = alc268_acer_master_sw_put,
11895 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11896 },
11897 HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
11898 { }
11899};
11900
d273809e
TI
11901static struct snd_kcontrol_new alc268_acer_mixer[] = {
11902 /* output mixer control */
11903 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
11904 {
11905 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11906 .name = "Master Playback Switch",
11907 .info = snd_hda_mixer_amp_switch_info,
11908 .get = snd_hda_mixer_amp_switch_get,
11909 .put = alc268_acer_master_sw_put,
11910 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11911 },
33bf17ab
TI
11912 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11913 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
11914 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
d273809e
TI
11915 { }
11916};
11917
c238b4f4
TI
11918static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
11919 /* output mixer control */
11920 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
11921 {
11922 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11923 .name = "Master Playback Switch",
11924 .info = snd_hda_mixer_amp_switch_info,
11925 .get = snd_hda_mixer_amp_switch_get,
11926 .put = alc268_acer_master_sw_put,
11927 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11928 },
11929 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11930 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
11931 { }
11932};
11933
8ef355da
KY
11934static struct hda_verb alc268_acer_aspire_one_verbs[] = {
11935 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11936 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11937 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11938 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
11939 {0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
11940 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
11941 { }
11942};
11943
d273809e 11944static struct hda_verb alc268_acer_verbs[] = {
0ccb541c
TI
11945 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
11946 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
d273809e
TI
11947 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11948 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
0ccb541c
TI
11949 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
11950 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
d273809e
TI
11951 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11952 { }
11953};
11954
11955/* unsolicited event for HP jack sensing */
42171c17 11956#define alc268_toshiba_unsol_event alc262_hippo_unsol_event
4f5d1706
TI
11957#define alc268_toshiba_setup alc262_hippo_setup
11958#define alc268_toshiba_automute alc262_hippo_automute
d273809e
TI
11959
11960static void alc268_acer_unsol_event(struct hda_codec *codec,
11961 unsigned int res)
11962{
889c4395 11963 if ((res >> 26) != ALC880_HP_EVENT)
d273809e
TI
11964 return;
11965 alc268_acer_automute(codec, 1);
11966}
11967
889c4395
TI
11968static void alc268_acer_init_hook(struct hda_codec *codec)
11969{
11970 alc268_acer_automute(codec, 1);
11971}
11972
8ef355da
KY
11973/* toggle speaker-output according to the hp-jack state */
11974static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
11975{
11976 unsigned int present;
11977 unsigned char bits;
11978
864f92be 11979 present = snd_hda_jack_detect(codec, 0x15);
8ef355da
KY
11980 bits = present ? AMP_IN_MUTE(0) : 0;
11981 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
11982 AMP_IN_MUTE(0), bits);
11983 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
11984 AMP_IN_MUTE(0), bits);
11985}
11986
8ef355da
KY
11987static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
11988 unsigned int res)
11989{
4f5d1706
TI
11990 switch (res >> 26) {
11991 case ALC880_HP_EVENT:
8ef355da 11992 alc268_aspire_one_speaker_automute(codec);
4f5d1706
TI
11993 break;
11994 case ALC880_MIC_EVENT:
11995 alc_mic_automute(codec);
11996 break;
11997 }
11998}
11999
12000static void alc268_acer_lc_setup(struct hda_codec *codec)
12001{
12002 struct alc_spec *spec = codec->spec;
12003 spec->ext_mic.pin = 0x18;
12004 spec->ext_mic.mux_idx = 0;
12005 spec->int_mic.pin = 0x12;
12006 spec->int_mic.mux_idx = 6;
12007 spec->auto_mic = 1;
8ef355da
KY
12008}
12009
12010static void alc268_acer_lc_init_hook(struct hda_codec *codec)
12011{
12012 alc268_aspire_one_speaker_automute(codec);
4f5d1706 12013 alc_mic_automute(codec);
8ef355da
KY
12014}
12015
3866f0b0
TI
12016static struct snd_kcontrol_new alc268_dell_mixer[] = {
12017 /* output mixer control */
12018 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12019 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12020 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12021 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12022 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12023 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12024 { }
12025};
12026
12027static struct hda_verb alc268_dell_verbs[] = {
12028 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12029 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12030 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
4f5d1706 12031 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
3866f0b0
TI
12032 { }
12033};
12034
12035/* mute/unmute internal speaker according to the hp jack and mute state */
4f5d1706 12036static void alc268_dell_setup(struct hda_codec *codec)
3866f0b0 12037{
a9fd4f3f 12038 struct alc_spec *spec = codec->spec;
3866f0b0 12039
a9fd4f3f
TI
12040 spec->autocfg.hp_pins[0] = 0x15;
12041 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
12042 spec->ext_mic.pin = 0x18;
12043 spec->ext_mic.mux_idx = 0;
12044 spec->int_mic.pin = 0x19;
12045 spec->int_mic.mux_idx = 1;
12046 spec->auto_mic = 1;
3866f0b0
TI
12047}
12048
eb5a6621
HRK
12049static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
12050 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12051 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12052 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12053 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12054 HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12055 HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
12056 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
12057 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
12058 { }
12059};
12060
12061static struct hda_verb alc267_quanta_il1_verbs[] = {
12062 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12063 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12064 { }
12065};
12066
4f5d1706 12067static void alc267_quanta_il1_setup(struct hda_codec *codec)
eb5a6621 12068{
a9fd4f3f 12069 struct alc_spec *spec = codec->spec;
a9fd4f3f
TI
12070 spec->autocfg.hp_pins[0] = 0x15;
12071 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
12072 spec->ext_mic.pin = 0x18;
12073 spec->ext_mic.mux_idx = 0;
12074 spec->int_mic.pin = 0x19;
12075 spec->int_mic.mux_idx = 1;
12076 spec->auto_mic = 1;
eb5a6621
HRK
12077}
12078
a361d84b
KY
12079/*
12080 * generic initialization of ADC, input mixers and output mixers
12081 */
12082static struct hda_verb alc268_base_init_verbs[] = {
12083 /* Unmute DAC0-1 and set vol = 0 */
12084 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
a361d84b 12085 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
a361d84b
KY
12086
12087 /*
12088 * Set up output mixers (0x0c - 0x0e)
12089 */
12090 /* set vol=0 to output mixers */
12091 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
a361d84b
KY
12092 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
12093
12094 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12095 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12096
12097 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12098 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
12099 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12100 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12101 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12102 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12103 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12104 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12105
12106 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12107 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12108 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12109 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
a361d84b 12110 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
aef9d318
TI
12111
12112 /* set PCBEEP vol = 0, mute connections */
12113 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12114 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12115 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
a361d84b 12116
a9b3aa8a 12117 /* Unmute Selector 23h,24h and set the default input to mic-in */
ea1fb29a 12118
a9b3aa8a
JZ
12119 {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
12120 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12121 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
12122 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
a361d84b 12123
a361d84b
KY
12124 { }
12125};
12126
12127/*
12128 * generic initialization of ADC, input mixers and output mixers
12129 */
12130static struct hda_verb alc268_volume_init_verbs[] = {
12131 /* set output DAC */
4cfb91c6
TI
12132 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12133 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
a361d84b
KY
12134
12135 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12136 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12137 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12138 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12139 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12140
a361d84b 12141 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
a361d84b
KY
12142 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12143 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12144
12145 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
a361d84b 12146 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
a361d84b 12147
aef9d318
TI
12148 /* set PCBEEP vol = 0, mute connections */
12149 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12150 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12151 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
a361d84b
KY
12152
12153 { }
12154};
12155
fdbc6626
TI
12156static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
12157 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12158 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12159 { } /* end */
12160};
12161
a361d84b
KY
12162static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
12163 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12164 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
fdbc6626 12165 _DEFINE_CAPSRC(1),
a361d84b
KY
12166 { } /* end */
12167};
12168
12169static struct snd_kcontrol_new alc268_capture_mixer[] = {
12170 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12171 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12172 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
12173 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
fdbc6626 12174 _DEFINE_CAPSRC(2),
a361d84b
KY
12175 { } /* end */
12176};
12177
12178static struct hda_input_mux alc268_capture_source = {
12179 .num_items = 4,
12180 .items = {
12181 { "Mic", 0x0 },
12182 { "Front Mic", 0x1 },
12183 { "Line", 0x2 },
12184 { "CD", 0x3 },
12185 },
12186};
12187
0ccb541c 12188static struct hda_input_mux alc268_acer_capture_source = {
c238b4f4
TI
12189 .num_items = 3,
12190 .items = {
12191 { "Mic", 0x0 },
12192 { "Internal Mic", 0x1 },
12193 { "Line", 0x2 },
12194 },
12195};
12196
12197static struct hda_input_mux alc268_acer_dmic_capture_source = {
0ccb541c
TI
12198 .num_items = 3,
12199 .items = {
12200 { "Mic", 0x0 },
12201 { "Internal Mic", 0x6 },
12202 { "Line", 0x2 },
12203 },
12204};
12205
86c53bd2
JW
12206#ifdef CONFIG_SND_DEBUG
12207static struct snd_kcontrol_new alc268_test_mixer[] = {
86c53bd2
JW
12208 /* Volume widgets */
12209 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12210 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12211 HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
12212 HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
12213 HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
12214 HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
12215 HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
12216 HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
12217 HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
12218 HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
12219 HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
12220 HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
12221 HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
f0747ee6
TI
12222 /* The below appears problematic on some hardwares */
12223 /*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
86c53bd2
JW
12224 HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12225 HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
12226 HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
12227 HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
12228
12229 /* Modes for retasking pin widgets */
12230 ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
12231 ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
12232 ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
12233 ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
12234
12235 /* Controls for GPIO pins, assuming they are configured as outputs */
12236 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
12237 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
12238 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
12239 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
12240
12241 /* Switches to allow the digital SPDIF output pin to be enabled.
12242 * The ALC268 does not have an SPDIF input.
12243 */
12244 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
12245
12246 /* A switch allowing EAPD to be enabled. Some laptops seem to use
12247 * this output to turn on an external amplifier.
12248 */
12249 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
12250 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
12251
12252 { } /* end */
12253};
12254#endif
12255
a361d84b
KY
12256/* create input playback/capture controls for the given pin */
12257static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
12258 const char *ctlname, int idx)
12259{
3f3b7c1a 12260 hda_nid_t dac;
a361d84b
KY
12261 int err;
12262
3f3b7c1a
TI
12263 switch (nid) {
12264 case 0x14:
12265 case 0x16:
12266 dac = 0x02;
12267 break;
12268 case 0x15:
12269 dac = 0x03;
12270 break;
12271 default:
12272 return 0;
12273 }
12274 if (spec->multiout.dac_nids[0] != dac &&
12275 spec->multiout.dac_nids[1] != dac) {
0afe5f89 12276 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
3f3b7c1a 12277 HDA_COMPOSE_AMP_VAL(dac, 3, idx,
a361d84b
KY
12278 HDA_OUTPUT));
12279 if (err < 0)
12280 return err;
3f3b7c1a
TI
12281 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
12282 }
12283
3f3b7c1a 12284 if (nid != 0x16)
0afe5f89 12285 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
a361d84b 12286 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
3f3b7c1a 12287 else /* mono */
0afe5f89 12288 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
3f3b7c1a 12289 HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
a361d84b
KY
12290 if (err < 0)
12291 return err;
12292 return 0;
12293}
12294
12295/* add playback controls from the parsed DAC table */
12296static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
12297 const struct auto_pin_cfg *cfg)
12298{
12299 hda_nid_t nid;
12300 int err;
12301
a361d84b 12302 spec->multiout.dac_nids = spec->private_dac_nids;
a361d84b
KY
12303
12304 nid = cfg->line_out_pins[0];
3f3b7c1a
TI
12305 if (nid) {
12306 const char *name;
12307 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
12308 name = "Speaker";
12309 else
12310 name = "Front";
12311 err = alc268_new_analog_output(spec, nid, name, 0);
12312 if (err < 0)
12313 return err;
12314 }
a361d84b
KY
12315
12316 nid = cfg->speaker_pins[0];
12317 if (nid == 0x1d) {
0afe5f89 12318 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
a361d84b
KY
12319 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
12320 if (err < 0)
12321 return err;
3f3b7c1a
TI
12322 } else {
12323 err = alc268_new_analog_output(spec, nid, "Speaker", 0);
12324 if (err < 0)
12325 return err;
a361d84b
KY
12326 }
12327 nid = cfg->hp_pins[0];
3f3b7c1a
TI
12328 if (nid) {
12329 err = alc268_new_analog_output(spec, nid, "Headphone", 0);
12330 if (err < 0)
12331 return err;
12332 }
a361d84b
KY
12333
12334 nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
12335 if (nid == 0x16) {
0afe5f89 12336 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
3f3b7c1a 12337 HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
a361d84b
KY
12338 if (err < 0)
12339 return err;
12340 }
ea1fb29a 12341 return 0;
a361d84b
KY
12342}
12343
12344/* create playback/capture controls for input pins */
05f5f477 12345static int alc268_auto_create_input_ctls(struct hda_codec *codec,
a361d84b
KY
12346 const struct auto_pin_cfg *cfg)
12347{
05f5f477 12348 return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
a361d84b
KY
12349}
12350
e9af4f36
TI
12351static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
12352 hda_nid_t nid, int pin_type)
12353{
12354 int idx;
12355
12356 alc_set_pin_output(codec, nid, pin_type);
12357 if (nid == 0x14 || nid == 0x16)
12358 idx = 0;
12359 else
12360 idx = 1;
12361 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
12362}
12363
12364static void alc268_auto_init_multi_out(struct hda_codec *codec)
12365{
12366 struct alc_spec *spec = codec->spec;
12367 hda_nid_t nid = spec->autocfg.line_out_pins[0];
12368 if (nid) {
12369 int pin_type = get_pin_type(spec->autocfg.line_out_type);
12370 alc268_auto_set_output_and_unmute(codec, nid, pin_type);
12371 }
12372}
12373
12374static void alc268_auto_init_hp_out(struct hda_codec *codec)
12375{
12376 struct alc_spec *spec = codec->spec;
12377 hda_nid_t pin;
12378
12379 pin = spec->autocfg.hp_pins[0];
12380 if (pin)
12381 alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
12382 pin = spec->autocfg.speaker_pins[0];
12383 if (pin)
12384 alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
12385}
12386
a361d84b
KY
12387static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
12388{
12389 struct alc_spec *spec = codec->spec;
12390 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
12391 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
12392 hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
12393 unsigned int dac_vol1, dac_vol2;
12394
e9af4f36 12395 if (line_nid == 0x1d || speaker_nid == 0x1d) {
a361d84b
KY
12396 snd_hda_codec_write(codec, speaker_nid, 0,
12397 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
e9af4f36 12398 /* mute mixer inputs from 0x1d */
a361d84b
KY
12399 snd_hda_codec_write(codec, 0x0f, 0,
12400 AC_VERB_SET_AMP_GAIN_MUTE,
12401 AMP_IN_UNMUTE(1));
12402 snd_hda_codec_write(codec, 0x10, 0,
12403 AC_VERB_SET_AMP_GAIN_MUTE,
12404 AMP_IN_UNMUTE(1));
12405 } else {
e9af4f36 12406 /* unmute mixer inputs from 0x1d */
a361d84b
KY
12407 snd_hda_codec_write(codec, 0x0f, 0,
12408 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12409 snd_hda_codec_write(codec, 0x10, 0,
12410 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12411 }
12412
12413 dac_vol1 = dac_vol2 = 0xb000 | 0x40; /* set max volume */
ea1fb29a 12414 if (line_nid == 0x14)
a361d84b
KY
12415 dac_vol2 = AMP_OUT_ZERO;
12416 else if (line_nid == 0x15)
12417 dac_vol1 = AMP_OUT_ZERO;
ea1fb29a 12418 if (hp_nid == 0x14)
a361d84b
KY
12419 dac_vol2 = AMP_OUT_ZERO;
12420 else if (hp_nid == 0x15)
12421 dac_vol1 = AMP_OUT_ZERO;
12422 if (line_nid != 0x16 || hp_nid != 0x16 ||
12423 spec->autocfg.line_out_pins[1] != 0x16 ||
12424 spec->autocfg.line_out_pins[2] != 0x16)
12425 dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
12426
12427 snd_hda_codec_write(codec, 0x02, 0,
12428 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
12429 snd_hda_codec_write(codec, 0x03, 0,
12430 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
12431}
12432
def319f9 12433/* pcm configuration: identical with ALC880 */
a361d84b
KY
12434#define alc268_pcm_analog_playback alc880_pcm_analog_playback
12435#define alc268_pcm_analog_capture alc880_pcm_analog_capture
6330079f 12436#define alc268_pcm_analog_alt_capture alc880_pcm_analog_alt_capture
a361d84b
KY
12437#define alc268_pcm_digital_playback alc880_pcm_digital_playback
12438
12439/*
12440 * BIOS auto configuration
12441 */
12442static int alc268_parse_auto_config(struct hda_codec *codec)
12443{
12444 struct alc_spec *spec = codec->spec;
12445 int err;
12446 static hda_nid_t alc268_ignore[] = { 0 };
12447
12448 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12449 alc268_ignore);
12450 if (err < 0)
12451 return err;
7e0e44d4
TI
12452 if (!spec->autocfg.line_outs) {
12453 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
12454 spec->multiout.max_channels = 2;
12455 spec->no_analog = 1;
12456 goto dig_only;
12457 }
a361d84b 12458 return 0; /* can't find valid BIOS pin config */
7e0e44d4 12459 }
a361d84b
KY
12460 err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
12461 if (err < 0)
12462 return err;
05f5f477 12463 err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
a361d84b
KY
12464 if (err < 0)
12465 return err;
12466
12467 spec->multiout.max_channels = 2;
12468
7e0e44d4 12469 dig_only:
a361d84b 12470 /* digital only support output */
7e0e44d4 12471 if (spec->autocfg.dig_outs) {
a361d84b 12472 spec->multiout.dig_out_nid = ALC268_DIGOUT_NID;
7e0e44d4
TI
12473 spec->dig_out_type = spec->autocfg.dig_out_type[0];
12474 }
603c4019 12475 if (spec->kctls.list)
d88897ea 12476 add_mixer(spec, spec->kctls.list);
a361d84b 12477
892981ff 12478 if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
d88897ea 12479 add_mixer(spec, alc268_beep_mixer);
aef9d318 12480
d88897ea 12481 add_verb(spec, alc268_volume_init_verbs);
5908589f 12482 spec->num_mux_defs = 2;
61b9b9b1 12483 spec->input_mux = &spec->private_imux[0];
a361d84b 12484
776e184e
TI
12485 err = alc_auto_add_mic_boost(codec);
12486 if (err < 0)
12487 return err;
12488
1d955ebd
TI
12489 alc_ssid_check(codec, 0x15, 0x1b, 0x14);
12490
a361d84b
KY
12491 return 1;
12492}
12493
a361d84b
KY
12494#define alc268_auto_init_analog_input alc882_auto_init_analog_input
12495
12496/* init callback for auto-configuration model -- overriding the default init */
12497static void alc268_auto_init(struct hda_codec *codec)
12498{
f6c7e546 12499 struct alc_spec *spec = codec->spec;
a361d84b
KY
12500 alc268_auto_init_multi_out(codec);
12501 alc268_auto_init_hp_out(codec);
12502 alc268_auto_init_mono_speaker_out(codec);
12503 alc268_auto_init_analog_input(codec);
f6c7e546 12504 if (spec->unsol_event)
7fb0d78f 12505 alc_inithook(codec);
a361d84b
KY
12506}
12507
12508/*
12509 * configuration and preset
12510 */
12511static const char *alc268_models[ALC268_MODEL_LAST] = {
eb5a6621 12512 [ALC267_QUANTA_IL1] = "quanta-il1",
a361d84b 12513 [ALC268_3ST] = "3stack",
983f8ae4 12514 [ALC268_TOSHIBA] = "toshiba",
d273809e 12515 [ALC268_ACER] = "acer",
c238b4f4 12516 [ALC268_ACER_DMIC] = "acer-dmic",
8ef355da 12517 [ALC268_ACER_ASPIRE_ONE] = "acer-aspire",
3866f0b0 12518 [ALC268_DELL] = "dell",
f12462c5 12519 [ALC268_ZEPTO] = "zepto",
86c53bd2
JW
12520#ifdef CONFIG_SND_DEBUG
12521 [ALC268_TEST] = "test",
12522#endif
a361d84b
KY
12523 [ALC268_AUTO] = "auto",
12524};
12525
12526static struct snd_pci_quirk alc268_cfg_tbl[] = {
a0b8f7d8 12527 SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
ac3e3741 12528 SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
dafc8357 12529 SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
ac3e3741 12530 SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
29a52c24 12531 SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
8ef355da
KY
12532 SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
12533 ALC268_ACER_ASPIRE_ONE),
3866f0b0 12534 SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
a1bf8088
DC
12535 SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
12536 "Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
33d78674
TI
12537 /* almost compatible with toshiba but with optional digital outs;
12538 * auto-probing seems working fine
12539 */
8871e5b9 12540 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
33d78674 12541 ALC268_AUTO),
a361d84b 12542 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
8871e5b9 12543 SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
378bd6a5 12544 SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
b875bf3a 12545 SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
eb5a6621 12546 SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
8871e5b9 12547 SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL),
a361d84b
KY
12548 {}
12549};
12550
3abf2f36
TI
12551/* Toshiba laptops have no unique PCI SSID but only codec SSID */
12552static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
12553 SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
12554 SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
12555 SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
12556 ALC268_TOSHIBA),
12557 {}
12558};
12559
a361d84b 12560static struct alc_config_preset alc268_presets[] = {
eb5a6621 12561 [ALC267_QUANTA_IL1] = {
fdbc6626
TI
12562 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
12563 alc268_capture_nosrc_mixer },
eb5a6621
HRK
12564 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12565 alc267_quanta_il1_verbs },
12566 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12567 .dac_nids = alc268_dac_nids,
12568 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12569 .adc_nids = alc268_adc_nids_alt,
12570 .hp_nid = 0x03,
12571 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12572 .channel_mode = alc268_modes,
4f5d1706
TI
12573 .unsol_event = alc_sku_unsol_event,
12574 .setup = alc267_quanta_il1_setup,
12575 .init_hook = alc_inithook,
eb5a6621 12576 },
a361d84b 12577 [ALC268_3ST] = {
aef9d318
TI
12578 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
12579 alc268_beep_mixer },
a361d84b
KY
12580 .init_verbs = { alc268_base_init_verbs },
12581 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12582 .dac_nids = alc268_dac_nids,
12583 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12584 .adc_nids = alc268_adc_nids_alt,
e1406348 12585 .capsrc_nids = alc268_capsrc_nids,
a361d84b
KY
12586 .hp_nid = 0x03,
12587 .dig_out_nid = ALC268_DIGOUT_NID,
12588 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12589 .channel_mode = alc268_modes,
12590 .input_mux = &alc268_capture_source,
12591 },
d1a991a6 12592 [ALC268_TOSHIBA] = {
42171c17 12593 .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
aef9d318 12594 alc268_beep_mixer },
d273809e
TI
12595 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12596 alc268_toshiba_verbs },
d1a991a6
KY
12597 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12598 .dac_nids = alc268_dac_nids,
12599 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12600 .adc_nids = alc268_adc_nids_alt,
e1406348 12601 .capsrc_nids = alc268_capsrc_nids,
d1a991a6
KY
12602 .hp_nid = 0x03,
12603 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12604 .channel_mode = alc268_modes,
12605 .input_mux = &alc268_capture_source,
d273809e 12606 .unsol_event = alc268_toshiba_unsol_event,
4f5d1706
TI
12607 .setup = alc268_toshiba_setup,
12608 .init_hook = alc268_toshiba_automute,
d273809e
TI
12609 },
12610 [ALC268_ACER] = {
432fd133 12611 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
aef9d318 12612 alc268_beep_mixer },
d273809e
TI
12613 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12614 alc268_acer_verbs },
12615 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12616 .dac_nids = alc268_dac_nids,
12617 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12618 .adc_nids = alc268_adc_nids_alt,
e1406348 12619 .capsrc_nids = alc268_capsrc_nids,
d273809e
TI
12620 .hp_nid = 0x02,
12621 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12622 .channel_mode = alc268_modes,
0ccb541c 12623 .input_mux = &alc268_acer_capture_source,
d273809e 12624 .unsol_event = alc268_acer_unsol_event,
889c4395 12625 .init_hook = alc268_acer_init_hook,
d1a991a6 12626 },
c238b4f4
TI
12627 [ALC268_ACER_DMIC] = {
12628 .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
12629 alc268_beep_mixer },
12630 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12631 alc268_acer_verbs },
12632 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12633 .dac_nids = alc268_dac_nids,
12634 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12635 .adc_nids = alc268_adc_nids_alt,
12636 .capsrc_nids = alc268_capsrc_nids,
12637 .hp_nid = 0x02,
12638 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12639 .channel_mode = alc268_modes,
12640 .input_mux = &alc268_acer_dmic_capture_source,
12641 .unsol_event = alc268_acer_unsol_event,
12642 .init_hook = alc268_acer_init_hook,
12643 },
8ef355da
KY
12644 [ALC268_ACER_ASPIRE_ONE] = {
12645 .mixers = { alc268_acer_aspire_one_mixer,
22971e3a 12646 alc268_beep_mixer,
fdbc6626 12647 alc268_capture_nosrc_mixer },
8ef355da
KY
12648 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12649 alc268_acer_aspire_one_verbs },
12650 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12651 .dac_nids = alc268_dac_nids,
12652 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12653 .adc_nids = alc268_adc_nids_alt,
12654 .capsrc_nids = alc268_capsrc_nids,
12655 .hp_nid = 0x03,
12656 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12657 .channel_mode = alc268_modes,
8ef355da 12658 .unsol_event = alc268_acer_lc_unsol_event,
4f5d1706 12659 .setup = alc268_acer_lc_setup,
8ef355da
KY
12660 .init_hook = alc268_acer_lc_init_hook,
12661 },
3866f0b0 12662 [ALC268_DELL] = {
fdbc6626
TI
12663 .mixers = { alc268_dell_mixer, alc268_beep_mixer,
12664 alc268_capture_nosrc_mixer },
3866f0b0
TI
12665 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12666 alc268_dell_verbs },
12667 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12668 .dac_nids = alc268_dac_nids,
fdbc6626
TI
12669 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12670 .adc_nids = alc268_adc_nids_alt,
12671 .capsrc_nids = alc268_capsrc_nids,
3866f0b0
TI
12672 .hp_nid = 0x02,
12673 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12674 .channel_mode = alc268_modes,
a9fd4f3f 12675 .unsol_event = alc_sku_unsol_event,
4f5d1706
TI
12676 .setup = alc268_dell_setup,
12677 .init_hook = alc_inithook,
3866f0b0 12678 },
f12462c5 12679 [ALC268_ZEPTO] = {
aef9d318
TI
12680 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
12681 alc268_beep_mixer },
f12462c5
MT
12682 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12683 alc268_toshiba_verbs },
12684 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12685 .dac_nids = alc268_dac_nids,
12686 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12687 .adc_nids = alc268_adc_nids_alt,
e1406348 12688 .capsrc_nids = alc268_capsrc_nids,
f12462c5
MT
12689 .hp_nid = 0x03,
12690 .dig_out_nid = ALC268_DIGOUT_NID,
12691 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12692 .channel_mode = alc268_modes,
12693 .input_mux = &alc268_capture_source,
4f5d1706
TI
12694 .setup = alc268_toshiba_setup,
12695 .init_hook = alc268_toshiba_automute,
f12462c5 12696 },
86c53bd2
JW
12697#ifdef CONFIG_SND_DEBUG
12698 [ALC268_TEST] = {
12699 .mixers = { alc268_test_mixer, alc268_capture_mixer },
12700 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12701 alc268_volume_init_verbs },
12702 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12703 .dac_nids = alc268_dac_nids,
12704 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12705 .adc_nids = alc268_adc_nids_alt,
e1406348 12706 .capsrc_nids = alc268_capsrc_nids,
86c53bd2
JW
12707 .hp_nid = 0x03,
12708 .dig_out_nid = ALC268_DIGOUT_NID,
12709 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12710 .channel_mode = alc268_modes,
12711 .input_mux = &alc268_capture_source,
12712 },
12713#endif
a361d84b
KY
12714};
12715
12716static int patch_alc268(struct hda_codec *codec)
12717{
12718 struct alc_spec *spec;
12719 int board_config;
22971e3a 12720 int i, has_beep, err;
a361d84b
KY
12721
12722 spec = kcalloc(1, sizeof(*spec), GFP_KERNEL);
12723 if (spec == NULL)
12724 return -ENOMEM;
12725
12726 codec->spec = spec;
12727
12728 board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
12729 alc268_models,
12730 alc268_cfg_tbl);
12731
3abf2f36
TI
12732 if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
12733 board_config = snd_hda_check_board_codec_sid_config(codec,
12734 ALC882_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
12735
a361d84b 12736 if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
9a11f1aa
TI
12737 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12738 codec->chip_name);
a361d84b
KY
12739 board_config = ALC268_AUTO;
12740 }
12741
12742 if (board_config == ALC268_AUTO) {
12743 /* automatic parse from the BIOS config */
12744 err = alc268_parse_auto_config(codec);
12745 if (err < 0) {
12746 alc_free(codec);
12747 return err;
12748 } else if (!err) {
12749 printk(KERN_INFO
12750 "hda_codec: Cannot set up configuration "
12751 "from BIOS. Using base mode...\n");
12752 board_config = ALC268_3ST;
12753 }
12754 }
12755
12756 if (board_config != ALC268_AUTO)
e9c364c0 12757 setup_preset(codec, &alc268_presets[board_config]);
a361d84b 12758
a361d84b
KY
12759 spec->stream_analog_playback = &alc268_pcm_analog_playback;
12760 spec->stream_analog_capture = &alc268_pcm_analog_capture;
6330079f 12761 spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
a361d84b 12762
a361d84b
KY
12763 spec->stream_digital_playback = &alc268_pcm_digital_playback;
12764
22971e3a
TI
12765 has_beep = 0;
12766 for (i = 0; i < spec->num_mixers; i++) {
12767 if (spec->mixers[i] == alc268_beep_mixer) {
12768 has_beep = 1;
12769 break;
12770 }
12771 }
12772
12773 if (has_beep) {
12774 err = snd_hda_attach_beep_device(codec, 0x1);
12775 if (err < 0) {
12776 alc_free(codec);
12777 return err;
12778 }
12779 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
12780 /* override the amp caps for beep generator */
12781 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
aef9d318
TI
12782 (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
12783 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
12784 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
12785 (0 << AC_AMPCAP_MUTE_SHIFT));
22971e3a 12786 }
aef9d318 12787
7e0e44d4 12788 if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
3866f0b0
TI
12789 /* check whether NID 0x07 is valid */
12790 unsigned int wcap = get_wcaps(codec, 0x07);
85860c06 12791 int i;
3866f0b0 12792
defb5ab2 12793 spec->capsrc_nids = alc268_capsrc_nids;
3866f0b0 12794 /* get type */
a22d543a 12795 wcap = get_wcaps_type(wcap);
fdbc6626
TI
12796 if (spec->auto_mic ||
12797 wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
3866f0b0
TI
12798 spec->adc_nids = alc268_adc_nids_alt;
12799 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
defb5ab2
TI
12800 if (spec->auto_mic)
12801 fixup_automic_adc(codec);
fdbc6626
TI
12802 if (spec->auto_mic || spec->input_mux->num_items == 1)
12803 add_mixer(spec, alc268_capture_nosrc_mixer);
12804 else
12805 add_mixer(spec, alc268_capture_alt_mixer);
3866f0b0
TI
12806 } else {
12807 spec->adc_nids = alc268_adc_nids;
12808 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
d88897ea 12809 add_mixer(spec, alc268_capture_mixer);
a361d84b 12810 }
85860c06
TI
12811 /* set default input source */
12812 for (i = 0; i < spec->num_adc_nids; i++)
12813 snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
12814 0, AC_VERB_SET_CONNECT_SEL,
5908589f
HRK
12815 i < spec->num_mux_defs ?
12816 spec->input_mux[i].items[0].index :
85860c06 12817 spec->input_mux->items[0].index);
a361d84b 12818 }
2134ea4f
TI
12819
12820 spec->vmaster_nid = 0x02;
12821
a361d84b
KY
12822 codec->patch_ops = alc_patch_ops;
12823 if (board_config == ALC268_AUTO)
12824 spec->init_hook = alc268_auto_init;
ea1fb29a 12825
daead538
TI
12826 codec->proc_widget_hook = print_realtek_coef;
12827
a361d84b
KY
12828 return 0;
12829}
12830
f6a92248
KY
12831/*
12832 * ALC269 channel source setting (2 channel)
12833 */
12834#define ALC269_DIGOUT_NID ALC880_DIGOUT_NID
12835
12836#define alc269_dac_nids alc260_dac_nids
12837
12838static hda_nid_t alc269_adc_nids[1] = {
12839 /* ADC1 */
f53281e6
KY
12840 0x08,
12841};
12842
e01bf509
TI
12843static hda_nid_t alc269_capsrc_nids[1] = {
12844 0x23,
12845};
12846
12847/* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24),
12848 * not a mux!
12849 */
12850
f6a92248
KY
12851#define alc269_modes alc260_modes
12852#define alc269_capture_source alc880_lg_lw_capture_source
12853
12854static struct snd_kcontrol_new alc269_base_mixer[] = {
12855 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12856 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12857 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
12858 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
12859 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
12860 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
12861 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12862 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
12863 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
12864 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12865 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12866 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
12867 { } /* end */
12868};
12869
60db6b53
KY
12870static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
12871 /* output mixer control */
12872 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12873 {
12874 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12875 .name = "Master Playback Switch",
12876 .info = snd_hda_mixer_amp_switch_info,
12877 .get = snd_hda_mixer_amp_switch_get,
12878 .put = alc268_acer_master_sw_put,
12879 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12880 },
12881 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
12882 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
12883 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12884 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
12885 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
12886 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
60db6b53
KY
12887 { }
12888};
12889
64154835
TV
12890static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
12891 /* output mixer control */
12892 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12893 {
12894 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12895 .name = "Master Playback Switch",
12896 .info = snd_hda_mixer_amp_switch_info,
12897 .get = snd_hda_mixer_amp_switch_get,
12898 .put = alc268_acer_master_sw_put,
12899 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12900 },
12901 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
12902 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
12903 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12904 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
12905 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
12906 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12907 HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
12908 HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
12909 HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
64154835
TV
12910 { }
12911};
12912
f53281e6 12913static struct snd_kcontrol_new alc269_eeepc_mixer[] = {
aa202455 12914 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
508f7110 12915 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
aa202455 12916 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
508f7110 12917 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
f53281e6
KY
12918 { } /* end */
12919};
12920
f53281e6
KY
12921/* capture mixer elements */
12922static struct snd_kcontrol_new alc269_epc_capture_mixer[] = {
12923 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
12924 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
26f5df26
TI
12925 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12926 { } /* end */
12927};
12928
12929/* FSC amilo */
aa202455 12930#define alc269_fujitsu_mixer alc269_eeepc_mixer
f53281e6 12931
60db6b53
KY
12932static struct hda_verb alc269_quanta_fl1_verbs[] = {
12933 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
12934 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12935 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12936 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12937 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12938 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12939 { }
12940};
f6a92248 12941
64154835
TV
12942static struct hda_verb alc269_lifebook_verbs[] = {
12943 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
12944 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
12945 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12946 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12947 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12948 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12949 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12950 {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12951 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12952 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12953 { }
12954};
12955
60db6b53
KY
12956/* toggle speaker-output according to the hp-jack state */
12957static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
12958{
12959 unsigned int present;
12960 unsigned char bits;
f6a92248 12961
864f92be 12962 present = snd_hda_jack_detect(codec, 0x15);
60db6b53
KY
12963 bits = present ? AMP_IN_MUTE(0) : 0;
12964 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
12965 AMP_IN_MUTE(0), bits);
12966 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
12967 AMP_IN_MUTE(0), bits);
f6a92248 12968
60db6b53
KY
12969 snd_hda_codec_write(codec, 0x20, 0,
12970 AC_VERB_SET_COEF_INDEX, 0x0c);
12971 snd_hda_codec_write(codec, 0x20, 0,
12972 AC_VERB_SET_PROC_COEF, 0x680);
f6a92248 12973
60db6b53
KY
12974 snd_hda_codec_write(codec, 0x20, 0,
12975 AC_VERB_SET_COEF_INDEX, 0x0c);
12976 snd_hda_codec_write(codec, 0x20, 0,
12977 AC_VERB_SET_PROC_COEF, 0x480);
12978}
f6a92248 12979
64154835
TV
12980/* toggle speaker-output according to the hp-jacks state */
12981static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
12982{
12983 unsigned int present;
12984 unsigned char bits;
12985
12986 /* Check laptop headphone socket */
864f92be 12987 present = snd_hda_jack_detect(codec, 0x15);
64154835
TV
12988
12989 /* Check port replicator headphone socket */
864f92be 12990 present |= snd_hda_jack_detect(codec, 0x1a);
64154835
TV
12991
12992 bits = present ? AMP_IN_MUTE(0) : 0;
12993 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
12994 AMP_IN_MUTE(0), bits);
12995 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
12996 AMP_IN_MUTE(0), bits);
12997
12998 snd_hda_codec_write(codec, 0x20, 0,
12999 AC_VERB_SET_COEF_INDEX, 0x0c);
13000 snd_hda_codec_write(codec, 0x20, 0,
13001 AC_VERB_SET_PROC_COEF, 0x680);
13002
13003 snd_hda_codec_write(codec, 0x20, 0,
13004 AC_VERB_SET_COEF_INDEX, 0x0c);
13005 snd_hda_codec_write(codec, 0x20, 0,
13006 AC_VERB_SET_PROC_COEF, 0x480);
13007}
13008
64154835
TV
13009static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
13010{
13011 unsigned int present_laptop;
13012 unsigned int present_dock;
13013
864f92be
WF
13014 present_laptop = snd_hda_jack_detect(codec, 0x18);
13015 present_dock = snd_hda_jack_detect(codec, 0x1b);
64154835
TV
13016
13017 /* Laptop mic port overrides dock mic port, design decision */
13018 if (present_dock)
13019 snd_hda_codec_write(codec, 0x23, 0,
13020 AC_VERB_SET_CONNECT_SEL, 0x3);
13021 if (present_laptop)
13022 snd_hda_codec_write(codec, 0x23, 0,
13023 AC_VERB_SET_CONNECT_SEL, 0x0);
13024 if (!present_dock && !present_laptop)
13025 snd_hda_codec_write(codec, 0x23, 0,
13026 AC_VERB_SET_CONNECT_SEL, 0x1);
13027}
13028
60db6b53
KY
13029static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
13030 unsigned int res)
13031{
4f5d1706
TI
13032 switch (res >> 26) {
13033 case ALC880_HP_EVENT:
60db6b53 13034 alc269_quanta_fl1_speaker_automute(codec);
4f5d1706
TI
13035 break;
13036 case ALC880_MIC_EVENT:
13037 alc_mic_automute(codec);
13038 break;
13039 }
60db6b53 13040}
f6a92248 13041
64154835
TV
13042static void alc269_lifebook_unsol_event(struct hda_codec *codec,
13043 unsigned int res)
13044{
13045 if ((res >> 26) == ALC880_HP_EVENT)
13046 alc269_lifebook_speaker_automute(codec);
13047 if ((res >> 26) == ALC880_MIC_EVENT)
13048 alc269_lifebook_mic_autoswitch(codec);
13049}
13050
4f5d1706
TI
13051static void alc269_quanta_fl1_setup(struct hda_codec *codec)
13052{
13053 struct alc_spec *spec = codec->spec;
13054 spec->ext_mic.pin = 0x18;
13055 spec->ext_mic.mux_idx = 0;
13056 spec->int_mic.pin = 0x19;
13057 spec->int_mic.mux_idx = 1;
13058 spec->auto_mic = 1;
13059}
13060
60db6b53
KY
13061static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
13062{
13063 alc269_quanta_fl1_speaker_automute(codec);
4f5d1706 13064 alc_mic_automute(codec);
60db6b53 13065}
f6a92248 13066
64154835
TV
13067static void alc269_lifebook_init_hook(struct hda_codec *codec)
13068{
13069 alc269_lifebook_speaker_automute(codec);
13070 alc269_lifebook_mic_autoswitch(codec);
13071}
13072
f53281e6
KY
13073static struct hda_verb alc269_eeepc_dmic_init_verbs[] = {
13074 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13075 {0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
13076 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13077 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13078 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13079 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13080 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13081 {}
13082};
13083
13084static struct hda_verb alc269_eeepc_amic_init_verbs[] = {
13085 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13086 {0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
13087 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13088 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
13089 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13090 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13091 {}
13092};
13093
13094/* toggle speaker-output according to the hp-jack state */
13095static void alc269_speaker_automute(struct hda_codec *codec)
13096{
13097 unsigned int present;
60db6b53 13098 unsigned char bits;
f53281e6 13099
864f92be 13100 present = snd_hda_jack_detect(codec, 0x15);
f53281e6
KY
13101 bits = present ? AMP_IN_MUTE(0) : 0;
13102 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
60db6b53 13103 AMP_IN_MUTE(0), bits);
f53281e6 13104 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
60db6b53 13105 AMP_IN_MUTE(0), bits);
f53281e6
KY
13106}
13107
f53281e6 13108/* unsolicited event for HP jack sensing */
4f5d1706 13109static void alc269_eeepc_unsol_event(struct hda_codec *codec,
60db6b53 13110 unsigned int res)
f53281e6 13111{
4f5d1706
TI
13112 switch (res >> 26) {
13113 case ALC880_HP_EVENT:
f53281e6 13114 alc269_speaker_automute(codec);
4f5d1706
TI
13115 break;
13116 case ALC880_MIC_EVENT:
13117 alc_mic_automute(codec);
13118 break;
13119 }
f53281e6
KY
13120}
13121
4f5d1706 13122static void alc269_eeepc_dmic_setup(struct hda_codec *codec)
f53281e6 13123{
4f5d1706
TI
13124 struct alc_spec *spec = codec->spec;
13125 spec->ext_mic.pin = 0x18;
13126 spec->ext_mic.mux_idx = 0;
13127 spec->int_mic.pin = 0x12;
13128 spec->int_mic.mux_idx = 5;
13129 spec->auto_mic = 1;
f53281e6
KY
13130}
13131
4f5d1706 13132static void alc269_eeepc_amic_setup(struct hda_codec *codec)
f53281e6 13133{
4f5d1706
TI
13134 struct alc_spec *spec = codec->spec;
13135 spec->ext_mic.pin = 0x18;
13136 spec->ext_mic.mux_idx = 0;
13137 spec->int_mic.pin = 0x19;
13138 spec->int_mic.mux_idx = 1;
13139 spec->auto_mic = 1;
f53281e6
KY
13140}
13141
4f5d1706 13142static void alc269_eeepc_inithook(struct hda_codec *codec)
f53281e6
KY
13143{
13144 alc269_speaker_automute(codec);
4f5d1706 13145 alc_mic_automute(codec);
f53281e6
KY
13146}
13147
60db6b53
KY
13148/*
13149 * generic initialization of ADC, input mixers and output mixers
13150 */
13151static struct hda_verb alc269_init_verbs[] = {
13152 /*
13153 * Unmute ADC0 and set the default input to mic-in
13154 */
13155 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13156
13157 /* Mute input amps (PCBeep, Line In, Mic 1 & Mic 2) of the
13158 * analog-loopback mixer widget
13159 * Note: PASD motherboards uses the Line In 2 as the input for
13160 * front panel mic (mic 2)
13161 */
13162 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
13163 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
13164 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13165 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
13166 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
13167 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
13168
13169 /*
13170 * Set up output mixers (0x0c - 0x0e)
13171 */
13172 /* set vol=0 to output mixers */
13173 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13174 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13175
13176 /* set up input amps for analog loopback */
13177 /* Amp Indices: DAC = 0, mixer = 1 */
13178 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13179 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13180 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13181 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13182 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13183 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13184
13185 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13186 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13187 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13188 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13189 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13190 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13191 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13192
13193 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13194 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13195 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13196 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13197 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13198 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13199 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13200
13201 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
13202 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
13203
13204 /* FIXME: use matrix-type input source selection */
13205 /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
13206 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
13207 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
13208 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13209 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
13210 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
13211
13212 /* set EAPD */
13213 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
13214 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
13215 { }
13216};
13217
9d0b71b1
TI
13218#define alc269_auto_create_multi_out_ctls \
13219 alc268_auto_create_multi_out_ctls
05f5f477
TI
13220#define alc269_auto_create_input_ctls \
13221 alc268_auto_create_input_ctls
f6a92248
KY
13222
13223#ifdef CONFIG_SND_HDA_POWER_SAVE
13224#define alc269_loopbacks alc880_loopbacks
13225#endif
13226
def319f9 13227/* pcm configuration: identical with ALC880 */
f6a92248
KY
13228#define alc269_pcm_analog_playback alc880_pcm_analog_playback
13229#define alc269_pcm_analog_capture alc880_pcm_analog_capture
13230#define alc269_pcm_digital_playback alc880_pcm_digital_playback
13231#define alc269_pcm_digital_capture alc880_pcm_digital_capture
13232
f03d3115
TI
13233static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
13234 .substreams = 1,
13235 .channels_min = 2,
13236 .channels_max = 8,
13237 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13238 /* NID is set in alc_build_pcms */
13239 .ops = {
13240 .open = alc880_playback_pcm_open,
13241 .prepare = alc880_playback_pcm_prepare,
13242 .cleanup = alc880_playback_pcm_cleanup
13243 },
13244};
13245
13246static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
13247 .substreams = 1,
13248 .channels_min = 2,
13249 .channels_max = 2,
13250 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13251 /* NID is set in alc_build_pcms */
13252};
13253
f6a92248
KY
13254/*
13255 * BIOS auto configuration
13256 */
13257static int alc269_parse_auto_config(struct hda_codec *codec)
13258{
13259 struct alc_spec *spec = codec->spec;
cfb9fb55 13260 int err;
f6a92248
KY
13261 static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
13262
13263 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13264 alc269_ignore);
13265 if (err < 0)
13266 return err;
13267
13268 err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
13269 if (err < 0)
13270 return err;
05f5f477 13271 err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
f6a92248
KY
13272 if (err < 0)
13273 return err;
13274
13275 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
13276
0852d7a6 13277 if (spec->autocfg.dig_outs)
f6a92248
KY
13278 spec->multiout.dig_out_nid = ALC269_DIGOUT_NID;
13279
603c4019 13280 if (spec->kctls.list)
d88897ea 13281 add_mixer(spec, spec->kctls.list);
f6a92248 13282
d88897ea 13283 add_verb(spec, alc269_init_verbs);
f6a92248 13284 spec->num_mux_defs = 1;
61b9b9b1 13285 spec->input_mux = &spec->private_imux[0];
e01bf509
TI
13286 /* set default input source */
13287 snd_hda_codec_write_cache(codec, alc269_capsrc_nids[0],
13288 0, AC_VERB_SET_CONNECT_SEL,
13289 spec->input_mux->items[0].index);
f6a92248
KY
13290
13291 err = alc_auto_add_mic_boost(codec);
13292 if (err < 0)
13293 return err;
13294
7e0e44d4 13295 if (!spec->cap_mixer && !spec->no_analog)
b59bdf3b 13296 set_capture_mixer(codec);
f53281e6 13297
1d955ebd
TI
13298 alc_ssid_check(codec, 0x15, 0x1b, 0x14);
13299
f6a92248
KY
13300 return 1;
13301}
13302
e9af4f36
TI
13303#define alc269_auto_init_multi_out alc268_auto_init_multi_out
13304#define alc269_auto_init_hp_out alc268_auto_init_hp_out
f6a92248
KY
13305#define alc269_auto_init_analog_input alc882_auto_init_analog_input
13306
13307
13308/* init callback for auto-configuration model -- overriding the default init */
13309static void alc269_auto_init(struct hda_codec *codec)
13310{
f6c7e546 13311 struct alc_spec *spec = codec->spec;
f6a92248
KY
13312 alc269_auto_init_multi_out(codec);
13313 alc269_auto_init_hp_out(codec);
13314 alc269_auto_init_analog_input(codec);
f6c7e546 13315 if (spec->unsol_event)
7fb0d78f 13316 alc_inithook(codec);
f6a92248
KY
13317}
13318
13319/*
13320 * configuration and preset
13321 */
13322static const char *alc269_models[ALC269_MODEL_LAST] = {
60db6b53 13323 [ALC269_BASIC] = "basic",
2922c9af
TI
13324 [ALC269_QUANTA_FL1] = "quanta",
13325 [ALC269_ASUS_EEEPC_P703] = "eeepc-p703",
26f5df26 13326 [ALC269_ASUS_EEEPC_P901] = "eeepc-p901",
64154835 13327 [ALC269_FUJITSU] = "fujitsu",
3d3792cb
TI
13328 [ALC269_LIFEBOOK] = "lifebook",
13329 [ALC269_AUTO] = "auto",
f6a92248
KY
13330};
13331
13332static struct snd_pci_quirk alc269_cfg_tbl[] = {
60db6b53 13333 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
f53281e6
KY
13334 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
13335 ALC269_ASUS_EEEPC_P703),
622e84cd
KY
13336 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_ASUS_EEEPC_P703),
13337 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_ASUS_EEEPC_P703),
13338 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_ASUS_EEEPC_P703),
13339 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_ASUS_EEEPC_P703),
13340 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_ASUS_EEEPC_P703),
13341 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_ASUS_EEEPC_P703),
f53281e6
KY
13342 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
13343 ALC269_ASUS_EEEPC_P901),
60db6b53
KY
13344 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
13345 ALC269_ASUS_EEEPC_P901),
622e84cd 13346 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_ASUS_EEEPC_P901),
26f5df26 13347 SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
64154835 13348 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
f6a92248
KY
13349 {}
13350};
13351
13352static struct alc_config_preset alc269_presets[] = {
13353 [ALC269_BASIC] = {
f9e336f6 13354 .mixers = { alc269_base_mixer },
f6a92248
KY
13355 .init_verbs = { alc269_init_verbs },
13356 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13357 .dac_nids = alc269_dac_nids,
13358 .hp_nid = 0x03,
13359 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13360 .channel_mode = alc269_modes,
13361 .input_mux = &alc269_capture_source,
13362 },
60db6b53
KY
13363 [ALC269_QUANTA_FL1] = {
13364 .mixers = { alc269_quanta_fl1_mixer },
13365 .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
13366 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13367 .dac_nids = alc269_dac_nids,
13368 .hp_nid = 0x03,
13369 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13370 .channel_mode = alc269_modes,
13371 .input_mux = &alc269_capture_source,
13372 .unsol_event = alc269_quanta_fl1_unsol_event,
4f5d1706 13373 .setup = alc269_quanta_fl1_setup,
60db6b53
KY
13374 .init_hook = alc269_quanta_fl1_init_hook,
13375 },
f53281e6 13376 [ALC269_ASUS_EEEPC_P703] = {
f9e336f6
TI
13377 .mixers = { alc269_eeepc_mixer },
13378 .cap_mixer = alc269_epc_capture_mixer,
f53281e6
KY
13379 .init_verbs = { alc269_init_verbs,
13380 alc269_eeepc_amic_init_verbs },
13381 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13382 .dac_nids = alc269_dac_nids,
13383 .hp_nid = 0x03,
13384 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13385 .channel_mode = alc269_modes,
4f5d1706
TI
13386 .unsol_event = alc269_eeepc_unsol_event,
13387 .setup = alc269_eeepc_amic_setup,
13388 .init_hook = alc269_eeepc_inithook,
f53281e6
KY
13389 },
13390 [ALC269_ASUS_EEEPC_P901] = {
f9e336f6
TI
13391 .mixers = { alc269_eeepc_mixer },
13392 .cap_mixer = alc269_epc_capture_mixer,
f53281e6
KY
13393 .init_verbs = { alc269_init_verbs,
13394 alc269_eeepc_dmic_init_verbs },
13395 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13396 .dac_nids = alc269_dac_nids,
13397 .hp_nid = 0x03,
13398 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13399 .channel_mode = alc269_modes,
4f5d1706
TI
13400 .unsol_event = alc269_eeepc_unsol_event,
13401 .setup = alc269_eeepc_dmic_setup,
13402 .init_hook = alc269_eeepc_inithook,
f53281e6 13403 },
26f5df26 13404 [ALC269_FUJITSU] = {
45bdd1c1 13405 .mixers = { alc269_fujitsu_mixer },
26f5df26
TI
13406 .cap_mixer = alc269_epc_capture_mixer,
13407 .init_verbs = { alc269_init_verbs,
13408 alc269_eeepc_dmic_init_verbs },
13409 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13410 .dac_nids = alc269_dac_nids,
13411 .hp_nid = 0x03,
13412 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13413 .channel_mode = alc269_modes,
4f5d1706
TI
13414 .unsol_event = alc269_eeepc_unsol_event,
13415 .setup = alc269_eeepc_dmic_setup,
13416 .init_hook = alc269_eeepc_inithook,
26f5df26 13417 },
64154835
TV
13418 [ALC269_LIFEBOOK] = {
13419 .mixers = { alc269_lifebook_mixer },
13420 .init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
13421 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13422 .dac_nids = alc269_dac_nids,
13423 .hp_nid = 0x03,
13424 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13425 .channel_mode = alc269_modes,
13426 .input_mux = &alc269_capture_source,
13427 .unsol_event = alc269_lifebook_unsol_event,
13428 .init_hook = alc269_lifebook_init_hook,
13429 },
f6a92248
KY
13430};
13431
13432static int patch_alc269(struct hda_codec *codec)
13433{
13434 struct alc_spec *spec;
13435 int board_config;
13436 int err;
13437
13438 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13439 if (spec == NULL)
13440 return -ENOMEM;
13441
13442 codec->spec = spec;
13443
2c3bf9ab
TI
13444 alc_fix_pll_init(codec, 0x20, 0x04, 15);
13445
f6a92248
KY
13446 board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
13447 alc269_models,
13448 alc269_cfg_tbl);
13449
13450 if (board_config < 0) {
9a11f1aa
TI
13451 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13452 codec->chip_name);
f6a92248
KY
13453 board_config = ALC269_AUTO;
13454 }
13455
13456 if (board_config == ALC269_AUTO) {
13457 /* automatic parse from the BIOS config */
13458 err = alc269_parse_auto_config(codec);
13459 if (err < 0) {
13460 alc_free(codec);
13461 return err;
13462 } else if (!err) {
13463 printk(KERN_INFO
13464 "hda_codec: Cannot set up configuration "
13465 "from BIOS. Using base mode...\n");
13466 board_config = ALC269_BASIC;
13467 }
13468 }
13469
680cd536
KK
13470 err = snd_hda_attach_beep_device(codec, 0x1);
13471 if (err < 0) {
13472 alc_free(codec);
13473 return err;
13474 }
13475
f6a92248 13476 if (board_config != ALC269_AUTO)
e9c364c0 13477 setup_preset(codec, &alc269_presets[board_config]);
f6a92248 13478
f03d3115
TI
13479 if (codec->subsystem_id == 0x17aa3bf8) {
13480 /* Due to a hardware problem on Lenovo Ideadpad, we need to
13481 * fix the sample rate of analog I/O to 44.1kHz
13482 */
13483 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
13484 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
13485 } else {
13486 spec->stream_analog_playback = &alc269_pcm_analog_playback;
13487 spec->stream_analog_capture = &alc269_pcm_analog_capture;
13488 }
f6a92248
KY
13489 spec->stream_digital_playback = &alc269_pcm_digital_playback;
13490 spec->stream_digital_capture = &alc269_pcm_digital_capture;
13491
13492 spec->adc_nids = alc269_adc_nids;
13493 spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
e01bf509 13494 spec->capsrc_nids = alc269_capsrc_nids;
f9e336f6 13495 if (!spec->cap_mixer)
b59bdf3b 13496 set_capture_mixer(codec);
45bdd1c1 13497 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
f6a92248 13498
100d5eb3
TI
13499 spec->vmaster_nid = 0x02;
13500
f6a92248
KY
13501 codec->patch_ops = alc_patch_ops;
13502 if (board_config == ALC269_AUTO)
13503 spec->init_hook = alc269_auto_init;
13504#ifdef CONFIG_SND_HDA_POWER_SAVE
13505 if (!spec->loopback.amplist)
13506 spec->loopback.amplist = alc269_loopbacks;
13507#endif
daead538 13508 codec->proc_widget_hook = print_realtek_coef;
f6a92248
KY
13509
13510 return 0;
13511}
13512
df694daa
KY
13513/*
13514 * ALC861 channel source setting (2/6 channel selection for 3-stack)
13515 */
13516
13517/*
13518 * set the path ways for 2 channel output
13519 * need to set the codec line out and mic 1 pin widgets to inputs
13520 */
13521static struct hda_verb alc861_threestack_ch2_init[] = {
13522 /* set pin widget 1Ah (line in) for input */
13523 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
f12ab1e0
TI
13524 /* set pin widget 18h (mic1/2) for input, for mic also enable
13525 * the vref
13526 */
df694daa
KY
13527 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13528
9c7f852e
TI
13529 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
13530#if 0
13531 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
13532 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
13533#endif
df694daa
KY
13534 { } /* end */
13535};
13536/*
13537 * 6ch mode
13538 * need to set the codec line out and mic 1 pin widgets to outputs
13539 */
13540static struct hda_verb alc861_threestack_ch6_init[] = {
13541 /* set pin widget 1Ah (line in) for output (Back Surround)*/
13542 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13543 /* set pin widget 18h (mic1) for output (CLFE)*/
13544 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13545
13546 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
9c7f852e 13547 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
df694daa 13548
9c7f852e
TI
13549 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
13550#if 0
13551 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
13552 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
13553#endif
df694daa
KY
13554 { } /* end */
13555};
13556
13557static struct hda_channel_mode alc861_threestack_modes[2] = {
13558 { 2, alc861_threestack_ch2_init },
13559 { 6, alc861_threestack_ch6_init },
13560};
22309c3e
TI
13561/* Set mic1 as input and unmute the mixer */
13562static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
13563 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13564 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
13565 { } /* end */
13566};
13567/* Set mic1 as output and mute mixer */
13568static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
13569 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13570 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
13571 { } /* end */
13572};
13573
13574static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
13575 { 2, alc861_uniwill_m31_ch2_init },
13576 { 4, alc861_uniwill_m31_ch4_init },
13577};
df694daa 13578
7cdbff94
MD
13579/* Set mic1 and line-in as input and unmute the mixer */
13580static struct hda_verb alc861_asus_ch2_init[] = {
13581 /* set pin widget 1Ah (line in) for input */
13582 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
f12ab1e0
TI
13583 /* set pin widget 18h (mic1/2) for input, for mic also enable
13584 * the vref
13585 */
7cdbff94
MD
13586 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13587
13588 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
13589#if 0
13590 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
13591 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
13592#endif
13593 { } /* end */
13594};
13595/* Set mic1 nad line-in as output and mute mixer */
13596static struct hda_verb alc861_asus_ch6_init[] = {
13597 /* set pin widget 1Ah (line in) for output (Back Surround)*/
13598 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13599 /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
13600 /* set pin widget 18h (mic1) for output (CLFE)*/
13601 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13602 /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
13603 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
13604 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
13605
13606 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
13607#if 0
13608 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
13609 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
13610#endif
13611 { } /* end */
13612};
13613
13614static struct hda_channel_mode alc861_asus_modes[2] = {
13615 { 2, alc861_asus_ch2_init },
13616 { 6, alc861_asus_ch6_init },
13617};
13618
df694daa
KY
13619/* patch-ALC861 */
13620
13621static struct snd_kcontrol_new alc861_base_mixer[] = {
13622 /* output mixer control */
13623 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13624 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13625 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13626 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13627 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
13628
13629 /*Input mixer control */
13630 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13631 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
13632 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13633 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13634 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13635 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13636 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13637 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13638 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13639 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
f12ab1e0 13640
df694daa
KY
13641 { } /* end */
13642};
13643
13644static struct snd_kcontrol_new alc861_3ST_mixer[] = {
13645 /* output mixer control */
13646 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13647 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13648 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13649 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13650 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
13651
13652 /* Input mixer control */
13653 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13654 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
13655 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13656 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13657 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13658 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13659 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13660 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13661 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13662 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
f12ab1e0 13663
df694daa
KY
13664 {
13665 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13666 .name = "Channel Mode",
13667 .info = alc_ch_mode_info,
13668 .get = alc_ch_mode_get,
13669 .put = alc_ch_mode_put,
13670 .private_value = ARRAY_SIZE(alc861_threestack_modes),
13671 },
13672 { } /* end */
a53d1aec
TD
13673};
13674
d1d985f0 13675static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
a53d1aec
TD
13676 /* output mixer control */
13677 HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13678 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13679 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
ea1fb29a 13680
a53d1aec 13681 { } /* end */
f12ab1e0 13682};
a53d1aec 13683
22309c3e
TI
13684static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
13685 /* output mixer control */
13686 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13687 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13688 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13689 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13690 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
13691
13692 /* Input mixer control */
13693 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13694 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
13695 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13696 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13697 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13698 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13699 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13700 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13701 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13702 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
f12ab1e0 13703
22309c3e
TI
13704 {
13705 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13706 .name = "Channel Mode",
13707 .info = alc_ch_mode_info,
13708 .get = alc_ch_mode_get,
13709 .put = alc_ch_mode_put,
13710 .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
13711 },
13712 { } /* end */
f12ab1e0 13713};
7cdbff94
MD
13714
13715static struct snd_kcontrol_new alc861_asus_mixer[] = {
13716 /* output mixer control */
13717 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13718 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13719 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13720 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13721 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
13722
13723 /* Input mixer control */
13724 HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13725 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13726 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13727 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13728 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13729 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13730 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13731 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13732 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
f12ab1e0
TI
13733 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
13734
7cdbff94
MD
13735 {
13736 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13737 .name = "Channel Mode",
13738 .info = alc_ch_mode_info,
13739 .get = alc_ch_mode_get,
13740 .put = alc_ch_mode_put,
13741 .private_value = ARRAY_SIZE(alc861_asus_modes),
13742 },
13743 { }
56bb0cab
TI
13744};
13745
13746/* additional mixer */
d1d985f0 13747static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
56bb0cab
TI
13748 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13749 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
56bb0cab
TI
13750 { }
13751};
7cdbff94 13752
df694daa
KY
13753/*
13754 * generic initialization of ADC, input mixers and output mixers
13755 */
13756static struct hda_verb alc861_base_init_verbs[] = {
13757 /*
13758 * Unmute ADC0 and set the default input to mic-in
13759 */
13760 /* port-A for surround (rear panel) */
13761 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13762 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
13763 /* port-B for mic-in (rear panel) with vref */
13764 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13765 /* port-C for line-in (rear panel) */
13766 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13767 /* port-D for Front */
13768 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13769 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
13770 /* port-E for HP out (front panel) */
13771 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
13772 /* route front PCM to HP */
9dece1d7 13773 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
df694daa
KY
13774 /* port-F for mic-in (front panel) with vref */
13775 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13776 /* port-G for CLFE (rear panel) */
13777 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13778 { 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
13779 /* port-H for side (rear panel) */
13780 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13781 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
13782 /* CD-in */
13783 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13784 /* route front mic to ADC1*/
13785 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
13786 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
ea1fb29a 13787
df694daa
KY
13788 /* Unmute DAC0~3 & spdif out*/
13789 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13790 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13791 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13792 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13793 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
ea1fb29a 13794
df694daa
KY
13795 /* Unmute Mixer 14 (mic) 1c (Line in)*/
13796 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13797 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13798 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13799 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 13800
df694daa
KY
13801 /* Unmute Stereo Mixer 15 */
13802 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13803 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13804 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
f12ab1e0 13805 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
df694daa
KY
13806
13807 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13808 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13809 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13810 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13811 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13812 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13813 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13814 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
f12ab1e0
TI
13815 /* hp used DAC 3 (Front) */
13816 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
df694daa
KY
13817 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
13818
13819 { }
13820};
13821
13822static struct hda_verb alc861_threestack_init_verbs[] = {
13823 /*
13824 * Unmute ADC0 and set the default input to mic-in
13825 */
13826 /* port-A for surround (rear panel) */
13827 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13828 /* port-B for mic-in (rear panel) with vref */
13829 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13830 /* port-C for line-in (rear panel) */
13831 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13832 /* port-D for Front */
13833 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13834 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
13835 /* port-E for HP out (front panel) */
13836 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
13837 /* route front PCM to HP */
9dece1d7 13838 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
df694daa
KY
13839 /* port-F for mic-in (front panel) with vref */
13840 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13841 /* port-G for CLFE (rear panel) */
13842 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13843 /* port-H for side (rear panel) */
13844 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13845 /* CD-in */
13846 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13847 /* route front mic to ADC1*/
13848 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
13849 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13850 /* Unmute DAC0~3 & spdif out*/
13851 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13852 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13853 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13854 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13855 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
ea1fb29a 13856
df694daa
KY
13857 /* Unmute Mixer 14 (mic) 1c (Line in)*/
13858 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13859 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13860 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13861 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 13862
df694daa
KY
13863 /* Unmute Stereo Mixer 15 */
13864 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13865 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13866 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
f12ab1e0 13867 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
df694daa
KY
13868
13869 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13870 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13871 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13872 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13873 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13874 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13875 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13876 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
f12ab1e0
TI
13877 /* hp used DAC 3 (Front) */
13878 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
df694daa
KY
13879 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
13880 { }
13881};
22309c3e
TI
13882
13883static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
13884 /*
13885 * Unmute ADC0 and set the default input to mic-in
13886 */
13887 /* port-A for surround (rear panel) */
13888 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13889 /* port-B for mic-in (rear panel) with vref */
13890 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13891 /* port-C for line-in (rear panel) */
13892 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13893 /* port-D for Front */
13894 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13895 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
13896 /* port-E for HP out (front panel) */
f12ab1e0
TI
13897 /* this has to be set to VREF80 */
13898 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
22309c3e 13899 /* route front PCM to HP */
9dece1d7 13900 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
22309c3e
TI
13901 /* port-F for mic-in (front panel) with vref */
13902 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13903 /* port-G for CLFE (rear panel) */
13904 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13905 /* port-H for side (rear panel) */
13906 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13907 /* CD-in */
13908 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13909 /* route front mic to ADC1*/
13910 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
13911 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13912 /* Unmute DAC0~3 & spdif out*/
13913 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13914 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13915 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13916 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13917 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
ea1fb29a 13918
22309c3e
TI
13919 /* Unmute Mixer 14 (mic) 1c (Line in)*/
13920 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13921 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13922 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13923 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 13924
22309c3e
TI
13925 /* Unmute Stereo Mixer 15 */
13926 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13927 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13928 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
f12ab1e0 13929 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
22309c3e
TI
13930
13931 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13932 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13933 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13934 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13935 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13936 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13937 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13938 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
f12ab1e0
TI
13939 /* hp used DAC 3 (Front) */
13940 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
22309c3e
TI
13941 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
13942 { }
13943};
13944
7cdbff94
MD
13945static struct hda_verb alc861_asus_init_verbs[] = {
13946 /*
13947 * Unmute ADC0 and set the default input to mic-in
13948 */
f12ab1e0
TI
13949 /* port-A for surround (rear panel)
13950 * according to codec#0 this is the HP jack
13951 */
7cdbff94
MD
13952 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
13953 /* route front PCM to HP */
13954 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
13955 /* port-B for mic-in (rear panel) with vref */
13956 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13957 /* port-C for line-in (rear panel) */
13958 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13959 /* port-D for Front */
13960 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13961 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
13962 /* port-E for HP out (front panel) */
f12ab1e0
TI
13963 /* this has to be set to VREF80 */
13964 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
7cdbff94 13965 /* route front PCM to HP */
9dece1d7 13966 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
7cdbff94
MD
13967 /* port-F for mic-in (front panel) with vref */
13968 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13969 /* port-G for CLFE (rear panel) */
13970 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13971 /* port-H for side (rear panel) */
13972 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13973 /* CD-in */
13974 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13975 /* route front mic to ADC1*/
13976 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
13977 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13978 /* Unmute DAC0~3 & spdif out*/
13979 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13980 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13981 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13982 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13983 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13984 /* Unmute Mixer 14 (mic) 1c (Line in)*/
13985 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13986 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13987 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13988 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 13989
7cdbff94
MD
13990 /* Unmute Stereo Mixer 15 */
13991 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13992 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13993 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
f12ab1e0 13994 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
7cdbff94
MD
13995
13996 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13997 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13998 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13999 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14000 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14001 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14002 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14003 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
f12ab1e0
TI
14004 /* hp used DAC 3 (Front) */
14005 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7cdbff94
MD
14006 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14007 { }
14008};
14009
56bb0cab
TI
14010/* additional init verbs for ASUS laptops */
14011static struct hda_verb alc861_asus_laptop_init_verbs[] = {
14012 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
14013 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
14014 { }
14015};
7cdbff94 14016
df694daa
KY
14017/*
14018 * generic initialization of ADC, input mixers and output mixers
14019 */
14020static struct hda_verb alc861_auto_init_verbs[] = {
14021 /*
14022 * Unmute ADC0 and set the default input to mic-in
14023 */
f12ab1e0 14024 /* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
df694daa 14025 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
ea1fb29a 14026
df694daa
KY
14027 /* Unmute DAC0~3 & spdif out*/
14028 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14029 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14030 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14031 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14032 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
ea1fb29a 14033
df694daa
KY
14034 /* Unmute Mixer 14 (mic) 1c (Line in)*/
14035 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14036 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14037 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14038 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 14039
df694daa
KY
14040 /* Unmute Stereo Mixer 15 */
14041 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14042 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14043 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14044 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
14045
1c20930a
TI
14046 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14047 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14048 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14049 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14050 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14051 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14052 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14053 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
df694daa
KY
14054
14055 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14056 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1c20930a
TI
14057 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14058 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
df694daa
KY
14059 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14060 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1c20930a
TI
14061 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14062 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
df694daa 14063
f12ab1e0 14064 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, /* set Mic 1 */
df694daa
KY
14065
14066 { }
14067};
14068
a53d1aec
TD
14069static struct hda_verb alc861_toshiba_init_verbs[] = {
14070 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
f12ab1e0 14071
a53d1aec
TD
14072 { }
14073};
14074
14075/* toggle speaker-output according to the hp-jack state */
14076static void alc861_toshiba_automute(struct hda_codec *codec)
14077{
864f92be 14078 unsigned int present = snd_hda_jack_detect(codec, 0x0f);
a53d1aec 14079
47fd830a
TI
14080 snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
14081 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
14082 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
14083 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
a53d1aec
TD
14084}
14085
14086static void alc861_toshiba_unsol_event(struct hda_codec *codec,
14087 unsigned int res)
14088{
a53d1aec
TD
14089 if ((res >> 26) == ALC880_HP_EVENT)
14090 alc861_toshiba_automute(codec);
14091}
14092
def319f9 14093/* pcm configuration: identical with ALC880 */
df694daa
KY
14094#define alc861_pcm_analog_playback alc880_pcm_analog_playback
14095#define alc861_pcm_analog_capture alc880_pcm_analog_capture
14096#define alc861_pcm_digital_playback alc880_pcm_digital_playback
14097#define alc861_pcm_digital_capture alc880_pcm_digital_capture
14098
14099
14100#define ALC861_DIGOUT_NID 0x07
14101
14102static struct hda_channel_mode alc861_8ch_modes[1] = {
14103 { 8, NULL }
14104};
14105
14106static hda_nid_t alc861_dac_nids[4] = {
14107 /* front, surround, clfe, side */
14108 0x03, 0x06, 0x05, 0x04
14109};
14110
9c7f852e
TI
14111static hda_nid_t alc660_dac_nids[3] = {
14112 /* front, clfe, surround */
14113 0x03, 0x05, 0x06
14114};
14115
df694daa
KY
14116static hda_nid_t alc861_adc_nids[1] = {
14117 /* ADC0-2 */
14118 0x08,
14119};
14120
14121static struct hda_input_mux alc861_capture_source = {
14122 .num_items = 5,
14123 .items = {
14124 { "Mic", 0x0 },
14125 { "Front Mic", 0x3 },
14126 { "Line", 0x1 },
14127 { "CD", 0x4 },
14128 { "Mixer", 0x5 },
14129 },
14130};
14131
1c20930a
TI
14132static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
14133{
14134 struct alc_spec *spec = codec->spec;
14135 hda_nid_t mix, srcs[5];
14136 int i, j, num;
14137
14138 if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
14139 return 0;
14140 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14141 if (num < 0)
14142 return 0;
14143 for (i = 0; i < num; i++) {
14144 unsigned int type;
a22d543a 14145 type = get_wcaps_type(get_wcaps(codec, srcs[i]));
1c20930a
TI
14146 if (type != AC_WID_AUD_OUT)
14147 continue;
14148 for (j = 0; j < spec->multiout.num_dacs; j++)
14149 if (spec->multiout.dac_nids[j] == srcs[i])
14150 break;
14151 if (j >= spec->multiout.num_dacs)
14152 return srcs[i];
14153 }
14154 return 0;
14155}
14156
df694daa 14157/* fill in the dac_nids table from the parsed pin configuration */
1c20930a 14158static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
f12ab1e0 14159 const struct auto_pin_cfg *cfg)
df694daa 14160{
1c20930a 14161 struct alc_spec *spec = codec->spec;
df694daa 14162 int i;
1c20930a 14163 hda_nid_t nid, dac;
df694daa
KY
14164
14165 spec->multiout.dac_nids = spec->private_dac_nids;
14166 for (i = 0; i < cfg->line_outs; i++) {
14167 nid = cfg->line_out_pins[i];
1c20930a
TI
14168 dac = alc861_look_for_dac(codec, nid);
14169 if (!dac)
14170 continue;
14171 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
df694daa 14172 }
df694daa
KY
14173 return 0;
14174}
14175
1c20930a
TI
14176static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
14177 hda_nid_t nid, unsigned int chs)
14178{
0afe5f89 14179 return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx,
1c20930a
TI
14180 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
14181}
14182
df694daa 14183/* add playback controls from the parsed DAC table */
1c20930a 14184static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
df694daa
KY
14185 const struct auto_pin_cfg *cfg)
14186{
1c20930a 14187 struct alc_spec *spec = codec->spec;
f12ab1e0
TI
14188 static const char *chname[4] = {
14189 "Front", "Surround", NULL /*CLFE*/, "Side"
14190 };
df694daa 14191 hda_nid_t nid;
1c20930a
TI
14192 int i, err;
14193
14194 if (cfg->line_outs == 1) {
14195 const char *pfx = NULL;
14196 if (!cfg->hp_outs)
14197 pfx = "Master";
14198 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
14199 pfx = "Speaker";
14200 if (pfx) {
14201 nid = spec->multiout.dac_nids[0];
14202 return alc861_create_out_sw(codec, pfx, nid, 3);
14203 }
14204 }
df694daa
KY
14205
14206 for (i = 0; i < cfg->line_outs; i++) {
14207 nid = spec->multiout.dac_nids[i];
f12ab1e0 14208 if (!nid)
df694daa 14209 continue;
1c20930a 14210 if (i == 2) {
df694daa 14211 /* Center/LFE */
1c20930a 14212 err = alc861_create_out_sw(codec, "Center", nid, 1);
f12ab1e0 14213 if (err < 0)
df694daa 14214 return err;
1c20930a 14215 err = alc861_create_out_sw(codec, "LFE", nid, 2);
f12ab1e0 14216 if (err < 0)
df694daa
KY
14217 return err;
14218 } else {
1c20930a 14219 err = alc861_create_out_sw(codec, chname[i], nid, 3);
f12ab1e0 14220 if (err < 0)
df694daa
KY
14221 return err;
14222 }
14223 }
14224 return 0;
14225}
14226
1c20930a 14227static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
df694daa 14228{
1c20930a 14229 struct alc_spec *spec = codec->spec;
df694daa
KY
14230 int err;
14231 hda_nid_t nid;
14232
f12ab1e0 14233 if (!pin)
df694daa
KY
14234 return 0;
14235
14236 if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
1c20930a
TI
14237 nid = alc861_look_for_dac(codec, pin);
14238 if (nid) {
14239 err = alc861_create_out_sw(codec, "Headphone", nid, 3);
14240 if (err < 0)
14241 return err;
14242 spec->multiout.hp_nid = nid;
14243 }
df694daa
KY
14244 }
14245 return 0;
14246}
14247
14248/* create playback/capture controls for input pins */
05f5f477 14249static int alc861_auto_create_input_ctls(struct hda_codec *codec,
f12ab1e0 14250 const struct auto_pin_cfg *cfg)
df694daa 14251{
05f5f477 14252 return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
df694daa
KY
14253}
14254
f12ab1e0
TI
14255static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
14256 hda_nid_t nid,
1c20930a 14257 int pin_type, hda_nid_t dac)
df694daa 14258{
1c20930a
TI
14259 hda_nid_t mix, srcs[5];
14260 int i, num;
14261
564c5bea
JL
14262 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
14263 pin_type);
1c20930a 14264 snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
564c5bea 14265 AMP_OUT_UNMUTE);
1c20930a
TI
14266 if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
14267 return;
14268 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14269 if (num < 0)
14270 return;
14271 for (i = 0; i < num; i++) {
14272 unsigned int mute;
14273 if (srcs[i] == dac || srcs[i] == 0x15)
14274 mute = AMP_IN_UNMUTE(i);
14275 else
14276 mute = AMP_IN_MUTE(i);
14277 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
14278 mute);
14279 }
df694daa
KY
14280}
14281
14282static void alc861_auto_init_multi_out(struct hda_codec *codec)
14283{
14284 struct alc_spec *spec = codec->spec;
14285 int i;
14286
14287 for (i = 0; i < spec->autocfg.line_outs; i++) {
14288 hda_nid_t nid = spec->autocfg.line_out_pins[i];
baba8ee9 14289 int pin_type = get_pin_type(spec->autocfg.line_out_type);
df694daa 14290 if (nid)
baba8ee9 14291 alc861_auto_set_output_and_unmute(codec, nid, pin_type,
f12ab1e0 14292 spec->multiout.dac_nids[i]);
df694daa
KY
14293 }
14294}
14295
14296static void alc861_auto_init_hp_out(struct hda_codec *codec)
14297{
14298 struct alc_spec *spec = codec->spec;
df694daa 14299
15870f05
TI
14300 if (spec->autocfg.hp_outs)
14301 alc861_auto_set_output_and_unmute(codec,
14302 spec->autocfg.hp_pins[0],
14303 PIN_HP,
1c20930a 14304 spec->multiout.hp_nid);
15870f05
TI
14305 if (spec->autocfg.speaker_outs)
14306 alc861_auto_set_output_and_unmute(codec,
14307 spec->autocfg.speaker_pins[0],
14308 PIN_OUT,
1c20930a 14309 spec->multiout.dac_nids[0]);
df694daa
KY
14310}
14311
14312static void alc861_auto_init_analog_input(struct hda_codec *codec)
14313{
14314 struct alc_spec *spec = codec->spec;
14315 int i;
14316
14317 for (i = 0; i < AUTO_PIN_LAST; i++) {
14318 hda_nid_t nid = spec->autocfg.input_pins[i];
23f0c048
TI
14319 if (nid >= 0x0c && nid <= 0x11)
14320 alc_set_input_pin(codec, nid, i);
df694daa
KY
14321 }
14322}
14323
14324/* parse the BIOS configuration and set up the alc_spec */
f12ab1e0
TI
14325/* return 1 if successful, 0 if the proper config is not found,
14326 * or a negative error code
14327 */
df694daa
KY
14328static int alc861_parse_auto_config(struct hda_codec *codec)
14329{
14330 struct alc_spec *spec = codec->spec;
14331 int err;
14332 static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
14333
f12ab1e0
TI
14334 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
14335 alc861_ignore);
14336 if (err < 0)
df694daa 14337 return err;
f12ab1e0 14338 if (!spec->autocfg.line_outs)
df694daa
KY
14339 return 0; /* can't find valid BIOS pin config */
14340
1c20930a 14341 err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
f12ab1e0
TI
14342 if (err < 0)
14343 return err;
1c20930a 14344 err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
f12ab1e0
TI
14345 if (err < 0)
14346 return err;
1c20930a 14347 err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
f12ab1e0
TI
14348 if (err < 0)
14349 return err;
05f5f477 14350 err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 14351 if (err < 0)
df694daa
KY
14352 return err;
14353
14354 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
14355
0852d7a6 14356 if (spec->autocfg.dig_outs)
df694daa
KY
14357 spec->multiout.dig_out_nid = ALC861_DIGOUT_NID;
14358
603c4019 14359 if (spec->kctls.list)
d88897ea 14360 add_mixer(spec, spec->kctls.list);
df694daa 14361
d88897ea 14362 add_verb(spec, alc861_auto_init_verbs);
df694daa 14363
a1e8d2da 14364 spec->num_mux_defs = 1;
61b9b9b1 14365 spec->input_mux = &spec->private_imux[0];
df694daa
KY
14366
14367 spec->adc_nids = alc861_adc_nids;
14368 spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
b59bdf3b 14369 set_capture_mixer(codec);
df694daa 14370
4a79ba34
TI
14371 alc_ssid_check(codec, 0x0e, 0x0f, 0x0b);
14372
df694daa
KY
14373 return 1;
14374}
14375
ae6b813a
TI
14376/* additional initialization for auto-configuration model */
14377static void alc861_auto_init(struct hda_codec *codec)
df694daa 14378{
f6c7e546 14379 struct alc_spec *spec = codec->spec;
df694daa
KY
14380 alc861_auto_init_multi_out(codec);
14381 alc861_auto_init_hp_out(codec);
14382 alc861_auto_init_analog_input(codec);
f6c7e546 14383 if (spec->unsol_event)
7fb0d78f 14384 alc_inithook(codec);
df694daa
KY
14385}
14386
cb53c626
TI
14387#ifdef CONFIG_SND_HDA_POWER_SAVE
14388static struct hda_amp_list alc861_loopbacks[] = {
14389 { 0x15, HDA_INPUT, 0 },
14390 { 0x15, HDA_INPUT, 1 },
14391 { 0x15, HDA_INPUT, 2 },
14392 { 0x15, HDA_INPUT, 3 },
14393 { } /* end */
14394};
14395#endif
14396
df694daa
KY
14397
14398/*
14399 * configuration and preset
14400 */
f5fcc13c
TI
14401static const char *alc861_models[ALC861_MODEL_LAST] = {
14402 [ALC861_3ST] = "3stack",
14403 [ALC660_3ST] = "3stack-660",
14404 [ALC861_3ST_DIG] = "3stack-dig",
14405 [ALC861_6ST_DIG] = "6stack-dig",
14406 [ALC861_UNIWILL_M31] = "uniwill-m31",
14407 [ALC861_TOSHIBA] = "toshiba",
14408 [ALC861_ASUS] = "asus",
14409 [ALC861_ASUS_LAPTOP] = "asus-laptop",
14410 [ALC861_AUTO] = "auto",
14411};
14412
14413static struct snd_pci_quirk alc861_cfg_tbl[] = {
687a47bd 14414 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
f5fcc13c
TI
14415 SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
14416 SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
14417 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
ac3e3741 14418 SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
83c34218 14419 SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
ad5e7737 14420 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
341d4eb0
TI
14421 /* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
14422 * Any other models that need this preset?
14423 */
14424 /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
ac3e3741
TI
14425 SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
14426 SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
4147dab6 14427 SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
ac3e3741
TI
14428 SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
14429 SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
14430 /* FIXME: the below seems conflict */
14431 /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
07e038b3 14432 SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
f5fcc13c 14433 SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
df694daa
KY
14434 {}
14435};
14436
14437static struct alc_config_preset alc861_presets[] = {
14438 [ALC861_3ST] = {
14439 .mixers = { alc861_3ST_mixer },
14440 .init_verbs = { alc861_threestack_init_verbs },
14441 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14442 .dac_nids = alc861_dac_nids,
14443 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14444 .channel_mode = alc861_threestack_modes,
4e195a7b 14445 .need_dac_fix = 1,
df694daa
KY
14446 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14447 .adc_nids = alc861_adc_nids,
14448 .input_mux = &alc861_capture_source,
14449 },
14450 [ALC861_3ST_DIG] = {
14451 .mixers = { alc861_base_mixer },
14452 .init_verbs = { alc861_threestack_init_verbs },
14453 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14454 .dac_nids = alc861_dac_nids,
14455 .dig_out_nid = ALC861_DIGOUT_NID,
14456 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14457 .channel_mode = alc861_threestack_modes,
4e195a7b 14458 .need_dac_fix = 1,
df694daa
KY
14459 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14460 .adc_nids = alc861_adc_nids,
14461 .input_mux = &alc861_capture_source,
14462 },
14463 [ALC861_6ST_DIG] = {
14464 .mixers = { alc861_base_mixer },
14465 .init_verbs = { alc861_base_init_verbs },
14466 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14467 .dac_nids = alc861_dac_nids,
14468 .dig_out_nid = ALC861_DIGOUT_NID,
14469 .num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
14470 .channel_mode = alc861_8ch_modes,
14471 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14472 .adc_nids = alc861_adc_nids,
14473 .input_mux = &alc861_capture_source,
14474 },
9c7f852e
TI
14475 [ALC660_3ST] = {
14476 .mixers = { alc861_3ST_mixer },
14477 .init_verbs = { alc861_threestack_init_verbs },
14478 .num_dacs = ARRAY_SIZE(alc660_dac_nids),
14479 .dac_nids = alc660_dac_nids,
14480 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14481 .channel_mode = alc861_threestack_modes,
4e195a7b 14482 .need_dac_fix = 1,
9c7f852e
TI
14483 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14484 .adc_nids = alc861_adc_nids,
14485 .input_mux = &alc861_capture_source,
14486 },
22309c3e
TI
14487 [ALC861_UNIWILL_M31] = {
14488 .mixers = { alc861_uniwill_m31_mixer },
14489 .init_verbs = { alc861_uniwill_m31_init_verbs },
14490 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14491 .dac_nids = alc861_dac_nids,
14492 .dig_out_nid = ALC861_DIGOUT_NID,
14493 .num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
14494 .channel_mode = alc861_uniwill_m31_modes,
14495 .need_dac_fix = 1,
14496 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14497 .adc_nids = alc861_adc_nids,
14498 .input_mux = &alc861_capture_source,
14499 },
a53d1aec
TD
14500 [ALC861_TOSHIBA] = {
14501 .mixers = { alc861_toshiba_mixer },
f12ab1e0
TI
14502 .init_verbs = { alc861_base_init_verbs,
14503 alc861_toshiba_init_verbs },
a53d1aec
TD
14504 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14505 .dac_nids = alc861_dac_nids,
14506 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
14507 .channel_mode = alc883_3ST_2ch_modes,
14508 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14509 .adc_nids = alc861_adc_nids,
14510 .input_mux = &alc861_capture_source,
14511 .unsol_event = alc861_toshiba_unsol_event,
14512 .init_hook = alc861_toshiba_automute,
14513 },
7cdbff94
MD
14514 [ALC861_ASUS] = {
14515 .mixers = { alc861_asus_mixer },
14516 .init_verbs = { alc861_asus_init_verbs },
14517 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14518 .dac_nids = alc861_dac_nids,
14519 .dig_out_nid = ALC861_DIGOUT_NID,
14520 .num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
14521 .channel_mode = alc861_asus_modes,
14522 .need_dac_fix = 1,
14523 .hp_nid = 0x06,
14524 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14525 .adc_nids = alc861_adc_nids,
14526 .input_mux = &alc861_capture_source,
14527 },
56bb0cab
TI
14528 [ALC861_ASUS_LAPTOP] = {
14529 .mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
14530 .init_verbs = { alc861_asus_init_verbs,
14531 alc861_asus_laptop_init_verbs },
14532 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14533 .dac_nids = alc861_dac_nids,
14534 .dig_out_nid = ALC861_DIGOUT_NID,
14535 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
14536 .channel_mode = alc883_3ST_2ch_modes,
14537 .need_dac_fix = 1,
14538 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14539 .adc_nids = alc861_adc_nids,
14540 .input_mux = &alc861_capture_source,
14541 },
14542};
df694daa
KY
14543
14544
14545static int patch_alc861(struct hda_codec *codec)
14546{
14547 struct alc_spec *spec;
14548 int board_config;
14549 int err;
14550
dc041e0b 14551 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
df694daa
KY
14552 if (spec == NULL)
14553 return -ENOMEM;
14554
f12ab1e0 14555 codec->spec = spec;
df694daa 14556
f5fcc13c
TI
14557 board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
14558 alc861_models,
14559 alc861_cfg_tbl);
9c7f852e 14560
f5fcc13c 14561 if (board_config < 0) {
9a11f1aa
TI
14562 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14563 codec->chip_name);
df694daa
KY
14564 board_config = ALC861_AUTO;
14565 }
14566
14567 if (board_config == ALC861_AUTO) {
14568 /* automatic parse from the BIOS config */
14569 err = alc861_parse_auto_config(codec);
14570 if (err < 0) {
14571 alc_free(codec);
14572 return err;
f12ab1e0 14573 } else if (!err) {
9c7f852e
TI
14574 printk(KERN_INFO
14575 "hda_codec: Cannot set up configuration "
14576 "from BIOS. Using base mode...\n");
df694daa
KY
14577 board_config = ALC861_3ST_DIG;
14578 }
14579 }
14580
680cd536
KK
14581 err = snd_hda_attach_beep_device(codec, 0x23);
14582 if (err < 0) {
14583 alc_free(codec);
14584 return err;
14585 }
14586
df694daa 14587 if (board_config != ALC861_AUTO)
e9c364c0 14588 setup_preset(codec, &alc861_presets[board_config]);
df694daa 14589
df694daa
KY
14590 spec->stream_analog_playback = &alc861_pcm_analog_playback;
14591 spec->stream_analog_capture = &alc861_pcm_analog_capture;
14592
df694daa
KY
14593 spec->stream_digital_playback = &alc861_pcm_digital_playback;
14594 spec->stream_digital_capture = &alc861_pcm_digital_capture;
14595
45bdd1c1
TI
14596 set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
14597
2134ea4f
TI
14598 spec->vmaster_nid = 0x03;
14599
df694daa
KY
14600 codec->patch_ops = alc_patch_ops;
14601 if (board_config == ALC861_AUTO)
ae6b813a 14602 spec->init_hook = alc861_auto_init;
cb53c626
TI
14603#ifdef CONFIG_SND_HDA_POWER_SAVE
14604 if (!spec->loopback.amplist)
14605 spec->loopback.amplist = alc861_loopbacks;
14606#endif
daead538 14607 codec->proc_widget_hook = print_realtek_coef;
ea1fb29a 14608
1da177e4
LT
14609 return 0;
14610}
14611
f32610ed
JS
14612/*
14613 * ALC861-VD support
14614 *
14615 * Based on ALC882
14616 *
14617 * In addition, an independent DAC
14618 */
14619#define ALC861VD_DIGOUT_NID 0x06
14620
14621static hda_nid_t alc861vd_dac_nids[4] = {
14622 /* front, surr, clfe, side surr */
14623 0x02, 0x03, 0x04, 0x05
14624};
14625
14626/* dac_nids for ALC660vd are in a different order - according to
14627 * Realtek's driver.
def319f9 14628 * This should probably result in a different mixer for 6stack models
f32610ed
JS
14629 * of ALC660vd codecs, but for now there is only 3stack mixer
14630 * - and it is the same as in 861vd.
14631 * adc_nids in ALC660vd are (is) the same as in 861vd
14632 */
14633static hda_nid_t alc660vd_dac_nids[3] = {
14634 /* front, rear, clfe, rear_surr */
14635 0x02, 0x04, 0x03
14636};
14637
14638static hda_nid_t alc861vd_adc_nids[1] = {
14639 /* ADC0 */
14640 0x09,
14641};
14642
e1406348
TI
14643static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
14644
f32610ed
JS
14645/* input MUX */
14646/* FIXME: should be a matrix-type input source selection */
14647static struct hda_input_mux alc861vd_capture_source = {
14648 .num_items = 4,
14649 .items = {
14650 { "Mic", 0x0 },
14651 { "Front Mic", 0x1 },
14652 { "Line", 0x2 },
14653 { "CD", 0x4 },
14654 },
14655};
14656
272a527c 14657static struct hda_input_mux alc861vd_dallas_capture_source = {
b419f346 14658 .num_items = 2,
272a527c 14659 .items = {
b419f346
TD
14660 { "Ext Mic", 0x0 },
14661 { "Int Mic", 0x1 },
272a527c
KY
14662 },
14663};
14664
d1a991a6
KY
14665static struct hda_input_mux alc861vd_hp_capture_source = {
14666 .num_items = 2,
14667 .items = {
14668 { "Front Mic", 0x0 },
14669 { "ATAPI Mic", 0x1 },
14670 },
14671};
14672
f32610ed
JS
14673/*
14674 * 2ch mode
14675 */
14676static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
14677 { 2, NULL }
14678};
14679
14680/*
14681 * 6ch mode
14682 */
14683static struct hda_verb alc861vd_6stack_ch6_init[] = {
14684 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14685 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14686 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14687 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14688 { } /* end */
14689};
14690
14691/*
14692 * 8ch mode
14693 */
14694static struct hda_verb alc861vd_6stack_ch8_init[] = {
14695 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14696 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14697 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14698 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14699 { } /* end */
14700};
14701
14702static struct hda_channel_mode alc861vd_6stack_modes[2] = {
14703 { 6, alc861vd_6stack_ch6_init },
14704 { 8, alc861vd_6stack_ch8_init },
14705};
14706
14707static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
14708 {
14709 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14710 .name = "Channel Mode",
14711 .info = alc_ch_mode_info,
14712 .get = alc_ch_mode_get,
14713 .put = alc_ch_mode_put,
14714 },
14715 { } /* end */
14716};
14717
f32610ed
JS
14718/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
14719 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
14720 */
14721static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
14722 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14723 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
14724
14725 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
14726 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
14727
14728 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
14729 HDA_OUTPUT),
14730 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
14731 HDA_OUTPUT),
14732 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
14733 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
14734
14735 HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
14736 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
14737
14738 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
14739
14740 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
14741 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14742 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14743
14744 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
14745 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
14746 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
14747
14748 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
14749 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
14750
14751 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
14752 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
14753
f32610ed
JS
14754 { } /* end */
14755};
14756
14757static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
14758 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14759 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
14760
14761 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
14762
14763 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
14764 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14765 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14766
14767 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
14768 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
14769 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
14770
14771 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
14772 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
14773
14774 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
14775 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
14776
f32610ed
JS
14777 { } /* end */
14778};
14779
bdd148a3
KY
14780static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
14781 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14782 /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
14783 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
14784
14785 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
14786
14787 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
14788 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14789 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14790
14791 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
14792 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
14793 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
14794
14795 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
14796 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
14797
14798 { } /* end */
14799};
14800
b419f346
TD
14801/* Pin assignment: Speaker=0x14, HP = 0x15,
14802 * Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
272a527c
KY
14803 */
14804static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
b419f346
TD
14805 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14806 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
272a527c
KY
14807 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
14808 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
b419f346
TD
14809 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
14810 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14811 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14812 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
14813 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
14814 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
272a527c
KY
14815 { } /* end */
14816};
14817
d1a991a6
KY
14818/* Pin assignment: Speaker=0x14, Line-out = 0x15,
14819 * Front Mic=0x18, ATAPI Mic = 0x19,
14820 */
14821static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
14822 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14823 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
14824 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
14825 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
14826 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14827 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14828 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
14829 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
ea1fb29a 14830
d1a991a6
KY
14831 { } /* end */
14832};
14833
f32610ed
JS
14834/*
14835 * generic initialization of ADC, input mixers and output mixers
14836 */
14837static struct hda_verb alc861vd_volume_init_verbs[] = {
14838 /*
14839 * Unmute ADC0 and set the default input to mic-in
14840 */
14841 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
14842 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14843
14844 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
14845 * the analog-loopback mixer widget
14846 */
14847 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
14848 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14849 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14850 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14851 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14852 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
f32610ed
JS
14853
14854 /* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
bdd148a3
KY
14855 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14856 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14857 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
f32610ed 14858 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
f32610ed
JS
14859
14860 /*
14861 * Set up output mixers (0x02 - 0x05)
14862 */
14863 /* set vol=0 to output mixers */
14864 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14865 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14866 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14867 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14868
14869 /* set up input amps for analog loopback */
14870 /* Amp Indices: DAC = 0, mixer = 1 */
14871 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14872 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14873 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14874 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14875 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14876 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14877 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14878 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14879
14880 { }
14881};
14882
14883/*
14884 * 3-stack pin configuration:
14885 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
14886 */
14887static struct hda_verb alc861vd_3stack_init_verbs[] = {
14888 /*
14889 * Set pin mode and muting
14890 */
14891 /* set front pin widgets 0x14 for output */
14892 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14893 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14894 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
14895
14896 /* Mic (rear) pin: input vref at 80% */
14897 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14898 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14899 /* Front Mic pin: input vref at 80% */
14900 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14901 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14902 /* Line In pin: input */
14903 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14904 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14905 /* Line-2 In: Headphone output (output 0 - 0x0c) */
14906 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14907 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14908 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
14909 /* CD pin widget for input */
14910 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14911
14912 { }
14913};
14914
14915/*
14916 * 6-stack pin configuration:
14917 */
14918static struct hda_verb alc861vd_6stack_init_verbs[] = {
14919 /*
14920 * Set pin mode and muting
14921 */
14922 /* set front pin widgets 0x14 for output */
14923 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14924 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14925 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
14926
14927 /* Rear Pin: output 1 (0x0d) */
14928 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14929 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14930 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14931 /* CLFE Pin: output 2 (0x0e) */
14932 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14933 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14934 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
14935 /* Side Pin: output 3 (0x0f) */
14936 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14937 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14938 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
14939
14940 /* Mic (rear) pin: input vref at 80% */
14941 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14942 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14943 /* Front Mic pin: input vref at 80% */
14944 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14945 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14946 /* Line In pin: input */
14947 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14948 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14949 /* Line-2 In: Headphone output (output 0 - 0x0c) */
14950 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14951 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14952 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
14953 /* CD pin widget for input */
14954 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14955
14956 { }
14957};
14958
bdd148a3
KY
14959static struct hda_verb alc861vd_eapd_verbs[] = {
14960 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14961 { }
14962};
14963
f9423e7a
KY
14964static struct hda_verb alc660vd_eapd_verbs[] = {
14965 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14966 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
14967 { }
14968};
14969
bdd148a3
KY
14970static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
14971 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14972 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14973 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
14974 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
ea1fb29a 14975 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
bdd148a3
KY
14976 {}
14977};
14978
bdd148a3
KY
14979static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
14980{
14981 unsigned int present;
14982 unsigned char bits;
14983
864f92be 14984 present = snd_hda_jack_detect(codec, 0x18);
47fd830a 14985 bits = present ? HDA_AMP_MUTE : 0;
864f92be 14986
47fd830a
TI
14987 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
14988 HDA_AMP_MUTE, bits);
bdd148a3
KY
14989}
14990
4f5d1706 14991static void alc861vd_lenovo_setup(struct hda_codec *codec)
bdd148a3 14992{
a9fd4f3f 14993 struct alc_spec *spec = codec->spec;
a9fd4f3f
TI
14994 spec->autocfg.hp_pins[0] = 0x1b;
14995 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
14996}
14997
14998static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
14999{
a9fd4f3f 15000 alc_automute_amp(codec);
bdd148a3
KY
15001 alc861vd_lenovo_mic_automute(codec);
15002}
15003
15004static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
15005 unsigned int res)
15006{
15007 switch (res >> 26) {
bdd148a3
KY
15008 case ALC880_MIC_EVENT:
15009 alc861vd_lenovo_mic_automute(codec);
15010 break;
a9fd4f3f
TI
15011 default:
15012 alc_automute_amp_unsol_event(codec, res);
15013 break;
bdd148a3
KY
15014 }
15015}
15016
272a527c
KY
15017static struct hda_verb alc861vd_dallas_verbs[] = {
15018 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15019 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15020 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15021 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15022
15023 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15024 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15025 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15026 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15027 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15028 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15029 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15030 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
ea1fb29a 15031
272a527c
KY
15032 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15033 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15034 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15035 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15036 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15037 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15038 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15039 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15040
15041 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15042 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15043 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15044 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15045 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15046 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15047 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15048 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15049
15050 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15051 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15052 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15053 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15054
15055 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
ea1fb29a 15056 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
272a527c
KY
15057 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15058
15059 { } /* end */
15060};
15061
15062/* toggle speaker-output according to the hp-jack state */
4f5d1706 15063static void alc861vd_dallas_setup(struct hda_codec *codec)
272a527c 15064{
a9fd4f3f 15065 struct alc_spec *spec = codec->spec;
272a527c 15066
a9fd4f3f
TI
15067 spec->autocfg.hp_pins[0] = 0x15;
15068 spec->autocfg.speaker_pins[0] = 0x14;
272a527c
KY
15069}
15070
cb53c626
TI
15071#ifdef CONFIG_SND_HDA_POWER_SAVE
15072#define alc861vd_loopbacks alc880_loopbacks
15073#endif
15074
def319f9 15075/* pcm configuration: identical with ALC880 */
f32610ed
JS
15076#define alc861vd_pcm_analog_playback alc880_pcm_analog_playback
15077#define alc861vd_pcm_analog_capture alc880_pcm_analog_capture
15078#define alc861vd_pcm_digital_playback alc880_pcm_digital_playback
15079#define alc861vd_pcm_digital_capture alc880_pcm_digital_capture
15080
15081/*
15082 * configuration and preset
15083 */
15084static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
15085 [ALC660VD_3ST] = "3stack-660",
983f8ae4 15086 [ALC660VD_3ST_DIG] = "3stack-660-digout",
13c94744 15087 [ALC660VD_ASUS_V1S] = "asus-v1s",
f32610ed
JS
15088 [ALC861VD_3ST] = "3stack",
15089 [ALC861VD_3ST_DIG] = "3stack-digout",
15090 [ALC861VD_6ST_DIG] = "6stack-digout",
bdd148a3 15091 [ALC861VD_LENOVO] = "lenovo",
272a527c 15092 [ALC861VD_DALLAS] = "dallas",
983f8ae4 15093 [ALC861VD_HP] = "hp",
f32610ed
JS
15094 [ALC861VD_AUTO] = "auto",
15095};
15096
15097static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
ac3e3741
TI
15098 SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
15099 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
07e038b3 15100 SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
f8f25ba3 15101 /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
13c94744 15102 SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
6963f84c 15103 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
f32610ed 15104 SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
ac3e3741 15105 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
38baf5ad 15106 /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
ce577e8c 15107 SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
542d7c66 15108 SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
b419f346 15109 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
39c5d41f 15110 SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
dea0a509 15111 SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
625dc0bf 15112 SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
f32610ed
JS
15113 {}
15114};
15115
15116static struct alc_config_preset alc861vd_presets[] = {
15117 [ALC660VD_3ST] = {
15118 .mixers = { alc861vd_3st_mixer },
15119 .init_verbs = { alc861vd_volume_init_verbs,
15120 alc861vd_3stack_init_verbs },
15121 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15122 .dac_nids = alc660vd_dac_nids,
f32610ed
JS
15123 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15124 .channel_mode = alc861vd_3stack_2ch_modes,
15125 .input_mux = &alc861vd_capture_source,
15126 },
6963f84c
MC
15127 [ALC660VD_3ST_DIG] = {
15128 .mixers = { alc861vd_3st_mixer },
15129 .init_verbs = { alc861vd_volume_init_verbs,
15130 alc861vd_3stack_init_verbs },
15131 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15132 .dac_nids = alc660vd_dac_nids,
15133 .dig_out_nid = ALC861VD_DIGOUT_NID,
6963f84c
MC
15134 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15135 .channel_mode = alc861vd_3stack_2ch_modes,
15136 .input_mux = &alc861vd_capture_source,
15137 },
f32610ed
JS
15138 [ALC861VD_3ST] = {
15139 .mixers = { alc861vd_3st_mixer },
15140 .init_verbs = { alc861vd_volume_init_verbs,
15141 alc861vd_3stack_init_verbs },
15142 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15143 .dac_nids = alc861vd_dac_nids,
15144 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15145 .channel_mode = alc861vd_3stack_2ch_modes,
15146 .input_mux = &alc861vd_capture_source,
15147 },
15148 [ALC861VD_3ST_DIG] = {
15149 .mixers = { alc861vd_3st_mixer },
15150 .init_verbs = { alc861vd_volume_init_verbs,
15151 alc861vd_3stack_init_verbs },
15152 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15153 .dac_nids = alc861vd_dac_nids,
15154 .dig_out_nid = ALC861VD_DIGOUT_NID,
15155 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15156 .channel_mode = alc861vd_3stack_2ch_modes,
15157 .input_mux = &alc861vd_capture_source,
15158 },
15159 [ALC861VD_6ST_DIG] = {
15160 .mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
15161 .init_verbs = { alc861vd_volume_init_verbs,
15162 alc861vd_6stack_init_verbs },
15163 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15164 .dac_nids = alc861vd_dac_nids,
15165 .dig_out_nid = ALC861VD_DIGOUT_NID,
15166 .num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
15167 .channel_mode = alc861vd_6stack_modes,
15168 .input_mux = &alc861vd_capture_source,
15169 },
bdd148a3
KY
15170 [ALC861VD_LENOVO] = {
15171 .mixers = { alc861vd_lenovo_mixer },
15172 .init_verbs = { alc861vd_volume_init_verbs,
15173 alc861vd_3stack_init_verbs,
15174 alc861vd_eapd_verbs,
15175 alc861vd_lenovo_unsol_verbs },
15176 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15177 .dac_nids = alc660vd_dac_nids,
bdd148a3
KY
15178 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15179 .channel_mode = alc861vd_3stack_2ch_modes,
15180 .input_mux = &alc861vd_capture_source,
15181 .unsol_event = alc861vd_lenovo_unsol_event,
4f5d1706 15182 .setup = alc861vd_lenovo_setup,
a9fd4f3f 15183 .init_hook = alc861vd_lenovo_init_hook,
bdd148a3 15184 },
272a527c
KY
15185 [ALC861VD_DALLAS] = {
15186 .mixers = { alc861vd_dallas_mixer },
15187 .init_verbs = { alc861vd_dallas_verbs },
15188 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15189 .dac_nids = alc861vd_dac_nids,
272a527c
KY
15190 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15191 .channel_mode = alc861vd_3stack_2ch_modes,
15192 .input_mux = &alc861vd_dallas_capture_source,
a9fd4f3f 15193 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
15194 .setup = alc861vd_dallas_setup,
15195 .init_hook = alc_automute_amp,
d1a991a6
KY
15196 },
15197 [ALC861VD_HP] = {
15198 .mixers = { alc861vd_hp_mixer },
15199 .init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
15200 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15201 .dac_nids = alc861vd_dac_nids,
d1a991a6 15202 .dig_out_nid = ALC861VD_DIGOUT_NID,
d1a991a6
KY
15203 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15204 .channel_mode = alc861vd_3stack_2ch_modes,
15205 .input_mux = &alc861vd_hp_capture_source,
a9fd4f3f 15206 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
15207 .setup = alc861vd_dallas_setup,
15208 .init_hook = alc_automute_amp,
ea1fb29a 15209 },
13c94744
TI
15210 [ALC660VD_ASUS_V1S] = {
15211 .mixers = { alc861vd_lenovo_mixer },
15212 .init_verbs = { alc861vd_volume_init_verbs,
15213 alc861vd_3stack_init_verbs,
15214 alc861vd_eapd_verbs,
15215 alc861vd_lenovo_unsol_verbs },
15216 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15217 .dac_nids = alc660vd_dac_nids,
15218 .dig_out_nid = ALC861VD_DIGOUT_NID,
15219 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15220 .channel_mode = alc861vd_3stack_2ch_modes,
15221 .input_mux = &alc861vd_capture_source,
15222 .unsol_event = alc861vd_lenovo_unsol_event,
4f5d1706 15223 .setup = alc861vd_lenovo_setup,
a9fd4f3f 15224 .init_hook = alc861vd_lenovo_init_hook,
13c94744 15225 },
f32610ed
JS
15226};
15227
15228/*
15229 * BIOS auto configuration
15230 */
05f5f477
TI
15231static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
15232 const struct auto_pin_cfg *cfg)
15233{
15234 return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0);
15235}
15236
15237
f32610ed
JS
15238static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
15239 hda_nid_t nid, int pin_type, int dac_idx)
15240{
f6c7e546 15241 alc_set_pin_output(codec, nid, pin_type);
f32610ed
JS
15242}
15243
15244static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
15245{
15246 struct alc_spec *spec = codec->spec;
15247 int i;
15248
15249 for (i = 0; i <= HDA_SIDE; i++) {
15250 hda_nid_t nid = spec->autocfg.line_out_pins[i];
baba8ee9 15251 int pin_type = get_pin_type(spec->autocfg.line_out_type);
f32610ed
JS
15252 if (nid)
15253 alc861vd_auto_set_output_and_unmute(codec, nid,
baba8ee9 15254 pin_type, i);
f32610ed
JS
15255 }
15256}
15257
15258
15259static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
15260{
15261 struct alc_spec *spec = codec->spec;
15262 hda_nid_t pin;
15263
15264 pin = spec->autocfg.hp_pins[0];
def319f9 15265 if (pin) /* connect to front and use dac 0 */
f32610ed 15266 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
f6c7e546
TI
15267 pin = spec->autocfg.speaker_pins[0];
15268 if (pin)
15269 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
f32610ed
JS
15270}
15271
f32610ed
JS
15272#define ALC861VD_PIN_CD_NID ALC880_PIN_CD_NID
15273
15274static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
15275{
15276 struct alc_spec *spec = codec->spec;
15277 int i;
15278
15279 for (i = 0; i < AUTO_PIN_LAST; i++) {
15280 hda_nid_t nid = spec->autocfg.input_pins[i];
05f5f477 15281 if (alc_is_input_pin(codec, nid)) {
23f0c048 15282 alc_set_input_pin(codec, nid, i);
e82c025b
TI
15283 if (nid != ALC861VD_PIN_CD_NID &&
15284 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
f32610ed
JS
15285 snd_hda_codec_write(codec, nid, 0,
15286 AC_VERB_SET_AMP_GAIN_MUTE,
15287 AMP_OUT_MUTE);
15288 }
15289 }
15290}
15291
f511b01c
TI
15292#define alc861vd_auto_init_input_src alc882_auto_init_input_src
15293
f32610ed
JS
15294#define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02)
15295#define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c)
15296
15297/* add playback controls from the parsed DAC table */
15298/* Based on ALC880 version. But ALC861VD has separate,
15299 * different NIDs for mute/unmute switch and volume control */
15300static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
15301 const struct auto_pin_cfg *cfg)
15302{
f32610ed
JS
15303 static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
15304 hda_nid_t nid_v, nid_s;
15305 int i, err;
15306
15307 for (i = 0; i < cfg->line_outs; i++) {
f12ab1e0 15308 if (!spec->multiout.dac_nids[i])
f32610ed
JS
15309 continue;
15310 nid_v = alc861vd_idx_to_mixer_vol(
15311 alc880_dac_to_idx(
15312 spec->multiout.dac_nids[i]));
15313 nid_s = alc861vd_idx_to_mixer_switch(
15314 alc880_dac_to_idx(
15315 spec->multiout.dac_nids[i]));
15316
15317 if (i == 2) {
15318 /* Center/LFE */
0afe5f89
TI
15319 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
15320 "Center",
f12ab1e0
TI
15321 HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
15322 HDA_OUTPUT));
15323 if (err < 0)
f32610ed 15324 return err;
0afe5f89
TI
15325 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
15326 "LFE",
f12ab1e0
TI
15327 HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
15328 HDA_OUTPUT));
15329 if (err < 0)
f32610ed 15330 return err;
0afe5f89
TI
15331 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
15332 "Center",
f12ab1e0
TI
15333 HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
15334 HDA_INPUT));
15335 if (err < 0)
f32610ed 15336 return err;
0afe5f89
TI
15337 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
15338 "LFE",
f12ab1e0
TI
15339 HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
15340 HDA_INPUT));
15341 if (err < 0)
f32610ed
JS
15342 return err;
15343 } else {
a4fcd491
TI
15344 const char *pfx;
15345 if (cfg->line_outs == 1 &&
15346 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
15347 if (!cfg->hp_pins)
15348 pfx = "Speaker";
15349 else
15350 pfx = "PCM";
15351 } else
15352 pfx = chname[i];
0afe5f89 15353 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
f12ab1e0
TI
15354 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
15355 HDA_OUTPUT));
15356 if (err < 0)
f32610ed 15357 return err;
a4fcd491
TI
15358 if (cfg->line_outs == 1 &&
15359 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
15360 pfx = "Speaker";
0afe5f89 15361 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
bdd148a3 15362 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
f12ab1e0
TI
15363 HDA_INPUT));
15364 if (err < 0)
f32610ed
JS
15365 return err;
15366 }
15367 }
15368 return 0;
15369}
15370
15371/* add playback controls for speaker and HP outputs */
15372/* Based on ALC880 version. But ALC861VD has separate,
15373 * different NIDs for mute/unmute switch and volume control */
15374static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
15375 hda_nid_t pin, const char *pfx)
15376{
15377 hda_nid_t nid_v, nid_s;
15378 int err;
f32610ed 15379
f12ab1e0 15380 if (!pin)
f32610ed
JS
15381 return 0;
15382
15383 if (alc880_is_fixed_pin(pin)) {
15384 nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
15385 /* specify the DAC as the extra output */
f12ab1e0 15386 if (!spec->multiout.hp_nid)
f32610ed
JS
15387 spec->multiout.hp_nid = nid_v;
15388 else
15389 spec->multiout.extra_out_nid[0] = nid_v;
15390 /* control HP volume/switch on the output mixer amp */
15391 nid_v = alc861vd_idx_to_mixer_vol(
15392 alc880_fixed_pin_idx(pin));
15393 nid_s = alc861vd_idx_to_mixer_switch(
15394 alc880_fixed_pin_idx(pin));
15395
0afe5f89 15396 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
f12ab1e0
TI
15397 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
15398 if (err < 0)
f32610ed 15399 return err;
0afe5f89 15400 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
f12ab1e0
TI
15401 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
15402 if (err < 0)
f32610ed
JS
15403 return err;
15404 } else if (alc880_is_multi_pin(pin)) {
15405 /* set manual connection */
15406 /* we have only a switch on HP-out PIN */
0afe5f89 15407 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
f12ab1e0
TI
15408 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
15409 if (err < 0)
f32610ed
JS
15410 return err;
15411 }
15412 return 0;
15413}
15414
15415/* parse the BIOS configuration and set up the alc_spec
15416 * return 1 if successful, 0 if the proper config is not found,
15417 * or a negative error code
15418 * Based on ALC880 version - had to change it to override
15419 * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
15420static int alc861vd_parse_auto_config(struct hda_codec *codec)
15421{
15422 struct alc_spec *spec = codec->spec;
15423 int err;
15424 static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
15425
f12ab1e0
TI
15426 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15427 alc861vd_ignore);
15428 if (err < 0)
f32610ed 15429 return err;
f12ab1e0 15430 if (!spec->autocfg.line_outs)
f32610ed
JS
15431 return 0; /* can't find valid BIOS pin config */
15432
f12ab1e0
TI
15433 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
15434 if (err < 0)
15435 return err;
15436 err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
15437 if (err < 0)
15438 return err;
15439 err = alc861vd_auto_create_extra_out(spec,
15440 spec->autocfg.speaker_pins[0],
15441 "Speaker");
15442 if (err < 0)
15443 return err;
15444 err = alc861vd_auto_create_extra_out(spec,
15445 spec->autocfg.hp_pins[0],
15446 "Headphone");
15447 if (err < 0)
15448 return err;
05f5f477 15449 err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 15450 if (err < 0)
f32610ed
JS
15451 return err;
15452
15453 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
15454
0852d7a6 15455 if (spec->autocfg.dig_outs)
f32610ed
JS
15456 spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID;
15457
603c4019 15458 if (spec->kctls.list)
d88897ea 15459 add_mixer(spec, spec->kctls.list);
f32610ed 15460
d88897ea 15461 add_verb(spec, alc861vd_volume_init_verbs);
f32610ed
JS
15462
15463 spec->num_mux_defs = 1;
61b9b9b1 15464 spec->input_mux = &spec->private_imux[0];
f32610ed 15465
776e184e
TI
15466 err = alc_auto_add_mic_boost(codec);
15467 if (err < 0)
15468 return err;
15469
4a79ba34
TI
15470 alc_ssid_check(codec, 0x15, 0x1b, 0x14);
15471
f32610ed
JS
15472 return 1;
15473}
15474
15475/* additional initialization for auto-configuration model */
15476static void alc861vd_auto_init(struct hda_codec *codec)
15477{
f6c7e546 15478 struct alc_spec *spec = codec->spec;
f32610ed
JS
15479 alc861vd_auto_init_multi_out(codec);
15480 alc861vd_auto_init_hp_out(codec);
15481 alc861vd_auto_init_analog_input(codec);
f511b01c 15482 alc861vd_auto_init_input_src(codec);
f6c7e546 15483 if (spec->unsol_event)
7fb0d78f 15484 alc_inithook(codec);
f32610ed
JS
15485}
15486
f8f25ba3
TI
15487enum {
15488 ALC660VD_FIX_ASUS_GPIO1
15489};
15490
15491/* reset GPIO1 */
15492static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
15493 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
15494 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
15495 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
15496 { }
15497};
15498
15499static const struct alc_fixup alc861vd_fixups[] = {
15500 [ALC660VD_FIX_ASUS_GPIO1] = {
15501 .verbs = alc660vd_fix_asus_gpio1_verbs,
15502 },
15503};
15504
15505static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
15506 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
15507 {}
15508};
15509
f32610ed
JS
15510static int patch_alc861vd(struct hda_codec *codec)
15511{
15512 struct alc_spec *spec;
15513 int err, board_config;
15514
15515 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
15516 if (spec == NULL)
15517 return -ENOMEM;
15518
15519 codec->spec = spec;
15520
15521 board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
15522 alc861vd_models,
15523 alc861vd_cfg_tbl);
15524
15525 if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
9a11f1aa
TI
15526 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15527 codec->chip_name);
f32610ed
JS
15528 board_config = ALC861VD_AUTO;
15529 }
15530
f8f25ba3
TI
15531 alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups);
15532
f32610ed
JS
15533 if (board_config == ALC861VD_AUTO) {
15534 /* automatic parse from the BIOS config */
15535 err = alc861vd_parse_auto_config(codec);
15536 if (err < 0) {
15537 alc_free(codec);
15538 return err;
f12ab1e0 15539 } else if (!err) {
f32610ed
JS
15540 printk(KERN_INFO
15541 "hda_codec: Cannot set up configuration "
15542 "from BIOS. Using base mode...\n");
15543 board_config = ALC861VD_3ST;
15544 }
15545 }
15546
680cd536
KK
15547 err = snd_hda_attach_beep_device(codec, 0x23);
15548 if (err < 0) {
15549 alc_free(codec);
15550 return err;
15551 }
15552
f32610ed 15553 if (board_config != ALC861VD_AUTO)
e9c364c0 15554 setup_preset(codec, &alc861vd_presets[board_config]);
f32610ed 15555
2f893286 15556 if (codec->vendor_id == 0x10ec0660) {
f9423e7a 15557 /* always turn on EAPD */
d88897ea 15558 add_verb(spec, alc660vd_eapd_verbs);
2f893286
KY
15559 }
15560
f32610ed
JS
15561 spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
15562 spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
15563
f32610ed
JS
15564 spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
15565 spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
15566
dd704698
TI
15567 if (!spec->adc_nids) {
15568 spec->adc_nids = alc861vd_adc_nids;
15569 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
15570 }
15571 if (!spec->capsrc_nids)
15572 spec->capsrc_nids = alc861vd_capsrc_nids;
f32610ed 15573
b59bdf3b 15574 set_capture_mixer(codec);
45bdd1c1 15575 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
f32610ed 15576
2134ea4f
TI
15577 spec->vmaster_nid = 0x02;
15578
f32610ed
JS
15579 codec->patch_ops = alc_patch_ops;
15580
15581 if (board_config == ALC861VD_AUTO)
15582 spec->init_hook = alc861vd_auto_init;
cb53c626
TI
15583#ifdef CONFIG_SND_HDA_POWER_SAVE
15584 if (!spec->loopback.amplist)
15585 spec->loopback.amplist = alc861vd_loopbacks;
15586#endif
daead538 15587 codec->proc_widget_hook = print_realtek_coef;
f32610ed
JS
15588
15589 return 0;
15590}
15591
bc9f98a9
KY
15592/*
15593 * ALC662 support
15594 *
15595 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
15596 * configuration. Each pin widget can choose any input DACs and a mixer.
15597 * Each ADC is connected from a mixer of all inputs. This makes possible
15598 * 6-channel independent captures.
15599 *
15600 * In addition, an independent DAC for the multi-playback (not used in this
15601 * driver yet).
15602 */
15603#define ALC662_DIGOUT_NID 0x06
15604#define ALC662_DIGIN_NID 0x0a
15605
15606static hda_nid_t alc662_dac_nids[4] = {
15607 /* front, rear, clfe, rear_surr */
15608 0x02, 0x03, 0x04
15609};
15610
622e84cd
KY
15611static hda_nid_t alc272_dac_nids[2] = {
15612 0x02, 0x03
15613};
15614
b59bdf3b 15615static hda_nid_t alc662_adc_nids[2] = {
bc9f98a9 15616 /* ADC1-2 */
b59bdf3b 15617 0x09, 0x08
bc9f98a9 15618};
e1406348 15619
622e84cd
KY
15620static hda_nid_t alc272_adc_nids[1] = {
15621 /* ADC1-2 */
15622 0x08,
15623};
15624
b59bdf3b 15625static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
622e84cd
KY
15626static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
15627
e1406348 15628
bc9f98a9
KY
15629/* input MUX */
15630/* FIXME: should be a matrix-type input source selection */
bc9f98a9
KY
15631static struct hda_input_mux alc662_capture_source = {
15632 .num_items = 4,
15633 .items = {
15634 { "Mic", 0x0 },
15635 { "Front Mic", 0x1 },
15636 { "Line", 0x2 },
15637 { "CD", 0x4 },
15638 },
15639};
15640
15641static struct hda_input_mux alc662_lenovo_101e_capture_source = {
15642 .num_items = 2,
15643 .items = {
15644 { "Mic", 0x1 },
15645 { "Line", 0x2 },
15646 },
15647};
291702f0 15648
6dda9f4a
KY
15649static struct hda_input_mux alc663_capture_source = {
15650 .num_items = 3,
15651 .items = {
15652 { "Mic", 0x0 },
15653 { "Front Mic", 0x1 },
15654 { "Line", 0x2 },
15655 },
15656};
15657
4f5d1706 15658#if 0 /* set to 1 for testing other input sources below */
9541ba1d
CP
15659static struct hda_input_mux alc272_nc10_capture_source = {
15660 .num_items = 16,
15661 .items = {
15662 { "Autoselect Mic", 0x0 },
15663 { "Internal Mic", 0x1 },
15664 { "In-0x02", 0x2 },
15665 { "In-0x03", 0x3 },
15666 { "In-0x04", 0x4 },
15667 { "In-0x05", 0x5 },
15668 { "In-0x06", 0x6 },
15669 { "In-0x07", 0x7 },
15670 { "In-0x08", 0x8 },
15671 { "In-0x09", 0x9 },
15672 { "In-0x0a", 0x0a },
15673 { "In-0x0b", 0x0b },
15674 { "In-0x0c", 0x0c },
15675 { "In-0x0d", 0x0d },
15676 { "In-0x0e", 0x0e },
15677 { "In-0x0f", 0x0f },
15678 },
15679};
15680#endif
15681
bc9f98a9
KY
15682/*
15683 * 2ch mode
15684 */
15685static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
15686 { 2, NULL }
15687};
15688
15689/*
15690 * 2ch mode
15691 */
15692static struct hda_verb alc662_3ST_ch2_init[] = {
15693 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
15694 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
15695 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
15696 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
15697 { } /* end */
15698};
15699
15700/*
15701 * 6ch mode
15702 */
15703static struct hda_verb alc662_3ST_ch6_init[] = {
15704 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15705 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
15706 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
15707 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15708 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
15709 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
15710 { } /* end */
15711};
15712
15713static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
15714 { 2, alc662_3ST_ch2_init },
15715 { 6, alc662_3ST_ch6_init },
15716};
15717
15718/*
15719 * 2ch mode
15720 */
15721static struct hda_verb alc662_sixstack_ch6_init[] = {
15722 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15723 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15724 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15725 { } /* end */
15726};
15727
15728/*
15729 * 6ch mode
15730 */
15731static struct hda_verb alc662_sixstack_ch8_init[] = {
15732 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15733 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15734 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15735 { } /* end */
15736};
15737
15738static struct hda_channel_mode alc662_5stack_modes[2] = {
15739 { 2, alc662_sixstack_ch6_init },
15740 { 6, alc662_sixstack_ch8_init },
15741};
15742
15743/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
15744 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
15745 */
15746
15747static struct snd_kcontrol_new alc662_base_mixer[] = {
15748 /* output mixer control */
15749 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
7055ad8a 15750 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
bc9f98a9 15751 HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
7055ad8a 15752 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
bc9f98a9
KY
15753 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
15754 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
7055ad8a
HRK
15755 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
15756 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
bc9f98a9
KY
15757 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15758
15759 /*Input mixer control */
15760 HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
15761 HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
15762 HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
15763 HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
15764 HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
15765 HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
15766 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
15767 HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
bc9f98a9
KY
15768 { } /* end */
15769};
15770
15771static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
15772 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
7055ad8a 15773 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
bc9f98a9
KY
15774 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15775 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15776 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15777 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15778 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15779 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15780 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15781 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15782 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
bc9f98a9
KY
15783 { } /* end */
15784};
15785
15786static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
15787 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
7055ad8a 15788 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
bc9f98a9 15789 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
7055ad8a 15790 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
bc9f98a9
KY
15791 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
15792 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
7055ad8a
HRK
15793 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
15794 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
bc9f98a9
KY
15795 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15796 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15797 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15798 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15799 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15800 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15801 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15802 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15803 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
bc9f98a9
KY
15804 { } /* end */
15805};
15806
15807static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
15808 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15809 HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
86cd9298
TI
15810 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15811 HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
bc9f98a9
KY
15812 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15813 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15814 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15815 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15816 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
bc9f98a9
KY
15817 { } /* end */
15818};
15819
291702f0 15820static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
42171c17
TI
15821 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15822 ALC262_HIPPO_MASTER_SWITCH,
291702f0
KY
15823
15824 HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
15825 HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15826 HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15827
15828 HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
15829 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15830 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15831 { } /* end */
15832};
15833
8c427226 15834static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
42171c17
TI
15835 ALC262_HIPPO_MASTER_SWITCH,
15836 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
8c427226 15837 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
8c427226
KY
15838 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
15839 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
8c427226
KY
15840 HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
15841 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15842 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15843 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15844 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15845 { } /* end */
15846};
15847
f1d4e28b
KY
15848static struct hda_bind_ctls alc663_asus_bind_master_vol = {
15849 .ops = &snd_hda_bind_vol,
15850 .values = {
15851 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
15852 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
15853 0
15854 },
15855};
15856
15857static struct hda_bind_ctls alc663_asus_one_bind_switch = {
15858 .ops = &snd_hda_bind_sw,
15859 .values = {
15860 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
15861 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
15862 0
15863 },
15864};
15865
6dda9f4a 15866static struct snd_kcontrol_new alc663_m51va_mixer[] = {
f1d4e28b
KY
15867 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
15868 HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
15869 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15870 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15871 { } /* end */
15872};
15873
15874static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
15875 .ops = &snd_hda_bind_sw,
15876 .values = {
15877 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
15878 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
15879 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
15880 0
15881 },
15882};
15883
15884static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
15885 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
15886 HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
15887 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15888 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15889 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15890 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15891
15892 { } /* end */
15893};
15894
15895static struct hda_bind_ctls alc663_asus_four_bind_switch = {
15896 .ops = &snd_hda_bind_sw,
15897 .values = {
15898 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
15899 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
15900 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
15901 0
15902 },
15903};
15904
15905static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
15906 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
15907 HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
15908 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15909 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15910 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15911 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15912 { } /* end */
15913};
15914
15915static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
6dda9f4a
KY
15916 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15917 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
f1d4e28b
KY
15918 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15919 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15920 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15921 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15922 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15923 { } /* end */
15924};
15925
15926static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
15927 .ops = &snd_hda_bind_vol,
15928 .values = {
15929 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
15930 HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
15931 0
15932 },
15933};
15934
15935static struct hda_bind_ctls alc663_asus_two_bind_switch = {
15936 .ops = &snd_hda_bind_sw,
15937 .values = {
15938 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
15939 HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
15940 0
15941 },
15942};
15943
15944static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
15945 HDA_BIND_VOL("Master Playback Volume",
15946 &alc663_asus_two_bind_master_vol),
15947 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
15948 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
6dda9f4a
KY
15949 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
15950 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15951 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
f1d4e28b
KY
15952 { } /* end */
15953};
15954
15955static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
15956 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
15957 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
15958 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15959 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
15960 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15961 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
6dda9f4a
KY
15962 { } /* end */
15963};
15964
15965static struct snd_kcontrol_new alc663_g71v_mixer[] = {
15966 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15967 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
15968 HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15969 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
15970 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
15971
15972 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15973 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15974 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15975 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15976 { } /* end */
15977};
15978
15979static struct snd_kcontrol_new alc663_g50v_mixer[] = {
15980 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15981 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
15982 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
15983
15984 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15985 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15986 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15987 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15988 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15989 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15990 { } /* end */
15991};
15992
bc9f98a9
KY
15993static struct snd_kcontrol_new alc662_chmode_mixer[] = {
15994 {
15995 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15996 .name = "Channel Mode",
15997 .info = alc_ch_mode_info,
15998 .get = alc_ch_mode_get,
15999 .put = alc_ch_mode_put,
16000 },
16001 { } /* end */
16002};
16003
16004static struct hda_verb alc662_init_verbs[] = {
16005 /* ADC: mute amp left and right */
16006 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16007 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16008 /* Front mixer: unmute input/output amp left and right (volume = 0) */
16009
cb53c626
TI
16010 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16011 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16012 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16013 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16014 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
bc9f98a9 16015
b60dd394
KY
16016 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16017 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16018 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16019 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16020 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16021 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
bc9f98a9
KY
16022
16023 /* Front Pin: output 0 (0x0c) */
16024 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16025 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16026
16027 /* Rear Pin: output 1 (0x0d) */
16028 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16029 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16030
16031 /* CLFE Pin: output 2 (0x0e) */
16032 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16033 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16034
16035 /* Mic (rear) pin: input vref at 80% */
16036 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16037 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16038 /* Front Mic pin: input vref at 80% */
16039 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16040 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16041 /* Line In pin: input */
16042 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16043 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16044 /* Line-2 In: Headphone output (output 0 - 0x0c) */
16045 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16046 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16047 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16048 /* CD pin widget for input */
16049 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16050
16051 /* FIXME: use matrix-type input source selection */
16052 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
16053 /* Input mixer */
16054 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
291702f0 16055 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6dda9f4a
KY
16056
16057 /* always trun on EAPD */
16058 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16059 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16060
bc9f98a9
KY
16061 { }
16062};
16063
16064static struct hda_verb alc662_sue_init_verbs[] = {
16065 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16066 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
291702f0
KY
16067 {}
16068};
16069
16070static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
16071 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16072 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16073 {}
bc9f98a9
KY
16074};
16075
8c427226
KY
16076/* Set Unsolicited Event*/
16077static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
16078 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16079 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16080 {}
16081};
16082
bc9f98a9
KY
16083/*
16084 * generic initialization of ADC, input mixers and output mixers
16085 */
16086static struct hda_verb alc662_auto_init_verbs[] = {
16087 /*
16088 * Unmute ADC and set the default input to mic-in
16089 */
16090 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16091 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16092
16093 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
16094 * mixer widget
16095 * Note: PASD motherboards uses the Line In 2 as the input for front
16096 * panel mic (mic 2)
16097 */
16098 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
16099 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16100 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16101 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16102 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16103 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
bc9f98a9
KY
16104
16105 /*
16106 * Set up output mixers (0x0c - 0x0f)
16107 */
16108 /* set vol=0 to output mixers */
16109 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16110 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16111 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16112
16113 /* set up input amps for analog loopback */
16114 /* Amp Indices: DAC = 0, mixer = 1 */
b60dd394
KY
16115 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16116 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16117 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16118 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16119 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16120 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
bc9f98a9
KY
16121
16122
16123 /* FIXME: use matrix-type input source selection */
16124 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
16125 /* Input mixer */
16126 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
d1a991a6 16127 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
bc9f98a9
KY
16128 { }
16129};
16130
24fb9173
TI
16131/* additional verbs for ALC663 */
16132static struct hda_verb alc663_auto_init_verbs[] = {
16133 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16134 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16135 { }
16136};
16137
6dda9f4a 16138static struct hda_verb alc663_m51va_init_verbs[] = {
f1d4e28b
KY
16139 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16140 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6dda9f4a
KY
16141 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16142 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
f1d4e28b
KY
16143 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16144 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16145 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16146 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16147 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16148 {}
16149};
16150
16151static struct hda_verb alc663_21jd_amic_init_verbs[] = {
16152 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16153 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16154 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16155 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16156 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16157 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16158 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16159 {}
16160};
16161
16162static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
16163 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16164 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16165 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16166 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
16167 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16168 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16169 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16170 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16171 {}
16172};
6dda9f4a 16173
f1d4e28b
KY
16174static struct hda_verb alc663_15jd_amic_init_verbs[] = {
16175 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16176 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16177 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16178 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16179 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16180 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16181 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16182 {}
16183};
6dda9f4a 16184
f1d4e28b
KY
16185static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
16186 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16187 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16188 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16189 {0x21, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
16190 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16191 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16192 {0x15, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
16193 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16194 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6dda9f4a
KY
16195 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16196 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
f1d4e28b
KY
16197 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16198 {}
16199};
16200
16201static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
16202 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16203 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16204 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16205 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16206 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16207 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16208 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16209 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16210 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16211 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16212 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16213 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6dda9f4a
KY
16214 {}
16215};
16216
16217static struct hda_verb alc663_g71v_init_verbs[] = {
16218 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16219 /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
16220 /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
16221
16222 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16223 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16224 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
16225
16226 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16227 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
16228 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
16229 {}
16230};
16231
16232static struct hda_verb alc663_g50v_init_verbs[] = {
16233 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16234 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16235 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
16236
16237 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16238 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16239 {}
16240};
16241
f1d4e28b
KY
16242static struct hda_verb alc662_ecs_init_verbs[] = {
16243 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
16244 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16245 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16246 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16247 {}
16248};
16249
622e84cd
KY
16250static struct hda_verb alc272_dell_zm1_init_verbs[] = {
16251 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16252 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16253 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16254 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16255 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16256 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16257 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16258 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16259 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16260 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16261 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16262 {}
16263};
16264
16265static struct hda_verb alc272_dell_init_verbs[] = {
16266 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16267 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16268 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16269 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16270 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16271 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16272 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16273 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16274 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16275 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16276 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16277 {}
16278};
16279
f1d4e28b
KY
16280static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
16281 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
16282 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
16283 { } /* end */
16284};
16285
622e84cd
KY
16286static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
16287 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
16288 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
16289 { } /* end */
16290};
16291
bc9f98a9
KY
16292static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
16293{
16294 unsigned int present;
f12ab1e0 16295 unsigned char bits;
bc9f98a9 16296
864f92be 16297 present = snd_hda_jack_detect(codec, 0x14);
47fd830a 16298 bits = present ? HDA_AMP_MUTE : 0;
864f92be 16299
47fd830a
TI
16300 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
16301 HDA_AMP_MUTE, bits);
bc9f98a9
KY
16302}
16303
16304static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
16305{
16306 unsigned int present;
f12ab1e0 16307 unsigned char bits;
bc9f98a9 16308
864f92be 16309 present = snd_hda_jack_detect(codec, 0x1b);
47fd830a 16310 bits = present ? HDA_AMP_MUTE : 0;
864f92be 16311
47fd830a
TI
16312 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
16313 HDA_AMP_MUTE, bits);
16314 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
16315 HDA_AMP_MUTE, bits);
bc9f98a9
KY
16316}
16317
16318static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
16319 unsigned int res)
16320{
16321 if ((res >> 26) == ALC880_HP_EVENT)
16322 alc662_lenovo_101e_all_automute(codec);
16323 if ((res >> 26) == ALC880_FRONT_EVENT)
16324 alc662_lenovo_101e_ispeaker_automute(codec);
16325}
16326
291702f0
KY
16327/* unsolicited event for HP jack sensing */
16328static void alc662_eeepc_unsol_event(struct hda_codec *codec,
16329 unsigned int res)
16330{
291702f0 16331 if ((res >> 26) == ALC880_MIC_EVENT)
4f5d1706 16332 alc_mic_automute(codec);
42171c17
TI
16333 else
16334 alc262_hippo_unsol_event(codec, res);
291702f0
KY
16335}
16336
4f5d1706
TI
16337static void alc662_eeepc_setup(struct hda_codec *codec)
16338{
16339 struct alc_spec *spec = codec->spec;
16340
16341 alc262_hippo1_setup(codec);
16342 spec->ext_mic.pin = 0x18;
16343 spec->ext_mic.mux_idx = 0;
16344 spec->int_mic.pin = 0x19;
16345 spec->int_mic.mux_idx = 1;
16346 spec->auto_mic = 1;
16347}
16348
291702f0
KY
16349static void alc662_eeepc_inithook(struct hda_codec *codec)
16350{
4f5d1706
TI
16351 alc262_hippo_automute(codec);
16352 alc_mic_automute(codec);
291702f0
KY
16353}
16354
4f5d1706 16355static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
8c427226 16356{
42171c17
TI
16357 struct alc_spec *spec = codec->spec;
16358
16359 spec->autocfg.hp_pins[0] = 0x14;
16360 spec->autocfg.speaker_pins[0] = 0x1b;
8c427226
KY
16361}
16362
4f5d1706
TI
16363#define alc662_eeepc_ep20_inithook alc262_hippo_master_update
16364
6dda9f4a
KY
16365static void alc663_m51va_speaker_automute(struct hda_codec *codec)
16366{
16367 unsigned int present;
16368 unsigned char bits;
16369
864f92be 16370 present = snd_hda_jack_detect(codec, 0x21);
6dda9f4a 16371 bits = present ? HDA_AMP_MUTE : 0;
f1d4e28b
KY
16372 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16373 AMP_IN_MUTE(0), bits);
16374 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16375 AMP_IN_MUTE(0), bits);
16376}
16377
16378static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
16379{
16380 unsigned int present;
16381 unsigned char bits;
16382
864f92be 16383 present = snd_hda_jack_detect(codec, 0x21);
f1d4e28b
KY
16384 bits = present ? HDA_AMP_MUTE : 0;
16385 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16386 AMP_IN_MUTE(0), bits);
16387 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16388 AMP_IN_MUTE(0), bits);
16389 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
16390 AMP_IN_MUTE(0), bits);
16391 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
16392 AMP_IN_MUTE(0), bits);
16393}
16394
16395static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
16396{
16397 unsigned int present;
16398 unsigned char bits;
16399
864f92be 16400 present = snd_hda_jack_detect(codec, 0x15);
f1d4e28b
KY
16401 bits = present ? HDA_AMP_MUTE : 0;
16402 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16403 AMP_IN_MUTE(0), bits);
16404 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16405 AMP_IN_MUTE(0), bits);
16406 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
16407 AMP_IN_MUTE(0), bits);
16408 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
16409 AMP_IN_MUTE(0), bits);
16410}
16411
16412static void alc662_f5z_speaker_automute(struct hda_codec *codec)
16413{
16414 unsigned int present;
16415 unsigned char bits;
16416
864f92be 16417 present = snd_hda_jack_detect(codec, 0x1b);
f1d4e28b
KY
16418 bits = present ? 0 : PIN_OUT;
16419 snd_hda_codec_write(codec, 0x14, 0,
16420 AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
16421}
16422
16423static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
16424{
16425 unsigned int present1, present2;
16426
864f92be
WF
16427 present1 = snd_hda_jack_detect(codec, 0x21);
16428 present2 = snd_hda_jack_detect(codec, 0x15);
f1d4e28b
KY
16429
16430 if (present1 || present2) {
16431 snd_hda_codec_write_cache(codec, 0x14, 0,
16432 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
16433 } else {
16434 snd_hda_codec_write_cache(codec, 0x14, 0,
16435 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
16436 }
16437}
16438
16439static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
16440{
16441 unsigned int present1, present2;
16442
864f92be
WF
16443 present1 = snd_hda_jack_detect(codec, 0x1b);
16444 present2 = snd_hda_jack_detect(codec, 0x15);
f1d4e28b
KY
16445
16446 if (present1 || present2) {
16447 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16448 AMP_IN_MUTE(0), AMP_IN_MUTE(0));
16449 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16450 AMP_IN_MUTE(0), AMP_IN_MUTE(0));
16451 } else {
16452 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16453 AMP_IN_MUTE(0), 0);
16454 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16455 AMP_IN_MUTE(0), 0);
16456 }
6dda9f4a
KY
16457}
16458
6dda9f4a
KY
16459static void alc663_m51va_unsol_event(struct hda_codec *codec,
16460 unsigned int res)
16461{
16462 switch (res >> 26) {
16463 case ALC880_HP_EVENT:
16464 alc663_m51va_speaker_automute(codec);
16465 break;
16466 case ALC880_MIC_EVENT:
4f5d1706 16467 alc_mic_automute(codec);
6dda9f4a
KY
16468 break;
16469 }
16470}
16471
4f5d1706
TI
16472static void alc663_m51va_setup(struct hda_codec *codec)
16473{
16474 struct alc_spec *spec = codec->spec;
16475 spec->ext_mic.pin = 0x18;
16476 spec->ext_mic.mux_idx = 0;
16477 spec->int_mic.pin = 0x12;
16478 spec->int_mic.mux_idx = 1;
16479 spec->auto_mic = 1;
16480}
16481
6dda9f4a
KY
16482static void alc663_m51va_inithook(struct hda_codec *codec)
16483{
16484 alc663_m51va_speaker_automute(codec);
4f5d1706 16485 alc_mic_automute(codec);
6dda9f4a
KY
16486}
16487
f1d4e28b 16488/* ***************** Mode1 ******************************/
4f5d1706
TI
16489#define alc663_mode1_unsol_event alc663_m51va_unsol_event
16490#define alc663_mode1_setup alc663_m51va_setup
16491#define alc663_mode1_inithook alc663_m51va_inithook
f1d4e28b 16492
f1d4e28b
KY
16493/* ***************** Mode2 ******************************/
16494static void alc662_mode2_unsol_event(struct hda_codec *codec,
16495 unsigned int res)
16496{
16497 switch (res >> 26) {
16498 case ALC880_HP_EVENT:
16499 alc662_f5z_speaker_automute(codec);
16500 break;
16501 case ALC880_MIC_EVENT:
4f5d1706 16502 alc_mic_automute(codec);
f1d4e28b
KY
16503 break;
16504 }
16505}
16506
4f5d1706
TI
16507#define alc662_mode2_setup alc663_m51va_setup
16508
f1d4e28b
KY
16509static void alc662_mode2_inithook(struct hda_codec *codec)
16510{
16511 alc662_f5z_speaker_automute(codec);
4f5d1706 16512 alc_mic_automute(codec);
f1d4e28b
KY
16513}
16514/* ***************** Mode3 ******************************/
16515static void alc663_mode3_unsol_event(struct hda_codec *codec,
16516 unsigned int res)
16517{
16518 switch (res >> 26) {
16519 case ALC880_HP_EVENT:
16520 alc663_two_hp_m1_speaker_automute(codec);
16521 break;
16522 case ALC880_MIC_EVENT:
4f5d1706 16523 alc_mic_automute(codec);
f1d4e28b
KY
16524 break;
16525 }
16526}
16527
4f5d1706
TI
16528#define alc663_mode3_setup alc663_m51va_setup
16529
f1d4e28b
KY
16530static void alc663_mode3_inithook(struct hda_codec *codec)
16531{
16532 alc663_two_hp_m1_speaker_automute(codec);
4f5d1706 16533 alc_mic_automute(codec);
f1d4e28b
KY
16534}
16535/* ***************** Mode4 ******************************/
16536static void alc663_mode4_unsol_event(struct hda_codec *codec,
16537 unsigned int res)
16538{
16539 switch (res >> 26) {
16540 case ALC880_HP_EVENT:
16541 alc663_21jd_two_speaker_automute(codec);
16542 break;
16543 case ALC880_MIC_EVENT:
4f5d1706 16544 alc_mic_automute(codec);
f1d4e28b
KY
16545 break;
16546 }
16547}
16548
4f5d1706
TI
16549#define alc663_mode4_setup alc663_m51va_setup
16550
f1d4e28b
KY
16551static void alc663_mode4_inithook(struct hda_codec *codec)
16552{
16553 alc663_21jd_two_speaker_automute(codec);
4f5d1706 16554 alc_mic_automute(codec);
f1d4e28b
KY
16555}
16556/* ***************** Mode5 ******************************/
16557static void alc663_mode5_unsol_event(struct hda_codec *codec,
16558 unsigned int res)
16559{
16560 switch (res >> 26) {
16561 case ALC880_HP_EVENT:
16562 alc663_15jd_two_speaker_automute(codec);
16563 break;
16564 case ALC880_MIC_EVENT:
4f5d1706 16565 alc_mic_automute(codec);
f1d4e28b
KY
16566 break;
16567 }
16568}
16569
4f5d1706
TI
16570#define alc663_mode5_setup alc663_m51va_setup
16571
f1d4e28b
KY
16572static void alc663_mode5_inithook(struct hda_codec *codec)
16573{
16574 alc663_15jd_two_speaker_automute(codec);
4f5d1706 16575 alc_mic_automute(codec);
f1d4e28b
KY
16576}
16577/* ***************** Mode6 ******************************/
16578static void alc663_mode6_unsol_event(struct hda_codec *codec,
16579 unsigned int res)
16580{
16581 switch (res >> 26) {
16582 case ALC880_HP_EVENT:
16583 alc663_two_hp_m2_speaker_automute(codec);
16584 break;
16585 case ALC880_MIC_EVENT:
4f5d1706 16586 alc_mic_automute(codec);
f1d4e28b
KY
16587 break;
16588 }
16589}
16590
4f5d1706
TI
16591#define alc663_mode6_setup alc663_m51va_setup
16592
f1d4e28b
KY
16593static void alc663_mode6_inithook(struct hda_codec *codec)
16594{
16595 alc663_two_hp_m2_speaker_automute(codec);
4f5d1706 16596 alc_mic_automute(codec);
f1d4e28b
KY
16597}
16598
6dda9f4a
KY
16599static void alc663_g71v_hp_automute(struct hda_codec *codec)
16600{
16601 unsigned int present;
16602 unsigned char bits;
16603
864f92be 16604 present = snd_hda_jack_detect(codec, 0x21);
6dda9f4a
KY
16605 bits = present ? HDA_AMP_MUTE : 0;
16606 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
16607 HDA_AMP_MUTE, bits);
16608 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
16609 HDA_AMP_MUTE, bits);
16610}
16611
16612static void alc663_g71v_front_automute(struct hda_codec *codec)
16613{
16614 unsigned int present;
16615 unsigned char bits;
16616
864f92be 16617 present = snd_hda_jack_detect(codec, 0x15);
6dda9f4a
KY
16618 bits = present ? HDA_AMP_MUTE : 0;
16619 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
16620 HDA_AMP_MUTE, bits);
16621}
16622
16623static void alc663_g71v_unsol_event(struct hda_codec *codec,
16624 unsigned int res)
16625{
16626 switch (res >> 26) {
16627 case ALC880_HP_EVENT:
16628 alc663_g71v_hp_automute(codec);
16629 break;
16630 case ALC880_FRONT_EVENT:
16631 alc663_g71v_front_automute(codec);
16632 break;
16633 case ALC880_MIC_EVENT:
4f5d1706 16634 alc_mic_automute(codec);
6dda9f4a
KY
16635 break;
16636 }
16637}
16638
4f5d1706
TI
16639#define alc663_g71v_setup alc663_m51va_setup
16640
6dda9f4a
KY
16641static void alc663_g71v_inithook(struct hda_codec *codec)
16642{
16643 alc663_g71v_front_automute(codec);
16644 alc663_g71v_hp_automute(codec);
4f5d1706 16645 alc_mic_automute(codec);
6dda9f4a
KY
16646}
16647
16648static void alc663_g50v_unsol_event(struct hda_codec *codec,
16649 unsigned int res)
16650{
16651 switch (res >> 26) {
16652 case ALC880_HP_EVENT:
16653 alc663_m51va_speaker_automute(codec);
16654 break;
16655 case ALC880_MIC_EVENT:
4f5d1706 16656 alc_mic_automute(codec);
6dda9f4a
KY
16657 break;
16658 }
16659}
16660
4f5d1706
TI
16661#define alc663_g50v_setup alc663_m51va_setup
16662
6dda9f4a
KY
16663static void alc663_g50v_inithook(struct hda_codec *codec)
16664{
16665 alc663_m51va_speaker_automute(codec);
4f5d1706 16666 alc_mic_automute(codec);
6dda9f4a
KY
16667}
16668
f1d4e28b
KY
16669static struct snd_kcontrol_new alc662_ecs_mixer[] = {
16670 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
42171c17 16671 ALC262_HIPPO_MASTER_SWITCH,
f1d4e28b
KY
16672
16673 HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
16674 HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
16675 HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
16676
16677 HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
16678 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16679 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16680 { } /* end */
16681};
16682
9541ba1d
CP
16683static struct snd_kcontrol_new alc272_nc10_mixer[] = {
16684 /* Master Playback automatically created from Speaker and Headphone */
16685 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16686 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16687 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16688 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16689
16690 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16691 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16692 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
16693
16694 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16695 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16696 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
16697 { } /* end */
16698};
16699
cb53c626
TI
16700#ifdef CONFIG_SND_HDA_POWER_SAVE
16701#define alc662_loopbacks alc880_loopbacks
16702#endif
16703
bc9f98a9 16704
def319f9 16705/* pcm configuration: identical with ALC880 */
bc9f98a9
KY
16706#define alc662_pcm_analog_playback alc880_pcm_analog_playback
16707#define alc662_pcm_analog_capture alc880_pcm_analog_capture
16708#define alc662_pcm_digital_playback alc880_pcm_digital_playback
16709#define alc662_pcm_digital_capture alc880_pcm_digital_capture
16710
16711/*
16712 * configuration and preset
16713 */
16714static const char *alc662_models[ALC662_MODEL_LAST] = {
16715 [ALC662_3ST_2ch_DIG] = "3stack-dig",
16716 [ALC662_3ST_6ch_DIG] = "3stack-6ch-dig",
16717 [ALC662_3ST_6ch] = "3stack-6ch",
16718 [ALC662_5ST_DIG] = "6stack-dig",
16719 [ALC662_LENOVO_101E] = "lenovo-101e",
b995d76d 16720 [ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
8c427226 16721 [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
f1d4e28b 16722 [ALC662_ECS] = "ecs",
6dda9f4a
KY
16723 [ALC663_ASUS_M51VA] = "m51va",
16724 [ALC663_ASUS_G71V] = "g71v",
16725 [ALC663_ASUS_H13] = "h13",
16726 [ALC663_ASUS_G50V] = "g50v",
f1d4e28b
KY
16727 [ALC663_ASUS_MODE1] = "asus-mode1",
16728 [ALC662_ASUS_MODE2] = "asus-mode2",
16729 [ALC663_ASUS_MODE3] = "asus-mode3",
16730 [ALC663_ASUS_MODE4] = "asus-mode4",
16731 [ALC663_ASUS_MODE5] = "asus-mode5",
16732 [ALC663_ASUS_MODE6] = "asus-mode6",
01f2bd48
TI
16733 [ALC272_DELL] = "dell",
16734 [ALC272_DELL_ZM1] = "dell-zm1",
9541ba1d 16735 [ALC272_SAMSUNG_NC10] = "samsung-nc10",
bc9f98a9
KY
16736 [ALC662_AUTO] = "auto",
16737};
16738
16739static struct snd_pci_quirk alc662_cfg_tbl[] = {
dea0a509 16740 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
622e84cd
KY
16741 SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
16742 SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
f1d4e28b 16743 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
dea0a509
TI
16744 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
16745 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
f1d4e28b 16746 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
dea0a509 16747 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
f1d4e28b 16748 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
f1d4e28b 16749 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
dea0a509
TI
16750 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
16751 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
16752 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
16753 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
16754 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
622e84cd
KY
16755 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
16756 SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
16757 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
f1d4e28b 16758 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
dea0a509
TI
16759 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
16760 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
16761 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
622e84cd 16762 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
f1d4e28b 16763 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
dea0a509
TI
16764 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
16765 SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
16766 /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
f1d4e28b 16767 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
f1d4e28b 16768 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
622e84cd
KY
16769 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
16770 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
16771 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
dea0a509
TI
16772 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
16773 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
16774 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
622e84cd 16775 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
dea0a509
TI
16776 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
16777 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
622e84cd 16778 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
dea0a509
TI
16779 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
16780 SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
16781 /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
16782 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
16783 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
622e84cd 16784 SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
dea0a509 16785 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
f1d4e28b 16786 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
dea0a509
TI
16787 SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
16788 SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
16789 SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
16790 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
95fe5f2c
HRK
16791 SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
16792 ALC662_3ST_6ch_DIG),
3db6c037 16793 SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB200", ALC663_ASUS_MODE4),
9541ba1d 16794 SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
cb55974c
HRK
16795 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
16796 ALC662_3ST_6ch_DIG),
19c009aa 16797 SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
5bd3729f 16798 SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
dea0a509 16799 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
238713d4 16800 SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
19c009aa 16801 ALC662_3ST_6ch_DIG),
dea0a509
TI
16802 SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
16803 ALC663_ASUS_H13),
bc9f98a9
KY
16804 {}
16805};
16806
16807static struct alc_config_preset alc662_presets[] = {
16808 [ALC662_3ST_2ch_DIG] = {
f9e336f6 16809 .mixers = { alc662_3ST_2ch_mixer },
bc9f98a9
KY
16810 .init_verbs = { alc662_init_verbs },
16811 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16812 .dac_nids = alc662_dac_nids,
16813 .dig_out_nid = ALC662_DIGOUT_NID,
bc9f98a9
KY
16814 .dig_in_nid = ALC662_DIGIN_NID,
16815 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16816 .channel_mode = alc662_3ST_2ch_modes,
16817 .input_mux = &alc662_capture_source,
16818 },
16819 [ALC662_3ST_6ch_DIG] = {
f9e336f6 16820 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
bc9f98a9
KY
16821 .init_verbs = { alc662_init_verbs },
16822 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16823 .dac_nids = alc662_dac_nids,
16824 .dig_out_nid = ALC662_DIGOUT_NID,
bc9f98a9
KY
16825 .dig_in_nid = ALC662_DIGIN_NID,
16826 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
16827 .channel_mode = alc662_3ST_6ch_modes,
16828 .need_dac_fix = 1,
16829 .input_mux = &alc662_capture_source,
f12ab1e0 16830 },
bc9f98a9 16831 [ALC662_3ST_6ch] = {
f9e336f6 16832 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
bc9f98a9
KY
16833 .init_verbs = { alc662_init_verbs },
16834 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16835 .dac_nids = alc662_dac_nids,
bc9f98a9
KY
16836 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
16837 .channel_mode = alc662_3ST_6ch_modes,
16838 .need_dac_fix = 1,
16839 .input_mux = &alc662_capture_source,
f12ab1e0 16840 },
bc9f98a9 16841 [ALC662_5ST_DIG] = {
f9e336f6 16842 .mixers = { alc662_base_mixer, alc662_chmode_mixer },
bc9f98a9
KY
16843 .init_verbs = { alc662_init_verbs },
16844 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16845 .dac_nids = alc662_dac_nids,
16846 .dig_out_nid = ALC662_DIGOUT_NID,
bc9f98a9
KY
16847 .dig_in_nid = ALC662_DIGIN_NID,
16848 .num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
16849 .channel_mode = alc662_5stack_modes,
16850 .input_mux = &alc662_capture_source,
16851 },
16852 [ALC662_LENOVO_101E] = {
f9e336f6 16853 .mixers = { alc662_lenovo_101e_mixer },
bc9f98a9
KY
16854 .init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
16855 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16856 .dac_nids = alc662_dac_nids,
bc9f98a9
KY
16857 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16858 .channel_mode = alc662_3ST_2ch_modes,
16859 .input_mux = &alc662_lenovo_101e_capture_source,
16860 .unsol_event = alc662_lenovo_101e_unsol_event,
16861 .init_hook = alc662_lenovo_101e_all_automute,
16862 },
291702f0 16863 [ALC662_ASUS_EEEPC_P701] = {
f9e336f6 16864 .mixers = { alc662_eeepc_p701_mixer },
291702f0
KY
16865 .init_verbs = { alc662_init_verbs,
16866 alc662_eeepc_sue_init_verbs },
16867 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16868 .dac_nids = alc662_dac_nids,
291702f0
KY
16869 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16870 .channel_mode = alc662_3ST_2ch_modes,
291702f0 16871 .unsol_event = alc662_eeepc_unsol_event,
4f5d1706 16872 .setup = alc662_eeepc_setup,
291702f0
KY
16873 .init_hook = alc662_eeepc_inithook,
16874 },
8c427226 16875 [ALC662_ASUS_EEEPC_EP20] = {
f9e336f6 16876 .mixers = { alc662_eeepc_ep20_mixer,
8c427226
KY
16877 alc662_chmode_mixer },
16878 .init_verbs = { alc662_init_verbs,
16879 alc662_eeepc_ep20_sue_init_verbs },
16880 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16881 .dac_nids = alc662_dac_nids,
8c427226
KY
16882 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
16883 .channel_mode = alc662_3ST_6ch_modes,
16884 .input_mux = &alc662_lenovo_101e_capture_source,
42171c17 16885 .unsol_event = alc662_eeepc_unsol_event,
4f5d1706 16886 .setup = alc662_eeepc_ep20_setup,
8c427226
KY
16887 .init_hook = alc662_eeepc_ep20_inithook,
16888 },
f1d4e28b 16889 [ALC662_ECS] = {
f9e336f6 16890 .mixers = { alc662_ecs_mixer },
f1d4e28b
KY
16891 .init_verbs = { alc662_init_verbs,
16892 alc662_ecs_init_verbs },
16893 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16894 .dac_nids = alc662_dac_nids,
16895 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16896 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 16897 .unsol_event = alc662_eeepc_unsol_event,
4f5d1706 16898 .setup = alc662_eeepc_setup,
f1d4e28b
KY
16899 .init_hook = alc662_eeepc_inithook,
16900 },
6dda9f4a 16901 [ALC663_ASUS_M51VA] = {
f9e336f6 16902 .mixers = { alc663_m51va_mixer },
6dda9f4a
KY
16903 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
16904 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16905 .dac_nids = alc662_dac_nids,
16906 .dig_out_nid = ALC662_DIGOUT_NID,
16907 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16908 .channel_mode = alc662_3ST_2ch_modes,
6dda9f4a 16909 .unsol_event = alc663_m51va_unsol_event,
4f5d1706 16910 .setup = alc663_m51va_setup,
6dda9f4a
KY
16911 .init_hook = alc663_m51va_inithook,
16912 },
16913 [ALC663_ASUS_G71V] = {
f9e336f6 16914 .mixers = { alc663_g71v_mixer },
6dda9f4a
KY
16915 .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
16916 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16917 .dac_nids = alc662_dac_nids,
16918 .dig_out_nid = ALC662_DIGOUT_NID,
16919 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16920 .channel_mode = alc662_3ST_2ch_modes,
6dda9f4a 16921 .unsol_event = alc663_g71v_unsol_event,
4f5d1706 16922 .setup = alc663_g71v_setup,
6dda9f4a
KY
16923 .init_hook = alc663_g71v_inithook,
16924 },
16925 [ALC663_ASUS_H13] = {
f9e336f6 16926 .mixers = { alc663_m51va_mixer },
6dda9f4a
KY
16927 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
16928 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16929 .dac_nids = alc662_dac_nids,
16930 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16931 .channel_mode = alc662_3ST_2ch_modes,
6dda9f4a
KY
16932 .unsol_event = alc663_m51va_unsol_event,
16933 .init_hook = alc663_m51va_inithook,
16934 },
16935 [ALC663_ASUS_G50V] = {
f9e336f6 16936 .mixers = { alc663_g50v_mixer },
6dda9f4a
KY
16937 .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
16938 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16939 .dac_nids = alc662_dac_nids,
16940 .dig_out_nid = ALC662_DIGOUT_NID,
16941 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
16942 .channel_mode = alc662_3ST_6ch_modes,
16943 .input_mux = &alc663_capture_source,
16944 .unsol_event = alc663_g50v_unsol_event,
4f5d1706 16945 .setup = alc663_g50v_setup,
6dda9f4a
KY
16946 .init_hook = alc663_g50v_inithook,
16947 },
f1d4e28b 16948 [ALC663_ASUS_MODE1] = {
f9e336f6
TI
16949 .mixers = { alc663_m51va_mixer },
16950 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
16951 .init_verbs = { alc662_init_verbs,
16952 alc663_21jd_amic_init_verbs },
16953 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16954 .hp_nid = 0x03,
16955 .dac_nids = alc662_dac_nids,
16956 .dig_out_nid = ALC662_DIGOUT_NID,
16957 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16958 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 16959 .unsol_event = alc663_mode1_unsol_event,
4f5d1706 16960 .setup = alc663_mode1_setup,
f1d4e28b
KY
16961 .init_hook = alc663_mode1_inithook,
16962 },
16963 [ALC662_ASUS_MODE2] = {
f9e336f6
TI
16964 .mixers = { alc662_1bjd_mixer },
16965 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
16966 .init_verbs = { alc662_init_verbs,
16967 alc662_1bjd_amic_init_verbs },
16968 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16969 .dac_nids = alc662_dac_nids,
16970 .dig_out_nid = ALC662_DIGOUT_NID,
16971 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16972 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 16973 .unsol_event = alc662_mode2_unsol_event,
4f5d1706 16974 .setup = alc662_mode2_setup,
f1d4e28b
KY
16975 .init_hook = alc662_mode2_inithook,
16976 },
16977 [ALC663_ASUS_MODE3] = {
f9e336f6
TI
16978 .mixers = { alc663_two_hp_m1_mixer },
16979 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
16980 .init_verbs = { alc662_init_verbs,
16981 alc663_two_hp_amic_m1_init_verbs },
16982 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16983 .hp_nid = 0x03,
16984 .dac_nids = alc662_dac_nids,
16985 .dig_out_nid = ALC662_DIGOUT_NID,
16986 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16987 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 16988 .unsol_event = alc663_mode3_unsol_event,
4f5d1706 16989 .setup = alc663_mode3_setup,
f1d4e28b
KY
16990 .init_hook = alc663_mode3_inithook,
16991 },
16992 [ALC663_ASUS_MODE4] = {
f9e336f6
TI
16993 .mixers = { alc663_asus_21jd_clfe_mixer },
16994 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
16995 .init_verbs = { alc662_init_verbs,
16996 alc663_21jd_amic_init_verbs},
16997 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
16998 .hp_nid = 0x03,
16999 .dac_nids = alc662_dac_nids,
17000 .dig_out_nid = ALC662_DIGOUT_NID,
17001 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17002 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 17003 .unsol_event = alc663_mode4_unsol_event,
4f5d1706 17004 .setup = alc663_mode4_setup,
f1d4e28b
KY
17005 .init_hook = alc663_mode4_inithook,
17006 },
17007 [ALC663_ASUS_MODE5] = {
f9e336f6
TI
17008 .mixers = { alc663_asus_15jd_clfe_mixer },
17009 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
17010 .init_verbs = { alc662_init_verbs,
17011 alc663_15jd_amic_init_verbs },
17012 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17013 .hp_nid = 0x03,
17014 .dac_nids = alc662_dac_nids,
17015 .dig_out_nid = ALC662_DIGOUT_NID,
17016 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17017 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 17018 .unsol_event = alc663_mode5_unsol_event,
4f5d1706 17019 .setup = alc663_mode5_setup,
f1d4e28b
KY
17020 .init_hook = alc663_mode5_inithook,
17021 },
17022 [ALC663_ASUS_MODE6] = {
f9e336f6
TI
17023 .mixers = { alc663_two_hp_m2_mixer },
17024 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
17025 .init_verbs = { alc662_init_verbs,
17026 alc663_two_hp_amic_m2_init_verbs },
17027 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17028 .hp_nid = 0x03,
17029 .dac_nids = alc662_dac_nids,
17030 .dig_out_nid = ALC662_DIGOUT_NID,
17031 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17032 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 17033 .unsol_event = alc663_mode6_unsol_event,
4f5d1706 17034 .setup = alc663_mode6_setup,
f1d4e28b
KY
17035 .init_hook = alc663_mode6_inithook,
17036 },
622e84cd
KY
17037 [ALC272_DELL] = {
17038 .mixers = { alc663_m51va_mixer },
17039 .cap_mixer = alc272_auto_capture_mixer,
17040 .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
17041 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
17042 .dac_nids = alc662_dac_nids,
17043 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17044 .adc_nids = alc272_adc_nids,
17045 .num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
17046 .capsrc_nids = alc272_capsrc_nids,
17047 .channel_mode = alc662_3ST_2ch_modes,
622e84cd 17048 .unsol_event = alc663_m51va_unsol_event,
4f5d1706 17049 .setup = alc663_m51va_setup,
622e84cd
KY
17050 .init_hook = alc663_m51va_inithook,
17051 },
17052 [ALC272_DELL_ZM1] = {
17053 .mixers = { alc663_m51va_mixer },
17054 .cap_mixer = alc662_auto_capture_mixer,
17055 .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
17056 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
17057 .dac_nids = alc662_dac_nids,
17058 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17059 .adc_nids = alc662_adc_nids,
b59bdf3b 17060 .num_adc_nids = 1,
622e84cd
KY
17061 .capsrc_nids = alc662_capsrc_nids,
17062 .channel_mode = alc662_3ST_2ch_modes,
622e84cd 17063 .unsol_event = alc663_m51va_unsol_event,
4f5d1706 17064 .setup = alc663_m51va_setup,
622e84cd
KY
17065 .init_hook = alc663_m51va_inithook,
17066 },
9541ba1d
CP
17067 [ALC272_SAMSUNG_NC10] = {
17068 .mixers = { alc272_nc10_mixer },
17069 .init_verbs = { alc662_init_verbs,
17070 alc663_21jd_amic_init_verbs },
17071 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
17072 .dac_nids = alc272_dac_nids,
17073 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17074 .channel_mode = alc662_3ST_2ch_modes,
4f5d1706 17075 /*.input_mux = &alc272_nc10_capture_source,*/
9541ba1d 17076 .unsol_event = alc663_mode4_unsol_event,
4f5d1706 17077 .setup = alc663_mode4_setup,
9541ba1d
CP
17078 .init_hook = alc663_mode4_inithook,
17079 },
bc9f98a9
KY
17080};
17081
17082
17083/*
17084 * BIOS auto configuration
17085 */
17086
7085ec12
TI
17087/* convert from MIX nid to DAC */
17088static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
17089{
17090 if (nid == 0x0f)
17091 return 0x02;
17092 else if (nid >= 0x0c && nid <= 0x0e)
17093 return nid - 0x0c + 0x02;
17094 else
17095 return 0;
17096}
17097
17098/* get MIX nid connected to the given pin targeted to DAC */
17099static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
17100 hda_nid_t dac)
17101{
17102 hda_nid_t mix[4];
17103 int i, num;
17104
17105 num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
17106 for (i = 0; i < num; i++) {
17107 if (alc662_mix_to_dac(mix[i]) == dac)
17108 return mix[i];
17109 }
17110 return 0;
17111}
17112
17113/* look for an empty DAC slot */
17114static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
17115{
17116 struct alc_spec *spec = codec->spec;
17117 hda_nid_t srcs[5];
17118 int i, j, num;
17119
17120 num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
17121 if (num < 0)
17122 return 0;
17123 for (i = 0; i < num; i++) {
17124 hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
17125 if (!nid)
17126 continue;
17127 for (j = 0; j < spec->multiout.num_dacs; j++)
17128 if (spec->multiout.dac_nids[j] == nid)
17129 break;
17130 if (j >= spec->multiout.num_dacs)
17131 return nid;
17132 }
17133 return 0;
17134}
17135
17136/* fill in the dac_nids table from the parsed pin configuration */
17137static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
17138 const struct auto_pin_cfg *cfg)
17139{
17140 struct alc_spec *spec = codec->spec;
17141 int i;
17142 hda_nid_t dac;
17143
17144 spec->multiout.dac_nids = spec->private_dac_nids;
17145 for (i = 0; i < cfg->line_outs; i++) {
17146 dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
17147 if (!dac)
17148 continue;
17149 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
17150 }
17151 return 0;
17152}
17153
0afe5f89 17154static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
7085ec12
TI
17155 hda_nid_t nid, unsigned int chs)
17156{
0afe5f89 17157 return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
7085ec12
TI
17158 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
17159}
17160
0afe5f89 17161static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
7085ec12
TI
17162 hda_nid_t nid, unsigned int chs)
17163{
0afe5f89 17164 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
7085ec12
TI
17165 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
17166}
17167
17168#define alc662_add_stereo_vol(spec, pfx, nid) \
17169 alc662_add_vol_ctl(spec, pfx, nid, 3)
17170#define alc662_add_stereo_sw(spec, pfx, nid) \
17171 alc662_add_sw_ctl(spec, pfx, nid, 3)
17172
bc9f98a9 17173/* add playback controls from the parsed DAC table */
7085ec12 17174static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
bc9f98a9
KY
17175 const struct auto_pin_cfg *cfg)
17176{
7085ec12 17177 struct alc_spec *spec = codec->spec;
bc9f98a9
KY
17178 static const char *chname[4] = {
17179 "Front", "Surround", NULL /*CLFE*/, "Side"
17180 };
7085ec12 17181 hda_nid_t nid, mix;
bc9f98a9
KY
17182 int i, err;
17183
17184 for (i = 0; i < cfg->line_outs; i++) {
7085ec12
TI
17185 nid = spec->multiout.dac_nids[i];
17186 if (!nid)
17187 continue;
17188 mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
17189 if (!mix)
bc9f98a9 17190 continue;
bc9f98a9
KY
17191 if (i == 2) {
17192 /* Center/LFE */
7085ec12 17193 err = alc662_add_vol_ctl(spec, "Center", nid, 1);
bc9f98a9
KY
17194 if (err < 0)
17195 return err;
7085ec12 17196 err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
bc9f98a9
KY
17197 if (err < 0)
17198 return err;
7085ec12 17199 err = alc662_add_sw_ctl(spec, "Center", mix, 1);
bc9f98a9
KY
17200 if (err < 0)
17201 return err;
7085ec12 17202 err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
bc9f98a9
KY
17203 if (err < 0)
17204 return err;
17205 } else {
0d884cb9
TI
17206 const char *pfx;
17207 if (cfg->line_outs == 1 &&
17208 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
7085ec12 17209 if (cfg->hp_outs)
0d884cb9
TI
17210 pfx = "Speaker";
17211 else
17212 pfx = "PCM";
17213 } else
17214 pfx = chname[i];
7085ec12 17215 err = alc662_add_vol_ctl(spec, pfx, nid, 3);
bc9f98a9
KY
17216 if (err < 0)
17217 return err;
0d884cb9
TI
17218 if (cfg->line_outs == 1 &&
17219 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
17220 pfx = "Speaker";
7085ec12 17221 err = alc662_add_sw_ctl(spec, pfx, mix, 3);
bc9f98a9
KY
17222 if (err < 0)
17223 return err;
17224 }
17225 }
17226 return 0;
17227}
17228
17229/* add playback controls for speaker and HP outputs */
7085ec12
TI
17230/* return DAC nid if any new DAC is assigned */
17231static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
bc9f98a9
KY
17232 const char *pfx)
17233{
7085ec12
TI
17234 struct alc_spec *spec = codec->spec;
17235 hda_nid_t nid, mix;
bc9f98a9 17236 int err;
bc9f98a9
KY
17237
17238 if (!pin)
17239 return 0;
7085ec12
TI
17240 nid = alc662_look_for_dac(codec, pin);
17241 if (!nid) {
7085ec12
TI
17242 /* the corresponding DAC is already occupied */
17243 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
17244 return 0; /* no way */
17245 /* create a switch only */
0afe5f89 17246 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
7085ec12 17247 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
24fb9173
TI
17248 }
17249
7085ec12
TI
17250 mix = alc662_dac_to_mix(codec, pin, nid);
17251 if (!mix)
17252 return 0;
17253 err = alc662_add_vol_ctl(spec, pfx, nid, 3);
17254 if (err < 0)
17255 return err;
17256 err = alc662_add_sw_ctl(spec, pfx, mix, 3);
17257 if (err < 0)
17258 return err;
17259 return nid;
bc9f98a9
KY
17260}
17261
17262/* create playback/capture controls for input pins */
05f5f477 17263#define alc662_auto_create_input_ctls \
4b7348a1 17264 alc882_auto_create_input_ctls
bc9f98a9
KY
17265
17266static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
17267 hda_nid_t nid, int pin_type,
7085ec12 17268 hda_nid_t dac)
bc9f98a9 17269{
7085ec12
TI
17270 int i, num;
17271 hda_nid_t srcs[4];
17272
f6c7e546 17273 alc_set_pin_output(codec, nid, pin_type);
bc9f98a9 17274 /* need the manual connection? */
7085ec12
TI
17275 num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
17276 if (num <= 1)
17277 return;
17278 for (i = 0; i < num; i++) {
17279 if (alc662_mix_to_dac(srcs[i]) != dac)
17280 continue;
17281 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
17282 return;
bc9f98a9
KY
17283 }
17284}
17285
17286static void alc662_auto_init_multi_out(struct hda_codec *codec)
17287{
17288 struct alc_spec *spec = codec->spec;
7085ec12 17289 int pin_type = get_pin_type(spec->autocfg.line_out_type);
bc9f98a9
KY
17290 int i;
17291
17292 for (i = 0; i <= HDA_SIDE; i++) {
17293 hda_nid_t nid = spec->autocfg.line_out_pins[i];
17294 if (nid)
baba8ee9 17295 alc662_auto_set_output_and_unmute(codec, nid, pin_type,
7085ec12 17296 spec->multiout.dac_nids[i]);
bc9f98a9
KY
17297 }
17298}
17299
17300static void alc662_auto_init_hp_out(struct hda_codec *codec)
17301{
17302 struct alc_spec *spec = codec->spec;
17303 hda_nid_t pin;
17304
17305 pin = spec->autocfg.hp_pins[0];
7085ec12
TI
17306 if (pin)
17307 alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
17308 spec->multiout.hp_nid);
f6c7e546
TI
17309 pin = spec->autocfg.speaker_pins[0];
17310 if (pin)
7085ec12
TI
17311 alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
17312 spec->multiout.extra_out_nid[0]);
bc9f98a9
KY
17313}
17314
bc9f98a9
KY
17315#define ALC662_PIN_CD_NID ALC880_PIN_CD_NID
17316
17317static void alc662_auto_init_analog_input(struct hda_codec *codec)
17318{
17319 struct alc_spec *spec = codec->spec;
17320 int i;
17321
17322 for (i = 0; i < AUTO_PIN_LAST; i++) {
17323 hda_nid_t nid = spec->autocfg.input_pins[i];
05f5f477 17324 if (alc_is_input_pin(codec, nid)) {
23f0c048 17325 alc_set_input_pin(codec, nid, i);
52ca15b7 17326 if (nid != ALC662_PIN_CD_NID &&
e82c025b 17327 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
bc9f98a9
KY
17328 snd_hda_codec_write(codec, nid, 0,
17329 AC_VERB_SET_AMP_GAIN_MUTE,
17330 AMP_OUT_MUTE);
17331 }
17332 }
17333}
17334
f511b01c
TI
17335#define alc662_auto_init_input_src alc882_auto_init_input_src
17336
bc9f98a9
KY
17337static int alc662_parse_auto_config(struct hda_codec *codec)
17338{
17339 struct alc_spec *spec = codec->spec;
17340 int err;
17341 static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
17342
17343 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
17344 alc662_ignore);
17345 if (err < 0)
17346 return err;
17347 if (!spec->autocfg.line_outs)
17348 return 0; /* can't find valid BIOS pin config */
17349
7085ec12 17350 err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
f12ab1e0
TI
17351 if (err < 0)
17352 return err;
7085ec12 17353 err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
f12ab1e0
TI
17354 if (err < 0)
17355 return err;
7085ec12 17356 err = alc662_auto_create_extra_out(codec,
f12ab1e0
TI
17357 spec->autocfg.speaker_pins[0],
17358 "Speaker");
17359 if (err < 0)
17360 return err;
7085ec12
TI
17361 if (err)
17362 spec->multiout.extra_out_nid[0] = err;
17363 err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
f12ab1e0
TI
17364 "Headphone");
17365 if (err < 0)
17366 return err;
7085ec12
TI
17367 if (err)
17368 spec->multiout.hp_nid = err;
05f5f477 17369 err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 17370 if (err < 0)
bc9f98a9
KY
17371 return err;
17372
17373 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
17374
0852d7a6 17375 if (spec->autocfg.dig_outs)
bc9f98a9
KY
17376 spec->multiout.dig_out_nid = ALC880_DIGOUT_NID;
17377
603c4019 17378 if (spec->kctls.list)
d88897ea 17379 add_mixer(spec, spec->kctls.list);
bc9f98a9
KY
17380
17381 spec->num_mux_defs = 1;
61b9b9b1 17382 spec->input_mux = &spec->private_imux[0];
ea1fb29a 17383
d88897ea 17384 add_verb(spec, alc662_auto_init_verbs);
24fb9173 17385 if (codec->vendor_id == 0x10ec0663)
d88897ea 17386 add_verb(spec, alc663_auto_init_verbs);
ee979a14
TI
17387
17388 err = alc_auto_add_mic_boost(codec);
17389 if (err < 0)
17390 return err;
17391
4a79ba34
TI
17392 alc_ssid_check(codec, 0x15, 0x1b, 0x14);
17393
8c87286f 17394 return 1;
bc9f98a9
KY
17395}
17396
17397/* additional initialization for auto-configuration model */
17398static void alc662_auto_init(struct hda_codec *codec)
17399{
f6c7e546 17400 struct alc_spec *spec = codec->spec;
bc9f98a9
KY
17401 alc662_auto_init_multi_out(codec);
17402 alc662_auto_init_hp_out(codec);
17403 alc662_auto_init_analog_input(codec);
f511b01c 17404 alc662_auto_init_input_src(codec);
f6c7e546 17405 if (spec->unsol_event)
7fb0d78f 17406 alc_inithook(codec);
bc9f98a9
KY
17407}
17408
17409static int patch_alc662(struct hda_codec *codec)
17410{
17411 struct alc_spec *spec;
17412 int err, board_config;
17413
17414 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
17415 if (!spec)
17416 return -ENOMEM;
17417
17418 codec->spec = spec;
17419
2c3bf9ab
TI
17420 alc_fix_pll_init(codec, 0x20, 0x04, 15);
17421
bc9f98a9
KY
17422 board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
17423 alc662_models,
17424 alc662_cfg_tbl);
17425 if (board_config < 0) {
9a11f1aa
TI
17426 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
17427 codec->chip_name);
bc9f98a9
KY
17428 board_config = ALC662_AUTO;
17429 }
17430
17431 if (board_config == ALC662_AUTO) {
17432 /* automatic parse from the BIOS config */
17433 err = alc662_parse_auto_config(codec);
17434 if (err < 0) {
17435 alc_free(codec);
17436 return err;
8c87286f 17437 } else if (!err) {
bc9f98a9
KY
17438 printk(KERN_INFO
17439 "hda_codec: Cannot set up configuration "
17440 "from BIOS. Using base mode...\n");
17441 board_config = ALC662_3ST_2ch_DIG;
17442 }
17443 }
17444
680cd536
KK
17445 err = snd_hda_attach_beep_device(codec, 0x1);
17446 if (err < 0) {
17447 alc_free(codec);
17448 return err;
17449 }
17450
bc9f98a9 17451 if (board_config != ALC662_AUTO)
e9c364c0 17452 setup_preset(codec, &alc662_presets[board_config]);
bc9f98a9 17453
bc9f98a9
KY
17454 spec->stream_analog_playback = &alc662_pcm_analog_playback;
17455 spec->stream_analog_capture = &alc662_pcm_analog_capture;
17456
bc9f98a9
KY
17457 spec->stream_digital_playback = &alc662_pcm_digital_playback;
17458 spec->stream_digital_capture = &alc662_pcm_digital_capture;
17459
dd704698
TI
17460 if (!spec->adc_nids) {
17461 spec->adc_nids = alc662_adc_nids;
17462 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
17463 }
17464 if (!spec->capsrc_nids)
17465 spec->capsrc_nids = alc662_capsrc_nids;
bc9f98a9 17466
f9e336f6 17467 if (!spec->cap_mixer)
b59bdf3b 17468 set_capture_mixer(codec);
b9591448
TI
17469 if (codec->vendor_id == 0x10ec0662)
17470 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
17471 else
17472 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
f9e336f6 17473
2134ea4f
TI
17474 spec->vmaster_nid = 0x02;
17475
bc9f98a9
KY
17476 codec->patch_ops = alc_patch_ops;
17477 if (board_config == ALC662_AUTO)
17478 spec->init_hook = alc662_auto_init;
cb53c626
TI
17479#ifdef CONFIG_SND_HDA_POWER_SAVE
17480 if (!spec->loopback.amplist)
17481 spec->loopback.amplist = alc662_loopbacks;
17482#endif
daead538 17483 codec->proc_widget_hook = print_realtek_coef;
bc9f98a9
KY
17484
17485 return 0;
17486}
17487
1da177e4
LT
17488/*
17489 * patch entries
17490 */
1289e9e8 17491static struct hda_codec_preset snd_hda_preset_realtek[] = {
1da177e4 17492 { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
df694daa 17493 { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
f6a92248 17494 { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
a361d84b 17495 { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
f6a92248 17496 { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
01afd41f 17497 { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
f32610ed 17498 { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
bc9f98a9 17499 .patch = patch_alc861 },
f32610ed
JS
17500 { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
17501 { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
17502 { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
bc9f98a9 17503 { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
4953550a 17504 .patch = patch_alc882 },
bc9f98a9
KY
17505 { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
17506 .patch = patch_alc662 },
6dda9f4a 17507 { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
f32610ed 17508 { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
1da177e4 17509 { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
4953550a 17510 { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
669faba2 17511 { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
4953550a 17512 .patch = patch_alc882 },
cb308f97 17513 { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
4953550a 17514 .patch = patch_alc882 },
df694daa 17515 { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
4953550a 17516 { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
4442608d 17517 { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
4953550a
TI
17518 .patch = patch_alc882 },
17519 { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc882 },
17520 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
1da177e4
LT
17521 {} /* terminator */
17522};
1289e9e8
TI
17523
17524MODULE_ALIAS("snd-hda-codec-id:10ec*");
17525
17526MODULE_LICENSE("GPL");
17527MODULE_DESCRIPTION("Realtek HD-audio codec");
17528
17529static struct hda_codec_preset_list realtek_list = {
17530 .preset = snd_hda_preset_realtek,
17531 .owner = THIS_MODULE,
17532};
17533
17534static int __init patch_realtek_init(void)
17535{
17536 return snd_hda_add_codec_preset(&realtek_list);
17537}
17538
17539static void __exit patch_realtek_exit(void)
17540{
17541 snd_hda_delete_codec_preset(&realtek_list);
17542}
17543
17544module_init(patch_realtek_init)
17545module_exit(patch_realtek_exit)