]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - sound/pci/hda/patch_realtek.c
ALSA: hda - Add MSI blacklist for Aopen MZ915-M
[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,
84898e87
KY
134 ALC269_AMIC,
135 ALC269_DMIC,
136 ALC269VB_AMIC,
137 ALC269VB_DMIC,
26f5df26 138 ALC269_FUJITSU,
64154835 139 ALC269_LIFEBOOK,
f6a92248
KY
140 ALC269_AUTO,
141 ALC269_MODEL_LAST /* last tag */
142};
143
df694daa
KY
144/* ALC861 models */
145enum {
146 ALC861_3ST,
9c7f852e 147 ALC660_3ST,
df694daa
KY
148 ALC861_3ST_DIG,
149 ALC861_6ST_DIG,
22309c3e 150 ALC861_UNIWILL_M31,
a53d1aec 151 ALC861_TOSHIBA,
7cdbff94 152 ALC861_ASUS,
56bb0cab 153 ALC861_ASUS_LAPTOP,
df694daa
KY
154 ALC861_AUTO,
155 ALC861_MODEL_LAST,
156};
157
f32610ed
JS
158/* ALC861-VD models */
159enum {
160 ALC660VD_3ST,
6963f84c 161 ALC660VD_3ST_DIG,
13c94744 162 ALC660VD_ASUS_V1S,
f32610ed
JS
163 ALC861VD_3ST,
164 ALC861VD_3ST_DIG,
165 ALC861VD_6ST_DIG,
bdd148a3 166 ALC861VD_LENOVO,
272a527c 167 ALC861VD_DALLAS,
d1a991a6 168 ALC861VD_HP,
f32610ed
JS
169 ALC861VD_AUTO,
170 ALC861VD_MODEL_LAST,
171};
172
bc9f98a9
KY
173/* ALC662 models */
174enum {
175 ALC662_3ST_2ch_DIG,
176 ALC662_3ST_6ch_DIG,
177 ALC662_3ST_6ch,
178 ALC662_5ST_DIG,
179 ALC662_LENOVO_101E,
291702f0 180 ALC662_ASUS_EEEPC_P701,
8c427226 181 ALC662_ASUS_EEEPC_EP20,
6dda9f4a
KY
182 ALC663_ASUS_M51VA,
183 ALC663_ASUS_G71V,
184 ALC663_ASUS_H13,
185 ALC663_ASUS_G50V,
f1d4e28b
KY
186 ALC662_ECS,
187 ALC663_ASUS_MODE1,
188 ALC662_ASUS_MODE2,
189 ALC663_ASUS_MODE3,
190 ALC663_ASUS_MODE4,
191 ALC663_ASUS_MODE5,
192 ALC663_ASUS_MODE6,
ebb83eeb
KY
193 ALC663_ASUS_MODE7,
194 ALC663_ASUS_MODE8,
622e84cd
KY
195 ALC272_DELL,
196 ALC272_DELL_ZM1,
9541ba1d 197 ALC272_SAMSUNG_NC10,
bc9f98a9
KY
198 ALC662_AUTO,
199 ALC662_MODEL_LAST,
200};
201
df694daa
KY
202/* ALC882 models */
203enum {
204 ALC882_3ST_DIG,
205 ALC882_6ST_DIG,
4b146cb0 206 ALC882_ARIMA,
bdd148a3 207 ALC882_W2JC,
272a527c
KY
208 ALC882_TARGA,
209 ALC882_ASUS_A7J,
914759b7 210 ALC882_ASUS_A7M,
9102cd1c 211 ALC885_MACPRO,
76e6f5a9 212 ALC885_MBA21,
87350ad0 213 ALC885_MBP3,
41d5545d 214 ALC885_MB5,
e458b1fa 215 ALC885_MACMINI3,
c54728d8 216 ALC885_IMAC24,
4b7e1803 217 ALC885_IMAC91,
9c7f852e
TI
218 ALC883_3ST_2ch_DIG,
219 ALC883_3ST_6ch_DIG,
220 ALC883_3ST_6ch,
221 ALC883_6ST_DIG,
ccc656ce
KY
222 ALC883_TARGA_DIG,
223 ALC883_TARGA_2ch_DIG,
64a8be74 224 ALC883_TARGA_8ch_DIG,
bab282b9 225 ALC883_ACER,
2880a867 226 ALC883_ACER_ASPIRE,
5b2d1eca 227 ALC888_ACER_ASPIRE_4930G,
d2fd4b09 228 ALC888_ACER_ASPIRE_6530G,
3b315d70 229 ALC888_ACER_ASPIRE_8930G,
fc86f954 230 ALC888_ACER_ASPIRE_7730G,
c07584c8 231 ALC883_MEDION,
ea1fb29a 232 ALC883_MEDION_MD2,
b373bdeb 233 ALC883_LAPTOP_EAPD,
bc9f98a9 234 ALC883_LENOVO_101E_2ch,
272a527c 235 ALC883_LENOVO_NB0763,
189609ae 236 ALC888_LENOVO_MS7195_DIG,
e2757d5e 237 ALC888_LENOVO_SKY,
ea1fb29a 238 ALC883_HAIER_W66,
4723c022 239 ALC888_3ST_HP,
5795b9e6 240 ALC888_6ST_DELL,
a8848bd6 241 ALC883_MITAC,
a65cc60f 242 ALC883_CLEVO_M540R,
0c4cc443 243 ALC883_CLEVO_M720,
fb97dc67 244 ALC883_FUJITSU_PI2515,
ef8ef5fb 245 ALC888_FUJITSU_XA3530,
17bba1b7 246 ALC883_3ST_6ch_INTEL,
87a8c370
JK
247 ALC889A_INTEL,
248 ALC889_INTEL,
e2757d5e
KY
249 ALC888_ASUS_M90V,
250 ALC888_ASUS_EEE1601,
eb4c41d3 251 ALC889A_MB31,
3ab90935 252 ALC1200_ASUS_P5Q,
3e1647c5 253 ALC883_SONY_VAIO_TT,
4953550a
TI
254 ALC882_AUTO,
255 ALC882_MODEL_LAST,
9c7f852e
TI
256};
257
df694daa
KY
258/* for GPIO Poll */
259#define GPIO_MASK 0x03
260
4a79ba34
TI
261/* extra amp-initialization sequence types */
262enum {
263 ALC_INIT_NONE,
264 ALC_INIT_DEFAULT,
265 ALC_INIT_GPIO1,
266 ALC_INIT_GPIO2,
267 ALC_INIT_GPIO3,
268};
269
6c819492
TI
270struct alc_mic_route {
271 hda_nid_t pin;
272 unsigned char mux_idx;
273 unsigned char amix_idx;
274};
275
276#define MUX_IDX_UNDEF ((unsigned char)-1)
277
1da177e4
LT
278struct alc_spec {
279 /* codec parameterization */
df694daa 280 struct snd_kcontrol_new *mixers[5]; /* mixer arrays */
1da177e4 281 unsigned int num_mixers;
f9e336f6 282 struct snd_kcontrol_new *cap_mixer; /* capture mixer */
45bdd1c1 283 unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */
1da177e4 284
2d9c6482 285 const struct hda_verb *init_verbs[10]; /* initialization verbs
9c7f852e
TI
286 * don't forget NULL
287 * termination!
e9edcee0
TI
288 */
289 unsigned int num_init_verbs;
1da177e4 290
aa563af7 291 char stream_name_analog[32]; /* analog PCM stream */
1da177e4
LT
292 struct hda_pcm_stream *stream_analog_playback;
293 struct hda_pcm_stream *stream_analog_capture;
6330079f
TI
294 struct hda_pcm_stream *stream_analog_alt_playback;
295 struct hda_pcm_stream *stream_analog_alt_capture;
1da177e4 296
aa563af7 297 char stream_name_digital[32]; /* digital PCM stream */
1da177e4
LT
298 struct hda_pcm_stream *stream_digital_playback;
299 struct hda_pcm_stream *stream_digital_capture;
300
301 /* playback */
16ded525
TI
302 struct hda_multi_out multiout; /* playback set-up
303 * max_channels, dacs must be set
304 * dig_out_nid and hp_nid are optional
305 */
6330079f 306 hda_nid_t alt_dac_nid;
6a05ac4a 307 hda_nid_t slave_dig_outs[3]; /* optional - for auto-parsing */
8c441982 308 int dig_out_type;
1da177e4
LT
309
310 /* capture */
311 unsigned int num_adc_nids;
312 hda_nid_t *adc_nids;
e1406348 313 hda_nid_t *capsrc_nids;
16ded525 314 hda_nid_t dig_in_nid; /* digital-in NID; optional */
1da177e4
LT
315
316 /* capture source */
a1e8d2da 317 unsigned int num_mux_defs;
1da177e4
LT
318 const struct hda_input_mux *input_mux;
319 unsigned int cur_mux[3];
6c819492
TI
320 struct alc_mic_route ext_mic;
321 struct alc_mic_route int_mic;
1da177e4
LT
322
323 /* channel model */
d2a6d7dc 324 const struct hda_channel_mode *channel_mode;
1da177e4 325 int num_channel_mode;
4e195a7b 326 int need_dac_fix;
3b315d70
HM
327 int const_channel_count;
328 int ext_channel_count;
1da177e4
LT
329
330 /* PCM information */
4c5186ed 331 struct hda_pcm pcm_rec[3]; /* used in alc_build_pcms() */
41e41f1f 332
e9edcee0
TI
333 /* dynamic controls, init_verbs and input_mux */
334 struct auto_pin_cfg autocfg;
603c4019 335 struct snd_array kctls;
61b9b9b1 336 struct hda_input_mux private_imux[3];
41923e44 337 hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
4953550a
TI
338 hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
339 hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
834be88d 340
ae6b813a
TI
341 /* hooks */
342 void (*init_hook)(struct hda_codec *codec);
343 void (*unsol_event)(struct hda_codec *codec, unsigned int res);
f5de24b0 344#ifdef CONFIG_SND_HDA_POWER_SAVE
c97259df 345 void (*power_hook)(struct hda_codec *codec);
f5de24b0 346#endif
ae6b813a 347
834be88d
TI
348 /* for pin sensing */
349 unsigned int sense_updated: 1;
350 unsigned int jack_present: 1;
bec15c3a 351 unsigned int master_sw: 1;
6c819492 352 unsigned int auto_mic:1;
cb53c626 353
e64f14f4
TI
354 /* other flags */
355 unsigned int no_analog :1; /* digital I/O only */
4a79ba34 356 int init_amp;
e64f14f4 357
2134ea4f
TI
358 /* for virtual master */
359 hda_nid_t vmaster_nid;
cb53c626
TI
360#ifdef CONFIG_SND_HDA_POWER_SAVE
361 struct hda_loopback_check loopback;
362#endif
2c3bf9ab
TI
363
364 /* for PLL fix */
365 hda_nid_t pll_nid;
366 unsigned int pll_coef_idx, pll_coef_bit;
df694daa
KY
367};
368
369/*
370 * configuration template - to be copied to the spec instance
371 */
372struct alc_config_preset {
9c7f852e
TI
373 struct snd_kcontrol_new *mixers[5]; /* should be identical size
374 * with spec
375 */
f9e336f6 376 struct snd_kcontrol_new *cap_mixer; /* capture mixer */
df694daa
KY
377 const struct hda_verb *init_verbs[5];
378 unsigned int num_dacs;
379 hda_nid_t *dac_nids;
380 hda_nid_t dig_out_nid; /* optional */
381 hda_nid_t hp_nid; /* optional */
b25c9da1 382 hda_nid_t *slave_dig_outs;
df694daa
KY
383 unsigned int num_adc_nids;
384 hda_nid_t *adc_nids;
e1406348 385 hda_nid_t *capsrc_nids;
df694daa
KY
386 hda_nid_t dig_in_nid;
387 unsigned int num_channel_mode;
388 const struct hda_channel_mode *channel_mode;
4e195a7b 389 int need_dac_fix;
3b315d70 390 int const_channel_count;
a1e8d2da 391 unsigned int num_mux_defs;
df694daa 392 const struct hda_input_mux *input_mux;
ae6b813a 393 void (*unsol_event)(struct hda_codec *, unsigned int);
e9c364c0 394 void (*setup)(struct hda_codec *);
ae6b813a 395 void (*init_hook)(struct hda_codec *);
cb53c626
TI
396#ifdef CONFIG_SND_HDA_POWER_SAVE
397 struct hda_amp_list *loopbacks;
c97259df 398 void (*power_hook)(struct hda_codec *codec);
cb53c626 399#endif
1da177e4
LT
400};
401
1da177e4
LT
402
403/*
404 * input MUX handling
405 */
9c7f852e
TI
406static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
407 struct snd_ctl_elem_info *uinfo)
1da177e4
LT
408{
409 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
410 struct alc_spec *spec = codec->spec;
a1e8d2da
JW
411 unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
412 if (mux_idx >= spec->num_mux_defs)
413 mux_idx = 0;
5311114d
TI
414 if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
415 mux_idx = 0;
a1e8d2da 416 return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
1da177e4
LT
417}
418
9c7f852e
TI
419static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
420 struct snd_ctl_elem_value *ucontrol)
1da177e4
LT
421{
422 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
423 struct alc_spec *spec = codec->spec;
424 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
425
426 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
427 return 0;
428}
429
9c7f852e
TI
430static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
431 struct snd_ctl_elem_value *ucontrol)
1da177e4
LT
432{
433 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
434 struct alc_spec *spec = codec->spec;
cd896c33 435 const struct hda_input_mux *imux;
1da177e4 436 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
cd896c33 437 unsigned int mux_idx;
e1406348
TI
438 hda_nid_t nid = spec->capsrc_nids ?
439 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
0169b6b3 440 unsigned int type;
1da177e4 441
cd896c33
TI
442 mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
443 imux = &spec->input_mux[mux_idx];
5311114d
TI
444 if (!imux->num_items && mux_idx > 0)
445 imux = &spec->input_mux[0];
cd896c33 446
a22d543a 447 type = get_wcaps_type(get_wcaps(codec, nid));
0169b6b3 448 if (type == AC_WID_AUD_MIX) {
54cbc9ab
TI
449 /* Matrix-mixer style (e.g. ALC882) */
450 unsigned int *cur_val = &spec->cur_mux[adc_idx];
451 unsigned int i, idx;
452
453 idx = ucontrol->value.enumerated.item[0];
454 if (idx >= imux->num_items)
455 idx = imux->num_items - 1;
456 if (*cur_val == idx)
457 return 0;
458 for (i = 0; i < imux->num_items; i++) {
459 unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
460 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
461 imux->items[i].index,
462 HDA_AMP_MUTE, v);
463 }
464 *cur_val = idx;
465 return 1;
466 } else {
467 /* MUX style (e.g. ALC880) */
cd896c33 468 return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
54cbc9ab
TI
469 &spec->cur_mux[adc_idx]);
470 }
471}
e9edcee0 472
1da177e4
LT
473/*
474 * channel mode setting
475 */
9c7f852e
TI
476static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
477 struct snd_ctl_elem_info *uinfo)
1da177e4
LT
478{
479 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
480 struct alc_spec *spec = codec->spec;
d2a6d7dc
TI
481 return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
482 spec->num_channel_mode);
1da177e4
LT
483}
484
9c7f852e
TI
485static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
486 struct snd_ctl_elem_value *ucontrol)
1da177e4
LT
487{
488 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
489 struct alc_spec *spec = codec->spec;
d2a6d7dc 490 return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
9c7f852e 491 spec->num_channel_mode,
3b315d70 492 spec->ext_channel_count);
1da177e4
LT
493}
494
9c7f852e
TI
495static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
496 struct snd_ctl_elem_value *ucontrol)
1da177e4
LT
497{
498 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
499 struct alc_spec *spec = codec->spec;
4e195a7b
TI
500 int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
501 spec->num_channel_mode,
3b315d70
HM
502 &spec->ext_channel_count);
503 if (err >= 0 && !spec->const_channel_count) {
504 spec->multiout.max_channels = spec->ext_channel_count;
505 if (spec->need_dac_fix)
506 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
507 }
4e195a7b 508 return err;
1da177e4
LT
509}
510
a9430dd8 511/*
4c5186ed 512 * Control the mode of pin widget settings via the mixer. "pc" is used
ea1fb29a 513 * instead of "%" to avoid consequences of accidently treating the % as
4c5186ed
JW
514 * being part of a format specifier. Maximum allowed length of a value is
515 * 63 characters plus NULL terminator.
7cf51e48
JW
516 *
517 * Note: some retasking pin complexes seem to ignore requests for input
518 * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
519 * are requested. Therefore order this list so that this behaviour will not
520 * cause problems when mixer clients move through the enum sequentially.
a1e8d2da
JW
521 * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
522 * March 2006.
4c5186ed
JW
523 */
524static char *alc_pin_mode_names[] = {
7cf51e48
JW
525 "Mic 50pc bias", "Mic 80pc bias",
526 "Line in", "Line out", "Headphone out",
4c5186ed
JW
527};
528static unsigned char alc_pin_mode_values[] = {
7cf51e48 529 PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
4c5186ed
JW
530};
531/* The control can present all 5 options, or it can limit the options based
a1e8d2da
JW
532 * in the pin being assumed to be exclusively an input or an output pin. In
533 * addition, "input" pins may or may not process the mic bias option
534 * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
535 * accept requests for bias as of chip versions up to March 2006) and/or
536 * wiring in the computer.
a9430dd8 537 */
a1e8d2da
JW
538#define ALC_PIN_DIR_IN 0x00
539#define ALC_PIN_DIR_OUT 0x01
540#define ALC_PIN_DIR_INOUT 0x02
541#define ALC_PIN_DIR_IN_NOMICBIAS 0x03
542#define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
4c5186ed 543
ea1fb29a 544/* Info about the pin modes supported by the different pin direction modes.
4c5186ed
JW
545 * For each direction the minimum and maximum values are given.
546 */
a1e8d2da 547static signed char alc_pin_mode_dir_info[5][2] = {
4c5186ed
JW
548 { 0, 2 }, /* ALC_PIN_DIR_IN */
549 { 3, 4 }, /* ALC_PIN_DIR_OUT */
550 { 0, 4 }, /* ALC_PIN_DIR_INOUT */
a1e8d2da
JW
551 { 2, 2 }, /* ALC_PIN_DIR_IN_NOMICBIAS */
552 { 2, 4 }, /* ALC_PIN_DIR_INOUT_NOMICBIAS */
4c5186ed
JW
553};
554#define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
555#define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
556#define alc_pin_mode_n_items(_dir) \
557 (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
558
9c7f852e
TI
559static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
560 struct snd_ctl_elem_info *uinfo)
a9430dd8 561{
4c5186ed
JW
562 unsigned int item_num = uinfo->value.enumerated.item;
563 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
564
565 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
a9430dd8 566 uinfo->count = 1;
4c5186ed
JW
567 uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
568
569 if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
570 item_num = alc_pin_mode_min(dir);
571 strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
a9430dd8
JW
572 return 0;
573}
574
9c7f852e
TI
575static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
576 struct snd_ctl_elem_value *ucontrol)
a9430dd8 577{
4c5186ed 578 unsigned int i;
a9430dd8
JW
579 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
580 hda_nid_t nid = kcontrol->private_value & 0xffff;
4c5186ed 581 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
a9430dd8 582 long *valp = ucontrol->value.integer.value;
9c7f852e
TI
583 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
584 AC_VERB_GET_PIN_WIDGET_CONTROL,
585 0x00);
a9430dd8 586
4c5186ed
JW
587 /* Find enumerated value for current pinctl setting */
588 i = alc_pin_mode_min(dir);
4b35d2ca 589 while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
4c5186ed 590 i++;
9c7f852e 591 *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
a9430dd8
JW
592 return 0;
593}
594
9c7f852e
TI
595static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
596 struct snd_ctl_elem_value *ucontrol)
a9430dd8 597{
4c5186ed 598 signed int change;
a9430dd8
JW
599 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
600 hda_nid_t nid = kcontrol->private_value & 0xffff;
4c5186ed
JW
601 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
602 long val = *ucontrol->value.integer.value;
9c7f852e
TI
603 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
604 AC_VERB_GET_PIN_WIDGET_CONTROL,
605 0x00);
a9430dd8 606
f12ab1e0 607 if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
4c5186ed
JW
608 val = alc_pin_mode_min(dir);
609
610 change = pinctl != alc_pin_mode_values[val];
cdcd9268
JW
611 if (change) {
612 /* Set pin mode to that requested */
82beb8fd
TI
613 snd_hda_codec_write_cache(codec, nid, 0,
614 AC_VERB_SET_PIN_WIDGET_CONTROL,
615 alc_pin_mode_values[val]);
cdcd9268 616
ea1fb29a 617 /* Also enable the retasking pin's input/output as required
cdcd9268
JW
618 * for the requested pin mode. Enum values of 2 or less are
619 * input modes.
620 *
621 * Dynamically switching the input/output buffers probably
a1e8d2da
JW
622 * reduces noise slightly (particularly on input) so we'll
623 * do it. However, having both input and output buffers
624 * enabled simultaneously doesn't seem to be problematic if
625 * this turns out to be necessary in the future.
cdcd9268
JW
626 */
627 if (val <= 2) {
47fd830a
TI
628 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
629 HDA_AMP_MUTE, HDA_AMP_MUTE);
630 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
631 HDA_AMP_MUTE, 0);
cdcd9268 632 } else {
47fd830a
TI
633 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
634 HDA_AMP_MUTE, HDA_AMP_MUTE);
635 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
636 HDA_AMP_MUTE, 0);
cdcd9268
JW
637 }
638 }
a9430dd8
JW
639 return change;
640}
641
4c5186ed 642#define ALC_PIN_MODE(xname, nid, dir) \
a9430dd8 643 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
5b0cb1d8 644 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4c5186ed
JW
645 .info = alc_pin_mode_info, \
646 .get = alc_pin_mode_get, \
647 .put = alc_pin_mode_put, \
648 .private_value = nid | (dir<<16) }
df694daa 649
5c8f858d
JW
650/* A switch control for ALC260 GPIO pins. Multiple GPIOs can be ganged
651 * together using a mask with more than one bit set. This control is
652 * currently used only by the ALC260 test model. At this stage they are not
653 * needed for any "production" models.
654 */
655#ifdef CONFIG_SND_DEBUG
a5ce8890 656#define alc_gpio_data_info snd_ctl_boolean_mono_info
f12ab1e0 657
9c7f852e
TI
658static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
659 struct snd_ctl_elem_value *ucontrol)
5c8f858d
JW
660{
661 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
662 hda_nid_t nid = kcontrol->private_value & 0xffff;
663 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
664 long *valp = ucontrol->value.integer.value;
9c7f852e
TI
665 unsigned int val = snd_hda_codec_read(codec, nid, 0,
666 AC_VERB_GET_GPIO_DATA, 0x00);
5c8f858d
JW
667
668 *valp = (val & mask) != 0;
669 return 0;
670}
9c7f852e
TI
671static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
672 struct snd_ctl_elem_value *ucontrol)
5c8f858d
JW
673{
674 signed int change;
675 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
676 hda_nid_t nid = kcontrol->private_value & 0xffff;
677 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
678 long val = *ucontrol->value.integer.value;
9c7f852e
TI
679 unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
680 AC_VERB_GET_GPIO_DATA,
681 0x00);
5c8f858d
JW
682
683 /* Set/unset the masked GPIO bit(s) as needed */
9c7f852e
TI
684 change = (val == 0 ? 0 : mask) != (gpio_data & mask);
685 if (val == 0)
5c8f858d
JW
686 gpio_data &= ~mask;
687 else
688 gpio_data |= mask;
82beb8fd
TI
689 snd_hda_codec_write_cache(codec, nid, 0,
690 AC_VERB_SET_GPIO_DATA, gpio_data);
5c8f858d
JW
691
692 return change;
693}
694#define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
695 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
5b0cb1d8 696 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
5c8f858d
JW
697 .info = alc_gpio_data_info, \
698 .get = alc_gpio_data_get, \
699 .put = alc_gpio_data_put, \
700 .private_value = nid | (mask<<16) }
701#endif /* CONFIG_SND_DEBUG */
702
92621f13
JW
703/* A switch control to allow the enabling of the digital IO pins on the
704 * ALC260. This is incredibly simplistic; the intention of this control is
705 * to provide something in the test model allowing digital outputs to be
706 * identified if present. If models are found which can utilise these
707 * outputs a more complete mixer control can be devised for those models if
708 * necessary.
709 */
710#ifdef CONFIG_SND_DEBUG
a5ce8890 711#define alc_spdif_ctrl_info snd_ctl_boolean_mono_info
f12ab1e0 712
9c7f852e
TI
713static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
714 struct snd_ctl_elem_value *ucontrol)
92621f13
JW
715{
716 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
717 hda_nid_t nid = kcontrol->private_value & 0xffff;
718 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
719 long *valp = ucontrol->value.integer.value;
9c7f852e 720 unsigned int val = snd_hda_codec_read(codec, nid, 0,
3982d17e 721 AC_VERB_GET_DIGI_CONVERT_1, 0x00);
92621f13
JW
722
723 *valp = (val & mask) != 0;
724 return 0;
725}
9c7f852e
TI
726static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
727 struct snd_ctl_elem_value *ucontrol)
92621f13
JW
728{
729 signed int change;
730 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
731 hda_nid_t nid = kcontrol->private_value & 0xffff;
732 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
733 long val = *ucontrol->value.integer.value;
9c7f852e 734 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
3982d17e 735 AC_VERB_GET_DIGI_CONVERT_1,
9c7f852e 736 0x00);
92621f13
JW
737
738 /* Set/unset the masked control bit(s) as needed */
9c7f852e 739 change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
92621f13
JW
740 if (val==0)
741 ctrl_data &= ~mask;
742 else
743 ctrl_data |= mask;
82beb8fd
TI
744 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
745 ctrl_data);
92621f13
JW
746
747 return change;
748}
749#define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
750 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
5b0cb1d8 751 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
92621f13
JW
752 .info = alc_spdif_ctrl_info, \
753 .get = alc_spdif_ctrl_get, \
754 .put = alc_spdif_ctrl_put, \
755 .private_value = nid | (mask<<16) }
756#endif /* CONFIG_SND_DEBUG */
757
f8225f6d
JW
758/* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
759 * Again, this is only used in the ALC26x test models to help identify when
760 * the EAPD line must be asserted for features to work.
761 */
762#ifdef CONFIG_SND_DEBUG
763#define alc_eapd_ctrl_info snd_ctl_boolean_mono_info
764
765static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
766 struct snd_ctl_elem_value *ucontrol)
767{
768 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
769 hda_nid_t nid = kcontrol->private_value & 0xffff;
770 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
771 long *valp = ucontrol->value.integer.value;
772 unsigned int val = snd_hda_codec_read(codec, nid, 0,
773 AC_VERB_GET_EAPD_BTLENABLE, 0x00);
774
775 *valp = (val & mask) != 0;
776 return 0;
777}
778
779static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
780 struct snd_ctl_elem_value *ucontrol)
781{
782 int change;
783 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
784 hda_nid_t nid = kcontrol->private_value & 0xffff;
785 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
786 long val = *ucontrol->value.integer.value;
787 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
788 AC_VERB_GET_EAPD_BTLENABLE,
789 0x00);
790
791 /* Set/unset the masked control bit(s) as needed */
792 change = (!val ? 0 : mask) != (ctrl_data & mask);
793 if (!val)
794 ctrl_data &= ~mask;
795 else
796 ctrl_data |= mask;
797 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
798 ctrl_data);
799
800 return change;
801}
802
803#define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
804 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
5b0cb1d8 805 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
f8225f6d
JW
806 .info = alc_eapd_ctrl_info, \
807 .get = alc_eapd_ctrl_get, \
808 .put = alc_eapd_ctrl_put, \
809 .private_value = nid | (mask<<16) }
810#endif /* CONFIG_SND_DEBUG */
811
23f0c048
TI
812/*
813 * set up the input pin config (depending on the given auto-pin type)
814 */
815static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
816 int auto_pin_type)
817{
818 unsigned int val = PIN_IN;
819
820 if (auto_pin_type <= AUTO_PIN_FRONT_MIC) {
821 unsigned int pincap;
1327a32b 822 pincap = snd_hda_query_pin_caps(codec, nid);
23f0c048
TI
823 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
824 if (pincap & AC_PINCAP_VREF_80)
825 val = PIN_VREF80;
461c6c3a
TI
826 else if (pincap & AC_PINCAP_VREF_50)
827 val = PIN_VREF50;
828 else if (pincap & AC_PINCAP_VREF_100)
829 val = PIN_VREF100;
830 else if (pincap & AC_PINCAP_VREF_GRD)
831 val = PIN_VREFGRD;
23f0c048
TI
832 }
833 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
834}
835
d88897ea
TI
836/*
837 */
838static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
839{
840 if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
841 return;
842 spec->mixers[spec->num_mixers++] = mix;
843}
844
845static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
846{
847 if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
848 return;
849 spec->init_verbs[spec->num_init_verbs++] = verb;
850}
851
df694daa
KY
852/*
853 * set up from the preset table
854 */
e9c364c0 855static void setup_preset(struct hda_codec *codec,
9c7f852e 856 const struct alc_config_preset *preset)
df694daa 857{
e9c364c0 858 struct alc_spec *spec = codec->spec;
df694daa
KY
859 int i;
860
861 for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
d88897ea 862 add_mixer(spec, preset->mixers[i]);
f9e336f6 863 spec->cap_mixer = preset->cap_mixer;
9c7f852e
TI
864 for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
865 i++)
d88897ea 866 add_verb(spec, preset->init_verbs[i]);
ea1fb29a 867
df694daa
KY
868 spec->channel_mode = preset->channel_mode;
869 spec->num_channel_mode = preset->num_channel_mode;
4e195a7b 870 spec->need_dac_fix = preset->need_dac_fix;
3b315d70 871 spec->const_channel_count = preset->const_channel_count;
df694daa 872
3b315d70
HM
873 if (preset->const_channel_count)
874 spec->multiout.max_channels = preset->const_channel_count;
875 else
876 spec->multiout.max_channels = spec->channel_mode[0].channels;
877 spec->ext_channel_count = spec->channel_mode[0].channels;
df694daa
KY
878
879 spec->multiout.num_dacs = preset->num_dacs;
880 spec->multiout.dac_nids = preset->dac_nids;
881 spec->multiout.dig_out_nid = preset->dig_out_nid;
b25c9da1 882 spec->multiout.slave_dig_outs = preset->slave_dig_outs;
df694daa 883 spec->multiout.hp_nid = preset->hp_nid;
ea1fb29a 884
a1e8d2da 885 spec->num_mux_defs = preset->num_mux_defs;
f12ab1e0 886 if (!spec->num_mux_defs)
a1e8d2da 887 spec->num_mux_defs = 1;
df694daa
KY
888 spec->input_mux = preset->input_mux;
889
890 spec->num_adc_nids = preset->num_adc_nids;
891 spec->adc_nids = preset->adc_nids;
e1406348 892 spec->capsrc_nids = preset->capsrc_nids;
df694daa 893 spec->dig_in_nid = preset->dig_in_nid;
ae6b813a
TI
894
895 spec->unsol_event = preset->unsol_event;
896 spec->init_hook = preset->init_hook;
cb53c626 897#ifdef CONFIG_SND_HDA_POWER_SAVE
f5de24b0 898 spec->power_hook = preset->power_hook;
cb53c626
TI
899 spec->loopback.amplist = preset->loopbacks;
900#endif
e9c364c0
TI
901
902 if (preset->setup)
903 preset->setup(codec);
df694daa
KY
904}
905
bc9f98a9
KY
906/* Enable GPIO mask and set output */
907static struct hda_verb alc_gpio1_init_verbs[] = {
908 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
909 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
910 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
911 { }
912};
913
914static struct hda_verb alc_gpio2_init_verbs[] = {
915 {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
916 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
917 {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
918 { }
919};
920
bdd148a3
KY
921static struct hda_verb alc_gpio3_init_verbs[] = {
922 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
923 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
924 {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
925 { }
926};
927
2c3bf9ab
TI
928/*
929 * Fix hardware PLL issue
930 * On some codecs, the analog PLL gating control must be off while
931 * the default value is 1.
932 */
933static void alc_fix_pll(struct hda_codec *codec)
934{
935 struct alc_spec *spec = codec->spec;
936 unsigned int val;
937
938 if (!spec->pll_nid)
939 return;
940 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
941 spec->pll_coef_idx);
942 val = snd_hda_codec_read(codec, spec->pll_nid, 0,
943 AC_VERB_GET_PROC_COEF, 0);
944 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
945 spec->pll_coef_idx);
946 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
947 val & ~(1 << spec->pll_coef_bit));
948}
949
950static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
951 unsigned int coef_idx, unsigned int coef_bit)
952{
953 struct alc_spec *spec = codec->spec;
954 spec->pll_nid = nid;
955 spec->pll_coef_idx = coef_idx;
956 spec->pll_coef_bit = coef_bit;
957 alc_fix_pll(codec);
958}
959
a9fd4f3f 960static void alc_automute_pin(struct hda_codec *codec)
c9b58006
KY
961{
962 struct alc_spec *spec = codec->spec;
a9fd4f3f
TI
963 unsigned int nid = spec->autocfg.hp_pins[0];
964 int i;
c9b58006 965
ad87c64f
TI
966 if (!nid)
967 return;
864f92be 968 spec->jack_present = snd_hda_jack_detect(codec, nid);
a9fd4f3f
TI
969 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
970 nid = spec->autocfg.speaker_pins[i];
971 if (!nid)
972 break;
973 snd_hda_codec_write(codec, nid, 0,
974 AC_VERB_SET_PIN_WIDGET_CONTROL,
975 spec->jack_present ? 0 : PIN_OUT);
976 }
c9b58006
KY
977}
978
6c819492
TI
979static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
980 hda_nid_t nid)
981{
982 hda_nid_t conn[HDA_MAX_NUM_INPUTS];
983 int i, nums;
984
985 nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
986 for (i = 0; i < nums; i++)
987 if (conn[i] == nid)
988 return i;
989 return -1;
990}
991
7fb0d78f
KY
992static void alc_mic_automute(struct hda_codec *codec)
993{
994 struct alc_spec *spec = codec->spec;
6c819492
TI
995 struct alc_mic_route *dead, *alive;
996 unsigned int present, type;
997 hda_nid_t cap_nid;
998
b59bdf3b
TI
999 if (!spec->auto_mic)
1000 return;
6c819492
TI
1001 if (!spec->int_mic.pin || !spec->ext_mic.pin)
1002 return;
1003 if (snd_BUG_ON(!spec->adc_nids))
1004 return;
1005
1006 cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1007
864f92be 1008 present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
6c819492
TI
1009 if (present) {
1010 alive = &spec->ext_mic;
1011 dead = &spec->int_mic;
1012 } else {
1013 alive = &spec->int_mic;
1014 dead = &spec->ext_mic;
1015 }
1016
6c819492
TI
1017 type = get_wcaps_type(get_wcaps(codec, cap_nid));
1018 if (type == AC_WID_AUD_MIX) {
1019 /* Matrix-mixer style (e.g. ALC882) */
1020 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1021 alive->mux_idx,
1022 HDA_AMP_MUTE, 0);
1023 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1024 dead->mux_idx,
1025 HDA_AMP_MUTE, HDA_AMP_MUTE);
1026 } else {
1027 /* MUX style (e.g. ALC880) */
1028 snd_hda_codec_write_cache(codec, cap_nid, 0,
1029 AC_VERB_SET_CONNECT_SEL,
1030 alive->mux_idx);
1031 }
1032
1033 /* FIXME: analog mixer */
7fb0d78f
KY
1034}
1035
c9b58006
KY
1036/* unsolicited event for HP jack sensing */
1037static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1038{
1039 if (codec->vendor_id == 0x10ec0880)
1040 res >>= 28;
1041 else
1042 res >>= 26;
a9fd4f3f
TI
1043 switch (res) {
1044 case ALC880_HP_EVENT:
1045 alc_automute_pin(codec);
1046 break;
1047 case ALC880_MIC_EVENT:
7fb0d78f 1048 alc_mic_automute(codec);
a9fd4f3f
TI
1049 break;
1050 }
7fb0d78f
KY
1051}
1052
1053static void alc_inithook(struct hda_codec *codec)
1054{
a9fd4f3f 1055 alc_automute_pin(codec);
7fb0d78f 1056 alc_mic_automute(codec);
c9b58006
KY
1057}
1058
f9423e7a
KY
1059/* additional initialization for ALC888 variants */
1060static void alc888_coef_init(struct hda_codec *codec)
1061{
1062 unsigned int tmp;
1063
1064 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1065 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1066 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
37db623a 1067 if ((tmp & 0xf0) == 0x20)
f9423e7a
KY
1068 /* alc888S-VC */
1069 snd_hda_codec_read(codec, 0x20, 0,
1070 AC_VERB_SET_PROC_COEF, 0x830);
1071 else
1072 /* alc888-VB */
1073 snd_hda_codec_read(codec, 0x20, 0,
1074 AC_VERB_SET_PROC_COEF, 0x3030);
1075}
1076
87a8c370
JK
1077static void alc889_coef_init(struct hda_codec *codec)
1078{
1079 unsigned int tmp;
1080
1081 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1082 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1083 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1084 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1085}
1086
3fb4a508
TI
1087/* turn on/off EAPD control (only if available) */
1088static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
1089{
1090 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
1091 return;
1092 if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
1093 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
1094 on ? 2 : 0);
1095}
1096
4a79ba34 1097static void alc_auto_init_amp(struct hda_codec *codec, int type)
bc9f98a9 1098{
4a79ba34 1099 unsigned int tmp;
bc9f98a9 1100
4a79ba34
TI
1101 switch (type) {
1102 case ALC_INIT_GPIO1:
bc9f98a9
KY
1103 snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1104 break;
4a79ba34 1105 case ALC_INIT_GPIO2:
bc9f98a9
KY
1106 snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1107 break;
4a79ba34 1108 case ALC_INIT_GPIO3:
bdd148a3
KY
1109 snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1110 break;
4a79ba34 1111 case ALC_INIT_DEFAULT:
bdd148a3 1112 switch (codec->vendor_id) {
c9b58006 1113 case 0x10ec0260:
3fb4a508
TI
1114 set_eapd(codec, 0x0f, 1);
1115 set_eapd(codec, 0x10, 1);
c9b58006
KY
1116 break;
1117 case 0x10ec0262:
bdd148a3
KY
1118 case 0x10ec0267:
1119 case 0x10ec0268:
c9b58006 1120 case 0x10ec0269:
3fb4a508 1121 case 0x10ec0270:
c6e8f2da 1122 case 0x10ec0272:
f9423e7a
KY
1123 case 0x10ec0660:
1124 case 0x10ec0662:
1125 case 0x10ec0663:
c9b58006 1126 case 0x10ec0862:
20a3a05d 1127 case 0x10ec0889:
3fb4a508
TI
1128 set_eapd(codec, 0x14, 1);
1129 set_eapd(codec, 0x15, 1);
c9b58006 1130 break;
bdd148a3 1131 }
c9b58006
KY
1132 switch (codec->vendor_id) {
1133 case 0x10ec0260:
1134 snd_hda_codec_write(codec, 0x1a, 0,
1135 AC_VERB_SET_COEF_INDEX, 7);
1136 tmp = snd_hda_codec_read(codec, 0x1a, 0,
1137 AC_VERB_GET_PROC_COEF, 0);
1138 snd_hda_codec_write(codec, 0x1a, 0,
1139 AC_VERB_SET_COEF_INDEX, 7);
1140 snd_hda_codec_write(codec, 0x1a, 0,
1141 AC_VERB_SET_PROC_COEF,
1142 tmp | 0x2010);
1143 break;
1144 case 0x10ec0262:
1145 case 0x10ec0880:
1146 case 0x10ec0882:
1147 case 0x10ec0883:
1148 case 0x10ec0885:
4a5a4c56 1149 case 0x10ec0887:
20a3a05d 1150 case 0x10ec0889:
87a8c370 1151 alc889_coef_init(codec);
c9b58006 1152 break;
f9423e7a 1153 case 0x10ec0888:
4a79ba34 1154 alc888_coef_init(codec);
f9423e7a 1155 break;
0aea778e 1156#if 0 /* XXX: This may cause the silent output on speaker on some machines */
c9b58006
KY
1157 case 0x10ec0267:
1158 case 0x10ec0268:
1159 snd_hda_codec_write(codec, 0x20, 0,
1160 AC_VERB_SET_COEF_INDEX, 7);
1161 tmp = snd_hda_codec_read(codec, 0x20, 0,
1162 AC_VERB_GET_PROC_COEF, 0);
1163 snd_hda_codec_write(codec, 0x20, 0,
ea1fb29a 1164 AC_VERB_SET_COEF_INDEX, 7);
c9b58006
KY
1165 snd_hda_codec_write(codec, 0x20, 0,
1166 AC_VERB_SET_PROC_COEF,
1167 tmp | 0x3000);
1168 break;
0aea778e 1169#endif /* XXX */
bc9f98a9 1170 }
4a79ba34
TI
1171 break;
1172 }
1173}
1174
1175static void alc_init_auto_hp(struct hda_codec *codec)
1176{
1177 struct alc_spec *spec = codec->spec;
1178
1179 if (!spec->autocfg.hp_pins[0])
1180 return;
1181
1182 if (!spec->autocfg.speaker_pins[0]) {
2a2ed0df
TI
1183 if (spec->autocfg.line_out_pins[0] &&
1184 spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
4a79ba34
TI
1185 spec->autocfg.speaker_pins[0] =
1186 spec->autocfg.line_out_pins[0];
1187 else
1188 return;
1189 }
1190
2a2ed0df
TI
1191 snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1192 spec->autocfg.hp_pins[0]);
4a79ba34
TI
1193 snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0,
1194 AC_VERB_SET_UNSOLICITED_ENABLE,
1195 AC_USRSP_EN | ALC880_HP_EVENT);
1196 spec->unsol_event = alc_sku_unsol_event;
1197}
1198
6c819492
TI
1199static void alc_init_auto_mic(struct hda_codec *codec)
1200{
1201 struct alc_spec *spec = codec->spec;
1202 struct auto_pin_cfg *cfg = &spec->autocfg;
1203 hda_nid_t fixed, ext;
1204 int i;
1205
1206 /* there must be only two mic inputs exclusively */
1207 for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++)
1208 if (cfg->input_pins[i])
1209 return;
1210
1211 fixed = ext = 0;
1212 for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) {
1213 hda_nid_t nid = cfg->input_pins[i];
1214 unsigned int defcfg;
1215 if (!nid)
1216 return;
1217 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1218 switch (get_defcfg_connect(defcfg)) {
1219 case AC_JACK_PORT_FIXED:
1220 if (fixed)
1221 return; /* already occupied */
1222 fixed = nid;
1223 break;
1224 case AC_JACK_PORT_COMPLEX:
1225 if (ext)
1226 return; /* already occupied */
1227 ext = nid;
1228 break;
1229 default:
1230 return; /* invalid entry */
1231 }
1232 }
eaa9b3a7
TI
1233 if (!ext || !fixed)
1234 return;
6c819492
TI
1235 if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1236 return; /* no unsol support */
1237 snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1238 ext, fixed);
1239 spec->ext_mic.pin = ext;
1240 spec->int_mic.pin = fixed;
1241 spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1242 spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1243 spec->auto_mic = 1;
1244 snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1245 AC_VERB_SET_UNSOLICITED_ENABLE,
1246 AC_USRSP_EN | ALC880_MIC_EVENT);
1247 spec->unsol_event = alc_sku_unsol_event;
1248}
1249
4a79ba34
TI
1250/* check subsystem ID and set up device-specific initialization;
1251 * return 1 if initialized, 0 if invalid SSID
1252 */
1253/* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1254 * 31 ~ 16 : Manufacture ID
1255 * 15 ~ 8 : SKU ID
1256 * 7 ~ 0 : Assembly ID
1257 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1258 */
1259static int alc_subsystem_id(struct hda_codec *codec,
1260 hda_nid_t porta, hda_nid_t porte,
6227cdce 1261 hda_nid_t portd, hda_nid_t porti)
4a79ba34
TI
1262{
1263 unsigned int ass, tmp, i;
1264 unsigned nid;
1265 struct alc_spec *spec = codec->spec;
1266
1267 ass = codec->subsystem_id & 0xffff;
1268 if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1269 goto do_sku;
1270
1271 /* invalid SSID, check the special NID pin defcfg instead */
1272 /*
def319f9 1273 * 31~30 : port connectivity
4a79ba34
TI
1274 * 29~21 : reserve
1275 * 20 : PCBEEP input
1276 * 19~16 : Check sum (15:1)
1277 * 15~1 : Custom
1278 * 0 : override
1279 */
1280 nid = 0x1d;
1281 if (codec->vendor_id == 0x10ec0260)
1282 nid = 0x17;
1283 ass = snd_hda_codec_get_pincfg(codec, nid);
1284 snd_printd("realtek: No valid SSID, "
1285 "checking pincfg 0x%08x for NID 0x%x\n",
cb6605c1 1286 ass, nid);
6227cdce 1287 if (!(ass & 1))
4a79ba34
TI
1288 return 0;
1289 if ((ass >> 30) != 1) /* no physical connection */
1290 return 0;
1291
1292 /* check sum */
1293 tmp = 0;
1294 for (i = 1; i < 16; i++) {
1295 if ((ass >> i) & 1)
1296 tmp++;
1297 }
1298 if (((ass >> 16) & 0xf) != tmp)
1299 return 0;
1300do_sku:
1301 snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1302 ass & 0xffff, codec->vendor_id);
1303 /*
1304 * 0 : override
1305 * 1 : Swap Jack
1306 * 2 : 0 --> Desktop, 1 --> Laptop
1307 * 3~5 : External Amplifier control
1308 * 7~6 : Reserved
1309 */
1310 tmp = (ass & 0x38) >> 3; /* external Amp control */
1311 switch (tmp) {
1312 case 1:
1313 spec->init_amp = ALC_INIT_GPIO1;
1314 break;
1315 case 3:
1316 spec->init_amp = ALC_INIT_GPIO2;
1317 break;
1318 case 7:
1319 spec->init_amp = ALC_INIT_GPIO3;
1320 break;
1321 case 5:
1322 spec->init_amp = ALC_INIT_DEFAULT;
bc9f98a9
KY
1323 break;
1324 }
ea1fb29a 1325
8c427226 1326 /* is laptop or Desktop and enable the function "Mute internal speaker
c9b58006
KY
1327 * when the external headphone out jack is plugged"
1328 */
8c427226 1329 if (!(ass & 0x8000))
4a79ba34 1330 return 1;
c9b58006
KY
1331 /*
1332 * 10~8 : Jack location
1333 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1334 * 14~13: Resvered
1335 * 15 : 1 --> enable the function "Mute internal speaker
1336 * when the external headphone out jack is plugged"
1337 */
c9b58006 1338 if (!spec->autocfg.hp_pins[0]) {
01d4825d 1339 hda_nid_t nid;
c9b58006
KY
1340 tmp = (ass >> 11) & 0x3; /* HP to chassis */
1341 if (tmp == 0)
01d4825d 1342 nid = porta;
c9b58006 1343 else if (tmp == 1)
01d4825d 1344 nid = porte;
c9b58006 1345 else if (tmp == 2)
01d4825d 1346 nid = portd;
6227cdce
KY
1347 else if (tmp == 3)
1348 nid = porti;
c9b58006 1349 else
4a79ba34 1350 return 1;
01d4825d
TI
1351 for (i = 0; i < spec->autocfg.line_outs; i++)
1352 if (spec->autocfg.line_out_pins[i] == nid)
1353 return 1;
1354 spec->autocfg.hp_pins[0] = nid;
c9b58006
KY
1355 }
1356
4a79ba34 1357 alc_init_auto_hp(codec);
6c819492 1358 alc_init_auto_mic(codec);
4a79ba34
TI
1359 return 1;
1360}
ea1fb29a 1361
4a79ba34 1362static void alc_ssid_check(struct hda_codec *codec,
6227cdce
KY
1363 hda_nid_t porta, hda_nid_t porte,
1364 hda_nid_t portd, hda_nid_t porti)
4a79ba34 1365{
6227cdce 1366 if (!alc_subsystem_id(codec, porta, porte, portd, porti)) {
4a79ba34
TI
1367 struct alc_spec *spec = codec->spec;
1368 snd_printd("realtek: "
1369 "Enable default setup for auto mode as fallback\n");
1370 spec->init_amp = ALC_INIT_DEFAULT;
1371 alc_init_auto_hp(codec);
6c819492 1372 alc_init_auto_mic(codec);
4a79ba34 1373 }
bc9f98a9
KY
1374}
1375
f95474ec 1376/*
f8f25ba3 1377 * Fix-up pin default configurations and add default verbs
f95474ec
TI
1378 */
1379
1380struct alc_pincfg {
1381 hda_nid_t nid;
1382 u32 val;
1383};
1384
f8f25ba3
TI
1385struct alc_fixup {
1386 const struct alc_pincfg *pins;
1387 const struct hda_verb *verbs;
1388};
1389
1390static void alc_pick_fixup(struct hda_codec *codec,
f95474ec 1391 const struct snd_pci_quirk *quirk,
f8f25ba3 1392 const struct alc_fixup *fix)
f95474ec
TI
1393{
1394 const struct alc_pincfg *cfg;
1395
1396 quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1397 if (!quirk)
1398 return;
1399
f8f25ba3
TI
1400 fix += quirk->value;
1401 cfg = fix->pins;
1402 if (cfg) {
1403 for (; cfg->nid; cfg++)
1404 snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1405 }
1406 if (fix->verbs)
1407 add_verb(codec->spec, fix->verbs);
f95474ec
TI
1408}
1409
274693f3
KY
1410static int alc_read_coef_idx(struct hda_codec *codec,
1411 unsigned int coef_idx)
1412{
1413 unsigned int val;
1414 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1415 coef_idx);
1416 val = snd_hda_codec_read(codec, 0x20, 0,
1417 AC_VERB_GET_PROC_COEF, 0);
1418 return val;
1419}
1420
ef8ef5fb
VP
1421/*
1422 * ALC888
1423 */
1424
1425/*
1426 * 2ch mode
1427 */
1428static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1429/* Mic-in jack as mic in */
1430 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1431 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1432/* Line-in jack as Line in */
1433 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1434 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1435/* Line-Out as Front */
1436 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1437 { } /* end */
1438};
1439
1440/*
1441 * 4ch mode
1442 */
1443static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1444/* Mic-in jack as mic in */
1445 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1446 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1447/* Line-in jack as Surround */
1448 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1449 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1450/* Line-Out as Front */
1451 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1452 { } /* end */
1453};
1454
1455/*
1456 * 6ch mode
1457 */
1458static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1459/* Mic-in jack as CLFE */
1460 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1461 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1462/* Line-in jack as Surround */
1463 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1464 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1465/* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1466 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1467 { } /* end */
1468};
1469
1470/*
1471 * 8ch mode
1472 */
1473static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1474/* Mic-in jack as CLFE */
1475 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1476 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1477/* Line-in jack as Surround */
1478 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1479 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1480/* Line-Out as Side */
1481 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1482 { } /* end */
1483};
1484
1485static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1486 { 2, alc888_4ST_ch2_intel_init },
1487 { 4, alc888_4ST_ch4_intel_init },
1488 { 6, alc888_4ST_ch6_intel_init },
1489 { 8, alc888_4ST_ch8_intel_init },
1490};
1491
1492/*
1493 * ALC888 Fujitsu Siemens Amillo xa3530
1494 */
1495
1496static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1497/* Front Mic: set to PIN_IN (empty by default) */
1498 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1499/* Connect Internal HP to Front */
1500 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1501 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1502 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1503/* Connect Bass HP to Front */
1504 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1505 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1506 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1507/* Connect Line-Out side jack (SPDIF) to Side */
1508 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1509 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1510 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1511/* Connect Mic jack to CLFE */
1512 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1513 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1514 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1515/* Connect Line-in jack to Surround */
1516 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1517 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1518 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1519/* Connect HP out jack to Front */
1520 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1521 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1522 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1523/* Enable unsolicited event for HP jack and Line-out jack */
1524 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1525 {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1526 {}
1527};
1528
a9fd4f3f 1529static void alc_automute_amp(struct hda_codec *codec)
ef8ef5fb 1530{
a9fd4f3f 1531 struct alc_spec *spec = codec->spec;
864f92be 1532 unsigned int mute;
a9fd4f3f
TI
1533 hda_nid_t nid;
1534 int i;
1535
1536 spec->jack_present = 0;
1537 for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1538 nid = spec->autocfg.hp_pins[i];
1539 if (!nid)
1540 break;
864f92be 1541 if (snd_hda_jack_detect(codec, nid)) {
a9fd4f3f
TI
1542 spec->jack_present = 1;
1543 break;
1544 }
1545 }
1546
1547 mute = spec->jack_present ? HDA_AMP_MUTE : 0;
ef8ef5fb 1548 /* Toggle internal speakers muting */
a9fd4f3f
TI
1549 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1550 nid = spec->autocfg.speaker_pins[i];
1551 if (!nid)
1552 break;
1553 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1554 HDA_AMP_MUTE, mute);
1555 }
ef8ef5fb
VP
1556}
1557
a9fd4f3f
TI
1558static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1559 unsigned int res)
ef8ef5fb 1560{
a9fd4f3f
TI
1561 if (codec->vendor_id == 0x10ec0880)
1562 res >>= 28;
1563 else
1564 res >>= 26;
1565 if (res == ALC880_HP_EVENT)
1566 alc_automute_amp(codec);
ef8ef5fb
VP
1567}
1568
4f5d1706 1569static void alc889_automute_setup(struct hda_codec *codec)
6732bd0d
WF
1570{
1571 struct alc_spec *spec = codec->spec;
1572
1573 spec->autocfg.hp_pins[0] = 0x15;
1574 spec->autocfg.speaker_pins[0] = 0x14;
1575 spec->autocfg.speaker_pins[1] = 0x16;
1576 spec->autocfg.speaker_pins[2] = 0x17;
1577 spec->autocfg.speaker_pins[3] = 0x19;
1578 spec->autocfg.speaker_pins[4] = 0x1a;
6732bd0d
WF
1579}
1580
1581static void alc889_intel_init_hook(struct hda_codec *codec)
1582{
1583 alc889_coef_init(codec);
4f5d1706 1584 alc_automute_amp(codec);
6732bd0d
WF
1585}
1586
4f5d1706 1587static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
a9fd4f3f
TI
1588{
1589 struct alc_spec *spec = codec->spec;
1590
1591 spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1592 spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1593 spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1594 spec->autocfg.speaker_pins[1] = 0x15; /* bass */
a9fd4f3f 1595}
ef8ef5fb 1596
5b2d1eca
VP
1597/*
1598 * ALC888 Acer Aspire 4930G model
1599 */
1600
1601static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
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)},
ef8ef5fb 1606/* Enable unsolicited event for HP jack */
5b2d1eca
VP
1607 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1608/* Connect Internal HP to front */
1609 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1610 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1611 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1612/* Connect HP out to front */
1613 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1614 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1615 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1616 { }
1617};
1618
d2fd4b09
TV
1619/*
1620 * ALC888 Acer Aspire 6530G model
1621 */
1622
1623static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
1624/* Bias voltage on for external mic port */
1625 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
320d5920
EL
1626/* Front Mic: set to PIN_IN (empty by default) */
1627 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1628/* Unselect Front Mic by default in input mixer 3 */
1629 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
d2fd4b09
TV
1630/* Enable unsolicited event for HP jack */
1631 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1632/* Enable speaker output */
1633 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1634 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1635/* Enable headphone output */
1636 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1637 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1638 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1639 { }
1640};
1641
3b315d70 1642/*
018df418 1643 * ALC889 Acer Aspire 8930G model
3b315d70
HM
1644 */
1645
018df418 1646static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
3b315d70
HM
1647/* Front Mic: set to PIN_IN (empty by default) */
1648 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1649/* Unselect Front Mic by default in input mixer 3 */
1650 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1651/* Enable unsolicited event for HP jack */
1652 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1653/* Connect Internal Front to Front */
1654 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1655 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1656 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1657/* Connect Internal Rear to Rear */
1658 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1659 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1660 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1661/* Connect Internal CLFE to CLFE */
1662 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1663 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1664 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1665/* Connect HP out to Front */
018df418 1666 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
3b315d70
HM
1667 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1668 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1669/* Enable all DACs */
1670/* DAC DISABLE/MUTE 1? */
1671/* setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1672 {0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1673 {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1674/* DAC DISABLE/MUTE 2? */
1675/* some bit here disables the other DACs. Init=0x4900 */
1676 {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1677 {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
018df418
HM
1678/* DMIC fix
1679 * This laptop has a stereo digital microphone. The mics are only 1cm apart
1680 * which makes the stereo useless. However, either the mic or the ALC889
1681 * makes the signal become a difference/sum signal instead of standard
1682 * stereo, which is annoying. So instead we flip this bit which makes the
1683 * codec replicate the sum signal to both channels, turning it into a
1684 * normal mono mic.
1685 */
1686/* DMIC_CONTROL? Init value = 0x0001 */
1687 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
1688 {0x20, AC_VERB_SET_PROC_COEF, 0x0003},
3b315d70
HM
1689 { }
1690};
1691
ef8ef5fb 1692static struct hda_input_mux alc888_2_capture_sources[2] = {
5b2d1eca
VP
1693 /* Front mic only available on one ADC */
1694 {
1695 .num_items = 4,
1696 .items = {
1697 { "Mic", 0x0 },
1698 { "Line", 0x2 },
1699 { "CD", 0x4 },
1700 { "Front Mic", 0xb },
1701 },
1702 },
1703 {
1704 .num_items = 3,
1705 .items = {
1706 { "Mic", 0x0 },
1707 { "Line", 0x2 },
1708 { "CD", 0x4 },
1709 },
1710 }
1711};
1712
d2fd4b09
TV
1713static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
1714 /* Interal mic only available on one ADC */
1715 {
684a8842 1716 .num_items = 5,
d2fd4b09
TV
1717 .items = {
1718 { "Ext Mic", 0x0 },
684a8842 1719 { "Line In", 0x2 },
d2fd4b09 1720 { "CD", 0x4 },
684a8842 1721 { "Input Mix", 0xa },
d2fd4b09
TV
1722 { "Int Mic", 0xb },
1723 },
1724 },
1725 {
684a8842 1726 .num_items = 4,
d2fd4b09
TV
1727 .items = {
1728 { "Ext Mic", 0x0 },
684a8842 1729 { "Line In", 0x2 },
d2fd4b09 1730 { "CD", 0x4 },
684a8842 1731 { "Input Mix", 0xa },
d2fd4b09
TV
1732 },
1733 }
1734};
1735
018df418
HM
1736static struct hda_input_mux alc889_capture_sources[3] = {
1737 /* Digital mic only available on first "ADC" */
1738 {
1739 .num_items = 5,
1740 .items = {
1741 { "Mic", 0x0 },
1742 { "Line", 0x2 },
1743 { "CD", 0x4 },
1744 { "Front Mic", 0xb },
1745 { "Input Mix", 0xa },
1746 },
1747 },
1748 {
1749 .num_items = 4,
1750 .items = {
1751 { "Mic", 0x0 },
1752 { "Line", 0x2 },
1753 { "CD", 0x4 },
1754 { "Input Mix", 0xa },
1755 },
1756 },
1757 {
1758 .num_items = 4,
1759 .items = {
1760 { "Mic", 0x0 },
1761 { "Line", 0x2 },
1762 { "CD", 0x4 },
1763 { "Input Mix", 0xa },
1764 },
1765 }
1766};
1767
ef8ef5fb 1768static struct snd_kcontrol_new alc888_base_mixer[] = {
5b2d1eca
VP
1769 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1770 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1771 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1772 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1773 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1774 HDA_OUTPUT),
1775 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1776 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1777 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1778 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1779 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1780 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1781 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1782 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1783 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1784 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1785 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1786 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
5b2d1eca
VP
1787 { } /* end */
1788};
1789
556eea9a
HM
1790static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
1791 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1792 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1793 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1794 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1795 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1796 HDA_OUTPUT),
1797 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1798 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1799 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1800 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1801 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1802 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1803 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1804 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1805 { } /* end */
1806};
1807
1808
4f5d1706 1809static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
5b2d1eca 1810{
a9fd4f3f 1811 struct alc_spec *spec = codec->spec;
5b2d1eca 1812
a9fd4f3f
TI
1813 spec->autocfg.hp_pins[0] = 0x15;
1814 spec->autocfg.speaker_pins[0] = 0x14;
7cef4cf1
ŁW
1815 spec->autocfg.speaker_pins[1] = 0x16;
1816 spec->autocfg.speaker_pins[2] = 0x17;
5b2d1eca
VP
1817}
1818
4f5d1706 1819static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
320d5920
EL
1820{
1821 struct alc_spec *spec = codec->spec;
1822
1823 spec->autocfg.hp_pins[0] = 0x15;
1824 spec->autocfg.speaker_pins[0] = 0x14;
1825 spec->autocfg.speaker_pins[1] = 0x16;
1826 spec->autocfg.speaker_pins[2] = 0x17;
320d5920
EL
1827}
1828
4f5d1706 1829static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
3b315d70
HM
1830{
1831 struct alc_spec *spec = codec->spec;
1832
1833 spec->autocfg.hp_pins[0] = 0x15;
1834 spec->autocfg.speaker_pins[0] = 0x14;
1835 spec->autocfg.speaker_pins[1] = 0x16;
1836 spec->autocfg.speaker_pins[2] = 0x1b;
3b315d70
HM
1837}
1838
1da177e4 1839/*
e9edcee0
TI
1840 * ALC880 3-stack model
1841 *
1842 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
9c7f852e
TI
1843 * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
1844 * F-Mic = 0x1b, HP = 0x19
1da177e4
LT
1845 */
1846
e9edcee0
TI
1847static hda_nid_t alc880_dac_nids[4] = {
1848 /* front, rear, clfe, rear_surr */
1849 0x02, 0x05, 0x04, 0x03
1850};
1851
1852static hda_nid_t alc880_adc_nids[3] = {
1853 /* ADC0-2 */
1854 0x07, 0x08, 0x09,
1855};
1856
1857/* The datasheet says the node 0x07 is connected from inputs,
1858 * but it shows zero connection in the real implementation on some devices.
df694daa 1859 * Note: this is a 915GAV bug, fixed on 915GLV
1da177e4 1860 */
e9edcee0
TI
1861static hda_nid_t alc880_adc_nids_alt[2] = {
1862 /* ADC1-2 */
1863 0x08, 0x09,
1864};
1865
1866#define ALC880_DIGOUT_NID 0x06
1867#define ALC880_DIGIN_NID 0x0a
1868
1869static struct hda_input_mux alc880_capture_source = {
1870 .num_items = 4,
1871 .items = {
1872 { "Mic", 0x0 },
1873 { "Front Mic", 0x3 },
1874 { "Line", 0x2 },
1875 { "CD", 0x4 },
1876 },
1877};
1878
1879/* channel source setting (2/6 channel selection for 3-stack) */
1880/* 2ch mode */
1881static struct hda_verb alc880_threestack_ch2_init[] = {
1882 /* set line-in to input, mute it */
1883 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1884 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1885 /* set mic-in to input vref 80%, mute it */
1886 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1887 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1888 { } /* end */
1889};
1890
1891/* 6ch mode */
1892static struct hda_verb alc880_threestack_ch6_init[] = {
1893 /* set line-in to output, unmute it */
1894 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1895 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1896 /* set mic-in to output, unmute it */
1897 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1898 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1899 { } /* end */
1900};
1901
d2a6d7dc 1902static struct hda_channel_mode alc880_threestack_modes[2] = {
e9edcee0
TI
1903 { 2, alc880_threestack_ch2_init },
1904 { 6, alc880_threestack_ch6_init },
1905};
1906
c8b6bf9b 1907static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
05acb863 1908 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 1909 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
05acb863 1910 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
985be54b 1911 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
05acb863
TI
1912 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1913 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
985be54b
TI
1914 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1915 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1da177e4
LT
1916 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1917 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1918 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1919 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1920 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1921 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1922 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
1923 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
e9edcee0
TI
1924 HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
1925 {
1926 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1927 .name = "Channel Mode",
df694daa
KY
1928 .info = alc_ch_mode_info,
1929 .get = alc_ch_mode_get,
1930 .put = alc_ch_mode_put,
e9edcee0
TI
1931 },
1932 { } /* end */
1933};
1934
1935/* capture mixer elements */
f9e336f6
TI
1936static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
1937 struct snd_ctl_elem_info *uinfo)
1938{
1939 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1940 struct alc_spec *spec = codec->spec;
1941 int err;
1da177e4 1942
5a9e02e9 1943 mutex_lock(&codec->control_mutex);
f9e336f6
TI
1944 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1945 HDA_INPUT);
1946 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
5a9e02e9 1947 mutex_unlock(&codec->control_mutex);
f9e336f6
TI
1948 return err;
1949}
1950
1951static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
1952 unsigned int size, unsigned int __user *tlv)
1953{
1954 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1955 struct alc_spec *spec = codec->spec;
1956 int err;
1da177e4 1957
5a9e02e9 1958 mutex_lock(&codec->control_mutex);
f9e336f6
TI
1959 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1960 HDA_INPUT);
1961 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
5a9e02e9 1962 mutex_unlock(&codec->control_mutex);
f9e336f6
TI
1963 return err;
1964}
1965
1966typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
1967 struct snd_ctl_elem_value *ucontrol);
1968
1969static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
1970 struct snd_ctl_elem_value *ucontrol,
1971 getput_call_t func)
1972{
1973 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1974 struct alc_spec *spec = codec->spec;
1975 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1976 int err;
1977
5a9e02e9 1978 mutex_lock(&codec->control_mutex);
f9e336f6
TI
1979 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
1980 3, 0, HDA_INPUT);
1981 err = func(kcontrol, ucontrol);
5a9e02e9 1982 mutex_unlock(&codec->control_mutex);
f9e336f6
TI
1983 return err;
1984}
1985
1986static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
1987 struct snd_ctl_elem_value *ucontrol)
1988{
1989 return alc_cap_getput_caller(kcontrol, ucontrol,
1990 snd_hda_mixer_amp_volume_get);
1991}
1992
1993static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
1994 struct snd_ctl_elem_value *ucontrol)
1995{
1996 return alc_cap_getput_caller(kcontrol, ucontrol,
1997 snd_hda_mixer_amp_volume_put);
1998}
1999
2000/* capture mixer elements */
2001#define alc_cap_sw_info snd_ctl_boolean_stereo_info
2002
2003static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
2004 struct snd_ctl_elem_value *ucontrol)
2005{
2006 return alc_cap_getput_caller(kcontrol, ucontrol,
2007 snd_hda_mixer_amp_switch_get);
2008}
2009
2010static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
2011 struct snd_ctl_elem_value *ucontrol)
2012{
2013 return alc_cap_getput_caller(kcontrol, ucontrol,
2014 snd_hda_mixer_amp_switch_put);
2015}
2016
a23b688f 2017#define _DEFINE_CAPMIX(num) \
f9e336f6
TI
2018 { \
2019 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2020 .name = "Capture Switch", \
2021 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
2022 .count = num, \
2023 .info = alc_cap_sw_info, \
2024 .get = alc_cap_sw_get, \
2025 .put = alc_cap_sw_put, \
2026 }, \
2027 { \
2028 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2029 .name = "Capture Volume", \
2030 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2031 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2032 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
2033 .count = num, \
2034 .info = alc_cap_vol_info, \
2035 .get = alc_cap_vol_get, \
2036 .put = alc_cap_vol_put, \
2037 .tlv = { .c = alc_cap_vol_tlv }, \
a23b688f
TI
2038 }
2039
2040#define _DEFINE_CAPSRC(num) \
3c3e9892
TI
2041 { \
2042 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2043 /* .name = "Capture Source", */ \
2044 .name = "Input Source", \
2045 .count = num, \
2046 .info = alc_mux_enum_info, \
2047 .get = alc_mux_enum_get, \
2048 .put = alc_mux_enum_put, \
a23b688f
TI
2049 }
2050
2051#define DEFINE_CAPMIX(num) \
2052static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2053 _DEFINE_CAPMIX(num), \
2054 _DEFINE_CAPSRC(num), \
2055 { } /* end */ \
2056}
2057
2058#define DEFINE_CAPMIX_NOSRC(num) \
2059static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2060 _DEFINE_CAPMIX(num), \
2061 { } /* end */ \
f9e336f6
TI
2062}
2063
2064/* up to three ADCs */
2065DEFINE_CAPMIX(1);
2066DEFINE_CAPMIX(2);
2067DEFINE_CAPMIX(3);
a23b688f
TI
2068DEFINE_CAPMIX_NOSRC(1);
2069DEFINE_CAPMIX_NOSRC(2);
2070DEFINE_CAPMIX_NOSRC(3);
e9edcee0
TI
2071
2072/*
2073 * ALC880 5-stack model
2074 *
9c7f852e
TI
2075 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2076 * Side = 0x02 (0xd)
e9edcee0
TI
2077 * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2078 * Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2079 */
2080
2081/* additional mixers to alc880_three_stack_mixer */
c8b6bf9b 2082static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
e9edcee0 2083 HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 2084 HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
1da177e4
LT
2085 { } /* end */
2086};
2087
e9edcee0
TI
2088/* channel source setting (6/8 channel selection for 5-stack) */
2089/* 6ch mode */
2090static struct hda_verb alc880_fivestack_ch6_init[] = {
2091 /* set line-in to input, mute it */
2092 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2093 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
dfc0ff62
TI
2094 { } /* end */
2095};
2096
e9edcee0
TI
2097/* 8ch mode */
2098static struct hda_verb alc880_fivestack_ch8_init[] = {
2099 /* set line-in to output, unmute it */
2100 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2101 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2102 { } /* end */
2103};
2104
d2a6d7dc 2105static struct hda_channel_mode alc880_fivestack_modes[2] = {
e9edcee0
TI
2106 { 6, alc880_fivestack_ch6_init },
2107 { 8, alc880_fivestack_ch8_init },
2108};
2109
2110
2111/*
2112 * ALC880 6-stack model
2113 *
9c7f852e
TI
2114 * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2115 * Side = 0x05 (0x0f)
e9edcee0
TI
2116 * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2117 * Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2118 */
2119
2120static hda_nid_t alc880_6st_dac_nids[4] = {
2121 /* front, rear, clfe, rear_surr */
2122 0x02, 0x03, 0x04, 0x05
f12ab1e0 2123};
e9edcee0
TI
2124
2125static struct hda_input_mux alc880_6stack_capture_source = {
2126 .num_items = 4,
2127 .items = {
2128 { "Mic", 0x0 },
2129 { "Front Mic", 0x1 },
2130 { "Line", 0x2 },
2131 { "CD", 0x4 },
2132 },
2133};
2134
2135/* fixed 8-channels */
d2a6d7dc 2136static struct hda_channel_mode alc880_sixstack_modes[1] = {
e9edcee0
TI
2137 { 8, NULL },
2138};
2139
c8b6bf9b 2140static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
16ded525 2141 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2142 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16ded525 2143 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 2144 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
16ded525
TI
2145 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2146 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
985be54b
TI
2147 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2148 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
16ded525 2149 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
985be54b 2150 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
16ded525
TI
2151 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2152 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2153 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2154 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2155 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2156 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2157 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2158 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16ded525
TI
2159 {
2160 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2161 .name = "Channel Mode",
df694daa
KY
2162 .info = alc_ch_mode_info,
2163 .get = alc_ch_mode_get,
2164 .put = alc_ch_mode_put,
16ded525
TI
2165 },
2166 { } /* end */
2167};
2168
e9edcee0
TI
2169
2170/*
2171 * ALC880 W810 model
2172 *
2173 * W810 has rear IO for:
2174 * Front (DAC 02)
2175 * Surround (DAC 03)
2176 * Center/LFE (DAC 04)
2177 * Digital out (06)
2178 *
2179 * The system also has a pair of internal speakers, and a headphone jack.
2180 * These are both connected to Line2 on the codec, hence to DAC 02.
ea1fb29a 2181 *
e9edcee0
TI
2182 * There is a variable resistor to control the speaker or headphone
2183 * volume. This is a hardware-only device without a software API.
2184 *
2185 * Plugging headphones in will disable the internal speakers. This is
2186 * implemented in hardware, not via the driver using jack sense. In
2187 * a similar fashion, plugging into the rear socket marked "front" will
2188 * disable both the speakers and headphones.
2189 *
2190 * For input, there's a microphone jack, and an "audio in" jack.
2191 * These may not do anything useful with this driver yet, because I
2192 * haven't setup any initialization verbs for these yet...
2193 */
2194
2195static hda_nid_t alc880_w810_dac_nids[3] = {
2196 /* front, rear/surround, clfe */
2197 0x02, 0x03, 0x04
16ded525
TI
2198};
2199
e9edcee0 2200/* fixed 6 channels */
d2a6d7dc 2201static struct hda_channel_mode alc880_w810_modes[1] = {
e9edcee0
TI
2202 { 6, NULL }
2203};
2204
2205/* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
c8b6bf9b 2206static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
16ded525 2207 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2208 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16ded525 2209 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 2210 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
16ded525
TI
2211 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2212 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
985be54b
TI
2213 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2214 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
e9edcee0
TI
2215 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2216 { } /* end */
2217};
2218
2219
2220/*
2221 * Z710V model
2222 *
2223 * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
9c7f852e
TI
2224 * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2225 * Line = 0x1a
e9edcee0
TI
2226 */
2227
2228static hda_nid_t alc880_z71v_dac_nids[1] = {
2229 0x02
2230};
2231#define ALC880_Z71V_HP_DAC 0x03
2232
2233/* fixed 2 channels */
d2a6d7dc 2234static struct hda_channel_mode alc880_2_jack_modes[1] = {
e9edcee0
TI
2235 { 2, NULL }
2236};
2237
c8b6bf9b 2238static struct snd_kcontrol_new alc880_z71v_mixer[] = {
e9edcee0 2239 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2240 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
e9edcee0 2241 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 2242 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
16ded525
TI
2243 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2244 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16ded525
TI
2245 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2246 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16ded525
TI
2247 { } /* end */
2248};
2249
e9edcee0 2250
e9edcee0
TI
2251/*
2252 * ALC880 F1734 model
2253 *
2254 * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2255 * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2256 */
2257
2258static hda_nid_t alc880_f1734_dac_nids[1] = {
2259 0x03
2260};
2261#define ALC880_F1734_HP_DAC 0x02
2262
c8b6bf9b 2263static struct snd_kcontrol_new alc880_f1734_mixer[] = {
e9edcee0 2264 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2265 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2134ea4f
TI
2266 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2267 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
e9edcee0
TI
2268 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2269 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
937b4160
TI
2270 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2271 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
e9edcee0
TI
2272 { } /* end */
2273};
2274
937b4160
TI
2275static struct hda_input_mux alc880_f1734_capture_source = {
2276 .num_items = 2,
2277 .items = {
2278 { "Mic", 0x1 },
2279 { "CD", 0x4 },
2280 },
2281};
2282
e9edcee0 2283
e9edcee0
TI
2284/*
2285 * ALC880 ASUS model
2286 *
2287 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2288 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2289 * Mic = 0x18, Line = 0x1a
2290 */
2291
2292#define alc880_asus_dac_nids alc880_w810_dac_nids /* identical with w810 */
2293#define alc880_asus_modes alc880_threestack_modes /* 2/6 channel mode */
2294
c8b6bf9b 2295static struct snd_kcontrol_new alc880_asus_mixer[] = {
16ded525 2296 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2297 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16ded525 2298 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 2299 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
16ded525
TI
2300 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2301 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
985be54b
TI
2302 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2303 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
16ded525
TI
2304 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2305 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2306 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2307 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16ded525
TI
2308 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2309 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16ded525
TI
2310 {
2311 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2312 .name = "Channel Mode",
df694daa
KY
2313 .info = alc_ch_mode_info,
2314 .get = alc_ch_mode_get,
2315 .put = alc_ch_mode_put,
16ded525
TI
2316 },
2317 { } /* end */
2318};
e9edcee0 2319
e9edcee0
TI
2320/*
2321 * ALC880 ASUS W1V model
2322 *
2323 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2324 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2325 * Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2326 */
2327
2328/* additional mixers to alc880_asus_mixer */
c8b6bf9b 2329static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
e9edcee0
TI
2330 HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2331 HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2332 { } /* end */
2333};
2334
df694daa
KY
2335/* TCL S700 */
2336static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2337 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2338 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2339 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
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("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2343 HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2344 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2345 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
df694daa
KY
2346 { } /* end */
2347};
2348
ccc656ce
KY
2349/* Uniwill */
2350static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2134ea4f
TI
2351 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2352 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2353 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2354 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
ccc656ce
KY
2355 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2356 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2357 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2358 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2359 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2360 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2361 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2362 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2363 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2364 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2365 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2366 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
ccc656ce
KY
2367 {
2368 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2369 .name = "Channel Mode",
2370 .info = alc_ch_mode_info,
2371 .get = alc_ch_mode_get,
2372 .put = alc_ch_mode_put,
2373 },
2374 { } /* end */
2375};
2376
2cf9f0fc
TD
2377static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2378 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2379 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2380 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2381 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2382 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2383 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2384 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2385 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2386 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2387 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2388 { } /* end */
2389};
2390
ccc656ce 2391static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2134ea4f
TI
2392 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2393 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2394 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2395 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
ccc656ce
KY
2396 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2397 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2398 { } /* end */
2399};
2400
2134ea4f
TI
2401/*
2402 * virtual master controls
2403 */
2404
2405/*
2406 * slave controls for virtual master
2407 */
2408static const char *alc_slave_vols[] = {
2409 "Front Playback Volume",
2410 "Surround Playback Volume",
2411 "Center Playback Volume",
2412 "LFE Playback Volume",
2413 "Side Playback Volume",
2414 "Headphone Playback Volume",
2415 "Speaker Playback Volume",
2416 "Mono Playback Volume",
2134ea4f 2417 "Line-Out Playback Volume",
26f5df26 2418 "PCM Playback Volume",
2134ea4f
TI
2419 NULL,
2420};
2421
2422static const char *alc_slave_sws[] = {
2423 "Front Playback Switch",
2424 "Surround Playback Switch",
2425 "Center Playback Switch",
2426 "LFE Playback Switch",
2427 "Side Playback Switch",
2428 "Headphone Playback Switch",
2429 "Speaker Playback Switch",
2430 "Mono Playback Switch",
edb54a55 2431 "IEC958 Playback Switch",
23033b2b
TI
2432 "Line-Out Playback Switch",
2433 "PCM Playback Switch",
2134ea4f
TI
2434 NULL,
2435};
2436
1da177e4 2437/*
e9edcee0 2438 * build control elements
1da177e4 2439 */
603c4019 2440
5b0cb1d8
JK
2441#define NID_MAPPING (-1)
2442
2443#define SUBDEV_SPEAKER_ (0 << 6)
2444#define SUBDEV_HP_ (1 << 6)
2445#define SUBDEV_LINE_ (2 << 6)
2446#define SUBDEV_SPEAKER(x) (SUBDEV_SPEAKER_ | ((x) & 0x3f))
2447#define SUBDEV_HP(x) (SUBDEV_HP_ | ((x) & 0x3f))
2448#define SUBDEV_LINE(x) (SUBDEV_LINE_ | ((x) & 0x3f))
2449
603c4019
TI
2450static void alc_free_kctls(struct hda_codec *codec);
2451
67d634c0 2452#ifdef CONFIG_SND_HDA_INPUT_BEEP
45bdd1c1
TI
2453/* additional beep mixers; the actual parameters are overwritten at build */
2454static struct snd_kcontrol_new alc_beep_mixer[] = {
2455 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
123c07ae 2456 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
45bdd1c1
TI
2457 { } /* end */
2458};
67d634c0 2459#endif
45bdd1c1 2460
1da177e4
LT
2461static int alc_build_controls(struct hda_codec *codec)
2462{
2463 struct alc_spec *spec = codec->spec;
5b0cb1d8
JK
2464 struct snd_kcontrol *kctl;
2465 struct snd_kcontrol_new *knew;
2466 int i, j, err;
2467 unsigned int u;
2468 hda_nid_t nid;
1da177e4
LT
2469
2470 for (i = 0; i < spec->num_mixers; i++) {
2471 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2472 if (err < 0)
2473 return err;
2474 }
f9e336f6
TI
2475 if (spec->cap_mixer) {
2476 err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2477 if (err < 0)
2478 return err;
2479 }
1da177e4 2480 if (spec->multiout.dig_out_nid) {
9c7f852e
TI
2481 err = snd_hda_create_spdif_out_ctls(codec,
2482 spec->multiout.dig_out_nid);
1da177e4
LT
2483 if (err < 0)
2484 return err;
e64f14f4
TI
2485 if (!spec->no_analog) {
2486 err = snd_hda_create_spdif_share_sw(codec,
2487 &spec->multiout);
2488 if (err < 0)
2489 return err;
2490 spec->multiout.share_spdif = 1;
2491 }
1da177e4
LT
2492 }
2493 if (spec->dig_in_nid) {
2494 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2495 if (err < 0)
2496 return err;
2497 }
2134ea4f 2498
67d634c0 2499#ifdef CONFIG_SND_HDA_INPUT_BEEP
45bdd1c1
TI
2500 /* create beep controls if needed */
2501 if (spec->beep_amp) {
2502 struct snd_kcontrol_new *knew;
2503 for (knew = alc_beep_mixer; knew->name; knew++) {
2504 struct snd_kcontrol *kctl;
2505 kctl = snd_ctl_new1(knew, codec);
2506 if (!kctl)
2507 return -ENOMEM;
2508 kctl->private_value = spec->beep_amp;
5e26dfd0 2509 err = snd_hda_ctl_add(codec, 0, kctl);
45bdd1c1
TI
2510 if (err < 0)
2511 return err;
2512 }
2513 }
67d634c0 2514#endif
45bdd1c1 2515
2134ea4f 2516 /* if we have no master control, let's create it */
e64f14f4
TI
2517 if (!spec->no_analog &&
2518 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
1c82ed1b 2519 unsigned int vmaster_tlv[4];
2134ea4f 2520 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
1c82ed1b 2521 HDA_OUTPUT, vmaster_tlv);
2134ea4f 2522 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
1c82ed1b 2523 vmaster_tlv, alc_slave_vols);
2134ea4f
TI
2524 if (err < 0)
2525 return err;
2526 }
e64f14f4
TI
2527 if (!spec->no_analog &&
2528 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2134ea4f
TI
2529 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2530 NULL, alc_slave_sws);
2531 if (err < 0)
2532 return err;
2533 }
2534
5b0cb1d8
JK
2535 /* assign Capture Source enums to NID */
2536 kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
2537 if (!kctl)
2538 kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
2539 for (i = 0; kctl && i < kctl->count; i++) {
d1409ae4
TI
2540 hda_nid_t *nids = spec->capsrc_nids;
2541 if (!nids)
2542 nids = spec->adc_nids;
21949f00 2543 err = snd_hda_add_nid(codec, kctl, i, nids[i]);
5b0cb1d8
JK
2544 if (err < 0)
2545 return err;
2546 }
2547 if (spec->cap_mixer) {
2548 const char *kname = kctl ? kctl->id.name : NULL;
2549 for (knew = spec->cap_mixer; knew->name; knew++) {
2550 if (kname && strcmp(knew->name, kname) == 0)
2551 continue;
2552 kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2553 for (i = 0; kctl && i < kctl->count; i++) {
2554 err = snd_hda_add_nid(codec, kctl, i,
2555 spec->adc_nids[i]);
2556 if (err < 0)
2557 return err;
2558 }
2559 }
2560 }
2561
2562 /* other nid->control mapping */
2563 for (i = 0; i < spec->num_mixers; i++) {
2564 for (knew = spec->mixers[i]; knew->name; knew++) {
2565 if (knew->iface != NID_MAPPING)
2566 continue;
2567 kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2568 if (kctl == NULL)
2569 continue;
2570 u = knew->subdevice;
2571 for (j = 0; j < 4; j++, u >>= 8) {
2572 nid = u & 0x3f;
2573 if (nid == 0)
2574 continue;
2575 switch (u & 0xc0) {
2576 case SUBDEV_SPEAKER_:
2577 nid = spec->autocfg.speaker_pins[nid];
2578 break;
2579 case SUBDEV_LINE_:
2580 nid = spec->autocfg.line_out_pins[nid];
2581 break;
2582 case SUBDEV_HP_:
2583 nid = spec->autocfg.hp_pins[nid];
2584 break;
2585 default:
2586 continue;
2587 }
2588 err = snd_hda_add_nid(codec, kctl, 0, nid);
2589 if (err < 0)
2590 return err;
2591 }
2592 u = knew->private_value;
2593 for (j = 0; j < 4; j++, u >>= 8) {
2594 nid = u & 0xff;
2595 if (nid == 0)
2596 continue;
2597 err = snd_hda_add_nid(codec, kctl, 0, nid);
2598 if (err < 0)
2599 return err;
2600 }
2601 }
2602 }
bae84e70
TI
2603
2604 alc_free_kctls(codec); /* no longer needed */
2605
1da177e4
LT
2606 return 0;
2607}
2608
e9edcee0 2609
1da177e4
LT
2610/*
2611 * initialize the codec volumes, etc
2612 */
2613
e9edcee0
TI
2614/*
2615 * generic initialization of ADC, input mixers and output mixers
2616 */
2617static struct hda_verb alc880_volume_init_verbs[] = {
2618 /*
2619 * Unmute ADC0-2 and set the default input to mic-in
2620 */
71fe7b82 2621 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
e9edcee0 2622 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
71fe7b82 2623 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
e9edcee0 2624 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
71fe7b82 2625 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
e9edcee0 2626 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1da177e4 2627
e9edcee0
TI
2628 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2629 * mixer widget
9c7f852e
TI
2630 * Note: PASD motherboards uses the Line In 2 as the input for front
2631 * panel mic (mic 2)
1da177e4 2632 */
e9edcee0 2633 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
2634 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2635 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2636 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2637 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2638 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2639 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2640 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
1da177e4 2641
e9edcee0
TI
2642 /*
2643 * Set up output mixers (0x0c - 0x0f)
1da177e4 2644 */
e9edcee0
TI
2645 /* set vol=0 to output mixers */
2646 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2647 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2648 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2649 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2650 /* set up input amps for analog loopback */
2651 /* Amp Indices: DAC = 0, mixer = 1 */
05acb863
TI
2652 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2653 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
05acb863
TI
2654 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2655 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
05acb863
TI
2656 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2657 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
05acb863
TI
2658 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2659 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4
LT
2660
2661 { }
2662};
2663
e9edcee0
TI
2664/*
2665 * 3-stack pin configuration:
2666 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2667 */
2668static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2669 /*
2670 * preset connection lists of input pins
2671 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2672 */
2673 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2674 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2675 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2676
2677 /*
2678 * Set pin mode and muting
2679 */
2680 /* set front pin widgets 0x14 for output */
05acb863 2681 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0
TI
2682 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2683 /* Mic1 (rear panel) pin widget for input and vref at 80% */
2684 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2685 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2686 /* Mic2 (as headphone out) for HP output */
2687 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2688 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 2689 /* Line In pin widget for input */
05acb863 2690 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
e9edcee0
TI
2691 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2692 /* Line2 (as front mic) pin widget for input and vref at 80% */
2693 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2694 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1da177e4 2695 /* CD pin widget for input */
05acb863 2696 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1da177e4 2697
e9edcee0
TI
2698 { }
2699};
1da177e4 2700
e9edcee0
TI
2701/*
2702 * 5-stack pin configuration:
2703 * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
2704 * line-in/side = 0x1a, f-mic = 0x1b
2705 */
2706static struct hda_verb alc880_pin_5stack_init_verbs[] = {
2707 /*
2708 * preset connection lists of input pins
2709 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
1da177e4 2710 */
e9edcee0
TI
2711 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2712 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
1da177e4 2713
e9edcee0
TI
2714 /*
2715 * Set pin mode and muting
1da177e4 2716 */
e9edcee0
TI
2717 /* set pin widgets 0x14-0x17 for output */
2718 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2719 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2720 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2721 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2722 /* unmute pins for output (no gain on this amp) */
2723 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2724 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2725 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2726 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2727
2728 /* Mic1 (rear panel) pin widget for input and vref at 80% */
2729 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2730 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2731 /* Mic2 (as headphone out) for HP output */
2732 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2733 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2734 /* Line In pin widget for input */
2735 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2736 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2737 /* Line2 (as front mic) pin widget for input and vref at 80% */
2738 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2739 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2740 /* CD pin widget for input */
2741 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1da177e4
LT
2742
2743 { }
2744};
2745
e9edcee0
TI
2746/*
2747 * W810 pin configuration:
2748 * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
2749 */
2750static struct hda_verb alc880_pin_w810_init_verbs[] = {
2751 /* hphone/speaker input selector: front DAC */
2752 {0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
1da177e4 2753
05acb863 2754 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2755 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
05acb863 2756 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2757 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
05acb863 2758 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2759 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 2760
e9edcee0 2761 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
05acb863 2762 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1da177e4 2763
1da177e4
LT
2764 { }
2765};
2766
e9edcee0
TI
2767/*
2768 * Z71V pin configuration:
2769 * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
2770 */
2771static struct hda_verb alc880_pin_z71v_init_verbs[] = {
05acb863 2772 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2773 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
05acb863 2774 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
e9edcee0 2775 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
dfc0ff62 2776
16ded525 2777 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0 2778 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16ded525 2779 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0 2780 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16ded525
TI
2781
2782 { }
2783};
2784
e9edcee0
TI
2785/*
2786 * 6-stack pin configuration:
9c7f852e
TI
2787 * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
2788 * f-mic = 0x19, line = 0x1a, HP = 0x1b
e9edcee0
TI
2789 */
2790static struct hda_verb alc880_pin_6stack_init_verbs[] = {
2791 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2792
16ded525 2793 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2794 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2795 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2796 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2797 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2798 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2799 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0
TI
2800 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2801
16ded525 2802 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0 2803 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16ded525 2804 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0 2805 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16ded525 2806 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
e9edcee0 2807 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16ded525 2808 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
e9edcee0 2809 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2810 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
ea1fb29a 2811
e9edcee0
TI
2812 { }
2813};
2814
ccc656ce
KY
2815/*
2816 * Uniwill pin configuration:
2817 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
2818 * line = 0x1a
2819 */
2820static struct hda_verb alc880_uniwill_init_verbs[] = {
2821 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2822
2823 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2824 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2825 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2826 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2827 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2828 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2829 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2830 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2831 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2832 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2833 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2834 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2835 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2836 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2837
2838 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2839 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2840 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2841 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2842 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2843 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2844 /* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
2845 /* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
2846 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2847
2848 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2849 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
2850
2851 { }
2852};
2853
2854/*
2855* Uniwill P53
ea1fb29a 2856* HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
ccc656ce
KY
2857 */
2858static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
2859 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2860
2861 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2862 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2863 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2864 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2865 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2866 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2867 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2868 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2869 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2870 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2871 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2872 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2873
2874 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2875 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2876 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2877 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2878 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2879 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2880
2881 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2882 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
2883
2884 { }
2885};
2886
2cf9f0fc
TD
2887static struct hda_verb alc880_beep_init_verbs[] = {
2888 { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
2889 { }
2890};
2891
458a4fab
TI
2892/* auto-toggle front mic */
2893static void alc880_uniwill_mic_automute(struct hda_codec *codec)
2894{
2895 unsigned int present;
2896 unsigned char bits;
ccc656ce 2897
864f92be 2898 present = snd_hda_jack_detect(codec, 0x18);
47fd830a
TI
2899 bits = present ? HDA_AMP_MUTE : 0;
2900 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
458a4fab
TI
2901}
2902
4f5d1706 2903static void alc880_uniwill_setup(struct hda_codec *codec)
458a4fab 2904{
a9fd4f3f
TI
2905 struct alc_spec *spec = codec->spec;
2906
2907 spec->autocfg.hp_pins[0] = 0x14;
2908 spec->autocfg.speaker_pins[0] = 0x15;
2909 spec->autocfg.speaker_pins[0] = 0x16;
4f5d1706
TI
2910}
2911
2912static void alc880_uniwill_init_hook(struct hda_codec *codec)
2913{
a9fd4f3f 2914 alc_automute_amp(codec);
458a4fab 2915 alc880_uniwill_mic_automute(codec);
ccc656ce
KY
2916}
2917
2918static void alc880_uniwill_unsol_event(struct hda_codec *codec,
2919 unsigned int res)
2920{
2921 /* Looks like the unsol event is incompatible with the standard
2922 * definition. 4bit tag is placed at 28 bit!
2923 */
458a4fab 2924 switch (res >> 28) {
458a4fab
TI
2925 case ALC880_MIC_EVENT:
2926 alc880_uniwill_mic_automute(codec);
2927 break;
a9fd4f3f
TI
2928 default:
2929 alc_automute_amp_unsol_event(codec, res);
2930 break;
458a4fab 2931 }
ccc656ce
KY
2932}
2933
4f5d1706 2934static void alc880_uniwill_p53_setup(struct hda_codec *codec)
ccc656ce 2935{
a9fd4f3f 2936 struct alc_spec *spec = codec->spec;
ccc656ce 2937
a9fd4f3f
TI
2938 spec->autocfg.hp_pins[0] = 0x14;
2939 spec->autocfg.speaker_pins[0] = 0x15;
ccc656ce
KY
2940}
2941
2942static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
2943{
2944 unsigned int present;
ea1fb29a 2945
ccc656ce 2946 present = snd_hda_codec_read(codec, 0x21, 0,
47fd830a
TI
2947 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
2948 present &= HDA_AMP_VOLMASK;
2949 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
2950 HDA_AMP_VOLMASK, present);
2951 snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
2952 HDA_AMP_VOLMASK, present);
ccc656ce 2953}
47fd830a 2954
ccc656ce
KY
2955static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
2956 unsigned int res)
2957{
2958 /* Looks like the unsol event is incompatible with the standard
2959 * definition. 4bit tag is placed at 28 bit!
2960 */
f12ab1e0 2961 if ((res >> 28) == ALC880_DCVOL_EVENT)
ccc656ce 2962 alc880_uniwill_p53_dcvol_automute(codec);
a9fd4f3f
TI
2963 else
2964 alc_automute_amp_unsol_event(codec, res);
ccc656ce
KY
2965}
2966
e9edcee0
TI
2967/*
2968 * F1734 pin configuration:
2969 * HP = 0x14, speaker-out = 0x15, mic = 0x18
2970 */
2971static struct hda_verb alc880_pin_f1734_init_verbs[] = {
ee7a9c7c 2972 {0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
16ded525
TI
2973 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
2974 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
2975 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
2976 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
2977
e9edcee0 2978 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16ded525 2979 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
e9edcee0 2980 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16ded525 2981 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2982
e9edcee0
TI
2983 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2984 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
ee7a9c7c 2985 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
e9edcee0 2986 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16ded525 2987 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2988 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2989 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2990 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2991 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
dfc0ff62 2992
937b4160
TI
2993 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
2994 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
2995
dfc0ff62
TI
2996 { }
2997};
2998
e9edcee0
TI
2999/*
3000 * ASUS pin configuration:
3001 * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
3002 */
3003static struct hda_verb alc880_pin_asus_init_verbs[] = {
16ded525
TI
3004 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3005 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3006 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3007 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3008
3009 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
e9edcee0 3010 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 3011 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 3012 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 3013 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 3014 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 3015 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0
TI
3016 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3017
3018 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3019 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3020 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3021 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3022 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3023 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16ded525 3024 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 3025 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 3026 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
ea1fb29a 3027
e9edcee0
TI
3028 { }
3029};
16ded525 3030
e9edcee0 3031/* Enable GPIO mask and set output */
bc9f98a9
KY
3032#define alc880_gpio1_init_verbs alc_gpio1_init_verbs
3033#define alc880_gpio2_init_verbs alc_gpio2_init_verbs
64a8be74 3034#define alc880_gpio3_init_verbs alc_gpio3_init_verbs
df694daa
KY
3035
3036/* Clevo m520g init */
3037static struct hda_verb alc880_pin_clevo_init_verbs[] = {
3038 /* headphone output */
3039 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3040 /* line-out */
3041 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3042 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3043 /* Line-in */
3044 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3045 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3046 /* CD */
3047 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3048 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3049 /* Mic1 (rear panel) */
3050 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3051 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3052 /* Mic2 (front panel) */
3053 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3054 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3055 /* headphone */
3056 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3057 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3058 /* change to EAPD mode */
3059 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3060 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
3061
3062 { }
16ded525
TI
3063};
3064
df694daa 3065static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
4b146cb0
TI
3066 /* change to EAPD mode */
3067 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3068 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
3069
df694daa
KY
3070 /* Headphone output */
3071 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3072 /* Front output*/
3073 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3074 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
3075
3076 /* Line In pin widget for input */
3077 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3078 /* CD pin widget for input */
3079 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3080 /* Mic1 (rear panel) pin widget for input and vref at 80% */
3081 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3082
3083 /* change to EAPD mode */
3084 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3085 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
3086
3087 { }
3088};
16ded525 3089
e9edcee0 3090/*
ae6b813a
TI
3091 * LG m1 express dual
3092 *
3093 * Pin assignment:
3094 * Rear Line-In/Out (blue): 0x14
3095 * Build-in Mic-In: 0x15
3096 * Speaker-out: 0x17
3097 * HP-Out (green): 0x1b
3098 * Mic-In/Out (red): 0x19
3099 * SPDIF-Out: 0x1e
3100 */
3101
3102/* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
3103static hda_nid_t alc880_lg_dac_nids[3] = {
3104 0x05, 0x02, 0x03
3105};
3106
3107/* seems analog CD is not working */
3108static struct hda_input_mux alc880_lg_capture_source = {
3109 .num_items = 3,
3110 .items = {
3111 { "Mic", 0x1 },
3112 { "Line", 0x5 },
3113 { "Internal Mic", 0x6 },
3114 },
3115};
3116
3117/* 2,4,6 channel modes */
3118static struct hda_verb alc880_lg_ch2_init[] = {
3119 /* set line-in and mic-in to input */
3120 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3121 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3122 { }
3123};
3124
3125static struct hda_verb alc880_lg_ch4_init[] = {
3126 /* set line-in to out and mic-in to input */
3127 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3128 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3129 { }
3130};
3131
3132static struct hda_verb alc880_lg_ch6_init[] = {
3133 /* set line-in and mic-in to output */
3134 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3135 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3136 { }
3137};
3138
3139static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3140 { 2, alc880_lg_ch2_init },
3141 { 4, alc880_lg_ch4_init },
3142 { 6, alc880_lg_ch6_init },
3143};
3144
3145static struct snd_kcontrol_new alc880_lg_mixer[] = {
2134ea4f
TI
3146 HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3147 HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
ae6b813a
TI
3148 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3149 HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3150 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3151 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3152 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3153 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3154 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3155 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3156 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3157 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3158 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3159 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3160 {
3161 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3162 .name = "Channel Mode",
3163 .info = alc_ch_mode_info,
3164 .get = alc_ch_mode_get,
3165 .put = alc_ch_mode_put,
3166 },
3167 { } /* end */
3168};
3169
3170static struct hda_verb alc880_lg_init_verbs[] = {
3171 /* set capture source to mic-in */
3172 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3173 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3174 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3175 /* mute all amp mixer inputs */
3176 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
cb53c626
TI
3177 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3178 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
ae6b813a
TI
3179 /* line-in to input */
3180 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3181 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3182 /* built-in mic */
3183 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3184 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3185 /* speaker-out */
3186 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3187 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3188 /* mic-in to input */
3189 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3190 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3191 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3192 /* HP-out */
3193 {0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3194 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3195 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3196 /* jack sense */
a9fd4f3f 3197 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
ae6b813a
TI
3198 { }
3199};
3200
3201/* toggle speaker-output according to the hp-jack state */
4f5d1706 3202static void alc880_lg_setup(struct hda_codec *codec)
ae6b813a 3203{
a9fd4f3f 3204 struct alc_spec *spec = codec->spec;
ae6b813a 3205
a9fd4f3f
TI
3206 spec->autocfg.hp_pins[0] = 0x1b;
3207 spec->autocfg.speaker_pins[0] = 0x17;
ae6b813a
TI
3208}
3209
d681518a
TI
3210/*
3211 * LG LW20
3212 *
3213 * Pin assignment:
3214 * Speaker-out: 0x14
3215 * Mic-In: 0x18
e4f41da9
CM
3216 * Built-in Mic-In: 0x19
3217 * Line-In: 0x1b
3218 * HP-Out: 0x1a
d681518a
TI
3219 * SPDIF-Out: 0x1e
3220 */
3221
d681518a 3222static struct hda_input_mux alc880_lg_lw_capture_source = {
e4f41da9 3223 .num_items = 3,
d681518a
TI
3224 .items = {
3225 { "Mic", 0x0 },
3226 { "Internal Mic", 0x1 },
e4f41da9 3227 { "Line In", 0x2 },
d681518a
TI
3228 },
3229};
3230
0a8c5da3
CM
3231#define alc880_lg_lw_modes alc880_threestack_modes
3232
d681518a 3233static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
0a8c5da3
CM
3234 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3235 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3236 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3237 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3238 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3239 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3240 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3241 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3242 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3243 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
d681518a
TI
3244 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3245 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3246 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3247 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
0a8c5da3
CM
3248 {
3249 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3250 .name = "Channel Mode",
3251 .info = alc_ch_mode_info,
3252 .get = alc_ch_mode_get,
3253 .put = alc_ch_mode_put,
3254 },
d681518a
TI
3255 { } /* end */
3256};
3257
3258static struct hda_verb alc880_lg_lw_init_verbs[] = {
0a8c5da3
CM
3259 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3260 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3261 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3262
d681518a
TI
3263 /* set capture source to mic-in */
3264 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3265 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3266 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
cb53c626 3267 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
d681518a
TI
3268 /* speaker-out */
3269 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3270 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3271 /* HP-out */
d681518a
TI
3272 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3273 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3274 /* mic-in to input */
3275 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3276 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3277 /* built-in mic */
3278 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3279 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3280 /* jack sense */
a9fd4f3f 3281 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
d681518a
TI
3282 { }
3283};
3284
3285/* toggle speaker-output according to the hp-jack state */
4f5d1706 3286static void alc880_lg_lw_setup(struct hda_codec *codec)
d681518a 3287{
a9fd4f3f 3288 struct alc_spec *spec = codec->spec;
d681518a 3289
a9fd4f3f
TI
3290 spec->autocfg.hp_pins[0] = 0x1b;
3291 spec->autocfg.speaker_pins[0] = 0x14;
d681518a
TI
3292}
3293
df99cd33
TI
3294static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3295 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3296 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3297 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3298 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3299 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3300 HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3301 { } /* end */
3302};
3303
3304static struct hda_input_mux alc880_medion_rim_capture_source = {
3305 .num_items = 2,
3306 .items = {
3307 { "Mic", 0x0 },
3308 { "Internal Mic", 0x1 },
3309 },
3310};
3311
3312static struct hda_verb alc880_medion_rim_init_verbs[] = {
3313 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3314
3315 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3316 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3317
3318 /* Mic1 (rear panel) pin widget for input and vref at 80% */
3319 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3320 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3321 /* Mic2 (as headphone out) for HP output */
3322 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3323 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3324 /* Internal Speaker */
3325 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3326 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3327
3328 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3329 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
3330
3331 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3332 { }
3333};
3334
3335/* toggle speaker-output according to the hp-jack state */
3336static void alc880_medion_rim_automute(struct hda_codec *codec)
3337{
a9fd4f3f
TI
3338 struct alc_spec *spec = codec->spec;
3339 alc_automute_amp(codec);
3340 /* toggle EAPD */
3341 if (spec->jack_present)
df99cd33
TI
3342 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3343 else
3344 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3345}
3346
3347static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3348 unsigned int res)
3349{
3350 /* Looks like the unsol event is incompatible with the standard
3351 * definition. 4bit tag is placed at 28 bit!
3352 */
3353 if ((res >> 28) == ALC880_HP_EVENT)
3354 alc880_medion_rim_automute(codec);
3355}
3356
4f5d1706 3357static void alc880_medion_rim_setup(struct hda_codec *codec)
a9fd4f3f
TI
3358{
3359 struct alc_spec *spec = codec->spec;
3360
3361 spec->autocfg.hp_pins[0] = 0x14;
3362 spec->autocfg.speaker_pins[0] = 0x1b;
a9fd4f3f
TI
3363}
3364
cb53c626
TI
3365#ifdef CONFIG_SND_HDA_POWER_SAVE
3366static struct hda_amp_list alc880_loopbacks[] = {
3367 { 0x0b, HDA_INPUT, 0 },
3368 { 0x0b, HDA_INPUT, 1 },
3369 { 0x0b, HDA_INPUT, 2 },
3370 { 0x0b, HDA_INPUT, 3 },
3371 { 0x0b, HDA_INPUT, 4 },
3372 { } /* end */
3373};
3374
3375static struct hda_amp_list alc880_lg_loopbacks[] = {
3376 { 0x0b, HDA_INPUT, 1 },
3377 { 0x0b, HDA_INPUT, 6 },
3378 { 0x0b, HDA_INPUT, 7 },
3379 { } /* end */
3380};
3381#endif
3382
ae6b813a
TI
3383/*
3384 * Common callbacks
e9edcee0
TI
3385 */
3386
1da177e4
LT
3387static int alc_init(struct hda_codec *codec)
3388{
3389 struct alc_spec *spec = codec->spec;
e9edcee0
TI
3390 unsigned int i;
3391
2c3bf9ab 3392 alc_fix_pll(codec);
4a79ba34 3393 alc_auto_init_amp(codec, spec->init_amp);
2c3bf9ab 3394
e9edcee0
TI
3395 for (i = 0; i < spec->num_init_verbs; i++)
3396 snd_hda_sequence_write(codec, spec->init_verbs[i]);
ae6b813a
TI
3397
3398 if (spec->init_hook)
3399 spec->init_hook(codec);
3400
1da177e4
LT
3401 return 0;
3402}
3403
ae6b813a
TI
3404static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3405{
3406 struct alc_spec *spec = codec->spec;
3407
3408 if (spec->unsol_event)
3409 spec->unsol_event(codec, res);
3410}
3411
cb53c626
TI
3412#ifdef CONFIG_SND_HDA_POWER_SAVE
3413static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3414{
3415 struct alc_spec *spec = codec->spec;
3416 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3417}
3418#endif
3419
1da177e4
LT
3420/*
3421 * Analog playback callbacks
3422 */
3423static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3424 struct hda_codec *codec,
c8b6bf9b 3425 struct snd_pcm_substream *substream)
1da177e4
LT
3426{
3427 struct alc_spec *spec = codec->spec;
9a08160b
TI
3428 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3429 hinfo);
1da177e4
LT
3430}
3431
3432static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3433 struct hda_codec *codec,
3434 unsigned int stream_tag,
3435 unsigned int format,
c8b6bf9b 3436 struct snd_pcm_substream *substream)
1da177e4
LT
3437{
3438 struct alc_spec *spec = codec->spec;
9c7f852e
TI
3439 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3440 stream_tag, format, substream);
1da177e4
LT
3441}
3442
3443static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3444 struct hda_codec *codec,
c8b6bf9b 3445 struct snd_pcm_substream *substream)
1da177e4
LT
3446{
3447 struct alc_spec *spec = codec->spec;
3448 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3449}
3450
3451/*
3452 * Digital out
3453 */
3454static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3455 struct hda_codec *codec,
c8b6bf9b 3456 struct snd_pcm_substream *substream)
1da177e4
LT
3457{
3458 struct alc_spec *spec = codec->spec;
3459 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3460}
3461
6b97eb45
TI
3462static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3463 struct hda_codec *codec,
3464 unsigned int stream_tag,
3465 unsigned int format,
3466 struct snd_pcm_substream *substream)
3467{
3468 struct alc_spec *spec = codec->spec;
3469 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3470 stream_tag, format, substream);
3471}
3472
9b5f12e5
TI
3473static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3474 struct hda_codec *codec,
3475 struct snd_pcm_substream *substream)
3476{
3477 struct alc_spec *spec = codec->spec;
3478 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3479}
3480
1da177e4
LT
3481static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3482 struct hda_codec *codec,
c8b6bf9b 3483 struct snd_pcm_substream *substream)
1da177e4
LT
3484{
3485 struct alc_spec *spec = codec->spec;
3486 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3487}
3488
3489/*
3490 * Analog capture
3491 */
6330079f 3492static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
1da177e4
LT
3493 struct hda_codec *codec,
3494 unsigned int stream_tag,
3495 unsigned int format,
c8b6bf9b 3496 struct snd_pcm_substream *substream)
1da177e4
LT
3497{
3498 struct alc_spec *spec = codec->spec;
3499
6330079f 3500 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
1da177e4
LT
3501 stream_tag, 0, format);
3502 return 0;
3503}
3504
6330079f 3505static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
1da177e4 3506 struct hda_codec *codec,
c8b6bf9b 3507 struct snd_pcm_substream *substream)
1da177e4
LT
3508{
3509 struct alc_spec *spec = codec->spec;
3510
888afa15
TI
3511 snd_hda_codec_cleanup_stream(codec,
3512 spec->adc_nids[substream->number + 1]);
1da177e4
LT
3513 return 0;
3514}
3515
3516
3517/*
3518 */
3519static struct hda_pcm_stream alc880_pcm_analog_playback = {
3520 .substreams = 1,
3521 .channels_min = 2,
3522 .channels_max = 8,
e9edcee0 3523 /* NID is set in alc_build_pcms */
1da177e4
LT
3524 .ops = {
3525 .open = alc880_playback_pcm_open,
3526 .prepare = alc880_playback_pcm_prepare,
3527 .cleanup = alc880_playback_pcm_cleanup
3528 },
3529};
3530
3531static struct hda_pcm_stream alc880_pcm_analog_capture = {
6330079f
TI
3532 .substreams = 1,
3533 .channels_min = 2,
3534 .channels_max = 2,
3535 /* NID is set in alc_build_pcms */
3536};
3537
3538static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3539 .substreams = 1,
3540 .channels_min = 2,
3541 .channels_max = 2,
3542 /* NID is set in alc_build_pcms */
3543};
3544
3545static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3546 .substreams = 2, /* can be overridden */
1da177e4
LT
3547 .channels_min = 2,
3548 .channels_max = 2,
e9edcee0 3549 /* NID is set in alc_build_pcms */
1da177e4 3550 .ops = {
6330079f
TI
3551 .prepare = alc880_alt_capture_pcm_prepare,
3552 .cleanup = alc880_alt_capture_pcm_cleanup
1da177e4
LT
3553 },
3554};
3555
3556static struct hda_pcm_stream alc880_pcm_digital_playback = {
3557 .substreams = 1,
3558 .channels_min = 2,
3559 .channels_max = 2,
3560 /* NID is set in alc_build_pcms */
3561 .ops = {
3562 .open = alc880_dig_playback_pcm_open,
6b97eb45 3563 .close = alc880_dig_playback_pcm_close,
9b5f12e5
TI
3564 .prepare = alc880_dig_playback_pcm_prepare,
3565 .cleanup = alc880_dig_playback_pcm_cleanup
1da177e4
LT
3566 },
3567};
3568
3569static struct hda_pcm_stream alc880_pcm_digital_capture = {
3570 .substreams = 1,
3571 .channels_min = 2,
3572 .channels_max = 2,
3573 /* NID is set in alc_build_pcms */
3574};
3575
4c5186ed 3576/* Used by alc_build_pcms to flag that a PCM has no playback stream */
6330079f 3577static struct hda_pcm_stream alc_pcm_null_stream = {
4c5186ed
JW
3578 .substreams = 0,
3579 .channels_min = 0,
3580 .channels_max = 0,
3581};
3582
1da177e4
LT
3583static int alc_build_pcms(struct hda_codec *codec)
3584{
3585 struct alc_spec *spec = codec->spec;
3586 struct hda_pcm *info = spec->pcm_rec;
3587 int i;
3588
3589 codec->num_pcms = 1;
3590 codec->pcm_info = info;
3591
e64f14f4
TI
3592 if (spec->no_analog)
3593 goto skip_analog;
3594
812a2cca
TI
3595 snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3596 "%s Analog", codec->chip_name);
1da177e4 3597 info->name = spec->stream_name_analog;
274693f3 3598
4a471b7d 3599 if (spec->stream_analog_playback) {
da3cec35
TI
3600 if (snd_BUG_ON(!spec->multiout.dac_nids))
3601 return -EINVAL;
4a471b7d
TI
3602 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3603 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3604 }
3605 if (spec->stream_analog_capture) {
da3cec35
TI
3606 if (snd_BUG_ON(!spec->adc_nids))
3607 return -EINVAL;
4a471b7d
TI
3608 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3609 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3610 }
3611
3612 if (spec->channel_mode) {
3613 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3614 for (i = 0; i < spec->num_channel_mode; i++) {
3615 if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3616 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3617 }
1da177e4
LT
3618 }
3619 }
3620
e64f14f4 3621 skip_analog:
e08a007d 3622 /* SPDIF for stream index #1 */
1da177e4 3623 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
812a2cca
TI
3624 snprintf(spec->stream_name_digital,
3625 sizeof(spec->stream_name_digital),
3626 "%s Digital", codec->chip_name);
e08a007d 3627 codec->num_pcms = 2;
b25c9da1 3628 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
c06134d7 3629 info = spec->pcm_rec + 1;
1da177e4 3630 info->name = spec->stream_name_digital;
8c441982
TI
3631 if (spec->dig_out_type)
3632 info->pcm_type = spec->dig_out_type;
3633 else
3634 info->pcm_type = HDA_PCM_TYPE_SPDIF;
4a471b7d
TI
3635 if (spec->multiout.dig_out_nid &&
3636 spec->stream_digital_playback) {
1da177e4
LT
3637 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3638 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3639 }
4a471b7d
TI
3640 if (spec->dig_in_nid &&
3641 spec->stream_digital_capture) {
1da177e4
LT
3642 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3643 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3644 }
963f803f
TI
3645 /* FIXME: do we need this for all Realtek codec models? */
3646 codec->spdif_status_reset = 1;
1da177e4
LT
3647 }
3648
e64f14f4
TI
3649 if (spec->no_analog)
3650 return 0;
3651
e08a007d
TI
3652 /* If the use of more than one ADC is requested for the current
3653 * model, configure a second analog capture-only PCM.
3654 */
3655 /* Additional Analaog capture for index #2 */
6330079f
TI
3656 if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
3657 (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
e08a007d 3658 codec->num_pcms = 3;
c06134d7 3659 info = spec->pcm_rec + 2;
e08a007d 3660 info->name = spec->stream_name_analog;
6330079f
TI
3661 if (spec->alt_dac_nid) {
3662 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3663 *spec->stream_analog_alt_playback;
3664 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3665 spec->alt_dac_nid;
3666 } else {
3667 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3668 alc_pcm_null_stream;
3669 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3670 }
3671 if (spec->num_adc_nids > 1) {
3672 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3673 *spec->stream_analog_alt_capture;
3674 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3675 spec->adc_nids[1];
3676 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3677 spec->num_adc_nids - 1;
3678 } else {
3679 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3680 alc_pcm_null_stream;
3681 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
e08a007d
TI
3682 }
3683 }
3684
1da177e4
LT
3685 return 0;
3686}
3687
a4e09aa3
TI
3688static inline void alc_shutup(struct hda_codec *codec)
3689{
3690 snd_hda_shutup_pins(codec);
3691}
3692
603c4019
TI
3693static void alc_free_kctls(struct hda_codec *codec)
3694{
3695 struct alc_spec *spec = codec->spec;
3696
3697 if (spec->kctls.list) {
3698 struct snd_kcontrol_new *kctl = spec->kctls.list;
3699 int i;
3700 for (i = 0; i < spec->kctls.used; i++)
3701 kfree(kctl[i].name);
3702 }
3703 snd_array_free(&spec->kctls);
3704}
3705
1da177e4
LT
3706static void alc_free(struct hda_codec *codec)
3707{
e9edcee0 3708 struct alc_spec *spec = codec->spec;
e9edcee0 3709
f12ab1e0 3710 if (!spec)
e9edcee0
TI
3711 return;
3712
a4e09aa3 3713 alc_shutup(codec);
603c4019 3714 alc_free_kctls(codec);
e9edcee0 3715 kfree(spec);
680cd536 3716 snd_hda_detach_beep_device(codec);
1da177e4
LT
3717}
3718
f5de24b0 3719#ifdef CONFIG_SND_HDA_POWER_SAVE
c97259df
DC
3720static void alc_power_eapd(struct hda_codec *codec)
3721{
3722 /* We currently only handle front, HP */
3723 switch (codec->vendor_id) {
3724 case 0x10ec0260:
9e4c8496
TI
3725 set_eapd(codec, 0x0f, 0);
3726 set_eapd(codec, 0x10, 0);
c97259df
DC
3727 break;
3728 case 0x10ec0262:
3729 case 0x10ec0267:
3730 case 0x10ec0268:
3731 case 0x10ec0269:
9e4c8496 3732 case 0x10ec0270:
c97259df
DC
3733 case 0x10ec0272:
3734 case 0x10ec0660:
3735 case 0x10ec0662:
3736 case 0x10ec0663:
3737 case 0x10ec0862:
3738 case 0x10ec0889:
9e4c8496
TI
3739 set_eapd(codec, 0x14, 0);
3740 set_eapd(codec, 0x15, 0);
c97259df
DC
3741 break;
3742 }
3743}
3744
f5de24b0
HM
3745static int alc_suspend(struct hda_codec *codec, pm_message_t state)
3746{
3747 struct alc_spec *spec = codec->spec;
a4e09aa3 3748 alc_shutup(codec);
f5de24b0 3749 if (spec && spec->power_hook)
c97259df 3750 spec->power_hook(codec);
f5de24b0
HM
3751 return 0;
3752}
3753#endif
3754
e044c39a 3755#ifdef SND_HDA_NEEDS_RESUME
e044c39a
TI
3756static int alc_resume(struct hda_codec *codec)
3757{
e044c39a
TI
3758 codec->patch_ops.init(codec);
3759 snd_hda_codec_resume_amp(codec);
3760 snd_hda_codec_resume_cache(codec);
3761 return 0;
3762}
e044c39a
TI
3763#endif
3764
1da177e4
LT
3765/*
3766 */
3767static struct hda_codec_ops alc_patch_ops = {
3768 .build_controls = alc_build_controls,
3769 .build_pcms = alc_build_pcms,
3770 .init = alc_init,
3771 .free = alc_free,
ae6b813a 3772 .unsol_event = alc_unsol_event,
e044c39a
TI
3773#ifdef SND_HDA_NEEDS_RESUME
3774 .resume = alc_resume,
3775#endif
cb53c626 3776#ifdef CONFIG_SND_HDA_POWER_SAVE
f5de24b0 3777 .suspend = alc_suspend,
cb53c626
TI
3778 .check_power_status = alc_check_power_status,
3779#endif
c97259df 3780 .reboot_notify = alc_shutup,
1da177e4
LT
3781};
3782
2fa522be
TI
3783
3784/*
3785 * Test configuration for debugging
3786 *
3787 * Almost all inputs/outputs are enabled. I/O pins can be configured via
3788 * enum controls.
3789 */
3790#ifdef CONFIG_SND_DEBUG
3791static hda_nid_t alc880_test_dac_nids[4] = {
3792 0x02, 0x03, 0x04, 0x05
3793};
3794
3795static struct hda_input_mux alc880_test_capture_source = {
ae6b813a 3796 .num_items = 7,
2fa522be
TI
3797 .items = {
3798 { "In-1", 0x0 },
3799 { "In-2", 0x1 },
3800 { "In-3", 0x2 },
3801 { "In-4", 0x3 },
3802 { "CD", 0x4 },
ae6b813a
TI
3803 { "Front", 0x5 },
3804 { "Surround", 0x6 },
2fa522be
TI
3805 },
3806};
3807
d2a6d7dc 3808static struct hda_channel_mode alc880_test_modes[4] = {
2fa522be 3809 { 2, NULL },
fd2c326d 3810 { 4, NULL },
2fa522be 3811 { 6, NULL },
fd2c326d 3812 { 8, NULL },
2fa522be
TI
3813};
3814
9c7f852e
TI
3815static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
3816 struct snd_ctl_elem_info *uinfo)
2fa522be
TI
3817{
3818 static char *texts[] = {
3819 "N/A", "Line Out", "HP Out",
3820 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
3821 };
3822 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3823 uinfo->count = 1;
3824 uinfo->value.enumerated.items = 8;
3825 if (uinfo->value.enumerated.item >= 8)
3826 uinfo->value.enumerated.item = 7;
3827 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3828 return 0;
3829}
3830
9c7f852e
TI
3831static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
3832 struct snd_ctl_elem_value *ucontrol)
2fa522be
TI
3833{
3834 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3835 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3836 unsigned int pin_ctl, item = 0;
3837
3838 pin_ctl = snd_hda_codec_read(codec, nid, 0,
3839 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3840 if (pin_ctl & AC_PINCTL_OUT_EN) {
3841 if (pin_ctl & AC_PINCTL_HP_EN)
3842 item = 2;
3843 else
3844 item = 1;
3845 } else if (pin_ctl & AC_PINCTL_IN_EN) {
3846 switch (pin_ctl & AC_PINCTL_VREFEN) {
3847 case AC_PINCTL_VREF_HIZ: item = 3; break;
3848 case AC_PINCTL_VREF_50: item = 4; break;
3849 case AC_PINCTL_VREF_GRD: item = 5; break;
3850 case AC_PINCTL_VREF_80: item = 6; break;
3851 case AC_PINCTL_VREF_100: item = 7; break;
3852 }
3853 }
3854 ucontrol->value.enumerated.item[0] = item;
3855 return 0;
3856}
3857
9c7f852e
TI
3858static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
3859 struct snd_ctl_elem_value *ucontrol)
2fa522be
TI
3860{
3861 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3862 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3863 static unsigned int ctls[] = {
3864 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
3865 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
3866 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
3867 AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
3868 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
3869 AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
3870 };
3871 unsigned int old_ctl, new_ctl;
3872
3873 old_ctl = snd_hda_codec_read(codec, nid, 0,
3874 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3875 new_ctl = ctls[ucontrol->value.enumerated.item[0]];
3876 if (old_ctl != new_ctl) {
82beb8fd
TI
3877 int val;
3878 snd_hda_codec_write_cache(codec, nid, 0,
3879 AC_VERB_SET_PIN_WIDGET_CONTROL,
3880 new_ctl);
47fd830a
TI
3881 val = ucontrol->value.enumerated.item[0] >= 3 ?
3882 HDA_AMP_MUTE : 0;
3883 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3884 HDA_AMP_MUTE, val);
2fa522be
TI
3885 return 1;
3886 }
3887 return 0;
3888}
3889
9c7f852e
TI
3890static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
3891 struct snd_ctl_elem_info *uinfo)
2fa522be
TI
3892{
3893 static char *texts[] = {
3894 "Front", "Surround", "CLFE", "Side"
3895 };
3896 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3897 uinfo->count = 1;
3898 uinfo->value.enumerated.items = 4;
3899 if (uinfo->value.enumerated.item >= 4)
3900 uinfo->value.enumerated.item = 3;
3901 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3902 return 0;
3903}
3904
9c7f852e
TI
3905static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
3906 struct snd_ctl_elem_value *ucontrol)
2fa522be
TI
3907{
3908 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3909 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3910 unsigned int sel;
3911
3912 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
3913 ucontrol->value.enumerated.item[0] = sel & 3;
3914 return 0;
3915}
3916
9c7f852e
TI
3917static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
3918 struct snd_ctl_elem_value *ucontrol)
2fa522be
TI
3919{
3920 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3921 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3922 unsigned int sel;
3923
3924 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
3925 if (ucontrol->value.enumerated.item[0] != sel) {
3926 sel = ucontrol->value.enumerated.item[0] & 3;
82beb8fd
TI
3927 snd_hda_codec_write_cache(codec, nid, 0,
3928 AC_VERB_SET_CONNECT_SEL, sel);
2fa522be
TI
3929 return 1;
3930 }
3931 return 0;
3932}
3933
3934#define PIN_CTL_TEST(xname,nid) { \
3935 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3936 .name = xname, \
5b0cb1d8 3937 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
2fa522be
TI
3938 .info = alc_test_pin_ctl_info, \
3939 .get = alc_test_pin_ctl_get, \
3940 .put = alc_test_pin_ctl_put, \
3941 .private_value = nid \
3942 }
3943
3944#define PIN_SRC_TEST(xname,nid) { \
3945 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3946 .name = xname, \
5b0cb1d8 3947 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
2fa522be
TI
3948 .info = alc_test_pin_src_info, \
3949 .get = alc_test_pin_src_get, \
3950 .put = alc_test_pin_src_put, \
3951 .private_value = nid \
3952 }
3953
c8b6bf9b 3954static struct snd_kcontrol_new alc880_test_mixer[] = {
05acb863
TI
3955 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3956 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
3957 HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
3958 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
985be54b
TI
3959 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3960 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
3961 HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
3962 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2fa522be
TI
3963 PIN_CTL_TEST("Front Pin Mode", 0x14),
3964 PIN_CTL_TEST("Surround Pin Mode", 0x15),
3965 PIN_CTL_TEST("CLFE Pin Mode", 0x16),
3966 PIN_CTL_TEST("Side Pin Mode", 0x17),
3967 PIN_CTL_TEST("In-1 Pin Mode", 0x18),
3968 PIN_CTL_TEST("In-2 Pin Mode", 0x19),
3969 PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
3970 PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
3971 PIN_SRC_TEST("In-1 Pin Source", 0x18),
3972 PIN_SRC_TEST("In-2 Pin Source", 0x19),
3973 PIN_SRC_TEST("In-3 Pin Source", 0x1a),
3974 PIN_SRC_TEST("In-4 Pin Source", 0x1b),
3975 HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
3976 HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
3977 HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
3978 HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
3979 HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
3980 HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
3981 HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
3982 HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
3983 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
3984 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
2fa522be
TI
3985 {
3986 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3987 .name = "Channel Mode",
df694daa
KY
3988 .info = alc_ch_mode_info,
3989 .get = alc_ch_mode_get,
3990 .put = alc_ch_mode_put,
2fa522be
TI
3991 },
3992 { } /* end */
3993};
3994
3995static struct hda_verb alc880_test_init_verbs[] = {
3996 /* Unmute inputs of 0x0c - 0x0f */
05acb863
TI
3997 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3998 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3999 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4000 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4001 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4002 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4003 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4004 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2fa522be 4005 /* Vol output for 0x0c-0x0f */
05acb863
TI
4006 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4007 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4008 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4009 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2fa522be 4010 /* Set output pins 0x14-0x17 */
05acb863
TI
4011 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4012 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4013 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4014 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2fa522be 4015 /* Unmute output pins 0x14-0x17 */
05acb863
TI
4016 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4017 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4018 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4019 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2fa522be 4020 /* Set input pins 0x18-0x1c */
16ded525
TI
4021 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4022 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
05acb863
TI
4023 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4024 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4025 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2fa522be 4026 /* Mute input pins 0x18-0x1b */
05acb863
TI
4027 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4028 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4029 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4030 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
71fe7b82 4031 /* ADC set up */
05acb863 4032 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
71fe7b82 4033 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
05acb863 4034 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
71fe7b82 4035 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
05acb863 4036 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
71fe7b82 4037 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
05acb863
TI
4038 /* Analog input/passthru */
4039 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4040 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4041 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4042 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4043 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2fa522be
TI
4044 { }
4045};
4046#endif
4047
1da177e4
LT
4048/*
4049 */
4050
f5fcc13c
TI
4051static const char *alc880_models[ALC880_MODEL_LAST] = {
4052 [ALC880_3ST] = "3stack",
4053 [ALC880_TCL_S700] = "tcl",
4054 [ALC880_3ST_DIG] = "3stack-digout",
4055 [ALC880_CLEVO] = "clevo",
4056 [ALC880_5ST] = "5stack",
4057 [ALC880_5ST_DIG] = "5stack-digout",
4058 [ALC880_W810] = "w810",
4059 [ALC880_Z71V] = "z71v",
4060 [ALC880_6ST] = "6stack",
4061 [ALC880_6ST_DIG] = "6stack-digout",
4062 [ALC880_ASUS] = "asus",
4063 [ALC880_ASUS_W1V] = "asus-w1v",
4064 [ALC880_ASUS_DIG] = "asus-dig",
4065 [ALC880_ASUS_DIG2] = "asus-dig2",
4066 [ALC880_UNIWILL_DIG] = "uniwill",
2cf9f0fc
TD
4067 [ALC880_UNIWILL_P53] = "uniwill-p53",
4068 [ALC880_FUJITSU] = "fujitsu",
f5fcc13c
TI
4069 [ALC880_F1734] = "F1734",
4070 [ALC880_LG] = "lg",
4071 [ALC880_LG_LW] = "lg-lw",
df99cd33 4072 [ALC880_MEDION_RIM] = "medion",
2fa522be 4073#ifdef CONFIG_SND_DEBUG
f5fcc13c 4074 [ALC880_TEST] = "test",
2fa522be 4075#endif
f5fcc13c
TI
4076 [ALC880_AUTO] = "auto",
4077};
4078
4079static struct snd_pci_quirk alc880_cfg_tbl[] = {
ac3e3741 4080 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
f5fcc13c
TI
4081 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
4082 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
4083 SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
4084 SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
4085 SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
4086 SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
4087 SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
4088 SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
f5fcc13c
TI
4089 SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
4090 SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
f5fcc13c
TI
4091 SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
4092 SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
4093 SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
4094 SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
4095 SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
4096 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
4097 SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
4098 /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
4099 SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
4100 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
186c3117 4101 SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
f5fcc13c
TI
4102 SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
4103 SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
4104 SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
dea0a509 4105 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
f5fcc13c 4106 SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
ac3e3741
TI
4107 SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
4108 SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
f5fcc13c
TI
4109 SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
4110 SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
f5fcc13c
TI
4111 SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
4112 SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
4113 SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
4114 SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
ac3e3741
TI
4115 SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
4116 SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
f5fcc13c 4117 SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
ac3e3741 4118 SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
f5fcc13c 4119 SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
ac3e3741 4120 SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
f5fcc13c
TI
4121 SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
4122 SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
ac3e3741 4123 SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
df99cd33 4124 SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
ac3e3741 4125 SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
f5fcc13c 4126 SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
f5fcc13c 4127 SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
1d11604e 4128 SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
ac3e3741 4129 SND_PCI_QUIRK(0x1734, 0x10ac, "FSC", ALC880_UNIWILL),
2cf9f0fc 4130 SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
ac3e3741 4131 SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
f5fcc13c
TI
4132 SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
4133 SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
f5fcc13c 4134 SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
ac3e3741
TI
4135 SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
4136 SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
4137 SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
4138 SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
f5fcc13c
TI
4139 SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
4140 SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
ac3e3741 4141 SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
f5fcc13c 4142 SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
ac3e3741
TI
4143 SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
4144 SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
f5fcc13c
TI
4145 SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
4146 SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
4147 SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
dea0a509
TI
4148 /* default Intel */
4149 SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
ac3e3741
TI
4150 SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
4151 SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
1da177e4
LT
4152 {}
4153};
4154
16ded525 4155/*
df694daa 4156 * ALC880 codec presets
16ded525 4157 */
16ded525
TI
4158static struct alc_config_preset alc880_presets[] = {
4159 [ALC880_3ST] = {
e9edcee0 4160 .mixers = { alc880_three_stack_mixer },
f12ab1e0
TI
4161 .init_verbs = { alc880_volume_init_verbs,
4162 alc880_pin_3stack_init_verbs },
16ded525 4163 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
16ded525 4164 .dac_nids = alc880_dac_nids,
16ded525
TI
4165 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4166 .channel_mode = alc880_threestack_modes,
4e195a7b 4167 .need_dac_fix = 1,
16ded525
TI
4168 .input_mux = &alc880_capture_source,
4169 },
4170 [ALC880_3ST_DIG] = {
e9edcee0 4171 .mixers = { alc880_three_stack_mixer },
f12ab1e0
TI
4172 .init_verbs = { alc880_volume_init_verbs,
4173 alc880_pin_3stack_init_verbs },
16ded525 4174 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
16ded525
TI
4175 .dac_nids = alc880_dac_nids,
4176 .dig_out_nid = ALC880_DIGOUT_NID,
16ded525
TI
4177 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4178 .channel_mode = alc880_threestack_modes,
4e195a7b 4179 .need_dac_fix = 1,
16ded525
TI
4180 .input_mux = &alc880_capture_source,
4181 },
df694daa
KY
4182 [ALC880_TCL_S700] = {
4183 .mixers = { alc880_tcl_s700_mixer },
4184 .init_verbs = { alc880_volume_init_verbs,
4185 alc880_pin_tcl_S700_init_verbs,
4186 alc880_gpio2_init_verbs },
4187 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4188 .dac_nids = alc880_dac_nids,
f9e336f6
TI
4189 .adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4190 .num_adc_nids = 1, /* single ADC */
df694daa
KY
4191 .hp_nid = 0x03,
4192 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4193 .channel_mode = alc880_2_jack_modes,
4194 .input_mux = &alc880_capture_source,
4195 },
16ded525 4196 [ALC880_5ST] = {
f12ab1e0
TI
4197 .mixers = { alc880_three_stack_mixer,
4198 alc880_five_stack_mixer},
4199 .init_verbs = { alc880_volume_init_verbs,
4200 alc880_pin_5stack_init_verbs },
16ded525
TI
4201 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4202 .dac_nids = alc880_dac_nids,
16ded525
TI
4203 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4204 .channel_mode = alc880_fivestack_modes,
4205 .input_mux = &alc880_capture_source,
4206 },
4207 [ALC880_5ST_DIG] = {
f12ab1e0
TI
4208 .mixers = { alc880_three_stack_mixer,
4209 alc880_five_stack_mixer },
4210 .init_verbs = { alc880_volume_init_verbs,
4211 alc880_pin_5stack_init_verbs },
16ded525
TI
4212 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4213 .dac_nids = alc880_dac_nids,
4214 .dig_out_nid = ALC880_DIGOUT_NID,
16ded525
TI
4215 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4216 .channel_mode = alc880_fivestack_modes,
4217 .input_mux = &alc880_capture_source,
4218 },
b6482d48
TI
4219 [ALC880_6ST] = {
4220 .mixers = { alc880_six_stack_mixer },
f12ab1e0
TI
4221 .init_verbs = { alc880_volume_init_verbs,
4222 alc880_pin_6stack_init_verbs },
b6482d48
TI
4223 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4224 .dac_nids = alc880_6st_dac_nids,
4225 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4226 .channel_mode = alc880_sixstack_modes,
4227 .input_mux = &alc880_6stack_capture_source,
4228 },
16ded525 4229 [ALC880_6ST_DIG] = {
e9edcee0 4230 .mixers = { alc880_six_stack_mixer },
f12ab1e0
TI
4231 .init_verbs = { alc880_volume_init_verbs,
4232 alc880_pin_6stack_init_verbs },
16ded525
TI
4233 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4234 .dac_nids = alc880_6st_dac_nids,
4235 .dig_out_nid = ALC880_DIGOUT_NID,
16ded525
TI
4236 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4237 .channel_mode = alc880_sixstack_modes,
4238 .input_mux = &alc880_6stack_capture_source,
4239 },
4240 [ALC880_W810] = {
e9edcee0 4241 .mixers = { alc880_w810_base_mixer },
f12ab1e0
TI
4242 .init_verbs = { alc880_volume_init_verbs,
4243 alc880_pin_w810_init_verbs,
b0af0de5 4244 alc880_gpio2_init_verbs },
16ded525
TI
4245 .num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4246 .dac_nids = alc880_w810_dac_nids,
4247 .dig_out_nid = ALC880_DIGOUT_NID,
16ded525
TI
4248 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4249 .channel_mode = alc880_w810_modes,
4250 .input_mux = &alc880_capture_source,
4251 },
4252 [ALC880_Z71V] = {
e9edcee0 4253 .mixers = { alc880_z71v_mixer },
f12ab1e0
TI
4254 .init_verbs = { alc880_volume_init_verbs,
4255 alc880_pin_z71v_init_verbs },
16ded525
TI
4256 .num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4257 .dac_nids = alc880_z71v_dac_nids,
4258 .dig_out_nid = ALC880_DIGOUT_NID,
4259 .hp_nid = 0x03,
e9edcee0
TI
4260 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4261 .channel_mode = alc880_2_jack_modes,
16ded525
TI
4262 .input_mux = &alc880_capture_source,
4263 },
4264 [ALC880_F1734] = {
e9edcee0 4265 .mixers = { alc880_f1734_mixer },
f12ab1e0
TI
4266 .init_verbs = { alc880_volume_init_verbs,
4267 alc880_pin_f1734_init_verbs },
e9edcee0
TI
4268 .num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4269 .dac_nids = alc880_f1734_dac_nids,
4270 .hp_nid = 0x02,
4271 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4272 .channel_mode = alc880_2_jack_modes,
937b4160
TI
4273 .input_mux = &alc880_f1734_capture_source,
4274 .unsol_event = alc880_uniwill_p53_unsol_event,
4f5d1706
TI
4275 .setup = alc880_uniwill_p53_setup,
4276 .init_hook = alc_automute_amp,
16ded525
TI
4277 },
4278 [ALC880_ASUS] = {
e9edcee0 4279 .mixers = { alc880_asus_mixer },
f12ab1e0
TI
4280 .init_verbs = { alc880_volume_init_verbs,
4281 alc880_pin_asus_init_verbs,
e9edcee0
TI
4282 alc880_gpio1_init_verbs },
4283 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4284 .dac_nids = alc880_asus_dac_nids,
4285 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4286 .channel_mode = alc880_asus_modes,
4e195a7b 4287 .need_dac_fix = 1,
16ded525
TI
4288 .input_mux = &alc880_capture_source,
4289 },
4290 [ALC880_ASUS_DIG] = {
e9edcee0 4291 .mixers = { alc880_asus_mixer },
f12ab1e0
TI
4292 .init_verbs = { alc880_volume_init_verbs,
4293 alc880_pin_asus_init_verbs,
e9edcee0
TI
4294 alc880_gpio1_init_verbs },
4295 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4296 .dac_nids = alc880_asus_dac_nids,
16ded525 4297 .dig_out_nid = ALC880_DIGOUT_NID,
e9edcee0
TI
4298 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4299 .channel_mode = alc880_asus_modes,
4e195a7b 4300 .need_dac_fix = 1,
16ded525
TI
4301 .input_mux = &alc880_capture_source,
4302 },
df694daa
KY
4303 [ALC880_ASUS_DIG2] = {
4304 .mixers = { alc880_asus_mixer },
f12ab1e0
TI
4305 .init_verbs = { alc880_volume_init_verbs,
4306 alc880_pin_asus_init_verbs,
df694daa
KY
4307 alc880_gpio2_init_verbs }, /* use GPIO2 */
4308 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4309 .dac_nids = alc880_asus_dac_nids,
4310 .dig_out_nid = ALC880_DIGOUT_NID,
4311 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4312 .channel_mode = alc880_asus_modes,
4e195a7b 4313 .need_dac_fix = 1,
df694daa
KY
4314 .input_mux = &alc880_capture_source,
4315 },
16ded525 4316 [ALC880_ASUS_W1V] = {
e9edcee0 4317 .mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
f12ab1e0
TI
4318 .init_verbs = { alc880_volume_init_verbs,
4319 alc880_pin_asus_init_verbs,
e9edcee0
TI
4320 alc880_gpio1_init_verbs },
4321 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4322 .dac_nids = alc880_asus_dac_nids,
16ded525 4323 .dig_out_nid = ALC880_DIGOUT_NID,
e9edcee0
TI
4324 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4325 .channel_mode = alc880_asus_modes,
4e195a7b 4326 .need_dac_fix = 1,
16ded525
TI
4327 .input_mux = &alc880_capture_source,
4328 },
4329 [ALC880_UNIWILL_DIG] = {
45bdd1c1 4330 .mixers = { alc880_asus_mixer },
ccc656ce
KY
4331 .init_verbs = { alc880_volume_init_verbs,
4332 alc880_pin_asus_init_verbs },
e9edcee0
TI
4333 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4334 .dac_nids = alc880_asus_dac_nids,
16ded525 4335 .dig_out_nid = ALC880_DIGOUT_NID,
e9edcee0
TI
4336 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4337 .channel_mode = alc880_asus_modes,
4e195a7b 4338 .need_dac_fix = 1,
16ded525
TI
4339 .input_mux = &alc880_capture_source,
4340 },
ccc656ce
KY
4341 [ALC880_UNIWILL] = {
4342 .mixers = { alc880_uniwill_mixer },
4343 .init_verbs = { alc880_volume_init_verbs,
4344 alc880_uniwill_init_verbs },
4345 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4346 .dac_nids = alc880_asus_dac_nids,
4347 .dig_out_nid = ALC880_DIGOUT_NID,
4348 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4349 .channel_mode = alc880_threestack_modes,
4350 .need_dac_fix = 1,
4351 .input_mux = &alc880_capture_source,
4352 .unsol_event = alc880_uniwill_unsol_event,
4f5d1706 4353 .setup = alc880_uniwill_setup,
a9fd4f3f 4354 .init_hook = alc880_uniwill_init_hook,
ccc656ce
KY
4355 },
4356 [ALC880_UNIWILL_P53] = {
4357 .mixers = { alc880_uniwill_p53_mixer },
4358 .init_verbs = { alc880_volume_init_verbs,
4359 alc880_uniwill_p53_init_verbs },
4360 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4361 .dac_nids = alc880_asus_dac_nids,
4362 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
2cf9f0fc
TD
4363 .channel_mode = alc880_threestack_modes,
4364 .input_mux = &alc880_capture_source,
4365 .unsol_event = alc880_uniwill_p53_unsol_event,
4f5d1706
TI
4366 .setup = alc880_uniwill_p53_setup,
4367 .init_hook = alc_automute_amp,
2cf9f0fc
TD
4368 },
4369 [ALC880_FUJITSU] = {
45bdd1c1 4370 .mixers = { alc880_fujitsu_mixer },
2cf9f0fc
TD
4371 .init_verbs = { alc880_volume_init_verbs,
4372 alc880_uniwill_p53_init_verbs,
4373 alc880_beep_init_verbs },
4374 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4375 .dac_nids = alc880_dac_nids,
d53d7d9e 4376 .dig_out_nid = ALC880_DIGOUT_NID,
2cf9f0fc
TD
4377 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4378 .channel_mode = alc880_2_jack_modes,
ccc656ce
KY
4379 .input_mux = &alc880_capture_source,
4380 .unsol_event = alc880_uniwill_p53_unsol_event,
4f5d1706
TI
4381 .setup = alc880_uniwill_p53_setup,
4382 .init_hook = alc_automute_amp,
ccc656ce 4383 },
df694daa
KY
4384 [ALC880_CLEVO] = {
4385 .mixers = { alc880_three_stack_mixer },
4386 .init_verbs = { alc880_volume_init_verbs,
4387 alc880_pin_clevo_init_verbs },
4388 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4389 .dac_nids = alc880_dac_nids,
4390 .hp_nid = 0x03,
4391 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4392 .channel_mode = alc880_threestack_modes,
4e195a7b 4393 .need_dac_fix = 1,
df694daa
KY
4394 .input_mux = &alc880_capture_source,
4395 },
ae6b813a
TI
4396 [ALC880_LG] = {
4397 .mixers = { alc880_lg_mixer },
4398 .init_verbs = { alc880_volume_init_verbs,
4399 alc880_lg_init_verbs },
4400 .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4401 .dac_nids = alc880_lg_dac_nids,
4402 .dig_out_nid = ALC880_DIGOUT_NID,
4403 .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4404 .channel_mode = alc880_lg_ch_modes,
4e195a7b 4405 .need_dac_fix = 1,
ae6b813a 4406 .input_mux = &alc880_lg_capture_source,
a9fd4f3f 4407 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
4408 .setup = alc880_lg_setup,
4409 .init_hook = alc_automute_amp,
cb53c626
TI
4410#ifdef CONFIG_SND_HDA_POWER_SAVE
4411 .loopbacks = alc880_lg_loopbacks,
4412#endif
ae6b813a 4413 },
d681518a
TI
4414 [ALC880_LG_LW] = {
4415 .mixers = { alc880_lg_lw_mixer },
4416 .init_verbs = { alc880_volume_init_verbs,
4417 alc880_lg_lw_init_verbs },
0a8c5da3 4418 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
d681518a
TI
4419 .dac_nids = alc880_dac_nids,
4420 .dig_out_nid = ALC880_DIGOUT_NID,
0a8c5da3
CM
4421 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4422 .channel_mode = alc880_lg_lw_modes,
d681518a 4423 .input_mux = &alc880_lg_lw_capture_source,
a9fd4f3f 4424 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
4425 .setup = alc880_lg_lw_setup,
4426 .init_hook = alc_automute_amp,
d681518a 4427 },
df99cd33
TI
4428 [ALC880_MEDION_RIM] = {
4429 .mixers = { alc880_medion_rim_mixer },
4430 .init_verbs = { alc880_volume_init_verbs,
4431 alc880_medion_rim_init_verbs,
4432 alc_gpio2_init_verbs },
4433 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4434 .dac_nids = alc880_dac_nids,
4435 .dig_out_nid = ALC880_DIGOUT_NID,
4436 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4437 .channel_mode = alc880_2_jack_modes,
4438 .input_mux = &alc880_medion_rim_capture_source,
4439 .unsol_event = alc880_medion_rim_unsol_event,
4f5d1706
TI
4440 .setup = alc880_medion_rim_setup,
4441 .init_hook = alc880_medion_rim_automute,
df99cd33 4442 },
16ded525
TI
4443#ifdef CONFIG_SND_DEBUG
4444 [ALC880_TEST] = {
e9edcee0
TI
4445 .mixers = { alc880_test_mixer },
4446 .init_verbs = { alc880_test_init_verbs },
16ded525
TI
4447 .num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4448 .dac_nids = alc880_test_dac_nids,
4449 .dig_out_nid = ALC880_DIGOUT_NID,
16ded525
TI
4450 .num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4451 .channel_mode = alc880_test_modes,
4452 .input_mux = &alc880_test_capture_source,
4453 },
4454#endif
4455};
4456
e9edcee0
TI
4457/*
4458 * Automatic parse of I/O pins from the BIOS configuration
4459 */
4460
e9edcee0
TI
4461enum {
4462 ALC_CTL_WIDGET_VOL,
4463 ALC_CTL_WIDGET_MUTE,
4464 ALC_CTL_BIND_MUTE,
4465};
c8b6bf9b 4466static struct snd_kcontrol_new alc880_control_templates[] = {
e9edcee0
TI
4467 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4468 HDA_CODEC_MUTE(NULL, 0, 0, 0),
985be54b 4469 HDA_BIND_MUTE(NULL, 0, 0, 0),
e9edcee0
TI
4470};
4471
4472/* add dynamic controls */
f12ab1e0
TI
4473static int add_control(struct alc_spec *spec, int type, const char *name,
4474 unsigned long val)
e9edcee0 4475{
c8b6bf9b 4476 struct snd_kcontrol_new *knew;
e9edcee0 4477
603c4019
TI
4478 snd_array_init(&spec->kctls, sizeof(*knew), 32);
4479 knew = snd_array_new(&spec->kctls);
4480 if (!knew)
4481 return -ENOMEM;
e9edcee0 4482 *knew = alc880_control_templates[type];
543537bd 4483 knew->name = kstrdup(name, GFP_KERNEL);
f12ab1e0 4484 if (!knew->name)
e9edcee0 4485 return -ENOMEM;
4d02d1b6 4486 if (get_amp_nid_(val))
5e26dfd0 4487 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
e9edcee0 4488 knew->private_value = val;
e9edcee0
TI
4489 return 0;
4490}
4491
0afe5f89
TI
4492static int add_control_with_pfx(struct alc_spec *spec, int type,
4493 const char *pfx, const char *dir,
4494 const char *sfx, unsigned long val)
4495{
4496 char name[32];
4497 snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
4498 return add_control(spec, type, name, val);
4499}
4500
4501#define add_pb_vol_ctrl(spec, type, pfx, val) \
4502 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val)
4503#define add_pb_sw_ctrl(spec, type, pfx, val) \
4504 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val)
4505
e9edcee0
TI
4506#define alc880_is_fixed_pin(nid) ((nid) >= 0x14 && (nid) <= 0x17)
4507#define alc880_fixed_pin_idx(nid) ((nid) - 0x14)
4508#define alc880_is_multi_pin(nid) ((nid) >= 0x18)
4509#define alc880_multi_pin_idx(nid) ((nid) - 0x18)
e9edcee0
TI
4510#define alc880_idx_to_dac(nid) ((nid) + 0x02)
4511#define alc880_dac_to_idx(nid) ((nid) - 0x02)
4512#define alc880_idx_to_mixer(nid) ((nid) + 0x0c)
4513#define alc880_idx_to_selector(nid) ((nid) + 0x10)
4514#define ALC880_PIN_CD_NID 0x1c
4515
4516/* fill in the dac_nids table from the parsed pin configuration */
f12ab1e0
TI
4517static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4518 const struct auto_pin_cfg *cfg)
e9edcee0
TI
4519{
4520 hda_nid_t nid;
4521 int assigned[4];
4522 int i, j;
4523
4524 memset(assigned, 0, sizeof(assigned));
b0af0de5 4525 spec->multiout.dac_nids = spec->private_dac_nids;
e9edcee0
TI
4526
4527 /* check the pins hardwired to audio widget */
4528 for (i = 0; i < cfg->line_outs; i++) {
4529 nid = cfg->line_out_pins[i];
4530 if (alc880_is_fixed_pin(nid)) {
4531 int idx = alc880_fixed_pin_idx(nid);
5014f193 4532 spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
e9edcee0
TI
4533 assigned[idx] = 1;
4534 }
4535 }
4536 /* left pins can be connect to any audio widget */
4537 for (i = 0; i < cfg->line_outs; i++) {
4538 nid = cfg->line_out_pins[i];
4539 if (alc880_is_fixed_pin(nid))
4540 continue;
4541 /* search for an empty channel */
4542 for (j = 0; j < cfg->line_outs; j++) {
f12ab1e0
TI
4543 if (!assigned[j]) {
4544 spec->multiout.dac_nids[i] =
4545 alc880_idx_to_dac(j);
e9edcee0
TI
4546 assigned[j] = 1;
4547 break;
4548 }
4549 }
4550 }
4551 spec->multiout.num_dacs = cfg->line_outs;
4552 return 0;
4553}
4554
4555/* add playback controls from the parsed DAC table */
df694daa
KY
4556static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4557 const struct auto_pin_cfg *cfg)
e9edcee0 4558{
f12ab1e0
TI
4559 static const char *chname[4] = {
4560 "Front", "Surround", NULL /*CLFE*/, "Side"
4561 };
e9edcee0
TI
4562 hda_nid_t nid;
4563 int i, err;
4564
4565 for (i = 0; i < cfg->line_outs; i++) {
f12ab1e0 4566 if (!spec->multiout.dac_nids[i])
e9edcee0
TI
4567 continue;
4568 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4569 if (i == 2) {
4570 /* Center/LFE */
0afe5f89
TI
4571 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4572 "Center",
f12ab1e0
TI
4573 HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4574 HDA_OUTPUT));
4575 if (err < 0)
e9edcee0 4576 return err;
0afe5f89
TI
4577 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4578 "LFE",
f12ab1e0
TI
4579 HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4580 HDA_OUTPUT));
4581 if (err < 0)
e9edcee0 4582 return err;
0afe5f89
TI
4583 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4584 "Center",
f12ab1e0
TI
4585 HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4586 HDA_INPUT));
4587 if (err < 0)
e9edcee0 4588 return err;
0afe5f89
TI
4589 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4590 "LFE",
f12ab1e0
TI
4591 HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4592 HDA_INPUT));
4593 if (err < 0)
e9edcee0
TI
4594 return err;
4595 } else {
cb162b6b
TI
4596 const char *pfx;
4597 if (cfg->line_outs == 1 &&
4598 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4599 pfx = "Speaker";
4600 else
4601 pfx = chname[i];
0afe5f89 4602 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
f12ab1e0
TI
4603 HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4604 HDA_OUTPUT));
4605 if (err < 0)
e9edcee0 4606 return err;
0afe5f89 4607 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
f12ab1e0
TI
4608 HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4609 HDA_INPUT));
4610 if (err < 0)
e9edcee0
TI
4611 return err;
4612 }
4613 }
e9edcee0
TI
4614 return 0;
4615}
4616
8d88bc3d
TI
4617/* add playback controls for speaker and HP outputs */
4618static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4619 const char *pfx)
e9edcee0
TI
4620{
4621 hda_nid_t nid;
4622 int err;
4623
f12ab1e0 4624 if (!pin)
e9edcee0
TI
4625 return 0;
4626
4627 if (alc880_is_fixed_pin(pin)) {
4628 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
82bc955f 4629 /* specify the DAC as the extra output */
f12ab1e0 4630 if (!spec->multiout.hp_nid)
e9edcee0 4631 spec->multiout.hp_nid = nid;
82bc955f
TI
4632 else
4633 spec->multiout.extra_out_nid[0] = nid;
e9edcee0
TI
4634 /* control HP volume/switch on the output mixer amp */
4635 nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
0afe5f89 4636 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
f12ab1e0
TI
4637 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
4638 if (err < 0)
e9edcee0 4639 return err;
0afe5f89 4640 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
f12ab1e0
TI
4641 HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
4642 if (err < 0)
e9edcee0
TI
4643 return err;
4644 } else if (alc880_is_multi_pin(pin)) {
4645 /* set manual connection */
e9edcee0 4646 /* we have only a switch on HP-out PIN */
0afe5f89 4647 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
f12ab1e0
TI
4648 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
4649 if (err < 0)
e9edcee0
TI
4650 return err;
4651 }
4652 return 0;
4653}
4654
4655/* create input playback/capture controls for the given pin */
f12ab1e0
TI
4656static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
4657 const char *ctlname,
df694daa 4658 int idx, hda_nid_t mix_nid)
e9edcee0 4659{
df694daa 4660 int err;
e9edcee0 4661
0afe5f89 4662 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
f12ab1e0
TI
4663 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4664 if (err < 0)
e9edcee0 4665 return err;
0afe5f89 4666 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
f12ab1e0
TI
4667 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4668 if (err < 0)
e9edcee0
TI
4669 return err;
4670 return 0;
4671}
4672
05f5f477
TI
4673static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
4674{
4675 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
4676 return (pincap & AC_PINCAP_IN) != 0;
4677}
4678
e9edcee0 4679/* create playback/capture controls for input pins */
05f5f477
TI
4680static int alc_auto_create_input_ctls(struct hda_codec *codec,
4681 const struct auto_pin_cfg *cfg,
4682 hda_nid_t mixer,
4683 hda_nid_t cap1, hda_nid_t cap2)
e9edcee0 4684{
05f5f477 4685 struct alc_spec *spec = codec->spec;
61b9b9b1 4686 struct hda_input_mux *imux = &spec->private_imux[0];
df694daa 4687 int i, err, idx;
e9edcee0
TI
4688
4689 for (i = 0; i < AUTO_PIN_LAST; i++) {
05f5f477
TI
4690 hda_nid_t pin;
4691
4692 pin = cfg->input_pins[i];
4693 if (!alc_is_input_pin(codec, pin))
4694 continue;
4695
4696 if (mixer) {
4697 idx = get_connection_index(codec, mixer, pin);
4698 if (idx >= 0) {
4699 err = new_analog_input(spec, pin,
4700 auto_pin_cfg_labels[i],
4701 idx, mixer);
4702 if (err < 0)
4703 return err;
4704 }
4705 }
4706
4707 if (!cap1)
4708 continue;
4709 idx = get_connection_index(codec, cap1, pin);
4710 if (idx < 0 && cap2)
4711 idx = get_connection_index(codec, cap2, pin);
4712 if (idx >= 0) {
f12ab1e0
TI
4713 imux->items[imux->num_items].label =
4714 auto_pin_cfg_labels[i];
05f5f477 4715 imux->items[imux->num_items].index = idx;
e9edcee0
TI
4716 imux->num_items++;
4717 }
4718 }
4719 return 0;
4720}
4721
05f5f477
TI
4722static int alc880_auto_create_input_ctls(struct hda_codec *codec,
4723 const struct auto_pin_cfg *cfg)
4724{
4725 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
4726}
4727
f6c7e546
TI
4728static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
4729 unsigned int pin_type)
4730{
4731 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4732 pin_type);
4733 /* unmute pin */
d260cdf6
TI
4734 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4735 AMP_OUT_UNMUTE);
f6c7e546
TI
4736}
4737
df694daa
KY
4738static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
4739 hda_nid_t nid, int pin_type,
e9edcee0
TI
4740 int dac_idx)
4741{
f6c7e546 4742 alc_set_pin_output(codec, nid, pin_type);
e9edcee0
TI
4743 /* need the manual connection? */
4744 if (alc880_is_multi_pin(nid)) {
4745 struct alc_spec *spec = codec->spec;
4746 int idx = alc880_multi_pin_idx(nid);
4747 snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
4748 AC_VERB_SET_CONNECT_SEL,
4749 alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
4750 }
4751}
4752
baba8ee9
TI
4753static int get_pin_type(int line_out_type)
4754{
4755 if (line_out_type == AUTO_PIN_HP_OUT)
4756 return PIN_HP;
4757 else
4758 return PIN_OUT;
4759}
4760
e9edcee0
TI
4761static void alc880_auto_init_multi_out(struct hda_codec *codec)
4762{
4763 struct alc_spec *spec = codec->spec;
4764 int i;
ea1fb29a 4765
e9edcee0
TI
4766 for (i = 0; i < spec->autocfg.line_outs; i++) {
4767 hda_nid_t nid = spec->autocfg.line_out_pins[i];
baba8ee9
TI
4768 int pin_type = get_pin_type(spec->autocfg.line_out_type);
4769 alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
e9edcee0
TI
4770 }
4771}
4772
8d88bc3d 4773static void alc880_auto_init_extra_out(struct hda_codec *codec)
e9edcee0
TI
4774{
4775 struct alc_spec *spec = codec->spec;
4776 hda_nid_t pin;
4777
82bc955f 4778 pin = spec->autocfg.speaker_pins[0];
8d88bc3d
TI
4779 if (pin) /* connect to front */
4780 alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
eb06ed8f 4781 pin = spec->autocfg.hp_pins[0];
e9edcee0
TI
4782 if (pin) /* connect to front */
4783 alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
4784}
4785
4786static void alc880_auto_init_analog_input(struct hda_codec *codec)
4787{
4788 struct alc_spec *spec = codec->spec;
4789 int i;
4790
4791 for (i = 0; i < AUTO_PIN_LAST; i++) {
4792 hda_nid_t nid = spec->autocfg.input_pins[i];
05f5f477 4793 if (alc_is_input_pin(codec, nid)) {
23f0c048 4794 alc_set_input_pin(codec, nid, i);
e82c025b
TI
4795 if (nid != ALC880_PIN_CD_NID &&
4796 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
f12ab1e0
TI
4797 snd_hda_codec_write(codec, nid, 0,
4798 AC_VERB_SET_AMP_GAIN_MUTE,
e9edcee0
TI
4799 AMP_OUT_MUTE);
4800 }
4801 }
4802}
4803
4804/* parse the BIOS configuration and set up the alc_spec */
f12ab1e0
TI
4805/* return 1 if successful, 0 if the proper config is not found,
4806 * or a negative error code
4807 */
e9edcee0
TI
4808static int alc880_parse_auto_config(struct hda_codec *codec)
4809{
4810 struct alc_spec *spec = codec->spec;
6a05ac4a 4811 int i, err;
df694daa 4812 static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
e9edcee0 4813
f12ab1e0
TI
4814 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4815 alc880_ignore);
4816 if (err < 0)
e9edcee0 4817 return err;
f12ab1e0 4818 if (!spec->autocfg.line_outs)
e9edcee0 4819 return 0; /* can't find valid BIOS pin config */
df694daa 4820
f12ab1e0
TI
4821 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
4822 if (err < 0)
4823 return err;
4824 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
4825 if (err < 0)
4826 return err;
4827 err = alc880_auto_create_extra_out(spec,
4828 spec->autocfg.speaker_pins[0],
4829 "Speaker");
4830 if (err < 0)
4831 return err;
4832 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
4833 "Headphone");
4834 if (err < 0)
4835 return err;
05f5f477 4836 err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 4837 if (err < 0)
e9edcee0
TI
4838 return err;
4839
4840 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4841
6a05ac4a
TI
4842 /* check multiple SPDIF-out (for recent codecs) */
4843 for (i = 0; i < spec->autocfg.dig_outs; i++) {
4844 hda_nid_t dig_nid;
4845 err = snd_hda_get_connections(codec,
4846 spec->autocfg.dig_out_pins[i],
4847 &dig_nid, 1);
4848 if (err < 0)
4849 continue;
4850 if (!i)
4851 spec->multiout.dig_out_nid = dig_nid;
4852 else {
4853 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
71121d9f 4854 if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
6a05ac4a 4855 break;
71121d9f 4856 spec->slave_dig_outs[i - 1] = dig_nid;
6a05ac4a
TI
4857 }
4858 }
e9edcee0
TI
4859 if (spec->autocfg.dig_in_pin)
4860 spec->dig_in_nid = ALC880_DIGIN_NID;
4861
603c4019 4862 if (spec->kctls.list)
d88897ea 4863 add_mixer(spec, spec->kctls.list);
e9edcee0 4864
d88897ea 4865 add_verb(spec, alc880_volume_init_verbs);
e9edcee0 4866
a1e8d2da 4867 spec->num_mux_defs = 1;
61b9b9b1 4868 spec->input_mux = &spec->private_imux[0];
e9edcee0 4869
6227cdce 4870 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4a79ba34 4871
e9edcee0
TI
4872 return 1;
4873}
4874
ae6b813a
TI
4875/* additional initialization for auto-configuration model */
4876static void alc880_auto_init(struct hda_codec *codec)
e9edcee0 4877{
f6c7e546 4878 struct alc_spec *spec = codec->spec;
e9edcee0 4879 alc880_auto_init_multi_out(codec);
8d88bc3d 4880 alc880_auto_init_extra_out(codec);
e9edcee0 4881 alc880_auto_init_analog_input(codec);
f6c7e546 4882 if (spec->unsol_event)
7fb0d78f 4883 alc_inithook(codec);
e9edcee0
TI
4884}
4885
b59bdf3b
TI
4886/* check the ADC/MUX contains all input pins; some ADC/MUX contains only
4887 * one of two digital mic pins, e.g. on ALC272
4888 */
4889static void fixup_automic_adc(struct hda_codec *codec)
4890{
4891 struct alc_spec *spec = codec->spec;
4892 int i;
4893
4894 for (i = 0; i < spec->num_adc_nids; i++) {
4895 hda_nid_t cap = spec->capsrc_nids ?
4896 spec->capsrc_nids[i] : spec->adc_nids[i];
4897 int iidx, eidx;
4898
4899 iidx = get_connection_index(codec, cap, spec->int_mic.pin);
4900 if (iidx < 0)
4901 continue;
4902 eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
4903 if (eidx < 0)
4904 continue;
4905 spec->int_mic.mux_idx = iidx;
4906 spec->ext_mic.mux_idx = eidx;
4907 if (spec->capsrc_nids)
4908 spec->capsrc_nids += i;
4909 spec->adc_nids += i;
4910 spec->num_adc_nids = 1;
4911 return;
4912 }
4913 snd_printd(KERN_INFO "hda_codec: %s: "
4914 "No ADC/MUX containing both 0x%x and 0x%x pins\n",
4915 codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
4916 spec->auto_mic = 0; /* disable auto-mic to be sure */
4917}
4918
eaa9b3a7
TI
4919/* choose the ADC/MUX containing the input pin and initialize the setup */
4920static void fixup_single_adc(struct hda_codec *codec)
4921{
4922 struct alc_spec *spec = codec->spec;
d2db09b8 4923 hda_nid_t pin = 0;
eaa9b3a7
TI
4924 int i;
4925
4926 /* search for the input pin; there must be only one */
4927 for (i = 0; i < AUTO_PIN_LAST; i++) {
4928 if (spec->autocfg.input_pins[i]) {
4929 pin = spec->autocfg.input_pins[i];
4930 break;
4931 }
4932 }
4933 if (!pin)
4934 return;
4935
4936 /* set the default connection to that pin */
4937 for (i = 0; i < spec->num_adc_nids; i++) {
4938 hda_nid_t cap = spec->capsrc_nids ?
4939 spec->capsrc_nids[i] : spec->adc_nids[i];
4940 int idx;
4941
4942 idx = get_connection_index(codec, cap, pin);
4943 if (idx < 0)
4944 continue;
4945 /* use only this ADC */
4946 if (spec->capsrc_nids)
4947 spec->capsrc_nids += i;
4948 spec->adc_nids += i;
4949 spec->num_adc_nids = 1;
4950 /* select or unmute this route */
4951 if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
4952 snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
4953 HDA_AMP_MUTE, 0);
4954 } else {
4955 snd_hda_codec_write_cache(codec, cap, 0,
4956 AC_VERB_SET_CONNECT_SEL, idx);
4957 }
4958 return;
4959 }
4960}
4961
b59bdf3b 4962static void set_capture_mixer(struct hda_codec *codec)
f9e336f6 4963{
b59bdf3b 4964 struct alc_spec *spec = codec->spec;
a23b688f
TI
4965 static struct snd_kcontrol_new *caps[2][3] = {
4966 { alc_capture_mixer_nosrc1,
4967 alc_capture_mixer_nosrc2,
4968 alc_capture_mixer_nosrc3 },
4969 { alc_capture_mixer1,
4970 alc_capture_mixer2,
4971 alc_capture_mixer3 },
f9e336f6 4972 };
a23b688f 4973 if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
eaa9b3a7
TI
4974 int mux = 0;
4975 if (spec->auto_mic)
b59bdf3b 4976 fixup_automic_adc(codec);
eaa9b3a7
TI
4977 else if (spec->input_mux) {
4978 if (spec->input_mux->num_items > 1)
4979 mux = 1;
4980 else if (spec->input_mux->num_items == 1)
4981 fixup_single_adc(codec);
4982 }
a23b688f
TI
4983 spec->cap_mixer = caps[mux][spec->num_adc_nids - 1];
4984 }
f9e336f6
TI
4985}
4986
6694635d
TI
4987/* fill adc_nids (and capsrc_nids) containing all active input pins */
4988static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids,
4989 int num_nids)
4990{
4991 struct alc_spec *spec = codec->spec;
4992 int n;
4993 hda_nid_t fallback_adc = 0, fallback_cap = 0;
4994
4995 for (n = 0; n < num_nids; n++) {
4996 hda_nid_t adc, cap;
4997 hda_nid_t conn[HDA_MAX_NUM_INPUTS];
4998 int nconns, i, j;
4999
5000 adc = nids[n];
5001 if (get_wcaps_type(get_wcaps(codec, adc)) != AC_WID_AUD_IN)
5002 continue;
5003 cap = adc;
5004 nconns = snd_hda_get_connections(codec, cap, conn,
5005 ARRAY_SIZE(conn));
5006 if (nconns == 1) {
5007 cap = conn[0];
5008 nconns = snd_hda_get_connections(codec, cap, conn,
5009 ARRAY_SIZE(conn));
5010 }
5011 if (nconns <= 0)
5012 continue;
5013 if (!fallback_adc) {
5014 fallback_adc = adc;
5015 fallback_cap = cap;
5016 }
5017 for (i = 0; i < AUTO_PIN_LAST; i++) {
5018 hda_nid_t nid = spec->autocfg.input_pins[i];
5019 if (!nid)
5020 continue;
5021 for (j = 0; j < nconns; j++) {
5022 if (conn[j] == nid)
5023 break;
5024 }
5025 if (j >= nconns)
5026 break;
5027 }
5028 if (i >= AUTO_PIN_LAST) {
5029 int num_adcs = spec->num_adc_nids;
5030 spec->private_adc_nids[num_adcs] = adc;
5031 spec->private_capsrc_nids[num_adcs] = cap;
5032 spec->num_adc_nids++;
5033 spec->adc_nids = spec->private_adc_nids;
5034 if (adc != cap)
5035 spec->capsrc_nids = spec->private_capsrc_nids;
5036 }
5037 }
5038 if (!spec->num_adc_nids) {
5039 printk(KERN_WARNING "hda_codec: %s: no valid ADC found;"
1f85d72d
TI
5040 " using fallback 0x%x\n",
5041 codec->chip_name, fallback_adc);
6694635d
TI
5042 spec->private_adc_nids[0] = fallback_adc;
5043 spec->adc_nids = spec->private_adc_nids;
5044 if (fallback_adc != fallback_cap) {
5045 spec->private_capsrc_nids[0] = fallback_cap;
5046 spec->capsrc_nids = spec->private_adc_nids;
5047 }
5048 }
5049}
5050
67d634c0 5051#ifdef CONFIG_SND_HDA_INPUT_BEEP
45bdd1c1
TI
5052#define set_beep_amp(spec, nid, idx, dir) \
5053 ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
67d634c0
TI
5054#else
5055#define set_beep_amp(spec, nid, idx, dir) /* NOP */
5056#endif
45bdd1c1
TI
5057
5058/*
5059 * OK, here we have finally the patch for ALC880
5060 */
5061
1da177e4
LT
5062static int patch_alc880(struct hda_codec *codec)
5063{
5064 struct alc_spec *spec;
5065 int board_config;
df694daa 5066 int err;
1da177e4 5067
e560d8d8 5068 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1da177e4
LT
5069 if (spec == NULL)
5070 return -ENOMEM;
5071
5072 codec->spec = spec;
5073
f5fcc13c
TI
5074 board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
5075 alc880_models,
5076 alc880_cfg_tbl);
5077 if (board_config < 0) {
9a11f1aa
TI
5078 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5079 codec->chip_name);
e9edcee0 5080 board_config = ALC880_AUTO;
1da177e4 5081 }
1da177e4 5082
e9edcee0
TI
5083 if (board_config == ALC880_AUTO) {
5084 /* automatic parse from the BIOS config */
5085 err = alc880_parse_auto_config(codec);
5086 if (err < 0) {
5087 alc_free(codec);
5088 return err;
f12ab1e0 5089 } else if (!err) {
9c7f852e
TI
5090 printk(KERN_INFO
5091 "hda_codec: Cannot set up configuration "
5092 "from BIOS. Using 3-stack mode...\n");
e9edcee0
TI
5093 board_config = ALC880_3ST;
5094 }
1da177e4
LT
5095 }
5096
680cd536
KK
5097 err = snd_hda_attach_beep_device(codec, 0x1);
5098 if (err < 0) {
5099 alc_free(codec);
5100 return err;
5101 }
5102
df694daa 5103 if (board_config != ALC880_AUTO)
e9c364c0 5104 setup_preset(codec, &alc880_presets[board_config]);
1da177e4 5105
1da177e4
LT
5106 spec->stream_analog_playback = &alc880_pcm_analog_playback;
5107 spec->stream_analog_capture = &alc880_pcm_analog_capture;
6330079f 5108 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
1da177e4 5109
1da177e4
LT
5110 spec->stream_digital_playback = &alc880_pcm_digital_playback;
5111 spec->stream_digital_capture = &alc880_pcm_digital_capture;
5112
f12ab1e0 5113 if (!spec->adc_nids && spec->input_mux) {
e9edcee0 5114 /* check whether NID 0x07 is valid */
54d17403 5115 unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
f12ab1e0 5116 /* get type */
a22d543a 5117 wcap = get_wcaps_type(wcap);
e9edcee0
TI
5118 if (wcap != AC_WID_AUD_IN) {
5119 spec->adc_nids = alc880_adc_nids_alt;
5120 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
e9edcee0
TI
5121 } else {
5122 spec->adc_nids = alc880_adc_nids;
5123 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
e9edcee0
TI
5124 }
5125 }
b59bdf3b 5126 set_capture_mixer(codec);
45bdd1c1 5127 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1da177e4 5128
2134ea4f
TI
5129 spec->vmaster_nid = 0x0c;
5130
1da177e4 5131 codec->patch_ops = alc_patch_ops;
e9edcee0 5132 if (board_config == ALC880_AUTO)
ae6b813a 5133 spec->init_hook = alc880_auto_init;
cb53c626
TI
5134#ifdef CONFIG_SND_HDA_POWER_SAVE
5135 if (!spec->loopback.amplist)
5136 spec->loopback.amplist = alc880_loopbacks;
5137#endif
1da177e4
LT
5138
5139 return 0;
5140}
5141
e9edcee0 5142
1da177e4
LT
5143/*
5144 * ALC260 support
5145 */
5146
e9edcee0
TI
5147static hda_nid_t alc260_dac_nids[1] = {
5148 /* front */
5149 0x02,
5150};
5151
5152static hda_nid_t alc260_adc_nids[1] = {
5153 /* ADC0 */
5154 0x04,
5155};
5156
df694daa 5157static hda_nid_t alc260_adc_nids_alt[1] = {
e9edcee0
TI
5158 /* ADC1 */
5159 0x05,
5160};
5161
d57fdac0
JW
5162/* NIDs used when simultaneous access to both ADCs makes sense. Note that
5163 * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
5164 */
5165static hda_nid_t alc260_dual_adc_nids[2] = {
4c5186ed
JW
5166 /* ADC0, ADC1 */
5167 0x04, 0x05
5168};
5169
e9edcee0
TI
5170#define ALC260_DIGOUT_NID 0x03
5171#define ALC260_DIGIN_NID 0x06
5172
5173static struct hda_input_mux alc260_capture_source = {
5174 .num_items = 4,
5175 .items = {
5176 { "Mic", 0x0 },
5177 { "Front Mic", 0x1 },
5178 { "Line", 0x2 },
5179 { "CD", 0x4 },
5180 },
5181};
5182
17e7aec6 5183/* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
a1e8d2da
JW
5184 * headphone jack and the internal CD lines since these are the only pins at
5185 * which audio can appear. For flexibility, also allow the option of
5186 * recording the mixer output on the second ADC (ADC0 doesn't have a
5187 * connection to the mixer output).
a9430dd8 5188 */
a1e8d2da
JW
5189static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
5190 {
5191 .num_items = 3,
5192 .items = {
5193 { "Mic/Line", 0x0 },
5194 { "CD", 0x4 },
5195 { "Headphone", 0x2 },
5196 },
a9430dd8 5197 },
a1e8d2da
JW
5198 {
5199 .num_items = 4,
5200 .items = {
5201 { "Mic/Line", 0x0 },
5202 { "CD", 0x4 },
5203 { "Headphone", 0x2 },
5204 { "Mixer", 0x5 },
5205 },
5206 },
5207
a9430dd8
JW
5208};
5209
a1e8d2da
JW
5210/* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
5211 * the Fujitsu S702x, but jacks are marked differently.
0bfc90e9 5212 */
a1e8d2da
JW
5213static struct hda_input_mux alc260_acer_capture_sources[2] = {
5214 {
5215 .num_items = 4,
5216 .items = {
5217 { "Mic", 0x0 },
5218 { "Line", 0x2 },
5219 { "CD", 0x4 },
5220 { "Headphone", 0x5 },
5221 },
5222 },
5223 {
5224 .num_items = 5,
5225 .items = {
5226 { "Mic", 0x0 },
5227 { "Line", 0x2 },
5228 { "CD", 0x4 },
5229 { "Headphone", 0x6 },
5230 { "Mixer", 0x5 },
5231 },
0bfc90e9
JW
5232 },
5233};
cc959489
MS
5234
5235/* Maxdata Favorit 100XS */
5236static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5237 {
5238 .num_items = 2,
5239 .items = {
5240 { "Line/Mic", 0x0 },
5241 { "CD", 0x4 },
5242 },
5243 },
5244 {
5245 .num_items = 3,
5246 .items = {
5247 { "Line/Mic", 0x0 },
5248 { "CD", 0x4 },
5249 { "Mixer", 0x5 },
5250 },
5251 },
5252};
5253
1da177e4
LT
5254/*
5255 * This is just place-holder, so there's something for alc_build_pcms to look
5256 * at when it calculates the maximum number of channels. ALC260 has no mixer
5257 * element which allows changing the channel mode, so the verb list is
5258 * never used.
5259 */
d2a6d7dc 5260static struct hda_channel_mode alc260_modes[1] = {
1da177e4
LT
5261 { 2, NULL },
5262};
5263
df694daa
KY
5264
5265/* Mixer combinations
5266 *
5267 * basic: base_output + input + pc_beep + capture
5268 * HP: base_output + input + capture_alt
5269 * HP_3013: hp_3013 + input + capture
5270 * fujitsu: fujitsu + capture
0bfc90e9 5271 * acer: acer + capture
df694daa
KY
5272 */
5273
5274static struct snd_kcontrol_new alc260_base_output_mixer[] = {
05acb863 5275 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
985be54b 5276 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
05acb863 5277 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
985be54b 5278 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
05acb863 5279 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
985be54b 5280 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
1da177e4 5281 { } /* end */
f12ab1e0 5282};
1da177e4 5283
df694daa 5284static struct snd_kcontrol_new alc260_input_mixer[] = {
16ded525
TI
5285 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5286 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5287 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5288 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5289 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5290 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5291 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5292 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
df694daa
KY
5293 { } /* end */
5294};
5295
bec15c3a
TI
5296/* update HP, line and mono out pins according to the master switch */
5297static void alc260_hp_master_update(struct hda_codec *codec,
5298 hda_nid_t hp, hda_nid_t line,
5299 hda_nid_t mono)
5300{
5301 struct alc_spec *spec = codec->spec;
5302 unsigned int val = spec->master_sw ? PIN_HP : 0;
5303 /* change HP and line-out pins */
30cde0aa 5304 snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
bec15c3a 5305 val);
30cde0aa 5306 snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
bec15c3a
TI
5307 val);
5308 /* mono (speaker) depending on the HP jack sense */
5309 val = (val && !spec->jack_present) ? PIN_OUT : 0;
30cde0aa 5310 snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
bec15c3a
TI
5311 val);
5312}
5313
5314static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5315 struct snd_ctl_elem_value *ucontrol)
5316{
5317 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5318 struct alc_spec *spec = codec->spec;
5319 *ucontrol->value.integer.value = spec->master_sw;
5320 return 0;
5321}
5322
5323static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5324 struct snd_ctl_elem_value *ucontrol)
5325{
5326 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5327 struct alc_spec *spec = codec->spec;
5328 int val = !!*ucontrol->value.integer.value;
5329 hda_nid_t hp, line, mono;
5330
5331 if (val == spec->master_sw)
5332 return 0;
5333 spec->master_sw = val;
5334 hp = (kcontrol->private_value >> 16) & 0xff;
5335 line = (kcontrol->private_value >> 8) & 0xff;
5336 mono = kcontrol->private_value & 0xff;
5337 alc260_hp_master_update(codec, hp, line, mono);
5338 return 1;
5339}
5340
5341static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5342 {
5343 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5344 .name = "Master Playback Switch",
5b0cb1d8 5345 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
bec15c3a
TI
5346 .info = snd_ctl_boolean_mono_info,
5347 .get = alc260_hp_master_sw_get,
5348 .put = alc260_hp_master_sw_put,
5349 .private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5350 },
5351 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5352 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5353 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5354 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5355 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5356 HDA_OUTPUT),
5357 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5358 { } /* end */
5359};
5360
5361static struct hda_verb alc260_hp_unsol_verbs[] = {
5362 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5363 {},
5364};
5365
5366static void alc260_hp_automute(struct hda_codec *codec)
5367{
5368 struct alc_spec *spec = codec->spec;
bec15c3a 5369
864f92be 5370 spec->jack_present = snd_hda_jack_detect(codec, 0x10);
bec15c3a
TI
5371 alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5372}
5373
5374static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5375{
5376 if ((res >> 26) == ALC880_HP_EVENT)
5377 alc260_hp_automute(codec);
5378}
5379
df694daa 5380static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
bec15c3a
TI
5381 {
5382 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5383 .name = "Master Playback Switch",
5b0cb1d8 5384 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
bec15c3a
TI
5385 .info = snd_ctl_boolean_mono_info,
5386 .get = alc260_hp_master_sw_get,
5387 .put = alc260_hp_master_sw_put,
30cde0aa 5388 .private_value = (0x15 << 16) | (0x10 << 8) | 0x11
bec15c3a 5389 },
df694daa
KY
5390 HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5391 HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5392 HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5393 HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5394 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5395 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
86cd9298
TI
5396 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5397 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
16ded525
TI
5398 { } /* end */
5399};
5400
3f878308
KY
5401static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5402 .ops = &snd_hda_bind_vol,
5403 .values = {
5404 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5405 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5406 HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5407 0
5408 },
5409};
5410
5411static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5412 .ops = &snd_hda_bind_sw,
5413 .values = {
5414 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5415 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5416 0
5417 },
5418};
5419
5420static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5421 HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5422 HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5423 HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5424 HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5425 { } /* end */
5426};
5427
bec15c3a
TI
5428static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5429 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5430 {},
5431};
5432
5433static void alc260_hp_3013_automute(struct hda_codec *codec)
5434{
5435 struct alc_spec *spec = codec->spec;
bec15c3a 5436
864f92be 5437 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
30cde0aa 5438 alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
bec15c3a
TI
5439}
5440
5441static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5442 unsigned int res)
5443{
5444 if ((res >> 26) == ALC880_HP_EVENT)
5445 alc260_hp_3013_automute(codec);
5446}
5447
3f878308
KY
5448static void alc260_hp_3012_automute(struct hda_codec *codec)
5449{
864f92be 5450 unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
3f878308 5451
3f878308
KY
5452 snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5453 bits);
5454 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5455 bits);
5456 snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5457 bits);
5458}
5459
5460static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5461 unsigned int res)
5462{
5463 if ((res >> 26) == ALC880_HP_EVENT)
5464 alc260_hp_3012_automute(codec);
5465}
5466
5467/* Fujitsu S702x series laptops. ALC260 pin usage: Mic/Line jack = 0x12,
a1e8d2da
JW
5468 * HP jack = 0x14, CD audio = 0x16, internal speaker = 0x10.
5469 */
c8b6bf9b 5470static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
a9430dd8 5471 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
985be54b 5472 HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
4c5186ed 5473 ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
a9430dd8
JW
5474 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5475 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5476 HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5477 HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
4c5186ed 5478 ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
31bffaa9
TI
5479 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5480 HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
df694daa
KY
5481 { } /* end */
5482};
5483
a1e8d2da
JW
5484/* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks. Note that current
5485 * versions of the ALC260 don't act on requests to enable mic bias from NID
5486 * 0x0f (used to drive the headphone jack in these laptops). The ALC260
5487 * datasheet doesn't mention this restriction. At this stage it's not clear
5488 * whether this behaviour is intentional or is a hardware bug in chip
5489 * revisions available in early 2006. Therefore for now allow the
5490 * "Headphone Jack Mode" control to span all choices, but if it turns out
5491 * that the lack of mic bias for this NID is intentional we could change the
5492 * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5493 *
5494 * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5495 * don't appear to make the mic bias available from the "line" jack, even
5496 * though the NID used for this jack (0x14) can supply it. The theory is
5497 * that perhaps Acer have included blocking capacitors between the ALC260
5498 * and the output jack. If this turns out to be the case for all such
5499 * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5500 * to ALC_PIN_DIR_INOUT_NOMICBIAS.
bd869485
JW
5501 *
5502 * The C20x Tablet series have a mono internal speaker which is controlled
5503 * via the chip's Mono sum widget and pin complex, so include the necessary
5504 * controls for such models. On models without a "mono speaker" the control
5505 * won't do anything.
a1e8d2da 5506 */
0bfc90e9
JW
5507static struct snd_kcontrol_new alc260_acer_mixer[] = {
5508 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5509 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
a1e8d2da 5510 ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
31bffaa9 5511 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
bd869485 5512 HDA_OUTPUT),
31bffaa9 5513 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
bd869485 5514 HDA_INPUT),
0bfc90e9
JW
5515 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5516 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5517 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5518 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5519 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5520 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5521 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5522 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
0bfc90e9
JW
5523 { } /* end */
5524};
5525
cc959489
MS
5526/* Maxdata Favorit 100XS: one output and one input (0x12) jack
5527 */
5528static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5529 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5530 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5531 ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5532 HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5533 HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5534 ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5535 { } /* end */
5536};
5537
bc9f98a9
KY
5538/* Packard bell V7900 ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5539 * Line In jack = 0x14, CD audio = 0x16, pc beep = 0x17.
5540 */
5541static struct snd_kcontrol_new alc260_will_mixer[] = {
5542 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5543 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5544 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5545 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5546 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5547 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5548 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5549 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5550 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5551 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
bc9f98a9
KY
5552 { } /* end */
5553};
5554
5555/* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5556 * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5557 */
5558static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5559 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5560 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5561 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5562 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5563 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5564 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5565 HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5566 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5567 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5568 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5569 { } /* end */
5570};
5571
df694daa
KY
5572/*
5573 * initialization verbs
5574 */
1da177e4
LT
5575static struct hda_verb alc260_init_verbs[] = {
5576 /* Line In pin widget for input */
05acb863 5577 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1da177e4 5578 /* CD pin widget for input */
05acb863 5579 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1da177e4 5580 /* Mic1 (rear panel) pin widget for input and vref at 80% */
16ded525 5581 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1da177e4 5582 /* Mic2 (front panel) pin widget for input and vref at 80% */
16ded525 5583 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1da177e4 5584 /* LINE-2 is used for line-out in rear */
05acb863 5585 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1da177e4 5586 /* select line-out */
fd56f2db 5587 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
1da177e4 5588 /* LINE-OUT pin */
05acb863 5589 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1da177e4 5590 /* enable HP */
05acb863 5591 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1da177e4 5592 /* enable Mono */
05acb863
TI
5593 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5594 /* mute capture amp left and right */
16ded525 5595 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1da177e4
LT
5596 /* set connection select to line in (default select for this ADC) */
5597 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
16ded525
TI
5598 /* mute capture amp left and right */
5599 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5600 /* set connection select to line in (default select for this ADC) */
5601 {0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
05acb863
TI
5602 /* set vol=0 Line-Out mixer amp left and right */
5603 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5604 /* unmute pin widget amp left and right (no gain on this amp) */
5605 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5606 /* set vol=0 HP mixer amp left and right */
5607 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5608 /* unmute pin widget amp left and right (no gain on this amp) */
5609 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5610 /* set vol=0 Mono mixer amp left and right */
5611 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5612 /* unmute pin widget amp left and right (no gain on this amp) */
5613 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5614 /* unmute LINE-2 out pin */
5615 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
f12ab1e0
TI
5616 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5617 * Line In 2 = 0x03
5618 */
cb53c626
TI
5619 /* mute analog inputs */
5620 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5621 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5622 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5623 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5624 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
1da177e4 5625 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
05acb863
TI
5626 /* mute Front out path */
5627 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5628 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5629 /* mute Headphone out path */
5630 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5631 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5632 /* mute Mono out path */
5633 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5634 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4
LT
5635 { }
5636};
5637
474167d6 5638#if 0 /* should be identical with alc260_init_verbs? */
df694daa
KY
5639static struct hda_verb alc260_hp_init_verbs[] = {
5640 /* Headphone and output */
5641 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5642 /* mono output */
5643 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5644 /* Mic1 (rear panel) pin widget for input and vref at 80% */
5645 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5646 /* Mic2 (front panel) pin widget for input and vref at 80% */
5647 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5648 /* Line In pin widget for input */
5649 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5650 /* Line-2 pin widget for output */
5651 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5652 /* CD pin widget for input */
5653 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5654 /* unmute amp left and right */
5655 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5656 /* set connection select to line in (default select for this ADC) */
5657 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5658 /* unmute Line-Out mixer amp left and right (volume = 0) */
5659 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5660 /* mute pin widget amp left and right (no gain on this amp) */
5661 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5662 /* unmute HP mixer amp left and right (volume = 0) */
5663 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5664 /* mute pin widget amp left and right (no gain on this amp) */
5665 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
f12ab1e0
TI
5666 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5667 * Line In 2 = 0x03
5668 */
cb53c626
TI
5669 /* mute analog inputs */
5670 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5671 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5672 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5673 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5674 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
df694daa
KY
5675 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5676 /* Unmute Front out path */
5677 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5678 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5679 /* Unmute Headphone out path */
5680 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5681 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5682 /* Unmute Mono out path */
5683 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5684 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5685 { }
5686};
474167d6 5687#endif
df694daa
KY
5688
5689static struct hda_verb alc260_hp_3013_init_verbs[] = {
5690 /* Line out and output */
5691 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5692 /* mono output */
5693 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5694 /* Mic1 (rear panel) pin widget for input and vref at 80% */
5695 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5696 /* Mic2 (front panel) pin widget for input and vref at 80% */
5697 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5698 /* Line In pin widget for input */
5699 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5700 /* Headphone pin widget for output */
5701 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5702 /* CD pin widget for input */
5703 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5704 /* unmute amp left and right */
5705 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5706 /* set connection select to line in (default select for this ADC) */
5707 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5708 /* unmute Line-Out mixer amp left and right (volume = 0) */
5709 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5710 /* mute pin widget amp left and right (no gain on this amp) */
5711 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5712 /* unmute HP mixer amp left and right (volume = 0) */
5713 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5714 /* mute pin widget amp left and right (no gain on this amp) */
5715 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
f12ab1e0
TI
5716 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5717 * Line In 2 = 0x03
5718 */
cb53c626
TI
5719 /* mute analog inputs */
5720 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5721 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5722 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5723 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5724 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
df694daa
KY
5725 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5726 /* Unmute Front out path */
5727 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5728 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5729 /* Unmute Headphone out path */
5730 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5731 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5732 /* Unmute Mono out path */
5733 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5734 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5735 { }
5736};
5737
a9430dd8 5738/* Initialisation sequence for ALC260 as configured in Fujitsu S702x
a1e8d2da
JW
5739 * laptops. ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
5740 * audio = 0x16, internal speaker = 0x10.
a9430dd8
JW
5741 */
5742static struct hda_verb alc260_fujitsu_init_verbs[] = {
5743 /* Disable all GPIOs */
5744 {0x01, AC_VERB_SET_GPIO_MASK, 0},
5745 /* Internal speaker is connected to headphone pin */
5746 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5747 /* Headphone/Line-out jack connects to Line1 pin; make it an output */
5748 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
f7ace40d
JW
5749 /* Mic/Line-in jack is connected to mic1 pin, so make it an input */
5750 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5751 /* Ensure all other unused pins are disabled and muted. */
5752 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5753 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
a9430dd8 5754 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
f7ace40d 5755 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
a9430dd8 5756 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
f7ace40d
JW
5757 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5758 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5759 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5760
5761 /* Disable digital (SPDIF) pins */
5762 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5763 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
a9430dd8 5764
ea1fb29a 5765 /* Ensure Line1 pin widget takes its input from the OUT1 sum bus
f7ace40d
JW
5766 * when acting as an output.
5767 */
5768 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
4c5186ed 5769
f7ace40d 5770 /* Start with output sum widgets muted and their output gains at min */
8b33a5aa
TI
5771 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5772 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5773 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5774 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5775 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5776 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5777 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5778 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5779 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
a9430dd8 5780
f7ace40d
JW
5781 /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
5782 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5783 /* Unmute Line1 pin widget output buffer since it starts as an output.
5784 * If the pin mode is changed by the user the pin mode control will
5785 * take care of enabling the pin's input/output buffers as needed.
5786 * Therefore there's no need to enable the input buffer at this
5787 * stage.
cdcd9268 5788 */
f7ace40d 5789 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
ea1fb29a 5790 /* Unmute input buffer of pin widget used for Line-in (no equiv
cdcd9268
JW
5791 * mixer ctrl)
5792 */
f7ace40d
JW
5793 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5794
5795 /* Mute capture amp left and right */
5796 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
ea1fb29a 5797 /* Set ADC connection select to match default mixer setting - line
f7ace40d
JW
5798 * in (on mic1 pin)
5799 */
5800 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5801
5802 /* Do the same for the second ADC: mute capture input amp and
5803 * set ADC connection to line in (on mic1 pin)
5804 */
5805 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5806 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5807
5808 /* Mute all inputs to mixer widget (even unconnected ones) */
5809 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5810 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5811 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5812 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5813 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5814 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5815 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5816 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
4a471b7d
TI
5817
5818 { }
a9430dd8
JW
5819};
5820
0bfc90e9
JW
5821/* Initialisation sequence for ALC260 as configured in Acer TravelMate and
5822 * similar laptops (adapted from Fujitsu init verbs).
5823 */
5824static struct hda_verb alc260_acer_init_verbs[] = {
5825 /* On TravelMate laptops, GPIO 0 enables the internal speaker and
5826 * the headphone jack. Turn this on and rely on the standard mute
5827 * methods whenever the user wants to turn these outputs off.
5828 */
5829 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5830 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5831 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5832 /* Internal speaker/Headphone jack is connected to Line-out pin */
5833 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5834 /* Internal microphone/Mic jack is connected to Mic1 pin */
5835 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5836 /* Line In jack is connected to Line1 pin */
5837 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
bd869485
JW
5838 /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
5839 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
0bfc90e9
JW
5840 /* Ensure all other unused pins are disabled and muted. */
5841 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5842 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
0bfc90e9
JW
5843 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5844 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5845 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5846 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5847 /* Disable digital (SPDIF) pins */
5848 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5849 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5850
ea1fb29a 5851 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
0bfc90e9
JW
5852 * bus when acting as outputs.
5853 */
5854 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5855 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5856
5857 /* Start with output sum widgets muted and their output gains at min */
5858 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5859 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5860 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5861 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5862 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5863 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5864 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5865 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5866 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5867
f12ab1e0
TI
5868 /* Unmute Line-out pin widget amp left and right
5869 * (no equiv mixer ctrl)
5870 */
0bfc90e9 5871 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
bd869485
JW
5872 /* Unmute mono pin widget amp output (no equiv mixer ctrl) */
5873 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
0bfc90e9
JW
5874 /* Unmute Mic1 and Line1 pin widget input buffers since they start as
5875 * inputs. If the pin mode is changed by the user the pin mode control
5876 * will take care of enabling the pin's input/output buffers as needed.
5877 * Therefore there's no need to enable the input buffer at this
5878 * stage.
5879 */
5880 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5881 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5882
5883 /* Mute capture amp left and right */
5884 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5885 /* Set ADC connection select to match default mixer setting - mic
5886 * (on mic1 pin)
5887 */
5888 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5889
5890 /* Do similar with the second ADC: mute capture input amp and
a1e8d2da 5891 * set ADC connection to mic to match ALSA's default state.
0bfc90e9
JW
5892 */
5893 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
a1e8d2da 5894 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
0bfc90e9
JW
5895
5896 /* Mute all inputs to mixer widget (even unconnected ones) */
5897 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5898 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5899 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5900 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5901 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5902 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5903 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5904 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5905
5906 { }
5907};
5908
cc959489
MS
5909/* Initialisation sequence for Maxdata Favorit 100XS
5910 * (adapted from Acer init verbs).
5911 */
5912static struct hda_verb alc260_favorit100_init_verbs[] = {
5913 /* GPIO 0 enables the output jack.
5914 * Turn this on and rely on the standard mute
5915 * methods whenever the user wants to turn these outputs off.
5916 */
5917 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5918 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5919 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5920 /* Line/Mic input jack is connected to Mic1 pin */
5921 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5922 /* Ensure all other unused pins are disabled and muted. */
5923 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5924 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5925 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5926 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5927 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5928 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5929 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5930 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5931 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5932 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5933 /* Disable digital (SPDIF) pins */
5934 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5935 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5936
5937 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5938 * bus when acting as outputs.
5939 */
5940 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5941 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5942
5943 /* Start with output sum widgets muted and their output gains at min */
5944 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5945 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5946 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5947 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5948 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5949 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5950 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5951 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5952 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5953
5954 /* Unmute Line-out pin widget amp left and right
5955 * (no equiv mixer ctrl)
5956 */
5957 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5958 /* Unmute Mic1 and Line1 pin widget input buffers since they start as
5959 * inputs. If the pin mode is changed by the user the pin mode control
5960 * will take care of enabling the pin's input/output buffers as needed.
5961 * Therefore there's no need to enable the input buffer at this
5962 * stage.
5963 */
5964 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5965
5966 /* Mute capture amp left and right */
5967 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5968 /* Set ADC connection select to match default mixer setting - mic
5969 * (on mic1 pin)
5970 */
5971 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5972
5973 /* Do similar with the second ADC: mute capture input amp and
5974 * set ADC connection to mic to match ALSA's default state.
5975 */
5976 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5977 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5978
5979 /* Mute all inputs to mixer widget (even unconnected ones) */
5980 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5981 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5982 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5983 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5984 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5985 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5986 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5987 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5988
5989 { }
5990};
5991
bc9f98a9
KY
5992static struct hda_verb alc260_will_verbs[] = {
5993 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5994 {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
5995 {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
5996 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
5997 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
5998 {0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
5999 {}
6000};
6001
6002static struct hda_verb alc260_replacer_672v_verbs[] = {
6003 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6004 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6005 {0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
6006
6007 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6008 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6009 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6010
6011 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6012 {}
6013};
6014
6015/* toggle speaker-output according to the hp-jack state */
6016static void alc260_replacer_672v_automute(struct hda_codec *codec)
6017{
6018 unsigned int present;
6019
6020 /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
864f92be 6021 present = snd_hda_jack_detect(codec, 0x0f);
bc9f98a9 6022 if (present) {
82beb8fd
TI
6023 snd_hda_codec_write_cache(codec, 0x01, 0,
6024 AC_VERB_SET_GPIO_DATA, 1);
6025 snd_hda_codec_write_cache(codec, 0x0f, 0,
6026 AC_VERB_SET_PIN_WIDGET_CONTROL,
6027 PIN_HP);
bc9f98a9 6028 } else {
82beb8fd
TI
6029 snd_hda_codec_write_cache(codec, 0x01, 0,
6030 AC_VERB_SET_GPIO_DATA, 0);
6031 snd_hda_codec_write_cache(codec, 0x0f, 0,
6032 AC_VERB_SET_PIN_WIDGET_CONTROL,
6033 PIN_OUT);
bc9f98a9
KY
6034 }
6035}
6036
6037static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
6038 unsigned int res)
6039{
6040 if ((res >> 26) == ALC880_HP_EVENT)
6041 alc260_replacer_672v_automute(codec);
6042}
6043
3f878308
KY
6044static struct hda_verb alc260_hp_dc7600_verbs[] = {
6045 {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
6046 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6047 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6048 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6049 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6050 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6051 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
6052 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6053 {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6054 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6055 {}
6056};
6057
7cf51e48
JW
6058/* Test configuration for debugging, modelled after the ALC880 test
6059 * configuration.
6060 */
6061#ifdef CONFIG_SND_DEBUG
6062static hda_nid_t alc260_test_dac_nids[1] = {
6063 0x02,
6064};
6065static hda_nid_t alc260_test_adc_nids[2] = {
6066 0x04, 0x05,
6067};
a1e8d2da 6068/* For testing the ALC260, each input MUX needs its own definition since
ea1fb29a 6069 * the signal assignments are different. This assumes that the first ADC
a1e8d2da 6070 * is NID 0x04.
17e7aec6 6071 */
a1e8d2da
JW
6072static struct hda_input_mux alc260_test_capture_sources[2] = {
6073 {
6074 .num_items = 7,
6075 .items = {
6076 { "MIC1 pin", 0x0 },
6077 { "MIC2 pin", 0x1 },
6078 { "LINE1 pin", 0x2 },
6079 { "LINE2 pin", 0x3 },
6080 { "CD pin", 0x4 },
6081 { "LINE-OUT pin", 0x5 },
6082 { "HP-OUT pin", 0x6 },
6083 },
6084 },
6085 {
6086 .num_items = 8,
6087 .items = {
6088 { "MIC1 pin", 0x0 },
6089 { "MIC2 pin", 0x1 },
6090 { "LINE1 pin", 0x2 },
6091 { "LINE2 pin", 0x3 },
6092 { "CD pin", 0x4 },
6093 { "Mixer", 0x5 },
6094 { "LINE-OUT pin", 0x6 },
6095 { "HP-OUT pin", 0x7 },
6096 },
7cf51e48
JW
6097 },
6098};
6099static struct snd_kcontrol_new alc260_test_mixer[] = {
6100 /* Output driver widgets */
6101 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
6102 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
6103 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
6104 HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
6105 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6106 HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
6107
a1e8d2da
JW
6108 /* Modes for retasking pin widgets
6109 * Note: the ALC260 doesn't seem to act on requests to enable mic
6110 * bias from NIDs 0x0f and 0x10. The ALC260 datasheet doesn't
6111 * mention this restriction. At this stage it's not clear whether
6112 * this behaviour is intentional or is a hardware bug in chip
6113 * revisions available at least up until early 2006. Therefore for
6114 * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
6115 * choices, but if it turns out that the lack of mic bias for these
6116 * NIDs is intentional we could change their modes from
6117 * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
6118 */
7cf51e48
JW
6119 ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
6120 ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
6121 ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
6122 ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
6123 ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
6124 ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
6125
6126 /* Loopback mixer controls */
6127 HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
6128 HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
6129 HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
6130 HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
6131 HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
6132 HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
6133 HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
6134 HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
6135 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
6136 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
7cf51e48
JW
6137 HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
6138 HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
6139 HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
6140 HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
5c8f858d
JW
6141
6142 /* Controls for GPIO pins, assuming they are configured as outputs */
6143 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
6144 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
6145 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
6146 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
6147
92621f13
JW
6148 /* Switches to allow the digital IO pins to be enabled. The datasheet
6149 * is ambigious as to which NID is which; testing on laptops which
ea1fb29a 6150 * make this output available should provide clarification.
92621f13
JW
6151 */
6152 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
6153 ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
6154
f8225f6d
JW
6155 /* A switch allowing EAPD to be enabled. Some laptops seem to use
6156 * this output to turn on an external amplifier.
6157 */
6158 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
6159 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
6160
7cf51e48
JW
6161 { } /* end */
6162};
6163static struct hda_verb alc260_test_init_verbs[] = {
5c8f858d
JW
6164 /* Enable all GPIOs as outputs with an initial value of 0 */
6165 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
6166 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6167 {0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
6168
7cf51e48
JW
6169 /* Enable retasking pins as output, initially without power amp */
6170 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6171 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6172 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6173 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6174 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6175 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6176
92621f13
JW
6177 /* Disable digital (SPDIF) pins initially, but users can enable
6178 * them via a mixer switch. In the case of SPDIF-out, this initverb
6179 * payload also sets the generation to 0, output to be in "consumer"
6180 * PCM format, copyright asserted, no pre-emphasis and no validity
6181 * control.
6182 */
7cf51e48
JW
6183 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6184 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6185
ea1fb29a 6186 /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
7cf51e48
JW
6187 * OUT1 sum bus when acting as an output.
6188 */
6189 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6190 {0x0c, AC_VERB_SET_CONNECT_SEL, 0},
6191 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6192 {0x0e, AC_VERB_SET_CONNECT_SEL, 0},
6193
6194 /* Start with output sum widgets muted and their output gains at min */
6195 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6196 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6197 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6198 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6199 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6200 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6201 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6202 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6203 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6204
cdcd9268
JW
6205 /* Unmute retasking pin widget output buffers since the default
6206 * state appears to be output. As the pin mode is changed by the
6207 * user the pin mode control will take care of enabling the pin's
6208 * input/output buffers as needed.
6209 */
7cf51e48
JW
6210 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6211 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6212 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6213 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6214 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6215 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6216 /* Also unmute the mono-out pin widget */
6217 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6218
7cf51e48
JW
6219 /* Mute capture amp left and right */
6220 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
f7ace40d
JW
6221 /* Set ADC connection select to match default mixer setting (mic1
6222 * pin)
7cf51e48
JW
6223 */
6224 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6225
6226 /* Do the same for the second ADC: mute capture input amp and
f7ace40d 6227 * set ADC connection to mic1 pin
7cf51e48
JW
6228 */
6229 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6230 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6231
6232 /* Mute all inputs to mixer widget (even unconnected ones) */
6233 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6234 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6235 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6236 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6237 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6238 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6239 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6240 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6241
6242 { }
6243};
6244#endif
6245
6330079f
TI
6246#define alc260_pcm_analog_playback alc880_pcm_analog_alt_playback
6247#define alc260_pcm_analog_capture alc880_pcm_analog_capture
1da177e4 6248
a3bcba38
TI
6249#define alc260_pcm_digital_playback alc880_pcm_digital_playback
6250#define alc260_pcm_digital_capture alc880_pcm_digital_capture
6251
df694daa
KY
6252/*
6253 * for BIOS auto-configuration
6254 */
16ded525 6255
df694daa 6256static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
863b4518 6257 const char *pfx, int *vol_bits)
df694daa
KY
6258{
6259 hda_nid_t nid_vol;
6260 unsigned long vol_val, sw_val;
df694daa
KY
6261 int err;
6262
6263 if (nid >= 0x0f && nid < 0x11) {
6264 nid_vol = nid - 0x7;
6265 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6266 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6267 } else if (nid == 0x11) {
6268 nid_vol = nid - 0x7;
6269 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
6270 sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
6271 } else if (nid >= 0x12 && nid <= 0x15) {
6272 nid_vol = 0x08;
6273 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6274 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6275 } else
6276 return 0; /* N/A */
ea1fb29a 6277
863b4518
TI
6278 if (!(*vol_bits & (1 << nid_vol))) {
6279 /* first control for the volume widget */
0afe5f89 6280 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
863b4518
TI
6281 if (err < 0)
6282 return err;
6283 *vol_bits |= (1 << nid_vol);
6284 }
0afe5f89 6285 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
f12ab1e0 6286 if (err < 0)
df694daa
KY
6287 return err;
6288 return 1;
6289}
6290
6291/* add playback controls from the parsed DAC table */
6292static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6293 const struct auto_pin_cfg *cfg)
6294{
6295 hda_nid_t nid;
6296 int err;
863b4518 6297 int vols = 0;
df694daa
KY
6298
6299 spec->multiout.num_dacs = 1;
6300 spec->multiout.dac_nids = spec->private_dac_nids;
6301 spec->multiout.dac_nids[0] = 0x02;
6302
6303 nid = cfg->line_out_pins[0];
6304 if (nid) {
23112d6d
TI
6305 const char *pfx;
6306 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6307 pfx = "Master";
6308 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6309 pfx = "Speaker";
6310 else
6311 pfx = "Front";
6312 err = alc260_add_playback_controls(spec, nid, pfx, &vols);
df694daa
KY
6313 if (err < 0)
6314 return err;
6315 }
6316
82bc955f 6317 nid = cfg->speaker_pins[0];
df694daa 6318 if (nid) {
863b4518 6319 err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
df694daa
KY
6320 if (err < 0)
6321 return err;
6322 }
6323
eb06ed8f 6324 nid = cfg->hp_pins[0];
df694daa 6325 if (nid) {
863b4518
TI
6326 err = alc260_add_playback_controls(spec, nid, "Headphone",
6327 &vols);
df694daa
KY
6328 if (err < 0)
6329 return err;
6330 }
f12ab1e0 6331 return 0;
df694daa
KY
6332}
6333
6334/* create playback/capture controls for input pins */
05f5f477 6335static int alc260_auto_create_input_ctls(struct hda_codec *codec,
df694daa
KY
6336 const struct auto_pin_cfg *cfg)
6337{
05f5f477 6338 return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
df694daa
KY
6339}
6340
6341static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6342 hda_nid_t nid, int pin_type,
6343 int sel_idx)
6344{
f6c7e546 6345 alc_set_pin_output(codec, nid, pin_type);
df694daa
KY
6346 /* need the manual connection? */
6347 if (nid >= 0x12) {
6348 int idx = nid - 0x12;
6349 snd_hda_codec_write(codec, idx + 0x0b, 0,
6350 AC_VERB_SET_CONNECT_SEL, sel_idx);
df694daa
KY
6351 }
6352}
6353
6354static void alc260_auto_init_multi_out(struct hda_codec *codec)
6355{
6356 struct alc_spec *spec = codec->spec;
6357 hda_nid_t nid;
6358
f12ab1e0 6359 nid = spec->autocfg.line_out_pins[0];
baba8ee9
TI
6360 if (nid) {
6361 int pin_type = get_pin_type(spec->autocfg.line_out_type);
6362 alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6363 }
ea1fb29a 6364
82bc955f 6365 nid = spec->autocfg.speaker_pins[0];
df694daa
KY
6366 if (nid)
6367 alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6368
eb06ed8f 6369 nid = spec->autocfg.hp_pins[0];
df694daa 6370 if (nid)
baba8ee9 6371 alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
f12ab1e0 6372}
df694daa
KY
6373
6374#define ALC260_PIN_CD_NID 0x16
6375static void alc260_auto_init_analog_input(struct hda_codec *codec)
6376{
6377 struct alc_spec *spec = codec->spec;
6378 int i;
6379
6380 for (i = 0; i < AUTO_PIN_LAST; i++) {
6381 hda_nid_t nid = spec->autocfg.input_pins[i];
6382 if (nid >= 0x12) {
23f0c048 6383 alc_set_input_pin(codec, nid, i);
e82c025b
TI
6384 if (nid != ALC260_PIN_CD_NID &&
6385 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
f12ab1e0
TI
6386 snd_hda_codec_write(codec, nid, 0,
6387 AC_VERB_SET_AMP_GAIN_MUTE,
df694daa
KY
6388 AMP_OUT_MUTE);
6389 }
6390 }
6391}
6392
6393/*
6394 * generic initialization of ADC, input mixers and output mixers
6395 */
6396static struct hda_verb alc260_volume_init_verbs[] = {
6397 /*
6398 * Unmute ADC0-1 and set the default input to mic-in
6399 */
6400 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6401 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6402 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6403 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
ea1fb29a 6404
df694daa
KY
6405 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6406 * mixer widget
f12ab1e0
TI
6407 * Note: PASD motherboards uses the Line In 2 as the input for
6408 * front panel mic (mic 2)
df694daa
KY
6409 */
6410 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
6411 /* mute analog inputs */
6412 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6413 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6414 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6415 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6416 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
df694daa
KY
6417
6418 /*
6419 * Set up output mixers (0x08 - 0x0a)
6420 */
6421 /* set vol=0 to output mixers */
6422 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6423 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6424 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6425 /* set up input amps for analog loopback */
6426 /* Amp Indices: DAC = 0, mixer = 1 */
6427 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6428 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6429 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6430 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6431 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6432 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 6433
df694daa
KY
6434 { }
6435};
6436
6437static int alc260_parse_auto_config(struct hda_codec *codec)
6438{
6439 struct alc_spec *spec = codec->spec;
df694daa
KY
6440 int err;
6441 static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6442
f12ab1e0
TI
6443 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6444 alc260_ignore);
6445 if (err < 0)
df694daa 6446 return err;
f12ab1e0
TI
6447 err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6448 if (err < 0)
4a471b7d 6449 return err;
603c4019 6450 if (!spec->kctls.list)
df694daa 6451 return 0; /* can't find valid BIOS pin config */
05f5f477 6452 err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 6453 if (err < 0)
df694daa
KY
6454 return err;
6455
6456 spec->multiout.max_channels = 2;
6457
0852d7a6 6458 if (spec->autocfg.dig_outs)
df694daa 6459 spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
603c4019 6460 if (spec->kctls.list)
d88897ea 6461 add_mixer(spec, spec->kctls.list);
df694daa 6462
d88897ea 6463 add_verb(spec, alc260_volume_init_verbs);
df694daa 6464
a1e8d2da 6465 spec->num_mux_defs = 1;
61b9b9b1 6466 spec->input_mux = &spec->private_imux[0];
df694daa 6467
6227cdce 6468 alc_ssid_check(codec, 0x10, 0x15, 0x0f, 0);
4a79ba34 6469
df694daa
KY
6470 return 1;
6471}
6472
ae6b813a
TI
6473/* additional initialization for auto-configuration model */
6474static void alc260_auto_init(struct hda_codec *codec)
df694daa 6475{
f6c7e546 6476 struct alc_spec *spec = codec->spec;
df694daa
KY
6477 alc260_auto_init_multi_out(codec);
6478 alc260_auto_init_analog_input(codec);
f6c7e546 6479 if (spec->unsol_event)
7fb0d78f 6480 alc_inithook(codec);
df694daa
KY
6481}
6482
cb53c626
TI
6483#ifdef CONFIG_SND_HDA_POWER_SAVE
6484static struct hda_amp_list alc260_loopbacks[] = {
6485 { 0x07, HDA_INPUT, 0 },
6486 { 0x07, HDA_INPUT, 1 },
6487 { 0x07, HDA_INPUT, 2 },
6488 { 0x07, HDA_INPUT, 3 },
6489 { 0x07, HDA_INPUT, 4 },
6490 { } /* end */
6491};
6492#endif
6493
df694daa
KY
6494/*
6495 * ALC260 configurations
6496 */
f5fcc13c
TI
6497static const char *alc260_models[ALC260_MODEL_LAST] = {
6498 [ALC260_BASIC] = "basic",
6499 [ALC260_HP] = "hp",
6500 [ALC260_HP_3013] = "hp-3013",
2922c9af 6501 [ALC260_HP_DC7600] = "hp-dc7600",
f5fcc13c
TI
6502 [ALC260_FUJITSU_S702X] = "fujitsu",
6503 [ALC260_ACER] = "acer",
bc9f98a9
KY
6504 [ALC260_WILL] = "will",
6505 [ALC260_REPLACER_672V] = "replacer",
cc959489 6506 [ALC260_FAVORIT100] = "favorit100",
7cf51e48 6507#ifdef CONFIG_SND_DEBUG
f5fcc13c 6508 [ALC260_TEST] = "test",
7cf51e48 6509#endif
f5fcc13c
TI
6510 [ALC260_AUTO] = "auto",
6511};
6512
6513static struct snd_pci_quirk alc260_cfg_tbl[] = {
bd869485 6514 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
950200e2 6515 SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
f5fcc13c 6516 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
cc959489 6517 SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
9720b718 6518 SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
4ac55982 6519 SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
f5fcc13c 6520 SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
34ec8a0a 6521 SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
3f878308 6522 SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
f5fcc13c
TI
6523 SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6524 SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6525 SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6526 SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6527 SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6528 SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6529 SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6530 SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6531 SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
bc9f98a9 6532 SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
ac3e3741 6533 SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
df694daa
KY
6534 {}
6535};
6536
6537static struct alc_config_preset alc260_presets[] = {
6538 [ALC260_BASIC] = {
6539 .mixers = { alc260_base_output_mixer,
45bdd1c1 6540 alc260_input_mixer },
df694daa
KY
6541 .init_verbs = { alc260_init_verbs },
6542 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6543 .dac_nids = alc260_dac_nids,
f9e336f6 6544 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
9c4cc0bd 6545 .adc_nids = alc260_dual_adc_nids,
df694daa
KY
6546 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6547 .channel_mode = alc260_modes,
6548 .input_mux = &alc260_capture_source,
6549 },
6550 [ALC260_HP] = {
bec15c3a 6551 .mixers = { alc260_hp_output_mixer,
f9e336f6 6552 alc260_input_mixer },
bec15c3a
TI
6553 .init_verbs = { alc260_init_verbs,
6554 alc260_hp_unsol_verbs },
df694daa
KY
6555 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6556 .dac_nids = alc260_dac_nids,
f9e336f6
TI
6557 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6558 .adc_nids = alc260_adc_nids_alt,
df694daa
KY
6559 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6560 .channel_mode = alc260_modes,
6561 .input_mux = &alc260_capture_source,
bec15c3a
TI
6562 .unsol_event = alc260_hp_unsol_event,
6563 .init_hook = alc260_hp_automute,
df694daa 6564 },
3f878308
KY
6565 [ALC260_HP_DC7600] = {
6566 .mixers = { alc260_hp_dc7600_mixer,
f9e336f6 6567 alc260_input_mixer },
3f878308
KY
6568 .init_verbs = { alc260_init_verbs,
6569 alc260_hp_dc7600_verbs },
6570 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6571 .dac_nids = alc260_dac_nids,
f9e336f6
TI
6572 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6573 .adc_nids = alc260_adc_nids_alt,
3f878308
KY
6574 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6575 .channel_mode = alc260_modes,
6576 .input_mux = &alc260_capture_source,
6577 .unsol_event = alc260_hp_3012_unsol_event,
6578 .init_hook = alc260_hp_3012_automute,
6579 },
df694daa
KY
6580 [ALC260_HP_3013] = {
6581 .mixers = { alc260_hp_3013_mixer,
f9e336f6 6582 alc260_input_mixer },
bec15c3a
TI
6583 .init_verbs = { alc260_hp_3013_init_verbs,
6584 alc260_hp_3013_unsol_verbs },
df694daa
KY
6585 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6586 .dac_nids = alc260_dac_nids,
f9e336f6
TI
6587 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6588 .adc_nids = alc260_adc_nids_alt,
df694daa
KY
6589 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6590 .channel_mode = alc260_modes,
6591 .input_mux = &alc260_capture_source,
bec15c3a
TI
6592 .unsol_event = alc260_hp_3013_unsol_event,
6593 .init_hook = alc260_hp_3013_automute,
df694daa
KY
6594 },
6595 [ALC260_FUJITSU_S702X] = {
f9e336f6 6596 .mixers = { alc260_fujitsu_mixer },
df694daa
KY
6597 .init_verbs = { alc260_fujitsu_init_verbs },
6598 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6599 .dac_nids = alc260_dac_nids,
d57fdac0
JW
6600 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6601 .adc_nids = alc260_dual_adc_nids,
df694daa
KY
6602 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6603 .channel_mode = alc260_modes,
a1e8d2da
JW
6604 .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
6605 .input_mux = alc260_fujitsu_capture_sources,
df694daa 6606 },
0bfc90e9 6607 [ALC260_ACER] = {
f9e336f6 6608 .mixers = { alc260_acer_mixer },
0bfc90e9
JW
6609 .init_verbs = { alc260_acer_init_verbs },
6610 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6611 .dac_nids = alc260_dac_nids,
6612 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6613 .adc_nids = alc260_dual_adc_nids,
6614 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6615 .channel_mode = alc260_modes,
a1e8d2da
JW
6616 .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
6617 .input_mux = alc260_acer_capture_sources,
0bfc90e9 6618 },
cc959489
MS
6619 [ALC260_FAVORIT100] = {
6620 .mixers = { alc260_favorit100_mixer },
6621 .init_verbs = { alc260_favorit100_init_verbs },
6622 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6623 .dac_nids = alc260_dac_nids,
6624 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6625 .adc_nids = alc260_dual_adc_nids,
6626 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6627 .channel_mode = alc260_modes,
6628 .num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
6629 .input_mux = alc260_favorit100_capture_sources,
6630 },
bc9f98a9 6631 [ALC260_WILL] = {
f9e336f6 6632 .mixers = { alc260_will_mixer },
bc9f98a9
KY
6633 .init_verbs = { alc260_init_verbs, alc260_will_verbs },
6634 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6635 .dac_nids = alc260_dac_nids,
6636 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6637 .adc_nids = alc260_adc_nids,
6638 .dig_out_nid = ALC260_DIGOUT_NID,
6639 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6640 .channel_mode = alc260_modes,
6641 .input_mux = &alc260_capture_source,
6642 },
6643 [ALC260_REPLACER_672V] = {
f9e336f6 6644 .mixers = { alc260_replacer_672v_mixer },
bc9f98a9
KY
6645 .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
6646 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6647 .dac_nids = alc260_dac_nids,
6648 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6649 .adc_nids = alc260_adc_nids,
6650 .dig_out_nid = ALC260_DIGOUT_NID,
6651 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6652 .channel_mode = alc260_modes,
6653 .input_mux = &alc260_capture_source,
6654 .unsol_event = alc260_replacer_672v_unsol_event,
6655 .init_hook = alc260_replacer_672v_automute,
6656 },
7cf51e48
JW
6657#ifdef CONFIG_SND_DEBUG
6658 [ALC260_TEST] = {
f9e336f6 6659 .mixers = { alc260_test_mixer },
7cf51e48
JW
6660 .init_verbs = { alc260_test_init_verbs },
6661 .num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
6662 .dac_nids = alc260_test_dac_nids,
6663 .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
6664 .adc_nids = alc260_test_adc_nids,
6665 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6666 .channel_mode = alc260_modes,
a1e8d2da
JW
6667 .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
6668 .input_mux = alc260_test_capture_sources,
7cf51e48
JW
6669 },
6670#endif
df694daa
KY
6671};
6672
6673static int patch_alc260(struct hda_codec *codec)
1da177e4
LT
6674{
6675 struct alc_spec *spec;
df694daa 6676 int err, board_config;
1da177e4 6677
e560d8d8 6678 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1da177e4
LT
6679 if (spec == NULL)
6680 return -ENOMEM;
6681
6682 codec->spec = spec;
6683
f5fcc13c
TI
6684 board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
6685 alc260_models,
6686 alc260_cfg_tbl);
6687 if (board_config < 0) {
9a11f1aa 6688 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6c627f39 6689 codec->chip_name);
df694daa 6690 board_config = ALC260_AUTO;
16ded525 6691 }
1da177e4 6692
df694daa
KY
6693 if (board_config == ALC260_AUTO) {
6694 /* automatic parse from the BIOS config */
6695 err = alc260_parse_auto_config(codec);
6696 if (err < 0) {
6697 alc_free(codec);
6698 return err;
f12ab1e0 6699 } else if (!err) {
9c7f852e
TI
6700 printk(KERN_INFO
6701 "hda_codec: Cannot set up configuration "
6702 "from BIOS. Using base mode...\n");
df694daa
KY
6703 board_config = ALC260_BASIC;
6704 }
a9430dd8 6705 }
e9edcee0 6706
680cd536
KK
6707 err = snd_hda_attach_beep_device(codec, 0x1);
6708 if (err < 0) {
6709 alc_free(codec);
6710 return err;
6711 }
6712
df694daa 6713 if (board_config != ALC260_AUTO)
e9c364c0 6714 setup_preset(codec, &alc260_presets[board_config]);
1da177e4 6715
1da177e4
LT
6716 spec->stream_analog_playback = &alc260_pcm_analog_playback;
6717 spec->stream_analog_capture = &alc260_pcm_analog_capture;
6718
a3bcba38
TI
6719 spec->stream_digital_playback = &alc260_pcm_digital_playback;
6720 spec->stream_digital_capture = &alc260_pcm_digital_capture;
6721
4ef0ef19
TI
6722 if (!spec->adc_nids && spec->input_mux) {
6723 /* check whether NID 0x04 is valid */
6724 unsigned int wcap = get_wcaps(codec, 0x04);
a22d543a 6725 wcap = get_wcaps_type(wcap);
4ef0ef19
TI
6726 /* get type */
6727 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
6728 spec->adc_nids = alc260_adc_nids_alt;
6729 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
6730 } else {
6731 spec->adc_nids = alc260_adc_nids;
6732 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
6733 }
6734 }
b59bdf3b 6735 set_capture_mixer(codec);
45bdd1c1 6736 set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
f9e336f6 6737
2134ea4f
TI
6738 spec->vmaster_nid = 0x08;
6739
1da177e4 6740 codec->patch_ops = alc_patch_ops;
df694daa 6741 if (board_config == ALC260_AUTO)
ae6b813a 6742 spec->init_hook = alc260_auto_init;
cb53c626
TI
6743#ifdef CONFIG_SND_HDA_POWER_SAVE
6744 if (!spec->loopback.amplist)
6745 spec->loopback.amplist = alc260_loopbacks;
6746#endif
1da177e4
LT
6747
6748 return 0;
6749}
6750
e9edcee0 6751
1da177e4 6752/*
4953550a 6753 * ALC882/883/885/888/889 support
1da177e4
LT
6754 *
6755 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
6756 * configuration. Each pin widget can choose any input DACs and a mixer.
6757 * Each ADC is connected from a mixer of all inputs. This makes possible
6758 * 6-channel independent captures.
6759 *
6760 * In addition, an independent DAC for the multi-playback (not used in this
6761 * driver yet).
6762 */
df694daa
KY
6763#define ALC882_DIGOUT_NID 0x06
6764#define ALC882_DIGIN_NID 0x0a
4953550a
TI
6765#define ALC883_DIGOUT_NID ALC882_DIGOUT_NID
6766#define ALC883_DIGIN_NID ALC882_DIGIN_NID
6767#define ALC1200_DIGOUT_NID 0x10
6768
1da177e4 6769
d2a6d7dc 6770static struct hda_channel_mode alc882_ch_modes[1] = {
1da177e4
LT
6771 { 8, NULL }
6772};
6773
4953550a 6774/* DACs */
1da177e4
LT
6775static hda_nid_t alc882_dac_nids[4] = {
6776 /* front, rear, clfe, rear_surr */
6777 0x02, 0x03, 0x04, 0x05
6778};
4953550a 6779#define alc883_dac_nids alc882_dac_nids
1da177e4 6780
4953550a 6781/* ADCs */
df694daa
KY
6782#define alc882_adc_nids alc880_adc_nids
6783#define alc882_adc_nids_alt alc880_adc_nids_alt
4953550a
TI
6784#define alc883_adc_nids alc882_adc_nids_alt
6785static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
6786static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
6787#define alc889_adc_nids alc880_adc_nids
1da177e4 6788
e1406348
TI
6789static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
6790static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
4953550a
TI
6791#define alc883_capsrc_nids alc882_capsrc_nids_alt
6792static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
6793#define alc889_capsrc_nids alc882_capsrc_nids
e1406348 6794
1da177e4
LT
6795/* input MUX */
6796/* FIXME: should be a matrix-type input source selection */
6797
6798static struct hda_input_mux alc882_capture_source = {
6799 .num_items = 4,
6800 .items = {
6801 { "Mic", 0x0 },
6802 { "Front Mic", 0x1 },
6803 { "Line", 0x2 },
6804 { "CD", 0x4 },
6805 },
6806};
41d5545d 6807
4953550a
TI
6808#define alc883_capture_source alc882_capture_source
6809
87a8c370
JK
6810static struct hda_input_mux alc889_capture_source = {
6811 .num_items = 3,
6812 .items = {
6813 { "Front Mic", 0x0 },
6814 { "Mic", 0x3 },
6815 { "Line", 0x2 },
6816 },
6817};
6818
41d5545d
KS
6819static struct hda_input_mux mb5_capture_source = {
6820 .num_items = 3,
6821 .items = {
6822 { "Mic", 0x1 },
6823 { "Line", 0x2 },
6824 { "CD", 0x4 },
6825 },
6826};
6827
e458b1fa
LY
6828static struct hda_input_mux macmini3_capture_source = {
6829 .num_items = 2,
6830 .items = {
6831 { "Line", 0x2 },
6832 { "CD", 0x4 },
6833 },
6834};
6835
4953550a
TI
6836static struct hda_input_mux alc883_3stack_6ch_intel = {
6837 .num_items = 4,
6838 .items = {
6839 { "Mic", 0x1 },
6840 { "Front Mic", 0x0 },
6841 { "Line", 0x2 },
6842 { "CD", 0x4 },
6843 },
6844};
6845
6846static struct hda_input_mux alc883_lenovo_101e_capture_source = {
6847 .num_items = 2,
6848 .items = {
6849 { "Mic", 0x1 },
6850 { "Line", 0x2 },
6851 },
6852};
6853
6854static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
6855 .num_items = 4,
6856 .items = {
6857 { "Mic", 0x0 },
6858 { "iMic", 0x1 },
6859 { "Line", 0x2 },
6860 { "CD", 0x4 },
6861 },
6862};
6863
6864static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
6865 .num_items = 2,
6866 .items = {
6867 { "Mic", 0x0 },
6868 { "Int Mic", 0x1 },
6869 },
6870};
6871
6872static struct hda_input_mux alc883_lenovo_sky_capture_source = {
6873 .num_items = 3,
6874 .items = {
6875 { "Mic", 0x0 },
6876 { "Front Mic", 0x1 },
6877 { "Line", 0x4 },
6878 },
6879};
6880
6881static struct hda_input_mux alc883_asus_eee1601_capture_source = {
6882 .num_items = 2,
6883 .items = {
6884 { "Mic", 0x0 },
6885 { "Line", 0x2 },
6886 },
6887};
6888
6889static struct hda_input_mux alc889A_mb31_capture_source = {
6890 .num_items = 2,
6891 .items = {
6892 { "Mic", 0x0 },
6893 /* Front Mic (0x01) unused */
6894 { "Line", 0x2 },
6895 /* Line 2 (0x03) unused */
af901ca1 6896 /* CD (0x04) unused? */
4953550a
TI
6897 },
6898};
6899
6900/*
6901 * 2ch mode
6902 */
6903static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
6904 { 2, NULL }
6905};
6906
272a527c
KY
6907/*
6908 * 2ch mode
6909 */
6910static struct hda_verb alc882_3ST_ch2_init[] = {
6911 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6912 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
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
4953550a
TI
6918/*
6919 * 4ch mode
6920 */
6921static struct hda_verb alc882_3ST_ch4_init[] = {
6922 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6923 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6924 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6925 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6926 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6927 { } /* end */
6928};
6929
272a527c
KY
6930/*
6931 * 6ch mode
6932 */
6933static struct hda_verb alc882_3ST_ch6_init[] = {
6934 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6935 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6936 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6937 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6938 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6939 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6940 { } /* end */
6941};
6942
4953550a 6943static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
272a527c 6944 { 2, alc882_3ST_ch2_init },
4953550a 6945 { 4, alc882_3ST_ch4_init },
272a527c
KY
6946 { 6, alc882_3ST_ch6_init },
6947};
6948
4953550a
TI
6949#define alc883_3ST_6ch_modes alc882_3ST_6ch_modes
6950
a65cc60f 6951/*
6952 * 2ch mode
6953 */
6954static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
6955 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
6956 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6957 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6958 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6959 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6960 { } /* end */
6961};
6962
6963/*
6964 * 4ch mode
6965 */
6966static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
6967 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6968 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6969 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6970 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6971 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6972 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6973 { } /* end */
6974};
6975
6976/*
6977 * 6ch mode
6978 */
6979static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
6980 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6981 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6982 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6983 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6984 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6985 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6986 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6987 { } /* end */
6988};
6989
6990static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
6991 { 2, alc883_3ST_ch2_clevo_init },
6992 { 4, alc883_3ST_ch4_clevo_init },
6993 { 6, alc883_3ST_ch6_clevo_init },
6994};
6995
6996
df694daa
KY
6997/*
6998 * 6ch mode
6999 */
7000static struct hda_verb alc882_sixstack_ch6_init[] = {
7001 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7002 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7003 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7004 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7005 { } /* end */
7006};
7007
7008/*
7009 * 8ch mode
7010 */
7011static struct hda_verb alc882_sixstack_ch8_init[] = {
7012 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7013 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7014 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7015 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7016 { } /* end */
7017};
7018
7019static struct hda_channel_mode alc882_sixstack_modes[2] = {
7020 { 6, alc882_sixstack_ch6_init },
7021 { 8, alc882_sixstack_ch8_init },
7022};
7023
76e6f5a9
RH
7024
7025/* Macbook Air 2,1 */
7026
7027static struct hda_channel_mode alc885_mba21_ch_modes[1] = {
7028 { 2, NULL },
7029};
7030
87350ad0 7031/*
def319f9 7032 * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
87350ad0
TI
7033 */
7034
7035/*
7036 * 2ch mode
7037 */
7038static struct hda_verb alc885_mbp_ch2_init[] = {
7039 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7040 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7041 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7042 { } /* end */
7043};
7044
7045/*
a3f730af 7046 * 4ch mode
87350ad0 7047 */
a3f730af 7048static struct hda_verb alc885_mbp_ch4_init[] = {
87350ad0
TI
7049 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7050 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7051 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7052 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7053 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7054 { } /* end */
7055};
7056
a3f730af 7057static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
87350ad0 7058 { 2, alc885_mbp_ch2_init },
a3f730af 7059 { 4, alc885_mbp_ch4_init },
87350ad0
TI
7060};
7061
92b9de83
KS
7062/*
7063 * 2ch
7064 * Speakers/Woofer/HP = Front
7065 * LineIn = Input
7066 */
7067static struct hda_verb alc885_mb5_ch2_init[] = {
7068 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7069 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7070 { } /* end */
7071};
7072
7073/*
7074 * 6ch mode
7075 * Speakers/HP = Front
7076 * Woofer = LFE
7077 * LineIn = Surround
7078 */
7079static struct hda_verb alc885_mb5_ch6_init[] = {
7080 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7081 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7082 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7083 { } /* end */
7084};
7085
7086static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
7087 { 2, alc885_mb5_ch2_init },
7088 { 6, alc885_mb5_ch6_init },
7089};
87350ad0 7090
d01aecdf 7091#define alc885_macmini3_6ch_modes alc885_mb5_6ch_modes
4953550a
TI
7092
7093/*
7094 * 2ch mode
7095 */
7096static struct hda_verb alc883_4ST_ch2_init[] = {
7097 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7098 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7099 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7100 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7101 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7102 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7103 { } /* end */
7104};
7105
7106/*
7107 * 4ch mode
7108 */
7109static struct hda_verb alc883_4ST_ch4_init[] = {
7110 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7111 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7112 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7113 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7114 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7115 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7116 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7117 { } /* end */
7118};
7119
7120/*
7121 * 6ch mode
7122 */
7123static struct hda_verb alc883_4ST_ch6_init[] = {
7124 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7125 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7126 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7127 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7128 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7129 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7130 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7131 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7132 { } /* end */
7133};
7134
7135/*
7136 * 8ch mode
7137 */
7138static struct hda_verb alc883_4ST_ch8_init[] = {
7139 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7140 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7141 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7142 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7143 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7144 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7145 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7146 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7147 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7148 { } /* end */
7149};
7150
7151static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
7152 { 2, alc883_4ST_ch2_init },
7153 { 4, alc883_4ST_ch4_init },
7154 { 6, alc883_4ST_ch6_init },
7155 { 8, alc883_4ST_ch8_init },
7156};
7157
7158
7159/*
7160 * 2ch mode
7161 */
7162static struct hda_verb alc883_3ST_ch2_intel_init[] = {
7163 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7164 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7165 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7166 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7167 { } /* end */
7168};
7169
7170/*
7171 * 4ch mode
7172 */
7173static struct hda_verb alc883_3ST_ch4_intel_init[] = {
7174 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7175 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7176 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7177 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7178 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7179 { } /* end */
7180};
7181
7182/*
7183 * 6ch mode
7184 */
7185static struct hda_verb alc883_3ST_ch6_intel_init[] = {
7186 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7187 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7188 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
7189 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7190 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7191 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7192 { } /* end */
7193};
7194
7195static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
7196 { 2, alc883_3ST_ch2_intel_init },
7197 { 4, alc883_3ST_ch4_intel_init },
7198 { 6, alc883_3ST_ch6_intel_init },
7199};
7200
dd7714c9
WF
7201/*
7202 * 2ch mode
7203 */
7204static struct hda_verb alc889_ch2_intel_init[] = {
7205 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7206 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
7207 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
7208 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
7209 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7210 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7211 { } /* end */
7212};
7213
87a8c370
JK
7214/*
7215 * 6ch mode
7216 */
7217static struct hda_verb alc889_ch6_intel_init[] = {
dd7714c9
WF
7218 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7219 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7220 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7221 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7222 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
87a8c370
JK
7223 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7224 { } /* end */
7225};
7226
7227/*
7228 * 8ch mode
7229 */
7230static struct hda_verb alc889_ch8_intel_init[] = {
dd7714c9
WF
7231 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7232 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7233 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7234 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7235 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
87a8c370
JK
7236 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7237 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
87a8c370
JK
7238 { } /* end */
7239};
7240
dd7714c9
WF
7241static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7242 { 2, alc889_ch2_intel_init },
87a8c370
JK
7243 { 6, alc889_ch6_intel_init },
7244 { 8, alc889_ch8_intel_init },
7245};
7246
4953550a
TI
7247/*
7248 * 6ch mode
7249 */
7250static struct hda_verb alc883_sixstack_ch6_init[] = {
7251 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7252 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7253 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7254 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7255 { } /* end */
7256};
7257
7258/*
7259 * 8ch mode
7260 */
7261static struct hda_verb alc883_sixstack_ch8_init[] = {
7262 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7263 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7264 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7265 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7266 { } /* end */
7267};
7268
7269static struct hda_channel_mode alc883_sixstack_modes[2] = {
7270 { 6, alc883_sixstack_ch6_init },
7271 { 8, alc883_sixstack_ch8_init },
7272};
7273
7274
1da177e4
LT
7275/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
7276 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
7277 */
c8b6bf9b 7278static struct snd_kcontrol_new alc882_base_mixer[] = {
05acb863 7279 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 7280 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
05acb863 7281 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 7282 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
05acb863
TI
7283 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7284 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
985be54b
TI
7285 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7286 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
05acb863 7287 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
985be54b 7288 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1da177e4
LT
7289 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7290 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7291 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7292 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7293 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7294 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 7295 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1da177e4
LT
7296 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7297 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
32360416 7298 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
1da177e4 7299 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
1da177e4
LT
7300 { } /* end */
7301};
7302
76e6f5a9
RH
7303/* Macbook Air 2,1 same control for HP and internal Speaker */
7304
7305static struct snd_kcontrol_new alc885_mba21_mixer[] = {
7306 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7307 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
7308 { }
7309};
7310
7311
87350ad0 7312static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
a3f730af
TI
7313 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7314 HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7315 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7316 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7317 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
2134ea4f
TI
7318 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7319 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
87350ad0
TI
7320 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7321 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
2134ea4f 7322 HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
87350ad0
TI
7323 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7324 { } /* end */
7325};
41d5545d
KS
7326
7327static struct snd_kcontrol_new alc885_mb5_mixer[] = {
92b9de83
KS
7328 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7329 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7330 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7331 HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7332 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7333 HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
a76221d4
AM
7334 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7335 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
41d5545d
KS
7336 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7337 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7338 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7339 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7340 HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7341 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7342 { } /* end */
7343};
92b9de83 7344
e458b1fa
LY
7345static struct snd_kcontrol_new alc885_macmini3_mixer[] = {
7346 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7347 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7348 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7349 HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7350 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7351 HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7352 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7353 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7354 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
7355 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
7356 HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7357 { } /* end */
7358};
7359
4b7e1803
JM
7360static struct snd_kcontrol_new alc885_imac91_mixer[] = {
7361 HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7362 HDA_BIND_MUTE ("Line-Out Playback Switch", 0x0c, 0x02, HDA_INPUT),
7363 HDA_CODEC_MUTE ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT),
7364 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7365 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7366 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7367 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7368 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7369 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7370 { } /* end */
7371};
7372
7373
bdd148a3
KY
7374static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7375 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7376 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7377 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7378 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7379 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7380 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7381 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7382 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7383 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
bdd148a3
KY
7384 { } /* end */
7385};
7386
272a527c
KY
7387static struct snd_kcontrol_new alc882_targa_mixer[] = {
7388 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7389 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7390 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7391 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7392 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7393 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7394 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7395 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7396 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
96fe7cc8 7397 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
272a527c
KY
7398 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7399 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
96fe7cc8 7400 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
272a527c
KY
7401 { } /* end */
7402};
7403
7404/* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7405 * Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7406 */
7407static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7408 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7409 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7410 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7411 HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7412 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7413 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7414 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7415 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7416 HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7417 HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7418 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7419 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
96fe7cc8 7420 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
272a527c
KY
7421 { } /* end */
7422};
7423
914759b7
TI
7424static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7425 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7426 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7427 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7428 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7429 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7430 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7431 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7432 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7433 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7434 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
914759b7
TI
7435 { } /* end */
7436};
7437
df694daa
KY
7438static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7439 {
7440 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7441 .name = "Channel Mode",
7442 .info = alc_ch_mode_info,
7443 .get = alc_ch_mode_get,
7444 .put = alc_ch_mode_put,
7445 },
7446 { } /* end */
7447};
7448
4953550a 7449static struct hda_verb alc882_base_init_verbs[] = {
1da177e4 7450 /* Front mixer: unmute input/output amp left and right (volume = 0) */
05acb863
TI
7451 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7452 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4 7453 /* Rear mixer */
05acb863
TI
7454 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7455 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4 7456 /* CLFE mixer */
05acb863
TI
7457 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7458 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4 7459 /* Side mixer */
05acb863
TI
7460 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7461 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4 7462
e9edcee0 7463 /* Front Pin: output 0 (0x0c) */
05acb863 7464 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
05acb863 7465 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 7466 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
e9edcee0 7467 /* Rear Pin: output 1 (0x0d) */
05acb863 7468 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
05acb863 7469 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 7470 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
e9edcee0 7471 /* CLFE Pin: output 2 (0x0e) */
05acb863 7472 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
05acb863 7473 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 7474 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
e9edcee0 7475 /* Side Pin: output 3 (0x0f) */
05acb863 7476 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
05acb863 7477 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 7478 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
e9edcee0 7479 /* Mic (rear) pin: input vref at 80% */
16ded525 7480 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0
TI
7481 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7482 /* Front Mic pin: input vref at 80% */
16ded525 7483 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0
TI
7484 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7485 /* Line In pin: input */
05acb863 7486 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
e9edcee0
TI
7487 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7488 /* Line-2 In: Headphone output (output 0 - 0x0c) */
7489 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7490 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7491 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1da177e4 7492 /* CD pin widget for input */
05acb863 7493 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1da177e4
LT
7494
7495 /* FIXME: use matrix-type input source selection */
7496 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
1da177e4 7497 /* Input mixer2 */
05acb863 7498 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1da177e4 7499 /* Input mixer3 */
05acb863 7500 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
05acb863
TI
7501 /* ADC2: mute amp left and right */
7502 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
71fe7b82 7503 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
05acb863
TI
7504 /* ADC3: mute amp left and right */
7505 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
71fe7b82 7506 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
1da177e4
LT
7507
7508 { }
7509};
7510
4953550a
TI
7511static struct hda_verb alc882_adc1_init_verbs[] = {
7512 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7513 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7514 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7515 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7516 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7517 /* ADC1: mute amp left and right */
7518 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7519 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7520 { }
7521};
7522
4b146cb0
TI
7523static struct hda_verb alc882_eapd_verbs[] = {
7524 /* change to EAPD mode */
7525 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
b373bdeb 7526 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
f12ab1e0 7527 { }
4b146cb0
TI
7528};
7529
87a8c370
JK
7530static struct hda_verb alc889_eapd_verbs[] = {
7531 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7532 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7533 { }
7534};
7535
6732bd0d
WF
7536static struct hda_verb alc_hp15_unsol_verbs[] = {
7537 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7538 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7539 {}
7540};
87a8c370
JK
7541
7542static struct hda_verb alc885_init_verbs[] = {
7543 /* Front mixer: unmute input/output amp left and right (volume = 0) */
88102f3f
KY
7544 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7545 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
87a8c370 7546 /* Rear mixer */
88102f3f
KY
7547 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7548 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
87a8c370 7549 /* CLFE mixer */
88102f3f
KY
7550 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7551 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
87a8c370 7552 /* Side mixer */
88102f3f
KY
7553 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7554 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
87a8c370
JK
7555
7556 /* Front HP Pin: output 0 (0x0c) */
6732bd0d 7557 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
87a8c370
JK
7558 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7559 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7560 /* Front Pin: output 0 (0x0c) */
7561 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7562 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7563 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7564 /* Rear Pin: output 1 (0x0d) */
7565 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7566 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7567 {0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
7568 /* CLFE Pin: output 2 (0x0e) */
7569 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7570 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7571 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7572 /* Side Pin: output 3 (0x0f) */
7573 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7574 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7575 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7576 /* Mic (rear) pin: input vref at 80% */
7577 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7578 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7579 /* Front Mic pin: input vref at 80% */
7580 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7581 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7582 /* Line In pin: input */
7583 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7584 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7585
7586 /* Mixer elements: 0x18, , 0x1a, 0x1b */
7587 /* Input mixer1 */
88102f3f 7588 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
87a8c370
JK
7589 /* Input mixer2 */
7590 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
87a8c370 7591 /* Input mixer3 */
88102f3f 7592 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
87a8c370
JK
7593 /* ADC2: mute amp left and right */
7594 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7595 /* ADC3: mute amp left and right */
7596 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7597
7598 { }
7599};
7600
7601static struct hda_verb alc885_init_input_verbs[] = {
7602 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7603 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7604 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7605 { }
7606};
7607
7608
7609/* Unmute Selector 24h and set the default input to front mic */
7610static struct hda_verb alc889_init_input_verbs[] = {
7611 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
7612 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7613 { }
7614};
7615
7616
4953550a
TI
7617#define alc883_init_verbs alc882_base_init_verbs
7618
9102cd1c
TD
7619/* Mac Pro test */
7620static struct snd_kcontrol_new alc882_macpro_mixer[] = {
7621 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7622 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7623 HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
7624 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
7625 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
45bdd1c1 7626 /* FIXME: this looks suspicious...
d355c82a
JK
7627 HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
7628 HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
45bdd1c1 7629 */
9102cd1c
TD
7630 { } /* end */
7631};
7632
7633static struct hda_verb alc882_macpro_init_verbs[] = {
7634 /* Front mixer: unmute input/output amp left and right (volume = 0) */
7635 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7636 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7637 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7638 /* Front Pin: output 0 (0x0c) */
7639 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7640 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7641 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7642 /* Front Mic pin: input vref at 80% */
7643 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7644 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7645 /* Speaker: output */
7646 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7647 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7648 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
7649 /* Headphone output (output 0 - 0x0c) */
7650 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7651 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7652 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7653
7654 /* FIXME: use matrix-type input source selection */
7655 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7656 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7657 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7658 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7659 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7660 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7661 /* Input mixer2 */
7662 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7663 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7664 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7665 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7666 /* Input mixer3 */
7667 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7668 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7669 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7670 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7671 /* ADC1: mute amp left and right */
7672 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7673 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7674 /* ADC2: mute amp left and right */
7675 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7676 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7677 /* ADC3: mute amp left and right */
7678 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7679 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7680
7681 { }
7682};
f12ab1e0 7683
41d5545d
KS
7684/* Macbook 5,1 */
7685static struct hda_verb alc885_mb5_init_verbs[] = {
92b9de83
KS
7686 /* DACs */
7687 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7688 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7689 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7690 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
41d5545d 7691 /* Front mixer */
41d5545d
KS
7692 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7693 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7694 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
92b9de83
KS
7695 /* Surround mixer */
7696 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7697 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7698 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7699 /* LFE mixer */
7700 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7701 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7702 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7703 /* HP mixer */
7704 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7705 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7706 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7707 /* Front Pin (0x0c) */
41d5545d
KS
7708 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7709 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
92b9de83
KS
7710 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7711 /* LFE Pin (0x0e) */
7712 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7713 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7714 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7715 /* HP Pin (0x0f) */
41d5545d
KS
7716 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7717 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
92b9de83 7718 {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
a76221d4 7719 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
41d5545d
KS
7720 /* Front Mic pin: input vref at 80% */
7721 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7722 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7723 /* Line In pin */
7724 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7725 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7726
7727 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7728 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7729 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7730 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7731 { }
7732};
7733
e458b1fa
LY
7734/* Macmini 3,1 */
7735static struct hda_verb alc885_macmini3_init_verbs[] = {
7736 /* DACs */
7737 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7738 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7739 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7740 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7741 /* Front mixer */
7742 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7743 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7744 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7745 /* Surround mixer */
7746 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7747 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7748 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7749 /* LFE mixer */
7750 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7751 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7752 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7753 /* HP mixer */
7754 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7755 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7756 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7757 /* Front Pin (0x0c) */
7758 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7759 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7760 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7761 /* LFE Pin (0x0e) */
7762 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7763 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7764 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7765 /* HP Pin (0x0f) */
7766 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7767 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7768 {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7769 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7770 /* Line In pin */
7771 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7772 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7773
7774 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7775 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7776 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7777 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7778 { }
7779};
7780
76e6f5a9
RH
7781
7782static struct hda_verb alc885_mba21_init_verbs[] = {
7783 /*Internal and HP Speaker Mixer*/
7784 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7785 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7786 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7787 /*Internal Speaker Pin (0x0c)*/
7788 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
7789 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7790 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7791 /* HP Pin: output 0 (0x0e) */
7792 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7793 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7794 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7795 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
7796 /* Line in (is hp when jack connected)*/
7797 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
7798 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7799
7800 { }
7801 };
7802
7803
87350ad0
TI
7804/* Macbook Pro rev3 */
7805static struct hda_verb alc885_mbp3_init_verbs[] = {
7806 /* Front mixer: unmute input/output amp left and right (volume = 0) */
7807 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7808 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7809 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7810 /* Rear mixer */
7811 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7812 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7813 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
a3f730af
TI
7814 /* HP mixer */
7815 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7816 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7817 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
87350ad0
TI
7818 /* Front Pin: output 0 (0x0c) */
7819 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7820 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7821 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
a3f730af 7822 /* HP Pin: output 0 (0x0e) */
87350ad0 7823 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
a3f730af
TI
7824 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7825 {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
87350ad0
TI
7826 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7827 /* Mic (rear) pin: input vref at 80% */
7828 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7829 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7830 /* Front Mic pin: input vref at 80% */
7831 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7832 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7833 /* Line In pin: use output 1 when in LineOut mode */
7834 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7835 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7836 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7837
7838 /* FIXME: use matrix-type input source selection */
7839 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7840 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7841 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7842 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7843 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7844 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7845 /* Input mixer2 */
7846 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7847 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7848 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7849 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7850 /* Input mixer3 */
7851 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7852 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7853 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7854 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7855 /* ADC1: mute amp left and right */
7856 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7857 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7858 /* ADC2: mute amp left and right */
7859 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7860 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7861 /* ADC3: mute amp left and right */
7862 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7863 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7864
7865 { }
7866};
7867
4b7e1803
JM
7868/* iMac 9,1 */
7869static struct hda_verb alc885_imac91_init_verbs[] = {
7870 /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
7871 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7872 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7873 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7874 /* Rear mixer */
7875 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7876 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7877 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7878 /* HP Pin: output 0 (0x0c) */
7879 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7880 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7881 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7882 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7883 /* Internal Speakers: output 0 (0x0d) */
7884 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7885 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7886 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7887 /* Mic (rear) pin: input vref at 80% */
7888 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7889 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7890 /* Front Mic pin: input vref at 80% */
7891 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7892 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7893 /* Line In pin: use output 1 when in LineOut mode */
7894 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7895 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7896 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7897
7898 /* FIXME: use matrix-type input source selection */
7899 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7900 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7901 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7902 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7903 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7904 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7905 /* Input mixer2 */
7906 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7907 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7908 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7909 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7910 /* Input mixer3 */
7911 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7912 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7913 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7914 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7915 /* ADC1: mute amp left and right */
7916 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7917 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7918 /* ADC2: mute amp left and right */
7919 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7920 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7921 /* ADC3: mute amp left and right */
7922 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7923 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7924
7925 { }
7926};
7927
c54728d8
NF
7928/* iMac 24 mixer. */
7929static struct snd_kcontrol_new alc885_imac24_mixer[] = {
7930 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7931 HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
7932 { } /* end */
7933};
7934
7935/* iMac 24 init verbs. */
7936static struct hda_verb alc885_imac24_init_verbs[] = {
7937 /* Internal speakers: output 0 (0x0c) */
7938 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7939 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7940 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7941 /* Internal speakers: output 0 (0x0c) */
7942 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7943 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7944 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
7945 /* Headphone: output 0 (0x0c) */
7946 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7947 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7948 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7949 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7950 /* Front Mic: input vref at 80% */
7951 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7952 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7953 { }
7954};
7955
7956/* Toggle speaker-output according to the hp-jack state */
4f5d1706 7957static void alc885_imac24_setup(struct hda_codec *codec)
c54728d8 7958{
a9fd4f3f 7959 struct alc_spec *spec = codec->spec;
c54728d8 7960
a9fd4f3f
TI
7961 spec->autocfg.hp_pins[0] = 0x14;
7962 spec->autocfg.speaker_pins[0] = 0x18;
7963 spec->autocfg.speaker_pins[1] = 0x1a;
c54728d8
NF
7964}
7965
9d54f08b
TI
7966#define alc885_mb5_setup alc885_imac24_setup
7967#define alc885_macmini3_setup alc885_imac24_setup
7968
76e6f5a9
RH
7969/* Macbook Air 2,1 */
7970static void alc885_mba21_setup(struct hda_codec *codec)
7971{
7972 struct alc_spec *spec = codec->spec;
7973
7974 spec->autocfg.hp_pins[0] = 0x14;
7975 spec->autocfg.speaker_pins[0] = 0x18;
7976}
7977
7978
7979
4f5d1706 7980static void alc885_mbp3_setup(struct hda_codec *codec)
87350ad0 7981{
a9fd4f3f 7982 struct alc_spec *spec = codec->spec;
87350ad0 7983
a9fd4f3f
TI
7984 spec->autocfg.hp_pins[0] = 0x15;
7985 spec->autocfg.speaker_pins[0] = 0x14;
87350ad0
TI
7986}
7987
9d54f08b 7988static void alc885_imac91_setup(struct hda_codec *codec)
a76221d4 7989{
9d54f08b 7990 struct alc_spec *spec = codec->spec;
4b7e1803 7991
9d54f08b
TI
7992 spec->autocfg.hp_pins[0] = 0x14;
7993 spec->autocfg.speaker_pins[0] = 0x15;
7994 spec->autocfg.speaker_pins[1] = 0x1a;
4b7e1803 7995}
87350ad0 7996
272a527c
KY
7997static struct hda_verb alc882_targa_verbs[] = {
7998 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7999 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8000
8001 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8002 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
ea1fb29a 8003
272a527c
KY
8004 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8005 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8006 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8007
8008 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
272a527c
KY
8009 { } /* end */
8010};
8011
8012/* toggle speaker-output according to the hp-jack state */
8013static void alc882_targa_automute(struct hda_codec *codec)
8014{
a9fd4f3f
TI
8015 struct alc_spec *spec = codec->spec;
8016 alc_automute_amp(codec);
82beb8fd 8017 snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
a9fd4f3f
TI
8018 spec->jack_present ? 1 : 3);
8019}
8020
4f5d1706 8021static void alc882_targa_setup(struct hda_codec *codec)
a9fd4f3f
TI
8022{
8023 struct alc_spec *spec = codec->spec;
8024
8025 spec->autocfg.hp_pins[0] = 0x14;
8026 spec->autocfg.speaker_pins[0] = 0x1b;
272a527c
KY
8027}
8028
8029static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
8030{
a9fd4f3f 8031 if ((res >> 26) == ALC880_HP_EVENT)
272a527c 8032 alc882_targa_automute(codec);
272a527c
KY
8033}
8034
8035static struct hda_verb alc882_asus_a7j_verbs[] = {
8036 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8037 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8038
8039 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8040 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8041 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
ea1fb29a 8042
272a527c
KY
8043 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8044 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8045 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8046
8047 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8048 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8049 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8050 { } /* end */
8051};
8052
914759b7
TI
8053static struct hda_verb alc882_asus_a7m_verbs[] = {
8054 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8055 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8056
8057 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8058 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8059 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
ea1fb29a 8060
914759b7
TI
8061 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8062 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8063 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8064
8065 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8066 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8067 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8068 { } /* end */
8069};
8070
9102cd1c
TD
8071static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
8072{
8073 unsigned int gpiostate, gpiomask, gpiodir;
8074
8075 gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
8076 AC_VERB_GET_GPIO_DATA, 0);
8077
8078 if (!muted)
8079 gpiostate |= (1 << pin);
8080 else
8081 gpiostate &= ~(1 << pin);
8082
8083 gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
8084 AC_VERB_GET_GPIO_MASK, 0);
8085 gpiomask |= (1 << pin);
8086
8087 gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
8088 AC_VERB_GET_GPIO_DIRECTION, 0);
8089 gpiodir |= (1 << pin);
8090
8091
8092 snd_hda_codec_write(codec, codec->afg, 0,
8093 AC_VERB_SET_GPIO_MASK, gpiomask);
8094 snd_hda_codec_write(codec, codec->afg, 0,
8095 AC_VERB_SET_GPIO_DIRECTION, gpiodir);
8096
8097 msleep(1);
8098
8099 snd_hda_codec_write(codec, codec->afg, 0,
8100 AC_VERB_SET_GPIO_DATA, gpiostate);
8101}
8102
7debbe51
TI
8103/* set up GPIO at initialization */
8104static void alc885_macpro_init_hook(struct hda_codec *codec)
8105{
8106 alc882_gpio_mute(codec, 0, 0);
8107 alc882_gpio_mute(codec, 1, 0);
8108}
8109
8110/* set up GPIO and update auto-muting at initialization */
8111static void alc885_imac24_init_hook(struct hda_codec *codec)
8112{
8113 alc885_macpro_init_hook(codec);
4f5d1706 8114 alc_automute_amp(codec);
7debbe51
TI
8115}
8116
df694daa
KY
8117/*
8118 * generic initialization of ADC, input mixers and output mixers
8119 */
4953550a 8120static struct hda_verb alc883_auto_init_verbs[] = {
df694daa
KY
8121 /*
8122 * Unmute ADC0-2 and set the default input to mic-in
8123 */
4953550a
TI
8124 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8125 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8126 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8127 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17bba1b7 8128
4953550a
TI
8129 /*
8130 * Set up output mixers (0x0c - 0x0f)
8131 */
8132 /* set vol=0 to output mixers */
8133 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8134 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8135 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8136 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8137 /* set up input amps for analog loopback */
8138 /* Amp Indices: DAC = 0, mixer = 1 */
8139 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8140 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8141 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8142 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8143 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8144 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8145 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8146 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8147 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8148 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9c7f852e 8149
4953550a
TI
8150 /* FIXME: use matrix-type input source selection */
8151 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8152 /* Input mixer2 */
88102f3f 8153 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4953550a 8154 /* Input mixer3 */
88102f3f 8155 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4953550a 8156 { }
9c7f852e
TI
8157};
8158
eb4c41d3
TS
8159/* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
8160static struct hda_verb alc889A_mb31_ch2_init[] = {
8161 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
8162 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8163 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
8164 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
8165 { } /* end */
8166};
8167
8168/* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
8169static struct hda_verb alc889A_mb31_ch4_init[] = {
8170 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
8171 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8172 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
8173 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8174 { } /* end */
8175};
8176
8177/* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
8178static struct hda_verb alc889A_mb31_ch5_init[] = {
8179 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as rear */
8180 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8181 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
8182 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
8183 { } /* end */
8184};
8185
8186/* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
8187static struct hda_verb alc889A_mb31_ch6_init[] = {
8188 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as front */
8189 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Subwoofer off */
8190 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
8191 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8192 { } /* end */
8193};
8194
8195static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
8196 { 2, alc889A_mb31_ch2_init },
8197 { 4, alc889A_mb31_ch4_init },
8198 { 5, alc889A_mb31_ch5_init },
8199 { 6, alc889A_mb31_ch6_init },
8200};
8201
b373bdeb
AN
8202static struct hda_verb alc883_medion_eapd_verbs[] = {
8203 /* eanable EAPD on medion laptop */
8204 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8205 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
8206 { }
8207};
8208
4953550a 8209#define alc883_base_mixer alc882_base_mixer
834be88d 8210
a8848bd6
AS
8211static struct snd_kcontrol_new alc883_mitac_mixer[] = {
8212 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8213 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8214 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8215 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8216 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8217 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8218 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8219 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8220 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8221 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8222 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8223 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8224 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
a8848bd6
AS
8225 { } /* end */
8226};
8227
0c4cc443 8228static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
368c7a95
J
8229 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8230 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8231 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8232 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8233 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8234 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8235 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8236 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8237 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8238 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
368c7a95
J
8239 { } /* end */
8240};
8241
fb97dc67
J
8242static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
8243 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8244 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8245 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8246 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8247 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8248 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8249 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8250 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8251 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8252 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
fb97dc67
J
8253 { } /* end */
8254};
8255
9c7f852e
TI
8256static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
8257 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8258 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8259 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8260 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8261 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8262 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8263 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8264 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 8265 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9c7f852e
TI
8266 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8267 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
32360416 8268 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
9c7f852e 8269 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
9c7f852e
TI
8270 { } /* end */
8271};
df694daa 8272
9c7f852e
TI
8273static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8274 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8275 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8276 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8277 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8278 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8279 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8280 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8281 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8282 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8283 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8284 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8285 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8286 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8287 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 8288 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9c7f852e
TI
8289 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8290 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
32360416 8291 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
9c7f852e 8292 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
9c7f852e
TI
8293 { } /* end */
8294};
8295
17bba1b7
J
8296static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8297 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8298 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8299 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8300 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8301 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8302 HDA_OUTPUT),
8303 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8304 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8305 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8306 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8307 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8308 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8309 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8310 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8311 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8312 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8313 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8314 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8315 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8316 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17bba1b7
J
8317 { } /* end */
8318};
8319
87a8c370
JK
8320static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8321 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8322 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8323 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8324 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8325 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8326 HDA_OUTPUT),
8327 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8328 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8329 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8330 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8331 HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
8332 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8333 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8334 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8335 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
8336 HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
8337 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
8338 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8339 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8340 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8341 { } /* end */
8342};
8343
d1d985f0 8344static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
c07584c8 8345 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
0701e064 8346 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
c07584c8 8347 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
0701e064 8348 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
c07584c8
TD
8349 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8350 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
0701e064
TI
8351 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8352 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
c07584c8
TD
8353 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8354 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8355 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8356 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8357 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8358 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 8359 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
c07584c8
TD
8360 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8361 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
32360416 8362 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
c07584c8 8363 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
c07584c8
TD
8364 { } /* end */
8365};
8366
c259249f 8367static struct snd_kcontrol_new alc883_targa_mixer[] = {
ccc656ce 8368 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
b99dba34 8369 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
ccc656ce 8370 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
b99dba34 8371 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
ccc656ce
KY
8372 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8373 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8374 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8375 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8376 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8377 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8378 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8379 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8380 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8381 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8382 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 8383 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
ccc656ce 8384 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
ccc656ce 8385 { } /* end */
f12ab1e0 8386};
ccc656ce 8387
c259249f 8388static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
ccc656ce 8389 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
b99dba34 8390 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
ccc656ce 8391 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
b99dba34 8392 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
ccc656ce
KY
8393 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8394 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8395 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 8396 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
ccc656ce 8397 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
4383fae0
J
8398 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8399 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8400 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
ccc656ce 8401 { } /* end */
f12ab1e0 8402};
ccc656ce 8403
b99dba34
TI
8404static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
8405 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8406 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8407 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8408 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8409 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8410 { } /* end */
8411};
8412
bc9f98a9
KY
8413static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
8414 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8415 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
86cd9298
TI
8416 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8417 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
bc9f98a9
KY
8418 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8419 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8420 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8421 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
bc9f98a9 8422 { } /* end */
f12ab1e0 8423};
bc9f98a9 8424
272a527c
KY
8425static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
8426 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8427 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
8428 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8429 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8430 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8431 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8432 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8433 HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8434 HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT),
272a527c
KY
8435 { } /* end */
8436};
8437
8438static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8439 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8440 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8441 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8442 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8443 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8444 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8445 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8446 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8447 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
272a527c 8448 { } /* end */
ea1fb29a 8449};
272a527c 8450
2880a867 8451static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
d1a991a6
KY
8452 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8453 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2880a867 8454 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2880a867
TD
8455 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8456 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
d1a991a6
KY
8457 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8458 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8459 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2880a867 8460 { } /* end */
d1a991a6 8461};
2880a867 8462
d2fd4b09
TV
8463static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8464 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8465 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8466 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8467 HDA_BIND_MUTE("LFE Playback Switch", 0x0f, 2, HDA_INPUT),
684a8842
TV
8468 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8469 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
d2fd4b09
TV
8470 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8471 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8472 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8473 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8474 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8475 { } /* end */
8476};
8477
e2757d5e
KY
8478static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8479 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8480 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8481 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8482 HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8483 HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8484 0x0d, 1, 0x0, HDA_OUTPUT),
8485 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8486 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8487 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8488 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8489 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
e2757d5e
KY
8490 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8491 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8492 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8493 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8494 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8495 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8496 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8497 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8498 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8499 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
e2757d5e
KY
8500 { } /* end */
8501};
8502
eb4c41d3
TS
8503static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8504 /* Output mixers */
8505 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8506 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8507 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8508 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8509 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8510 HDA_OUTPUT),
8511 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8512 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8513 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8514 /* Output switches */
8515 HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8516 HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8517 HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8518 /* Boost mixers */
8519 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8520 HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8521 /* Input mixers */
8522 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8523 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8524 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8525 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8526 { } /* end */
8527};
8528
3e1647c5
GG
8529static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
8530 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8531 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8532 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8533 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8534 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8535 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8536 { } /* end */
8537};
8538
e2757d5e
KY
8539static struct hda_bind_ctls alc883_bind_cap_vol = {
8540 .ops = &snd_hda_bind_vol,
8541 .values = {
8542 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8543 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8544 0
8545 },
8546};
8547
8548static struct hda_bind_ctls alc883_bind_cap_switch = {
8549 .ops = &snd_hda_bind_sw,
8550 .values = {
8551 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8552 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8553 0
8554 },
8555};
8556
8557static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
8558 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8559 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8560 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8561 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8562 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8563 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
4953550a
TI
8564 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8565 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8566 { } /* end */
8567};
df694daa 8568
4953550a
TI
8569static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
8570 HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
8571 HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
8572 {
8573 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8574 /* .name = "Capture Source", */
8575 .name = "Input Source",
8576 .count = 1,
8577 .info = alc_mux_enum_info,
8578 .get = alc_mux_enum_get,
8579 .put = alc_mux_enum_put,
8580 },
8581 { } /* end */
8582};
9c7f852e 8583
4953550a
TI
8584static struct snd_kcontrol_new alc883_chmode_mixer[] = {
8585 {
8586 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8587 .name = "Channel Mode",
8588 .info = alc_ch_mode_info,
8589 .get = alc_ch_mode_get,
8590 .put = alc_ch_mode_put,
8591 },
8592 { } /* end */
9c7f852e
TI
8593};
8594
a8848bd6 8595/* toggle speaker-output according to the hp-jack state */
4f5d1706 8596static void alc883_mitac_setup(struct hda_codec *codec)
a8848bd6 8597{
a9fd4f3f 8598 struct alc_spec *spec = codec->spec;
a8848bd6 8599
a9fd4f3f
TI
8600 spec->autocfg.hp_pins[0] = 0x15;
8601 spec->autocfg.speaker_pins[0] = 0x14;
8602 spec->autocfg.speaker_pins[1] = 0x17;
a8848bd6
AS
8603}
8604
8605/* auto-toggle front mic */
8606/*
8607static void alc883_mitac_mic_automute(struct hda_codec *codec)
8608{
864f92be 8609 unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0;
a8848bd6 8610
a8848bd6
AS
8611 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
8612}
8613*/
8614
a8848bd6
AS
8615static struct hda_verb alc883_mitac_verbs[] = {
8616 /* HP */
8617 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8618 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8619 /* Subwoofer */
8620 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8621 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8622
8623 /* enable unsolicited event */
8624 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8625 /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
8626
8627 { } /* end */
8628};
8629
a65cc60f 8630static struct hda_verb alc883_clevo_m540r_verbs[] = {
8631 /* HP */
8632 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8633 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8634 /* Int speaker */
8635 /*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
8636
8637 /* enable unsolicited event */
8638 /*
8639 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8640 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8641 */
8642
8643 { } /* end */
8644};
8645
0c4cc443 8646static struct hda_verb alc883_clevo_m720_verbs[] = {
368c7a95
J
8647 /* HP */
8648 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8649 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8650 /* Int speaker */
8651 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
8652 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8653
8654 /* enable unsolicited event */
8655 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
0c4cc443 8656 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
368c7a95
J
8657
8658 { } /* end */
8659};
8660
fb97dc67
J
8661static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
8662 /* HP */
8663 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8664 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8665 /* Subwoofer */
8666 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
8667 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8668
8669 /* enable unsolicited event */
8670 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8671
8672 { } /* end */
8673};
8674
c259249f 8675static struct hda_verb alc883_targa_verbs[] = {
ccc656ce
KY
8676 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8677 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8678
8679 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8680 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
ea1fb29a 8681
64a8be74
DH
8682/* Connect Line-Out side jack (SPDIF) to Side */
8683 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8684 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8685 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8686/* Connect Mic jack to CLFE */
8687 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8688 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8689 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
8690/* Connect Line-in jack to Surround */
8691 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8692 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8693 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8694/* Connect HP out jack to Front */
8695 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8696 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8697 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
ccc656ce
KY
8698
8699 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
ccc656ce
KY
8700
8701 { } /* end */
8702};
8703
bc9f98a9
KY
8704static struct hda_verb alc883_lenovo_101e_verbs[] = {
8705 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8706 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
8707 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
8708 { } /* end */
8709};
8710
272a527c
KY
8711static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
8712 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8713 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8714 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8715 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8716 { } /* end */
8717};
8718
8719static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
8720 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8721 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8722 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8723 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
8724 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8725 { } /* end */
8726};
8727
189609ae
KY
8728static struct hda_verb alc883_haier_w66_verbs[] = {
8729 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8730 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8731
8732 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8733
8734 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8735 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8736 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8737 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8738 { } /* end */
8739};
8740
e2757d5e
KY
8741static struct hda_verb alc888_lenovo_sky_verbs[] = {
8742 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8743 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8744 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8745 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8746 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8747 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8748 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8749 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8750 { } /* end */
8751};
8752
8718b700
HRK
8753static struct hda_verb alc888_6st_dell_verbs[] = {
8754 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8755 { }
8756};
8757
3e1647c5
GG
8758static struct hda_verb alc883_vaiott_verbs[] = {
8759 /* HP */
8760 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8761 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8762
8763 /* enable unsolicited event */
8764 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8765
8766 { } /* end */
8767};
8768
4f5d1706 8769static void alc888_3st_hp_setup(struct hda_codec *codec)
8718b700 8770{
a9fd4f3f 8771 struct alc_spec *spec = codec->spec;
8718b700 8772
a9fd4f3f
TI
8773 spec->autocfg.hp_pins[0] = 0x1b;
8774 spec->autocfg.speaker_pins[0] = 0x14;
8775 spec->autocfg.speaker_pins[1] = 0x16;
8776 spec->autocfg.speaker_pins[2] = 0x18;
8718b700
HRK
8777}
8778
4723c022 8779static struct hda_verb alc888_3st_hp_verbs[] = {
8341de60 8780 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */
f32a19e3
HRK
8781 {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */
8782 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */
5795b9e6 8783 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8718b700 8784 { } /* end */
5795b9e6
CM
8785};
8786
3ea0d7cf
HRK
8787/*
8788 * 2ch mode
8789 */
4723c022 8790static struct hda_verb alc888_3st_hp_2ch_init[] = {
8341de60
CM
8791 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8792 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8793 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
8794 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
3ea0d7cf 8795 { } /* end */
8341de60
CM
8796};
8797
3ea0d7cf
HRK
8798/*
8799 * 4ch mode
8800 */
8801static struct hda_verb alc888_3st_hp_4ch_init[] = {
8802 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8803 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8804 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8805 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8806 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8807 { } /* end */
8808};
8809
8810/*
8811 * 6ch mode
8812 */
4723c022 8813static struct hda_verb alc888_3st_hp_6ch_init[] = {
8341de60
CM
8814 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8815 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
3ea0d7cf 8816 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
8341de60
CM
8817 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8818 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
3ea0d7cf
HRK
8819 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8820 { } /* end */
8341de60
CM
8821};
8822
3ea0d7cf 8823static struct hda_channel_mode alc888_3st_hp_modes[3] = {
4723c022 8824 { 2, alc888_3st_hp_2ch_init },
3ea0d7cf 8825 { 4, alc888_3st_hp_4ch_init },
4723c022 8826 { 6, alc888_3st_hp_6ch_init },
8341de60
CM
8827};
8828
272a527c
KY
8829/* toggle front-jack and RCA according to the hp-jack state */
8830static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
8831{
864f92be 8832 unsigned int present = snd_hda_jack_detect(codec, 0x1b);
ea1fb29a 8833
47fd830a
TI
8834 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8835 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8836 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8837 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
272a527c
KY
8838}
8839
8840/* toggle RCA according to the front-jack state */
8841static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
8842{
864f92be 8843 unsigned int present = snd_hda_jack_detect(codec, 0x14);
ea1fb29a 8844
47fd830a
TI
8845 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8846 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
272a527c 8847}
47fd830a 8848
272a527c
KY
8849static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
8850 unsigned int res)
8851{
8852 if ((res >> 26) == ALC880_HP_EVENT)
8853 alc888_lenovo_ms7195_front_automute(codec);
8854 if ((res >> 26) == ALC880_FRONT_EVENT)
8855 alc888_lenovo_ms7195_rca_automute(codec);
8856}
8857
8858static struct hda_verb alc883_medion_md2_verbs[] = {
8859 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8860 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8861
8862 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8863
8864 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8865 { } /* end */
8866};
8867
8868/* toggle speaker-output according to the hp-jack state */
4f5d1706 8869static void alc883_medion_md2_setup(struct hda_codec *codec)
272a527c 8870{
a9fd4f3f 8871 struct alc_spec *spec = codec->spec;
272a527c 8872
a9fd4f3f
TI
8873 spec->autocfg.hp_pins[0] = 0x14;
8874 spec->autocfg.speaker_pins[0] = 0x15;
272a527c
KY
8875}
8876
ccc656ce 8877/* toggle speaker-output according to the hp-jack state */
c259249f
SA
8878#define alc883_targa_init_hook alc882_targa_init_hook
8879#define alc883_targa_unsol_event alc882_targa_unsol_event
368c7a95 8880
0c4cc443
HRK
8881static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
8882{
8883 unsigned int present;
8884
d56757ab 8885 present = snd_hda_jack_detect(codec, 0x18);
0c4cc443
HRK
8886 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
8887 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8888}
8889
4f5d1706 8890static void alc883_clevo_m720_setup(struct hda_codec *codec)
0c4cc443 8891{
a9fd4f3f
TI
8892 struct alc_spec *spec = codec->spec;
8893
8894 spec->autocfg.hp_pins[0] = 0x15;
8895 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
8896}
8897
8898static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
8899{
a9fd4f3f 8900 alc_automute_amp(codec);
0c4cc443
HRK
8901 alc883_clevo_m720_mic_automute(codec);
8902}
8903
8904static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
368c7a95
J
8905 unsigned int res)
8906{
0c4cc443 8907 switch (res >> 26) {
0c4cc443
HRK
8908 case ALC880_MIC_EVENT:
8909 alc883_clevo_m720_mic_automute(codec);
8910 break;
a9fd4f3f
TI
8911 default:
8912 alc_automute_amp_unsol_event(codec, res);
8913 break;
0c4cc443 8914 }
368c7a95
J
8915}
8916
fb97dc67 8917/* toggle speaker-output according to the hp-jack state */
4f5d1706 8918static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
fb97dc67 8919{
a9fd4f3f 8920 struct alc_spec *spec = codec->spec;
fb97dc67 8921
a9fd4f3f
TI
8922 spec->autocfg.hp_pins[0] = 0x14;
8923 spec->autocfg.speaker_pins[0] = 0x15;
fb97dc67
J
8924}
8925
4f5d1706 8926static void alc883_haier_w66_setup(struct hda_codec *codec)
fb97dc67 8927{
a9fd4f3f 8928 struct alc_spec *spec = codec->spec;
189609ae 8929
a9fd4f3f
TI
8930 spec->autocfg.hp_pins[0] = 0x1b;
8931 spec->autocfg.speaker_pins[0] = 0x14;
189609ae
KY
8932}
8933
bc9f98a9
KY
8934static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
8935{
864f92be 8936 int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
bc9f98a9 8937
47fd830a
TI
8938 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8939 HDA_AMP_MUTE, bits);
bc9f98a9
KY
8940}
8941
8942static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
8943{
864f92be 8944 int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
bc9f98a9 8945
47fd830a
TI
8946 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8947 HDA_AMP_MUTE, bits);
8948 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8949 HDA_AMP_MUTE, bits);
bc9f98a9
KY
8950}
8951
8952static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
8953 unsigned int res)
8954{
8955 if ((res >> 26) == ALC880_HP_EVENT)
8956 alc883_lenovo_101e_all_automute(codec);
8957 if ((res >> 26) == ALC880_FRONT_EVENT)
8958 alc883_lenovo_101e_ispeaker_automute(codec);
8959}
8960
676a9b53 8961/* toggle speaker-output according to the hp-jack state */
4f5d1706 8962static void alc883_acer_aspire_setup(struct hda_codec *codec)
676a9b53 8963{
a9fd4f3f 8964 struct alc_spec *spec = codec->spec;
676a9b53 8965
a9fd4f3f
TI
8966 spec->autocfg.hp_pins[0] = 0x14;
8967 spec->autocfg.speaker_pins[0] = 0x15;
8968 spec->autocfg.speaker_pins[1] = 0x16;
676a9b53
TI
8969}
8970
d1a991a6
KY
8971static struct hda_verb alc883_acer_eapd_verbs[] = {
8972 /* HP Pin: output 0 (0x0c) */
8973 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8974 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8975 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8976 /* Front Pin: output 0 (0x0c) */
676a9b53
TI
8977 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8978 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
d1a991a6 8979 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
d1a991a6
KY
8980 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
8981 /* eanable EAPD on medion laptop */
8982 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8983 {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
676a9b53
TI
8984 /* enable unsolicited event */
8985 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
d1a991a6
KY
8986 { }
8987};
8988
fc86f954
DK
8989static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
8990 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8991 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8992 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8993 { } /* end */
8994};
8995
4f5d1706 8996static void alc888_6st_dell_setup(struct hda_codec *codec)
5795b9e6 8997{
a9fd4f3f 8998 struct alc_spec *spec = codec->spec;
5795b9e6 8999
a9fd4f3f
TI
9000 spec->autocfg.hp_pins[0] = 0x1b;
9001 spec->autocfg.speaker_pins[0] = 0x14;
9002 spec->autocfg.speaker_pins[1] = 0x15;
9003 spec->autocfg.speaker_pins[2] = 0x16;
9004 spec->autocfg.speaker_pins[3] = 0x17;
5795b9e6
CM
9005}
9006
4f5d1706 9007static void alc888_lenovo_sky_setup(struct hda_codec *codec)
e2757d5e 9008{
a9fd4f3f 9009 struct alc_spec *spec = codec->spec;
e2757d5e 9010
a9fd4f3f
TI
9011 spec->autocfg.hp_pins[0] = 0x1b;
9012 spec->autocfg.speaker_pins[0] = 0x14;
9013 spec->autocfg.speaker_pins[1] = 0x15;
9014 spec->autocfg.speaker_pins[2] = 0x16;
9015 spec->autocfg.speaker_pins[3] = 0x17;
9016 spec->autocfg.speaker_pins[4] = 0x1a;
e2757d5e
KY
9017}
9018
4f5d1706 9019static void alc883_vaiott_setup(struct hda_codec *codec)
3e1647c5
GG
9020{
9021 struct alc_spec *spec = codec->spec;
9022
9023 spec->autocfg.hp_pins[0] = 0x15;
9024 spec->autocfg.speaker_pins[0] = 0x14;
9025 spec->autocfg.speaker_pins[1] = 0x17;
3e1647c5
GG
9026}
9027
e2757d5e
KY
9028static struct hda_verb alc888_asus_m90v_verbs[] = {
9029 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9030 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9031 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9032 /* enable unsolicited event */
9033 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9034 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9035 { } /* end */
9036};
9037
4f5d1706 9038static void alc883_mode2_setup(struct hda_codec *codec)
e2757d5e 9039{
a9fd4f3f 9040 struct alc_spec *spec = codec->spec;
e2757d5e 9041
a9fd4f3f
TI
9042 spec->autocfg.hp_pins[0] = 0x1b;
9043 spec->autocfg.speaker_pins[0] = 0x14;
9044 spec->autocfg.speaker_pins[1] = 0x15;
9045 spec->autocfg.speaker_pins[2] = 0x16;
4f5d1706
TI
9046 spec->ext_mic.pin = 0x18;
9047 spec->int_mic.pin = 0x19;
9048 spec->ext_mic.mux_idx = 0;
9049 spec->int_mic.mux_idx = 1;
9050 spec->auto_mic = 1;
e2757d5e
KY
9051}
9052
9053static struct hda_verb alc888_asus_eee1601_verbs[] = {
9054 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9055 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9056 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9057 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9058 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
9059 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
9060 {0x20, AC_VERB_SET_PROC_COEF, 0x0838},
9061 /* enable unsolicited event */
9062 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9063 { } /* end */
9064};
9065
e2757d5e
KY
9066static void alc883_eee1601_inithook(struct hda_codec *codec)
9067{
a9fd4f3f
TI
9068 struct alc_spec *spec = codec->spec;
9069
9070 spec->autocfg.hp_pins[0] = 0x14;
9071 spec->autocfg.speaker_pins[0] = 0x1b;
9072 alc_automute_pin(codec);
e2757d5e
KY
9073}
9074
eb4c41d3
TS
9075static struct hda_verb alc889A_mb31_verbs[] = {
9076 /* Init rear pin (used as headphone output) */
9077 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */
9078 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Connect to front */
9079 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9080 /* Init line pin (used as output in 4ch and 6ch mode) */
9081 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, /* Connect to CLFE */
9082 /* Init line 2 pin (used as headphone out by default) */
9083 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Use as input */
9084 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
9085 { } /* end */
9086};
9087
9088/* Mute speakers according to the headphone jack state */
9089static void alc889A_mb31_automute(struct hda_codec *codec)
9090{
9091 unsigned int present;
9092
9093 /* Mute only in 2ch or 4ch mode */
9094 if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
9095 == 0x00) {
864f92be 9096 present = snd_hda_jack_detect(codec, 0x15);
eb4c41d3
TS
9097 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9098 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9099 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
9100 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9101 }
9102}
9103
9104static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
9105{
9106 if ((res >> 26) == ALC880_HP_EVENT)
9107 alc889A_mb31_automute(codec);
9108}
9109
4953550a 9110
cb53c626 9111#ifdef CONFIG_SND_HDA_POWER_SAVE
4953550a 9112#define alc882_loopbacks alc880_loopbacks
cb53c626
TI
9113#endif
9114
def319f9 9115/* pcm configuration: identical with ALC880 */
4953550a
TI
9116#define alc882_pcm_analog_playback alc880_pcm_analog_playback
9117#define alc882_pcm_analog_capture alc880_pcm_analog_capture
9118#define alc882_pcm_digital_playback alc880_pcm_digital_playback
9119#define alc882_pcm_digital_capture alc880_pcm_digital_capture
9120
9121static hda_nid_t alc883_slave_dig_outs[] = {
9122 ALC1200_DIGOUT_NID, 0,
9123};
9124
9125static hda_nid_t alc1200_slave_dig_outs[] = {
9126 ALC883_DIGOUT_NID, 0,
9127};
9c7f852e
TI
9128
9129/*
9130 * configuration and preset
9131 */
4953550a
TI
9132static const char *alc882_models[ALC882_MODEL_LAST] = {
9133 [ALC882_3ST_DIG] = "3stack-dig",
9134 [ALC882_6ST_DIG] = "6stack-dig",
9135 [ALC882_ARIMA] = "arima",
9136 [ALC882_W2JC] = "w2jc",
9137 [ALC882_TARGA] = "targa",
9138 [ALC882_ASUS_A7J] = "asus-a7j",
9139 [ALC882_ASUS_A7M] = "asus-a7m",
9140 [ALC885_MACPRO] = "macpro",
9141 [ALC885_MB5] = "mb5",
e458b1fa 9142 [ALC885_MACMINI3] = "macmini3",
76e6f5a9 9143 [ALC885_MBA21] = "mba21",
4953550a
TI
9144 [ALC885_MBP3] = "mbp3",
9145 [ALC885_IMAC24] = "imac24",
4b7e1803 9146 [ALC885_IMAC91] = "imac91",
4953550a 9147 [ALC883_3ST_2ch_DIG] = "3stack-2ch-dig",
f5fcc13c
TI
9148 [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig",
9149 [ALC883_3ST_6ch] = "3stack-6ch",
4953550a 9150 [ALC883_6ST_DIG] = "alc883-6stack-dig",
f5fcc13c
TI
9151 [ALC883_TARGA_DIG] = "targa-dig",
9152 [ALC883_TARGA_2ch_DIG] = "targa-2ch-dig",
64a8be74 9153 [ALC883_TARGA_8ch_DIG] = "targa-8ch-dig",
f5fcc13c 9154 [ALC883_ACER] = "acer",
2880a867 9155 [ALC883_ACER_ASPIRE] = "acer-aspire",
5b2d1eca 9156 [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g",
b1a91469 9157 [ALC888_ACER_ASPIRE_6530G] = "acer-aspire-6530g",
3b315d70 9158 [ALC888_ACER_ASPIRE_8930G] = "acer-aspire-8930g",
fc86f954 9159 [ALC888_ACER_ASPIRE_7730G] = "acer-aspire-7730g",
f5fcc13c 9160 [ALC883_MEDION] = "medion",
272a527c 9161 [ALC883_MEDION_MD2] = "medion-md2",
f5fcc13c 9162 [ALC883_LAPTOP_EAPD] = "laptop-eapd",
bc9f98a9 9163 [ALC883_LENOVO_101E_2ch] = "lenovo-101e",
272a527c
KY
9164 [ALC883_LENOVO_NB0763] = "lenovo-nb0763",
9165 [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
e2757d5e 9166 [ALC888_LENOVO_SKY] = "lenovo-sky",
189609ae 9167 [ALC883_HAIER_W66] = "haier-w66",
4723c022 9168 [ALC888_3ST_HP] = "3stack-hp",
5795b9e6 9169 [ALC888_6ST_DELL] = "6stack-dell",
a8848bd6 9170 [ALC883_MITAC] = "mitac",
a65cc60f 9171 [ALC883_CLEVO_M540R] = "clevo-m540r",
0c4cc443 9172 [ALC883_CLEVO_M720] = "clevo-m720",
fb97dc67 9173 [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
ef8ef5fb 9174 [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
17bba1b7 9175 [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel",
87a8c370
JK
9176 [ALC889A_INTEL] = "intel-alc889a",
9177 [ALC889_INTEL] = "intel-x58",
3ab90935 9178 [ALC1200_ASUS_P5Q] = "asus-p5q",
eb4c41d3 9179 [ALC889A_MB31] = "mb31",
3e1647c5 9180 [ALC883_SONY_VAIO_TT] = "sony-vaio-tt",
4953550a 9181 [ALC882_AUTO] = "auto",
f5fcc13c
TI
9182};
9183
4953550a
TI
9184static struct snd_pci_quirk alc882_cfg_tbl[] = {
9185 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
9186
ac3e3741 9187 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
69e50282 9188 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
9b6682ff 9189 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
ac3e3741
TI
9190 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
9191 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
0b18cb18 9192 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
5b2d1eca
VP
9193 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
9194 ALC888_ACER_ASPIRE_4930G),
a8e4f9dd 9195 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
83dd7408 9196 ALC888_ACER_ASPIRE_4930G),
3b315d70
HM
9197 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
9198 ALC888_ACER_ASPIRE_8930G),
e46b0c8c
TI
9199 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
9200 ALC888_ACER_ASPIRE_8930G),
4953550a
TI
9201 SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
9202 SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
a8e4f9dd 9203 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
dde65356 9204 ALC888_ACER_ASPIRE_6530G),
cc374c47 9205 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
d2fd4b09 9206 ALC888_ACER_ASPIRE_6530G),
fc86f954
DK
9207 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
9208 ALC888_ACER_ASPIRE_7730G),
22b530e0
TI
9209 /* default Acer -- disabled as it causes more problems.
9210 * model=auto should work fine now
9211 */
9212 /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
4953550a 9213
5795b9e6 9214 SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
4953550a 9215
febe3375 9216 SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
ac3e3741
TI
9217 SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
9218 SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
5d85f8d0 9219 SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
06bf3e15 9220 SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
7ec30f0e 9221 SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
4953550a
TI
9222
9223 SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
9224 SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
9225 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
a01c30cb 9226 SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
4953550a
TI
9227 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
9228 SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
9229 SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
ac3e3741 9230 SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
44a678d0 9231 SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
3ab90935 9232 SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
e2757d5e 9233 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
4953550a
TI
9234
9235 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
97ec710c 9236 SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
4953550a 9237 SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
2de686d2 9238 SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
ac3e3741
TI
9239 SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
9240 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
e2757d5e 9241 SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
ac3e3741 9242 SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
4953550a
TI
9243 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
9244
6f3bf657 9245 SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
bba8dee7 9246 SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
ac3e3741 9247 SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
4953550a 9248 SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */
2fef62c8 9249 SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
4953550a 9250 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
dd146a60 9251 SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
82808236 9252 SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
f5fcc13c 9253 SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
ac3e3741 9254 SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
f5fcc13c
TI
9255 SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
9256 SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
ac3e3741 9257 SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
64ca1c29 9258 SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
b1e4422f 9259 SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
f5fcc13c
TI
9260 SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
9261 SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
9262 SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
b43f6e5e 9263 SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG),
64a8be74 9264 SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
ac3e3741
TI
9265 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
9266 SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
9267 SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
ee09543c 9268 SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
86d34b7e 9269 SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
ac3e3741
TI
9270 SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
9271 SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
df01b8af 9272 SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
b43f6e5e 9273 SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG),
f5fcc13c 9274 SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
b1e4422f 9275 SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
4953550a 9276
ac3e3741 9277 SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
0c4cc443
HRK
9278 SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
9279 SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
a65cc60f 9280 SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
dea0a509 9281 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
e60623b4 9282 SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
4953550a 9283 /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
f5fcc13c 9284 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
bfb53037 9285 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
f67d8176 9286 ALC883_FUJITSU_PI2515),
bfb53037 9287 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
ef8ef5fb 9288 ALC888_FUJITSU_XA3530),
272a527c 9289 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
272a527c 9290 SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
ac3e3741
TI
9291 SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9292 SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
e2757d5e 9293 SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
272a527c 9294 SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
959973b9 9295 SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
0b167bf4 9296 SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
189609ae 9297 SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
4953550a 9298
17bba1b7
J
9299 SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
9300 SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
2de686d2 9301 SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
87a8c370
JK
9302 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
9303 SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
9304 SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
572c0e3c 9305 SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG),
9c7f852e 9306
4953550a 9307 {}
f3cd3f5d
WF
9308};
9309
4953550a
TI
9310/* codec SSID table for Intel Mac */
9311static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9312 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
9313 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
9314 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
9315 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
9316 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
9317 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
9318 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
9319 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
9320 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
9321 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
4b7e1803 9322 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
4953550a 9323 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
46ef6ec9
DC
9324 /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
9325 * so apparently no perfect solution yet
4953550a
TI
9326 */
9327 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
46ef6ec9 9328 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
e458b1fa 9329 SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3),
4953550a 9330 {} /* terminator */
b25c9da1
WF
9331};
9332
4953550a
TI
9333static struct alc_config_preset alc882_presets[] = {
9334 [ALC882_3ST_DIG] = {
9335 .mixers = { alc882_base_mixer },
8ab9e0af
TI
9336 .init_verbs = { alc882_base_init_verbs,
9337 alc882_adc1_init_verbs },
4953550a
TI
9338 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9339 .dac_nids = alc882_dac_nids,
9340 .dig_out_nid = ALC882_DIGOUT_NID,
9341 .dig_in_nid = ALC882_DIGIN_NID,
9342 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9343 .channel_mode = alc882_ch_modes,
9344 .need_dac_fix = 1,
9345 .input_mux = &alc882_capture_source,
9346 },
9347 [ALC882_6ST_DIG] = {
9348 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
8ab9e0af
TI
9349 .init_verbs = { alc882_base_init_verbs,
9350 alc882_adc1_init_verbs },
4953550a
TI
9351 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9352 .dac_nids = alc882_dac_nids,
9353 .dig_out_nid = ALC882_DIGOUT_NID,
9354 .dig_in_nid = ALC882_DIGIN_NID,
9355 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9356 .channel_mode = alc882_sixstack_modes,
9357 .input_mux = &alc882_capture_source,
9358 },
9359 [ALC882_ARIMA] = {
9360 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
8ab9e0af
TI
9361 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9362 alc882_eapd_verbs },
4953550a
TI
9363 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9364 .dac_nids = alc882_dac_nids,
9365 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9366 .channel_mode = alc882_sixstack_modes,
9367 .input_mux = &alc882_capture_source,
9368 },
9369 [ALC882_W2JC] = {
9370 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
8ab9e0af
TI
9371 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9372 alc882_eapd_verbs, alc880_gpio1_init_verbs },
4953550a
TI
9373 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9374 .dac_nids = alc882_dac_nids,
9375 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9376 .channel_mode = alc880_threestack_modes,
9377 .need_dac_fix = 1,
9378 .input_mux = &alc882_capture_source,
9379 .dig_out_nid = ALC882_DIGOUT_NID,
9380 },
76e6f5a9
RH
9381 [ALC885_MBA21] = {
9382 .mixers = { alc885_mba21_mixer },
9383 .init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
9384 .num_dacs = 2,
9385 .dac_nids = alc882_dac_nids,
9386 .channel_mode = alc885_mba21_ch_modes,
9387 .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9388 .input_mux = &alc882_capture_source,
9389 .unsol_event = alc_automute_amp_unsol_event,
9390 .setup = alc885_mba21_setup,
9391 .init_hook = alc_automute_amp,
9392 },
4953550a
TI
9393 [ALC885_MBP3] = {
9394 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
9395 .init_verbs = { alc885_mbp3_init_verbs,
9396 alc880_gpio1_init_verbs },
be0ae923 9397 .num_dacs = 2,
4953550a 9398 .dac_nids = alc882_dac_nids,
be0ae923
TI
9399 .hp_nid = 0x04,
9400 .channel_mode = alc885_mbp_4ch_modes,
9401 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
4953550a
TI
9402 .input_mux = &alc882_capture_source,
9403 .dig_out_nid = ALC882_DIGOUT_NID,
9404 .dig_in_nid = ALC882_DIGIN_NID,
9405 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9406 .setup = alc885_mbp3_setup,
9407 .init_hook = alc_automute_amp,
4953550a
TI
9408 },
9409 [ALC885_MB5] = {
9410 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
9411 .init_verbs = { alc885_mb5_init_verbs,
9412 alc880_gpio1_init_verbs },
9413 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9414 .dac_nids = alc882_dac_nids,
9415 .channel_mode = alc885_mb5_6ch_modes,
9416 .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
9417 .input_mux = &mb5_capture_source,
9418 .dig_out_nid = ALC882_DIGOUT_NID,
9419 .dig_in_nid = ALC882_DIGIN_NID,
9d54f08b
TI
9420 .unsol_event = alc_automute_amp_unsol_event,
9421 .setup = alc885_mb5_setup,
9422 .init_hook = alc_automute_amp,
4953550a 9423 },
e458b1fa
LY
9424 [ALC885_MACMINI3] = {
9425 .mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
9426 .init_verbs = { alc885_macmini3_init_verbs,
9427 alc880_gpio1_init_verbs },
9428 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9429 .dac_nids = alc882_dac_nids,
9430 .channel_mode = alc885_macmini3_6ch_modes,
9431 .num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes),
9432 .input_mux = &macmini3_capture_source,
9433 .dig_out_nid = ALC882_DIGOUT_NID,
9434 .dig_in_nid = ALC882_DIGIN_NID,
9d54f08b
TI
9435 .unsol_event = alc_automute_amp_unsol_event,
9436 .setup = alc885_macmini3_setup,
9437 .init_hook = alc_automute_amp,
e458b1fa 9438 },
4953550a
TI
9439 [ALC885_MACPRO] = {
9440 .mixers = { alc882_macpro_mixer },
9441 .init_verbs = { alc882_macpro_init_verbs },
9442 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9443 .dac_nids = alc882_dac_nids,
9444 .dig_out_nid = ALC882_DIGOUT_NID,
9445 .dig_in_nid = ALC882_DIGIN_NID,
9446 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9447 .channel_mode = alc882_ch_modes,
9448 .input_mux = &alc882_capture_source,
9449 .init_hook = alc885_macpro_init_hook,
9450 },
9451 [ALC885_IMAC24] = {
9452 .mixers = { alc885_imac24_mixer },
9453 .init_verbs = { alc885_imac24_init_verbs },
9454 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9455 .dac_nids = alc882_dac_nids,
9456 .dig_out_nid = ALC882_DIGOUT_NID,
9457 .dig_in_nid = ALC882_DIGIN_NID,
9458 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9459 .channel_mode = alc882_ch_modes,
9460 .input_mux = &alc882_capture_source,
9461 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706 9462 .setup = alc885_imac24_setup,
4953550a
TI
9463 .init_hook = alc885_imac24_init_hook,
9464 },
4b7e1803
JM
9465 [ALC885_IMAC91] = {
9466 .mixers = { alc885_imac91_mixer, alc882_chmode_mixer },
9467 .init_verbs = { alc885_imac91_init_verbs,
9468 alc880_gpio1_init_verbs },
9469 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9470 .dac_nids = alc882_dac_nids,
9471 .channel_mode = alc885_mbp_4ch_modes,
9472 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9473 .input_mux = &alc882_capture_source,
9474 .dig_out_nid = ALC882_DIGOUT_NID,
9475 .dig_in_nid = ALC882_DIGIN_NID,
9d54f08b
TI
9476 .unsol_event = alc_automute_amp_unsol_event,
9477 .setup = alc885_imac91_setup,
9478 .init_hook = alc_automute_amp,
4b7e1803 9479 },
4953550a
TI
9480 [ALC882_TARGA] = {
9481 .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
8ab9e0af 9482 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
31909b83 9483 alc880_gpio3_init_verbs, alc882_targa_verbs},
4953550a
TI
9484 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9485 .dac_nids = alc882_dac_nids,
9486 .dig_out_nid = ALC882_DIGOUT_NID,
9487 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9488 .adc_nids = alc882_adc_nids,
9489 .capsrc_nids = alc882_capsrc_nids,
9490 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9491 .channel_mode = alc882_3ST_6ch_modes,
9492 .need_dac_fix = 1,
9493 .input_mux = &alc882_capture_source,
9494 .unsol_event = alc882_targa_unsol_event,
4f5d1706
TI
9495 .setup = alc882_targa_setup,
9496 .init_hook = alc882_targa_automute,
4953550a
TI
9497 },
9498 [ALC882_ASUS_A7J] = {
9499 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
8ab9e0af
TI
9500 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9501 alc882_asus_a7j_verbs},
4953550a
TI
9502 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9503 .dac_nids = alc882_dac_nids,
9504 .dig_out_nid = ALC882_DIGOUT_NID,
9505 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9506 .adc_nids = alc882_adc_nids,
9507 .capsrc_nids = alc882_capsrc_nids,
9508 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9509 .channel_mode = alc882_3ST_6ch_modes,
9510 .need_dac_fix = 1,
9511 .input_mux = &alc882_capture_source,
9512 },
9513 [ALC882_ASUS_A7M] = {
9514 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
8ab9e0af
TI
9515 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9516 alc882_eapd_verbs, alc880_gpio1_init_verbs,
4953550a
TI
9517 alc882_asus_a7m_verbs },
9518 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9519 .dac_nids = alc882_dac_nids,
9520 .dig_out_nid = ALC882_DIGOUT_NID,
9521 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9522 .channel_mode = alc880_threestack_modes,
9523 .need_dac_fix = 1,
9524 .input_mux = &alc882_capture_source,
9525 },
9c7f852e
TI
9526 [ALC883_3ST_2ch_DIG] = {
9527 .mixers = { alc883_3ST_2ch_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 = ALC883_DIGOUT_NID,
9c7f852e
TI
9532 .dig_in_nid = ALC883_DIGIN_NID,
9533 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9534 .channel_mode = alc883_3ST_2ch_modes,
9535 .input_mux = &alc883_capture_source,
9536 },
9537 [ALC883_3ST_6ch_DIG] = {
9538 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9539 .init_verbs = { alc883_init_verbs },
9540 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9541 .dac_nids = alc883_dac_nids,
9542 .dig_out_nid = ALC883_DIGOUT_NID,
9c7f852e
TI
9543 .dig_in_nid = ALC883_DIGIN_NID,
9544 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9545 .channel_mode = alc883_3ST_6ch_modes,
4e195a7b 9546 .need_dac_fix = 1,
9c7f852e 9547 .input_mux = &alc883_capture_source,
f12ab1e0 9548 },
9c7f852e
TI
9549 [ALC883_3ST_6ch] = {
9550 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9551 .init_verbs = { alc883_init_verbs },
9552 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9553 .dac_nids = alc883_dac_nids,
9c7f852e
TI
9554 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9555 .channel_mode = alc883_3ST_6ch_modes,
4e195a7b 9556 .need_dac_fix = 1,
9c7f852e 9557 .input_mux = &alc883_capture_source,
f12ab1e0 9558 },
17bba1b7
J
9559 [ALC883_3ST_6ch_INTEL] = {
9560 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
9561 .init_verbs = { alc883_init_verbs },
9562 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9563 .dac_nids = alc883_dac_nids,
9564 .dig_out_nid = ALC883_DIGOUT_NID,
9565 .dig_in_nid = ALC883_DIGIN_NID,
f3cd3f5d 9566 .slave_dig_outs = alc883_slave_dig_outs,
17bba1b7
J
9567 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
9568 .channel_mode = alc883_3ST_6ch_intel_modes,
9569 .need_dac_fix = 1,
9570 .input_mux = &alc883_3stack_6ch_intel,
9571 },
87a8c370
JK
9572 [ALC889A_INTEL] = {
9573 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
6732bd0d
WF
9574 .init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
9575 alc_hp15_unsol_verbs },
87a8c370
JK
9576 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9577 .dac_nids = alc883_dac_nids,
9578 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9579 .adc_nids = alc889_adc_nids,
9580 .dig_out_nid = ALC883_DIGOUT_NID,
9581 .dig_in_nid = ALC883_DIGIN_NID,
9582 .slave_dig_outs = alc883_slave_dig_outs,
9583 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9584 .channel_mode = alc889_8ch_intel_modes,
9585 .capsrc_nids = alc889_capsrc_nids,
9586 .input_mux = &alc889_capture_source,
4f5d1706
TI
9587 .setup = alc889_automute_setup,
9588 .init_hook = alc_automute_amp,
6732bd0d 9589 .unsol_event = alc_automute_amp_unsol_event,
87a8c370
JK
9590 .need_dac_fix = 1,
9591 },
9592 [ALC889_INTEL] = {
9593 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9594 .init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
6732bd0d 9595 alc889_eapd_verbs, alc_hp15_unsol_verbs},
87a8c370
JK
9596 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9597 .dac_nids = alc883_dac_nids,
9598 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9599 .adc_nids = alc889_adc_nids,
9600 .dig_out_nid = ALC883_DIGOUT_NID,
9601 .dig_in_nid = ALC883_DIGIN_NID,
9602 .slave_dig_outs = alc883_slave_dig_outs,
9603 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9604 .channel_mode = alc889_8ch_intel_modes,
9605 .capsrc_nids = alc889_capsrc_nids,
9606 .input_mux = &alc889_capture_source,
4f5d1706 9607 .setup = alc889_automute_setup,
6732bd0d
WF
9608 .init_hook = alc889_intel_init_hook,
9609 .unsol_event = alc_automute_amp_unsol_event,
87a8c370
JK
9610 .need_dac_fix = 1,
9611 },
9c7f852e
TI
9612 [ALC883_6ST_DIG] = {
9613 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9614 .init_verbs = { alc883_init_verbs },
9615 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9616 .dac_nids = alc883_dac_nids,
9617 .dig_out_nid = ALC883_DIGOUT_NID,
9c7f852e
TI
9618 .dig_in_nid = ALC883_DIGIN_NID,
9619 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9620 .channel_mode = alc883_sixstack_modes,
9621 .input_mux = &alc883_capture_source,
9622 },
ccc656ce 9623 [ALC883_TARGA_DIG] = {
c259249f 9624 .mixers = { alc883_targa_mixer, alc883_chmode_mixer },
005b1076
DH
9625 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9626 alc883_targa_verbs},
ccc656ce
KY
9627 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9628 .dac_nids = alc883_dac_nids,
9629 .dig_out_nid = ALC883_DIGOUT_NID,
ccc656ce
KY
9630 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9631 .channel_mode = alc883_3ST_6ch_modes,
9632 .need_dac_fix = 1,
9633 .input_mux = &alc883_capture_source,
c259249f 9634 .unsol_event = alc883_targa_unsol_event,
4f5d1706
TI
9635 .setup = alc882_targa_setup,
9636 .init_hook = alc882_targa_automute,
ccc656ce
KY
9637 },
9638 [ALC883_TARGA_2ch_DIG] = {
c259249f 9639 .mixers = { alc883_targa_2ch_mixer},
005b1076
DH
9640 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9641 alc883_targa_verbs},
ccc656ce
KY
9642 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9643 .dac_nids = alc883_dac_nids,
f9e336f6
TI
9644 .adc_nids = alc883_adc_nids_alt,
9645 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
035eb0cf 9646 .capsrc_nids = alc883_capsrc_nids,
ccc656ce 9647 .dig_out_nid = ALC883_DIGOUT_NID,
ccc656ce
KY
9648 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9649 .channel_mode = alc883_3ST_2ch_modes,
9650 .input_mux = &alc883_capture_source,
c259249f 9651 .unsol_event = alc883_targa_unsol_event,
4f5d1706
TI
9652 .setup = alc882_targa_setup,
9653 .init_hook = alc882_targa_automute,
ccc656ce 9654 },
64a8be74 9655 [ALC883_TARGA_8ch_DIG] = {
b99dba34
TI
9656 .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
9657 alc883_chmode_mixer },
64a8be74 9658 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
c259249f 9659 alc883_targa_verbs },
64a8be74
DH
9660 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9661 .dac_nids = alc883_dac_nids,
9662 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9663 .adc_nids = alc883_adc_nids_rev,
9664 .capsrc_nids = alc883_capsrc_nids_rev,
9665 .dig_out_nid = ALC883_DIGOUT_NID,
9666 .dig_in_nid = ALC883_DIGIN_NID,
9667 .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
9668 .channel_mode = alc883_4ST_8ch_modes,
9669 .need_dac_fix = 1,
9670 .input_mux = &alc883_capture_source,
c259249f 9671 .unsol_event = alc883_targa_unsol_event,
4f5d1706
TI
9672 .setup = alc882_targa_setup,
9673 .init_hook = alc882_targa_automute,
64a8be74 9674 },
bab282b9 9675 [ALC883_ACER] = {
676a9b53 9676 .mixers = { alc883_base_mixer },
bab282b9
VA
9677 /* On TravelMate laptops, GPIO 0 enables the internal speaker
9678 * and the headphone jack. Turn this on and rely on the
9679 * standard mute methods whenever the user wants to turn
9680 * these outputs off.
9681 */
9682 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
9683 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9684 .dac_nids = alc883_dac_nids,
bab282b9
VA
9685 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9686 .channel_mode = alc883_3ST_2ch_modes,
9687 .input_mux = &alc883_capture_source,
9688 },
2880a867 9689 [ALC883_ACER_ASPIRE] = {
676a9b53 9690 .mixers = { alc883_acer_aspire_mixer },
d1a991a6 9691 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
2880a867
TD
9692 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9693 .dac_nids = alc883_dac_nids,
9694 .dig_out_nid = ALC883_DIGOUT_NID,
2880a867
TD
9695 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9696 .channel_mode = alc883_3ST_2ch_modes,
9697 .input_mux = &alc883_capture_source,
a9fd4f3f 9698 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9699 .setup = alc883_acer_aspire_setup,
9700 .init_hook = alc_automute_amp,
d1a991a6 9701 },
5b2d1eca 9702 [ALC888_ACER_ASPIRE_4930G] = {
ef8ef5fb 9703 .mixers = { alc888_base_mixer,
5b2d1eca
VP
9704 alc883_chmode_mixer },
9705 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9706 alc888_acer_aspire_4930g_verbs },
9707 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9708 .dac_nids = alc883_dac_nids,
9709 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9710 .adc_nids = alc883_adc_nids_rev,
9711 .capsrc_nids = alc883_capsrc_nids_rev,
9712 .dig_out_nid = ALC883_DIGOUT_NID,
9713 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9714 .channel_mode = alc883_3ST_6ch_modes,
9715 .need_dac_fix = 1,
973b8cb0 9716 .const_channel_count = 6,
5b2d1eca 9717 .num_mux_defs =
ef8ef5fb
VP
9718 ARRAY_SIZE(alc888_2_capture_sources),
9719 .input_mux = alc888_2_capture_sources,
d2fd4b09 9720 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9721 .setup = alc888_acer_aspire_4930g_setup,
9722 .init_hook = alc_automute_amp,
d2fd4b09
TV
9723 },
9724 [ALC888_ACER_ASPIRE_6530G] = {
9725 .mixers = { alc888_acer_aspire_6530_mixer },
9726 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9727 alc888_acer_aspire_6530g_verbs },
9728 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9729 .dac_nids = alc883_dac_nids,
9730 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9731 .adc_nids = alc883_adc_nids_rev,
9732 .capsrc_nids = alc883_capsrc_nids_rev,
9733 .dig_out_nid = ALC883_DIGOUT_NID,
9734 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9735 .channel_mode = alc883_3ST_2ch_modes,
9736 .num_mux_defs =
9737 ARRAY_SIZE(alc888_2_capture_sources),
9738 .input_mux = alc888_acer_aspire_6530_sources,
a9fd4f3f 9739 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9740 .setup = alc888_acer_aspire_6530g_setup,
9741 .init_hook = alc_automute_amp,
5b2d1eca 9742 },
3b315d70 9743 [ALC888_ACER_ASPIRE_8930G] = {
556eea9a 9744 .mixers = { alc889_acer_aspire_8930g_mixer,
3b315d70
HM
9745 alc883_chmode_mixer },
9746 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
0f86a228
HM
9747 alc889_acer_aspire_8930g_verbs,
9748 alc889_eapd_verbs},
3b315d70
HM
9749 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9750 .dac_nids = alc883_dac_nids,
018df418
HM
9751 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9752 .adc_nids = alc889_adc_nids,
9753 .capsrc_nids = alc889_capsrc_nids,
3b315d70
HM
9754 .dig_out_nid = ALC883_DIGOUT_NID,
9755 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9756 .channel_mode = alc883_3ST_6ch_modes,
9757 .need_dac_fix = 1,
9758 .const_channel_count = 6,
9759 .num_mux_defs =
018df418
HM
9760 ARRAY_SIZE(alc889_capture_sources),
9761 .input_mux = alc889_capture_sources,
3b315d70 9762 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9763 .setup = alc889_acer_aspire_8930g_setup,
9764 .init_hook = alc_automute_amp,
f5de24b0 9765#ifdef CONFIG_SND_HDA_POWER_SAVE
c97259df 9766 .power_hook = alc_power_eapd,
f5de24b0 9767#endif
3b315d70 9768 },
fc86f954
DK
9769 [ALC888_ACER_ASPIRE_7730G] = {
9770 .mixers = { alc883_3ST_6ch_mixer,
9771 alc883_chmode_mixer },
9772 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9773 alc888_acer_aspire_7730G_verbs },
9774 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9775 .dac_nids = alc883_dac_nids,
9776 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9777 .adc_nids = alc883_adc_nids_rev,
9778 .capsrc_nids = alc883_capsrc_nids_rev,
9779 .dig_out_nid = ALC883_DIGOUT_NID,
9780 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9781 .channel_mode = alc883_3ST_6ch_modes,
9782 .need_dac_fix = 1,
9783 .const_channel_count = 6,
9784 .input_mux = &alc883_capture_source,
9785 .unsol_event = alc_automute_amp_unsol_event,
9786 .setup = alc888_acer_aspire_6530g_setup,
9787 .init_hook = alc_automute_amp,
9788 },
c07584c8
TD
9789 [ALC883_MEDION] = {
9790 .mixers = { alc883_fivestack_mixer,
9791 alc883_chmode_mixer },
9792 .init_verbs = { alc883_init_verbs,
b373bdeb 9793 alc883_medion_eapd_verbs },
c07584c8
TD
9794 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9795 .dac_nids = alc883_dac_nids,
f9e336f6
TI
9796 .adc_nids = alc883_adc_nids_alt,
9797 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
035eb0cf 9798 .capsrc_nids = alc883_capsrc_nids,
c07584c8
TD
9799 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9800 .channel_mode = alc883_sixstack_modes,
9801 .input_mux = &alc883_capture_source,
b373bdeb 9802 },
272a527c
KY
9803 [ALC883_MEDION_MD2] = {
9804 .mixers = { alc883_medion_md2_mixer},
9805 .init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
9806 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9807 .dac_nids = alc883_dac_nids,
9808 .dig_out_nid = ALC883_DIGOUT_NID,
272a527c
KY
9809 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9810 .channel_mode = alc883_3ST_2ch_modes,
9811 .input_mux = &alc883_capture_source,
a9fd4f3f 9812 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9813 .setup = alc883_medion_md2_setup,
9814 .init_hook = alc_automute_amp,
ea1fb29a 9815 },
b373bdeb 9816 [ALC883_LAPTOP_EAPD] = {
676a9b53 9817 .mixers = { alc883_base_mixer },
b373bdeb
AN
9818 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
9819 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9820 .dac_nids = alc883_dac_nids,
b373bdeb
AN
9821 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9822 .channel_mode = alc883_3ST_2ch_modes,
9823 .input_mux = &alc883_capture_source,
9824 },
a65cc60f 9825 [ALC883_CLEVO_M540R] = {
9826 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9827 .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
9828 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9829 .dac_nids = alc883_dac_nids,
9830 .dig_out_nid = ALC883_DIGOUT_NID,
9831 .dig_in_nid = ALC883_DIGIN_NID,
9832 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
9833 .channel_mode = alc883_3ST_6ch_clevo_modes,
9834 .need_dac_fix = 1,
9835 .input_mux = &alc883_capture_source,
9836 /* This machine has the hardware HP auto-muting, thus
9837 * we need no software mute via unsol event
9838 */
9839 },
0c4cc443
HRK
9840 [ALC883_CLEVO_M720] = {
9841 .mixers = { alc883_clevo_m720_mixer },
9842 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
368c7a95
J
9843 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9844 .dac_nids = alc883_dac_nids,
9845 .dig_out_nid = ALC883_DIGOUT_NID,
9846 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9847 .channel_mode = alc883_3ST_2ch_modes,
9848 .input_mux = &alc883_capture_source,
0c4cc443 9849 .unsol_event = alc883_clevo_m720_unsol_event,
4f5d1706 9850 .setup = alc883_clevo_m720_setup,
a9fd4f3f 9851 .init_hook = alc883_clevo_m720_init_hook,
368c7a95 9852 },
bc9f98a9
KY
9853 [ALC883_LENOVO_101E_2ch] = {
9854 .mixers = { alc883_lenovo_101e_2ch_mixer},
9855 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
9856 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9857 .dac_nids = alc883_dac_nids,
f9e336f6
TI
9858 .adc_nids = alc883_adc_nids_alt,
9859 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
035eb0cf 9860 .capsrc_nids = alc883_capsrc_nids,
bc9f98a9
KY
9861 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9862 .channel_mode = alc883_3ST_2ch_modes,
9863 .input_mux = &alc883_lenovo_101e_capture_source,
9864 .unsol_event = alc883_lenovo_101e_unsol_event,
9865 .init_hook = alc883_lenovo_101e_all_automute,
9866 },
272a527c
KY
9867 [ALC883_LENOVO_NB0763] = {
9868 .mixers = { alc883_lenovo_nb0763_mixer },
9869 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
9870 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9871 .dac_nids = alc883_dac_nids,
272a527c
KY
9872 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9873 .channel_mode = alc883_3ST_2ch_modes,
9874 .need_dac_fix = 1,
9875 .input_mux = &alc883_lenovo_nb0763_capture_source,
a9fd4f3f 9876 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9877 .setup = alc883_medion_md2_setup,
9878 .init_hook = alc_automute_amp,
272a527c
KY
9879 },
9880 [ALC888_LENOVO_MS7195_DIG] = {
9881 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9882 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
9883 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9884 .dac_nids = alc883_dac_nids,
9885 .dig_out_nid = ALC883_DIGOUT_NID,
272a527c
KY
9886 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9887 .channel_mode = alc883_3ST_6ch_modes,
9888 .need_dac_fix = 1,
9889 .input_mux = &alc883_capture_source,
9890 .unsol_event = alc883_lenovo_ms7195_unsol_event,
9891 .init_hook = alc888_lenovo_ms7195_front_automute,
189609ae
KY
9892 },
9893 [ALC883_HAIER_W66] = {
c259249f 9894 .mixers = { alc883_targa_2ch_mixer},
189609ae
KY
9895 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
9896 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9897 .dac_nids = alc883_dac_nids,
9898 .dig_out_nid = ALC883_DIGOUT_NID,
189609ae
KY
9899 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9900 .channel_mode = alc883_3ST_2ch_modes,
9901 .input_mux = &alc883_capture_source,
a9fd4f3f 9902 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9903 .setup = alc883_haier_w66_setup,
9904 .init_hook = alc_automute_amp,
eea6419e 9905 },
4723c022 9906 [ALC888_3ST_HP] = {
eea6419e 9907 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
4723c022 9908 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
8341de60
CM
9909 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9910 .dac_nids = alc883_dac_nids,
4723c022
CM
9911 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
9912 .channel_mode = alc888_3st_hp_modes,
8341de60
CM
9913 .need_dac_fix = 1,
9914 .input_mux = &alc883_capture_source,
a9fd4f3f 9915 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9916 .setup = alc888_3st_hp_setup,
9917 .init_hook = alc_automute_amp,
8341de60 9918 },
5795b9e6 9919 [ALC888_6ST_DELL] = {
f24dbdc6 9920 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
5795b9e6
CM
9921 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
9922 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9923 .dac_nids = alc883_dac_nids,
9924 .dig_out_nid = ALC883_DIGOUT_NID,
5795b9e6
CM
9925 .dig_in_nid = ALC883_DIGIN_NID,
9926 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9927 .channel_mode = alc883_sixstack_modes,
9928 .input_mux = &alc883_capture_source,
a9fd4f3f 9929 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9930 .setup = alc888_6st_dell_setup,
9931 .init_hook = alc_automute_amp,
5795b9e6 9932 },
a8848bd6
AS
9933 [ALC883_MITAC] = {
9934 .mixers = { alc883_mitac_mixer },
9935 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
9936 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9937 .dac_nids = alc883_dac_nids,
a8848bd6
AS
9938 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9939 .channel_mode = alc883_3ST_2ch_modes,
9940 .input_mux = &alc883_capture_source,
a9fd4f3f 9941 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9942 .setup = alc883_mitac_setup,
9943 .init_hook = alc_automute_amp,
a8848bd6 9944 },
fb97dc67
J
9945 [ALC883_FUJITSU_PI2515] = {
9946 .mixers = { alc883_2ch_fujitsu_pi2515_mixer },
9947 .init_verbs = { alc883_init_verbs,
9948 alc883_2ch_fujitsu_pi2515_verbs},
9949 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9950 .dac_nids = alc883_dac_nids,
9951 .dig_out_nid = ALC883_DIGOUT_NID,
9952 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9953 .channel_mode = alc883_3ST_2ch_modes,
9954 .input_mux = &alc883_fujitsu_pi2515_capture_source,
a9fd4f3f 9955 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9956 .setup = alc883_2ch_fujitsu_pi2515_setup,
9957 .init_hook = alc_automute_amp,
fb97dc67 9958 },
ef8ef5fb
VP
9959 [ALC888_FUJITSU_XA3530] = {
9960 .mixers = { alc888_base_mixer, alc883_chmode_mixer },
9961 .init_verbs = { alc883_init_verbs,
9962 alc888_fujitsu_xa3530_verbs },
9963 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9964 .dac_nids = alc883_dac_nids,
9965 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9966 .adc_nids = alc883_adc_nids_rev,
9967 .capsrc_nids = alc883_capsrc_nids_rev,
9968 .dig_out_nid = ALC883_DIGOUT_NID,
9969 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
9970 .channel_mode = alc888_4ST_8ch_intel_modes,
9971 .num_mux_defs =
9972 ARRAY_SIZE(alc888_2_capture_sources),
9973 .input_mux = alc888_2_capture_sources,
a9fd4f3f 9974 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9975 .setup = alc888_fujitsu_xa3530_setup,
9976 .init_hook = alc_automute_amp,
ef8ef5fb 9977 },
e2757d5e
KY
9978 [ALC888_LENOVO_SKY] = {
9979 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
9980 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
9981 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9982 .dac_nids = alc883_dac_nids,
9983 .dig_out_nid = ALC883_DIGOUT_NID,
e2757d5e
KY
9984 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9985 .channel_mode = alc883_sixstack_modes,
9986 .need_dac_fix = 1,
9987 .input_mux = &alc883_lenovo_sky_capture_source,
a9fd4f3f 9988 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9989 .setup = alc888_lenovo_sky_setup,
9990 .init_hook = alc_automute_amp,
e2757d5e
KY
9991 },
9992 [ALC888_ASUS_M90V] = {
9993 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9994 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
9995 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9996 .dac_nids = alc883_dac_nids,
9997 .dig_out_nid = ALC883_DIGOUT_NID,
9998 .dig_in_nid = ALC883_DIGIN_NID,
9999 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10000 .channel_mode = alc883_3ST_6ch_modes,
10001 .need_dac_fix = 1,
10002 .input_mux = &alc883_fujitsu_pi2515_capture_source,
4f5d1706
TI
10003 .unsol_event = alc_sku_unsol_event,
10004 .setup = alc883_mode2_setup,
10005 .init_hook = alc_inithook,
e2757d5e
KY
10006 },
10007 [ALC888_ASUS_EEE1601] = {
10008 .mixers = { alc883_asus_eee1601_mixer },
f9e336f6 10009 .cap_mixer = alc883_asus_eee1601_cap_mixer,
e2757d5e
KY
10010 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
10011 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10012 .dac_nids = alc883_dac_nids,
10013 .dig_out_nid = ALC883_DIGOUT_NID,
10014 .dig_in_nid = ALC883_DIGIN_NID,
10015 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10016 .channel_mode = alc883_3ST_2ch_modes,
10017 .need_dac_fix = 1,
10018 .input_mux = &alc883_asus_eee1601_capture_source,
a9fd4f3f 10019 .unsol_event = alc_sku_unsol_event,
e2757d5e
KY
10020 .init_hook = alc883_eee1601_inithook,
10021 },
3ab90935
WF
10022 [ALC1200_ASUS_P5Q] = {
10023 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
10024 .init_verbs = { alc883_init_verbs },
10025 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10026 .dac_nids = alc883_dac_nids,
10027 .dig_out_nid = ALC1200_DIGOUT_NID,
10028 .dig_in_nid = ALC883_DIGIN_NID,
b25c9da1 10029 .slave_dig_outs = alc1200_slave_dig_outs,
3ab90935
WF
10030 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10031 .channel_mode = alc883_sixstack_modes,
10032 .input_mux = &alc883_capture_source,
10033 },
eb4c41d3
TS
10034 [ALC889A_MB31] = {
10035 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
10036 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
10037 alc880_gpio1_init_verbs },
10038 .adc_nids = alc883_adc_nids,
10039 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
035eb0cf 10040 .capsrc_nids = alc883_capsrc_nids,
eb4c41d3
TS
10041 .dac_nids = alc883_dac_nids,
10042 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10043 .channel_mode = alc889A_mb31_6ch_modes,
10044 .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
10045 .input_mux = &alc889A_mb31_capture_source,
10046 .dig_out_nid = ALC883_DIGOUT_NID,
10047 .unsol_event = alc889A_mb31_unsol_event,
10048 .init_hook = alc889A_mb31_automute,
10049 },
3e1647c5
GG
10050 [ALC883_SONY_VAIO_TT] = {
10051 .mixers = { alc883_vaiott_mixer },
10052 .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
10053 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10054 .dac_nids = alc883_dac_nids,
10055 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10056 .channel_mode = alc883_3ST_2ch_modes,
10057 .input_mux = &alc883_capture_source,
10058 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
10059 .setup = alc883_vaiott_setup,
10060 .init_hook = alc_automute_amp,
3e1647c5 10061 },
9c7f852e
TI
10062};
10063
10064
4953550a
TI
10065/*
10066 * Pin config fixes
10067 */
10068enum {
10069 PINFIX_ABIT_AW9D_MAX
10070};
10071
10072static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
10073 { 0x15, 0x01080104 }, /* side */
10074 { 0x16, 0x01011012 }, /* rear */
10075 { 0x17, 0x01016011 }, /* clfe */
10076 { }
10077};
10078
f8f25ba3
TI
10079static const struct alc_fixup alc882_fixups[] = {
10080 [PINFIX_ABIT_AW9D_MAX] = {
10081 .pins = alc882_abit_aw9d_pinfix
10082 },
4953550a
TI
10083};
10084
f8f25ba3 10085static struct snd_pci_quirk alc882_fixup_tbl[] = {
4953550a
TI
10086 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
10087 {}
10088};
10089
9c7f852e
TI
10090/*
10091 * BIOS auto configuration
10092 */
05f5f477
TI
10093static int alc882_auto_create_input_ctls(struct hda_codec *codec,
10094 const struct auto_pin_cfg *cfg)
10095{
10096 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
10097}
10098
4953550a 10099static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
9c7f852e
TI
10100 hda_nid_t nid, int pin_type,
10101 int dac_idx)
10102{
10103 /* set as output */
10104 struct alc_spec *spec = codec->spec;
f12ab1e0
TI
10105 int idx;
10106
f6c7e546 10107 alc_set_pin_output(codec, nid, pin_type);
9c7f852e
TI
10108 if (spec->multiout.dac_nids[dac_idx] == 0x25)
10109 idx = 4;
6a4f2ccb
TI
10110 else {
10111 if (spec->multiout.num_dacs >= dac_idx)
10112 return;
9c7f852e 10113 idx = spec->multiout.dac_nids[dac_idx] - 2;
6a4f2ccb 10114 }
9c7f852e
TI
10115 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
10116
10117}
10118
4953550a 10119static void alc882_auto_init_multi_out(struct hda_codec *codec)
9c7f852e
TI
10120{
10121 struct alc_spec *spec = codec->spec;
10122 int i;
10123
10124 for (i = 0; i <= HDA_SIDE; i++) {
f12ab1e0 10125 hda_nid_t nid = spec->autocfg.line_out_pins[i];
baba8ee9 10126 int pin_type = get_pin_type(spec->autocfg.line_out_type);
9c7f852e 10127 if (nid)
4953550a 10128 alc882_auto_set_output_and_unmute(codec, nid, pin_type,
f12ab1e0 10129 i);
9c7f852e
TI
10130 }
10131}
10132
4953550a 10133static void alc882_auto_init_hp_out(struct hda_codec *codec)
9c7f852e
TI
10134{
10135 struct alc_spec *spec = codec->spec;
10136 hda_nid_t pin;
10137
eb06ed8f 10138 pin = spec->autocfg.hp_pins[0];
9c7f852e
TI
10139 if (pin) /* connect to front */
10140 /* use dac 0 */
4953550a 10141 alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
f6c7e546
TI
10142 pin = spec->autocfg.speaker_pins[0];
10143 if (pin)
4953550a 10144 alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
9c7f852e
TI
10145}
10146
4953550a 10147static void alc882_auto_init_analog_input(struct hda_codec *codec)
9c7f852e
TI
10148{
10149 struct alc_spec *spec = codec->spec;
10150 int i;
10151
10152 for (i = 0; i < AUTO_PIN_LAST; i++) {
10153 hda_nid_t nid = spec->autocfg.input_pins[i];
4953550a
TI
10154 if (!nid)
10155 continue;
0d971c9f 10156 alc_set_input_pin(codec, nid, i);
4953550a
TI
10157 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
10158 snd_hda_codec_write(codec, nid, 0,
10159 AC_VERB_SET_AMP_GAIN_MUTE,
10160 AMP_OUT_MUTE);
10161 }
10162}
10163
10164static void alc882_auto_init_input_src(struct hda_codec *codec)
10165{
10166 struct alc_spec *spec = codec->spec;
10167 int c;
10168
10169 for (c = 0; c < spec->num_adc_nids; c++) {
10170 hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
10171 hda_nid_t nid = spec->capsrc_nids[c];
10172 unsigned int mux_idx;
10173 const struct hda_input_mux *imux;
10174 int conns, mute, idx, item;
10175
10176 conns = snd_hda_get_connections(codec, nid, conn_list,
10177 ARRAY_SIZE(conn_list));
10178 if (conns < 0)
10179 continue;
10180 mux_idx = c >= spec->num_mux_defs ? 0 : c;
10181 imux = &spec->input_mux[mux_idx];
5311114d
TI
10182 if (!imux->num_items && mux_idx > 0)
10183 imux = &spec->input_mux[0];
4953550a
TI
10184 for (idx = 0; idx < conns; idx++) {
10185 /* if the current connection is the selected one,
10186 * unmute it as default - otherwise mute it
10187 */
10188 mute = AMP_IN_MUTE(idx);
10189 for (item = 0; item < imux->num_items; item++) {
10190 if (imux->items[item].index == idx) {
10191 if (spec->cur_mux[c] == item)
10192 mute = AMP_IN_UNMUTE(idx);
10193 break;
10194 }
10195 }
10196 /* check if we have a selector or mixer
10197 * we could check for the widget type instead, but
10198 * just check for Amp-In presence (in case of mixer
10199 * without amp-in there is something wrong, this
10200 * function shouldn't be used or capsrc nid is wrong)
10201 */
10202 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
9c7f852e
TI
10203 snd_hda_codec_write(codec, nid, 0,
10204 AC_VERB_SET_AMP_GAIN_MUTE,
4953550a
TI
10205 mute);
10206 else if (mute != AMP_IN_MUTE(idx))
10207 snd_hda_codec_write(codec, nid, 0,
10208 AC_VERB_SET_CONNECT_SEL,
10209 idx);
9c7f852e
TI
10210 }
10211 }
10212}
10213
4953550a
TI
10214/* add mic boosts if needed */
10215static int alc_auto_add_mic_boost(struct hda_codec *codec)
10216{
10217 struct alc_spec *spec = codec->spec;
10218 int err;
10219 hda_nid_t nid;
10220
10221 nid = spec->autocfg.input_pins[AUTO_PIN_MIC];
10222 if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10223 err = add_control(spec, ALC_CTL_WIDGET_VOL,
10224 "Mic Boost",
10225 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10226 if (err < 0)
10227 return err;
10228 }
10229 nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC];
10230 if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10231 err = add_control(spec, ALC_CTL_WIDGET_VOL,
10232 "Front Mic Boost",
10233 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10234 if (err < 0)
10235 return err;
10236 }
10237 return 0;
10238}
f511b01c 10239
9c7f852e 10240/* almost identical with ALC880 parser... */
4953550a 10241static int alc882_parse_auto_config(struct hda_codec *codec)
9c7f852e
TI
10242{
10243 struct alc_spec *spec = codec->spec;
05f5f477
TI
10244 static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
10245 int i, err;
9c7f852e 10246
05f5f477
TI
10247 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
10248 alc882_ignore);
9c7f852e
TI
10249 if (err < 0)
10250 return err;
05f5f477
TI
10251 if (!spec->autocfg.line_outs)
10252 return 0; /* can't find valid BIOS pin config */
776e184e 10253
05f5f477
TI
10254 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
10255 if (err < 0)
10256 return err;
10257 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
10258 if (err < 0)
10259 return err;
10260 err = alc880_auto_create_extra_out(spec,
10261 spec->autocfg.speaker_pins[0],
10262 "Speaker");
10263 if (err < 0)
10264 return err;
10265 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
10266 "Headphone");
10267 if (err < 0)
10268 return err;
10269 err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
776e184e
TI
10270 if (err < 0)
10271 return err;
10272
05f5f477
TI
10273 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
10274
10275 /* check multiple SPDIF-out (for recent codecs) */
10276 for (i = 0; i < spec->autocfg.dig_outs; i++) {
10277 hda_nid_t dig_nid;
10278 err = snd_hda_get_connections(codec,
10279 spec->autocfg.dig_out_pins[i],
10280 &dig_nid, 1);
10281 if (err < 0)
10282 continue;
10283 if (!i)
10284 spec->multiout.dig_out_nid = dig_nid;
10285 else {
10286 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
71121d9f 10287 if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
05f5f477 10288 break;
71121d9f 10289 spec->slave_dig_outs[i - 1] = dig_nid;
05f5f477
TI
10290 }
10291 }
10292 if (spec->autocfg.dig_in_pin)
10293 spec->dig_in_nid = ALC880_DIGIN_NID;
10294
10295 if (spec->kctls.list)
10296 add_mixer(spec, spec->kctls.list);
10297
10298 add_verb(spec, alc883_auto_init_verbs);
4953550a 10299 /* if ADC 0x07 is available, initialize it, too */
05f5f477 10300 if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
4953550a 10301 add_verb(spec, alc882_adc1_init_verbs);
776e184e 10302
05f5f477
TI
10303 spec->num_mux_defs = 1;
10304 spec->input_mux = &spec->private_imux[0];
10305
6227cdce 10306 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
05f5f477
TI
10307
10308 err = alc_auto_add_mic_boost(codec);
10309 if (err < 0)
10310 return err;
61b9b9b1 10311
776e184e 10312 return 1; /* config found */
9c7f852e
TI
10313}
10314
10315/* additional initialization for auto-configuration model */
4953550a 10316static void alc882_auto_init(struct hda_codec *codec)
9c7f852e 10317{
f6c7e546 10318 struct alc_spec *spec = codec->spec;
4953550a
TI
10319 alc882_auto_init_multi_out(codec);
10320 alc882_auto_init_hp_out(codec);
10321 alc882_auto_init_analog_input(codec);
10322 alc882_auto_init_input_src(codec);
f6c7e546 10323 if (spec->unsol_event)
7fb0d78f 10324 alc_inithook(codec);
9c7f852e
TI
10325}
10326
4953550a 10327static int patch_alc882(struct hda_codec *codec)
9c7f852e
TI
10328{
10329 struct alc_spec *spec;
10330 int err, board_config;
10331
10332 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
10333 if (spec == NULL)
10334 return -ENOMEM;
10335
10336 codec->spec = spec;
10337
4953550a
TI
10338 switch (codec->vendor_id) {
10339 case 0x10ec0882:
10340 case 0x10ec0885:
10341 break;
10342 default:
10343 /* ALC883 and variants */
10344 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
10345 break;
10346 }
2c3bf9ab 10347
4953550a
TI
10348 board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
10349 alc882_models,
10350 alc882_cfg_tbl);
10351
10352 if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
10353 board_config = snd_hda_check_board_codec_sid_config(codec,
10354 ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
10355
10356 if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
9a11f1aa 10357 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4953550a
TI
10358 codec->chip_name);
10359 board_config = ALC882_AUTO;
9c7f852e
TI
10360 }
10361
f8f25ba3 10362 alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups);
4953550a
TI
10363
10364 if (board_config == ALC882_AUTO) {
9c7f852e 10365 /* automatic parse from the BIOS config */
4953550a 10366 err = alc882_parse_auto_config(codec);
9c7f852e
TI
10367 if (err < 0) {
10368 alc_free(codec);
10369 return err;
f12ab1e0 10370 } else if (!err) {
9c7f852e
TI
10371 printk(KERN_INFO
10372 "hda_codec: Cannot set up configuration "
10373 "from BIOS. Using base mode...\n");
4953550a 10374 board_config = ALC882_3ST_DIG;
9c7f852e
TI
10375 }
10376 }
10377
680cd536
KK
10378 err = snd_hda_attach_beep_device(codec, 0x1);
10379 if (err < 0) {
10380 alc_free(codec);
10381 return err;
10382 }
10383
4953550a 10384 if (board_config != ALC882_AUTO)
e9c364c0 10385 setup_preset(codec, &alc882_presets[board_config]);
9c7f852e 10386
4953550a
TI
10387 spec->stream_analog_playback = &alc882_pcm_analog_playback;
10388 spec->stream_analog_capture = &alc882_pcm_analog_capture;
10389 /* FIXME: setup DAC5 */
10390 /*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
10391 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
10392
10393 spec->stream_digital_playback = &alc882_pcm_digital_playback;
10394 spec->stream_digital_capture = &alc882_pcm_digital_capture;
10395
10396 if (codec->vendor_id == 0x10ec0888)
4a79ba34 10397 spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */
4953550a
TI
10398
10399 if (!spec->adc_nids && spec->input_mux) {
d11f74c6 10400 int i, j;
4953550a
TI
10401 spec->num_adc_nids = 0;
10402 for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
d11f74c6 10403 const struct hda_input_mux *imux = spec->input_mux;
4953550a 10404 hda_nid_t cap;
d11f74c6 10405 hda_nid_t items[16];
4953550a
TI
10406 hda_nid_t nid = alc882_adc_nids[i];
10407 unsigned int wcap = get_wcaps(codec, nid);
10408 /* get type */
a22d543a 10409 wcap = get_wcaps_type(wcap);
4953550a
TI
10410 if (wcap != AC_WID_AUD_IN)
10411 continue;
10412 spec->private_adc_nids[spec->num_adc_nids] = nid;
10413 err = snd_hda_get_connections(codec, nid, &cap, 1);
10414 if (err < 0)
10415 continue;
d11f74c6
TI
10416 err = snd_hda_get_connections(codec, cap, items,
10417 ARRAY_SIZE(items));
10418 if (err < 0)
10419 continue;
10420 for (j = 0; j < imux->num_items; j++)
10421 if (imux->items[j].index >= err)
10422 break;
10423 if (j < imux->num_items)
10424 continue;
4953550a
TI
10425 spec->private_capsrc_nids[spec->num_adc_nids] = cap;
10426 spec->num_adc_nids++;
61b9b9b1 10427 }
4953550a
TI
10428 spec->adc_nids = spec->private_adc_nids;
10429 spec->capsrc_nids = spec->private_capsrc_nids;
2f893286
KY
10430 }
10431
b59bdf3b 10432 set_capture_mixer(codec);
45bdd1c1 10433 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
9c7f852e 10434
2134ea4f
TI
10435 spec->vmaster_nid = 0x0c;
10436
9c7f852e 10437 codec->patch_ops = alc_patch_ops;
4953550a
TI
10438 if (board_config == ALC882_AUTO)
10439 spec->init_hook = alc882_auto_init;
cb53c626
TI
10440#ifdef CONFIG_SND_HDA_POWER_SAVE
10441 if (!spec->loopback.amplist)
4953550a 10442 spec->loopback.amplist = alc882_loopbacks;
cb53c626 10443#endif
9c7f852e
TI
10444
10445 return 0;
10446}
10447
4953550a 10448
9c7f852e
TI
10449/*
10450 * ALC262 support
10451 */
10452
10453#define ALC262_DIGOUT_NID ALC880_DIGOUT_NID
10454#define ALC262_DIGIN_NID ALC880_DIGIN_NID
10455
10456#define alc262_dac_nids alc260_dac_nids
10457#define alc262_adc_nids alc882_adc_nids
10458#define alc262_adc_nids_alt alc882_adc_nids_alt
88c71a99
TI
10459#define alc262_capsrc_nids alc882_capsrc_nids
10460#define alc262_capsrc_nids_alt alc882_capsrc_nids_alt
9c7f852e
TI
10461
10462#define alc262_modes alc260_modes
10463#define alc262_capture_source alc882_capture_source
10464
4e555fe5
KY
10465static hda_nid_t alc262_dmic_adc_nids[1] = {
10466 /* ADC0 */
10467 0x09
10468};
10469
10470static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
10471
9c7f852e
TI
10472static struct snd_kcontrol_new alc262_base_mixer[] = {
10473 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10474 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10475 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10476 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10477 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10478 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10479 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10480 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
cc69d12d 10481 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9c7f852e
TI
10482 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10483 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
cc69d12d 10484 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
9c7f852e
TI
10485 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
10486 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10487 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
10488 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
10489 { } /* end */
10490};
10491
ce875f07
TI
10492/* update HP, line and mono-out pins according to the master switch */
10493static void alc262_hp_master_update(struct hda_codec *codec)
10494{
10495 struct alc_spec *spec = codec->spec;
10496 int val = spec->master_sw;
10497
10498 /* HP & line-out */
10499 snd_hda_codec_write_cache(codec, 0x1b, 0,
10500 AC_VERB_SET_PIN_WIDGET_CONTROL,
10501 val ? PIN_HP : 0);
10502 snd_hda_codec_write_cache(codec, 0x15, 0,
10503 AC_VERB_SET_PIN_WIDGET_CONTROL,
10504 val ? PIN_HP : 0);
10505 /* mono (speaker) depending on the HP jack sense */
10506 val = val && !spec->jack_present;
10507 snd_hda_codec_write_cache(codec, 0x16, 0,
10508 AC_VERB_SET_PIN_WIDGET_CONTROL,
10509 val ? PIN_OUT : 0);
10510}
10511
10512static void alc262_hp_bpc_automute(struct hda_codec *codec)
10513{
10514 struct alc_spec *spec = codec->spec;
864f92be
WF
10515
10516 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
ce875f07
TI
10517 alc262_hp_master_update(codec);
10518}
10519
10520static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
10521{
10522 if ((res >> 26) != ALC880_HP_EVENT)
10523 return;
10524 alc262_hp_bpc_automute(codec);
10525}
10526
10527static void alc262_hp_wildwest_automute(struct hda_codec *codec)
10528{
10529 struct alc_spec *spec = codec->spec;
864f92be
WF
10530
10531 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
ce875f07
TI
10532 alc262_hp_master_update(codec);
10533}
10534
10535static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
10536 unsigned int res)
10537{
10538 if ((res >> 26) != ALC880_HP_EVENT)
10539 return;
10540 alc262_hp_wildwest_automute(codec);
10541}
10542
b72519b5 10543#define alc262_hp_master_sw_get alc260_hp_master_sw_get
ce875f07
TI
10544
10545static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
10546 struct snd_ctl_elem_value *ucontrol)
10547{
10548 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10549 struct alc_spec *spec = codec->spec;
10550 int val = !!*ucontrol->value.integer.value;
10551
10552 if (val == spec->master_sw)
10553 return 0;
10554 spec->master_sw = val;
10555 alc262_hp_master_update(codec);
10556 return 1;
10557}
10558
b72519b5
TI
10559#define ALC262_HP_MASTER_SWITCH \
10560 { \
10561 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
10562 .name = "Master Playback Switch", \
10563 .info = snd_ctl_boolean_mono_info, \
10564 .get = alc262_hp_master_sw_get, \
10565 .put = alc262_hp_master_sw_put, \
5b0cb1d8
JK
10566 }, \
10567 { \
10568 .iface = NID_MAPPING, \
10569 .name = "Master Playback Switch", \
10570 .private_value = 0x15 | (0x16 << 8) | (0x1b << 16), \
b72519b5
TI
10571 }
10572
5b0cb1d8 10573
9c7f852e 10574static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
b72519b5 10575 ALC262_HP_MASTER_SWITCH,
9c7f852e
TI
10576 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10577 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10578 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
ce875f07
TI
10579 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10580 HDA_OUTPUT),
10581 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10582 HDA_OUTPUT),
9c7f852e
TI
10583 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10584 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
cc69d12d 10585 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9c7f852e
TI
10586 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10587 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
cc69d12d 10588 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
9c7f852e
TI
10589 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10590 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10591 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10592 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
9c7f852e
TI
10593 HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
10594 HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
10595 { } /* end */
10596};
10597
cd7509a4 10598static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
b72519b5 10599 ALC262_HP_MASTER_SWITCH,
cd7509a4
KY
10600 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10601 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10602 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10603 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
ce875f07
TI
10604 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10605 HDA_OUTPUT),
10606 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10607 HDA_OUTPUT),
cd7509a4
KY
10608 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
10609 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
cc69d12d 10610 HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
cd7509a4
KY
10611 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10612 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10613 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10614 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
cd7509a4
KY
10615 { } /* end */
10616};
10617
10618static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
10619 HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10620 HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
cc69d12d 10621 HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
cd7509a4
KY
10622 { } /* end */
10623};
10624
66d2a9d6 10625/* mute/unmute internal speaker according to the hp jack and mute state */
4f5d1706 10626static void alc262_hp_t5735_setup(struct hda_codec *codec)
66d2a9d6
KY
10627{
10628 struct alc_spec *spec = codec->spec;
66d2a9d6 10629
a9fd4f3f 10630 spec->autocfg.hp_pins[0] = 0x15;
dc99be47 10631 spec->autocfg.speaker_pins[0] = 0x14;
66d2a9d6
KY
10632}
10633
66d2a9d6 10634static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
86cd9298
TI
10635 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10636 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
66d2a9d6
KY
10637 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10638 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10639 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10640 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10641 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10642 { } /* end */
10643};
10644
10645static struct hda_verb alc262_hp_t5735_verbs[] = {
10646 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10647 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10648
10649 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
10650 { }
10651};
10652
8c427226 10653static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
f2f48e18
TI
10654 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10655 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
86cd9298
TI
10656 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
10657 HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
8c427226
KY
10658 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10659 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10660 { } /* end */
10661};
10662
10663static struct hda_verb alc262_hp_rp5700_verbs[] = {
10664 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10665 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10666 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10667 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10668 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10669 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10670 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10671 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10672 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10673 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10674 {}
10675};
10676
10677static struct hda_input_mux alc262_hp_rp5700_capture_source = {
10678 .num_items = 1,
10679 .items = {
10680 { "Line", 0x1 },
10681 },
10682};
10683
42171c17
TI
10684/* bind hp and internal speaker mute (with plug check) as master switch */
10685static void alc262_hippo_master_update(struct hda_codec *codec)
0724ea2a 10686{
42171c17
TI
10687 struct alc_spec *spec = codec->spec;
10688 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10689 hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
10690 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
10691 unsigned int mute;
0724ea2a 10692
42171c17
TI
10693 /* HP */
10694 mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
10695 snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
10696 HDA_AMP_MUTE, mute);
10697 /* mute internal speaker per jack sense */
10698 if (spec->jack_present)
10699 mute = HDA_AMP_MUTE;
10700 if (line_nid)
10701 snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
10702 HDA_AMP_MUTE, mute);
10703 if (speaker_nid && speaker_nid != line_nid)
10704 snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
0724ea2a 10705 HDA_AMP_MUTE, mute);
42171c17
TI
10706}
10707
10708#define alc262_hippo_master_sw_get alc262_hp_master_sw_get
10709
10710static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
10711 struct snd_ctl_elem_value *ucontrol)
10712{
10713 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10714 struct alc_spec *spec = codec->spec;
10715 int val = !!*ucontrol->value.integer.value;
10716
10717 if (val == spec->master_sw)
10718 return 0;
10719 spec->master_sw = val;
10720 alc262_hippo_master_update(codec);
10721 return 1;
10722}
10723
10724#define ALC262_HIPPO_MASTER_SWITCH \
10725 { \
10726 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
10727 .name = "Master Playback Switch", \
10728 .info = snd_ctl_boolean_mono_info, \
10729 .get = alc262_hippo_master_sw_get, \
10730 .put = alc262_hippo_master_sw_put, \
5b0cb1d8
JK
10731 }, \
10732 { \
10733 .iface = NID_MAPPING, \
10734 .name = "Master Playback Switch", \
10735 .subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
10736 (SUBDEV_SPEAKER(0) << 16), \
0724ea2a 10737 }
42171c17
TI
10738
10739static struct snd_kcontrol_new alc262_hippo_mixer[] = {
10740 ALC262_HIPPO_MASTER_SWITCH,
10741 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10742 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10743 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10744 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10745 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10746 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10747 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10748 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10749 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10750 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10751 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10752 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10753 { } /* end */
10754};
10755
10756static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
10757 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10758 ALC262_HIPPO_MASTER_SWITCH,
10759 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10760 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10761 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10762 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10763 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10764 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10765 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10766 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10767 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10768 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10769 { } /* end */
10770};
10771
10772/* mute/unmute internal speaker according to the hp jack and mute state */
10773static void alc262_hippo_automute(struct hda_codec *codec)
10774{
10775 struct alc_spec *spec = codec->spec;
10776 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
42171c17 10777
864f92be 10778 spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
42171c17 10779 alc262_hippo_master_update(codec);
0724ea2a 10780}
5b31954e 10781
42171c17
TI
10782static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
10783{
10784 if ((res >> 26) != ALC880_HP_EVENT)
10785 return;
10786 alc262_hippo_automute(codec);
10787}
10788
4f5d1706 10789static void alc262_hippo_setup(struct hda_codec *codec)
42171c17
TI
10790{
10791 struct alc_spec *spec = codec->spec;
10792
10793 spec->autocfg.hp_pins[0] = 0x15;
10794 spec->autocfg.speaker_pins[0] = 0x14;
42171c17
TI
10795}
10796
4f5d1706 10797static void alc262_hippo1_setup(struct hda_codec *codec)
42171c17
TI
10798{
10799 struct alc_spec *spec = codec->spec;
10800
10801 spec->autocfg.hp_pins[0] = 0x1b;
10802 spec->autocfg.speaker_pins[0] = 0x14;
42171c17
TI
10803}
10804
10805
272a527c 10806static struct snd_kcontrol_new alc262_sony_mixer[] = {
0724ea2a 10807 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
42171c17 10808 ALC262_HIPPO_MASTER_SWITCH,
272a527c
KY
10809 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10810 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10811 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10812 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10813 { } /* end */
10814};
10815
83c34218 10816static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
42171c17
TI
10817 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10818 ALC262_HIPPO_MASTER_SWITCH,
83c34218
KY
10819 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10820 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10821 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10822 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10823 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10824 { } /* end */
10825};
272a527c 10826
ba340e82
TV
10827static struct snd_kcontrol_new alc262_tyan_mixer[] = {
10828 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10829 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
10830 HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
10831 HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
10832 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10833 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10834 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10835 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10836 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10837 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10838 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10839 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10840 { } /* end */
10841};
10842
10843static struct hda_verb alc262_tyan_verbs[] = {
10844 /* Headphone automute */
10845 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10846 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10847 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10848
10849 /* P11 AUX_IN, white 4-pin connector */
10850 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10851 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
10852 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
10853 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
10854
10855 {}
10856};
10857
10858/* unsolicited event for HP jack sensing */
4f5d1706 10859static void alc262_tyan_setup(struct hda_codec *codec)
ba340e82 10860{
a9fd4f3f 10861 struct alc_spec *spec = codec->spec;
ba340e82 10862
a9fd4f3f
TI
10863 spec->autocfg.hp_pins[0] = 0x1b;
10864 spec->autocfg.speaker_pins[0] = 0x15;
ba340e82
TV
10865}
10866
ba340e82 10867
9c7f852e
TI
10868#define alc262_capture_mixer alc882_capture_mixer
10869#define alc262_capture_alt_mixer alc882_capture_alt_mixer
10870
10871/*
10872 * generic initialization of ADC, input mixers and output mixers
10873 */
10874static struct hda_verb alc262_init_verbs[] = {
10875 /*
10876 * Unmute ADC0-2 and set the default input to mic-in
10877 */
10878 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
10879 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10880 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
10881 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10882 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
10883 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10884
cb53c626 10885 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
9c7f852e 10886 * mixer widget
f12ab1e0
TI
10887 * Note: PASD motherboards uses the Line In 2 as the input for
10888 * front panel mic (mic 2)
9c7f852e
TI
10889 */
10890 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
10891 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10892 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10893 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
10894 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
10895 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
9c7f852e
TI
10896
10897 /*
df694daa
KY
10898 * Set up output mixers (0x0c - 0x0e)
10899 */
10900 /* set vol=0 to output mixers */
10901 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10902 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10903 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10904 /* set up input amps for analog loopback */
10905 /* Amp Indices: DAC = 0, mixer = 1 */
10906 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10907 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10908 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10909 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10910 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10911 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10912
10913 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10914 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10915 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10916 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10917 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10918 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10919
10920 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10921 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10922 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10923 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10924 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
ea1fb29a 10925
df694daa
KY
10926 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
10927 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
ea1fb29a 10928
df694daa
KY
10929 /* FIXME: use matrix-type input source selection */
10930 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
10931 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
10932 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10933 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10934 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10935 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10936 /* Input mixer2 */
10937 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10938 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10939 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10940 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10941 /* Input mixer3 */
10942 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10943 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10944 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
f12ab1e0 10945 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
df694daa
KY
10946
10947 { }
10948};
1da177e4 10949
4e555fe5
KY
10950static struct hda_verb alc262_eapd_verbs[] = {
10951 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
10952 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
10953 { }
10954};
10955
ccc656ce
KY
10956static struct hda_verb alc262_hippo1_unsol_verbs[] = {
10957 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10958 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10959 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10960
10961 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10962 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10963 {}
10964};
10965
272a527c
KY
10966static struct hda_verb alc262_sony_unsol_verbs[] = {
10967 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10968 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10969 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, // Front Mic
10970
10971 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10972 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7b1e8795 10973 {}
272a527c
KY
10974};
10975
4e555fe5
KY
10976static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
10977 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10978 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10979 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10980 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10981 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
4e555fe5
KY
10982 { } /* end */
10983};
10984
10985static struct hda_verb alc262_toshiba_s06_verbs[] = {
10986 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10987 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10988 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10989 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10990 {0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
10991 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10992 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
10993 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10994 {}
10995};
10996
4f5d1706 10997static void alc262_toshiba_s06_setup(struct hda_codec *codec)
4e555fe5 10998{
a9fd4f3f
TI
10999 struct alc_spec *spec = codec->spec;
11000
11001 spec->autocfg.hp_pins[0] = 0x15;
11002 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
11003 spec->ext_mic.pin = 0x18;
11004 spec->ext_mic.mux_idx = 0;
11005 spec->int_mic.pin = 0x12;
11006 spec->int_mic.mux_idx = 9;
11007 spec->auto_mic = 1;
4e555fe5
KY
11008}
11009
e8f9ae2a
PT
11010/*
11011 * nec model
11012 * 0x15 = headphone
11013 * 0x16 = internal speaker
11014 * 0x18 = external mic
11015 */
11016
11017static struct snd_kcontrol_new alc262_nec_mixer[] = {
11018 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
11019 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
11020
11021 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11022 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11023 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11024
11025 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11026 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11027 { } /* end */
11028};
11029
11030static struct hda_verb alc262_nec_verbs[] = {
11031 /* Unmute Speaker */
11032 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11033
11034 /* Headphone */
11035 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11036 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11037
11038 /* External mic to headphone */
11039 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11040 /* External mic to speaker */
11041 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11042 {}
11043};
11044
834be88d
TI
11045/*
11046 * fujitsu model
5d9fab2d
TV
11047 * 0x14 = headphone/spdif-out, 0x15 = internal speaker,
11048 * 0x1b = port replicator headphone out
834be88d
TI
11049 */
11050
11051#define ALC_HP_EVENT 0x37
11052
11053static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
11054 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11055 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5d9fab2d
TV
11056 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11057 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
834be88d
TI
11058 {}
11059};
11060
0e31daf7
J
11061static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
11062 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11063 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11064 {}
11065};
11066
e2595322
DC
11067static struct hda_verb alc262_lenovo_3000_init_verbs[] = {
11068 /* Front Mic pin: input vref at 50% */
11069 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
11070 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11071 {}
11072};
11073
834be88d 11074static struct hda_input_mux alc262_fujitsu_capture_source = {
39d3ed38 11075 .num_items = 3,
834be88d
TI
11076 .items = {
11077 { "Mic", 0x0 },
39d3ed38 11078 { "Int Mic", 0x1 },
834be88d
TI
11079 { "CD", 0x4 },
11080 },
11081};
11082
9c7f852e
TI
11083static struct hda_input_mux alc262_HP_capture_source = {
11084 .num_items = 5,
11085 .items = {
11086 { "Mic", 0x0 },
accbe498 11087 { "Front Mic", 0x1 },
9c7f852e
TI
11088 { "Line", 0x2 },
11089 { "CD", 0x4 },
11090 { "AUX IN", 0x6 },
11091 },
11092};
11093
accbe498 11094static struct hda_input_mux alc262_HP_D7000_capture_source = {
11095 .num_items = 4,
11096 .items = {
11097 { "Mic", 0x0 },
11098 { "Front Mic", 0x2 },
11099 { "Line", 0x1 },
11100 { "CD", 0x4 },
11101 },
11102};
11103
ebc7a406 11104/* mute/unmute internal speaker according to the hp jacks and mute state */
834be88d
TI
11105static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
11106{
11107 struct alc_spec *spec = codec->spec;
11108 unsigned int mute;
11109
f12ab1e0 11110 if (force || !spec->sense_updated) {
864f92be
WF
11111 spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
11112 snd_hda_jack_detect(codec, 0x1b);
834be88d
TI
11113 spec->sense_updated = 1;
11114 }
ebc7a406
TI
11115 /* unmute internal speaker only if both HPs are unplugged and
11116 * master switch is on
11117 */
11118 if (spec->jack_present)
11119 mute = HDA_AMP_MUTE;
11120 else
834be88d 11121 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
ebc7a406
TI
11122 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11123 HDA_AMP_MUTE, mute);
834be88d
TI
11124}
11125
11126/* unsolicited event for HP jack sensing */
11127static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
11128 unsigned int res)
11129{
11130 if ((res >> 26) != ALC_HP_EVENT)
11131 return;
11132 alc262_fujitsu_automute(codec, 1);
11133}
11134
ebc7a406
TI
11135static void alc262_fujitsu_init_hook(struct hda_codec *codec)
11136{
11137 alc262_fujitsu_automute(codec, 1);
11138}
11139
834be88d 11140/* bind volumes of both NID 0x0c and 0x0d */
cca3b371
TI
11141static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
11142 .ops = &snd_hda_bind_vol,
11143 .values = {
11144 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
11145 HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
11146 0
11147 },
11148};
834be88d 11149
0e31daf7
J
11150/* mute/unmute internal speaker according to the hp jack and mute state */
11151static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
11152{
11153 struct alc_spec *spec = codec->spec;
11154 unsigned int mute;
11155
11156 if (force || !spec->sense_updated) {
864f92be 11157 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
0e31daf7
J
11158 spec->sense_updated = 1;
11159 }
11160 if (spec->jack_present) {
11161 /* mute internal speaker */
11162 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11163 HDA_AMP_MUTE, HDA_AMP_MUTE);
11164 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11165 HDA_AMP_MUTE, HDA_AMP_MUTE);
11166 } else {
11167 /* unmute internal speaker if necessary */
11168 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
11169 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11170 HDA_AMP_MUTE, mute);
11171 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11172 HDA_AMP_MUTE, mute);
11173 }
11174}
11175
11176/* unsolicited event for HP jack sensing */
11177static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
11178 unsigned int res)
11179{
11180 if ((res >> 26) != ALC_HP_EVENT)
11181 return;
11182 alc262_lenovo_3000_automute(codec, 1);
11183}
11184
8de56b7d
TI
11185static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
11186 int dir, int idx, long *valp)
11187{
11188 int i, change = 0;
11189
11190 for (i = 0; i < 2; i++, valp++)
11191 change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
11192 HDA_AMP_MUTE,
11193 *valp ? 0 : HDA_AMP_MUTE);
11194 return change;
11195}
11196
834be88d
TI
11197/* bind hp and internal speaker mute (with plug check) */
11198static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
11199 struct snd_ctl_elem_value *ucontrol)
11200{
11201 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11202 long *valp = ucontrol->value.integer.value;
11203 int change;
11204
8de56b7d
TI
11205 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11206 change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
82beb8fd
TI
11207 if (change)
11208 alc262_fujitsu_automute(codec, 0);
834be88d
TI
11209 return change;
11210}
11211
11212static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
cca3b371 11213 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
834be88d
TI
11214 {
11215 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11216 .name = "Master Playback Switch",
5e26dfd0 11217 .subdevice = HDA_SUBDEV_AMP_FLAG,
834be88d
TI
11218 .info = snd_hda_mixer_amp_switch_info,
11219 .get = snd_hda_mixer_amp_switch_get,
11220 .put = alc262_fujitsu_master_sw_put,
11221 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11222 },
5b0cb1d8
JK
11223 {
11224 .iface = NID_MAPPING,
11225 .name = "Master Playback Switch",
11226 .private_value = 0x1b,
11227 },
834be88d
TI
11228 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11229 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11230 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11231 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11232 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
39d3ed38
TI
11233 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11234 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11235 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
834be88d
TI
11236 { } /* end */
11237};
11238
0e31daf7
J
11239/* bind hp and internal speaker mute (with plug check) */
11240static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
11241 struct snd_ctl_elem_value *ucontrol)
11242{
11243 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11244 long *valp = ucontrol->value.integer.value;
11245 int change;
11246
8de56b7d 11247 change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
0e31daf7
J
11248 if (change)
11249 alc262_lenovo_3000_automute(codec, 0);
11250 return change;
11251}
11252
11253static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
11254 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11255 {
11256 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11257 .name = "Master Playback Switch",
5e26dfd0 11258 .subdevice = HDA_SUBDEV_AMP_FLAG,
0e31daf7
J
11259 .info = snd_hda_mixer_amp_switch_info,
11260 .get = snd_hda_mixer_amp_switch_get,
11261 .put = alc262_lenovo_3000_master_sw_put,
11262 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
11263 },
11264 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11265 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11266 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11267 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11268 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11269 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11270 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11271 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11272 { } /* end */
11273};
11274
9f99a638
HM
11275static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
11276 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
42171c17 11277 ALC262_HIPPO_MASTER_SWITCH,
9f99a638
HM
11278 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11279 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11280 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11281 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11282 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11283 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11284 { } /* end */
11285};
11286
304dcaac
TI
11287/* additional init verbs for Benq laptops */
11288static struct hda_verb alc262_EAPD_verbs[] = {
11289 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11290 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
11291 {}
11292};
11293
83c34218
KY
11294static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
11295 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11296 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11297
11298 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11299 {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
11300 {}
11301};
11302
f651b50b
TD
11303/* Samsung Q1 Ultra Vista model setup */
11304static struct snd_kcontrol_new alc262_ultra_mixer[] = {
bb9f76cd
TI
11305 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11306 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
f651b50b
TD
11307 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11308 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11309 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
bb9f76cd 11310 HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
f651b50b
TD
11311 { } /* end */
11312};
11313
11314static struct hda_verb alc262_ultra_verbs[] = {
bb9f76cd
TI
11315 /* output mixer */
11316 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11317 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11318 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11319 /* speaker */
11320 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11321 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11322 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11323 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11324 /* HP */
f651b50b 11325 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
bb9f76cd
TI
11326 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11327 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11328 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11329 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11330 /* internal mic */
11331 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
11332 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11333 /* ADC, choose mic */
11334 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11335 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11336 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11337 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11338 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11339 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11340 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11341 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11342 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11343 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
f651b50b
TD
11344 {}
11345};
11346
f651b50b
TD
11347/* mute/unmute internal speaker according to the hp jack and mute state */
11348static void alc262_ultra_automute(struct hda_codec *codec)
11349{
11350 struct alc_spec *spec = codec->spec;
11351 unsigned int mute;
f651b50b 11352
bb9f76cd
TI
11353 mute = 0;
11354 /* auto-mute only when HP is used as HP */
11355 if (!spec->cur_mux[0]) {
864f92be 11356 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
bb9f76cd
TI
11357 if (spec->jack_present)
11358 mute = HDA_AMP_MUTE;
f651b50b 11359 }
bb9f76cd
TI
11360 /* mute/unmute internal speaker */
11361 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11362 HDA_AMP_MUTE, mute);
11363 /* mute/unmute HP */
11364 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11365 HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
f651b50b
TD
11366}
11367
11368/* unsolicited event for HP jack sensing */
11369static void alc262_ultra_unsol_event(struct hda_codec *codec,
11370 unsigned int res)
11371{
11372 if ((res >> 26) != ALC880_HP_EVENT)
11373 return;
11374 alc262_ultra_automute(codec);
11375}
11376
bb9f76cd
TI
11377static struct hda_input_mux alc262_ultra_capture_source = {
11378 .num_items = 2,
11379 .items = {
11380 { "Mic", 0x1 },
11381 { "Headphone", 0x7 },
11382 },
11383};
11384
11385static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
11386 struct snd_ctl_elem_value *ucontrol)
11387{
11388 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11389 struct alc_spec *spec = codec->spec;
11390 int ret;
11391
54cbc9ab 11392 ret = alc_mux_enum_put(kcontrol, ucontrol);
bb9f76cd
TI
11393 if (!ret)
11394 return 0;
11395 /* reprogram the HP pin as mic or HP according to the input source */
11396 snd_hda_codec_write_cache(codec, 0x15, 0,
11397 AC_VERB_SET_PIN_WIDGET_CONTROL,
11398 spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
11399 alc262_ultra_automute(codec); /* mute/unmute HP */
11400 return ret;
11401}
11402
11403static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
11404 HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
11405 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
11406 {
11407 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11408 .name = "Capture Source",
54cbc9ab
TI
11409 .info = alc_mux_enum_info,
11410 .get = alc_mux_enum_get,
bb9f76cd
TI
11411 .put = alc262_ultra_mux_enum_put,
11412 },
5b0cb1d8
JK
11413 {
11414 .iface = NID_MAPPING,
11415 .name = "Capture Source",
11416 .private_value = 0x15,
11417 },
bb9f76cd
TI
11418 { } /* end */
11419};
11420
c3fc1f50
TI
11421/* We use two mixers depending on the output pin; 0x16 is a mono output
11422 * and thus it's bound with a different mixer.
11423 * This function returns which mixer amp should be used.
11424 */
11425static int alc262_check_volbit(hda_nid_t nid)
11426{
11427 if (!nid)
11428 return 0;
11429 else if (nid == 0x16)
11430 return 2;
11431 else
11432 return 1;
11433}
11434
11435static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
11436 const char *pfx, int *vbits)
11437{
c3fc1f50
TI
11438 unsigned long val;
11439 int vbit;
11440
11441 vbit = alc262_check_volbit(nid);
11442 if (!vbit)
11443 return 0;
11444 if (*vbits & vbit) /* a volume control for this mixer already there */
11445 return 0;
11446 *vbits |= vbit;
c3fc1f50
TI
11447 if (vbit == 2)
11448 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
11449 else
11450 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
0afe5f89 11451 return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, val);
c3fc1f50
TI
11452}
11453
11454static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
11455 const char *pfx)
11456{
c3fc1f50
TI
11457 unsigned long val;
11458
11459 if (!nid)
11460 return 0;
c3fc1f50
TI
11461 if (nid == 0x16)
11462 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
11463 else
11464 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
0afe5f89 11465 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val);
c3fc1f50
TI
11466}
11467
df694daa 11468/* add playback controls from the parsed DAC table */
f12ab1e0
TI
11469static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
11470 const struct auto_pin_cfg *cfg)
df694daa 11471{
c3fc1f50
TI
11472 const char *pfx;
11473 int vbits;
df694daa
KY
11474 int err;
11475
11476 spec->multiout.num_dacs = 1; /* only use one dac */
11477 spec->multiout.dac_nids = spec->private_dac_nids;
11478 spec->multiout.dac_nids[0] = 2;
11479
c3fc1f50
TI
11480 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
11481 pfx = "Master";
11482 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11483 pfx = "Speaker";
11484 else
11485 pfx = "Front";
11486 err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx);
11487 if (err < 0)
11488 return err;
11489 err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker");
11490 if (err < 0)
11491 return err;
11492 err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone");
11493 if (err < 0)
11494 return err;
df694daa 11495
c3fc1f50
TI
11496 vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
11497 alc262_check_volbit(cfg->speaker_pins[0]) |
11498 alc262_check_volbit(cfg->hp_pins[0]);
11499 if (vbits == 1 || vbits == 2)
11500 pfx = "Master"; /* only one mixer is used */
11501 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11502 pfx = "Speaker";
11503 else
11504 pfx = "Front";
11505 vbits = 0;
11506 err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits);
11507 if (err < 0)
11508 return err;
11509 err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker",
11510 &vbits);
11511 if (err < 0)
11512 return err;
11513 err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone",
11514 &vbits);
11515 if (err < 0)
11516 return err;
f12ab1e0 11517 return 0;
df694daa
KY
11518}
11519
05f5f477 11520#define alc262_auto_create_input_ctls \
eaa9b3a7 11521 alc882_auto_create_input_ctls
df694daa
KY
11522
11523/*
11524 * generic initialization of ADC, input mixers and output mixers
11525 */
11526static struct hda_verb alc262_volume_init_verbs[] = {
11527 /*
11528 * Unmute ADC0-2 and set the default input to mic-in
11529 */
11530 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11531 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11532 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11533 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11534 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11535 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11536
cb53c626 11537 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
df694daa 11538 * mixer widget
f12ab1e0
TI
11539 * Note: PASD motherboards uses the Line In 2 as the input for
11540 * front panel mic (mic 2)
df694daa
KY
11541 */
11542 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
11543 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11544 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11545 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11546 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11547 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
df694daa
KY
11548
11549 /*
11550 * Set up output mixers (0x0c - 0x0f)
11551 */
11552 /* set vol=0 to output mixers */
11553 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11554 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11555 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
ea1fb29a 11556
df694daa
KY
11557 /* set up input amps for analog loopback */
11558 /* Amp Indices: DAC = 0, mixer = 1 */
11559 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11560 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11561 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11562 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11563 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11564 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11565
11566 /* FIXME: use matrix-type input source selection */
11567 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11568 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11569 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11570 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11571 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11572 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11573 /* Input mixer2 */
11574 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11575 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11576 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11577 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11578 /* Input mixer3 */
11579 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11580 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11581 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11582 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11583
11584 { }
11585};
11586
9c7f852e
TI
11587static struct hda_verb alc262_HP_BPC_init_verbs[] = {
11588 /*
11589 * Unmute ADC0-2 and set the default input to mic-in
11590 */
11591 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11592 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11593 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11594 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11595 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11596 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11597
cb53c626 11598 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
9c7f852e 11599 * mixer widget
f12ab1e0
TI
11600 * Note: PASD motherboards uses the Line In 2 as the input for
11601 * front panel mic (mic 2)
9c7f852e
TI
11602 */
11603 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
11604 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11605 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11606 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11607 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11608 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11609 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11610 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
ea1fb29a 11611
9c7f852e
TI
11612 /*
11613 * Set up output mixers (0x0c - 0x0e)
11614 */
11615 /* set vol=0 to output mixers */
11616 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11617 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11618 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11619
11620 /* set up input amps for analog loopback */
11621 /* Amp Indices: DAC = 0, mixer = 1 */
11622 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11623 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11624 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11625 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11626 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11627 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11628
ce875f07 11629 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9c7f852e
TI
11630 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11631 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11632
11633 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11634 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11635
11636 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11637 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11638
11639 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11640 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11641 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11642 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11643 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11644
0e4835c1 11645 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
9c7f852e
TI
11646 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11647 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
0e4835c1 11648 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
9c7f852e
TI
11649 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11650 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11651
11652
11653 /* FIXME: use matrix-type input source selection */
0e4835c1
JK
11654 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
11655 /* Input mixer1: only unmute Mic */
9c7f852e 11656 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
0e4835c1
JK
11657 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11658 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11659 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11660 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11661 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11662 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11663 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11664 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
9c7f852e
TI
11665 /* Input mixer2 */
11666 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
0e4835c1
JK
11667 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11668 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11669 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11670 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11671 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11672 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11673 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11674 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
9c7f852e
TI
11675 /* Input mixer3 */
11676 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
0e4835c1
JK
11677 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11678 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11679 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11680 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11681 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11682 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11683 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11684 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
9c7f852e 11685
ce875f07
TI
11686 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11687
9c7f852e
TI
11688 { }
11689};
11690
cd7509a4
KY
11691static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
11692 /*
11693 * Unmute ADC0-2 and set the default input to mic-in
11694 */
11695 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11696 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11697 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11698 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11699 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11700 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11701
cb53c626 11702 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
cd7509a4
KY
11703 * mixer widget
11704 * Note: PASD motherboards uses the Line In 2 as the input for front
11705 * panel mic (mic 2)
11706 */
11707 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
11708 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11709 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11710 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11711 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11712 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11713 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11714 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11715 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
cd7509a4
KY
11716 /*
11717 * Set up output mixers (0x0c - 0x0e)
11718 */
11719 /* set vol=0 to output mixers */
11720 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11721 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11722 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11723
11724 /* set up input amps for analog loopback */
11725 /* Amp Indices: DAC = 0, mixer = 1 */
11726 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11727 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11728 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11729 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11730 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11731 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11732
11733
11734 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP */
11735 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Mono */
11736 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* rear MIC */
11737 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* Line in */
11738 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
11739 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Line out */
11740 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD in */
11741
11742 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11743 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11744
11745 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11746 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11747
11748 /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
11749 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11750 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11751 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
11752 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11753 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11754
11755 /* FIXME: use matrix-type input source selection */
11756 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11757 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11758 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
11759 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
11760 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
11761 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
11762 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
11763 /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11764 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
11765 /* Input mixer2 */
11766 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11767 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11768 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11769 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11770 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11771 /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11772 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11773 /* Input mixer3 */
11774 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11775 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11776 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11777 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11778 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11779 /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11780 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11781
ce875f07
TI
11782 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11783
cd7509a4
KY
11784 { }
11785};
11786
9f99a638
HM
11787static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
11788
11789 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Front Speaker */
11790 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11791 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
11792
11793 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* MIC jack */
11794 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
11795 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11796 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11797
11798 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP jack */
11799 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11800 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11801 {}
11802};
11803
11804
cb53c626
TI
11805#ifdef CONFIG_SND_HDA_POWER_SAVE
11806#define alc262_loopbacks alc880_loopbacks
11807#endif
11808
def319f9 11809/* pcm configuration: identical with ALC880 */
df694daa
KY
11810#define alc262_pcm_analog_playback alc880_pcm_analog_playback
11811#define alc262_pcm_analog_capture alc880_pcm_analog_capture
11812#define alc262_pcm_digital_playback alc880_pcm_digital_playback
11813#define alc262_pcm_digital_capture alc880_pcm_digital_capture
11814
11815/*
11816 * BIOS auto configuration
11817 */
11818static int alc262_parse_auto_config(struct hda_codec *codec)
11819{
11820 struct alc_spec *spec = codec->spec;
11821 int err;
11822 static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
11823
f12ab1e0
TI
11824 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
11825 alc262_ignore);
11826 if (err < 0)
df694daa 11827 return err;
e64f14f4 11828 if (!spec->autocfg.line_outs) {
0852d7a6 11829 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
e64f14f4
TI
11830 spec->multiout.max_channels = 2;
11831 spec->no_analog = 1;
11832 goto dig_only;
11833 }
df694daa 11834 return 0; /* can't find valid BIOS pin config */
e64f14f4 11835 }
f12ab1e0
TI
11836 err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
11837 if (err < 0)
11838 return err;
05f5f477 11839 err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 11840 if (err < 0)
df694daa
KY
11841 return err;
11842
11843 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
11844
e64f14f4 11845 dig_only:
0852d7a6 11846 if (spec->autocfg.dig_outs) {
df694daa 11847 spec->multiout.dig_out_nid = ALC262_DIGOUT_NID;
0852d7a6 11848 spec->dig_out_type = spec->autocfg.dig_out_type[0];
e64f14f4 11849 }
df694daa
KY
11850 if (spec->autocfg.dig_in_pin)
11851 spec->dig_in_nid = ALC262_DIGIN_NID;
11852
603c4019 11853 if (spec->kctls.list)
d88897ea 11854 add_mixer(spec, spec->kctls.list);
df694daa 11855
d88897ea 11856 add_verb(spec, alc262_volume_init_verbs);
a1e8d2da 11857 spec->num_mux_defs = 1;
61b9b9b1 11858 spec->input_mux = &spec->private_imux[0];
df694daa 11859
776e184e
TI
11860 err = alc_auto_add_mic_boost(codec);
11861 if (err < 0)
11862 return err;
11863
6227cdce 11864 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4a79ba34 11865
df694daa
KY
11866 return 1;
11867}
11868
11869#define alc262_auto_init_multi_out alc882_auto_init_multi_out
11870#define alc262_auto_init_hp_out alc882_auto_init_hp_out
11871#define alc262_auto_init_analog_input alc882_auto_init_analog_input
f511b01c 11872#define alc262_auto_init_input_src alc882_auto_init_input_src
df694daa
KY
11873
11874
11875/* init callback for auto-configuration model -- overriding the default init */
ae6b813a 11876static void alc262_auto_init(struct hda_codec *codec)
df694daa 11877{
f6c7e546 11878 struct alc_spec *spec = codec->spec;
df694daa
KY
11879 alc262_auto_init_multi_out(codec);
11880 alc262_auto_init_hp_out(codec);
11881 alc262_auto_init_analog_input(codec);
f511b01c 11882 alc262_auto_init_input_src(codec);
f6c7e546 11883 if (spec->unsol_event)
7fb0d78f 11884 alc_inithook(codec);
df694daa
KY
11885}
11886
11887/*
11888 * configuration and preset
11889 */
f5fcc13c
TI
11890static const char *alc262_models[ALC262_MODEL_LAST] = {
11891 [ALC262_BASIC] = "basic",
11892 [ALC262_HIPPO] = "hippo",
11893 [ALC262_HIPPO_1] = "hippo_1",
11894 [ALC262_FUJITSU] = "fujitsu",
11895 [ALC262_HP_BPC] = "hp-bpc",
cd7509a4 11896 [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
61dc35de 11897 [ALC262_HP_TC_T5735] = "hp-tc-t5735",
8c427226 11898 [ALC262_HP_RP5700] = "hp-rp5700",
f5fcc13c 11899 [ALC262_BENQ_ED8] = "benq",
0f40502e
TI
11900 [ALC262_BENQ_T31] = "benq-t31",
11901 [ALC262_SONY_ASSAMD] = "sony-assamd",
2922c9af 11902 [ALC262_TOSHIBA_S06] = "toshiba-s06",
9f99a638 11903 [ALC262_TOSHIBA_RX1] = "toshiba-rx1",
f651b50b 11904 [ALC262_ULTRA] = "ultra",
0e31daf7 11905 [ALC262_LENOVO_3000] = "lenovo-3000",
e8f9ae2a 11906 [ALC262_NEC] = "nec",
ba340e82 11907 [ALC262_TYAN] = "tyan",
f5fcc13c
TI
11908 [ALC262_AUTO] = "auto",
11909};
11910
11911static struct snd_pci_quirk alc262_cfg_tbl[] = {
11912 SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
e8f9ae2a 11913 SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
dea0a509
TI
11914 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
11915 ALC262_HP_BPC),
11916 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
11917 ALC262_HP_BPC),
53eff7e1
TI
11918 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
11919 ALC262_HP_BPC),
cd7509a4 11920 SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
cd7509a4 11921 SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
ac3e3741 11922 SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
cd7509a4 11923 SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
ac3e3741 11924 SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
cd7509a4 11925 SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
ac3e3741 11926 SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
cd7509a4 11927 SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
ac3e3741
TI
11928 SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
11929 SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
11930 SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
66d2a9d6
KY
11931 SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
11932 ALC262_HP_TC_T5735),
8c427226 11933 SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
ac3e3741 11934 SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
f5fcc13c 11935 SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
5b31954e 11936 SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
bd6afe3f 11937 SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
376b508f 11938 SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
95491d90 11939 SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
12929bae 11940 SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
c5b5165c 11941#if 0 /* disable the quirk since model=auto works better in recent versions */
f872a919
TI
11942 SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
11943 ALC262_SONY_ASSAMD),
c5b5165c 11944#endif
36ca6e13 11945 SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
9f99a638 11946 ALC262_TOSHIBA_RX1),
80ffe869 11947 SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
ac3e3741 11948 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
3f1eeaed 11949 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
ba340e82 11950 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
dea0a509
TI
11951 SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
11952 ALC262_ULTRA),
3e420e78 11953 SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
0e31daf7 11954 SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
ac3e3741
TI
11955 SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
11956 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
11957 SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
df694daa
KY
11958 {}
11959};
11960
11961static struct alc_config_preset alc262_presets[] = {
11962 [ALC262_BASIC] = {
11963 .mixers = { alc262_base_mixer },
11964 .init_verbs = { alc262_init_verbs },
11965 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11966 .dac_nids = alc262_dac_nids,
11967 .hp_nid = 0x03,
11968 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11969 .channel_mode = alc262_modes,
a3bcba38 11970 .input_mux = &alc262_capture_source,
df694daa 11971 },
ccc656ce 11972 [ALC262_HIPPO] = {
42171c17 11973 .mixers = { alc262_hippo_mixer },
6732bd0d 11974 .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
ccc656ce
KY
11975 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11976 .dac_nids = alc262_dac_nids,
11977 .hp_nid = 0x03,
11978 .dig_out_nid = ALC262_DIGOUT_NID,
11979 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11980 .channel_mode = alc262_modes,
11981 .input_mux = &alc262_capture_source,
11982 .unsol_event = alc262_hippo_unsol_event,
4f5d1706
TI
11983 .setup = alc262_hippo_setup,
11984 .init_hook = alc262_hippo_automute,
ccc656ce
KY
11985 },
11986 [ALC262_HIPPO_1] = {
11987 .mixers = { alc262_hippo1_mixer },
11988 .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
11989 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11990 .dac_nids = alc262_dac_nids,
11991 .hp_nid = 0x02,
11992 .dig_out_nid = ALC262_DIGOUT_NID,
11993 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11994 .channel_mode = alc262_modes,
11995 .input_mux = &alc262_capture_source,
42171c17 11996 .unsol_event = alc262_hippo_unsol_event,
4f5d1706
TI
11997 .setup = alc262_hippo1_setup,
11998 .init_hook = alc262_hippo_automute,
ccc656ce 11999 },
834be88d
TI
12000 [ALC262_FUJITSU] = {
12001 .mixers = { alc262_fujitsu_mixer },
39d3ed38
TI
12002 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12003 alc262_fujitsu_unsol_verbs },
834be88d
TI
12004 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12005 .dac_nids = alc262_dac_nids,
12006 .hp_nid = 0x03,
12007 .dig_out_nid = ALC262_DIGOUT_NID,
12008 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12009 .channel_mode = alc262_modes,
12010 .input_mux = &alc262_fujitsu_capture_source,
ae6b813a 12011 .unsol_event = alc262_fujitsu_unsol_event,
ebc7a406 12012 .init_hook = alc262_fujitsu_init_hook,
834be88d 12013 },
9c7f852e
TI
12014 [ALC262_HP_BPC] = {
12015 .mixers = { alc262_HP_BPC_mixer },
12016 .init_verbs = { alc262_HP_BPC_init_verbs },
12017 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12018 .dac_nids = alc262_dac_nids,
12019 .hp_nid = 0x03,
12020 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12021 .channel_mode = alc262_modes,
12022 .input_mux = &alc262_HP_capture_source,
ce875f07
TI
12023 .unsol_event = alc262_hp_bpc_unsol_event,
12024 .init_hook = alc262_hp_bpc_automute,
f12ab1e0 12025 },
cd7509a4
KY
12026 [ALC262_HP_BPC_D7000_WF] = {
12027 .mixers = { alc262_HP_BPC_WildWest_mixer },
12028 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12029 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12030 .dac_nids = alc262_dac_nids,
12031 .hp_nid = 0x03,
12032 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12033 .channel_mode = alc262_modes,
accbe498 12034 .input_mux = &alc262_HP_D7000_capture_source,
ce875f07
TI
12035 .unsol_event = alc262_hp_wildwest_unsol_event,
12036 .init_hook = alc262_hp_wildwest_automute,
f12ab1e0 12037 },
cd7509a4
KY
12038 [ALC262_HP_BPC_D7000_WL] = {
12039 .mixers = { alc262_HP_BPC_WildWest_mixer,
12040 alc262_HP_BPC_WildWest_option_mixer },
12041 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12042 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12043 .dac_nids = alc262_dac_nids,
12044 .hp_nid = 0x03,
12045 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12046 .channel_mode = alc262_modes,
accbe498 12047 .input_mux = &alc262_HP_D7000_capture_source,
ce875f07
TI
12048 .unsol_event = alc262_hp_wildwest_unsol_event,
12049 .init_hook = alc262_hp_wildwest_automute,
f12ab1e0 12050 },
66d2a9d6
KY
12051 [ALC262_HP_TC_T5735] = {
12052 .mixers = { alc262_hp_t5735_mixer },
12053 .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
12054 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12055 .dac_nids = alc262_dac_nids,
12056 .hp_nid = 0x03,
12057 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12058 .channel_mode = alc262_modes,
12059 .input_mux = &alc262_capture_source,
dc99be47 12060 .unsol_event = alc_sku_unsol_event,
4f5d1706 12061 .setup = alc262_hp_t5735_setup,
dc99be47 12062 .init_hook = alc_inithook,
8c427226
KY
12063 },
12064 [ALC262_HP_RP5700] = {
12065 .mixers = { alc262_hp_rp5700_mixer },
12066 .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
12067 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12068 .dac_nids = alc262_dac_nids,
12069 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12070 .channel_mode = alc262_modes,
12071 .input_mux = &alc262_hp_rp5700_capture_source,
66d2a9d6 12072 },
304dcaac
TI
12073 [ALC262_BENQ_ED8] = {
12074 .mixers = { alc262_base_mixer },
12075 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
12076 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12077 .dac_nids = alc262_dac_nids,
12078 .hp_nid = 0x03,
12079 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12080 .channel_mode = alc262_modes,
12081 .input_mux = &alc262_capture_source,
f12ab1e0 12082 },
272a527c
KY
12083 [ALC262_SONY_ASSAMD] = {
12084 .mixers = { alc262_sony_mixer },
12085 .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
12086 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12087 .dac_nids = alc262_dac_nids,
12088 .hp_nid = 0x02,
12089 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12090 .channel_mode = alc262_modes,
12091 .input_mux = &alc262_capture_source,
12092 .unsol_event = alc262_hippo_unsol_event,
4f5d1706
TI
12093 .setup = alc262_hippo_setup,
12094 .init_hook = alc262_hippo_automute,
83c34218
KY
12095 },
12096 [ALC262_BENQ_T31] = {
12097 .mixers = { alc262_benq_t31_mixer },
6732bd0d
WF
12098 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
12099 alc_hp15_unsol_verbs },
83c34218
KY
12100 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12101 .dac_nids = alc262_dac_nids,
12102 .hp_nid = 0x03,
12103 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12104 .channel_mode = alc262_modes,
12105 .input_mux = &alc262_capture_source,
12106 .unsol_event = alc262_hippo_unsol_event,
4f5d1706
TI
12107 .setup = alc262_hippo_setup,
12108 .init_hook = alc262_hippo_automute,
ea1fb29a 12109 },
f651b50b 12110 [ALC262_ULTRA] = {
f9e336f6
TI
12111 .mixers = { alc262_ultra_mixer },
12112 .cap_mixer = alc262_ultra_capture_mixer,
bb9f76cd 12113 .init_verbs = { alc262_ultra_verbs },
f651b50b
TD
12114 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12115 .dac_nids = alc262_dac_nids,
f651b50b
TD
12116 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12117 .channel_mode = alc262_modes,
12118 .input_mux = &alc262_ultra_capture_source,
bb9f76cd
TI
12119 .adc_nids = alc262_adc_nids, /* ADC0 */
12120 .capsrc_nids = alc262_capsrc_nids,
12121 .num_adc_nids = 1, /* single ADC */
f651b50b
TD
12122 .unsol_event = alc262_ultra_unsol_event,
12123 .init_hook = alc262_ultra_automute,
12124 },
0e31daf7
J
12125 [ALC262_LENOVO_3000] = {
12126 .mixers = { alc262_lenovo_3000_mixer },
12127 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
e2595322
DC
12128 alc262_lenovo_3000_unsol_verbs,
12129 alc262_lenovo_3000_init_verbs },
0e31daf7
J
12130 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12131 .dac_nids = alc262_dac_nids,
12132 .hp_nid = 0x03,
12133 .dig_out_nid = ALC262_DIGOUT_NID,
12134 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12135 .channel_mode = alc262_modes,
12136 .input_mux = &alc262_fujitsu_capture_source,
12137 .unsol_event = alc262_lenovo_3000_unsol_event,
12138 },
e8f9ae2a
PT
12139 [ALC262_NEC] = {
12140 .mixers = { alc262_nec_mixer },
12141 .init_verbs = { alc262_nec_verbs },
12142 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12143 .dac_nids = alc262_dac_nids,
12144 .hp_nid = 0x03,
12145 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12146 .channel_mode = alc262_modes,
12147 .input_mux = &alc262_capture_source,
12148 },
4e555fe5
KY
12149 [ALC262_TOSHIBA_S06] = {
12150 .mixers = { alc262_toshiba_s06_mixer },
12151 .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
12152 alc262_eapd_verbs },
12153 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12154 .capsrc_nids = alc262_dmic_capsrc_nids,
12155 .dac_nids = alc262_dac_nids,
12156 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
ae14ef68 12157 .num_adc_nids = 1, /* single ADC */
4e555fe5
KY
12158 .dig_out_nid = ALC262_DIGOUT_NID,
12159 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12160 .channel_mode = alc262_modes,
4f5d1706
TI
12161 .unsol_event = alc_sku_unsol_event,
12162 .setup = alc262_toshiba_s06_setup,
12163 .init_hook = alc_inithook,
4e555fe5 12164 },
9f99a638
HM
12165 [ALC262_TOSHIBA_RX1] = {
12166 .mixers = { alc262_toshiba_rx1_mixer },
12167 .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
12168 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12169 .dac_nids = alc262_dac_nids,
12170 .hp_nid = 0x03,
12171 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12172 .channel_mode = alc262_modes,
12173 .input_mux = &alc262_capture_source,
12174 .unsol_event = alc262_hippo_unsol_event,
4f5d1706
TI
12175 .setup = alc262_hippo_setup,
12176 .init_hook = alc262_hippo_automute,
9f99a638 12177 },
ba340e82
TV
12178 [ALC262_TYAN] = {
12179 .mixers = { alc262_tyan_mixer },
12180 .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
12181 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12182 .dac_nids = alc262_dac_nids,
12183 .hp_nid = 0x02,
12184 .dig_out_nid = ALC262_DIGOUT_NID,
12185 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12186 .channel_mode = alc262_modes,
12187 .input_mux = &alc262_capture_source,
a9fd4f3f 12188 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
12189 .setup = alc262_tyan_setup,
12190 .init_hook = alc_automute_amp,
ba340e82 12191 },
df694daa
KY
12192};
12193
12194static int patch_alc262(struct hda_codec *codec)
12195{
12196 struct alc_spec *spec;
12197 int board_config;
12198 int err;
12199
dc041e0b 12200 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
df694daa
KY
12201 if (spec == NULL)
12202 return -ENOMEM;
12203
12204 codec->spec = spec;
12205#if 0
f12ab1e0
TI
12206 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is
12207 * under-run
12208 */
df694daa
KY
12209 {
12210 int tmp;
12211 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12212 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
12213 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12214 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
12215 }
12216#endif
12217
2c3bf9ab
TI
12218 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
12219
f5fcc13c
TI
12220 board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
12221 alc262_models,
12222 alc262_cfg_tbl);
cd7509a4 12223
f5fcc13c 12224 if (board_config < 0) {
9a11f1aa
TI
12225 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12226 codec->chip_name);
df694daa
KY
12227 board_config = ALC262_AUTO;
12228 }
12229
12230 if (board_config == ALC262_AUTO) {
12231 /* automatic parse from the BIOS config */
12232 err = alc262_parse_auto_config(codec);
12233 if (err < 0) {
12234 alc_free(codec);
12235 return err;
f12ab1e0 12236 } else if (!err) {
9c7f852e
TI
12237 printk(KERN_INFO
12238 "hda_codec: Cannot set up configuration "
12239 "from BIOS. Using base mode...\n");
df694daa
KY
12240 board_config = ALC262_BASIC;
12241 }
12242 }
12243
07eba61d
TI
12244 if (!spec->no_analog) {
12245 err = snd_hda_attach_beep_device(codec, 0x1);
12246 if (err < 0) {
12247 alc_free(codec);
12248 return err;
12249 }
680cd536
KK
12250 }
12251
df694daa 12252 if (board_config != ALC262_AUTO)
e9c364c0 12253 setup_preset(codec, &alc262_presets[board_config]);
df694daa 12254
df694daa
KY
12255 spec->stream_analog_playback = &alc262_pcm_analog_playback;
12256 spec->stream_analog_capture = &alc262_pcm_analog_capture;
ea1fb29a 12257
df694daa
KY
12258 spec->stream_digital_playback = &alc262_pcm_digital_playback;
12259 spec->stream_digital_capture = &alc262_pcm_digital_capture;
12260
f12ab1e0 12261 if (!spec->adc_nids && spec->input_mux) {
8c927b4a
TI
12262 int i;
12263 /* check whether the digital-mic has to be supported */
12264 for (i = 0; i < spec->input_mux->num_items; i++) {
12265 if (spec->input_mux->items[i].index >= 9)
12266 break;
12267 }
12268 if (i < spec->input_mux->num_items) {
12269 /* use only ADC0 */
12270 spec->adc_nids = alc262_dmic_adc_nids;
12271 spec->num_adc_nids = 1;
12272 spec->capsrc_nids = alc262_dmic_capsrc_nids;
df694daa 12273 } else {
8c927b4a
TI
12274 /* all analog inputs */
12275 /* check whether NID 0x07 is valid */
12276 unsigned int wcap = get_wcaps(codec, 0x07);
12277
12278 /* get type */
a22d543a 12279 wcap = get_wcaps_type(wcap);
8c927b4a
TI
12280 if (wcap != AC_WID_AUD_IN) {
12281 spec->adc_nids = alc262_adc_nids_alt;
12282 spec->num_adc_nids =
12283 ARRAY_SIZE(alc262_adc_nids_alt);
12284 spec->capsrc_nids = alc262_capsrc_nids_alt;
12285 } else {
12286 spec->adc_nids = alc262_adc_nids;
12287 spec->num_adc_nids =
12288 ARRAY_SIZE(alc262_adc_nids);
12289 spec->capsrc_nids = alc262_capsrc_nids;
12290 }
df694daa
KY
12291 }
12292 }
e64f14f4 12293 if (!spec->cap_mixer && !spec->no_analog)
b59bdf3b 12294 set_capture_mixer(codec);
07eba61d
TI
12295 if (!spec->no_analog)
12296 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
df694daa 12297
2134ea4f
TI
12298 spec->vmaster_nid = 0x0c;
12299
df694daa
KY
12300 codec->patch_ops = alc_patch_ops;
12301 if (board_config == ALC262_AUTO)
ae6b813a 12302 spec->init_hook = alc262_auto_init;
cb53c626
TI
12303#ifdef CONFIG_SND_HDA_POWER_SAVE
12304 if (!spec->loopback.amplist)
12305 spec->loopback.amplist = alc262_loopbacks;
12306#endif
ea1fb29a 12307
df694daa
KY
12308 return 0;
12309}
12310
a361d84b
KY
12311/*
12312 * ALC268 channel source setting (2 channel)
12313 */
12314#define ALC268_DIGOUT_NID ALC880_DIGOUT_NID
12315#define alc268_modes alc260_modes
ea1fb29a 12316
a361d84b
KY
12317static hda_nid_t alc268_dac_nids[2] = {
12318 /* front, hp */
12319 0x02, 0x03
12320};
12321
12322static hda_nid_t alc268_adc_nids[2] = {
12323 /* ADC0-1 */
12324 0x08, 0x07
12325};
12326
12327static hda_nid_t alc268_adc_nids_alt[1] = {
12328 /* ADC0 */
12329 0x08
12330};
12331
e1406348
TI
12332static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
12333
a361d84b
KY
12334static struct snd_kcontrol_new alc268_base_mixer[] = {
12335 /* output mixer control */
12336 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12337 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12338 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12339 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
33bf17ab
TI
12340 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12341 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12342 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
a361d84b
KY
12343 { }
12344};
12345
42171c17
TI
12346static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
12347 /* output mixer control */
12348 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12349 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12350 ALC262_HIPPO_MASTER_SWITCH,
12351 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12352 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12353 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12354 { }
12355};
12356
aef9d318
TI
12357/* bind Beep switches of both NID 0x0f and 0x10 */
12358static struct hda_bind_ctls alc268_bind_beep_sw = {
12359 .ops = &snd_hda_bind_sw,
12360 .values = {
12361 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
12362 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
12363 0
12364 },
12365};
12366
12367static struct snd_kcontrol_new alc268_beep_mixer[] = {
12368 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
12369 HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
12370 { }
12371};
12372
d1a991a6
KY
12373static struct hda_verb alc268_eapd_verbs[] = {
12374 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
12375 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
12376 { }
12377};
12378
d273809e 12379/* Toshiba specific */
d273809e
TI
12380static struct hda_verb alc268_toshiba_verbs[] = {
12381 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12382 { } /* end */
12383};
12384
12385/* Acer specific */
889c4395 12386/* bind volumes of both NID 0x02 and 0x03 */
6bc96857
TI
12387static struct hda_bind_ctls alc268_acer_bind_master_vol = {
12388 .ops = &snd_hda_bind_vol,
12389 .values = {
12390 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
12391 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
12392 0
12393 },
12394};
12395
889c4395
TI
12396/* mute/unmute internal speaker according to the hp jack and mute state */
12397static void alc268_acer_automute(struct hda_codec *codec, int force)
12398{
12399 struct alc_spec *spec = codec->spec;
12400 unsigned int mute;
12401
12402 if (force || !spec->sense_updated) {
864f92be 12403 spec->jack_present = snd_hda_jack_detect(codec, 0x14);
889c4395
TI
12404 spec->sense_updated = 1;
12405 }
12406 if (spec->jack_present)
12407 mute = HDA_AMP_MUTE; /* mute internal speaker */
12408 else /* unmute internal speaker if necessary */
12409 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
12410 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
12411 HDA_AMP_MUTE, mute);
12412}
12413
12414
12415/* bind hp and internal speaker mute (with plug check) */
12416static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
12417 struct snd_ctl_elem_value *ucontrol)
12418{
12419 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
12420 long *valp = ucontrol->value.integer.value;
12421 int change;
12422
8de56b7d 12423 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
889c4395
TI
12424 if (change)
12425 alc268_acer_automute(codec, 0);
12426 return change;
12427}
d273809e 12428
8ef355da
KY
12429static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
12430 /* output mixer control */
12431 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12432 {
12433 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12434 .name = "Master Playback Switch",
5e26dfd0 12435 .subdevice = HDA_SUBDEV_AMP_FLAG,
8ef355da
KY
12436 .info = snd_hda_mixer_amp_switch_info,
12437 .get = snd_hda_mixer_amp_switch_get,
12438 .put = alc268_acer_master_sw_put,
12439 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12440 },
12441 HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
12442 { }
12443};
12444
d273809e
TI
12445static struct snd_kcontrol_new alc268_acer_mixer[] = {
12446 /* output mixer control */
12447 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12448 {
12449 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12450 .name = "Master Playback Switch",
5e26dfd0 12451 .subdevice = HDA_SUBDEV_AMP_FLAG,
d273809e
TI
12452 .info = snd_hda_mixer_amp_switch_info,
12453 .get = snd_hda_mixer_amp_switch_get,
12454 .put = alc268_acer_master_sw_put,
12455 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12456 },
33bf17ab
TI
12457 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12458 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12459 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
d273809e
TI
12460 { }
12461};
12462
c238b4f4
TI
12463static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
12464 /* output mixer control */
12465 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12466 {
12467 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12468 .name = "Master Playback Switch",
5e26dfd0 12469 .subdevice = HDA_SUBDEV_AMP_FLAG,
c238b4f4
TI
12470 .info = snd_hda_mixer_amp_switch_info,
12471 .get = snd_hda_mixer_amp_switch_get,
12472 .put = alc268_acer_master_sw_put,
12473 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12474 },
12475 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12476 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12477 { }
12478};
12479
8ef355da
KY
12480static struct hda_verb alc268_acer_aspire_one_verbs[] = {
12481 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12482 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12483 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12484 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12485 {0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
12486 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
12487 { }
12488};
12489
d273809e 12490static struct hda_verb alc268_acer_verbs[] = {
0ccb541c
TI
12491 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
12492 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
d273809e
TI
12493 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12494 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
0ccb541c
TI
12495 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12496 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
d273809e
TI
12497 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12498 { }
12499};
12500
12501/* unsolicited event for HP jack sensing */
42171c17 12502#define alc268_toshiba_unsol_event alc262_hippo_unsol_event
4f5d1706
TI
12503#define alc268_toshiba_setup alc262_hippo_setup
12504#define alc268_toshiba_automute alc262_hippo_automute
d273809e
TI
12505
12506static void alc268_acer_unsol_event(struct hda_codec *codec,
12507 unsigned int res)
12508{
889c4395 12509 if ((res >> 26) != ALC880_HP_EVENT)
d273809e
TI
12510 return;
12511 alc268_acer_automute(codec, 1);
12512}
12513
889c4395
TI
12514static void alc268_acer_init_hook(struct hda_codec *codec)
12515{
12516 alc268_acer_automute(codec, 1);
12517}
12518
8ef355da
KY
12519/* toggle speaker-output according to the hp-jack state */
12520static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
12521{
12522 unsigned int present;
12523 unsigned char bits;
12524
864f92be 12525 present = snd_hda_jack_detect(codec, 0x15);
5dbd5ec6 12526 bits = present ? HDA_AMP_MUTE : 0;
8ef355da 12527 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
5dbd5ec6 12528 HDA_AMP_MUTE, bits);
8ef355da 12529 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
5dbd5ec6 12530 HDA_AMP_MUTE, bits);
8ef355da
KY
12531}
12532
8ef355da
KY
12533static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
12534 unsigned int res)
12535{
4f5d1706
TI
12536 switch (res >> 26) {
12537 case ALC880_HP_EVENT:
8ef355da 12538 alc268_aspire_one_speaker_automute(codec);
4f5d1706
TI
12539 break;
12540 case ALC880_MIC_EVENT:
12541 alc_mic_automute(codec);
12542 break;
12543 }
12544}
12545
12546static void alc268_acer_lc_setup(struct hda_codec *codec)
12547{
12548 struct alc_spec *spec = codec->spec;
12549 spec->ext_mic.pin = 0x18;
12550 spec->ext_mic.mux_idx = 0;
12551 spec->int_mic.pin = 0x12;
12552 spec->int_mic.mux_idx = 6;
12553 spec->auto_mic = 1;
8ef355da
KY
12554}
12555
12556static void alc268_acer_lc_init_hook(struct hda_codec *codec)
12557{
12558 alc268_aspire_one_speaker_automute(codec);
4f5d1706 12559 alc_mic_automute(codec);
8ef355da
KY
12560}
12561
3866f0b0
TI
12562static struct snd_kcontrol_new alc268_dell_mixer[] = {
12563 /* output mixer control */
12564 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12565 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12566 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12567 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12568 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12569 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12570 { }
12571};
12572
12573static struct hda_verb alc268_dell_verbs[] = {
12574 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12575 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12576 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
4f5d1706 12577 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
3866f0b0
TI
12578 { }
12579};
12580
12581/* mute/unmute internal speaker according to the hp jack and mute state */
4f5d1706 12582static void alc268_dell_setup(struct hda_codec *codec)
3866f0b0 12583{
a9fd4f3f 12584 struct alc_spec *spec = codec->spec;
3866f0b0 12585
a9fd4f3f
TI
12586 spec->autocfg.hp_pins[0] = 0x15;
12587 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
12588 spec->ext_mic.pin = 0x18;
12589 spec->ext_mic.mux_idx = 0;
12590 spec->int_mic.pin = 0x19;
12591 spec->int_mic.mux_idx = 1;
12592 spec->auto_mic = 1;
3866f0b0
TI
12593}
12594
eb5a6621
HRK
12595static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
12596 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12597 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12598 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12599 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12600 HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12601 HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
12602 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
12603 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
12604 { }
12605};
12606
12607static struct hda_verb alc267_quanta_il1_verbs[] = {
12608 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12609 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12610 { }
12611};
12612
4f5d1706 12613static void alc267_quanta_il1_setup(struct hda_codec *codec)
eb5a6621 12614{
a9fd4f3f 12615 struct alc_spec *spec = codec->spec;
a9fd4f3f
TI
12616 spec->autocfg.hp_pins[0] = 0x15;
12617 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
12618 spec->ext_mic.pin = 0x18;
12619 spec->ext_mic.mux_idx = 0;
12620 spec->int_mic.pin = 0x19;
12621 spec->int_mic.mux_idx = 1;
12622 spec->auto_mic = 1;
eb5a6621
HRK
12623}
12624
a361d84b
KY
12625/*
12626 * generic initialization of ADC, input mixers and output mixers
12627 */
12628static struct hda_verb alc268_base_init_verbs[] = {
12629 /* Unmute DAC0-1 and set vol = 0 */
12630 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
a361d84b 12631 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
a361d84b
KY
12632
12633 /*
12634 * Set up output mixers (0x0c - 0x0e)
12635 */
12636 /* set vol=0 to output mixers */
12637 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
a361d84b
KY
12638 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
12639
12640 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12641 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12642
12643 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12644 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
12645 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12646 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12647 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12648 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12649 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12650 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12651
12652 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12653 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12654 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12655 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
a361d84b 12656 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
aef9d318
TI
12657
12658 /* set PCBEEP vol = 0, mute connections */
12659 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12660 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12661 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
a361d84b 12662
a9b3aa8a 12663 /* Unmute Selector 23h,24h and set the default input to mic-in */
ea1fb29a 12664
a9b3aa8a
JZ
12665 {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
12666 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12667 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
12668 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
a361d84b 12669
a361d84b
KY
12670 { }
12671};
12672
12673/*
12674 * generic initialization of ADC, input mixers and output mixers
12675 */
12676static struct hda_verb alc268_volume_init_verbs[] = {
12677 /* set output DAC */
4cfb91c6
TI
12678 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12679 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
a361d84b
KY
12680
12681 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12682 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12683 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12684 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12685 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12686
a361d84b 12687 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
a361d84b
KY
12688 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12689 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12690
12691 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
a361d84b 12692 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
a361d84b 12693
aef9d318
TI
12694 /* set PCBEEP vol = 0, mute connections */
12695 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12696 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12697 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
a361d84b
KY
12698
12699 { }
12700};
12701
fdbc6626
TI
12702static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
12703 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12704 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12705 { } /* end */
12706};
12707
a361d84b
KY
12708static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
12709 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12710 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
fdbc6626 12711 _DEFINE_CAPSRC(1),
a361d84b
KY
12712 { } /* end */
12713};
12714
12715static struct snd_kcontrol_new alc268_capture_mixer[] = {
12716 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12717 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12718 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
12719 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
fdbc6626 12720 _DEFINE_CAPSRC(2),
a361d84b
KY
12721 { } /* end */
12722};
12723
12724static struct hda_input_mux alc268_capture_source = {
12725 .num_items = 4,
12726 .items = {
12727 { "Mic", 0x0 },
12728 { "Front Mic", 0x1 },
12729 { "Line", 0x2 },
12730 { "CD", 0x3 },
12731 },
12732};
12733
0ccb541c 12734static struct hda_input_mux alc268_acer_capture_source = {
c238b4f4
TI
12735 .num_items = 3,
12736 .items = {
12737 { "Mic", 0x0 },
12738 { "Internal Mic", 0x1 },
12739 { "Line", 0x2 },
12740 },
12741};
12742
12743static struct hda_input_mux alc268_acer_dmic_capture_source = {
0ccb541c
TI
12744 .num_items = 3,
12745 .items = {
12746 { "Mic", 0x0 },
12747 { "Internal Mic", 0x6 },
12748 { "Line", 0x2 },
12749 },
12750};
12751
86c53bd2
JW
12752#ifdef CONFIG_SND_DEBUG
12753static struct snd_kcontrol_new alc268_test_mixer[] = {
86c53bd2
JW
12754 /* Volume widgets */
12755 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12756 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12757 HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
12758 HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
12759 HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
12760 HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
12761 HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
12762 HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
12763 HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
12764 HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
12765 HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
12766 HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
12767 HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
f0747ee6
TI
12768 /* The below appears problematic on some hardwares */
12769 /*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
86c53bd2
JW
12770 HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12771 HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
12772 HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
12773 HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
12774
12775 /* Modes for retasking pin widgets */
12776 ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
12777 ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
12778 ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
12779 ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
12780
12781 /* Controls for GPIO pins, assuming they are configured as outputs */
12782 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
12783 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
12784 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
12785 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
12786
12787 /* Switches to allow the digital SPDIF output pin to be enabled.
12788 * The ALC268 does not have an SPDIF input.
12789 */
12790 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
12791
12792 /* A switch allowing EAPD to be enabled. Some laptops seem to use
12793 * this output to turn on an external amplifier.
12794 */
12795 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
12796 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
12797
12798 { } /* end */
12799};
12800#endif
12801
a361d84b
KY
12802/* create input playback/capture controls for the given pin */
12803static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
12804 const char *ctlname, int idx)
12805{
3f3b7c1a 12806 hda_nid_t dac;
a361d84b
KY
12807 int err;
12808
3f3b7c1a
TI
12809 switch (nid) {
12810 case 0x14:
12811 case 0x16:
12812 dac = 0x02;
12813 break;
12814 case 0x15:
12815 dac = 0x03;
12816 break;
12817 default:
12818 return 0;
12819 }
12820 if (spec->multiout.dac_nids[0] != dac &&
12821 spec->multiout.dac_nids[1] != dac) {
0afe5f89 12822 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
3f3b7c1a 12823 HDA_COMPOSE_AMP_VAL(dac, 3, idx,
a361d84b
KY
12824 HDA_OUTPUT));
12825 if (err < 0)
12826 return err;
3f3b7c1a
TI
12827 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
12828 }
12829
3f3b7c1a 12830 if (nid != 0x16)
0afe5f89 12831 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
a361d84b 12832 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
3f3b7c1a 12833 else /* mono */
0afe5f89 12834 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
3f3b7c1a 12835 HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
a361d84b
KY
12836 if (err < 0)
12837 return err;
12838 return 0;
12839}
12840
12841/* add playback controls from the parsed DAC table */
12842static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
12843 const struct auto_pin_cfg *cfg)
12844{
12845 hda_nid_t nid;
12846 int err;
12847
a361d84b 12848 spec->multiout.dac_nids = spec->private_dac_nids;
a361d84b
KY
12849
12850 nid = cfg->line_out_pins[0];
3f3b7c1a
TI
12851 if (nid) {
12852 const char *name;
12853 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
12854 name = "Speaker";
12855 else
12856 name = "Front";
12857 err = alc268_new_analog_output(spec, nid, name, 0);
12858 if (err < 0)
12859 return err;
12860 }
a361d84b
KY
12861
12862 nid = cfg->speaker_pins[0];
12863 if (nid == 0x1d) {
0afe5f89 12864 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
a361d84b
KY
12865 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
12866 if (err < 0)
12867 return err;
3f3b7c1a
TI
12868 } else {
12869 err = alc268_new_analog_output(spec, nid, "Speaker", 0);
12870 if (err < 0)
12871 return err;
a361d84b
KY
12872 }
12873 nid = cfg->hp_pins[0];
3f3b7c1a
TI
12874 if (nid) {
12875 err = alc268_new_analog_output(spec, nid, "Headphone", 0);
12876 if (err < 0)
12877 return err;
12878 }
a361d84b
KY
12879
12880 nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
12881 if (nid == 0x16) {
0afe5f89 12882 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
3f3b7c1a 12883 HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
a361d84b
KY
12884 if (err < 0)
12885 return err;
12886 }
ea1fb29a 12887 return 0;
a361d84b
KY
12888}
12889
12890/* create playback/capture controls for input pins */
05f5f477 12891static int alc268_auto_create_input_ctls(struct hda_codec *codec,
a361d84b
KY
12892 const struct auto_pin_cfg *cfg)
12893{
05f5f477 12894 return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
a361d84b
KY
12895}
12896
e9af4f36
TI
12897static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
12898 hda_nid_t nid, int pin_type)
12899{
12900 int idx;
12901
12902 alc_set_pin_output(codec, nid, pin_type);
12903 if (nid == 0x14 || nid == 0x16)
12904 idx = 0;
12905 else
12906 idx = 1;
12907 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
12908}
12909
12910static void alc268_auto_init_multi_out(struct hda_codec *codec)
12911{
12912 struct alc_spec *spec = codec->spec;
12913 hda_nid_t nid = spec->autocfg.line_out_pins[0];
12914 if (nid) {
12915 int pin_type = get_pin_type(spec->autocfg.line_out_type);
12916 alc268_auto_set_output_and_unmute(codec, nid, pin_type);
12917 }
12918}
12919
12920static void alc268_auto_init_hp_out(struct hda_codec *codec)
12921{
12922 struct alc_spec *spec = codec->spec;
12923 hda_nid_t pin;
12924
12925 pin = spec->autocfg.hp_pins[0];
12926 if (pin)
12927 alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
12928 pin = spec->autocfg.speaker_pins[0];
12929 if (pin)
12930 alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
12931}
12932
a361d84b
KY
12933static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
12934{
12935 struct alc_spec *spec = codec->spec;
12936 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
12937 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
12938 hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
12939 unsigned int dac_vol1, dac_vol2;
12940
e9af4f36 12941 if (line_nid == 0x1d || speaker_nid == 0x1d) {
a361d84b
KY
12942 snd_hda_codec_write(codec, speaker_nid, 0,
12943 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
e9af4f36 12944 /* mute mixer inputs from 0x1d */
a361d84b
KY
12945 snd_hda_codec_write(codec, 0x0f, 0,
12946 AC_VERB_SET_AMP_GAIN_MUTE,
12947 AMP_IN_UNMUTE(1));
12948 snd_hda_codec_write(codec, 0x10, 0,
12949 AC_VERB_SET_AMP_GAIN_MUTE,
12950 AMP_IN_UNMUTE(1));
12951 } else {
e9af4f36 12952 /* unmute mixer inputs from 0x1d */
a361d84b
KY
12953 snd_hda_codec_write(codec, 0x0f, 0,
12954 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12955 snd_hda_codec_write(codec, 0x10, 0,
12956 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12957 }
12958
12959 dac_vol1 = dac_vol2 = 0xb000 | 0x40; /* set max volume */
ea1fb29a 12960 if (line_nid == 0x14)
a361d84b
KY
12961 dac_vol2 = AMP_OUT_ZERO;
12962 else if (line_nid == 0x15)
12963 dac_vol1 = AMP_OUT_ZERO;
ea1fb29a 12964 if (hp_nid == 0x14)
a361d84b
KY
12965 dac_vol2 = AMP_OUT_ZERO;
12966 else if (hp_nid == 0x15)
12967 dac_vol1 = AMP_OUT_ZERO;
12968 if (line_nid != 0x16 || hp_nid != 0x16 ||
12969 spec->autocfg.line_out_pins[1] != 0x16 ||
12970 spec->autocfg.line_out_pins[2] != 0x16)
12971 dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
12972
12973 snd_hda_codec_write(codec, 0x02, 0,
12974 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
12975 snd_hda_codec_write(codec, 0x03, 0,
12976 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
12977}
12978
def319f9 12979/* pcm configuration: identical with ALC880 */
a361d84b
KY
12980#define alc268_pcm_analog_playback alc880_pcm_analog_playback
12981#define alc268_pcm_analog_capture alc880_pcm_analog_capture
6330079f 12982#define alc268_pcm_analog_alt_capture alc880_pcm_analog_alt_capture
a361d84b
KY
12983#define alc268_pcm_digital_playback alc880_pcm_digital_playback
12984
12985/*
12986 * BIOS auto configuration
12987 */
12988static int alc268_parse_auto_config(struct hda_codec *codec)
12989{
12990 struct alc_spec *spec = codec->spec;
12991 int err;
12992 static hda_nid_t alc268_ignore[] = { 0 };
12993
12994 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12995 alc268_ignore);
12996 if (err < 0)
12997 return err;
7e0e44d4
TI
12998 if (!spec->autocfg.line_outs) {
12999 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
13000 spec->multiout.max_channels = 2;
13001 spec->no_analog = 1;
13002 goto dig_only;
13003 }
a361d84b 13004 return 0; /* can't find valid BIOS pin config */
7e0e44d4 13005 }
a361d84b
KY
13006 err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
13007 if (err < 0)
13008 return err;
05f5f477 13009 err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
a361d84b
KY
13010 if (err < 0)
13011 return err;
13012
13013 spec->multiout.max_channels = 2;
13014
7e0e44d4 13015 dig_only:
a361d84b 13016 /* digital only support output */
7e0e44d4 13017 if (spec->autocfg.dig_outs) {
a361d84b 13018 spec->multiout.dig_out_nid = ALC268_DIGOUT_NID;
7e0e44d4
TI
13019 spec->dig_out_type = spec->autocfg.dig_out_type[0];
13020 }
603c4019 13021 if (spec->kctls.list)
d88897ea 13022 add_mixer(spec, spec->kctls.list);
a361d84b 13023
892981ff 13024 if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
d88897ea 13025 add_mixer(spec, alc268_beep_mixer);
aef9d318 13026
d88897ea 13027 add_verb(spec, alc268_volume_init_verbs);
5908589f 13028 spec->num_mux_defs = 2;
61b9b9b1 13029 spec->input_mux = &spec->private_imux[0];
a361d84b 13030
776e184e
TI
13031 err = alc_auto_add_mic_boost(codec);
13032 if (err < 0)
13033 return err;
13034
6227cdce 13035 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
1d955ebd 13036
a361d84b
KY
13037 return 1;
13038}
13039
a361d84b
KY
13040#define alc268_auto_init_analog_input alc882_auto_init_analog_input
13041
13042/* init callback for auto-configuration model -- overriding the default init */
13043static void alc268_auto_init(struct hda_codec *codec)
13044{
f6c7e546 13045 struct alc_spec *spec = codec->spec;
a361d84b
KY
13046 alc268_auto_init_multi_out(codec);
13047 alc268_auto_init_hp_out(codec);
13048 alc268_auto_init_mono_speaker_out(codec);
13049 alc268_auto_init_analog_input(codec);
f6c7e546 13050 if (spec->unsol_event)
7fb0d78f 13051 alc_inithook(codec);
a361d84b
KY
13052}
13053
13054/*
13055 * configuration and preset
13056 */
13057static const char *alc268_models[ALC268_MODEL_LAST] = {
eb5a6621 13058 [ALC267_QUANTA_IL1] = "quanta-il1",
a361d84b 13059 [ALC268_3ST] = "3stack",
983f8ae4 13060 [ALC268_TOSHIBA] = "toshiba",
d273809e 13061 [ALC268_ACER] = "acer",
c238b4f4 13062 [ALC268_ACER_DMIC] = "acer-dmic",
8ef355da 13063 [ALC268_ACER_ASPIRE_ONE] = "acer-aspire",
3866f0b0 13064 [ALC268_DELL] = "dell",
f12462c5 13065 [ALC268_ZEPTO] = "zepto",
86c53bd2
JW
13066#ifdef CONFIG_SND_DEBUG
13067 [ALC268_TEST] = "test",
13068#endif
a361d84b
KY
13069 [ALC268_AUTO] = "auto",
13070};
13071
13072static struct snd_pci_quirk alc268_cfg_tbl[] = {
a0b8f7d8 13073 SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
ac3e3741 13074 SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
dafc8357 13075 SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
ac3e3741 13076 SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
29a52c24 13077 SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
8ef355da
KY
13078 SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
13079 ALC268_ACER_ASPIRE_ONE),
3866f0b0 13080 SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
a1bf8088
DC
13081 SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
13082 "Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
33d78674
TI
13083 /* almost compatible with toshiba but with optional digital outs;
13084 * auto-probing seems working fine
13085 */
8871e5b9 13086 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
33d78674 13087 ALC268_AUTO),
a361d84b 13088 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
8871e5b9 13089 SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
378bd6a5 13090 SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
b875bf3a 13091 SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
eb5a6621 13092 SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
8871e5b9 13093 SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL),
a361d84b
KY
13094 {}
13095};
13096
3abf2f36
TI
13097/* Toshiba laptops have no unique PCI SSID but only codec SSID */
13098static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
13099 SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
13100 SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
13101 SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
13102 ALC268_TOSHIBA),
13103 {}
13104};
13105
a361d84b 13106static struct alc_config_preset alc268_presets[] = {
eb5a6621 13107 [ALC267_QUANTA_IL1] = {
fdbc6626
TI
13108 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
13109 alc268_capture_nosrc_mixer },
eb5a6621
HRK
13110 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13111 alc267_quanta_il1_verbs },
13112 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13113 .dac_nids = alc268_dac_nids,
13114 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13115 .adc_nids = alc268_adc_nids_alt,
13116 .hp_nid = 0x03,
13117 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13118 .channel_mode = alc268_modes,
4f5d1706
TI
13119 .unsol_event = alc_sku_unsol_event,
13120 .setup = alc267_quanta_il1_setup,
13121 .init_hook = alc_inithook,
eb5a6621 13122 },
a361d84b 13123 [ALC268_3ST] = {
aef9d318
TI
13124 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13125 alc268_beep_mixer },
a361d84b
KY
13126 .init_verbs = { alc268_base_init_verbs },
13127 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13128 .dac_nids = alc268_dac_nids,
13129 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13130 .adc_nids = alc268_adc_nids_alt,
e1406348 13131 .capsrc_nids = alc268_capsrc_nids,
a361d84b
KY
13132 .hp_nid = 0x03,
13133 .dig_out_nid = ALC268_DIGOUT_NID,
13134 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13135 .channel_mode = alc268_modes,
13136 .input_mux = &alc268_capture_source,
13137 },
d1a991a6 13138 [ALC268_TOSHIBA] = {
42171c17 13139 .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
aef9d318 13140 alc268_beep_mixer },
d273809e
TI
13141 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13142 alc268_toshiba_verbs },
d1a991a6
KY
13143 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13144 .dac_nids = alc268_dac_nids,
13145 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13146 .adc_nids = alc268_adc_nids_alt,
e1406348 13147 .capsrc_nids = alc268_capsrc_nids,
d1a991a6
KY
13148 .hp_nid = 0x03,
13149 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13150 .channel_mode = alc268_modes,
13151 .input_mux = &alc268_capture_source,
d273809e 13152 .unsol_event = alc268_toshiba_unsol_event,
4f5d1706
TI
13153 .setup = alc268_toshiba_setup,
13154 .init_hook = alc268_toshiba_automute,
d273809e
TI
13155 },
13156 [ALC268_ACER] = {
432fd133 13157 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
aef9d318 13158 alc268_beep_mixer },
d273809e
TI
13159 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13160 alc268_acer_verbs },
13161 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13162 .dac_nids = alc268_dac_nids,
13163 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13164 .adc_nids = alc268_adc_nids_alt,
e1406348 13165 .capsrc_nids = alc268_capsrc_nids,
d273809e
TI
13166 .hp_nid = 0x02,
13167 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13168 .channel_mode = alc268_modes,
0ccb541c 13169 .input_mux = &alc268_acer_capture_source,
d273809e 13170 .unsol_event = alc268_acer_unsol_event,
889c4395 13171 .init_hook = alc268_acer_init_hook,
d1a991a6 13172 },
c238b4f4
TI
13173 [ALC268_ACER_DMIC] = {
13174 .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
13175 alc268_beep_mixer },
13176 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13177 alc268_acer_verbs },
13178 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13179 .dac_nids = alc268_dac_nids,
13180 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13181 .adc_nids = alc268_adc_nids_alt,
13182 .capsrc_nids = alc268_capsrc_nids,
13183 .hp_nid = 0x02,
13184 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13185 .channel_mode = alc268_modes,
13186 .input_mux = &alc268_acer_dmic_capture_source,
13187 .unsol_event = alc268_acer_unsol_event,
13188 .init_hook = alc268_acer_init_hook,
13189 },
8ef355da
KY
13190 [ALC268_ACER_ASPIRE_ONE] = {
13191 .mixers = { alc268_acer_aspire_one_mixer,
22971e3a 13192 alc268_beep_mixer,
fdbc6626 13193 alc268_capture_nosrc_mixer },
8ef355da
KY
13194 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13195 alc268_acer_aspire_one_verbs },
13196 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13197 .dac_nids = alc268_dac_nids,
13198 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13199 .adc_nids = alc268_adc_nids_alt,
13200 .capsrc_nids = alc268_capsrc_nids,
13201 .hp_nid = 0x03,
13202 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13203 .channel_mode = alc268_modes,
8ef355da 13204 .unsol_event = alc268_acer_lc_unsol_event,
4f5d1706 13205 .setup = alc268_acer_lc_setup,
8ef355da
KY
13206 .init_hook = alc268_acer_lc_init_hook,
13207 },
3866f0b0 13208 [ALC268_DELL] = {
fdbc6626
TI
13209 .mixers = { alc268_dell_mixer, alc268_beep_mixer,
13210 alc268_capture_nosrc_mixer },
3866f0b0
TI
13211 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13212 alc268_dell_verbs },
13213 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13214 .dac_nids = alc268_dac_nids,
fdbc6626
TI
13215 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13216 .adc_nids = alc268_adc_nids_alt,
13217 .capsrc_nids = alc268_capsrc_nids,
3866f0b0
TI
13218 .hp_nid = 0x02,
13219 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13220 .channel_mode = alc268_modes,
a9fd4f3f 13221 .unsol_event = alc_sku_unsol_event,
4f5d1706
TI
13222 .setup = alc268_dell_setup,
13223 .init_hook = alc_inithook,
3866f0b0 13224 },
f12462c5 13225 [ALC268_ZEPTO] = {
aef9d318
TI
13226 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13227 alc268_beep_mixer },
f12462c5
MT
13228 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13229 alc268_toshiba_verbs },
13230 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13231 .dac_nids = alc268_dac_nids,
13232 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13233 .adc_nids = alc268_adc_nids_alt,
e1406348 13234 .capsrc_nids = alc268_capsrc_nids,
f12462c5
MT
13235 .hp_nid = 0x03,
13236 .dig_out_nid = ALC268_DIGOUT_NID,
13237 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13238 .channel_mode = alc268_modes,
13239 .input_mux = &alc268_capture_source,
4f5d1706
TI
13240 .setup = alc268_toshiba_setup,
13241 .init_hook = alc268_toshiba_automute,
f12462c5 13242 },
86c53bd2
JW
13243#ifdef CONFIG_SND_DEBUG
13244 [ALC268_TEST] = {
13245 .mixers = { alc268_test_mixer, alc268_capture_mixer },
13246 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13247 alc268_volume_init_verbs },
13248 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13249 .dac_nids = alc268_dac_nids,
13250 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13251 .adc_nids = alc268_adc_nids_alt,
e1406348 13252 .capsrc_nids = alc268_capsrc_nids,
86c53bd2
JW
13253 .hp_nid = 0x03,
13254 .dig_out_nid = ALC268_DIGOUT_NID,
13255 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13256 .channel_mode = alc268_modes,
13257 .input_mux = &alc268_capture_source,
13258 },
13259#endif
a361d84b
KY
13260};
13261
13262static int patch_alc268(struct hda_codec *codec)
13263{
13264 struct alc_spec *spec;
13265 int board_config;
22971e3a 13266 int i, has_beep, err;
a361d84b 13267
ef86f581 13268 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
a361d84b
KY
13269 if (spec == NULL)
13270 return -ENOMEM;
13271
13272 codec->spec = spec;
13273
13274 board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
13275 alc268_models,
13276 alc268_cfg_tbl);
13277
3abf2f36
TI
13278 if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
13279 board_config = snd_hda_check_board_codec_sid_config(codec,
50ae0aa8 13280 ALC268_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
3abf2f36 13281
a361d84b 13282 if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
9a11f1aa
TI
13283 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13284 codec->chip_name);
a361d84b
KY
13285 board_config = ALC268_AUTO;
13286 }
13287
13288 if (board_config == ALC268_AUTO) {
13289 /* automatic parse from the BIOS config */
13290 err = alc268_parse_auto_config(codec);
13291 if (err < 0) {
13292 alc_free(codec);
13293 return err;
13294 } else if (!err) {
13295 printk(KERN_INFO
13296 "hda_codec: Cannot set up configuration "
13297 "from BIOS. Using base mode...\n");
13298 board_config = ALC268_3ST;
13299 }
13300 }
13301
13302 if (board_config != ALC268_AUTO)
e9c364c0 13303 setup_preset(codec, &alc268_presets[board_config]);
a361d84b 13304
a361d84b
KY
13305 spec->stream_analog_playback = &alc268_pcm_analog_playback;
13306 spec->stream_analog_capture = &alc268_pcm_analog_capture;
6330079f 13307 spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
a361d84b 13308
a361d84b
KY
13309 spec->stream_digital_playback = &alc268_pcm_digital_playback;
13310
22971e3a
TI
13311 has_beep = 0;
13312 for (i = 0; i < spec->num_mixers; i++) {
13313 if (spec->mixers[i] == alc268_beep_mixer) {
13314 has_beep = 1;
13315 break;
13316 }
13317 }
13318
13319 if (has_beep) {
13320 err = snd_hda_attach_beep_device(codec, 0x1);
13321 if (err < 0) {
13322 alc_free(codec);
13323 return err;
13324 }
13325 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
13326 /* override the amp caps for beep generator */
13327 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
aef9d318
TI
13328 (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
13329 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
13330 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
13331 (0 << AC_AMPCAP_MUTE_SHIFT));
22971e3a 13332 }
aef9d318 13333
7e0e44d4 13334 if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
3866f0b0
TI
13335 /* check whether NID 0x07 is valid */
13336 unsigned int wcap = get_wcaps(codec, 0x07);
85860c06 13337 int i;
3866f0b0 13338
defb5ab2 13339 spec->capsrc_nids = alc268_capsrc_nids;
3866f0b0 13340 /* get type */
a22d543a 13341 wcap = get_wcaps_type(wcap);
fdbc6626
TI
13342 if (spec->auto_mic ||
13343 wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
3866f0b0
TI
13344 spec->adc_nids = alc268_adc_nids_alt;
13345 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
defb5ab2
TI
13346 if (spec->auto_mic)
13347 fixup_automic_adc(codec);
fdbc6626
TI
13348 if (spec->auto_mic || spec->input_mux->num_items == 1)
13349 add_mixer(spec, alc268_capture_nosrc_mixer);
13350 else
13351 add_mixer(spec, alc268_capture_alt_mixer);
3866f0b0
TI
13352 } else {
13353 spec->adc_nids = alc268_adc_nids;
13354 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
d88897ea 13355 add_mixer(spec, alc268_capture_mixer);
a361d84b 13356 }
85860c06
TI
13357 /* set default input source */
13358 for (i = 0; i < spec->num_adc_nids; i++)
13359 snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
13360 0, AC_VERB_SET_CONNECT_SEL,
5908589f
HRK
13361 i < spec->num_mux_defs ?
13362 spec->input_mux[i].items[0].index :
85860c06 13363 spec->input_mux->items[0].index);
a361d84b 13364 }
2134ea4f
TI
13365
13366 spec->vmaster_nid = 0x02;
13367
a361d84b
KY
13368 codec->patch_ops = alc_patch_ops;
13369 if (board_config == ALC268_AUTO)
13370 spec->init_hook = alc268_auto_init;
ea1fb29a 13371
a361d84b
KY
13372 return 0;
13373}
13374
f6a92248
KY
13375/*
13376 * ALC269 channel source setting (2 channel)
13377 */
13378#define ALC269_DIGOUT_NID ALC880_DIGOUT_NID
13379
13380#define alc269_dac_nids alc260_dac_nids
13381
13382static hda_nid_t alc269_adc_nids[1] = {
13383 /* ADC1 */
f53281e6
KY
13384 0x08,
13385};
13386
e01bf509
TI
13387static hda_nid_t alc269_capsrc_nids[1] = {
13388 0x23,
13389};
13390
84898e87
KY
13391static hda_nid_t alc269vb_adc_nids[1] = {
13392 /* ADC1 */
13393 0x09,
13394};
13395
13396static hda_nid_t alc269vb_capsrc_nids[1] = {
13397 0x22,
13398};
13399
6694635d
TI
13400static hda_nid_t alc269_adc_candidates[] = {
13401 0x08, 0x09, 0x07,
13402};
e01bf509 13403
f6a92248
KY
13404#define alc269_modes alc260_modes
13405#define alc269_capture_source alc880_lg_lw_capture_source
13406
13407static struct snd_kcontrol_new alc269_base_mixer[] = {
13408 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13409 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13410 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
13411 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
13412 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13413 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13414 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13415 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13416 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13417 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
13418 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13419 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
13420 { } /* end */
13421};
13422
60db6b53
KY
13423static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
13424 /* output mixer control */
13425 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13426 {
13427 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13428 .name = "Master Playback Switch",
5e26dfd0 13429 .subdevice = HDA_SUBDEV_AMP_FLAG,
60db6b53
KY
13430 .info = snd_hda_mixer_amp_switch_info,
13431 .get = snd_hda_mixer_amp_switch_get,
13432 .put = alc268_acer_master_sw_put,
13433 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13434 },
13435 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13436 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13437 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13438 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13439 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13440 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
60db6b53
KY
13441 { }
13442};
13443
64154835
TV
13444static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
13445 /* output mixer control */
13446 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13447 {
13448 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13449 .name = "Master Playback Switch",
5e26dfd0 13450 .subdevice = HDA_SUBDEV_AMP_FLAG,
64154835
TV
13451 .info = snd_hda_mixer_amp_switch_info,
13452 .get = snd_hda_mixer_amp_switch_get,
13453 .put = alc268_acer_master_sw_put,
13454 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13455 },
13456 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13457 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13458 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13459 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13460 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13461 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13462 HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
13463 HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
13464 HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
64154835
TV
13465 { }
13466};
13467
84898e87 13468static struct snd_kcontrol_new alc269_laptop_mixer[] = {
aa202455 13469 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
508f7110 13470 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
aa202455 13471 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
508f7110 13472 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
f53281e6
KY
13473 { } /* end */
13474};
13475
84898e87
KY
13476static struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
13477 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13478 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13479 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
13480 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13481 { } /* end */
13482};
13483
f53281e6 13484/* capture mixer elements */
84898e87
KY
13485static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
13486 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13487 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13488 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13489 HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13490 { } /* end */
13491};
13492
13493static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
f53281e6
KY
13494 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13495 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
26f5df26
TI
13496 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13497 { } /* end */
13498};
13499
84898e87
KY
13500static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
13501 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13502 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13503 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13504 HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13505 { } /* end */
13506};
13507
13508static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
13509 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13510 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13511 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13512 { } /* end */
13513};
13514
26f5df26 13515/* FSC amilo */
84898e87 13516#define alc269_fujitsu_mixer alc269_laptop_mixer
f53281e6 13517
60db6b53
KY
13518static struct hda_verb alc269_quanta_fl1_verbs[] = {
13519 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13520 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13521 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13522 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13523 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13524 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13525 { }
13526};
f6a92248 13527
64154835
TV
13528static struct hda_verb alc269_lifebook_verbs[] = {
13529 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13530 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
13531 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13532 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13533 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13534 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13535 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13536 {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13537 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13538 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13539 { }
13540};
13541
60db6b53
KY
13542/* toggle speaker-output according to the hp-jack state */
13543static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
13544{
13545 unsigned int present;
13546 unsigned char bits;
f6a92248 13547
864f92be 13548 present = snd_hda_jack_detect(codec, 0x15);
5dbd5ec6 13549 bits = present ? HDA_AMP_MUTE : 0;
60db6b53 13550 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 13551 HDA_AMP_MUTE, bits);
60db6b53 13552 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 13553 HDA_AMP_MUTE, bits);
f6a92248 13554
60db6b53
KY
13555 snd_hda_codec_write(codec, 0x20, 0,
13556 AC_VERB_SET_COEF_INDEX, 0x0c);
13557 snd_hda_codec_write(codec, 0x20, 0,
13558 AC_VERB_SET_PROC_COEF, 0x680);
f6a92248 13559
60db6b53
KY
13560 snd_hda_codec_write(codec, 0x20, 0,
13561 AC_VERB_SET_COEF_INDEX, 0x0c);
13562 snd_hda_codec_write(codec, 0x20, 0,
13563 AC_VERB_SET_PROC_COEF, 0x480);
13564}
f6a92248 13565
64154835
TV
13566/* toggle speaker-output according to the hp-jacks state */
13567static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
13568{
13569 unsigned int present;
13570 unsigned char bits;
13571
13572 /* Check laptop headphone socket */
864f92be 13573 present = snd_hda_jack_detect(codec, 0x15);
64154835
TV
13574
13575 /* Check port replicator headphone socket */
864f92be 13576 present |= snd_hda_jack_detect(codec, 0x1a);
64154835 13577
5dbd5ec6 13578 bits = present ? HDA_AMP_MUTE : 0;
64154835 13579 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 13580 HDA_AMP_MUTE, bits);
64154835 13581 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 13582 HDA_AMP_MUTE, bits);
64154835
TV
13583
13584 snd_hda_codec_write(codec, 0x20, 0,
13585 AC_VERB_SET_COEF_INDEX, 0x0c);
13586 snd_hda_codec_write(codec, 0x20, 0,
13587 AC_VERB_SET_PROC_COEF, 0x680);
13588
13589 snd_hda_codec_write(codec, 0x20, 0,
13590 AC_VERB_SET_COEF_INDEX, 0x0c);
13591 snd_hda_codec_write(codec, 0x20, 0,
13592 AC_VERB_SET_PROC_COEF, 0x480);
13593}
13594
64154835
TV
13595static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
13596{
13597 unsigned int present_laptop;
13598 unsigned int present_dock;
13599
864f92be
WF
13600 present_laptop = snd_hda_jack_detect(codec, 0x18);
13601 present_dock = snd_hda_jack_detect(codec, 0x1b);
64154835
TV
13602
13603 /* Laptop mic port overrides dock mic port, design decision */
13604 if (present_dock)
13605 snd_hda_codec_write(codec, 0x23, 0,
13606 AC_VERB_SET_CONNECT_SEL, 0x3);
13607 if (present_laptop)
13608 snd_hda_codec_write(codec, 0x23, 0,
13609 AC_VERB_SET_CONNECT_SEL, 0x0);
13610 if (!present_dock && !present_laptop)
13611 snd_hda_codec_write(codec, 0x23, 0,
13612 AC_VERB_SET_CONNECT_SEL, 0x1);
13613}
13614
60db6b53
KY
13615static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
13616 unsigned int res)
13617{
4f5d1706
TI
13618 switch (res >> 26) {
13619 case ALC880_HP_EVENT:
60db6b53 13620 alc269_quanta_fl1_speaker_automute(codec);
4f5d1706
TI
13621 break;
13622 case ALC880_MIC_EVENT:
13623 alc_mic_automute(codec);
13624 break;
13625 }
60db6b53 13626}
f6a92248 13627
64154835
TV
13628static void alc269_lifebook_unsol_event(struct hda_codec *codec,
13629 unsigned int res)
13630{
13631 if ((res >> 26) == ALC880_HP_EVENT)
13632 alc269_lifebook_speaker_automute(codec);
13633 if ((res >> 26) == ALC880_MIC_EVENT)
13634 alc269_lifebook_mic_autoswitch(codec);
13635}
13636
4f5d1706
TI
13637static void alc269_quanta_fl1_setup(struct hda_codec *codec)
13638{
13639 struct alc_spec *spec = codec->spec;
20645d70
TI
13640 spec->autocfg.hp_pins[0] = 0x15;
13641 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
13642 spec->ext_mic.pin = 0x18;
13643 spec->ext_mic.mux_idx = 0;
13644 spec->int_mic.pin = 0x19;
13645 spec->int_mic.mux_idx = 1;
13646 spec->auto_mic = 1;
13647}
13648
60db6b53
KY
13649static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
13650{
13651 alc269_quanta_fl1_speaker_automute(codec);
4f5d1706 13652 alc_mic_automute(codec);
60db6b53 13653}
f6a92248 13654
64154835
TV
13655static void alc269_lifebook_init_hook(struct hda_codec *codec)
13656{
13657 alc269_lifebook_speaker_automute(codec);
13658 alc269_lifebook_mic_autoswitch(codec);
13659}
13660
84898e87 13661static struct hda_verb alc269_laptop_dmic_init_verbs[] = {
f53281e6
KY
13662 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13663 {0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
13664 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13665 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13666 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13667 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13668 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13669 {}
13670};
13671
84898e87 13672static struct hda_verb alc269_laptop_amic_init_verbs[] = {
f53281e6
KY
13673 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13674 {0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
13675 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13676 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
13677 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13678 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13679 {}
13680};
13681
84898e87
KY
13682static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
13683 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13684 {0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
13685 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13686 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13687 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13688 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13689 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13690 {}
13691};
13692
13693static struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
13694 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13695 {0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
13696 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13697 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13698 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13699 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13700 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13701 {}
13702};
13703
f53281e6
KY
13704/* toggle speaker-output according to the hp-jack state */
13705static void alc269_speaker_automute(struct hda_codec *codec)
13706{
ebb83eeb
KY
13707 struct alc_spec *spec = codec->spec;
13708 unsigned int nid = spec->autocfg.hp_pins[0];
f53281e6 13709 unsigned int present;
60db6b53 13710 unsigned char bits;
f53281e6 13711
ebb83eeb 13712 present = snd_hda_jack_detect(codec, nid);
5dbd5ec6 13713 bits = present ? HDA_AMP_MUTE : 0;
f53281e6 13714 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 13715 HDA_AMP_MUTE, bits);
f53281e6 13716 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 13717 HDA_AMP_MUTE, bits);
f53281e6
KY
13718}
13719
f53281e6 13720/* unsolicited event for HP jack sensing */
84898e87 13721static void alc269_laptop_unsol_event(struct hda_codec *codec,
60db6b53 13722 unsigned int res)
f53281e6 13723{
4f5d1706
TI
13724 switch (res >> 26) {
13725 case ALC880_HP_EVENT:
f53281e6 13726 alc269_speaker_automute(codec);
4f5d1706
TI
13727 break;
13728 case ALC880_MIC_EVENT:
13729 alc_mic_automute(codec);
13730 break;
13731 }
f53281e6
KY
13732}
13733
84898e87 13734static void alc269_laptop_dmic_setup(struct hda_codec *codec)
f53281e6 13735{
4f5d1706 13736 struct alc_spec *spec = codec->spec;
20645d70
TI
13737 spec->autocfg.hp_pins[0] = 0x15;
13738 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
13739 spec->ext_mic.pin = 0x18;
13740 spec->ext_mic.mux_idx = 0;
13741 spec->int_mic.pin = 0x12;
13742 spec->int_mic.mux_idx = 5;
13743 spec->auto_mic = 1;
f53281e6
KY
13744}
13745
84898e87
KY
13746static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
13747{
13748 struct alc_spec *spec = codec->spec;
20645d70
TI
13749 spec->autocfg.hp_pins[0] = 0x15;
13750 spec->autocfg.speaker_pins[0] = 0x14;
84898e87
KY
13751 spec->ext_mic.pin = 0x18;
13752 spec->ext_mic.mux_idx = 0;
13753 spec->int_mic.pin = 0x12;
13754 spec->int_mic.mux_idx = 6;
13755 spec->auto_mic = 1;
13756}
13757
13758static void alc269_laptop_amic_setup(struct hda_codec *codec)
f53281e6 13759{
4f5d1706 13760 struct alc_spec *spec = codec->spec;
20645d70
TI
13761 spec->autocfg.hp_pins[0] = 0x15;
13762 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
13763 spec->ext_mic.pin = 0x18;
13764 spec->ext_mic.mux_idx = 0;
13765 spec->int_mic.pin = 0x19;
13766 spec->int_mic.mux_idx = 1;
13767 spec->auto_mic = 1;
f53281e6
KY
13768}
13769
84898e87 13770static void alc269_laptop_inithook(struct hda_codec *codec)
f53281e6
KY
13771{
13772 alc269_speaker_automute(codec);
4f5d1706 13773 alc_mic_automute(codec);
f53281e6
KY
13774}
13775
60db6b53
KY
13776/*
13777 * generic initialization of ADC, input mixers and output mixers
13778 */
13779static struct hda_verb alc269_init_verbs[] = {
13780 /*
13781 * Unmute ADC0 and set the default input to mic-in
13782 */
84898e87 13783 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
60db6b53
KY
13784
13785 /*
84898e87 13786 * Set up output mixers (0x02 - 0x03)
60db6b53
KY
13787 */
13788 /* set vol=0 to output mixers */
13789 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13790 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13791
13792 /* set up input amps for analog loopback */
13793 /* Amp Indices: DAC = 0, mixer = 1 */
13794 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13795 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13796 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13797 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13798 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13799 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13800
13801 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13802 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13803 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13804 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13805 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13806 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13807 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13808
13809 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13810 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
60db6b53 13811
84898e87
KY
13812 /* FIXME: use Mux-type input source selection */
13813 /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
13814 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
13815 {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
60db6b53 13816
84898e87
KY
13817 /* set EAPD */
13818 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
13819 { }
13820};
13821
13822static struct hda_verb alc269vb_init_verbs[] = {
13823 /*
13824 * Unmute ADC0 and set the default input to mic-in
13825 */
13826 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13827
13828 /*
13829 * Set up output mixers (0x02 - 0x03)
13830 */
13831 /* set vol=0 to output mixers */
13832 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13833 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13834
13835 /* set up input amps for analog loopback */
13836 /* Amp Indices: DAC = 0, mixer = 1 */
13837 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13838 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13839 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13840 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13841 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13842 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13843
13844 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13845 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13846 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13847 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13848 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13849 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13850 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13851
13852 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13853 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13854
13855 /* FIXME: use Mux-type input source selection */
60db6b53
KY
13856 /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
13857 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
84898e87 13858 {0x22, AC_VERB_SET_CONNECT_SEL, 0x00},
60db6b53
KY
13859
13860 /* set EAPD */
13861 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
60db6b53
KY
13862 { }
13863};
13864
9d0b71b1
TI
13865#define alc269_auto_create_multi_out_ctls \
13866 alc268_auto_create_multi_out_ctls
05f5f477
TI
13867#define alc269_auto_create_input_ctls \
13868 alc268_auto_create_input_ctls
f6a92248
KY
13869
13870#ifdef CONFIG_SND_HDA_POWER_SAVE
13871#define alc269_loopbacks alc880_loopbacks
13872#endif
13873
def319f9 13874/* pcm configuration: identical with ALC880 */
f6a92248
KY
13875#define alc269_pcm_analog_playback alc880_pcm_analog_playback
13876#define alc269_pcm_analog_capture alc880_pcm_analog_capture
13877#define alc269_pcm_digital_playback alc880_pcm_digital_playback
13878#define alc269_pcm_digital_capture alc880_pcm_digital_capture
13879
f03d3115
TI
13880static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
13881 .substreams = 1,
13882 .channels_min = 2,
13883 .channels_max = 8,
13884 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13885 /* NID is set in alc_build_pcms */
13886 .ops = {
13887 .open = alc880_playback_pcm_open,
13888 .prepare = alc880_playback_pcm_prepare,
13889 .cleanup = alc880_playback_pcm_cleanup
13890 },
13891};
13892
13893static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
13894 .substreams = 1,
13895 .channels_min = 2,
13896 .channels_max = 2,
13897 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13898 /* NID is set in alc_build_pcms */
13899};
13900
f6a92248
KY
13901/*
13902 * BIOS auto configuration
13903 */
13904static int alc269_parse_auto_config(struct hda_codec *codec)
13905{
13906 struct alc_spec *spec = codec->spec;
cfb9fb55 13907 int err;
f6a92248
KY
13908 static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
13909
13910 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13911 alc269_ignore);
13912 if (err < 0)
13913 return err;
13914
13915 err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
13916 if (err < 0)
13917 return err;
05f5f477 13918 err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
f6a92248
KY
13919 if (err < 0)
13920 return err;
13921
13922 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
13923
0852d7a6 13924 if (spec->autocfg.dig_outs)
f6a92248
KY
13925 spec->multiout.dig_out_nid = ALC269_DIGOUT_NID;
13926
603c4019 13927 if (spec->kctls.list)
d88897ea 13928 add_mixer(spec, spec->kctls.list);
f6a92248 13929
84898e87
KY
13930 if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010) {
13931 add_verb(spec, alc269vb_init_verbs);
6227cdce 13932 alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21);
84898e87
KY
13933 } else {
13934 add_verb(spec, alc269_init_verbs);
6227cdce 13935 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
84898e87
KY
13936 }
13937
f6a92248 13938 spec->num_mux_defs = 1;
61b9b9b1 13939 spec->input_mux = &spec->private_imux[0];
6694635d
TI
13940 fillup_priv_adc_nids(codec, alc269_adc_candidates,
13941 sizeof(alc269_adc_candidates));
13942
e01bf509 13943 /* set default input source */
6694635d 13944 snd_hda_codec_write_cache(codec, spec->capsrc_nids[0],
e01bf509
TI
13945 0, AC_VERB_SET_CONNECT_SEL,
13946 spec->input_mux->items[0].index);
f6a92248
KY
13947
13948 err = alc_auto_add_mic_boost(codec);
13949 if (err < 0)
13950 return err;
13951
7e0e44d4 13952 if (!spec->cap_mixer && !spec->no_analog)
b59bdf3b 13953 set_capture_mixer(codec);
f53281e6 13954
f6a92248
KY
13955 return 1;
13956}
13957
e9af4f36
TI
13958#define alc269_auto_init_multi_out alc268_auto_init_multi_out
13959#define alc269_auto_init_hp_out alc268_auto_init_hp_out
f6a92248
KY
13960#define alc269_auto_init_analog_input alc882_auto_init_analog_input
13961
13962
13963/* init callback for auto-configuration model -- overriding the default init */
13964static void alc269_auto_init(struct hda_codec *codec)
13965{
f6c7e546 13966 struct alc_spec *spec = codec->spec;
f6a92248
KY
13967 alc269_auto_init_multi_out(codec);
13968 alc269_auto_init_hp_out(codec);
13969 alc269_auto_init_analog_input(codec);
f6c7e546 13970 if (spec->unsol_event)
7fb0d78f 13971 alc_inithook(codec);
f6a92248
KY
13972}
13973
13974/*
13975 * configuration and preset
13976 */
13977static const char *alc269_models[ALC269_MODEL_LAST] = {
60db6b53 13978 [ALC269_BASIC] = "basic",
2922c9af 13979 [ALC269_QUANTA_FL1] = "quanta",
84898e87
KY
13980 [ALC269_AMIC] = "laptop-amic",
13981 [ALC269_DMIC] = "laptop-dmic",
64154835 13982 [ALC269_FUJITSU] = "fujitsu",
3d3792cb
TI
13983 [ALC269_LIFEBOOK] = "lifebook",
13984 [ALC269_AUTO] = "auto",
f6a92248
KY
13985};
13986
13987static struct snd_pci_quirk alc269_cfg_tbl[] = {
60db6b53 13988 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
f53281e6 13989 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
84898e87
KY
13990 ALC269_AMIC),
13991 SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC),
13992 SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC),
13993 SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC),
13994 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC),
13995 SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC),
13996 SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC),
13997 SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),
13998 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),
13999 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC),
14000 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_AMIC),
14001 SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),
14002 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),
14003 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC),
14004 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC),
14005 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC),
14006 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC),
14007 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC),
14008 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC),
14009 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC),
14010 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC),
14011 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC),
14012 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC),
14013 SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC),
14014 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC),
14015 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC),
14016 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC),
14017 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC),
14018 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC),
14019 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
14020 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
14021 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
14022 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC),
14023 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
14024 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
14025 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
14026 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
f53281e6 14027 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
84898e87 14028 ALC269_DMIC),
60db6b53 14029 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
84898e87
KY
14030 ALC269_DMIC),
14031 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
14032 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
61c2d2b5 14033 SND_PCI_QUIRK(0x104d, 0x9071, "SONY XTB", ALC269_DMIC),
64154835 14034 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
61c2d2b5
KY
14035 SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
14036 SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
14037 SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC),
14038 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC),
14039 SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC),
14040 SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC),
f6a92248
KY
14041 {}
14042};
14043
14044static struct alc_config_preset alc269_presets[] = {
14045 [ALC269_BASIC] = {
f9e336f6 14046 .mixers = { alc269_base_mixer },
f6a92248
KY
14047 .init_verbs = { alc269_init_verbs },
14048 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14049 .dac_nids = alc269_dac_nids,
14050 .hp_nid = 0x03,
14051 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14052 .channel_mode = alc269_modes,
14053 .input_mux = &alc269_capture_source,
14054 },
60db6b53
KY
14055 [ALC269_QUANTA_FL1] = {
14056 .mixers = { alc269_quanta_fl1_mixer },
14057 .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
14058 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14059 .dac_nids = alc269_dac_nids,
14060 .hp_nid = 0x03,
14061 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14062 .channel_mode = alc269_modes,
14063 .input_mux = &alc269_capture_source,
14064 .unsol_event = alc269_quanta_fl1_unsol_event,
4f5d1706 14065 .setup = alc269_quanta_fl1_setup,
60db6b53
KY
14066 .init_hook = alc269_quanta_fl1_init_hook,
14067 },
84898e87
KY
14068 [ALC269_AMIC] = {
14069 .mixers = { alc269_laptop_mixer },
14070 .cap_mixer = alc269_laptop_analog_capture_mixer,
f53281e6 14071 .init_verbs = { alc269_init_verbs,
84898e87 14072 alc269_laptop_amic_init_verbs },
f53281e6
KY
14073 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14074 .dac_nids = alc269_dac_nids,
14075 .hp_nid = 0x03,
14076 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14077 .channel_mode = alc269_modes,
84898e87
KY
14078 .unsol_event = alc269_laptop_unsol_event,
14079 .setup = alc269_laptop_amic_setup,
14080 .init_hook = alc269_laptop_inithook,
f53281e6 14081 },
84898e87
KY
14082 [ALC269_DMIC] = {
14083 .mixers = { alc269_laptop_mixer },
14084 .cap_mixer = alc269_laptop_digital_capture_mixer,
f53281e6 14085 .init_verbs = { alc269_init_verbs,
84898e87
KY
14086 alc269_laptop_dmic_init_verbs },
14087 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14088 .dac_nids = alc269_dac_nids,
14089 .hp_nid = 0x03,
14090 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14091 .channel_mode = alc269_modes,
14092 .unsol_event = alc269_laptop_unsol_event,
14093 .setup = alc269_laptop_dmic_setup,
14094 .init_hook = alc269_laptop_inithook,
14095 },
14096 [ALC269VB_AMIC] = {
14097 .mixers = { alc269vb_laptop_mixer },
14098 .cap_mixer = alc269vb_laptop_analog_capture_mixer,
14099 .init_verbs = { alc269vb_init_verbs,
14100 alc269vb_laptop_amic_init_verbs },
f53281e6
KY
14101 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14102 .dac_nids = alc269_dac_nids,
14103 .hp_nid = 0x03,
14104 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14105 .channel_mode = alc269_modes,
84898e87
KY
14106 .unsol_event = alc269_laptop_unsol_event,
14107 .setup = alc269_laptop_amic_setup,
14108 .init_hook = alc269_laptop_inithook,
14109 },
14110 [ALC269VB_DMIC] = {
14111 .mixers = { alc269vb_laptop_mixer },
14112 .cap_mixer = alc269vb_laptop_digital_capture_mixer,
14113 .init_verbs = { alc269vb_init_verbs,
14114 alc269vb_laptop_dmic_init_verbs },
14115 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14116 .dac_nids = alc269_dac_nids,
14117 .hp_nid = 0x03,
14118 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14119 .channel_mode = alc269_modes,
14120 .unsol_event = alc269_laptop_unsol_event,
14121 .setup = alc269vb_laptop_dmic_setup,
14122 .init_hook = alc269_laptop_inithook,
f53281e6 14123 },
26f5df26 14124 [ALC269_FUJITSU] = {
45bdd1c1 14125 .mixers = { alc269_fujitsu_mixer },
84898e87 14126 .cap_mixer = alc269_laptop_digital_capture_mixer,
26f5df26 14127 .init_verbs = { alc269_init_verbs,
84898e87 14128 alc269_laptop_dmic_init_verbs },
26f5df26
TI
14129 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14130 .dac_nids = alc269_dac_nids,
14131 .hp_nid = 0x03,
14132 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14133 .channel_mode = alc269_modes,
84898e87
KY
14134 .unsol_event = alc269_laptop_unsol_event,
14135 .setup = alc269_laptop_dmic_setup,
14136 .init_hook = alc269_laptop_inithook,
26f5df26 14137 },
64154835
TV
14138 [ALC269_LIFEBOOK] = {
14139 .mixers = { alc269_lifebook_mixer },
14140 .init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
14141 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14142 .dac_nids = alc269_dac_nids,
14143 .hp_nid = 0x03,
14144 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14145 .channel_mode = alc269_modes,
14146 .input_mux = &alc269_capture_source,
14147 .unsol_event = alc269_lifebook_unsol_event,
14148 .init_hook = alc269_lifebook_init_hook,
14149 },
f6a92248
KY
14150};
14151
14152static int patch_alc269(struct hda_codec *codec)
14153{
14154 struct alc_spec *spec;
14155 int board_config;
14156 int err;
84898e87 14157 int is_alc269vb = 0;
f6a92248
KY
14158
14159 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
14160 if (spec == NULL)
14161 return -ENOMEM;
14162
14163 codec->spec = spec;
14164
2c3bf9ab
TI
14165 alc_fix_pll_init(codec, 0x20, 0x04, 15);
14166
274693f3
KY
14167 if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){
14168 kfree(codec->chip_name);
14169 codec->chip_name = kstrdup("ALC259", GFP_KERNEL);
ac2c92e0
TI
14170 if (!codec->chip_name) {
14171 alc_free(codec);
274693f3 14172 return -ENOMEM;
ac2c92e0 14173 }
84898e87 14174 is_alc269vb = 1;
274693f3
KY
14175 }
14176
f6a92248
KY
14177 board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
14178 alc269_models,
14179 alc269_cfg_tbl);
14180
14181 if (board_config < 0) {
9a11f1aa
TI
14182 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14183 codec->chip_name);
f6a92248
KY
14184 board_config = ALC269_AUTO;
14185 }
14186
14187 if (board_config == ALC269_AUTO) {
14188 /* automatic parse from the BIOS config */
14189 err = alc269_parse_auto_config(codec);
14190 if (err < 0) {
14191 alc_free(codec);
14192 return err;
14193 } else if (!err) {
14194 printk(KERN_INFO
14195 "hda_codec: Cannot set up configuration "
14196 "from BIOS. Using base mode...\n");
14197 board_config = ALC269_BASIC;
14198 }
14199 }
14200
680cd536
KK
14201 err = snd_hda_attach_beep_device(codec, 0x1);
14202 if (err < 0) {
14203 alc_free(codec);
14204 return err;
14205 }
14206
f6a92248 14207 if (board_config != ALC269_AUTO)
e9c364c0 14208 setup_preset(codec, &alc269_presets[board_config]);
f6a92248 14209
84898e87 14210 if (board_config == ALC269_QUANTA_FL1) {
f03d3115
TI
14211 /* Due to a hardware problem on Lenovo Ideadpad, we need to
14212 * fix the sample rate of analog I/O to 44.1kHz
14213 */
14214 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
14215 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
14216 } else {
14217 spec->stream_analog_playback = &alc269_pcm_analog_playback;
14218 spec->stream_analog_capture = &alc269_pcm_analog_capture;
14219 }
f6a92248
KY
14220 spec->stream_digital_playback = &alc269_pcm_digital_playback;
14221 spec->stream_digital_capture = &alc269_pcm_digital_capture;
14222
6694635d
TI
14223 if (!spec->adc_nids) { /* wasn't filled automatically? use default */
14224 if (!is_alc269vb) {
14225 spec->adc_nids = alc269_adc_nids;
14226 spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
14227 spec->capsrc_nids = alc269_capsrc_nids;
14228 } else {
14229 spec->adc_nids = alc269vb_adc_nids;
14230 spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids);
14231 spec->capsrc_nids = alc269vb_capsrc_nids;
14232 }
84898e87
KY
14233 }
14234
f9e336f6 14235 if (!spec->cap_mixer)
b59bdf3b 14236 set_capture_mixer(codec);
45bdd1c1 14237 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
f6a92248 14238
100d5eb3
TI
14239 spec->vmaster_nid = 0x02;
14240
f6a92248
KY
14241 codec->patch_ops = alc_patch_ops;
14242 if (board_config == ALC269_AUTO)
14243 spec->init_hook = alc269_auto_init;
14244#ifdef CONFIG_SND_HDA_POWER_SAVE
14245 if (!spec->loopback.amplist)
14246 spec->loopback.amplist = alc269_loopbacks;
14247#endif
14248
14249 return 0;
14250}
14251
df694daa
KY
14252/*
14253 * ALC861 channel source setting (2/6 channel selection for 3-stack)
14254 */
14255
14256/*
14257 * set the path ways for 2 channel output
14258 * need to set the codec line out and mic 1 pin widgets to inputs
14259 */
14260static struct hda_verb alc861_threestack_ch2_init[] = {
14261 /* set pin widget 1Ah (line in) for input */
14262 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
f12ab1e0
TI
14263 /* set pin widget 18h (mic1/2) for input, for mic also enable
14264 * the vref
14265 */
df694daa
KY
14266 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14267
9c7f852e
TI
14268 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14269#if 0
14270 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14271 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14272#endif
df694daa
KY
14273 { } /* end */
14274};
14275/*
14276 * 6ch mode
14277 * need to set the codec line out and mic 1 pin widgets to outputs
14278 */
14279static struct hda_verb alc861_threestack_ch6_init[] = {
14280 /* set pin widget 1Ah (line in) for output (Back Surround)*/
14281 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14282 /* set pin widget 18h (mic1) for output (CLFE)*/
14283 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14284
14285 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
9c7f852e 14286 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
df694daa 14287
9c7f852e
TI
14288 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14289#if 0
14290 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14291 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14292#endif
df694daa
KY
14293 { } /* end */
14294};
14295
14296static struct hda_channel_mode alc861_threestack_modes[2] = {
14297 { 2, alc861_threestack_ch2_init },
14298 { 6, alc861_threestack_ch6_init },
14299};
22309c3e
TI
14300/* Set mic1 as input and unmute the mixer */
14301static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
14302 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14303 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14304 { } /* end */
14305};
14306/* Set mic1 as output and mute mixer */
14307static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
14308 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14309 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14310 { } /* end */
14311};
14312
14313static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
14314 { 2, alc861_uniwill_m31_ch2_init },
14315 { 4, alc861_uniwill_m31_ch4_init },
14316};
df694daa 14317
7cdbff94
MD
14318/* Set mic1 and line-in as input and unmute the mixer */
14319static struct hda_verb alc861_asus_ch2_init[] = {
14320 /* set pin widget 1Ah (line in) for input */
14321 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
f12ab1e0
TI
14322 /* set pin widget 18h (mic1/2) for input, for mic also enable
14323 * the vref
14324 */
7cdbff94
MD
14325 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14326
14327 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14328#if 0
14329 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14330 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14331#endif
14332 { } /* end */
14333};
14334/* Set mic1 nad line-in as output and mute mixer */
14335static struct hda_verb alc861_asus_ch6_init[] = {
14336 /* set pin widget 1Ah (line in) for output (Back Surround)*/
14337 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14338 /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14339 /* set pin widget 18h (mic1) for output (CLFE)*/
14340 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14341 /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14342 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14343 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14344
14345 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14346#if 0
14347 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14348 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14349#endif
14350 { } /* end */
14351};
14352
14353static struct hda_channel_mode alc861_asus_modes[2] = {
14354 { 2, alc861_asus_ch2_init },
14355 { 6, alc861_asus_ch6_init },
14356};
14357
df694daa
KY
14358/* patch-ALC861 */
14359
14360static struct snd_kcontrol_new alc861_base_mixer[] = {
14361 /* output mixer control */
14362 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14363 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14364 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14365 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14366 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14367
14368 /*Input mixer control */
14369 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14370 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14371 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14372 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14373 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14374 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14375 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14376 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14377 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14378 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
f12ab1e0 14379
df694daa
KY
14380 { } /* end */
14381};
14382
14383static struct snd_kcontrol_new alc861_3ST_mixer[] = {
14384 /* output mixer control */
14385 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14386 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14387 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14388 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14389 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14390
14391 /* Input mixer control */
14392 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14393 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14394 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14395 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14396 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14397 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14398 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14399 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14400 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14401 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
f12ab1e0 14402
df694daa
KY
14403 {
14404 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14405 .name = "Channel Mode",
14406 .info = alc_ch_mode_info,
14407 .get = alc_ch_mode_get,
14408 .put = alc_ch_mode_put,
14409 .private_value = ARRAY_SIZE(alc861_threestack_modes),
14410 },
14411 { } /* end */
a53d1aec
TD
14412};
14413
d1d985f0 14414static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
a53d1aec
TD
14415 /* output mixer control */
14416 HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14417 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14418 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
ea1fb29a 14419
a53d1aec 14420 { } /* end */
f12ab1e0 14421};
a53d1aec 14422
22309c3e
TI
14423static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
14424 /* output mixer control */
14425 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14426 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14427 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14428 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14429 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14430
14431 /* Input mixer control */
14432 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14433 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14434 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14435 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14436 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14437 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14438 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14439 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14440 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14441 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
f12ab1e0 14442
22309c3e
TI
14443 {
14444 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14445 .name = "Channel Mode",
14446 .info = alc_ch_mode_info,
14447 .get = alc_ch_mode_get,
14448 .put = alc_ch_mode_put,
14449 .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
14450 },
14451 { } /* end */
f12ab1e0 14452};
7cdbff94
MD
14453
14454static struct snd_kcontrol_new alc861_asus_mixer[] = {
14455 /* output mixer control */
14456 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14457 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14458 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14459 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14460 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14461
14462 /* Input mixer control */
14463 HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14464 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
14465 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14466 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14467 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14468 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14469 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14470 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14471 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
f12ab1e0
TI
14472 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
14473
7cdbff94
MD
14474 {
14475 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14476 .name = "Channel Mode",
14477 .info = alc_ch_mode_info,
14478 .get = alc_ch_mode_get,
14479 .put = alc_ch_mode_put,
14480 .private_value = ARRAY_SIZE(alc861_asus_modes),
14481 },
14482 { }
56bb0cab
TI
14483};
14484
14485/* additional mixer */
d1d985f0 14486static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
56bb0cab
TI
14487 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14488 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
56bb0cab
TI
14489 { }
14490};
7cdbff94 14491
df694daa
KY
14492/*
14493 * generic initialization of ADC, input mixers and output mixers
14494 */
14495static struct hda_verb alc861_base_init_verbs[] = {
14496 /*
14497 * Unmute ADC0 and set the default input to mic-in
14498 */
14499 /* port-A for surround (rear panel) */
14500 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14501 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
14502 /* port-B for mic-in (rear panel) with vref */
14503 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14504 /* port-C for line-in (rear panel) */
14505 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14506 /* port-D for Front */
14507 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14508 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14509 /* port-E for HP out (front panel) */
14510 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14511 /* route front PCM to HP */
9dece1d7 14512 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
df694daa
KY
14513 /* port-F for mic-in (front panel) with vref */
14514 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14515 /* port-G for CLFE (rear panel) */
14516 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14517 { 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14518 /* port-H for side (rear panel) */
14519 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14520 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
14521 /* CD-in */
14522 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14523 /* route front mic to ADC1*/
14524 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14525 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
ea1fb29a 14526
df694daa
KY
14527 /* Unmute DAC0~3 & spdif out*/
14528 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14529 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14530 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14531 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14532 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
ea1fb29a 14533
df694daa
KY
14534 /* Unmute Mixer 14 (mic) 1c (Line in)*/
14535 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14536 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14537 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14538 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 14539
df694daa
KY
14540 /* Unmute Stereo Mixer 15 */
14541 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14542 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14543 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
f12ab1e0 14544 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
df694daa
KY
14545
14546 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14547 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14548 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14549 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14550 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14551 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14552 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14553 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
f12ab1e0
TI
14554 /* hp used DAC 3 (Front) */
14555 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
df694daa
KY
14556 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14557
14558 { }
14559};
14560
14561static struct hda_verb alc861_threestack_init_verbs[] = {
14562 /*
14563 * Unmute ADC0 and set the default input to mic-in
14564 */
14565 /* port-A for surround (rear panel) */
14566 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14567 /* port-B for mic-in (rear panel) with vref */
14568 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14569 /* port-C for line-in (rear panel) */
14570 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14571 /* port-D for Front */
14572 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14573 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14574 /* port-E for HP out (front panel) */
14575 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14576 /* route front PCM to HP */
9dece1d7 14577 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
df694daa
KY
14578 /* port-F for mic-in (front panel) with vref */
14579 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14580 /* port-G for CLFE (rear panel) */
14581 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14582 /* port-H for side (rear panel) */
14583 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14584 /* CD-in */
14585 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14586 /* route front mic to ADC1*/
14587 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14588 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14589 /* Unmute DAC0~3 & spdif out*/
14590 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14591 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14592 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14593 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14594 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
ea1fb29a 14595
df694daa
KY
14596 /* Unmute Mixer 14 (mic) 1c (Line in)*/
14597 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14598 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14599 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14600 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 14601
df694daa
KY
14602 /* Unmute Stereo Mixer 15 */
14603 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14604 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14605 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
f12ab1e0 14606 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
df694daa
KY
14607
14608 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14609 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14610 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14611 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14612 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14613 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14614 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14615 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
f12ab1e0
TI
14616 /* hp used DAC 3 (Front) */
14617 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
df694daa
KY
14618 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14619 { }
14620};
22309c3e
TI
14621
14622static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
14623 /*
14624 * Unmute ADC0 and set the default input to mic-in
14625 */
14626 /* port-A for surround (rear panel) */
14627 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14628 /* port-B for mic-in (rear panel) with vref */
14629 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14630 /* port-C for line-in (rear panel) */
14631 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14632 /* port-D for Front */
14633 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14634 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14635 /* port-E for HP out (front panel) */
f12ab1e0
TI
14636 /* this has to be set to VREF80 */
14637 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
22309c3e 14638 /* route front PCM to HP */
9dece1d7 14639 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
22309c3e
TI
14640 /* port-F for mic-in (front panel) with vref */
14641 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14642 /* port-G for CLFE (rear panel) */
14643 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14644 /* port-H for side (rear panel) */
14645 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14646 /* CD-in */
14647 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14648 /* route front mic to ADC1*/
14649 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14650 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14651 /* Unmute DAC0~3 & spdif out*/
14652 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14653 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14654 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14655 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14656 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
ea1fb29a 14657
22309c3e
TI
14658 /* Unmute Mixer 14 (mic) 1c (Line in)*/
14659 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14660 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14661 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14662 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 14663
22309c3e
TI
14664 /* Unmute Stereo Mixer 15 */
14665 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14666 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14667 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
f12ab1e0 14668 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
22309c3e
TI
14669
14670 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14671 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14672 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14673 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14674 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14675 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14676 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14677 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
f12ab1e0
TI
14678 /* hp used DAC 3 (Front) */
14679 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
22309c3e
TI
14680 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14681 { }
14682};
14683
7cdbff94
MD
14684static struct hda_verb alc861_asus_init_verbs[] = {
14685 /*
14686 * Unmute ADC0 and set the default input to mic-in
14687 */
f12ab1e0
TI
14688 /* port-A for surround (rear panel)
14689 * according to codec#0 this is the HP jack
14690 */
7cdbff94
MD
14691 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
14692 /* route front PCM to HP */
14693 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
14694 /* port-B for mic-in (rear panel) with vref */
14695 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14696 /* port-C for line-in (rear panel) */
14697 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14698 /* port-D for Front */
14699 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14700 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14701 /* port-E for HP out (front panel) */
f12ab1e0
TI
14702 /* this has to be set to VREF80 */
14703 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
7cdbff94 14704 /* route front PCM to HP */
9dece1d7 14705 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
7cdbff94
MD
14706 /* port-F for mic-in (front panel) with vref */
14707 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14708 /* port-G for CLFE (rear panel) */
14709 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14710 /* port-H for side (rear panel) */
14711 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14712 /* CD-in */
14713 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14714 /* route front mic to ADC1*/
14715 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14716 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14717 /* Unmute DAC0~3 & spdif out*/
14718 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14719 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14720 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14721 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14722 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14723 /* Unmute Mixer 14 (mic) 1c (Line in)*/
14724 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14725 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14726 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14727 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 14728
7cdbff94
MD
14729 /* Unmute Stereo Mixer 15 */
14730 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14731 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14732 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
f12ab1e0 14733 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
7cdbff94
MD
14734
14735 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14736 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14737 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14738 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14739 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14740 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14741 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14742 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
f12ab1e0
TI
14743 /* hp used DAC 3 (Front) */
14744 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7cdbff94
MD
14745 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14746 { }
14747};
14748
56bb0cab
TI
14749/* additional init verbs for ASUS laptops */
14750static struct hda_verb alc861_asus_laptop_init_verbs[] = {
14751 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
14752 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
14753 { }
14754};
7cdbff94 14755
df694daa
KY
14756/*
14757 * generic initialization of ADC, input mixers and output mixers
14758 */
14759static struct hda_verb alc861_auto_init_verbs[] = {
14760 /*
14761 * Unmute ADC0 and set the default input to mic-in
14762 */
f12ab1e0 14763 /* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
df694daa 14764 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
ea1fb29a 14765
df694daa
KY
14766 /* Unmute DAC0~3 & spdif out*/
14767 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14768 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14769 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14770 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14771 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
ea1fb29a 14772
df694daa
KY
14773 /* Unmute Mixer 14 (mic) 1c (Line in)*/
14774 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14775 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14776 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14777 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 14778
df694daa
KY
14779 /* Unmute Stereo Mixer 15 */
14780 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14781 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14782 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14783 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
14784
1c20930a
TI
14785 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14786 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14787 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14788 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14789 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14790 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14791 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14792 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
df694daa
KY
14793
14794 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14795 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1c20930a
TI
14796 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14797 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
df694daa
KY
14798 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14799 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1c20930a
TI
14800 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14801 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
df694daa 14802
f12ab1e0 14803 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, /* set Mic 1 */
df694daa
KY
14804
14805 { }
14806};
14807
a53d1aec
TD
14808static struct hda_verb alc861_toshiba_init_verbs[] = {
14809 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
f12ab1e0 14810
a53d1aec
TD
14811 { }
14812};
14813
14814/* toggle speaker-output according to the hp-jack state */
14815static void alc861_toshiba_automute(struct hda_codec *codec)
14816{
864f92be 14817 unsigned int present = snd_hda_jack_detect(codec, 0x0f);
a53d1aec 14818
47fd830a
TI
14819 snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
14820 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
14821 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
14822 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
a53d1aec
TD
14823}
14824
14825static void alc861_toshiba_unsol_event(struct hda_codec *codec,
14826 unsigned int res)
14827{
a53d1aec
TD
14828 if ((res >> 26) == ALC880_HP_EVENT)
14829 alc861_toshiba_automute(codec);
14830}
14831
def319f9 14832/* pcm configuration: identical with ALC880 */
df694daa
KY
14833#define alc861_pcm_analog_playback alc880_pcm_analog_playback
14834#define alc861_pcm_analog_capture alc880_pcm_analog_capture
14835#define alc861_pcm_digital_playback alc880_pcm_digital_playback
14836#define alc861_pcm_digital_capture alc880_pcm_digital_capture
14837
14838
14839#define ALC861_DIGOUT_NID 0x07
14840
14841static struct hda_channel_mode alc861_8ch_modes[1] = {
14842 { 8, NULL }
14843};
14844
14845static hda_nid_t alc861_dac_nids[4] = {
14846 /* front, surround, clfe, side */
14847 0x03, 0x06, 0x05, 0x04
14848};
14849
9c7f852e
TI
14850static hda_nid_t alc660_dac_nids[3] = {
14851 /* front, clfe, surround */
14852 0x03, 0x05, 0x06
14853};
14854
df694daa
KY
14855static hda_nid_t alc861_adc_nids[1] = {
14856 /* ADC0-2 */
14857 0x08,
14858};
14859
14860static struct hda_input_mux alc861_capture_source = {
14861 .num_items = 5,
14862 .items = {
14863 { "Mic", 0x0 },
14864 { "Front Mic", 0x3 },
14865 { "Line", 0x1 },
14866 { "CD", 0x4 },
14867 { "Mixer", 0x5 },
14868 },
14869};
14870
1c20930a
TI
14871static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
14872{
14873 struct alc_spec *spec = codec->spec;
14874 hda_nid_t mix, srcs[5];
14875 int i, j, num;
14876
14877 if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
14878 return 0;
14879 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14880 if (num < 0)
14881 return 0;
14882 for (i = 0; i < num; i++) {
14883 unsigned int type;
a22d543a 14884 type = get_wcaps_type(get_wcaps(codec, srcs[i]));
1c20930a
TI
14885 if (type != AC_WID_AUD_OUT)
14886 continue;
14887 for (j = 0; j < spec->multiout.num_dacs; j++)
14888 if (spec->multiout.dac_nids[j] == srcs[i])
14889 break;
14890 if (j >= spec->multiout.num_dacs)
14891 return srcs[i];
14892 }
14893 return 0;
14894}
14895
df694daa 14896/* fill in the dac_nids table from the parsed pin configuration */
1c20930a 14897static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
f12ab1e0 14898 const struct auto_pin_cfg *cfg)
df694daa 14899{
1c20930a 14900 struct alc_spec *spec = codec->spec;
df694daa 14901 int i;
1c20930a 14902 hda_nid_t nid, dac;
df694daa
KY
14903
14904 spec->multiout.dac_nids = spec->private_dac_nids;
14905 for (i = 0; i < cfg->line_outs; i++) {
14906 nid = cfg->line_out_pins[i];
1c20930a
TI
14907 dac = alc861_look_for_dac(codec, nid);
14908 if (!dac)
14909 continue;
14910 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
df694daa 14911 }
df694daa
KY
14912 return 0;
14913}
14914
1c20930a
TI
14915static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
14916 hda_nid_t nid, unsigned int chs)
14917{
0afe5f89 14918 return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx,
1c20930a
TI
14919 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
14920}
14921
df694daa 14922/* add playback controls from the parsed DAC table */
1c20930a 14923static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
df694daa
KY
14924 const struct auto_pin_cfg *cfg)
14925{
1c20930a 14926 struct alc_spec *spec = codec->spec;
f12ab1e0
TI
14927 static const char *chname[4] = {
14928 "Front", "Surround", NULL /*CLFE*/, "Side"
14929 };
df694daa 14930 hda_nid_t nid;
1c20930a
TI
14931 int i, err;
14932
14933 if (cfg->line_outs == 1) {
14934 const char *pfx = NULL;
14935 if (!cfg->hp_outs)
14936 pfx = "Master";
14937 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
14938 pfx = "Speaker";
14939 if (pfx) {
14940 nid = spec->multiout.dac_nids[0];
14941 return alc861_create_out_sw(codec, pfx, nid, 3);
14942 }
14943 }
df694daa
KY
14944
14945 for (i = 0; i < cfg->line_outs; i++) {
14946 nid = spec->multiout.dac_nids[i];
f12ab1e0 14947 if (!nid)
df694daa 14948 continue;
1c20930a 14949 if (i == 2) {
df694daa 14950 /* Center/LFE */
1c20930a 14951 err = alc861_create_out_sw(codec, "Center", nid, 1);
f12ab1e0 14952 if (err < 0)
df694daa 14953 return err;
1c20930a 14954 err = alc861_create_out_sw(codec, "LFE", nid, 2);
f12ab1e0 14955 if (err < 0)
df694daa
KY
14956 return err;
14957 } else {
1c20930a 14958 err = alc861_create_out_sw(codec, chname[i], nid, 3);
f12ab1e0 14959 if (err < 0)
df694daa
KY
14960 return err;
14961 }
14962 }
14963 return 0;
14964}
14965
1c20930a 14966static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
df694daa 14967{
1c20930a 14968 struct alc_spec *spec = codec->spec;
df694daa
KY
14969 int err;
14970 hda_nid_t nid;
14971
f12ab1e0 14972 if (!pin)
df694daa
KY
14973 return 0;
14974
14975 if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
1c20930a
TI
14976 nid = alc861_look_for_dac(codec, pin);
14977 if (nid) {
14978 err = alc861_create_out_sw(codec, "Headphone", nid, 3);
14979 if (err < 0)
14980 return err;
14981 spec->multiout.hp_nid = nid;
14982 }
df694daa
KY
14983 }
14984 return 0;
14985}
14986
14987/* create playback/capture controls for input pins */
05f5f477 14988static int alc861_auto_create_input_ctls(struct hda_codec *codec,
f12ab1e0 14989 const struct auto_pin_cfg *cfg)
df694daa 14990{
05f5f477 14991 return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
df694daa
KY
14992}
14993
f12ab1e0
TI
14994static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
14995 hda_nid_t nid,
1c20930a 14996 int pin_type, hda_nid_t dac)
df694daa 14997{
1c20930a
TI
14998 hda_nid_t mix, srcs[5];
14999 int i, num;
15000
564c5bea
JL
15001 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
15002 pin_type);
1c20930a 15003 snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
564c5bea 15004 AMP_OUT_UNMUTE);
1c20930a
TI
15005 if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
15006 return;
15007 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15008 if (num < 0)
15009 return;
15010 for (i = 0; i < num; i++) {
15011 unsigned int mute;
15012 if (srcs[i] == dac || srcs[i] == 0x15)
15013 mute = AMP_IN_UNMUTE(i);
15014 else
15015 mute = AMP_IN_MUTE(i);
15016 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15017 mute);
15018 }
df694daa
KY
15019}
15020
15021static void alc861_auto_init_multi_out(struct hda_codec *codec)
15022{
15023 struct alc_spec *spec = codec->spec;
15024 int i;
15025
15026 for (i = 0; i < spec->autocfg.line_outs; i++) {
15027 hda_nid_t nid = spec->autocfg.line_out_pins[i];
baba8ee9 15028 int pin_type = get_pin_type(spec->autocfg.line_out_type);
df694daa 15029 if (nid)
baba8ee9 15030 alc861_auto_set_output_and_unmute(codec, nid, pin_type,
f12ab1e0 15031 spec->multiout.dac_nids[i]);
df694daa
KY
15032 }
15033}
15034
15035static void alc861_auto_init_hp_out(struct hda_codec *codec)
15036{
15037 struct alc_spec *spec = codec->spec;
df694daa 15038
15870f05
TI
15039 if (spec->autocfg.hp_outs)
15040 alc861_auto_set_output_and_unmute(codec,
15041 spec->autocfg.hp_pins[0],
15042 PIN_HP,
1c20930a 15043 spec->multiout.hp_nid);
15870f05
TI
15044 if (spec->autocfg.speaker_outs)
15045 alc861_auto_set_output_and_unmute(codec,
15046 spec->autocfg.speaker_pins[0],
15047 PIN_OUT,
1c20930a 15048 spec->multiout.dac_nids[0]);
df694daa
KY
15049}
15050
15051static void alc861_auto_init_analog_input(struct hda_codec *codec)
15052{
15053 struct alc_spec *spec = codec->spec;
15054 int i;
15055
15056 for (i = 0; i < AUTO_PIN_LAST; i++) {
15057 hda_nid_t nid = spec->autocfg.input_pins[i];
23f0c048
TI
15058 if (nid >= 0x0c && nid <= 0x11)
15059 alc_set_input_pin(codec, nid, i);
df694daa
KY
15060 }
15061}
15062
15063/* parse the BIOS configuration and set up the alc_spec */
f12ab1e0
TI
15064/* return 1 if successful, 0 if the proper config is not found,
15065 * or a negative error code
15066 */
df694daa
KY
15067static int alc861_parse_auto_config(struct hda_codec *codec)
15068{
15069 struct alc_spec *spec = codec->spec;
15070 int err;
15071 static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
15072
f12ab1e0
TI
15073 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15074 alc861_ignore);
15075 if (err < 0)
df694daa 15076 return err;
f12ab1e0 15077 if (!spec->autocfg.line_outs)
df694daa
KY
15078 return 0; /* can't find valid BIOS pin config */
15079
1c20930a 15080 err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
f12ab1e0
TI
15081 if (err < 0)
15082 return err;
1c20930a 15083 err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
f12ab1e0
TI
15084 if (err < 0)
15085 return err;
1c20930a 15086 err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
f12ab1e0
TI
15087 if (err < 0)
15088 return err;
05f5f477 15089 err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 15090 if (err < 0)
df694daa
KY
15091 return err;
15092
15093 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
15094
0852d7a6 15095 if (spec->autocfg.dig_outs)
df694daa
KY
15096 spec->multiout.dig_out_nid = ALC861_DIGOUT_NID;
15097
603c4019 15098 if (spec->kctls.list)
d88897ea 15099 add_mixer(spec, spec->kctls.list);
df694daa 15100
d88897ea 15101 add_verb(spec, alc861_auto_init_verbs);
df694daa 15102
a1e8d2da 15103 spec->num_mux_defs = 1;
61b9b9b1 15104 spec->input_mux = &spec->private_imux[0];
df694daa
KY
15105
15106 spec->adc_nids = alc861_adc_nids;
15107 spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
b59bdf3b 15108 set_capture_mixer(codec);
df694daa 15109
6227cdce 15110 alc_ssid_check(codec, 0x0e, 0x0f, 0x0b, 0);
4a79ba34 15111
df694daa
KY
15112 return 1;
15113}
15114
ae6b813a
TI
15115/* additional initialization for auto-configuration model */
15116static void alc861_auto_init(struct hda_codec *codec)
df694daa 15117{
f6c7e546 15118 struct alc_spec *spec = codec->spec;
df694daa
KY
15119 alc861_auto_init_multi_out(codec);
15120 alc861_auto_init_hp_out(codec);
15121 alc861_auto_init_analog_input(codec);
f6c7e546 15122 if (spec->unsol_event)
7fb0d78f 15123 alc_inithook(codec);
df694daa
KY
15124}
15125
cb53c626
TI
15126#ifdef CONFIG_SND_HDA_POWER_SAVE
15127static struct hda_amp_list alc861_loopbacks[] = {
15128 { 0x15, HDA_INPUT, 0 },
15129 { 0x15, HDA_INPUT, 1 },
15130 { 0x15, HDA_INPUT, 2 },
15131 { 0x15, HDA_INPUT, 3 },
15132 { } /* end */
15133};
15134#endif
15135
df694daa
KY
15136
15137/*
15138 * configuration and preset
15139 */
f5fcc13c
TI
15140static const char *alc861_models[ALC861_MODEL_LAST] = {
15141 [ALC861_3ST] = "3stack",
15142 [ALC660_3ST] = "3stack-660",
15143 [ALC861_3ST_DIG] = "3stack-dig",
15144 [ALC861_6ST_DIG] = "6stack-dig",
15145 [ALC861_UNIWILL_M31] = "uniwill-m31",
15146 [ALC861_TOSHIBA] = "toshiba",
15147 [ALC861_ASUS] = "asus",
15148 [ALC861_ASUS_LAPTOP] = "asus-laptop",
15149 [ALC861_AUTO] = "auto",
15150};
15151
15152static struct snd_pci_quirk alc861_cfg_tbl[] = {
687a47bd 15153 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
f5fcc13c
TI
15154 SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15155 SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15156 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
ac3e3741 15157 SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
83c34218 15158 SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
ad5e7737 15159 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
341d4eb0
TI
15160 /* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
15161 * Any other models that need this preset?
15162 */
15163 /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
ac3e3741
TI
15164 SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
15165 SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
4147dab6 15166 SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
ac3e3741
TI
15167 SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
15168 SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
15169 /* FIXME: the below seems conflict */
15170 /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
07e038b3 15171 SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
f5fcc13c 15172 SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
df694daa
KY
15173 {}
15174};
15175
15176static struct alc_config_preset alc861_presets[] = {
15177 [ALC861_3ST] = {
15178 .mixers = { alc861_3ST_mixer },
15179 .init_verbs = { alc861_threestack_init_verbs },
15180 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15181 .dac_nids = alc861_dac_nids,
15182 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15183 .channel_mode = alc861_threestack_modes,
4e195a7b 15184 .need_dac_fix = 1,
df694daa
KY
15185 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15186 .adc_nids = alc861_adc_nids,
15187 .input_mux = &alc861_capture_source,
15188 },
15189 [ALC861_3ST_DIG] = {
15190 .mixers = { alc861_base_mixer },
15191 .init_verbs = { alc861_threestack_init_verbs },
15192 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15193 .dac_nids = alc861_dac_nids,
15194 .dig_out_nid = ALC861_DIGOUT_NID,
15195 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15196 .channel_mode = alc861_threestack_modes,
4e195a7b 15197 .need_dac_fix = 1,
df694daa
KY
15198 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15199 .adc_nids = alc861_adc_nids,
15200 .input_mux = &alc861_capture_source,
15201 },
15202 [ALC861_6ST_DIG] = {
15203 .mixers = { alc861_base_mixer },
15204 .init_verbs = { alc861_base_init_verbs },
15205 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15206 .dac_nids = alc861_dac_nids,
15207 .dig_out_nid = ALC861_DIGOUT_NID,
15208 .num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
15209 .channel_mode = alc861_8ch_modes,
15210 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15211 .adc_nids = alc861_adc_nids,
15212 .input_mux = &alc861_capture_source,
15213 },
9c7f852e
TI
15214 [ALC660_3ST] = {
15215 .mixers = { alc861_3ST_mixer },
15216 .init_verbs = { alc861_threestack_init_verbs },
15217 .num_dacs = ARRAY_SIZE(alc660_dac_nids),
15218 .dac_nids = alc660_dac_nids,
15219 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15220 .channel_mode = alc861_threestack_modes,
4e195a7b 15221 .need_dac_fix = 1,
9c7f852e
TI
15222 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15223 .adc_nids = alc861_adc_nids,
15224 .input_mux = &alc861_capture_source,
15225 },
22309c3e
TI
15226 [ALC861_UNIWILL_M31] = {
15227 .mixers = { alc861_uniwill_m31_mixer },
15228 .init_verbs = { alc861_uniwill_m31_init_verbs },
15229 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15230 .dac_nids = alc861_dac_nids,
15231 .dig_out_nid = ALC861_DIGOUT_NID,
15232 .num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
15233 .channel_mode = alc861_uniwill_m31_modes,
15234 .need_dac_fix = 1,
15235 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15236 .adc_nids = alc861_adc_nids,
15237 .input_mux = &alc861_capture_source,
15238 },
a53d1aec
TD
15239 [ALC861_TOSHIBA] = {
15240 .mixers = { alc861_toshiba_mixer },
f12ab1e0
TI
15241 .init_verbs = { alc861_base_init_verbs,
15242 alc861_toshiba_init_verbs },
a53d1aec
TD
15243 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15244 .dac_nids = alc861_dac_nids,
15245 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15246 .channel_mode = alc883_3ST_2ch_modes,
15247 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15248 .adc_nids = alc861_adc_nids,
15249 .input_mux = &alc861_capture_source,
15250 .unsol_event = alc861_toshiba_unsol_event,
15251 .init_hook = alc861_toshiba_automute,
15252 },
7cdbff94
MD
15253 [ALC861_ASUS] = {
15254 .mixers = { alc861_asus_mixer },
15255 .init_verbs = { alc861_asus_init_verbs },
15256 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15257 .dac_nids = alc861_dac_nids,
15258 .dig_out_nid = ALC861_DIGOUT_NID,
15259 .num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
15260 .channel_mode = alc861_asus_modes,
15261 .need_dac_fix = 1,
15262 .hp_nid = 0x06,
15263 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15264 .adc_nids = alc861_adc_nids,
15265 .input_mux = &alc861_capture_source,
15266 },
56bb0cab
TI
15267 [ALC861_ASUS_LAPTOP] = {
15268 .mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
15269 .init_verbs = { alc861_asus_init_verbs,
15270 alc861_asus_laptop_init_verbs },
15271 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15272 .dac_nids = alc861_dac_nids,
15273 .dig_out_nid = ALC861_DIGOUT_NID,
15274 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15275 .channel_mode = alc883_3ST_2ch_modes,
15276 .need_dac_fix = 1,
15277 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15278 .adc_nids = alc861_adc_nids,
15279 .input_mux = &alc861_capture_source,
15280 },
15281};
df694daa 15282
cfc9b06f
TI
15283/* Pin config fixes */
15284enum {
15285 PINFIX_FSC_AMILO_PI1505,
15286};
15287
15288static struct alc_pincfg alc861_fsc_amilo_pi1505_pinfix[] = {
15289 { 0x0b, 0x0221101f }, /* HP */
15290 { 0x0f, 0x90170310 }, /* speaker */
15291 { }
15292};
15293
15294static const struct alc_fixup alc861_fixups[] = {
15295 [PINFIX_FSC_AMILO_PI1505] = {
15296 .pins = alc861_fsc_amilo_pi1505_pinfix
15297 },
15298};
15299
15300static struct snd_pci_quirk alc861_fixup_tbl[] = {
15301 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
15302 {}
15303};
df694daa
KY
15304
15305static int patch_alc861(struct hda_codec *codec)
15306{
15307 struct alc_spec *spec;
15308 int board_config;
15309 int err;
15310
dc041e0b 15311 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
df694daa
KY
15312 if (spec == NULL)
15313 return -ENOMEM;
15314
f12ab1e0 15315 codec->spec = spec;
df694daa 15316
f5fcc13c
TI
15317 board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
15318 alc861_models,
15319 alc861_cfg_tbl);
9c7f852e 15320
f5fcc13c 15321 if (board_config < 0) {
9a11f1aa
TI
15322 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15323 codec->chip_name);
df694daa
KY
15324 board_config = ALC861_AUTO;
15325 }
15326
cfc9b06f
TI
15327 alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups);
15328
df694daa
KY
15329 if (board_config == ALC861_AUTO) {
15330 /* automatic parse from the BIOS config */
15331 err = alc861_parse_auto_config(codec);
15332 if (err < 0) {
15333 alc_free(codec);
15334 return err;
f12ab1e0 15335 } else if (!err) {
9c7f852e
TI
15336 printk(KERN_INFO
15337 "hda_codec: Cannot set up configuration "
15338 "from BIOS. Using base mode...\n");
df694daa
KY
15339 board_config = ALC861_3ST_DIG;
15340 }
15341 }
15342
680cd536
KK
15343 err = snd_hda_attach_beep_device(codec, 0x23);
15344 if (err < 0) {
15345 alc_free(codec);
15346 return err;
15347 }
15348
df694daa 15349 if (board_config != ALC861_AUTO)
e9c364c0 15350 setup_preset(codec, &alc861_presets[board_config]);
df694daa 15351
df694daa
KY
15352 spec->stream_analog_playback = &alc861_pcm_analog_playback;
15353 spec->stream_analog_capture = &alc861_pcm_analog_capture;
15354
df694daa
KY
15355 spec->stream_digital_playback = &alc861_pcm_digital_playback;
15356 spec->stream_digital_capture = &alc861_pcm_digital_capture;
15357
c7a8eb10
TI
15358 if (!spec->cap_mixer)
15359 set_capture_mixer(codec);
45bdd1c1
TI
15360 set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
15361
2134ea4f
TI
15362 spec->vmaster_nid = 0x03;
15363
df694daa 15364 codec->patch_ops = alc_patch_ops;
c97259df 15365 if (board_config == ALC861_AUTO) {
ae6b813a 15366 spec->init_hook = alc861_auto_init;
c97259df
DC
15367#ifdef CONFIG_SND_HDA_POWER_SAVE
15368 spec->power_hook = alc_power_eapd;
15369#endif
15370 }
cb53c626
TI
15371#ifdef CONFIG_SND_HDA_POWER_SAVE
15372 if (!spec->loopback.amplist)
15373 spec->loopback.amplist = alc861_loopbacks;
15374#endif
ea1fb29a 15375
1da177e4
LT
15376 return 0;
15377}
15378
f32610ed
JS
15379/*
15380 * ALC861-VD support
15381 *
15382 * Based on ALC882
15383 *
15384 * In addition, an independent DAC
15385 */
15386#define ALC861VD_DIGOUT_NID 0x06
15387
15388static hda_nid_t alc861vd_dac_nids[4] = {
15389 /* front, surr, clfe, side surr */
15390 0x02, 0x03, 0x04, 0x05
15391};
15392
15393/* dac_nids for ALC660vd are in a different order - according to
15394 * Realtek's driver.
def319f9 15395 * This should probably result in a different mixer for 6stack models
f32610ed
JS
15396 * of ALC660vd codecs, but for now there is only 3stack mixer
15397 * - and it is the same as in 861vd.
15398 * adc_nids in ALC660vd are (is) the same as in 861vd
15399 */
15400static hda_nid_t alc660vd_dac_nids[3] = {
15401 /* front, rear, clfe, rear_surr */
15402 0x02, 0x04, 0x03
15403};
15404
15405static hda_nid_t alc861vd_adc_nids[1] = {
15406 /* ADC0 */
15407 0x09,
15408};
15409
e1406348
TI
15410static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
15411
f32610ed
JS
15412/* input MUX */
15413/* FIXME: should be a matrix-type input source selection */
15414static struct hda_input_mux alc861vd_capture_source = {
15415 .num_items = 4,
15416 .items = {
15417 { "Mic", 0x0 },
15418 { "Front Mic", 0x1 },
15419 { "Line", 0x2 },
15420 { "CD", 0x4 },
15421 },
15422};
15423
272a527c 15424static struct hda_input_mux alc861vd_dallas_capture_source = {
b419f346 15425 .num_items = 2,
272a527c 15426 .items = {
b419f346
TD
15427 { "Ext Mic", 0x0 },
15428 { "Int Mic", 0x1 },
272a527c
KY
15429 },
15430};
15431
d1a991a6
KY
15432static struct hda_input_mux alc861vd_hp_capture_source = {
15433 .num_items = 2,
15434 .items = {
15435 { "Front Mic", 0x0 },
15436 { "ATAPI Mic", 0x1 },
15437 },
15438};
15439
f32610ed
JS
15440/*
15441 * 2ch mode
15442 */
15443static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
15444 { 2, NULL }
15445};
15446
15447/*
15448 * 6ch mode
15449 */
15450static struct hda_verb alc861vd_6stack_ch6_init[] = {
15451 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15452 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15453 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15454 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15455 { } /* end */
15456};
15457
15458/*
15459 * 8ch mode
15460 */
15461static struct hda_verb alc861vd_6stack_ch8_init[] = {
15462 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15463 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15464 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15465 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15466 { } /* end */
15467};
15468
15469static struct hda_channel_mode alc861vd_6stack_modes[2] = {
15470 { 6, alc861vd_6stack_ch6_init },
15471 { 8, alc861vd_6stack_ch8_init },
15472};
15473
15474static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
15475 {
15476 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15477 .name = "Channel Mode",
15478 .info = alc_ch_mode_info,
15479 .get = alc_ch_mode_get,
15480 .put = alc_ch_mode_put,
15481 },
15482 { } /* end */
15483};
15484
f32610ed
JS
15485/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
15486 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
15487 */
15488static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
15489 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15490 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15491
15492 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15493 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
15494
15495 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
15496 HDA_OUTPUT),
15497 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
15498 HDA_OUTPUT),
15499 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
15500 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
15501
15502 HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
15503 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
15504
15505 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15506
15507 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15508 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15509 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15510
15511 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15512 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15513 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15514
15515 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15516 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15517
15518 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15519 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15520
f32610ed
JS
15521 { } /* end */
15522};
15523
15524static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
15525 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15526 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15527
15528 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15529
15530 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15531 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15532 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15533
15534 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15535 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15536 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15537
15538 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15539 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15540
15541 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15542 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15543
f32610ed
JS
15544 { } /* end */
15545};
15546
bdd148a3
KY
15547static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
15548 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15549 /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
15550 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
15551
15552 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15553
15554 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15555 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15556 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15557
15558 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15559 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15560 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15561
15562 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15563 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15564
15565 { } /* end */
15566};
15567
b419f346
TD
15568/* Pin assignment: Speaker=0x14, HP = 0x15,
15569 * Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
272a527c
KY
15570 */
15571static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
b419f346
TD
15572 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15573 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
272a527c
KY
15574 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15575 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
b419f346
TD
15576 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
15577 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15578 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15579 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
15580 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15581 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
272a527c
KY
15582 { } /* end */
15583};
15584
d1a991a6
KY
15585/* Pin assignment: Speaker=0x14, Line-out = 0x15,
15586 * Front Mic=0x18, ATAPI Mic = 0x19,
15587 */
15588static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
15589 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15590 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15591 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15592 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15593 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15594 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15595 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15596 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
ea1fb29a 15597
d1a991a6
KY
15598 { } /* end */
15599};
15600
f32610ed
JS
15601/*
15602 * generic initialization of ADC, input mixers and output mixers
15603 */
15604static struct hda_verb alc861vd_volume_init_verbs[] = {
15605 /*
15606 * Unmute ADC0 and set the default input to mic-in
15607 */
15608 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15609 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15610
15611 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
15612 * the analog-loopback mixer widget
15613 */
15614 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
15615 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15616 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15617 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15618 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15619 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
f32610ed
JS
15620
15621 /* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
bdd148a3
KY
15622 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15623 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15624 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
f32610ed 15625 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
f32610ed
JS
15626
15627 /*
15628 * Set up output mixers (0x02 - 0x05)
15629 */
15630 /* set vol=0 to output mixers */
15631 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15632 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15633 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15634 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15635
15636 /* set up input amps for analog loopback */
15637 /* Amp Indices: DAC = 0, mixer = 1 */
15638 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15639 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15640 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15641 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15642 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15643 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15644 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15645 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15646
15647 { }
15648};
15649
15650/*
15651 * 3-stack pin configuration:
15652 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
15653 */
15654static struct hda_verb alc861vd_3stack_init_verbs[] = {
15655 /*
15656 * Set pin mode and muting
15657 */
15658 /* set front pin widgets 0x14 for output */
15659 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15660 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15661 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15662
15663 /* Mic (rear) pin: input vref at 80% */
15664 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15665 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15666 /* Front Mic pin: input vref at 80% */
15667 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15668 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15669 /* Line In pin: input */
15670 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15671 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15672 /* Line-2 In: Headphone output (output 0 - 0x0c) */
15673 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15674 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15675 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15676 /* CD pin widget for input */
15677 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15678
15679 { }
15680};
15681
15682/*
15683 * 6-stack pin configuration:
15684 */
15685static struct hda_verb alc861vd_6stack_init_verbs[] = {
15686 /*
15687 * Set pin mode and muting
15688 */
15689 /* set front pin widgets 0x14 for output */
15690 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15691 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15692 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15693
15694 /* Rear Pin: output 1 (0x0d) */
15695 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15696 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15697 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
15698 /* CLFE Pin: output 2 (0x0e) */
15699 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15700 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15701 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
15702 /* Side Pin: output 3 (0x0f) */
15703 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15704 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15705 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
15706
15707 /* Mic (rear) pin: input vref at 80% */
15708 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15709 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15710 /* Front Mic pin: input vref at 80% */
15711 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15712 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15713 /* Line In pin: input */
15714 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15715 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15716 /* Line-2 In: Headphone output (output 0 - 0x0c) */
15717 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15718 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15719 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15720 /* CD pin widget for input */
15721 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15722
15723 { }
15724};
15725
bdd148a3
KY
15726static struct hda_verb alc861vd_eapd_verbs[] = {
15727 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15728 { }
15729};
15730
f9423e7a
KY
15731static struct hda_verb alc660vd_eapd_verbs[] = {
15732 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15733 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
15734 { }
15735};
15736
bdd148a3
KY
15737static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
15738 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15739 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15740 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
15741 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
ea1fb29a 15742 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
bdd148a3
KY
15743 {}
15744};
15745
bdd148a3
KY
15746static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
15747{
15748 unsigned int present;
15749 unsigned char bits;
15750
864f92be 15751 present = snd_hda_jack_detect(codec, 0x18);
47fd830a 15752 bits = present ? HDA_AMP_MUTE : 0;
864f92be 15753
47fd830a
TI
15754 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
15755 HDA_AMP_MUTE, bits);
bdd148a3
KY
15756}
15757
4f5d1706 15758static void alc861vd_lenovo_setup(struct hda_codec *codec)
bdd148a3 15759{
a9fd4f3f 15760 struct alc_spec *spec = codec->spec;
a9fd4f3f
TI
15761 spec->autocfg.hp_pins[0] = 0x1b;
15762 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
15763}
15764
15765static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
15766{
a9fd4f3f 15767 alc_automute_amp(codec);
bdd148a3
KY
15768 alc861vd_lenovo_mic_automute(codec);
15769}
15770
15771static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
15772 unsigned int res)
15773{
15774 switch (res >> 26) {
bdd148a3
KY
15775 case ALC880_MIC_EVENT:
15776 alc861vd_lenovo_mic_automute(codec);
15777 break;
a9fd4f3f
TI
15778 default:
15779 alc_automute_amp_unsol_event(codec, res);
15780 break;
bdd148a3
KY
15781 }
15782}
15783
272a527c
KY
15784static struct hda_verb alc861vd_dallas_verbs[] = {
15785 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15786 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15787 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15788 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15789
15790 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15791 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15792 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15793 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15794 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15795 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15796 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15797 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
ea1fb29a 15798
272a527c
KY
15799 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15800 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15801 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15802 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15803 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15804 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15805 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15806 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15807
15808 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15809 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15810 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15811 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15812 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15813 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15814 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15815 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15816
15817 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15818 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15819 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15820 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15821
15822 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
ea1fb29a 15823 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
272a527c
KY
15824 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15825
15826 { } /* end */
15827};
15828
15829/* toggle speaker-output according to the hp-jack state */
4f5d1706 15830static void alc861vd_dallas_setup(struct hda_codec *codec)
272a527c 15831{
a9fd4f3f 15832 struct alc_spec *spec = codec->spec;
272a527c 15833
a9fd4f3f
TI
15834 spec->autocfg.hp_pins[0] = 0x15;
15835 spec->autocfg.speaker_pins[0] = 0x14;
272a527c
KY
15836}
15837
cb53c626
TI
15838#ifdef CONFIG_SND_HDA_POWER_SAVE
15839#define alc861vd_loopbacks alc880_loopbacks
15840#endif
15841
def319f9 15842/* pcm configuration: identical with ALC880 */
f32610ed
JS
15843#define alc861vd_pcm_analog_playback alc880_pcm_analog_playback
15844#define alc861vd_pcm_analog_capture alc880_pcm_analog_capture
15845#define alc861vd_pcm_digital_playback alc880_pcm_digital_playback
15846#define alc861vd_pcm_digital_capture alc880_pcm_digital_capture
15847
15848/*
15849 * configuration and preset
15850 */
15851static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
15852 [ALC660VD_3ST] = "3stack-660",
983f8ae4 15853 [ALC660VD_3ST_DIG] = "3stack-660-digout",
13c94744 15854 [ALC660VD_ASUS_V1S] = "asus-v1s",
f32610ed
JS
15855 [ALC861VD_3ST] = "3stack",
15856 [ALC861VD_3ST_DIG] = "3stack-digout",
15857 [ALC861VD_6ST_DIG] = "6stack-digout",
bdd148a3 15858 [ALC861VD_LENOVO] = "lenovo",
272a527c 15859 [ALC861VD_DALLAS] = "dallas",
983f8ae4 15860 [ALC861VD_HP] = "hp",
f32610ed
JS
15861 [ALC861VD_AUTO] = "auto",
15862};
15863
15864static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
ac3e3741
TI
15865 SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
15866 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
07e038b3 15867 SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
f8f25ba3 15868 /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
13c94744 15869 SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
6963f84c 15870 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
f32610ed 15871 SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
ac3e3741 15872 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
38baf5ad 15873 /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
ce577e8c 15874 SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
542d7c66 15875 SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
b419f346 15876 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
39c5d41f 15877 SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
dea0a509 15878 SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
625dc0bf 15879 SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
f32610ed
JS
15880 {}
15881};
15882
15883static struct alc_config_preset alc861vd_presets[] = {
15884 [ALC660VD_3ST] = {
15885 .mixers = { alc861vd_3st_mixer },
15886 .init_verbs = { alc861vd_volume_init_verbs,
15887 alc861vd_3stack_init_verbs },
15888 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15889 .dac_nids = alc660vd_dac_nids,
f32610ed
JS
15890 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15891 .channel_mode = alc861vd_3stack_2ch_modes,
15892 .input_mux = &alc861vd_capture_source,
15893 },
6963f84c
MC
15894 [ALC660VD_3ST_DIG] = {
15895 .mixers = { alc861vd_3st_mixer },
15896 .init_verbs = { alc861vd_volume_init_verbs,
15897 alc861vd_3stack_init_verbs },
15898 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15899 .dac_nids = alc660vd_dac_nids,
15900 .dig_out_nid = ALC861VD_DIGOUT_NID,
6963f84c
MC
15901 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15902 .channel_mode = alc861vd_3stack_2ch_modes,
15903 .input_mux = &alc861vd_capture_source,
15904 },
f32610ed
JS
15905 [ALC861VD_3ST] = {
15906 .mixers = { alc861vd_3st_mixer },
15907 .init_verbs = { alc861vd_volume_init_verbs,
15908 alc861vd_3stack_init_verbs },
15909 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15910 .dac_nids = alc861vd_dac_nids,
15911 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15912 .channel_mode = alc861vd_3stack_2ch_modes,
15913 .input_mux = &alc861vd_capture_source,
15914 },
15915 [ALC861VD_3ST_DIG] = {
15916 .mixers = { alc861vd_3st_mixer },
15917 .init_verbs = { alc861vd_volume_init_verbs,
15918 alc861vd_3stack_init_verbs },
15919 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15920 .dac_nids = alc861vd_dac_nids,
15921 .dig_out_nid = ALC861VD_DIGOUT_NID,
15922 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15923 .channel_mode = alc861vd_3stack_2ch_modes,
15924 .input_mux = &alc861vd_capture_source,
15925 },
15926 [ALC861VD_6ST_DIG] = {
15927 .mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
15928 .init_verbs = { alc861vd_volume_init_verbs,
15929 alc861vd_6stack_init_verbs },
15930 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15931 .dac_nids = alc861vd_dac_nids,
15932 .dig_out_nid = ALC861VD_DIGOUT_NID,
15933 .num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
15934 .channel_mode = alc861vd_6stack_modes,
15935 .input_mux = &alc861vd_capture_source,
15936 },
bdd148a3
KY
15937 [ALC861VD_LENOVO] = {
15938 .mixers = { alc861vd_lenovo_mixer },
15939 .init_verbs = { alc861vd_volume_init_verbs,
15940 alc861vd_3stack_init_verbs,
15941 alc861vd_eapd_verbs,
15942 alc861vd_lenovo_unsol_verbs },
15943 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15944 .dac_nids = alc660vd_dac_nids,
bdd148a3
KY
15945 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15946 .channel_mode = alc861vd_3stack_2ch_modes,
15947 .input_mux = &alc861vd_capture_source,
15948 .unsol_event = alc861vd_lenovo_unsol_event,
4f5d1706 15949 .setup = alc861vd_lenovo_setup,
a9fd4f3f 15950 .init_hook = alc861vd_lenovo_init_hook,
bdd148a3 15951 },
272a527c
KY
15952 [ALC861VD_DALLAS] = {
15953 .mixers = { alc861vd_dallas_mixer },
15954 .init_verbs = { alc861vd_dallas_verbs },
15955 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15956 .dac_nids = alc861vd_dac_nids,
272a527c
KY
15957 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15958 .channel_mode = alc861vd_3stack_2ch_modes,
15959 .input_mux = &alc861vd_dallas_capture_source,
a9fd4f3f 15960 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
15961 .setup = alc861vd_dallas_setup,
15962 .init_hook = alc_automute_amp,
d1a991a6
KY
15963 },
15964 [ALC861VD_HP] = {
15965 .mixers = { alc861vd_hp_mixer },
15966 .init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
15967 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15968 .dac_nids = alc861vd_dac_nids,
d1a991a6 15969 .dig_out_nid = ALC861VD_DIGOUT_NID,
d1a991a6
KY
15970 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15971 .channel_mode = alc861vd_3stack_2ch_modes,
15972 .input_mux = &alc861vd_hp_capture_source,
a9fd4f3f 15973 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
15974 .setup = alc861vd_dallas_setup,
15975 .init_hook = alc_automute_amp,
ea1fb29a 15976 },
13c94744
TI
15977 [ALC660VD_ASUS_V1S] = {
15978 .mixers = { alc861vd_lenovo_mixer },
15979 .init_verbs = { alc861vd_volume_init_verbs,
15980 alc861vd_3stack_init_verbs,
15981 alc861vd_eapd_verbs,
15982 alc861vd_lenovo_unsol_verbs },
15983 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15984 .dac_nids = alc660vd_dac_nids,
15985 .dig_out_nid = ALC861VD_DIGOUT_NID,
15986 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15987 .channel_mode = alc861vd_3stack_2ch_modes,
15988 .input_mux = &alc861vd_capture_source,
15989 .unsol_event = alc861vd_lenovo_unsol_event,
4f5d1706 15990 .setup = alc861vd_lenovo_setup,
a9fd4f3f 15991 .init_hook = alc861vd_lenovo_init_hook,
13c94744 15992 },
f32610ed
JS
15993};
15994
15995/*
15996 * BIOS auto configuration
15997 */
05f5f477
TI
15998static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
15999 const struct auto_pin_cfg *cfg)
16000{
6227cdce 16001 return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0);
05f5f477
TI
16002}
16003
16004
f32610ed
JS
16005static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
16006 hda_nid_t nid, int pin_type, int dac_idx)
16007{
f6c7e546 16008 alc_set_pin_output(codec, nid, pin_type);
f32610ed
JS
16009}
16010
16011static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
16012{
16013 struct alc_spec *spec = codec->spec;
16014 int i;
16015
16016 for (i = 0; i <= HDA_SIDE; i++) {
16017 hda_nid_t nid = spec->autocfg.line_out_pins[i];
baba8ee9 16018 int pin_type = get_pin_type(spec->autocfg.line_out_type);
f32610ed
JS
16019 if (nid)
16020 alc861vd_auto_set_output_and_unmute(codec, nid,
baba8ee9 16021 pin_type, i);
f32610ed
JS
16022 }
16023}
16024
16025
16026static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
16027{
16028 struct alc_spec *spec = codec->spec;
16029 hda_nid_t pin;
16030
16031 pin = spec->autocfg.hp_pins[0];
def319f9 16032 if (pin) /* connect to front and use dac 0 */
f32610ed 16033 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
f6c7e546
TI
16034 pin = spec->autocfg.speaker_pins[0];
16035 if (pin)
16036 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
f32610ed
JS
16037}
16038
f32610ed
JS
16039#define ALC861VD_PIN_CD_NID ALC880_PIN_CD_NID
16040
16041static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
16042{
16043 struct alc_spec *spec = codec->spec;
16044 int i;
16045
16046 for (i = 0; i < AUTO_PIN_LAST; i++) {
16047 hda_nid_t nid = spec->autocfg.input_pins[i];
05f5f477 16048 if (alc_is_input_pin(codec, nid)) {
23f0c048 16049 alc_set_input_pin(codec, nid, i);
e82c025b
TI
16050 if (nid != ALC861VD_PIN_CD_NID &&
16051 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
f32610ed
JS
16052 snd_hda_codec_write(codec, nid, 0,
16053 AC_VERB_SET_AMP_GAIN_MUTE,
16054 AMP_OUT_MUTE);
16055 }
16056 }
16057}
16058
f511b01c
TI
16059#define alc861vd_auto_init_input_src alc882_auto_init_input_src
16060
f32610ed
JS
16061#define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02)
16062#define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c)
16063
16064/* add playback controls from the parsed DAC table */
16065/* Based on ALC880 version. But ALC861VD has separate,
16066 * different NIDs for mute/unmute switch and volume control */
16067static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
16068 const struct auto_pin_cfg *cfg)
16069{
f32610ed
JS
16070 static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
16071 hda_nid_t nid_v, nid_s;
16072 int i, err;
16073
16074 for (i = 0; i < cfg->line_outs; i++) {
f12ab1e0 16075 if (!spec->multiout.dac_nids[i])
f32610ed
JS
16076 continue;
16077 nid_v = alc861vd_idx_to_mixer_vol(
16078 alc880_dac_to_idx(
16079 spec->multiout.dac_nids[i]));
16080 nid_s = alc861vd_idx_to_mixer_switch(
16081 alc880_dac_to_idx(
16082 spec->multiout.dac_nids[i]));
16083
16084 if (i == 2) {
16085 /* Center/LFE */
0afe5f89
TI
16086 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16087 "Center",
f12ab1e0
TI
16088 HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
16089 HDA_OUTPUT));
16090 if (err < 0)
f32610ed 16091 return err;
0afe5f89
TI
16092 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16093 "LFE",
f12ab1e0
TI
16094 HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
16095 HDA_OUTPUT));
16096 if (err < 0)
f32610ed 16097 return err;
0afe5f89
TI
16098 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16099 "Center",
f12ab1e0
TI
16100 HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
16101 HDA_INPUT));
16102 if (err < 0)
f32610ed 16103 return err;
0afe5f89
TI
16104 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16105 "LFE",
f12ab1e0
TI
16106 HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
16107 HDA_INPUT));
16108 if (err < 0)
f32610ed
JS
16109 return err;
16110 } else {
a4fcd491
TI
16111 const char *pfx;
16112 if (cfg->line_outs == 1 &&
16113 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
16114 if (!cfg->hp_pins)
16115 pfx = "Speaker";
16116 else
16117 pfx = "PCM";
16118 } else
16119 pfx = chname[i];
0afe5f89 16120 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
f12ab1e0
TI
16121 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
16122 HDA_OUTPUT));
16123 if (err < 0)
f32610ed 16124 return err;
a4fcd491
TI
16125 if (cfg->line_outs == 1 &&
16126 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
16127 pfx = "Speaker";
0afe5f89 16128 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
bdd148a3 16129 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
f12ab1e0
TI
16130 HDA_INPUT));
16131 if (err < 0)
f32610ed
JS
16132 return err;
16133 }
16134 }
16135 return 0;
16136}
16137
16138/* add playback controls for speaker and HP outputs */
16139/* Based on ALC880 version. But ALC861VD has separate,
16140 * different NIDs for mute/unmute switch and volume control */
16141static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
16142 hda_nid_t pin, const char *pfx)
16143{
16144 hda_nid_t nid_v, nid_s;
16145 int err;
f32610ed 16146
f12ab1e0 16147 if (!pin)
f32610ed
JS
16148 return 0;
16149
16150 if (alc880_is_fixed_pin(pin)) {
16151 nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
16152 /* specify the DAC as the extra output */
f12ab1e0 16153 if (!spec->multiout.hp_nid)
f32610ed
JS
16154 spec->multiout.hp_nid = nid_v;
16155 else
16156 spec->multiout.extra_out_nid[0] = nid_v;
16157 /* control HP volume/switch on the output mixer amp */
16158 nid_v = alc861vd_idx_to_mixer_vol(
16159 alc880_fixed_pin_idx(pin));
16160 nid_s = alc861vd_idx_to_mixer_switch(
16161 alc880_fixed_pin_idx(pin));
16162
0afe5f89 16163 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
f12ab1e0
TI
16164 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
16165 if (err < 0)
f32610ed 16166 return err;
0afe5f89 16167 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
f12ab1e0
TI
16168 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
16169 if (err < 0)
f32610ed
JS
16170 return err;
16171 } else if (alc880_is_multi_pin(pin)) {
16172 /* set manual connection */
16173 /* we have only a switch on HP-out PIN */
0afe5f89 16174 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
f12ab1e0
TI
16175 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
16176 if (err < 0)
f32610ed
JS
16177 return err;
16178 }
16179 return 0;
16180}
16181
16182/* parse the BIOS configuration and set up the alc_spec
16183 * return 1 if successful, 0 if the proper config is not found,
16184 * or a negative error code
16185 * Based on ALC880 version - had to change it to override
16186 * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
16187static int alc861vd_parse_auto_config(struct hda_codec *codec)
16188{
16189 struct alc_spec *spec = codec->spec;
16190 int err;
16191 static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
16192
f12ab1e0
TI
16193 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
16194 alc861vd_ignore);
16195 if (err < 0)
f32610ed 16196 return err;
f12ab1e0 16197 if (!spec->autocfg.line_outs)
f32610ed
JS
16198 return 0; /* can't find valid BIOS pin config */
16199
f12ab1e0
TI
16200 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
16201 if (err < 0)
16202 return err;
16203 err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
16204 if (err < 0)
16205 return err;
16206 err = alc861vd_auto_create_extra_out(spec,
16207 spec->autocfg.speaker_pins[0],
16208 "Speaker");
16209 if (err < 0)
16210 return err;
16211 err = alc861vd_auto_create_extra_out(spec,
16212 spec->autocfg.hp_pins[0],
16213 "Headphone");
16214 if (err < 0)
16215 return err;
05f5f477 16216 err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 16217 if (err < 0)
f32610ed
JS
16218 return err;
16219
16220 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
16221
0852d7a6 16222 if (spec->autocfg.dig_outs)
f32610ed
JS
16223 spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID;
16224
603c4019 16225 if (spec->kctls.list)
d88897ea 16226 add_mixer(spec, spec->kctls.list);
f32610ed 16227
d88897ea 16228 add_verb(spec, alc861vd_volume_init_verbs);
f32610ed
JS
16229
16230 spec->num_mux_defs = 1;
61b9b9b1 16231 spec->input_mux = &spec->private_imux[0];
f32610ed 16232
776e184e
TI
16233 err = alc_auto_add_mic_boost(codec);
16234 if (err < 0)
16235 return err;
16236
6227cdce 16237 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4a79ba34 16238
f32610ed
JS
16239 return 1;
16240}
16241
16242/* additional initialization for auto-configuration model */
16243static void alc861vd_auto_init(struct hda_codec *codec)
16244{
f6c7e546 16245 struct alc_spec *spec = codec->spec;
f32610ed
JS
16246 alc861vd_auto_init_multi_out(codec);
16247 alc861vd_auto_init_hp_out(codec);
16248 alc861vd_auto_init_analog_input(codec);
f511b01c 16249 alc861vd_auto_init_input_src(codec);
f6c7e546 16250 if (spec->unsol_event)
7fb0d78f 16251 alc_inithook(codec);
f32610ed
JS
16252}
16253
f8f25ba3
TI
16254enum {
16255 ALC660VD_FIX_ASUS_GPIO1
16256};
16257
16258/* reset GPIO1 */
16259static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
16260 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
16261 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
16262 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
16263 { }
16264};
16265
16266static const struct alc_fixup alc861vd_fixups[] = {
16267 [ALC660VD_FIX_ASUS_GPIO1] = {
16268 .verbs = alc660vd_fix_asus_gpio1_verbs,
16269 },
16270};
16271
16272static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
16273 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
16274 {}
16275};
16276
f32610ed
JS
16277static int patch_alc861vd(struct hda_codec *codec)
16278{
16279 struct alc_spec *spec;
16280 int err, board_config;
16281
16282 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
16283 if (spec == NULL)
16284 return -ENOMEM;
16285
16286 codec->spec = spec;
16287
16288 board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
16289 alc861vd_models,
16290 alc861vd_cfg_tbl);
16291
16292 if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
9a11f1aa
TI
16293 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
16294 codec->chip_name);
f32610ed
JS
16295 board_config = ALC861VD_AUTO;
16296 }
16297
f8f25ba3
TI
16298 alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups);
16299
f32610ed
JS
16300 if (board_config == ALC861VD_AUTO) {
16301 /* automatic parse from the BIOS config */
16302 err = alc861vd_parse_auto_config(codec);
16303 if (err < 0) {
16304 alc_free(codec);
16305 return err;
f12ab1e0 16306 } else if (!err) {
f32610ed
JS
16307 printk(KERN_INFO
16308 "hda_codec: Cannot set up configuration "
16309 "from BIOS. Using base mode...\n");
16310 board_config = ALC861VD_3ST;
16311 }
16312 }
16313
680cd536
KK
16314 err = snd_hda_attach_beep_device(codec, 0x23);
16315 if (err < 0) {
16316 alc_free(codec);
16317 return err;
16318 }
16319
f32610ed 16320 if (board_config != ALC861VD_AUTO)
e9c364c0 16321 setup_preset(codec, &alc861vd_presets[board_config]);
f32610ed 16322
2f893286 16323 if (codec->vendor_id == 0x10ec0660) {
f9423e7a 16324 /* always turn on EAPD */
d88897ea 16325 add_verb(spec, alc660vd_eapd_verbs);
2f893286
KY
16326 }
16327
f32610ed
JS
16328 spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
16329 spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
16330
f32610ed
JS
16331 spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
16332 spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
16333
dd704698
TI
16334 if (!spec->adc_nids) {
16335 spec->adc_nids = alc861vd_adc_nids;
16336 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
16337 }
16338 if (!spec->capsrc_nids)
16339 spec->capsrc_nids = alc861vd_capsrc_nids;
f32610ed 16340
b59bdf3b 16341 set_capture_mixer(codec);
45bdd1c1 16342 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
f32610ed 16343
2134ea4f
TI
16344 spec->vmaster_nid = 0x02;
16345
f32610ed
JS
16346 codec->patch_ops = alc_patch_ops;
16347
16348 if (board_config == ALC861VD_AUTO)
16349 spec->init_hook = alc861vd_auto_init;
cb53c626
TI
16350#ifdef CONFIG_SND_HDA_POWER_SAVE
16351 if (!spec->loopback.amplist)
16352 spec->loopback.amplist = alc861vd_loopbacks;
16353#endif
f32610ed
JS
16354
16355 return 0;
16356}
16357
bc9f98a9
KY
16358/*
16359 * ALC662 support
16360 *
16361 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
16362 * configuration. Each pin widget can choose any input DACs and a mixer.
16363 * Each ADC is connected from a mixer of all inputs. This makes possible
16364 * 6-channel independent captures.
16365 *
16366 * In addition, an independent DAC for the multi-playback (not used in this
16367 * driver yet).
16368 */
16369#define ALC662_DIGOUT_NID 0x06
16370#define ALC662_DIGIN_NID 0x0a
16371
16372static hda_nid_t alc662_dac_nids[4] = {
16373 /* front, rear, clfe, rear_surr */
16374 0x02, 0x03, 0x04
16375};
16376
622e84cd
KY
16377static hda_nid_t alc272_dac_nids[2] = {
16378 0x02, 0x03
16379};
16380
b59bdf3b 16381static hda_nid_t alc662_adc_nids[2] = {
bc9f98a9 16382 /* ADC1-2 */
b59bdf3b 16383 0x09, 0x08
bc9f98a9 16384};
e1406348 16385
622e84cd
KY
16386static hda_nid_t alc272_adc_nids[1] = {
16387 /* ADC1-2 */
16388 0x08,
16389};
16390
b59bdf3b 16391static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
622e84cd
KY
16392static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
16393
e1406348 16394
bc9f98a9
KY
16395/* input MUX */
16396/* FIXME: should be a matrix-type input source selection */
bc9f98a9
KY
16397static struct hda_input_mux alc662_capture_source = {
16398 .num_items = 4,
16399 .items = {
16400 { "Mic", 0x0 },
16401 { "Front Mic", 0x1 },
16402 { "Line", 0x2 },
16403 { "CD", 0x4 },
16404 },
16405};
16406
16407static struct hda_input_mux alc662_lenovo_101e_capture_source = {
16408 .num_items = 2,
16409 .items = {
16410 { "Mic", 0x1 },
16411 { "Line", 0x2 },
16412 },
16413};
291702f0 16414
6dda9f4a
KY
16415static struct hda_input_mux alc663_capture_source = {
16416 .num_items = 3,
16417 .items = {
16418 { "Mic", 0x0 },
16419 { "Front Mic", 0x1 },
16420 { "Line", 0x2 },
16421 },
16422};
16423
4f5d1706 16424#if 0 /* set to 1 for testing other input sources below */
9541ba1d
CP
16425static struct hda_input_mux alc272_nc10_capture_source = {
16426 .num_items = 16,
16427 .items = {
16428 { "Autoselect Mic", 0x0 },
16429 { "Internal Mic", 0x1 },
16430 { "In-0x02", 0x2 },
16431 { "In-0x03", 0x3 },
16432 { "In-0x04", 0x4 },
16433 { "In-0x05", 0x5 },
16434 { "In-0x06", 0x6 },
16435 { "In-0x07", 0x7 },
16436 { "In-0x08", 0x8 },
16437 { "In-0x09", 0x9 },
16438 { "In-0x0a", 0x0a },
16439 { "In-0x0b", 0x0b },
16440 { "In-0x0c", 0x0c },
16441 { "In-0x0d", 0x0d },
16442 { "In-0x0e", 0x0e },
16443 { "In-0x0f", 0x0f },
16444 },
16445};
16446#endif
16447
bc9f98a9
KY
16448/*
16449 * 2ch mode
16450 */
16451static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
16452 { 2, NULL }
16453};
16454
16455/*
16456 * 2ch mode
16457 */
16458static struct hda_verb alc662_3ST_ch2_init[] = {
16459 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
16460 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16461 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
16462 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16463 { } /* end */
16464};
16465
16466/*
16467 * 6ch mode
16468 */
16469static struct hda_verb alc662_3ST_ch6_init[] = {
16470 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16471 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16472 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
16473 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16474 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16475 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
16476 { } /* end */
16477};
16478
16479static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
16480 { 2, alc662_3ST_ch2_init },
16481 { 6, alc662_3ST_ch6_init },
16482};
16483
16484/*
16485 * 2ch mode
16486 */
16487static struct hda_verb alc662_sixstack_ch6_init[] = {
16488 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16489 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16490 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16491 { } /* end */
16492};
16493
16494/*
16495 * 6ch mode
16496 */
16497static struct hda_verb alc662_sixstack_ch8_init[] = {
16498 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16499 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16500 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16501 { } /* end */
16502};
16503
16504static struct hda_channel_mode alc662_5stack_modes[2] = {
16505 { 2, alc662_sixstack_ch6_init },
16506 { 6, alc662_sixstack_ch8_init },
16507};
16508
16509/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
16510 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
16511 */
16512
16513static struct snd_kcontrol_new alc662_base_mixer[] = {
16514 /* output mixer control */
16515 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
7055ad8a 16516 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
bc9f98a9 16517 HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
7055ad8a 16518 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
bc9f98a9
KY
16519 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16520 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
7055ad8a
HRK
16521 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16522 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
bc9f98a9
KY
16523 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16524
16525 /*Input mixer control */
16526 HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
16527 HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
16528 HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
16529 HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
16530 HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
16531 HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
16532 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
16533 HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
bc9f98a9
KY
16534 { } /* end */
16535};
16536
16537static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
16538 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
7055ad8a 16539 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
bc9f98a9
KY
16540 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16541 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16542 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16543 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16544 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16545 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16546 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16547 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16548 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
bc9f98a9
KY
16549 { } /* end */
16550};
16551
16552static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
16553 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
7055ad8a 16554 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
bc9f98a9 16555 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
7055ad8a 16556 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
bc9f98a9
KY
16557 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16558 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
7055ad8a
HRK
16559 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16560 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
bc9f98a9
KY
16561 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16562 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16563 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16564 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16565 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16566 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16567 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16568 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16569 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
bc9f98a9
KY
16570 { } /* end */
16571};
16572
16573static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
16574 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16575 HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
86cd9298
TI
16576 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16577 HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
bc9f98a9
KY
16578 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16579 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16580 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16581 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16582 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
bc9f98a9
KY
16583 { } /* end */
16584};
16585
291702f0 16586static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
42171c17
TI
16587 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16588 ALC262_HIPPO_MASTER_SWITCH,
291702f0
KY
16589
16590 HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
16591 HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16592 HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16593
16594 HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
16595 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16596 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16597 { } /* end */
16598};
16599
8c427226 16600static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
42171c17
TI
16601 ALC262_HIPPO_MASTER_SWITCH,
16602 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
8c427226 16603 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
8c427226
KY
16604 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16605 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
8c427226
KY
16606 HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
16607 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16608 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16609 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16610 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16611 { } /* end */
16612};
16613
f1d4e28b
KY
16614static struct hda_bind_ctls alc663_asus_bind_master_vol = {
16615 .ops = &snd_hda_bind_vol,
16616 .values = {
16617 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16618 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
16619 0
16620 },
16621};
16622
16623static struct hda_bind_ctls alc663_asus_one_bind_switch = {
16624 .ops = &snd_hda_bind_sw,
16625 .values = {
16626 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16627 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16628 0
16629 },
16630};
16631
6dda9f4a 16632static struct snd_kcontrol_new alc663_m51va_mixer[] = {
f1d4e28b
KY
16633 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16634 HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
16635 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16636 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16637 { } /* end */
16638};
16639
16640static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
16641 .ops = &snd_hda_bind_sw,
16642 .values = {
16643 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16644 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16645 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16646 0
16647 },
16648};
16649
16650static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
16651 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16652 HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
16653 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16654 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16655 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16656 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16657
16658 { } /* end */
16659};
16660
16661static struct hda_bind_ctls alc663_asus_four_bind_switch = {
16662 .ops = &snd_hda_bind_sw,
16663 .values = {
16664 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16665 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16666 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16667 0
16668 },
16669};
16670
16671static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
16672 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16673 HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
16674 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16675 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16676 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16677 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16678 { } /* end */
16679};
16680
16681static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
6dda9f4a
KY
16682 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16683 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
f1d4e28b
KY
16684 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16685 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16686 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16687 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16688 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16689 { } /* end */
16690};
16691
16692static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
16693 .ops = &snd_hda_bind_vol,
16694 .values = {
16695 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16696 HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
16697 0
16698 },
16699};
16700
16701static struct hda_bind_ctls alc663_asus_two_bind_switch = {
16702 .ops = &snd_hda_bind_sw,
16703 .values = {
16704 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16705 HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
16706 0
16707 },
16708};
16709
16710static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
16711 HDA_BIND_VOL("Master Playback Volume",
16712 &alc663_asus_two_bind_master_vol),
16713 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16714 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
6dda9f4a
KY
16715 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16716 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16717 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
f1d4e28b
KY
16718 { } /* end */
16719};
16720
16721static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
16722 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16723 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16724 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16725 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16726 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16727 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
6dda9f4a
KY
16728 { } /* end */
16729};
16730
16731static struct snd_kcontrol_new alc663_g71v_mixer[] = {
16732 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16733 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16734 HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16735 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16736 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16737
16738 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16739 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16740 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16741 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16742 { } /* end */
16743};
16744
16745static struct snd_kcontrol_new alc663_g50v_mixer[] = {
16746 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16747 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16748 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16749
16750 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16751 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16752 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16753 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16754 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16755 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16756 { } /* end */
16757};
16758
ebb83eeb
KY
16759static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
16760 .ops = &snd_hda_bind_sw,
16761 .values = {
16762 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16763 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16764 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
16765 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16766 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16767 0
16768 },
16769};
16770
16771static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
16772 .ops = &snd_hda_bind_sw,
16773 .values = {
16774 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16775 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
16776 0
16777 },
16778};
16779
16780static struct snd_kcontrol_new alc663_mode7_mixer[] = {
16781 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
16782 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
16783 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
16784 HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16785 HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16786 HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16787 HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16788 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16789 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16790 { } /* end */
16791};
16792
16793static struct snd_kcontrol_new alc663_mode8_mixer[] = {
16794 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
16795 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
16796 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
16797 HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16798 HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16799 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16800 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16801 { } /* end */
16802};
16803
16804
bc9f98a9
KY
16805static struct snd_kcontrol_new alc662_chmode_mixer[] = {
16806 {
16807 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
16808 .name = "Channel Mode",
16809 .info = alc_ch_mode_info,
16810 .get = alc_ch_mode_get,
16811 .put = alc_ch_mode_put,
16812 },
16813 { } /* end */
16814};
16815
16816static struct hda_verb alc662_init_verbs[] = {
16817 /* ADC: mute amp left and right */
16818 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16819 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
bc9f98a9 16820
b60dd394
KY
16821 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16822 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16823 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16824 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16825 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16826 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
bc9f98a9
KY
16827
16828 /* Front Pin: output 0 (0x0c) */
16829 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16830 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16831
16832 /* Rear Pin: output 1 (0x0d) */
16833 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16834 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16835
16836 /* CLFE Pin: output 2 (0x0e) */
16837 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16838 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16839
16840 /* Mic (rear) pin: input vref at 80% */
16841 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16842 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16843 /* Front Mic pin: input vref at 80% */
16844 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16845 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16846 /* Line In pin: input */
16847 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16848 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16849 /* Line-2 In: Headphone output (output 0 - 0x0c) */
16850 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16851 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16852 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16853 /* CD pin widget for input */
16854 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16855
16856 /* FIXME: use matrix-type input source selection */
16857 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
16858 /* Input mixer */
16859 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
291702f0 16860 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6dda9f4a
KY
16861
16862 /* always trun on EAPD */
16863 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16864 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16865
bc9f98a9
KY
16866 { }
16867};
16868
cec27c89
KY
16869static struct hda_verb alc663_init_verbs[] = {
16870 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16871 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16872 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16873 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16874 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16875 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16876 { }
16877};
16878
16879static struct hda_verb alc272_init_verbs[] = {
16880 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16881 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16882 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16883 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16884 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16885 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16886 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16887 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16888 { }
16889};
16890
bc9f98a9
KY
16891static struct hda_verb alc662_sue_init_verbs[] = {
16892 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16893 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
291702f0
KY
16894 {}
16895};
16896
16897static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
16898 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16899 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16900 {}
bc9f98a9
KY
16901};
16902
8c427226
KY
16903/* Set Unsolicited Event*/
16904static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
16905 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16906 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16907 {}
16908};
16909
6dda9f4a 16910static struct hda_verb alc663_m51va_init_verbs[] = {
f1d4e28b
KY
16911 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16912 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6dda9f4a
KY
16913 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16914 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
f1d4e28b
KY
16915 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16916 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16917 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16918 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16919 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16920 {}
16921};
16922
16923static struct hda_verb alc663_21jd_amic_init_verbs[] = {
16924 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16925 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16926 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16927 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16928 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16929 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16930 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16931 {}
16932};
16933
16934static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
16935 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16936 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16937 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16938 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
16939 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16940 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16941 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16942 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16943 {}
16944};
6dda9f4a 16945
f1d4e28b
KY
16946static struct hda_verb alc663_15jd_amic_init_verbs[] = {
16947 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16948 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16949 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16950 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16951 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16952 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16953 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16954 {}
16955};
6dda9f4a 16956
f1d4e28b
KY
16957static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
16958 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16959 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16960 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16961 {0x21, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
16962 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16963 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16964 {0x15, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
16965 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16966 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6dda9f4a
KY
16967 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16968 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
f1d4e28b
KY
16969 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16970 {}
16971};
16972
16973static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
16974 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16975 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16976 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16977 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16978 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16979 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16980 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16981 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16982 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16983 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16984 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16985 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6dda9f4a
KY
16986 {}
16987};
16988
16989static struct hda_verb alc663_g71v_init_verbs[] = {
16990 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16991 /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
16992 /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
16993
16994 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16995 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16996 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
16997
16998 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16999 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
17000 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17001 {}
17002};
17003
17004static struct hda_verb alc663_g50v_init_verbs[] = {
17005 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17006 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17007 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
17008
17009 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17010 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17011 {}
17012};
17013
f1d4e28b
KY
17014static struct hda_verb alc662_ecs_init_verbs[] = {
17015 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
17016 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17017 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17018 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17019 {}
17020};
17021
622e84cd
KY
17022static struct hda_verb alc272_dell_zm1_init_verbs[] = {
17023 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17024 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17025 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17026 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17027 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17028 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17029 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17030 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17031 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17032 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17033 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17034 {}
17035};
17036
17037static struct hda_verb alc272_dell_init_verbs[] = {
17038 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17039 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17040 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17041 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17042 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17043 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17044 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17045 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17046 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17047 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17048 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17049 {}
17050};
17051
ebb83eeb
KY
17052static struct hda_verb alc663_mode7_init_verbs[] = {
17053 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17054 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17055 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17056 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17057 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17058 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17059 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
17060 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17061 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17062 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17063 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17064 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17065 {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17066 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17067 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17068 {}
17069};
17070
17071static struct hda_verb alc663_mode8_init_verbs[] = {
17072 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17073 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17074 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17075 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
17076 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17077 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17078 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17079 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17080 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17081 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17082 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17083 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17084 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17085 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17086 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17087 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17088 {}
17089};
17090
f1d4e28b
KY
17091static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
17092 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
17093 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
17094 { } /* end */
17095};
17096
622e84cd
KY
17097static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
17098 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
17099 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
17100 { } /* end */
17101};
17102
bc9f98a9
KY
17103static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
17104{
17105 unsigned int present;
f12ab1e0 17106 unsigned char bits;
bc9f98a9 17107
864f92be 17108 present = snd_hda_jack_detect(codec, 0x14);
47fd830a 17109 bits = present ? HDA_AMP_MUTE : 0;
864f92be 17110
47fd830a
TI
17111 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17112 HDA_AMP_MUTE, bits);
bc9f98a9
KY
17113}
17114
17115static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
17116{
17117 unsigned int present;
f12ab1e0 17118 unsigned char bits;
bc9f98a9 17119
864f92be 17120 present = snd_hda_jack_detect(codec, 0x1b);
47fd830a 17121 bits = present ? HDA_AMP_MUTE : 0;
864f92be 17122
47fd830a
TI
17123 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17124 HDA_AMP_MUTE, bits);
17125 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17126 HDA_AMP_MUTE, bits);
bc9f98a9
KY
17127}
17128
17129static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
17130 unsigned int res)
17131{
17132 if ((res >> 26) == ALC880_HP_EVENT)
17133 alc662_lenovo_101e_all_automute(codec);
17134 if ((res >> 26) == ALC880_FRONT_EVENT)
17135 alc662_lenovo_101e_ispeaker_automute(codec);
17136}
17137
291702f0
KY
17138/* unsolicited event for HP jack sensing */
17139static void alc662_eeepc_unsol_event(struct hda_codec *codec,
17140 unsigned int res)
17141{
291702f0 17142 if ((res >> 26) == ALC880_MIC_EVENT)
4f5d1706 17143 alc_mic_automute(codec);
42171c17
TI
17144 else
17145 alc262_hippo_unsol_event(codec, res);
291702f0
KY
17146}
17147
4f5d1706
TI
17148static void alc662_eeepc_setup(struct hda_codec *codec)
17149{
17150 struct alc_spec *spec = codec->spec;
17151
17152 alc262_hippo1_setup(codec);
17153 spec->ext_mic.pin = 0x18;
17154 spec->ext_mic.mux_idx = 0;
17155 spec->int_mic.pin = 0x19;
17156 spec->int_mic.mux_idx = 1;
17157 spec->auto_mic = 1;
17158}
17159
291702f0
KY
17160static void alc662_eeepc_inithook(struct hda_codec *codec)
17161{
4f5d1706
TI
17162 alc262_hippo_automute(codec);
17163 alc_mic_automute(codec);
291702f0
KY
17164}
17165
4f5d1706 17166static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
8c427226 17167{
42171c17
TI
17168 struct alc_spec *spec = codec->spec;
17169
17170 spec->autocfg.hp_pins[0] = 0x14;
17171 spec->autocfg.speaker_pins[0] = 0x1b;
8c427226
KY
17172}
17173
4f5d1706
TI
17174#define alc662_eeepc_ep20_inithook alc262_hippo_master_update
17175
6dda9f4a
KY
17176static void alc663_m51va_speaker_automute(struct hda_codec *codec)
17177{
17178 unsigned int present;
17179 unsigned char bits;
17180
864f92be 17181 present = snd_hda_jack_detect(codec, 0x21);
6dda9f4a 17182 bits = present ? HDA_AMP_MUTE : 0;
f1d4e28b 17183 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 17184 HDA_AMP_MUTE, bits);
f1d4e28b 17185 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 17186 HDA_AMP_MUTE, bits);
f1d4e28b
KY
17187}
17188
17189static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
17190{
17191 unsigned int present;
17192 unsigned char bits;
17193
864f92be 17194 present = snd_hda_jack_detect(codec, 0x21);
f1d4e28b
KY
17195 bits = present ? HDA_AMP_MUTE : 0;
17196 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 17197 HDA_AMP_MUTE, bits);
f1d4e28b 17198 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 17199 HDA_AMP_MUTE, bits);
f1d4e28b 17200 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
5dbd5ec6 17201 HDA_AMP_MUTE, bits);
f1d4e28b 17202 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
5dbd5ec6 17203 HDA_AMP_MUTE, bits);
f1d4e28b
KY
17204}
17205
17206static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
17207{
17208 unsigned int present;
17209 unsigned char bits;
17210
864f92be 17211 present = snd_hda_jack_detect(codec, 0x15);
f1d4e28b
KY
17212 bits = present ? HDA_AMP_MUTE : 0;
17213 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 17214 HDA_AMP_MUTE, bits);
f1d4e28b 17215 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 17216 HDA_AMP_MUTE, bits);
f1d4e28b 17217 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
5dbd5ec6 17218 HDA_AMP_MUTE, bits);
f1d4e28b 17219 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
5dbd5ec6 17220 HDA_AMP_MUTE, bits);
f1d4e28b
KY
17221}
17222
17223static void alc662_f5z_speaker_automute(struct hda_codec *codec)
17224{
17225 unsigned int present;
17226 unsigned char bits;
17227
864f92be 17228 present = snd_hda_jack_detect(codec, 0x1b);
f1d4e28b
KY
17229 bits = present ? 0 : PIN_OUT;
17230 snd_hda_codec_write(codec, 0x14, 0,
17231 AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
17232}
17233
17234static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
17235{
17236 unsigned int present1, present2;
17237
864f92be
WF
17238 present1 = snd_hda_jack_detect(codec, 0x21);
17239 present2 = snd_hda_jack_detect(codec, 0x15);
f1d4e28b
KY
17240
17241 if (present1 || present2) {
17242 snd_hda_codec_write_cache(codec, 0x14, 0,
17243 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17244 } else {
17245 snd_hda_codec_write_cache(codec, 0x14, 0,
17246 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17247 }
17248}
17249
17250static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
17251{
17252 unsigned int present1, present2;
17253
864f92be
WF
17254 present1 = snd_hda_jack_detect(codec, 0x1b);
17255 present2 = snd_hda_jack_detect(codec, 0x15);
f1d4e28b
KY
17256
17257 if (present1 || present2) {
17258 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 17259 HDA_AMP_MUTE, HDA_AMP_MUTE);
f1d4e28b 17260 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 17261 HDA_AMP_MUTE, HDA_AMP_MUTE);
f1d4e28b
KY
17262 } else {
17263 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 17264 HDA_AMP_MUTE, 0);
f1d4e28b 17265 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 17266 HDA_AMP_MUTE, 0);
f1d4e28b 17267 }
6dda9f4a
KY
17268}
17269
ebb83eeb
KY
17270static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
17271{
17272 unsigned int present1, present2;
17273
17274 present1 = snd_hda_codec_read(codec, 0x1b, 0,
17275 AC_VERB_GET_PIN_SENSE, 0)
17276 & AC_PINSENSE_PRESENCE;
17277 present2 = snd_hda_codec_read(codec, 0x21, 0,
17278 AC_VERB_GET_PIN_SENSE, 0)
17279 & AC_PINSENSE_PRESENCE;
17280
17281 if (present1 || present2) {
17282 snd_hda_codec_write_cache(codec, 0x14, 0,
17283 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17284 snd_hda_codec_write_cache(codec, 0x17, 0,
17285 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17286 } else {
17287 snd_hda_codec_write_cache(codec, 0x14, 0,
17288 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17289 snd_hda_codec_write_cache(codec, 0x17, 0,
17290 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17291 }
17292}
17293
17294static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
17295{
17296 unsigned int present1, present2;
17297
17298 present1 = snd_hda_codec_read(codec, 0x21, 0,
17299 AC_VERB_GET_PIN_SENSE, 0)
17300 & AC_PINSENSE_PRESENCE;
17301 present2 = snd_hda_codec_read(codec, 0x15, 0,
17302 AC_VERB_GET_PIN_SENSE, 0)
17303 & AC_PINSENSE_PRESENCE;
17304
17305 if (present1 || present2) {
17306 snd_hda_codec_write_cache(codec, 0x14, 0,
17307 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17308 snd_hda_codec_write_cache(codec, 0x17, 0,
17309 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17310 } else {
17311 snd_hda_codec_write_cache(codec, 0x14, 0,
17312 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17313 snd_hda_codec_write_cache(codec, 0x17, 0,
17314 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17315 }
17316}
17317
6dda9f4a
KY
17318static void alc663_m51va_unsol_event(struct hda_codec *codec,
17319 unsigned int res)
17320{
17321 switch (res >> 26) {
17322 case ALC880_HP_EVENT:
17323 alc663_m51va_speaker_automute(codec);
17324 break;
17325 case ALC880_MIC_EVENT:
4f5d1706 17326 alc_mic_automute(codec);
6dda9f4a
KY
17327 break;
17328 }
17329}
17330
4f5d1706
TI
17331static void alc663_m51va_setup(struct hda_codec *codec)
17332{
17333 struct alc_spec *spec = codec->spec;
17334 spec->ext_mic.pin = 0x18;
17335 spec->ext_mic.mux_idx = 0;
17336 spec->int_mic.pin = 0x12;
ebb83eeb 17337 spec->int_mic.mux_idx = 9;
4f5d1706
TI
17338 spec->auto_mic = 1;
17339}
17340
6dda9f4a
KY
17341static void alc663_m51va_inithook(struct hda_codec *codec)
17342{
17343 alc663_m51va_speaker_automute(codec);
4f5d1706 17344 alc_mic_automute(codec);
6dda9f4a
KY
17345}
17346
f1d4e28b 17347/* ***************** Mode1 ******************************/
4f5d1706 17348#define alc663_mode1_unsol_event alc663_m51va_unsol_event
ebb83eeb
KY
17349
17350static void alc663_mode1_setup(struct hda_codec *codec)
17351{
17352 struct alc_spec *spec = codec->spec;
17353 spec->ext_mic.pin = 0x18;
17354 spec->ext_mic.mux_idx = 0;
17355 spec->int_mic.pin = 0x19;
17356 spec->int_mic.mux_idx = 1;
17357 spec->auto_mic = 1;
17358}
17359
4f5d1706 17360#define alc663_mode1_inithook alc663_m51va_inithook
f1d4e28b 17361
f1d4e28b
KY
17362/* ***************** Mode2 ******************************/
17363static void alc662_mode2_unsol_event(struct hda_codec *codec,
17364 unsigned int res)
17365{
17366 switch (res >> 26) {
17367 case ALC880_HP_EVENT:
17368 alc662_f5z_speaker_automute(codec);
17369 break;
17370 case ALC880_MIC_EVENT:
4f5d1706 17371 alc_mic_automute(codec);
f1d4e28b
KY
17372 break;
17373 }
17374}
17375
ebb83eeb 17376#define alc662_mode2_setup alc663_mode1_setup
4f5d1706 17377
f1d4e28b
KY
17378static void alc662_mode2_inithook(struct hda_codec *codec)
17379{
17380 alc662_f5z_speaker_automute(codec);
4f5d1706 17381 alc_mic_automute(codec);
f1d4e28b
KY
17382}
17383/* ***************** Mode3 ******************************/
17384static void alc663_mode3_unsol_event(struct hda_codec *codec,
17385 unsigned int res)
17386{
17387 switch (res >> 26) {
17388 case ALC880_HP_EVENT:
17389 alc663_two_hp_m1_speaker_automute(codec);
17390 break;
17391 case ALC880_MIC_EVENT:
4f5d1706 17392 alc_mic_automute(codec);
f1d4e28b
KY
17393 break;
17394 }
17395}
17396
ebb83eeb 17397#define alc663_mode3_setup alc663_mode1_setup
4f5d1706 17398
f1d4e28b
KY
17399static void alc663_mode3_inithook(struct hda_codec *codec)
17400{
17401 alc663_two_hp_m1_speaker_automute(codec);
4f5d1706 17402 alc_mic_automute(codec);
f1d4e28b
KY
17403}
17404/* ***************** Mode4 ******************************/
17405static void alc663_mode4_unsol_event(struct hda_codec *codec,
17406 unsigned int res)
17407{
17408 switch (res >> 26) {
17409 case ALC880_HP_EVENT:
17410 alc663_21jd_two_speaker_automute(codec);
17411 break;
17412 case ALC880_MIC_EVENT:
4f5d1706 17413 alc_mic_automute(codec);
f1d4e28b
KY
17414 break;
17415 }
17416}
17417
ebb83eeb 17418#define alc663_mode4_setup alc663_mode1_setup
4f5d1706 17419
f1d4e28b
KY
17420static void alc663_mode4_inithook(struct hda_codec *codec)
17421{
17422 alc663_21jd_two_speaker_automute(codec);
4f5d1706 17423 alc_mic_automute(codec);
f1d4e28b
KY
17424}
17425/* ***************** Mode5 ******************************/
17426static void alc663_mode5_unsol_event(struct hda_codec *codec,
17427 unsigned int res)
17428{
17429 switch (res >> 26) {
17430 case ALC880_HP_EVENT:
17431 alc663_15jd_two_speaker_automute(codec);
17432 break;
17433 case ALC880_MIC_EVENT:
4f5d1706 17434 alc_mic_automute(codec);
f1d4e28b
KY
17435 break;
17436 }
17437}
17438
ebb83eeb 17439#define alc663_mode5_setup alc663_mode1_setup
4f5d1706 17440
f1d4e28b
KY
17441static void alc663_mode5_inithook(struct hda_codec *codec)
17442{
17443 alc663_15jd_two_speaker_automute(codec);
4f5d1706 17444 alc_mic_automute(codec);
f1d4e28b
KY
17445}
17446/* ***************** Mode6 ******************************/
17447static void alc663_mode6_unsol_event(struct hda_codec *codec,
17448 unsigned int res)
17449{
17450 switch (res >> 26) {
17451 case ALC880_HP_EVENT:
17452 alc663_two_hp_m2_speaker_automute(codec);
17453 break;
17454 case ALC880_MIC_EVENT:
4f5d1706 17455 alc_mic_automute(codec);
f1d4e28b
KY
17456 break;
17457 }
17458}
17459
ebb83eeb 17460#define alc663_mode6_setup alc663_mode1_setup
4f5d1706 17461
f1d4e28b
KY
17462static void alc663_mode6_inithook(struct hda_codec *codec)
17463{
17464 alc663_two_hp_m2_speaker_automute(codec);
4f5d1706 17465 alc_mic_automute(codec);
f1d4e28b
KY
17466}
17467
ebb83eeb
KY
17468/* ***************** Mode7 ******************************/
17469static void alc663_mode7_unsol_event(struct hda_codec *codec,
17470 unsigned int res)
17471{
17472 switch (res >> 26) {
17473 case ALC880_HP_EVENT:
17474 alc663_two_hp_m7_speaker_automute(codec);
17475 break;
17476 case ALC880_MIC_EVENT:
17477 alc_mic_automute(codec);
17478 break;
17479 }
17480}
17481
17482#define alc663_mode7_setup alc663_mode1_setup
17483
17484static void alc663_mode7_inithook(struct hda_codec *codec)
17485{
17486 alc663_two_hp_m7_speaker_automute(codec);
17487 alc_mic_automute(codec);
17488}
17489
17490/* ***************** Mode8 ******************************/
17491static void alc663_mode8_unsol_event(struct hda_codec *codec,
17492 unsigned int res)
17493{
17494 switch (res >> 26) {
17495 case ALC880_HP_EVENT:
17496 alc663_two_hp_m8_speaker_automute(codec);
17497 break;
17498 case ALC880_MIC_EVENT:
17499 alc_mic_automute(codec);
17500 break;
17501 }
17502}
17503
17504#define alc663_mode8_setup alc663_m51va_setup
17505
17506static void alc663_mode8_inithook(struct hda_codec *codec)
17507{
17508 alc663_two_hp_m8_speaker_automute(codec);
17509 alc_mic_automute(codec);
17510}
17511
6dda9f4a
KY
17512static void alc663_g71v_hp_automute(struct hda_codec *codec)
17513{
17514 unsigned int present;
17515 unsigned char bits;
17516
864f92be 17517 present = snd_hda_jack_detect(codec, 0x21);
6dda9f4a
KY
17518 bits = present ? HDA_AMP_MUTE : 0;
17519 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17520 HDA_AMP_MUTE, bits);
17521 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17522 HDA_AMP_MUTE, bits);
17523}
17524
17525static void alc663_g71v_front_automute(struct hda_codec *codec)
17526{
17527 unsigned int present;
17528 unsigned char bits;
17529
864f92be 17530 present = snd_hda_jack_detect(codec, 0x15);
6dda9f4a
KY
17531 bits = present ? HDA_AMP_MUTE : 0;
17532 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17533 HDA_AMP_MUTE, bits);
17534}
17535
17536static void alc663_g71v_unsol_event(struct hda_codec *codec,
17537 unsigned int res)
17538{
17539 switch (res >> 26) {
17540 case ALC880_HP_EVENT:
17541 alc663_g71v_hp_automute(codec);
17542 break;
17543 case ALC880_FRONT_EVENT:
17544 alc663_g71v_front_automute(codec);
17545 break;
17546 case ALC880_MIC_EVENT:
4f5d1706 17547 alc_mic_automute(codec);
6dda9f4a
KY
17548 break;
17549 }
17550}
17551
4f5d1706
TI
17552#define alc663_g71v_setup alc663_m51va_setup
17553
6dda9f4a
KY
17554static void alc663_g71v_inithook(struct hda_codec *codec)
17555{
17556 alc663_g71v_front_automute(codec);
17557 alc663_g71v_hp_automute(codec);
4f5d1706 17558 alc_mic_automute(codec);
6dda9f4a
KY
17559}
17560
17561static void alc663_g50v_unsol_event(struct hda_codec *codec,
17562 unsigned int res)
17563{
17564 switch (res >> 26) {
17565 case ALC880_HP_EVENT:
17566 alc663_m51va_speaker_automute(codec);
17567 break;
17568 case ALC880_MIC_EVENT:
4f5d1706 17569 alc_mic_automute(codec);
6dda9f4a
KY
17570 break;
17571 }
17572}
17573
4f5d1706
TI
17574#define alc663_g50v_setup alc663_m51va_setup
17575
6dda9f4a
KY
17576static void alc663_g50v_inithook(struct hda_codec *codec)
17577{
17578 alc663_m51va_speaker_automute(codec);
4f5d1706 17579 alc_mic_automute(codec);
6dda9f4a
KY
17580}
17581
f1d4e28b
KY
17582static struct snd_kcontrol_new alc662_ecs_mixer[] = {
17583 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
42171c17 17584 ALC262_HIPPO_MASTER_SWITCH,
f1d4e28b
KY
17585
17586 HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
17587 HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
17588 HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
17589
17590 HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
17591 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17592 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17593 { } /* end */
17594};
17595
9541ba1d
CP
17596static struct snd_kcontrol_new alc272_nc10_mixer[] = {
17597 /* Master Playback automatically created from Speaker and Headphone */
17598 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17599 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17600 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17601 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17602
17603 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17604 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17605 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
17606
17607 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17608 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17609 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
17610 { } /* end */
17611};
17612
cb53c626
TI
17613#ifdef CONFIG_SND_HDA_POWER_SAVE
17614#define alc662_loopbacks alc880_loopbacks
17615#endif
17616
bc9f98a9 17617
def319f9 17618/* pcm configuration: identical with ALC880 */
bc9f98a9
KY
17619#define alc662_pcm_analog_playback alc880_pcm_analog_playback
17620#define alc662_pcm_analog_capture alc880_pcm_analog_capture
17621#define alc662_pcm_digital_playback alc880_pcm_digital_playback
17622#define alc662_pcm_digital_capture alc880_pcm_digital_capture
17623
17624/*
17625 * configuration and preset
17626 */
17627static const char *alc662_models[ALC662_MODEL_LAST] = {
17628 [ALC662_3ST_2ch_DIG] = "3stack-dig",
17629 [ALC662_3ST_6ch_DIG] = "3stack-6ch-dig",
17630 [ALC662_3ST_6ch] = "3stack-6ch",
17631 [ALC662_5ST_DIG] = "6stack-dig",
17632 [ALC662_LENOVO_101E] = "lenovo-101e",
b995d76d 17633 [ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
8c427226 17634 [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
f1d4e28b 17635 [ALC662_ECS] = "ecs",
6dda9f4a
KY
17636 [ALC663_ASUS_M51VA] = "m51va",
17637 [ALC663_ASUS_G71V] = "g71v",
17638 [ALC663_ASUS_H13] = "h13",
17639 [ALC663_ASUS_G50V] = "g50v",
f1d4e28b
KY
17640 [ALC663_ASUS_MODE1] = "asus-mode1",
17641 [ALC662_ASUS_MODE2] = "asus-mode2",
17642 [ALC663_ASUS_MODE3] = "asus-mode3",
17643 [ALC663_ASUS_MODE4] = "asus-mode4",
17644 [ALC663_ASUS_MODE5] = "asus-mode5",
17645 [ALC663_ASUS_MODE6] = "asus-mode6",
ebb83eeb
KY
17646 [ALC663_ASUS_MODE7] = "asus-mode7",
17647 [ALC663_ASUS_MODE8] = "asus-mode8",
01f2bd48
TI
17648 [ALC272_DELL] = "dell",
17649 [ALC272_DELL_ZM1] = "dell-zm1",
9541ba1d 17650 [ALC272_SAMSUNG_NC10] = "samsung-nc10",
bc9f98a9
KY
17651 [ALC662_AUTO] = "auto",
17652};
17653
17654static struct snd_pci_quirk alc662_cfg_tbl[] = {
dea0a509 17655 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
622e84cd
KY
17656 SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
17657 SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
f1d4e28b 17658 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
dea0a509 17659 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
cec27c89 17660 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC663_ASUS_MODE1),
dea0a509 17661 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
f1d4e28b 17662 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
dea0a509 17663 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
f1d4e28b 17664 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
ebb83eeb
KY
17665 SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
17666 SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
f1d4e28b 17667 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
ebb83eeb
KY
17668 SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
17669 SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
17670 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
17671 SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
17672 SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
dea0a509 17673 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
ebb83eeb
KY
17674 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
17675 SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
dea0a509
TI
17676 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
17677 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
17678 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
17679 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
ebb83eeb 17680 SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
622e84cd
KY
17681 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
17682 SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
17683 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
f1d4e28b 17684 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
dea0a509
TI
17685 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
17686 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
17687 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
622e84cd 17688 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
f1d4e28b 17689 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
dea0a509
TI
17690 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
17691 SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
17692 /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
f1d4e28b 17693 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
f1d4e28b 17694 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
622e84cd 17695 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
cec27c89 17696 SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC663_ASUS_MODE1),
622e84cd
KY
17697 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
17698 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
dea0a509
TI
17699 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
17700 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
17701 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
622e84cd 17702 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
dea0a509
TI
17703 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
17704 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
622e84cd 17705 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
dea0a509
TI
17706 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
17707 SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
17708 /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
17709 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
17710 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
622e84cd 17711 SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
dea0a509 17712 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
f1d4e28b 17713 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
dea0a509
TI
17714 SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
17715 SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
17716 SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
17717 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
95fe5f2c
HRK
17718 SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
17719 ALC662_3ST_6ch_DIG),
4dee8baa 17720 SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO),
9541ba1d 17721 SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
cb55974c
HRK
17722 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
17723 ALC662_3ST_6ch_DIG),
6227cdce 17724 SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13),
19c009aa 17725 SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
5bd3729f 17726 SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
dea0a509 17727 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
238713d4 17728 SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
19c009aa 17729 ALC662_3ST_6ch_DIG),
dea0a509
TI
17730 SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
17731 ALC663_ASUS_H13),
7aee6746 17732 SND_PCI_QUIRK(0x8086, 0xd604, "Intel mobo", ALC662_3ST_2ch_DIG),
bc9f98a9
KY
17733 {}
17734};
17735
17736static struct alc_config_preset alc662_presets[] = {
17737 [ALC662_3ST_2ch_DIG] = {
f9e336f6 17738 .mixers = { alc662_3ST_2ch_mixer },
bc9f98a9
KY
17739 .init_verbs = { alc662_init_verbs },
17740 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17741 .dac_nids = alc662_dac_nids,
17742 .dig_out_nid = ALC662_DIGOUT_NID,
bc9f98a9
KY
17743 .dig_in_nid = ALC662_DIGIN_NID,
17744 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17745 .channel_mode = alc662_3ST_2ch_modes,
17746 .input_mux = &alc662_capture_source,
17747 },
17748 [ALC662_3ST_6ch_DIG] = {
f9e336f6 17749 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
bc9f98a9
KY
17750 .init_verbs = { alc662_init_verbs },
17751 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17752 .dac_nids = alc662_dac_nids,
17753 .dig_out_nid = ALC662_DIGOUT_NID,
bc9f98a9
KY
17754 .dig_in_nid = ALC662_DIGIN_NID,
17755 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17756 .channel_mode = alc662_3ST_6ch_modes,
17757 .need_dac_fix = 1,
17758 .input_mux = &alc662_capture_source,
f12ab1e0 17759 },
bc9f98a9 17760 [ALC662_3ST_6ch] = {
f9e336f6 17761 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
bc9f98a9
KY
17762 .init_verbs = { alc662_init_verbs },
17763 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17764 .dac_nids = alc662_dac_nids,
bc9f98a9
KY
17765 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17766 .channel_mode = alc662_3ST_6ch_modes,
17767 .need_dac_fix = 1,
17768 .input_mux = &alc662_capture_source,
f12ab1e0 17769 },
bc9f98a9 17770 [ALC662_5ST_DIG] = {
f9e336f6 17771 .mixers = { alc662_base_mixer, alc662_chmode_mixer },
bc9f98a9
KY
17772 .init_verbs = { alc662_init_verbs },
17773 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17774 .dac_nids = alc662_dac_nids,
17775 .dig_out_nid = ALC662_DIGOUT_NID,
bc9f98a9
KY
17776 .dig_in_nid = ALC662_DIGIN_NID,
17777 .num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
17778 .channel_mode = alc662_5stack_modes,
17779 .input_mux = &alc662_capture_source,
17780 },
17781 [ALC662_LENOVO_101E] = {
f9e336f6 17782 .mixers = { alc662_lenovo_101e_mixer },
bc9f98a9
KY
17783 .init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
17784 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17785 .dac_nids = alc662_dac_nids,
bc9f98a9
KY
17786 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17787 .channel_mode = alc662_3ST_2ch_modes,
17788 .input_mux = &alc662_lenovo_101e_capture_source,
17789 .unsol_event = alc662_lenovo_101e_unsol_event,
17790 .init_hook = alc662_lenovo_101e_all_automute,
17791 },
291702f0 17792 [ALC662_ASUS_EEEPC_P701] = {
f9e336f6 17793 .mixers = { alc662_eeepc_p701_mixer },
291702f0
KY
17794 .init_verbs = { alc662_init_verbs,
17795 alc662_eeepc_sue_init_verbs },
17796 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17797 .dac_nids = alc662_dac_nids,
291702f0
KY
17798 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17799 .channel_mode = alc662_3ST_2ch_modes,
291702f0 17800 .unsol_event = alc662_eeepc_unsol_event,
4f5d1706 17801 .setup = alc662_eeepc_setup,
291702f0
KY
17802 .init_hook = alc662_eeepc_inithook,
17803 },
8c427226 17804 [ALC662_ASUS_EEEPC_EP20] = {
f9e336f6 17805 .mixers = { alc662_eeepc_ep20_mixer,
8c427226
KY
17806 alc662_chmode_mixer },
17807 .init_verbs = { alc662_init_verbs,
17808 alc662_eeepc_ep20_sue_init_verbs },
17809 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17810 .dac_nids = alc662_dac_nids,
8c427226
KY
17811 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17812 .channel_mode = alc662_3ST_6ch_modes,
17813 .input_mux = &alc662_lenovo_101e_capture_source,
42171c17 17814 .unsol_event = alc662_eeepc_unsol_event,
4f5d1706 17815 .setup = alc662_eeepc_ep20_setup,
8c427226
KY
17816 .init_hook = alc662_eeepc_ep20_inithook,
17817 },
f1d4e28b 17818 [ALC662_ECS] = {
f9e336f6 17819 .mixers = { alc662_ecs_mixer },
f1d4e28b
KY
17820 .init_verbs = { alc662_init_verbs,
17821 alc662_ecs_init_verbs },
17822 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17823 .dac_nids = alc662_dac_nids,
17824 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17825 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 17826 .unsol_event = alc662_eeepc_unsol_event,
4f5d1706 17827 .setup = alc662_eeepc_setup,
f1d4e28b
KY
17828 .init_hook = alc662_eeepc_inithook,
17829 },
6dda9f4a 17830 [ALC663_ASUS_M51VA] = {
f9e336f6 17831 .mixers = { alc663_m51va_mixer },
6dda9f4a
KY
17832 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
17833 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17834 .dac_nids = alc662_dac_nids,
17835 .dig_out_nid = ALC662_DIGOUT_NID,
17836 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17837 .channel_mode = alc662_3ST_2ch_modes,
6dda9f4a 17838 .unsol_event = alc663_m51va_unsol_event,
4f5d1706 17839 .setup = alc663_m51va_setup,
6dda9f4a
KY
17840 .init_hook = alc663_m51va_inithook,
17841 },
17842 [ALC663_ASUS_G71V] = {
f9e336f6 17843 .mixers = { alc663_g71v_mixer },
6dda9f4a
KY
17844 .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
17845 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17846 .dac_nids = alc662_dac_nids,
17847 .dig_out_nid = ALC662_DIGOUT_NID,
17848 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17849 .channel_mode = alc662_3ST_2ch_modes,
6dda9f4a 17850 .unsol_event = alc663_g71v_unsol_event,
4f5d1706 17851 .setup = alc663_g71v_setup,
6dda9f4a
KY
17852 .init_hook = alc663_g71v_inithook,
17853 },
17854 [ALC663_ASUS_H13] = {
f9e336f6 17855 .mixers = { alc663_m51va_mixer },
6dda9f4a
KY
17856 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
17857 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17858 .dac_nids = alc662_dac_nids,
17859 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17860 .channel_mode = alc662_3ST_2ch_modes,
6dda9f4a
KY
17861 .unsol_event = alc663_m51va_unsol_event,
17862 .init_hook = alc663_m51va_inithook,
17863 },
17864 [ALC663_ASUS_G50V] = {
f9e336f6 17865 .mixers = { alc663_g50v_mixer },
6dda9f4a
KY
17866 .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
17867 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17868 .dac_nids = alc662_dac_nids,
17869 .dig_out_nid = ALC662_DIGOUT_NID,
17870 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17871 .channel_mode = alc662_3ST_6ch_modes,
17872 .input_mux = &alc663_capture_source,
17873 .unsol_event = alc663_g50v_unsol_event,
4f5d1706 17874 .setup = alc663_g50v_setup,
6dda9f4a
KY
17875 .init_hook = alc663_g50v_inithook,
17876 },
f1d4e28b 17877 [ALC663_ASUS_MODE1] = {
f9e336f6
TI
17878 .mixers = { alc663_m51va_mixer },
17879 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
17880 .init_verbs = { alc662_init_verbs,
17881 alc663_21jd_amic_init_verbs },
17882 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17883 .hp_nid = 0x03,
17884 .dac_nids = alc662_dac_nids,
17885 .dig_out_nid = ALC662_DIGOUT_NID,
17886 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17887 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 17888 .unsol_event = alc663_mode1_unsol_event,
4f5d1706 17889 .setup = alc663_mode1_setup,
f1d4e28b
KY
17890 .init_hook = alc663_mode1_inithook,
17891 },
17892 [ALC662_ASUS_MODE2] = {
f9e336f6
TI
17893 .mixers = { alc662_1bjd_mixer },
17894 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
17895 .init_verbs = { alc662_init_verbs,
17896 alc662_1bjd_amic_init_verbs },
17897 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17898 .dac_nids = alc662_dac_nids,
17899 .dig_out_nid = ALC662_DIGOUT_NID,
17900 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17901 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 17902 .unsol_event = alc662_mode2_unsol_event,
4f5d1706 17903 .setup = alc662_mode2_setup,
f1d4e28b
KY
17904 .init_hook = alc662_mode2_inithook,
17905 },
17906 [ALC663_ASUS_MODE3] = {
f9e336f6
TI
17907 .mixers = { alc663_two_hp_m1_mixer },
17908 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
17909 .init_verbs = { alc662_init_verbs,
17910 alc663_two_hp_amic_m1_init_verbs },
17911 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17912 .hp_nid = 0x03,
17913 .dac_nids = alc662_dac_nids,
17914 .dig_out_nid = ALC662_DIGOUT_NID,
17915 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17916 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 17917 .unsol_event = alc663_mode3_unsol_event,
4f5d1706 17918 .setup = alc663_mode3_setup,
f1d4e28b
KY
17919 .init_hook = alc663_mode3_inithook,
17920 },
17921 [ALC663_ASUS_MODE4] = {
f9e336f6
TI
17922 .mixers = { alc663_asus_21jd_clfe_mixer },
17923 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
17924 .init_verbs = { alc662_init_verbs,
17925 alc663_21jd_amic_init_verbs},
17926 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17927 .hp_nid = 0x03,
17928 .dac_nids = alc662_dac_nids,
17929 .dig_out_nid = ALC662_DIGOUT_NID,
17930 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17931 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 17932 .unsol_event = alc663_mode4_unsol_event,
4f5d1706 17933 .setup = alc663_mode4_setup,
f1d4e28b
KY
17934 .init_hook = alc663_mode4_inithook,
17935 },
17936 [ALC663_ASUS_MODE5] = {
f9e336f6
TI
17937 .mixers = { alc663_asus_15jd_clfe_mixer },
17938 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
17939 .init_verbs = { alc662_init_verbs,
17940 alc663_15jd_amic_init_verbs },
17941 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17942 .hp_nid = 0x03,
17943 .dac_nids = alc662_dac_nids,
17944 .dig_out_nid = ALC662_DIGOUT_NID,
17945 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17946 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 17947 .unsol_event = alc663_mode5_unsol_event,
4f5d1706 17948 .setup = alc663_mode5_setup,
f1d4e28b
KY
17949 .init_hook = alc663_mode5_inithook,
17950 },
17951 [ALC663_ASUS_MODE6] = {
f9e336f6
TI
17952 .mixers = { alc663_two_hp_m2_mixer },
17953 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
17954 .init_verbs = { alc662_init_verbs,
17955 alc663_two_hp_amic_m2_init_verbs },
17956 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17957 .hp_nid = 0x03,
17958 .dac_nids = alc662_dac_nids,
17959 .dig_out_nid = ALC662_DIGOUT_NID,
17960 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17961 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 17962 .unsol_event = alc663_mode6_unsol_event,
4f5d1706 17963 .setup = alc663_mode6_setup,
f1d4e28b
KY
17964 .init_hook = alc663_mode6_inithook,
17965 },
ebb83eeb
KY
17966 [ALC663_ASUS_MODE7] = {
17967 .mixers = { alc663_mode7_mixer },
17968 .cap_mixer = alc662_auto_capture_mixer,
17969 .init_verbs = { alc662_init_verbs,
17970 alc663_mode7_init_verbs },
17971 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17972 .hp_nid = 0x03,
17973 .dac_nids = alc662_dac_nids,
17974 .dig_out_nid = ALC662_DIGOUT_NID,
17975 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17976 .channel_mode = alc662_3ST_2ch_modes,
17977 .unsol_event = alc663_mode7_unsol_event,
17978 .setup = alc663_mode7_setup,
17979 .init_hook = alc663_mode7_inithook,
17980 },
17981 [ALC663_ASUS_MODE8] = {
17982 .mixers = { alc663_mode8_mixer },
17983 .cap_mixer = alc662_auto_capture_mixer,
17984 .init_verbs = { alc662_init_verbs,
17985 alc663_mode8_init_verbs },
17986 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17987 .hp_nid = 0x03,
17988 .dac_nids = alc662_dac_nids,
17989 .dig_out_nid = ALC662_DIGOUT_NID,
17990 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17991 .channel_mode = alc662_3ST_2ch_modes,
17992 .unsol_event = alc663_mode8_unsol_event,
17993 .setup = alc663_mode8_setup,
17994 .init_hook = alc663_mode8_inithook,
17995 },
622e84cd
KY
17996 [ALC272_DELL] = {
17997 .mixers = { alc663_m51va_mixer },
17998 .cap_mixer = alc272_auto_capture_mixer,
17999 .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
18000 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
18001 .dac_nids = alc662_dac_nids,
18002 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18003 .adc_nids = alc272_adc_nids,
18004 .num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
18005 .capsrc_nids = alc272_capsrc_nids,
18006 .channel_mode = alc662_3ST_2ch_modes,
622e84cd 18007 .unsol_event = alc663_m51va_unsol_event,
4f5d1706 18008 .setup = alc663_m51va_setup,
622e84cd
KY
18009 .init_hook = alc663_m51va_inithook,
18010 },
18011 [ALC272_DELL_ZM1] = {
18012 .mixers = { alc663_m51va_mixer },
18013 .cap_mixer = alc662_auto_capture_mixer,
18014 .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
18015 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
18016 .dac_nids = alc662_dac_nids,
18017 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18018 .adc_nids = alc662_adc_nids,
b59bdf3b 18019 .num_adc_nids = 1,
622e84cd
KY
18020 .capsrc_nids = alc662_capsrc_nids,
18021 .channel_mode = alc662_3ST_2ch_modes,
622e84cd 18022 .unsol_event = alc663_m51va_unsol_event,
4f5d1706 18023 .setup = alc663_m51va_setup,
622e84cd
KY
18024 .init_hook = alc663_m51va_inithook,
18025 },
9541ba1d
CP
18026 [ALC272_SAMSUNG_NC10] = {
18027 .mixers = { alc272_nc10_mixer },
18028 .init_verbs = { alc662_init_verbs,
18029 alc663_21jd_amic_init_verbs },
18030 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
18031 .dac_nids = alc272_dac_nids,
18032 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18033 .channel_mode = alc662_3ST_2ch_modes,
4f5d1706 18034 /*.input_mux = &alc272_nc10_capture_source,*/
9541ba1d 18035 .unsol_event = alc663_mode4_unsol_event,
4f5d1706 18036 .setup = alc663_mode4_setup,
9541ba1d
CP
18037 .init_hook = alc663_mode4_inithook,
18038 },
bc9f98a9
KY
18039};
18040
18041
18042/*
18043 * BIOS auto configuration
18044 */
18045
7085ec12
TI
18046/* convert from MIX nid to DAC */
18047static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
18048{
18049 if (nid == 0x0f)
18050 return 0x02;
18051 else if (nid >= 0x0c && nid <= 0x0e)
18052 return nid - 0x0c + 0x02;
18053 else
18054 return 0;
18055}
18056
18057/* get MIX nid connected to the given pin targeted to DAC */
18058static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
18059 hda_nid_t dac)
18060{
18061 hda_nid_t mix[4];
18062 int i, num;
18063
18064 num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
18065 for (i = 0; i < num; i++) {
18066 if (alc662_mix_to_dac(mix[i]) == dac)
18067 return mix[i];
18068 }
18069 return 0;
18070}
18071
18072/* look for an empty DAC slot */
18073static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
18074{
18075 struct alc_spec *spec = codec->spec;
18076 hda_nid_t srcs[5];
18077 int i, j, num;
18078
18079 num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
18080 if (num < 0)
18081 return 0;
18082 for (i = 0; i < num; i++) {
18083 hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
18084 if (!nid)
18085 continue;
18086 for (j = 0; j < spec->multiout.num_dacs; j++)
18087 if (spec->multiout.dac_nids[j] == nid)
18088 break;
18089 if (j >= spec->multiout.num_dacs)
18090 return nid;
18091 }
18092 return 0;
18093}
18094
18095/* fill in the dac_nids table from the parsed pin configuration */
18096static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
18097 const struct auto_pin_cfg *cfg)
18098{
18099 struct alc_spec *spec = codec->spec;
18100 int i;
18101 hda_nid_t dac;
18102
18103 spec->multiout.dac_nids = spec->private_dac_nids;
18104 for (i = 0; i < cfg->line_outs; i++) {
18105 dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
18106 if (!dac)
18107 continue;
18108 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
18109 }
18110 return 0;
18111}
18112
0afe5f89 18113static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
7085ec12
TI
18114 hda_nid_t nid, unsigned int chs)
18115{
0afe5f89 18116 return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
7085ec12
TI
18117 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
18118}
18119
0afe5f89 18120static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
7085ec12
TI
18121 hda_nid_t nid, unsigned int chs)
18122{
0afe5f89 18123 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
7085ec12
TI
18124 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
18125}
18126
18127#define alc662_add_stereo_vol(spec, pfx, nid) \
18128 alc662_add_vol_ctl(spec, pfx, nid, 3)
18129#define alc662_add_stereo_sw(spec, pfx, nid) \
18130 alc662_add_sw_ctl(spec, pfx, nid, 3)
18131
bc9f98a9 18132/* add playback controls from the parsed DAC table */
7085ec12 18133static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
bc9f98a9
KY
18134 const struct auto_pin_cfg *cfg)
18135{
7085ec12 18136 struct alc_spec *spec = codec->spec;
bc9f98a9
KY
18137 static const char *chname[4] = {
18138 "Front", "Surround", NULL /*CLFE*/, "Side"
18139 };
7085ec12 18140 hda_nid_t nid, mix;
bc9f98a9
KY
18141 int i, err;
18142
18143 for (i = 0; i < cfg->line_outs; i++) {
7085ec12
TI
18144 nid = spec->multiout.dac_nids[i];
18145 if (!nid)
18146 continue;
18147 mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
18148 if (!mix)
bc9f98a9 18149 continue;
bc9f98a9
KY
18150 if (i == 2) {
18151 /* Center/LFE */
7085ec12 18152 err = alc662_add_vol_ctl(spec, "Center", nid, 1);
bc9f98a9
KY
18153 if (err < 0)
18154 return err;
7085ec12 18155 err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
bc9f98a9
KY
18156 if (err < 0)
18157 return err;
7085ec12 18158 err = alc662_add_sw_ctl(spec, "Center", mix, 1);
bc9f98a9
KY
18159 if (err < 0)
18160 return err;
7085ec12 18161 err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
bc9f98a9
KY
18162 if (err < 0)
18163 return err;
18164 } else {
0d884cb9
TI
18165 const char *pfx;
18166 if (cfg->line_outs == 1 &&
18167 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
7085ec12 18168 if (cfg->hp_outs)
0d884cb9
TI
18169 pfx = "Speaker";
18170 else
18171 pfx = "PCM";
18172 } else
18173 pfx = chname[i];
7085ec12 18174 err = alc662_add_vol_ctl(spec, pfx, nid, 3);
bc9f98a9
KY
18175 if (err < 0)
18176 return err;
0d884cb9
TI
18177 if (cfg->line_outs == 1 &&
18178 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
18179 pfx = "Speaker";
7085ec12 18180 err = alc662_add_sw_ctl(spec, pfx, mix, 3);
bc9f98a9
KY
18181 if (err < 0)
18182 return err;
18183 }
18184 }
18185 return 0;
18186}
18187
18188/* add playback controls for speaker and HP outputs */
7085ec12
TI
18189/* return DAC nid if any new DAC is assigned */
18190static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
bc9f98a9
KY
18191 const char *pfx)
18192{
7085ec12
TI
18193 struct alc_spec *spec = codec->spec;
18194 hda_nid_t nid, mix;
bc9f98a9 18195 int err;
bc9f98a9
KY
18196
18197 if (!pin)
18198 return 0;
7085ec12
TI
18199 nid = alc662_look_for_dac(codec, pin);
18200 if (!nid) {
7085ec12
TI
18201 /* the corresponding DAC is already occupied */
18202 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
18203 return 0; /* no way */
18204 /* create a switch only */
0afe5f89 18205 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
7085ec12 18206 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
24fb9173
TI
18207 }
18208
7085ec12
TI
18209 mix = alc662_dac_to_mix(codec, pin, nid);
18210 if (!mix)
18211 return 0;
18212 err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18213 if (err < 0)
18214 return err;
18215 err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18216 if (err < 0)
18217 return err;
18218 return nid;
bc9f98a9
KY
18219}
18220
18221/* create playback/capture controls for input pins */
05f5f477 18222#define alc662_auto_create_input_ctls \
4b7348a1 18223 alc882_auto_create_input_ctls
bc9f98a9
KY
18224
18225static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
18226 hda_nid_t nid, int pin_type,
7085ec12 18227 hda_nid_t dac)
bc9f98a9 18228{
7085ec12
TI
18229 int i, num;
18230 hda_nid_t srcs[4];
18231
f6c7e546 18232 alc_set_pin_output(codec, nid, pin_type);
bc9f98a9 18233 /* need the manual connection? */
7085ec12
TI
18234 num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
18235 if (num <= 1)
18236 return;
18237 for (i = 0; i < num; i++) {
18238 if (alc662_mix_to_dac(srcs[i]) != dac)
18239 continue;
18240 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
18241 return;
bc9f98a9
KY
18242 }
18243}
18244
18245static void alc662_auto_init_multi_out(struct hda_codec *codec)
18246{
18247 struct alc_spec *spec = codec->spec;
7085ec12 18248 int pin_type = get_pin_type(spec->autocfg.line_out_type);
bc9f98a9
KY
18249 int i;
18250
18251 for (i = 0; i <= HDA_SIDE; i++) {
18252 hda_nid_t nid = spec->autocfg.line_out_pins[i];
18253 if (nid)
baba8ee9 18254 alc662_auto_set_output_and_unmute(codec, nid, pin_type,
7085ec12 18255 spec->multiout.dac_nids[i]);
bc9f98a9
KY
18256 }
18257}
18258
18259static void alc662_auto_init_hp_out(struct hda_codec *codec)
18260{
18261 struct alc_spec *spec = codec->spec;
18262 hda_nid_t pin;
18263
18264 pin = spec->autocfg.hp_pins[0];
7085ec12
TI
18265 if (pin)
18266 alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
18267 spec->multiout.hp_nid);
f6c7e546
TI
18268 pin = spec->autocfg.speaker_pins[0];
18269 if (pin)
7085ec12
TI
18270 alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
18271 spec->multiout.extra_out_nid[0]);
bc9f98a9
KY
18272}
18273
bc9f98a9
KY
18274#define ALC662_PIN_CD_NID ALC880_PIN_CD_NID
18275
18276static void alc662_auto_init_analog_input(struct hda_codec *codec)
18277{
18278 struct alc_spec *spec = codec->spec;
18279 int i;
18280
18281 for (i = 0; i < AUTO_PIN_LAST; i++) {
18282 hda_nid_t nid = spec->autocfg.input_pins[i];
05f5f477 18283 if (alc_is_input_pin(codec, nid)) {
23f0c048 18284 alc_set_input_pin(codec, nid, i);
52ca15b7 18285 if (nid != ALC662_PIN_CD_NID &&
e82c025b 18286 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
bc9f98a9
KY
18287 snd_hda_codec_write(codec, nid, 0,
18288 AC_VERB_SET_AMP_GAIN_MUTE,
18289 AMP_OUT_MUTE);
18290 }
18291 }
18292}
18293
f511b01c
TI
18294#define alc662_auto_init_input_src alc882_auto_init_input_src
18295
bc9f98a9
KY
18296static int alc662_parse_auto_config(struct hda_codec *codec)
18297{
18298 struct alc_spec *spec = codec->spec;
18299 int err;
18300 static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
18301
18302 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
18303 alc662_ignore);
18304 if (err < 0)
18305 return err;
18306 if (!spec->autocfg.line_outs)
18307 return 0; /* can't find valid BIOS pin config */
18308
7085ec12 18309 err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
f12ab1e0
TI
18310 if (err < 0)
18311 return err;
7085ec12 18312 err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
f12ab1e0
TI
18313 if (err < 0)
18314 return err;
7085ec12 18315 err = alc662_auto_create_extra_out(codec,
f12ab1e0
TI
18316 spec->autocfg.speaker_pins[0],
18317 "Speaker");
18318 if (err < 0)
18319 return err;
7085ec12
TI
18320 if (err)
18321 spec->multiout.extra_out_nid[0] = err;
18322 err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
f12ab1e0
TI
18323 "Headphone");
18324 if (err < 0)
18325 return err;
7085ec12
TI
18326 if (err)
18327 spec->multiout.hp_nid = err;
05f5f477 18328 err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 18329 if (err < 0)
bc9f98a9
KY
18330 return err;
18331
18332 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
18333
0852d7a6 18334 if (spec->autocfg.dig_outs)
bc9f98a9
KY
18335 spec->multiout.dig_out_nid = ALC880_DIGOUT_NID;
18336
603c4019 18337 if (spec->kctls.list)
d88897ea 18338 add_mixer(spec, spec->kctls.list);
bc9f98a9
KY
18339
18340 spec->num_mux_defs = 1;
61b9b9b1 18341 spec->input_mux = &spec->private_imux[0];
ea1fb29a 18342
cec27c89
KY
18343 add_verb(spec, alc662_init_verbs);
18344 if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18345 codec->vendor_id == 0x10ec0665)
18346 add_verb(spec, alc663_init_verbs);
18347
18348 if (codec->vendor_id == 0x10ec0272)
18349 add_verb(spec, alc272_init_verbs);
ee979a14
TI
18350
18351 err = alc_auto_add_mic_boost(codec);
18352 if (err < 0)
18353 return err;
18354
6227cdce
KY
18355 if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18356 codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
18357 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0x21);
18358 else
18359 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4a79ba34 18360
8c87286f 18361 return 1;
bc9f98a9
KY
18362}
18363
18364/* additional initialization for auto-configuration model */
18365static void alc662_auto_init(struct hda_codec *codec)
18366{
f6c7e546 18367 struct alc_spec *spec = codec->spec;
bc9f98a9
KY
18368 alc662_auto_init_multi_out(codec);
18369 alc662_auto_init_hp_out(codec);
18370 alc662_auto_init_analog_input(codec);
f511b01c 18371 alc662_auto_init_input_src(codec);
f6c7e546 18372 if (spec->unsol_event)
7fb0d78f 18373 alc_inithook(codec);
bc9f98a9
KY
18374}
18375
18376static int patch_alc662(struct hda_codec *codec)
18377{
18378 struct alc_spec *spec;
18379 int err, board_config;
18380
18381 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
18382 if (!spec)
18383 return -ENOMEM;
18384
18385 codec->spec = spec;
18386
2c3bf9ab
TI
18387 alc_fix_pll_init(codec, 0x20, 0x04, 15);
18388
274693f3
KY
18389 if (alc_read_coef_idx(codec, 0)==0x8020){
18390 kfree(codec->chip_name);
18391 codec->chip_name = kstrdup("ALC661", GFP_KERNEL);
ac2c92e0
TI
18392 if (!codec->chip_name) {
18393 alc_free(codec);
274693f3 18394 return -ENOMEM;
ac2c92e0 18395 }
274693f3
KY
18396 }
18397
bc9f98a9
KY
18398 board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
18399 alc662_models,
18400 alc662_cfg_tbl);
18401 if (board_config < 0) {
9a11f1aa
TI
18402 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
18403 codec->chip_name);
bc9f98a9
KY
18404 board_config = ALC662_AUTO;
18405 }
18406
18407 if (board_config == ALC662_AUTO) {
18408 /* automatic parse from the BIOS config */
18409 err = alc662_parse_auto_config(codec);
18410 if (err < 0) {
18411 alc_free(codec);
18412 return err;
8c87286f 18413 } else if (!err) {
bc9f98a9
KY
18414 printk(KERN_INFO
18415 "hda_codec: Cannot set up configuration "
18416 "from BIOS. Using base mode...\n");
18417 board_config = ALC662_3ST_2ch_DIG;
18418 }
18419 }
18420
680cd536
KK
18421 err = snd_hda_attach_beep_device(codec, 0x1);
18422 if (err < 0) {
18423 alc_free(codec);
18424 return err;
18425 }
18426
bc9f98a9 18427 if (board_config != ALC662_AUTO)
e9c364c0 18428 setup_preset(codec, &alc662_presets[board_config]);
bc9f98a9 18429
bc9f98a9
KY
18430 spec->stream_analog_playback = &alc662_pcm_analog_playback;
18431 spec->stream_analog_capture = &alc662_pcm_analog_capture;
18432
bc9f98a9
KY
18433 spec->stream_digital_playback = &alc662_pcm_digital_playback;
18434 spec->stream_digital_capture = &alc662_pcm_digital_capture;
18435
dd704698
TI
18436 if (!spec->adc_nids) {
18437 spec->adc_nids = alc662_adc_nids;
18438 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
18439 }
18440 if (!spec->capsrc_nids)
18441 spec->capsrc_nids = alc662_capsrc_nids;
bc9f98a9 18442
f9e336f6 18443 if (!spec->cap_mixer)
b59bdf3b 18444 set_capture_mixer(codec);
cec27c89
KY
18445
18446 switch (codec->vendor_id) {
18447 case 0x10ec0662:
b9591448 18448 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
cec27c89
KY
18449 break;
18450 case 0x10ec0272:
18451 case 0x10ec0663:
18452 case 0x10ec0665:
b9591448 18453 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
cec27c89
KY
18454 break;
18455 case 0x10ec0273:
18456 set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
18457 break;
18458 }
2134ea4f
TI
18459 spec->vmaster_nid = 0x02;
18460
bc9f98a9
KY
18461 codec->patch_ops = alc_patch_ops;
18462 if (board_config == ALC662_AUTO)
18463 spec->init_hook = alc662_auto_init;
cb53c626
TI
18464#ifdef CONFIG_SND_HDA_POWER_SAVE
18465 if (!spec->loopback.amplist)
18466 spec->loopback.amplist = alc662_loopbacks;
18467#endif
bc9f98a9
KY
18468
18469 return 0;
18470}
18471
274693f3
KY
18472static int patch_alc888(struct hda_codec *codec)
18473{
18474 if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
18475 kfree(codec->chip_name);
18476 codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
ac2c92e0
TI
18477 if (!codec->chip_name) {
18478 alc_free(codec);
274693f3 18479 return -ENOMEM;
ac2c92e0
TI
18480 }
18481 return patch_alc662(codec);
274693f3 18482 }
ac2c92e0 18483 return patch_alc882(codec);
274693f3
KY
18484}
18485
1da177e4
LT
18486/*
18487 * patch entries
18488 */
1289e9e8 18489static struct hda_codec_preset snd_hda_preset_realtek[] = {
1da177e4 18490 { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
df694daa 18491 { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
f6a92248 18492 { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
a361d84b 18493 { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
f6a92248 18494 { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
ebb83eeb 18495 { .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
01afd41f 18496 { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
ebb83eeb 18497 { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
f32610ed 18498 { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
bc9f98a9 18499 .patch = patch_alc861 },
f32610ed
JS
18500 { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
18501 { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
18502 { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
bc9f98a9 18503 { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
4953550a 18504 .patch = patch_alc882 },
bc9f98a9
KY
18505 { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
18506 .patch = patch_alc662 },
6dda9f4a 18507 { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
cec27c89 18508 { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
6227cdce 18509 { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
f32610ed 18510 { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
1da177e4 18511 { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
4953550a 18512 { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
669faba2 18513 { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
4953550a 18514 .patch = patch_alc882 },
cb308f97 18515 { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
4953550a 18516 .patch = patch_alc882 },
df694daa 18517 { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
4953550a 18518 { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
4442608d 18519 { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
4953550a 18520 .patch = patch_alc882 },
274693f3 18521 { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
4953550a 18522 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
274693f3 18523 { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
1da177e4
LT
18524 {} /* terminator */
18525};
1289e9e8
TI
18526
18527MODULE_ALIAS("snd-hda-codec-id:10ec*");
18528
18529MODULE_LICENSE("GPL");
18530MODULE_DESCRIPTION("Realtek HD-audio codec");
18531
18532static struct hda_codec_preset_list realtek_list = {
18533 .preset = snd_hda_preset_realtek,
18534 .owner = THIS_MODULE,
18535};
18536
18537static int __init patch_realtek_init(void)
18538{
18539 return snd_hda_add_codec_preset(&realtek_list);
18540}
18541
18542static void __exit patch_realtek_exit(void)
18543{
18544 snd_hda_delete_codec_preset(&realtek_list);
18545}
18546
18547module_init(patch_realtek_init)
18548module_exit(patch_realtek_exit)