ALSA: HDA: VT1708S: fix Smart5.1 mode
[GitHub/mt8127/android_kernel_alcatel_ttab.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,
7ad7b218 233 ALC883_MEDION_WIM2160,
b373bdeb 234 ALC883_LAPTOP_EAPD,
bc9f98a9 235 ALC883_LENOVO_101E_2ch,
272a527c 236 ALC883_LENOVO_NB0763,
189609ae 237 ALC888_LENOVO_MS7195_DIG,
e2757d5e 238 ALC888_LENOVO_SKY,
ea1fb29a 239 ALC883_HAIER_W66,
4723c022 240 ALC888_3ST_HP,
5795b9e6 241 ALC888_6ST_DELL,
a8848bd6 242 ALC883_MITAC,
a65cc60f 243 ALC883_CLEVO_M540R,
0c4cc443 244 ALC883_CLEVO_M720,
fb97dc67 245 ALC883_FUJITSU_PI2515,
ef8ef5fb 246 ALC888_FUJITSU_XA3530,
17bba1b7 247 ALC883_3ST_6ch_INTEL,
87a8c370
JK
248 ALC889A_INTEL,
249 ALC889_INTEL,
e2757d5e
KY
250 ALC888_ASUS_M90V,
251 ALC888_ASUS_EEE1601,
eb4c41d3 252 ALC889A_MB31,
3ab90935 253 ALC1200_ASUS_P5Q,
3e1647c5 254 ALC883_SONY_VAIO_TT,
4953550a
TI
255 ALC882_AUTO,
256 ALC882_MODEL_LAST,
9c7f852e
TI
257};
258
d4a86d81
TI
259/* ALC680 models */
260enum {
261 ALC680_BASE,
262 ALC680_AUTO,
263 ALC680_MODEL_LAST,
264};
265
df694daa
KY
266/* for GPIO Poll */
267#define GPIO_MASK 0x03
268
4a79ba34
TI
269/* extra amp-initialization sequence types */
270enum {
271 ALC_INIT_NONE,
272 ALC_INIT_DEFAULT,
273 ALC_INIT_GPIO1,
274 ALC_INIT_GPIO2,
275 ALC_INIT_GPIO3,
276};
277
6c819492
TI
278struct alc_mic_route {
279 hda_nid_t pin;
280 unsigned char mux_idx;
281 unsigned char amix_idx;
282};
283
284#define MUX_IDX_UNDEF ((unsigned char)-1)
285
da00c244
KY
286struct alc_customize_define {
287 unsigned int sku_cfg;
288 unsigned char port_connectivity;
289 unsigned char check_sum;
290 unsigned char customization;
291 unsigned char external_amp;
292 unsigned int enable_pcbeep:1;
293 unsigned int platform_type:1;
294 unsigned int swap:1;
295 unsigned int override:1;
296};
297
1da177e4
LT
298struct alc_spec {
299 /* codec parameterization */
df694daa 300 struct snd_kcontrol_new *mixers[5]; /* mixer arrays */
1da177e4 301 unsigned int num_mixers;
f9e336f6 302 struct snd_kcontrol_new *cap_mixer; /* capture mixer */
45bdd1c1 303 unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */
1da177e4 304
2d9c6482 305 const struct hda_verb *init_verbs[10]; /* initialization verbs
9c7f852e
TI
306 * don't forget NULL
307 * termination!
e9edcee0
TI
308 */
309 unsigned int num_init_verbs;
1da177e4 310
aa563af7 311 char stream_name_analog[32]; /* analog PCM stream */
1da177e4
LT
312 struct hda_pcm_stream *stream_analog_playback;
313 struct hda_pcm_stream *stream_analog_capture;
6330079f
TI
314 struct hda_pcm_stream *stream_analog_alt_playback;
315 struct hda_pcm_stream *stream_analog_alt_capture;
1da177e4 316
aa563af7 317 char stream_name_digital[32]; /* digital PCM stream */
1da177e4
LT
318 struct hda_pcm_stream *stream_digital_playback;
319 struct hda_pcm_stream *stream_digital_capture;
320
321 /* playback */
16ded525
TI
322 struct hda_multi_out multiout; /* playback set-up
323 * max_channels, dacs must be set
324 * dig_out_nid and hp_nid are optional
325 */
6330079f 326 hda_nid_t alt_dac_nid;
6a05ac4a 327 hda_nid_t slave_dig_outs[3]; /* optional - for auto-parsing */
8c441982 328 int dig_out_type;
1da177e4
LT
329
330 /* capture */
331 unsigned int num_adc_nids;
332 hda_nid_t *adc_nids;
e1406348 333 hda_nid_t *capsrc_nids;
16ded525 334 hda_nid_t dig_in_nid; /* digital-in NID; optional */
1da177e4
LT
335
336 /* capture source */
a1e8d2da 337 unsigned int num_mux_defs;
1da177e4
LT
338 const struct hda_input_mux *input_mux;
339 unsigned int cur_mux[3];
6c819492
TI
340 struct alc_mic_route ext_mic;
341 struct alc_mic_route int_mic;
1da177e4
LT
342
343 /* channel model */
d2a6d7dc 344 const struct hda_channel_mode *channel_mode;
1da177e4 345 int num_channel_mode;
4e195a7b 346 int need_dac_fix;
3b315d70
HM
347 int const_channel_count;
348 int ext_channel_count;
1da177e4
LT
349
350 /* PCM information */
4c5186ed 351 struct hda_pcm pcm_rec[3]; /* used in alc_build_pcms() */
41e41f1f 352
e9edcee0
TI
353 /* dynamic controls, init_verbs and input_mux */
354 struct auto_pin_cfg autocfg;
da00c244 355 struct alc_customize_define cdefine;
603c4019 356 struct snd_array kctls;
61b9b9b1 357 struct hda_input_mux private_imux[3];
41923e44 358 hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
4953550a
TI
359 hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
360 hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
834be88d 361
ae6b813a
TI
362 /* hooks */
363 void (*init_hook)(struct hda_codec *codec);
364 void (*unsol_event)(struct hda_codec *codec, unsigned int res);
f5de24b0 365#ifdef CONFIG_SND_HDA_POWER_SAVE
c97259df 366 void (*power_hook)(struct hda_codec *codec);
f5de24b0 367#endif
ae6b813a 368
834be88d
TI
369 /* for pin sensing */
370 unsigned int sense_updated: 1;
371 unsigned int jack_present: 1;
bec15c3a 372 unsigned int master_sw: 1;
6c819492 373 unsigned int auto_mic:1;
cb53c626 374
e64f14f4
TI
375 /* other flags */
376 unsigned int no_analog :1; /* digital I/O only */
4a79ba34 377 int init_amp;
e64f14f4 378
2134ea4f
TI
379 /* for virtual master */
380 hda_nid_t vmaster_nid;
cb53c626
TI
381#ifdef CONFIG_SND_HDA_POWER_SAVE
382 struct hda_loopback_check loopback;
383#endif
2c3bf9ab
TI
384
385 /* for PLL fix */
386 hda_nid_t pll_nid;
387 unsigned int pll_coef_idx, pll_coef_bit;
df694daa
KY
388};
389
390/*
391 * configuration template - to be copied to the spec instance
392 */
393struct alc_config_preset {
9c7f852e
TI
394 struct snd_kcontrol_new *mixers[5]; /* should be identical size
395 * with spec
396 */
f9e336f6 397 struct snd_kcontrol_new *cap_mixer; /* capture mixer */
df694daa
KY
398 const struct hda_verb *init_verbs[5];
399 unsigned int num_dacs;
400 hda_nid_t *dac_nids;
401 hda_nid_t dig_out_nid; /* optional */
402 hda_nid_t hp_nid; /* optional */
b25c9da1 403 hda_nid_t *slave_dig_outs;
df694daa
KY
404 unsigned int num_adc_nids;
405 hda_nid_t *adc_nids;
e1406348 406 hda_nid_t *capsrc_nids;
df694daa
KY
407 hda_nid_t dig_in_nid;
408 unsigned int num_channel_mode;
409 const struct hda_channel_mode *channel_mode;
4e195a7b 410 int need_dac_fix;
3b315d70 411 int const_channel_count;
a1e8d2da 412 unsigned int num_mux_defs;
df694daa 413 const struct hda_input_mux *input_mux;
ae6b813a 414 void (*unsol_event)(struct hda_codec *, unsigned int);
e9c364c0 415 void (*setup)(struct hda_codec *);
ae6b813a 416 void (*init_hook)(struct hda_codec *);
cb53c626
TI
417#ifdef CONFIG_SND_HDA_POWER_SAVE
418 struct hda_amp_list *loopbacks;
c97259df 419 void (*power_hook)(struct hda_codec *codec);
cb53c626 420#endif
1da177e4
LT
421};
422
1da177e4
LT
423
424/*
425 * input MUX handling
426 */
9c7f852e
TI
427static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
428 struct snd_ctl_elem_info *uinfo)
1da177e4
LT
429{
430 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
431 struct alc_spec *spec = codec->spec;
a1e8d2da
JW
432 unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
433 if (mux_idx >= spec->num_mux_defs)
434 mux_idx = 0;
5311114d
TI
435 if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
436 mux_idx = 0;
a1e8d2da 437 return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
1da177e4
LT
438}
439
9c7f852e
TI
440static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
441 struct snd_ctl_elem_value *ucontrol)
1da177e4
LT
442{
443 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
444 struct alc_spec *spec = codec->spec;
445 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
446
447 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
448 return 0;
449}
450
9c7f852e
TI
451static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
452 struct snd_ctl_elem_value *ucontrol)
1da177e4
LT
453{
454 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
455 struct alc_spec *spec = codec->spec;
cd896c33 456 const struct hda_input_mux *imux;
1da177e4 457 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
cd896c33 458 unsigned int mux_idx;
e1406348
TI
459 hda_nid_t nid = spec->capsrc_nids ?
460 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
0169b6b3 461 unsigned int type;
1da177e4 462
cd896c33
TI
463 mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
464 imux = &spec->input_mux[mux_idx];
5311114d
TI
465 if (!imux->num_items && mux_idx > 0)
466 imux = &spec->input_mux[0];
cd896c33 467
a22d543a 468 type = get_wcaps_type(get_wcaps(codec, nid));
0169b6b3 469 if (type == AC_WID_AUD_MIX) {
54cbc9ab
TI
470 /* Matrix-mixer style (e.g. ALC882) */
471 unsigned int *cur_val = &spec->cur_mux[adc_idx];
472 unsigned int i, idx;
473
474 idx = ucontrol->value.enumerated.item[0];
475 if (idx >= imux->num_items)
476 idx = imux->num_items - 1;
477 if (*cur_val == idx)
478 return 0;
479 for (i = 0; i < imux->num_items; i++) {
480 unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
481 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
482 imux->items[i].index,
483 HDA_AMP_MUTE, v);
484 }
485 *cur_val = idx;
486 return 1;
487 } else {
488 /* MUX style (e.g. ALC880) */
cd896c33 489 return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
54cbc9ab
TI
490 &spec->cur_mux[adc_idx]);
491 }
492}
e9edcee0 493
1da177e4
LT
494/*
495 * channel mode setting
496 */
9c7f852e
TI
497static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
498 struct snd_ctl_elem_info *uinfo)
1da177e4
LT
499{
500 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
501 struct alc_spec *spec = codec->spec;
d2a6d7dc
TI
502 return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
503 spec->num_channel_mode);
1da177e4
LT
504}
505
9c7f852e
TI
506static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
507 struct snd_ctl_elem_value *ucontrol)
1da177e4
LT
508{
509 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
510 struct alc_spec *spec = codec->spec;
d2a6d7dc 511 return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
9c7f852e 512 spec->num_channel_mode,
3b315d70 513 spec->ext_channel_count);
1da177e4
LT
514}
515
9c7f852e
TI
516static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
517 struct snd_ctl_elem_value *ucontrol)
1da177e4
LT
518{
519 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
520 struct alc_spec *spec = codec->spec;
4e195a7b
TI
521 int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
522 spec->num_channel_mode,
3b315d70
HM
523 &spec->ext_channel_count);
524 if (err >= 0 && !spec->const_channel_count) {
525 spec->multiout.max_channels = spec->ext_channel_count;
526 if (spec->need_dac_fix)
527 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
528 }
4e195a7b 529 return err;
1da177e4
LT
530}
531
a9430dd8 532/*
4c5186ed 533 * Control the mode of pin widget settings via the mixer. "pc" is used
ea1fb29a 534 * instead of "%" to avoid consequences of accidently treating the % as
4c5186ed
JW
535 * being part of a format specifier. Maximum allowed length of a value is
536 * 63 characters plus NULL terminator.
7cf51e48
JW
537 *
538 * Note: some retasking pin complexes seem to ignore requests for input
539 * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
540 * are requested. Therefore order this list so that this behaviour will not
541 * cause problems when mixer clients move through the enum sequentially.
a1e8d2da
JW
542 * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
543 * March 2006.
4c5186ed
JW
544 */
545static char *alc_pin_mode_names[] = {
7cf51e48
JW
546 "Mic 50pc bias", "Mic 80pc bias",
547 "Line in", "Line out", "Headphone out",
4c5186ed
JW
548};
549static unsigned char alc_pin_mode_values[] = {
7cf51e48 550 PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
4c5186ed
JW
551};
552/* The control can present all 5 options, or it can limit the options based
a1e8d2da
JW
553 * in the pin being assumed to be exclusively an input or an output pin. In
554 * addition, "input" pins may or may not process the mic bias option
555 * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
556 * accept requests for bias as of chip versions up to March 2006) and/or
557 * wiring in the computer.
a9430dd8 558 */
a1e8d2da
JW
559#define ALC_PIN_DIR_IN 0x00
560#define ALC_PIN_DIR_OUT 0x01
561#define ALC_PIN_DIR_INOUT 0x02
562#define ALC_PIN_DIR_IN_NOMICBIAS 0x03
563#define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
4c5186ed 564
ea1fb29a 565/* Info about the pin modes supported by the different pin direction modes.
4c5186ed
JW
566 * For each direction the minimum and maximum values are given.
567 */
a1e8d2da 568static signed char alc_pin_mode_dir_info[5][2] = {
4c5186ed
JW
569 { 0, 2 }, /* ALC_PIN_DIR_IN */
570 { 3, 4 }, /* ALC_PIN_DIR_OUT */
571 { 0, 4 }, /* ALC_PIN_DIR_INOUT */
a1e8d2da
JW
572 { 2, 2 }, /* ALC_PIN_DIR_IN_NOMICBIAS */
573 { 2, 4 }, /* ALC_PIN_DIR_INOUT_NOMICBIAS */
4c5186ed
JW
574};
575#define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
576#define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
577#define alc_pin_mode_n_items(_dir) \
578 (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
579
9c7f852e
TI
580static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
581 struct snd_ctl_elem_info *uinfo)
a9430dd8 582{
4c5186ed
JW
583 unsigned int item_num = uinfo->value.enumerated.item;
584 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
585
586 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
a9430dd8 587 uinfo->count = 1;
4c5186ed
JW
588 uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
589
590 if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
591 item_num = alc_pin_mode_min(dir);
592 strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
a9430dd8
JW
593 return 0;
594}
595
9c7f852e
TI
596static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
597 struct snd_ctl_elem_value *ucontrol)
a9430dd8 598{
4c5186ed 599 unsigned int i;
a9430dd8
JW
600 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
601 hda_nid_t nid = kcontrol->private_value & 0xffff;
4c5186ed 602 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
a9430dd8 603 long *valp = ucontrol->value.integer.value;
9c7f852e
TI
604 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
605 AC_VERB_GET_PIN_WIDGET_CONTROL,
606 0x00);
a9430dd8 607
4c5186ed
JW
608 /* Find enumerated value for current pinctl setting */
609 i = alc_pin_mode_min(dir);
4b35d2ca 610 while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
4c5186ed 611 i++;
9c7f852e 612 *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
a9430dd8
JW
613 return 0;
614}
615
9c7f852e
TI
616static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
617 struct snd_ctl_elem_value *ucontrol)
a9430dd8 618{
4c5186ed 619 signed int change;
a9430dd8
JW
620 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
621 hda_nid_t nid = kcontrol->private_value & 0xffff;
4c5186ed
JW
622 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
623 long val = *ucontrol->value.integer.value;
9c7f852e
TI
624 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
625 AC_VERB_GET_PIN_WIDGET_CONTROL,
626 0x00);
a9430dd8 627
f12ab1e0 628 if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
4c5186ed
JW
629 val = alc_pin_mode_min(dir);
630
631 change = pinctl != alc_pin_mode_values[val];
cdcd9268
JW
632 if (change) {
633 /* Set pin mode to that requested */
82beb8fd
TI
634 snd_hda_codec_write_cache(codec, nid, 0,
635 AC_VERB_SET_PIN_WIDGET_CONTROL,
636 alc_pin_mode_values[val]);
cdcd9268 637
ea1fb29a 638 /* Also enable the retasking pin's input/output as required
cdcd9268
JW
639 * for the requested pin mode. Enum values of 2 or less are
640 * input modes.
641 *
642 * Dynamically switching the input/output buffers probably
a1e8d2da
JW
643 * reduces noise slightly (particularly on input) so we'll
644 * do it. However, having both input and output buffers
645 * enabled simultaneously doesn't seem to be problematic if
646 * this turns out to be necessary in the future.
cdcd9268
JW
647 */
648 if (val <= 2) {
47fd830a
TI
649 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
650 HDA_AMP_MUTE, HDA_AMP_MUTE);
651 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
652 HDA_AMP_MUTE, 0);
cdcd9268 653 } else {
47fd830a
TI
654 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
655 HDA_AMP_MUTE, HDA_AMP_MUTE);
656 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
657 HDA_AMP_MUTE, 0);
cdcd9268
JW
658 }
659 }
a9430dd8
JW
660 return change;
661}
662
4c5186ed 663#define ALC_PIN_MODE(xname, nid, dir) \
a9430dd8 664 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
5b0cb1d8 665 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4c5186ed
JW
666 .info = alc_pin_mode_info, \
667 .get = alc_pin_mode_get, \
668 .put = alc_pin_mode_put, \
669 .private_value = nid | (dir<<16) }
df694daa 670
5c8f858d
JW
671/* A switch control for ALC260 GPIO pins. Multiple GPIOs can be ganged
672 * together using a mask with more than one bit set. This control is
673 * currently used only by the ALC260 test model. At this stage they are not
674 * needed for any "production" models.
675 */
676#ifdef CONFIG_SND_DEBUG
a5ce8890 677#define alc_gpio_data_info snd_ctl_boolean_mono_info
f12ab1e0 678
9c7f852e
TI
679static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
680 struct snd_ctl_elem_value *ucontrol)
5c8f858d
JW
681{
682 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
683 hda_nid_t nid = kcontrol->private_value & 0xffff;
684 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
685 long *valp = ucontrol->value.integer.value;
9c7f852e
TI
686 unsigned int val = snd_hda_codec_read(codec, nid, 0,
687 AC_VERB_GET_GPIO_DATA, 0x00);
5c8f858d
JW
688
689 *valp = (val & mask) != 0;
690 return 0;
691}
9c7f852e
TI
692static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
693 struct snd_ctl_elem_value *ucontrol)
5c8f858d
JW
694{
695 signed int change;
696 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
697 hda_nid_t nid = kcontrol->private_value & 0xffff;
698 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
699 long val = *ucontrol->value.integer.value;
9c7f852e
TI
700 unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
701 AC_VERB_GET_GPIO_DATA,
702 0x00);
5c8f858d
JW
703
704 /* Set/unset the masked GPIO bit(s) as needed */
9c7f852e
TI
705 change = (val == 0 ? 0 : mask) != (gpio_data & mask);
706 if (val == 0)
5c8f858d
JW
707 gpio_data &= ~mask;
708 else
709 gpio_data |= mask;
82beb8fd
TI
710 snd_hda_codec_write_cache(codec, nid, 0,
711 AC_VERB_SET_GPIO_DATA, gpio_data);
5c8f858d
JW
712
713 return change;
714}
715#define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
716 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
5b0cb1d8 717 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
5c8f858d
JW
718 .info = alc_gpio_data_info, \
719 .get = alc_gpio_data_get, \
720 .put = alc_gpio_data_put, \
721 .private_value = nid | (mask<<16) }
722#endif /* CONFIG_SND_DEBUG */
723
92621f13
JW
724/* A switch control to allow the enabling of the digital IO pins on the
725 * ALC260. This is incredibly simplistic; the intention of this control is
726 * to provide something in the test model allowing digital outputs to be
727 * identified if present. If models are found which can utilise these
728 * outputs a more complete mixer control can be devised for those models if
729 * necessary.
730 */
731#ifdef CONFIG_SND_DEBUG
a5ce8890 732#define alc_spdif_ctrl_info snd_ctl_boolean_mono_info
f12ab1e0 733
9c7f852e
TI
734static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
735 struct snd_ctl_elem_value *ucontrol)
92621f13
JW
736{
737 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
738 hda_nid_t nid = kcontrol->private_value & 0xffff;
739 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
740 long *valp = ucontrol->value.integer.value;
9c7f852e 741 unsigned int val = snd_hda_codec_read(codec, nid, 0,
3982d17e 742 AC_VERB_GET_DIGI_CONVERT_1, 0x00);
92621f13
JW
743
744 *valp = (val & mask) != 0;
745 return 0;
746}
9c7f852e
TI
747static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
748 struct snd_ctl_elem_value *ucontrol)
92621f13
JW
749{
750 signed int change;
751 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
752 hda_nid_t nid = kcontrol->private_value & 0xffff;
753 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
754 long val = *ucontrol->value.integer.value;
9c7f852e 755 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
3982d17e 756 AC_VERB_GET_DIGI_CONVERT_1,
9c7f852e 757 0x00);
92621f13
JW
758
759 /* Set/unset the masked control bit(s) as needed */
9c7f852e 760 change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
92621f13
JW
761 if (val==0)
762 ctrl_data &= ~mask;
763 else
764 ctrl_data |= mask;
82beb8fd
TI
765 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
766 ctrl_data);
92621f13
JW
767
768 return change;
769}
770#define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
771 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
5b0cb1d8 772 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
92621f13
JW
773 .info = alc_spdif_ctrl_info, \
774 .get = alc_spdif_ctrl_get, \
775 .put = alc_spdif_ctrl_put, \
776 .private_value = nid | (mask<<16) }
777#endif /* CONFIG_SND_DEBUG */
778
f8225f6d
JW
779/* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
780 * Again, this is only used in the ALC26x test models to help identify when
781 * the EAPD line must be asserted for features to work.
782 */
783#ifdef CONFIG_SND_DEBUG
784#define alc_eapd_ctrl_info snd_ctl_boolean_mono_info
785
786static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
787 struct snd_ctl_elem_value *ucontrol)
788{
789 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
790 hda_nid_t nid = kcontrol->private_value & 0xffff;
791 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
792 long *valp = ucontrol->value.integer.value;
793 unsigned int val = snd_hda_codec_read(codec, nid, 0,
794 AC_VERB_GET_EAPD_BTLENABLE, 0x00);
795
796 *valp = (val & mask) != 0;
797 return 0;
798}
799
800static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
801 struct snd_ctl_elem_value *ucontrol)
802{
803 int change;
804 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
805 hda_nid_t nid = kcontrol->private_value & 0xffff;
806 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
807 long val = *ucontrol->value.integer.value;
808 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
809 AC_VERB_GET_EAPD_BTLENABLE,
810 0x00);
811
812 /* Set/unset the masked control bit(s) as needed */
813 change = (!val ? 0 : mask) != (ctrl_data & mask);
814 if (!val)
815 ctrl_data &= ~mask;
816 else
817 ctrl_data |= mask;
818 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
819 ctrl_data);
820
821 return change;
822}
823
824#define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
825 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
5b0cb1d8 826 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
f8225f6d
JW
827 .info = alc_eapd_ctrl_info, \
828 .get = alc_eapd_ctrl_get, \
829 .put = alc_eapd_ctrl_put, \
830 .private_value = nid | (mask<<16) }
831#endif /* CONFIG_SND_DEBUG */
832
23f0c048
TI
833/*
834 * set up the input pin config (depending on the given auto-pin type)
835 */
836static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
837 int auto_pin_type)
838{
839 unsigned int val = PIN_IN;
840
841 if (auto_pin_type <= AUTO_PIN_FRONT_MIC) {
842 unsigned int pincap;
1327a32b 843 pincap = snd_hda_query_pin_caps(codec, nid);
23f0c048
TI
844 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
845 if (pincap & AC_PINCAP_VREF_80)
846 val = PIN_VREF80;
461c6c3a
TI
847 else if (pincap & AC_PINCAP_VREF_50)
848 val = PIN_VREF50;
849 else if (pincap & AC_PINCAP_VREF_100)
850 val = PIN_VREF100;
851 else if (pincap & AC_PINCAP_VREF_GRD)
852 val = PIN_VREFGRD;
23f0c048
TI
853 }
854 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
855}
856
d88897ea
TI
857/*
858 */
859static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
860{
861 if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
862 return;
863 spec->mixers[spec->num_mixers++] = mix;
864}
865
866static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
867{
868 if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
869 return;
870 spec->init_verbs[spec->num_init_verbs++] = verb;
871}
872
df694daa
KY
873/*
874 * set up from the preset table
875 */
e9c364c0 876static void setup_preset(struct hda_codec *codec,
9c7f852e 877 const struct alc_config_preset *preset)
df694daa 878{
e9c364c0 879 struct alc_spec *spec = codec->spec;
df694daa
KY
880 int i;
881
882 for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
d88897ea 883 add_mixer(spec, preset->mixers[i]);
f9e336f6 884 spec->cap_mixer = preset->cap_mixer;
9c7f852e
TI
885 for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
886 i++)
d88897ea 887 add_verb(spec, preset->init_verbs[i]);
ea1fb29a 888
df694daa
KY
889 spec->channel_mode = preset->channel_mode;
890 spec->num_channel_mode = preset->num_channel_mode;
4e195a7b 891 spec->need_dac_fix = preset->need_dac_fix;
3b315d70 892 spec->const_channel_count = preset->const_channel_count;
df694daa 893
3b315d70
HM
894 if (preset->const_channel_count)
895 spec->multiout.max_channels = preset->const_channel_count;
896 else
897 spec->multiout.max_channels = spec->channel_mode[0].channels;
898 spec->ext_channel_count = spec->channel_mode[0].channels;
df694daa
KY
899
900 spec->multiout.num_dacs = preset->num_dacs;
901 spec->multiout.dac_nids = preset->dac_nids;
902 spec->multiout.dig_out_nid = preset->dig_out_nid;
b25c9da1 903 spec->multiout.slave_dig_outs = preset->slave_dig_outs;
df694daa 904 spec->multiout.hp_nid = preset->hp_nid;
ea1fb29a 905
a1e8d2da 906 spec->num_mux_defs = preset->num_mux_defs;
f12ab1e0 907 if (!spec->num_mux_defs)
a1e8d2da 908 spec->num_mux_defs = 1;
df694daa
KY
909 spec->input_mux = preset->input_mux;
910
911 spec->num_adc_nids = preset->num_adc_nids;
912 spec->adc_nids = preset->adc_nids;
e1406348 913 spec->capsrc_nids = preset->capsrc_nids;
df694daa 914 spec->dig_in_nid = preset->dig_in_nid;
ae6b813a
TI
915
916 spec->unsol_event = preset->unsol_event;
917 spec->init_hook = preset->init_hook;
cb53c626 918#ifdef CONFIG_SND_HDA_POWER_SAVE
f5de24b0 919 spec->power_hook = preset->power_hook;
cb53c626
TI
920 spec->loopback.amplist = preset->loopbacks;
921#endif
e9c364c0
TI
922
923 if (preset->setup)
924 preset->setup(codec);
df694daa
KY
925}
926
bc9f98a9
KY
927/* Enable GPIO mask and set output */
928static struct hda_verb alc_gpio1_init_verbs[] = {
929 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
930 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
931 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
932 { }
933};
934
935static struct hda_verb alc_gpio2_init_verbs[] = {
936 {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
937 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
938 {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
939 { }
940};
941
bdd148a3
KY
942static struct hda_verb alc_gpio3_init_verbs[] = {
943 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
944 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
945 {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
946 { }
947};
948
2c3bf9ab
TI
949/*
950 * Fix hardware PLL issue
951 * On some codecs, the analog PLL gating control must be off while
952 * the default value is 1.
953 */
954static void alc_fix_pll(struct hda_codec *codec)
955{
956 struct alc_spec *spec = codec->spec;
957 unsigned int val;
958
959 if (!spec->pll_nid)
960 return;
961 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
962 spec->pll_coef_idx);
963 val = snd_hda_codec_read(codec, spec->pll_nid, 0,
964 AC_VERB_GET_PROC_COEF, 0);
965 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
966 spec->pll_coef_idx);
967 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
968 val & ~(1 << spec->pll_coef_bit));
969}
970
971static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
972 unsigned int coef_idx, unsigned int coef_bit)
973{
974 struct alc_spec *spec = codec->spec;
975 spec->pll_nid = nid;
976 spec->pll_coef_idx = coef_idx;
977 spec->pll_coef_bit = coef_bit;
978 alc_fix_pll(codec);
979}
980
a9fd4f3f 981static void alc_automute_pin(struct hda_codec *codec)
c9b58006
KY
982{
983 struct alc_spec *spec = codec->spec;
a9fd4f3f
TI
984 unsigned int nid = spec->autocfg.hp_pins[0];
985 int i;
c9b58006 986
ad87c64f
TI
987 if (!nid)
988 return;
864f92be 989 spec->jack_present = snd_hda_jack_detect(codec, nid);
a9fd4f3f
TI
990 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
991 nid = spec->autocfg.speaker_pins[i];
992 if (!nid)
993 break;
994 snd_hda_codec_write(codec, nid, 0,
995 AC_VERB_SET_PIN_WIDGET_CONTROL,
996 spec->jack_present ? 0 : PIN_OUT);
997 }
c9b58006
KY
998}
999
6c819492
TI
1000static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
1001 hda_nid_t nid)
1002{
1003 hda_nid_t conn[HDA_MAX_NUM_INPUTS];
1004 int i, nums;
1005
1006 nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
1007 for (i = 0; i < nums; i++)
1008 if (conn[i] == nid)
1009 return i;
1010 return -1;
1011}
1012
7fb0d78f
KY
1013static void alc_mic_automute(struct hda_codec *codec)
1014{
1015 struct alc_spec *spec = codec->spec;
6c819492
TI
1016 struct alc_mic_route *dead, *alive;
1017 unsigned int present, type;
1018 hda_nid_t cap_nid;
1019
b59bdf3b
TI
1020 if (!spec->auto_mic)
1021 return;
6c819492
TI
1022 if (!spec->int_mic.pin || !spec->ext_mic.pin)
1023 return;
1024 if (snd_BUG_ON(!spec->adc_nids))
1025 return;
1026
1027 cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1028
864f92be 1029 present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
6c819492
TI
1030 if (present) {
1031 alive = &spec->ext_mic;
1032 dead = &spec->int_mic;
1033 } else {
1034 alive = &spec->int_mic;
1035 dead = &spec->ext_mic;
1036 }
1037
6c819492
TI
1038 type = get_wcaps_type(get_wcaps(codec, cap_nid));
1039 if (type == AC_WID_AUD_MIX) {
1040 /* Matrix-mixer style (e.g. ALC882) */
1041 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1042 alive->mux_idx,
1043 HDA_AMP_MUTE, 0);
1044 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1045 dead->mux_idx,
1046 HDA_AMP_MUTE, HDA_AMP_MUTE);
1047 } else {
1048 /* MUX style (e.g. ALC880) */
1049 snd_hda_codec_write_cache(codec, cap_nid, 0,
1050 AC_VERB_SET_CONNECT_SEL,
1051 alive->mux_idx);
1052 }
1053
1054 /* FIXME: analog mixer */
7fb0d78f
KY
1055}
1056
c9b58006
KY
1057/* unsolicited event for HP jack sensing */
1058static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1059{
1060 if (codec->vendor_id == 0x10ec0880)
1061 res >>= 28;
1062 else
1063 res >>= 26;
a9fd4f3f
TI
1064 switch (res) {
1065 case ALC880_HP_EVENT:
1066 alc_automute_pin(codec);
1067 break;
1068 case ALC880_MIC_EVENT:
7fb0d78f 1069 alc_mic_automute(codec);
a9fd4f3f
TI
1070 break;
1071 }
7fb0d78f
KY
1072}
1073
1074static void alc_inithook(struct hda_codec *codec)
1075{
a9fd4f3f 1076 alc_automute_pin(codec);
7fb0d78f 1077 alc_mic_automute(codec);
c9b58006
KY
1078}
1079
f9423e7a
KY
1080/* additional initialization for ALC888 variants */
1081static void alc888_coef_init(struct hda_codec *codec)
1082{
1083 unsigned int tmp;
1084
1085 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1086 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1087 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
37db623a 1088 if ((tmp & 0xf0) == 0x20)
f9423e7a
KY
1089 /* alc888S-VC */
1090 snd_hda_codec_read(codec, 0x20, 0,
1091 AC_VERB_SET_PROC_COEF, 0x830);
1092 else
1093 /* alc888-VB */
1094 snd_hda_codec_read(codec, 0x20, 0,
1095 AC_VERB_SET_PROC_COEF, 0x3030);
1096}
1097
87a8c370
JK
1098static void alc889_coef_init(struct hda_codec *codec)
1099{
1100 unsigned int tmp;
1101
1102 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1103 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1104 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1105 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1106}
1107
3fb4a508
TI
1108/* turn on/off EAPD control (only if available) */
1109static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
1110{
1111 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
1112 return;
1113 if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
1114 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
1115 on ? 2 : 0);
1116}
1117
4a79ba34 1118static void alc_auto_init_amp(struct hda_codec *codec, int type)
bc9f98a9 1119{
4a79ba34 1120 unsigned int tmp;
bc9f98a9 1121
4a79ba34
TI
1122 switch (type) {
1123 case ALC_INIT_GPIO1:
bc9f98a9
KY
1124 snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1125 break;
4a79ba34 1126 case ALC_INIT_GPIO2:
bc9f98a9
KY
1127 snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1128 break;
4a79ba34 1129 case ALC_INIT_GPIO3:
bdd148a3
KY
1130 snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1131 break;
4a79ba34 1132 case ALC_INIT_DEFAULT:
bdd148a3 1133 switch (codec->vendor_id) {
c9b58006 1134 case 0x10ec0260:
3fb4a508
TI
1135 set_eapd(codec, 0x0f, 1);
1136 set_eapd(codec, 0x10, 1);
c9b58006
KY
1137 break;
1138 case 0x10ec0262:
bdd148a3
KY
1139 case 0x10ec0267:
1140 case 0x10ec0268:
c9b58006 1141 case 0x10ec0269:
3fb4a508 1142 case 0x10ec0270:
c6e8f2da 1143 case 0x10ec0272:
f9423e7a
KY
1144 case 0x10ec0660:
1145 case 0x10ec0662:
1146 case 0x10ec0663:
c9b58006 1147 case 0x10ec0862:
20a3a05d 1148 case 0x10ec0889:
3fb4a508
TI
1149 set_eapd(codec, 0x14, 1);
1150 set_eapd(codec, 0x15, 1);
c9b58006 1151 break;
bdd148a3 1152 }
c9b58006
KY
1153 switch (codec->vendor_id) {
1154 case 0x10ec0260:
1155 snd_hda_codec_write(codec, 0x1a, 0,
1156 AC_VERB_SET_COEF_INDEX, 7);
1157 tmp = snd_hda_codec_read(codec, 0x1a, 0,
1158 AC_VERB_GET_PROC_COEF, 0);
1159 snd_hda_codec_write(codec, 0x1a, 0,
1160 AC_VERB_SET_COEF_INDEX, 7);
1161 snd_hda_codec_write(codec, 0x1a, 0,
1162 AC_VERB_SET_PROC_COEF,
1163 tmp | 0x2010);
1164 break;
1165 case 0x10ec0262:
1166 case 0x10ec0880:
1167 case 0x10ec0882:
1168 case 0x10ec0883:
1169 case 0x10ec0885:
4a5a4c56 1170 case 0x10ec0887:
20a3a05d 1171 case 0x10ec0889:
87a8c370 1172 alc889_coef_init(codec);
c9b58006 1173 break;
f9423e7a 1174 case 0x10ec0888:
4a79ba34 1175 alc888_coef_init(codec);
f9423e7a 1176 break;
0aea778e 1177#if 0 /* XXX: This may cause the silent output on speaker on some machines */
c9b58006
KY
1178 case 0x10ec0267:
1179 case 0x10ec0268:
1180 snd_hda_codec_write(codec, 0x20, 0,
1181 AC_VERB_SET_COEF_INDEX, 7);
1182 tmp = snd_hda_codec_read(codec, 0x20, 0,
1183 AC_VERB_GET_PROC_COEF, 0);
1184 snd_hda_codec_write(codec, 0x20, 0,
ea1fb29a 1185 AC_VERB_SET_COEF_INDEX, 7);
c9b58006
KY
1186 snd_hda_codec_write(codec, 0x20, 0,
1187 AC_VERB_SET_PROC_COEF,
1188 tmp | 0x3000);
1189 break;
0aea778e 1190#endif /* XXX */
bc9f98a9 1191 }
4a79ba34
TI
1192 break;
1193 }
1194}
1195
1196static void alc_init_auto_hp(struct hda_codec *codec)
1197{
1198 struct alc_spec *spec = codec->spec;
1199
1200 if (!spec->autocfg.hp_pins[0])
1201 return;
1202
1203 if (!spec->autocfg.speaker_pins[0]) {
2a2ed0df
TI
1204 if (spec->autocfg.line_out_pins[0] &&
1205 spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
4a79ba34
TI
1206 spec->autocfg.speaker_pins[0] =
1207 spec->autocfg.line_out_pins[0];
1208 else
1209 return;
1210 }
1211
2a2ed0df
TI
1212 snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1213 spec->autocfg.hp_pins[0]);
4a79ba34
TI
1214 snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0,
1215 AC_VERB_SET_UNSOLICITED_ENABLE,
1216 AC_USRSP_EN | ALC880_HP_EVENT);
1217 spec->unsol_event = alc_sku_unsol_event;
1218}
1219
6c819492
TI
1220static void alc_init_auto_mic(struct hda_codec *codec)
1221{
1222 struct alc_spec *spec = codec->spec;
1223 struct auto_pin_cfg *cfg = &spec->autocfg;
1224 hda_nid_t fixed, ext;
1225 int i;
1226
1227 /* there must be only two mic inputs exclusively */
1228 for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++)
1229 if (cfg->input_pins[i])
1230 return;
1231
1232 fixed = ext = 0;
1233 for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) {
1234 hda_nid_t nid = cfg->input_pins[i];
1235 unsigned int defcfg;
1236 if (!nid)
1237 return;
1238 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1239 switch (get_defcfg_connect(defcfg)) {
1240 case AC_JACK_PORT_FIXED:
1241 if (fixed)
1242 return; /* already occupied */
1243 fixed = nid;
1244 break;
1245 case AC_JACK_PORT_COMPLEX:
1246 if (ext)
1247 return; /* already occupied */
1248 ext = nid;
1249 break;
1250 default:
1251 return; /* invalid entry */
1252 }
1253 }
eaa9b3a7
TI
1254 if (!ext || !fixed)
1255 return;
6c819492
TI
1256 if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1257 return; /* no unsol support */
1258 snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1259 ext, fixed);
1260 spec->ext_mic.pin = ext;
1261 spec->int_mic.pin = fixed;
1262 spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1263 spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1264 spec->auto_mic = 1;
1265 snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1266 AC_VERB_SET_UNSOLICITED_ENABLE,
1267 AC_USRSP_EN | ALC880_MIC_EVENT);
1268 spec->unsol_event = alc_sku_unsol_event;
1269}
1270
da00c244
KY
1271static int alc_auto_parse_customize_define(struct hda_codec *codec)
1272{
1273 unsigned int ass, tmp, i;
7fb56223 1274 unsigned nid = 0;
da00c244
KY
1275 struct alc_spec *spec = codec->spec;
1276
1277 ass = codec->subsystem_id & 0xffff;
f189efcd
TI
1278 if (ass != codec->bus->pci->subsystem_device && (ass & 1)) {
1279 spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
da00c244 1280 goto do_sku;
f189efcd 1281 }
da00c244
KY
1282
1283 nid = 0x1d;
1284 if (codec->vendor_id == 0x10ec0260)
1285 nid = 0x17;
1286 ass = snd_hda_codec_get_pincfg(codec, nid);
1287
1288 if (!(ass & 1)) {
1289 printk(KERN_INFO "hda_codec: %s: SKU not ready 0x%08x\n",
1290 codec->chip_name, ass);
1291 return -1;
1292 }
1293
1294 /* check sum */
1295 tmp = 0;
1296 for (i = 1; i < 16; i++) {
1297 if ((ass >> i) & 1)
1298 tmp++;
1299 }
1300 if (((ass >> 16) & 0xf) != tmp)
1301 return -1;
1302
1303 spec->cdefine.port_connectivity = ass >> 30;
1304 spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
1305 spec->cdefine.check_sum = (ass >> 16) & 0xf;
1306 spec->cdefine.customization = ass >> 8;
1307do_sku:
1308 spec->cdefine.sku_cfg = ass;
1309 spec->cdefine.external_amp = (ass & 0x38) >> 3;
1310 spec->cdefine.platform_type = (ass & 0x4) >> 2;
1311 spec->cdefine.swap = (ass & 0x2) >> 1;
1312 spec->cdefine.override = ass & 0x1;
1313
1314 snd_printd("SKU: Nid=0x%x sku_cfg=0x%08x\n",
1315 nid, spec->cdefine.sku_cfg);
1316 snd_printd("SKU: port_connectivity=0x%x\n",
1317 spec->cdefine.port_connectivity);
1318 snd_printd("SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
1319 snd_printd("SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
1320 snd_printd("SKU: customization=0x%08x\n", spec->cdefine.customization);
1321 snd_printd("SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
1322 snd_printd("SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
1323 snd_printd("SKU: swap=0x%x\n", spec->cdefine.swap);
1324 snd_printd("SKU: override=0x%x\n", spec->cdefine.override);
1325
1326 return 0;
1327}
1328
4a79ba34
TI
1329/* check subsystem ID and set up device-specific initialization;
1330 * return 1 if initialized, 0 if invalid SSID
1331 */
1332/* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1333 * 31 ~ 16 : Manufacture ID
1334 * 15 ~ 8 : SKU ID
1335 * 7 ~ 0 : Assembly ID
1336 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1337 */
1338static int alc_subsystem_id(struct hda_codec *codec,
1339 hda_nid_t porta, hda_nid_t porte,
6227cdce 1340 hda_nid_t portd, hda_nid_t porti)
4a79ba34
TI
1341{
1342 unsigned int ass, tmp, i;
1343 unsigned nid;
1344 struct alc_spec *spec = codec->spec;
1345
1346 ass = codec->subsystem_id & 0xffff;
1347 if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1348 goto do_sku;
1349
1350 /* invalid SSID, check the special NID pin defcfg instead */
1351 /*
def319f9 1352 * 31~30 : port connectivity
4a79ba34
TI
1353 * 29~21 : reserve
1354 * 20 : PCBEEP input
1355 * 19~16 : Check sum (15:1)
1356 * 15~1 : Custom
1357 * 0 : override
1358 */
1359 nid = 0x1d;
1360 if (codec->vendor_id == 0x10ec0260)
1361 nid = 0x17;
1362 ass = snd_hda_codec_get_pincfg(codec, nid);
1363 snd_printd("realtek: No valid SSID, "
1364 "checking pincfg 0x%08x for NID 0x%x\n",
cb6605c1 1365 ass, nid);
6227cdce 1366 if (!(ass & 1))
4a79ba34
TI
1367 return 0;
1368 if ((ass >> 30) != 1) /* no physical connection */
1369 return 0;
1370
1371 /* check sum */
1372 tmp = 0;
1373 for (i = 1; i < 16; i++) {
1374 if ((ass >> i) & 1)
1375 tmp++;
1376 }
1377 if (((ass >> 16) & 0xf) != tmp)
1378 return 0;
1379do_sku:
1380 snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1381 ass & 0xffff, codec->vendor_id);
1382 /*
1383 * 0 : override
1384 * 1 : Swap Jack
1385 * 2 : 0 --> Desktop, 1 --> Laptop
1386 * 3~5 : External Amplifier control
1387 * 7~6 : Reserved
1388 */
1389 tmp = (ass & 0x38) >> 3; /* external Amp control */
1390 switch (tmp) {
1391 case 1:
1392 spec->init_amp = ALC_INIT_GPIO1;
1393 break;
1394 case 3:
1395 spec->init_amp = ALC_INIT_GPIO2;
1396 break;
1397 case 7:
1398 spec->init_amp = ALC_INIT_GPIO3;
1399 break;
1400 case 5:
1401 spec->init_amp = ALC_INIT_DEFAULT;
bc9f98a9
KY
1402 break;
1403 }
ea1fb29a 1404
8c427226 1405 /* is laptop or Desktop and enable the function "Mute internal speaker
c9b58006
KY
1406 * when the external headphone out jack is plugged"
1407 */
8c427226 1408 if (!(ass & 0x8000))
4a79ba34 1409 return 1;
c9b58006
KY
1410 /*
1411 * 10~8 : Jack location
1412 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1413 * 14~13: Resvered
1414 * 15 : 1 --> enable the function "Mute internal speaker
1415 * when the external headphone out jack is plugged"
1416 */
c9b58006 1417 if (!spec->autocfg.hp_pins[0]) {
01d4825d 1418 hda_nid_t nid;
c9b58006
KY
1419 tmp = (ass >> 11) & 0x3; /* HP to chassis */
1420 if (tmp == 0)
01d4825d 1421 nid = porta;
c9b58006 1422 else if (tmp == 1)
01d4825d 1423 nid = porte;
c9b58006 1424 else if (tmp == 2)
01d4825d 1425 nid = portd;
6227cdce
KY
1426 else if (tmp == 3)
1427 nid = porti;
c9b58006 1428 else
4a79ba34 1429 return 1;
01d4825d
TI
1430 for (i = 0; i < spec->autocfg.line_outs; i++)
1431 if (spec->autocfg.line_out_pins[i] == nid)
1432 return 1;
1433 spec->autocfg.hp_pins[0] = nid;
c9b58006
KY
1434 }
1435
4a79ba34 1436 alc_init_auto_hp(codec);
6c819492 1437 alc_init_auto_mic(codec);
4a79ba34
TI
1438 return 1;
1439}
ea1fb29a 1440
4a79ba34 1441static void alc_ssid_check(struct hda_codec *codec,
6227cdce
KY
1442 hda_nid_t porta, hda_nid_t porte,
1443 hda_nid_t portd, hda_nid_t porti)
4a79ba34 1444{
6227cdce 1445 if (!alc_subsystem_id(codec, porta, porte, portd, porti)) {
4a79ba34
TI
1446 struct alc_spec *spec = codec->spec;
1447 snd_printd("realtek: "
1448 "Enable default setup for auto mode as fallback\n");
1449 spec->init_amp = ALC_INIT_DEFAULT;
1450 alc_init_auto_hp(codec);
6c819492 1451 alc_init_auto_mic(codec);
4a79ba34 1452 }
bc9f98a9
KY
1453}
1454
f95474ec 1455/*
f8f25ba3 1456 * Fix-up pin default configurations and add default verbs
f95474ec
TI
1457 */
1458
1459struct alc_pincfg {
1460 hda_nid_t nid;
1461 u32 val;
1462};
1463
f8f25ba3
TI
1464struct alc_fixup {
1465 const struct alc_pincfg *pins;
1466 const struct hda_verb *verbs;
1467};
1468
1469static void alc_pick_fixup(struct hda_codec *codec,
f95474ec 1470 const struct snd_pci_quirk *quirk,
7fa90e87
TI
1471 const struct alc_fixup *fix,
1472 int pre_init)
f95474ec
TI
1473{
1474 const struct alc_pincfg *cfg;
1475
1476 quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1477 if (!quirk)
1478 return;
f8f25ba3
TI
1479 fix += quirk->value;
1480 cfg = fix->pins;
7fa90e87
TI
1481 if (pre_init && cfg) {
1482#ifdef CONFIG_SND_DEBUG_VERBOSE
1483 snd_printdd(KERN_INFO "hda_codec: %s: Apply pincfg for %s\n",
1484 codec->chip_name, quirk->name);
1485#endif
f8f25ba3
TI
1486 for (; cfg->nid; cfg++)
1487 snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1488 }
7fa90e87
TI
1489 if (!pre_init && fix->verbs) {
1490#ifdef CONFIG_SND_DEBUG_VERBOSE
1491 snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-verbs for %s\n",
1492 codec->chip_name, quirk->name);
1493#endif
f8f25ba3 1494 add_verb(codec->spec, fix->verbs);
7fa90e87 1495 }
f95474ec
TI
1496}
1497
274693f3
KY
1498static int alc_read_coef_idx(struct hda_codec *codec,
1499 unsigned int coef_idx)
1500{
1501 unsigned int val;
1502 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1503 coef_idx);
1504 val = snd_hda_codec_read(codec, 0x20, 0,
1505 AC_VERB_GET_PROC_COEF, 0);
1506 return val;
1507}
1508
ef8ef5fb
VP
1509/*
1510 * ALC888
1511 */
1512
1513/*
1514 * 2ch mode
1515 */
1516static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1517/* Mic-in jack as mic in */
1518 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1519 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1520/* Line-in jack as Line in */
1521 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1522 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1523/* Line-Out as Front */
1524 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1525 { } /* end */
1526};
1527
1528/*
1529 * 4ch mode
1530 */
1531static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1532/* Mic-in jack as mic in */
1533 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1534 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1535/* Line-in jack as Surround */
1536 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1537 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1538/* Line-Out as Front */
1539 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1540 { } /* end */
1541};
1542
1543/*
1544 * 6ch mode
1545 */
1546static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1547/* Mic-in jack as CLFE */
1548 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1549 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1550/* Line-in jack as Surround */
1551 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1552 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1553/* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1554 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1555 { } /* end */
1556};
1557
1558/*
1559 * 8ch mode
1560 */
1561static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1562/* Mic-in jack as CLFE */
1563 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1564 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1565/* Line-in jack as Surround */
1566 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1567 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1568/* Line-Out as Side */
1569 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1570 { } /* end */
1571};
1572
1573static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1574 { 2, alc888_4ST_ch2_intel_init },
1575 { 4, alc888_4ST_ch4_intel_init },
1576 { 6, alc888_4ST_ch6_intel_init },
1577 { 8, alc888_4ST_ch8_intel_init },
1578};
1579
1580/*
1581 * ALC888 Fujitsu Siemens Amillo xa3530
1582 */
1583
1584static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1585/* Front Mic: set to PIN_IN (empty by default) */
1586 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1587/* Connect Internal HP to Front */
1588 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1589 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1590 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1591/* Connect Bass HP to Front */
1592 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1593 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1594 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1595/* Connect Line-Out side jack (SPDIF) to Side */
1596 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1597 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1598 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1599/* Connect Mic jack to CLFE */
1600 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1601 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1602 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1603/* Connect Line-in jack to Surround */
1604 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1605 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1606 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1607/* Connect HP out jack to Front */
1608 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1609 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1610 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1611/* Enable unsolicited event for HP jack and Line-out jack */
1612 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1613 {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1614 {}
1615};
1616
a9fd4f3f 1617static void alc_automute_amp(struct hda_codec *codec)
ef8ef5fb 1618{
a9fd4f3f 1619 struct alc_spec *spec = codec->spec;
864f92be 1620 unsigned int mute;
a9fd4f3f
TI
1621 hda_nid_t nid;
1622 int i;
1623
1624 spec->jack_present = 0;
1625 for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1626 nid = spec->autocfg.hp_pins[i];
1627 if (!nid)
1628 break;
864f92be 1629 if (snd_hda_jack_detect(codec, nid)) {
a9fd4f3f
TI
1630 spec->jack_present = 1;
1631 break;
1632 }
1633 }
1634
1635 mute = spec->jack_present ? HDA_AMP_MUTE : 0;
ef8ef5fb 1636 /* Toggle internal speakers muting */
a9fd4f3f
TI
1637 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1638 nid = spec->autocfg.speaker_pins[i];
1639 if (!nid)
1640 break;
1641 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1642 HDA_AMP_MUTE, mute);
1643 }
ef8ef5fb
VP
1644}
1645
a9fd4f3f
TI
1646static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1647 unsigned int res)
ef8ef5fb 1648{
a9fd4f3f
TI
1649 if (codec->vendor_id == 0x10ec0880)
1650 res >>= 28;
1651 else
1652 res >>= 26;
1653 if (res == ALC880_HP_EVENT)
1654 alc_automute_amp(codec);
ef8ef5fb
VP
1655}
1656
4f5d1706 1657static void alc889_automute_setup(struct hda_codec *codec)
6732bd0d
WF
1658{
1659 struct alc_spec *spec = codec->spec;
1660
1661 spec->autocfg.hp_pins[0] = 0x15;
1662 spec->autocfg.speaker_pins[0] = 0x14;
1663 spec->autocfg.speaker_pins[1] = 0x16;
1664 spec->autocfg.speaker_pins[2] = 0x17;
1665 spec->autocfg.speaker_pins[3] = 0x19;
1666 spec->autocfg.speaker_pins[4] = 0x1a;
6732bd0d
WF
1667}
1668
1669static void alc889_intel_init_hook(struct hda_codec *codec)
1670{
1671 alc889_coef_init(codec);
4f5d1706 1672 alc_automute_amp(codec);
6732bd0d
WF
1673}
1674
4f5d1706 1675static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
a9fd4f3f
TI
1676{
1677 struct alc_spec *spec = codec->spec;
1678
1679 spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1680 spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1681 spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1682 spec->autocfg.speaker_pins[1] = 0x15; /* bass */
a9fd4f3f 1683}
ef8ef5fb 1684
5b2d1eca
VP
1685/*
1686 * ALC888 Acer Aspire 4930G model
1687 */
1688
1689static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1690/* Front Mic: set to PIN_IN (empty by default) */
1691 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1692/* Unselect Front Mic by default in input mixer 3 */
1693 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
ef8ef5fb 1694/* Enable unsolicited event for HP jack */
5b2d1eca
VP
1695 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1696/* Connect Internal HP to front */
1697 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1698 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1699 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1700/* Connect HP out to front */
1701 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1702 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1703 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1704 { }
1705};
1706
d2fd4b09
TV
1707/*
1708 * ALC888 Acer Aspire 6530G model
1709 */
1710
1711static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
d1284182
TV
1712/* Route to built-in subwoofer as well as speakers */
1713 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1714 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1715 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1716 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
d2fd4b09
TV
1717/* Bias voltage on for external mic port */
1718 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
320d5920
EL
1719/* Front Mic: set to PIN_IN (empty by default) */
1720 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1721/* Unselect Front Mic by default in input mixer 3 */
1722 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
d2fd4b09
TV
1723/* Enable unsolicited event for HP jack */
1724 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1725/* Enable speaker output */
1726 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1727 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
d1284182 1728 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
d2fd4b09
TV
1729/* Enable headphone output */
1730 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1731 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1732 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
d1284182 1733 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
d2fd4b09
TV
1734 { }
1735};
1736
3b315d70 1737/*
018df418 1738 * ALC889 Acer Aspire 8930G model
3b315d70
HM
1739 */
1740
018df418 1741static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
3b315d70
HM
1742/* Front Mic: set to PIN_IN (empty by default) */
1743 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1744/* Unselect Front Mic by default in input mixer 3 */
1745 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1746/* Enable unsolicited event for HP jack */
1747 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1748/* Connect Internal Front to Front */
1749 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1750 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1751 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1752/* Connect Internal Rear to Rear */
1753 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1754 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1755 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1756/* Connect Internal CLFE to CLFE */
1757 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1758 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1759 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1760/* Connect HP out to Front */
018df418 1761 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
3b315d70
HM
1762 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1763 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1764/* Enable all DACs */
1765/* DAC DISABLE/MUTE 1? */
1766/* setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1767 {0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1768 {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1769/* DAC DISABLE/MUTE 2? */
1770/* some bit here disables the other DACs. Init=0x4900 */
1771 {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1772 {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
018df418
HM
1773/* DMIC fix
1774 * This laptop has a stereo digital microphone. The mics are only 1cm apart
1775 * which makes the stereo useless. However, either the mic or the ALC889
1776 * makes the signal become a difference/sum signal instead of standard
1777 * stereo, which is annoying. So instead we flip this bit which makes the
1778 * codec replicate the sum signal to both channels, turning it into a
1779 * normal mono mic.
1780 */
1781/* DMIC_CONTROL? Init value = 0x0001 */
1782 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
1783 {0x20, AC_VERB_SET_PROC_COEF, 0x0003},
3b315d70
HM
1784 { }
1785};
1786
ef8ef5fb 1787static struct hda_input_mux alc888_2_capture_sources[2] = {
5b2d1eca
VP
1788 /* Front mic only available on one ADC */
1789 {
1790 .num_items = 4,
1791 .items = {
1792 { "Mic", 0x0 },
1793 { "Line", 0x2 },
1794 { "CD", 0x4 },
1795 { "Front Mic", 0xb },
1796 },
1797 },
1798 {
1799 .num_items = 3,
1800 .items = {
1801 { "Mic", 0x0 },
1802 { "Line", 0x2 },
1803 { "CD", 0x4 },
1804 },
1805 }
1806};
1807
d2fd4b09
TV
1808static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
1809 /* Interal mic only available on one ADC */
1810 {
684a8842 1811 .num_items = 5,
d2fd4b09
TV
1812 .items = {
1813 { "Ext Mic", 0x0 },
684a8842 1814 { "Line In", 0x2 },
d2fd4b09 1815 { "CD", 0x4 },
684a8842 1816 { "Input Mix", 0xa },
d2fd4b09
TV
1817 { "Int Mic", 0xb },
1818 },
1819 },
1820 {
684a8842 1821 .num_items = 4,
d2fd4b09
TV
1822 .items = {
1823 { "Ext Mic", 0x0 },
684a8842 1824 { "Line In", 0x2 },
d2fd4b09 1825 { "CD", 0x4 },
684a8842 1826 { "Input Mix", 0xa },
d2fd4b09
TV
1827 },
1828 }
1829};
1830
018df418
HM
1831static struct hda_input_mux alc889_capture_sources[3] = {
1832 /* Digital mic only available on first "ADC" */
1833 {
1834 .num_items = 5,
1835 .items = {
1836 { "Mic", 0x0 },
1837 { "Line", 0x2 },
1838 { "CD", 0x4 },
1839 { "Front Mic", 0xb },
1840 { "Input Mix", 0xa },
1841 },
1842 },
1843 {
1844 .num_items = 4,
1845 .items = {
1846 { "Mic", 0x0 },
1847 { "Line", 0x2 },
1848 { "CD", 0x4 },
1849 { "Input Mix", 0xa },
1850 },
1851 },
1852 {
1853 .num_items = 4,
1854 .items = {
1855 { "Mic", 0x0 },
1856 { "Line", 0x2 },
1857 { "CD", 0x4 },
1858 { "Input Mix", 0xa },
1859 },
1860 }
1861};
1862
ef8ef5fb 1863static struct snd_kcontrol_new alc888_base_mixer[] = {
5b2d1eca
VP
1864 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1865 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1866 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1867 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1868 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1869 HDA_OUTPUT),
1870 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1871 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1872 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1873 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1874 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1875 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1876 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1877 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1878 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1879 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1880 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1881 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
5b2d1eca
VP
1882 { } /* end */
1883};
1884
556eea9a
HM
1885static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
1886 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1887 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1888 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1889 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1890 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1891 HDA_OUTPUT),
1892 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1893 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1894 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1895 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1896 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1897 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1898 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1899 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1900 { } /* end */
1901};
1902
1903
4f5d1706 1904static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
5b2d1eca 1905{
a9fd4f3f 1906 struct alc_spec *spec = codec->spec;
5b2d1eca 1907
a9fd4f3f
TI
1908 spec->autocfg.hp_pins[0] = 0x15;
1909 spec->autocfg.speaker_pins[0] = 0x14;
7cef4cf1
ŁW
1910 spec->autocfg.speaker_pins[1] = 0x16;
1911 spec->autocfg.speaker_pins[2] = 0x17;
5b2d1eca
VP
1912}
1913
4f5d1706 1914static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
320d5920
EL
1915{
1916 struct alc_spec *spec = codec->spec;
1917
1918 spec->autocfg.hp_pins[0] = 0x15;
1919 spec->autocfg.speaker_pins[0] = 0x14;
1920 spec->autocfg.speaker_pins[1] = 0x16;
1921 spec->autocfg.speaker_pins[2] = 0x17;
320d5920
EL
1922}
1923
4f5d1706 1924static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
3b315d70
HM
1925{
1926 struct alc_spec *spec = codec->spec;
1927
1928 spec->autocfg.hp_pins[0] = 0x15;
1929 spec->autocfg.speaker_pins[0] = 0x14;
1930 spec->autocfg.speaker_pins[1] = 0x16;
1931 spec->autocfg.speaker_pins[2] = 0x1b;
3b315d70
HM
1932}
1933
1da177e4 1934/*
e9edcee0
TI
1935 * ALC880 3-stack model
1936 *
1937 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
9c7f852e
TI
1938 * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
1939 * F-Mic = 0x1b, HP = 0x19
1da177e4
LT
1940 */
1941
e9edcee0
TI
1942static hda_nid_t alc880_dac_nids[4] = {
1943 /* front, rear, clfe, rear_surr */
1944 0x02, 0x05, 0x04, 0x03
1945};
1946
1947static hda_nid_t alc880_adc_nids[3] = {
1948 /* ADC0-2 */
1949 0x07, 0x08, 0x09,
1950};
1951
1952/* The datasheet says the node 0x07 is connected from inputs,
1953 * but it shows zero connection in the real implementation on some devices.
df694daa 1954 * Note: this is a 915GAV bug, fixed on 915GLV
1da177e4 1955 */
e9edcee0
TI
1956static hda_nid_t alc880_adc_nids_alt[2] = {
1957 /* ADC1-2 */
1958 0x08, 0x09,
1959};
1960
1961#define ALC880_DIGOUT_NID 0x06
1962#define ALC880_DIGIN_NID 0x0a
1963
1964static struct hda_input_mux alc880_capture_source = {
1965 .num_items = 4,
1966 .items = {
1967 { "Mic", 0x0 },
1968 { "Front Mic", 0x3 },
1969 { "Line", 0x2 },
1970 { "CD", 0x4 },
1971 },
1972};
1973
1974/* channel source setting (2/6 channel selection for 3-stack) */
1975/* 2ch mode */
1976static struct hda_verb alc880_threestack_ch2_init[] = {
1977 /* set line-in to input, mute it */
1978 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1979 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1980 /* set mic-in to input vref 80%, mute it */
1981 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1982 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1983 { } /* end */
1984};
1985
1986/* 6ch mode */
1987static struct hda_verb alc880_threestack_ch6_init[] = {
1988 /* set line-in to output, unmute it */
1989 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1990 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1991 /* set mic-in to output, unmute it */
1992 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1993 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1994 { } /* end */
1995};
1996
d2a6d7dc 1997static struct hda_channel_mode alc880_threestack_modes[2] = {
e9edcee0
TI
1998 { 2, alc880_threestack_ch2_init },
1999 { 6, alc880_threestack_ch6_init },
2000};
2001
c8b6bf9b 2002static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
05acb863 2003 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2004 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
05acb863 2005 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
985be54b 2006 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
05acb863
TI
2007 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2008 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
985be54b
TI
2009 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2010 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1da177e4
LT
2011 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2012 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2013 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2014 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2015 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2016 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2017 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
2018 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
e9edcee0
TI
2019 HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
2020 {
2021 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2022 .name = "Channel Mode",
df694daa
KY
2023 .info = alc_ch_mode_info,
2024 .get = alc_ch_mode_get,
2025 .put = alc_ch_mode_put,
e9edcee0
TI
2026 },
2027 { } /* end */
2028};
2029
2030/* capture mixer elements */
f9e336f6
TI
2031static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
2032 struct snd_ctl_elem_info *uinfo)
2033{
2034 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2035 struct alc_spec *spec = codec->spec;
2036 int err;
1da177e4 2037
5a9e02e9 2038 mutex_lock(&codec->control_mutex);
f9e336f6
TI
2039 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2040 HDA_INPUT);
2041 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
5a9e02e9 2042 mutex_unlock(&codec->control_mutex);
f9e336f6
TI
2043 return err;
2044}
2045
2046static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
2047 unsigned int size, unsigned int __user *tlv)
2048{
2049 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2050 struct alc_spec *spec = codec->spec;
2051 int err;
1da177e4 2052
5a9e02e9 2053 mutex_lock(&codec->control_mutex);
f9e336f6
TI
2054 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2055 HDA_INPUT);
2056 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
5a9e02e9 2057 mutex_unlock(&codec->control_mutex);
f9e336f6
TI
2058 return err;
2059}
2060
2061typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
2062 struct snd_ctl_elem_value *ucontrol);
2063
2064static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
2065 struct snd_ctl_elem_value *ucontrol,
2066 getput_call_t func)
2067{
2068 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2069 struct alc_spec *spec = codec->spec;
2070 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2071 int err;
2072
5a9e02e9 2073 mutex_lock(&codec->control_mutex);
f9e336f6
TI
2074 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
2075 3, 0, HDA_INPUT);
2076 err = func(kcontrol, ucontrol);
5a9e02e9 2077 mutex_unlock(&codec->control_mutex);
f9e336f6
TI
2078 return err;
2079}
2080
2081static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
2082 struct snd_ctl_elem_value *ucontrol)
2083{
2084 return alc_cap_getput_caller(kcontrol, ucontrol,
2085 snd_hda_mixer_amp_volume_get);
2086}
2087
2088static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
2089 struct snd_ctl_elem_value *ucontrol)
2090{
2091 return alc_cap_getput_caller(kcontrol, ucontrol,
2092 snd_hda_mixer_amp_volume_put);
2093}
2094
2095/* capture mixer elements */
2096#define alc_cap_sw_info snd_ctl_boolean_stereo_info
2097
2098static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
2099 struct snd_ctl_elem_value *ucontrol)
2100{
2101 return alc_cap_getput_caller(kcontrol, ucontrol,
2102 snd_hda_mixer_amp_switch_get);
2103}
2104
2105static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
2106 struct snd_ctl_elem_value *ucontrol)
2107{
2108 return alc_cap_getput_caller(kcontrol, ucontrol,
2109 snd_hda_mixer_amp_switch_put);
2110}
2111
a23b688f 2112#define _DEFINE_CAPMIX(num) \
f9e336f6
TI
2113 { \
2114 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2115 .name = "Capture Switch", \
2116 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
2117 .count = num, \
2118 .info = alc_cap_sw_info, \
2119 .get = alc_cap_sw_get, \
2120 .put = alc_cap_sw_put, \
2121 }, \
2122 { \
2123 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2124 .name = "Capture Volume", \
2125 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2126 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2127 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
2128 .count = num, \
2129 .info = alc_cap_vol_info, \
2130 .get = alc_cap_vol_get, \
2131 .put = alc_cap_vol_put, \
2132 .tlv = { .c = alc_cap_vol_tlv }, \
a23b688f
TI
2133 }
2134
2135#define _DEFINE_CAPSRC(num) \
3c3e9892
TI
2136 { \
2137 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2138 /* .name = "Capture Source", */ \
2139 .name = "Input Source", \
2140 .count = num, \
2141 .info = alc_mux_enum_info, \
2142 .get = alc_mux_enum_get, \
2143 .put = alc_mux_enum_put, \
a23b688f
TI
2144 }
2145
2146#define DEFINE_CAPMIX(num) \
2147static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2148 _DEFINE_CAPMIX(num), \
2149 _DEFINE_CAPSRC(num), \
2150 { } /* end */ \
2151}
2152
2153#define DEFINE_CAPMIX_NOSRC(num) \
2154static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2155 _DEFINE_CAPMIX(num), \
2156 { } /* end */ \
f9e336f6
TI
2157}
2158
2159/* up to three ADCs */
2160DEFINE_CAPMIX(1);
2161DEFINE_CAPMIX(2);
2162DEFINE_CAPMIX(3);
a23b688f
TI
2163DEFINE_CAPMIX_NOSRC(1);
2164DEFINE_CAPMIX_NOSRC(2);
2165DEFINE_CAPMIX_NOSRC(3);
e9edcee0
TI
2166
2167/*
2168 * ALC880 5-stack model
2169 *
9c7f852e
TI
2170 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2171 * Side = 0x02 (0xd)
e9edcee0
TI
2172 * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2173 * Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2174 */
2175
2176/* additional mixers to alc880_three_stack_mixer */
c8b6bf9b 2177static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
e9edcee0 2178 HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 2179 HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
1da177e4
LT
2180 { } /* end */
2181};
2182
e9edcee0
TI
2183/* channel source setting (6/8 channel selection for 5-stack) */
2184/* 6ch mode */
2185static struct hda_verb alc880_fivestack_ch6_init[] = {
2186 /* set line-in to input, mute it */
2187 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2188 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
dfc0ff62
TI
2189 { } /* end */
2190};
2191
e9edcee0
TI
2192/* 8ch mode */
2193static struct hda_verb alc880_fivestack_ch8_init[] = {
2194 /* set line-in to output, unmute it */
2195 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2196 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2197 { } /* end */
2198};
2199
d2a6d7dc 2200static struct hda_channel_mode alc880_fivestack_modes[2] = {
e9edcee0
TI
2201 { 6, alc880_fivestack_ch6_init },
2202 { 8, alc880_fivestack_ch8_init },
2203};
2204
2205
2206/*
2207 * ALC880 6-stack model
2208 *
9c7f852e
TI
2209 * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2210 * Side = 0x05 (0x0f)
e9edcee0
TI
2211 * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2212 * Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2213 */
2214
2215static hda_nid_t alc880_6st_dac_nids[4] = {
2216 /* front, rear, clfe, rear_surr */
2217 0x02, 0x03, 0x04, 0x05
f12ab1e0 2218};
e9edcee0
TI
2219
2220static struct hda_input_mux alc880_6stack_capture_source = {
2221 .num_items = 4,
2222 .items = {
2223 { "Mic", 0x0 },
2224 { "Front Mic", 0x1 },
2225 { "Line", 0x2 },
2226 { "CD", 0x4 },
2227 },
2228};
2229
2230/* fixed 8-channels */
d2a6d7dc 2231static struct hda_channel_mode alc880_sixstack_modes[1] = {
e9edcee0
TI
2232 { 8, NULL },
2233};
2234
c8b6bf9b 2235static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
16ded525 2236 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2237 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16ded525 2238 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 2239 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
16ded525
TI
2240 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2241 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
985be54b
TI
2242 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2243 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
16ded525 2244 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
985be54b 2245 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
16ded525
TI
2246 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2247 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2248 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2249 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2250 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2251 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2252 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2253 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16ded525
TI
2254 {
2255 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2256 .name = "Channel Mode",
df694daa
KY
2257 .info = alc_ch_mode_info,
2258 .get = alc_ch_mode_get,
2259 .put = alc_ch_mode_put,
16ded525
TI
2260 },
2261 { } /* end */
2262};
2263
e9edcee0
TI
2264
2265/*
2266 * ALC880 W810 model
2267 *
2268 * W810 has rear IO for:
2269 * Front (DAC 02)
2270 * Surround (DAC 03)
2271 * Center/LFE (DAC 04)
2272 * Digital out (06)
2273 *
2274 * The system also has a pair of internal speakers, and a headphone jack.
2275 * These are both connected to Line2 on the codec, hence to DAC 02.
ea1fb29a 2276 *
e9edcee0
TI
2277 * There is a variable resistor to control the speaker or headphone
2278 * volume. This is a hardware-only device without a software API.
2279 *
2280 * Plugging headphones in will disable the internal speakers. This is
2281 * implemented in hardware, not via the driver using jack sense. In
2282 * a similar fashion, plugging into the rear socket marked "front" will
2283 * disable both the speakers and headphones.
2284 *
2285 * For input, there's a microphone jack, and an "audio in" jack.
2286 * These may not do anything useful with this driver yet, because I
2287 * haven't setup any initialization verbs for these yet...
2288 */
2289
2290static hda_nid_t alc880_w810_dac_nids[3] = {
2291 /* front, rear/surround, clfe */
2292 0x02, 0x03, 0x04
16ded525
TI
2293};
2294
e9edcee0 2295/* fixed 6 channels */
d2a6d7dc 2296static struct hda_channel_mode alc880_w810_modes[1] = {
e9edcee0
TI
2297 { 6, NULL }
2298};
2299
2300/* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
c8b6bf9b 2301static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
16ded525 2302 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2303 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16ded525 2304 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 2305 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
16ded525
TI
2306 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2307 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
985be54b
TI
2308 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2309 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
e9edcee0
TI
2310 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2311 { } /* end */
2312};
2313
2314
2315/*
2316 * Z710V model
2317 *
2318 * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
9c7f852e
TI
2319 * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2320 * Line = 0x1a
e9edcee0
TI
2321 */
2322
2323static hda_nid_t alc880_z71v_dac_nids[1] = {
2324 0x02
2325};
2326#define ALC880_Z71V_HP_DAC 0x03
2327
2328/* fixed 2 channels */
d2a6d7dc 2329static struct hda_channel_mode alc880_2_jack_modes[1] = {
e9edcee0
TI
2330 { 2, NULL }
2331};
2332
c8b6bf9b 2333static struct snd_kcontrol_new alc880_z71v_mixer[] = {
e9edcee0 2334 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2335 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
e9edcee0 2336 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 2337 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
16ded525
TI
2338 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2339 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16ded525
TI
2340 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2341 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16ded525
TI
2342 { } /* end */
2343};
2344
e9edcee0 2345
e9edcee0
TI
2346/*
2347 * ALC880 F1734 model
2348 *
2349 * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2350 * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2351 */
2352
2353static hda_nid_t alc880_f1734_dac_nids[1] = {
2354 0x03
2355};
2356#define ALC880_F1734_HP_DAC 0x02
2357
c8b6bf9b 2358static struct snd_kcontrol_new alc880_f1734_mixer[] = {
e9edcee0 2359 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2360 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2134ea4f
TI
2361 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2362 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
e9edcee0
TI
2363 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2364 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
937b4160
TI
2365 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2366 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
e9edcee0
TI
2367 { } /* end */
2368};
2369
937b4160
TI
2370static struct hda_input_mux alc880_f1734_capture_source = {
2371 .num_items = 2,
2372 .items = {
2373 { "Mic", 0x1 },
2374 { "CD", 0x4 },
2375 },
2376};
2377
e9edcee0 2378
e9edcee0
TI
2379/*
2380 * ALC880 ASUS model
2381 *
2382 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2383 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2384 * Mic = 0x18, Line = 0x1a
2385 */
2386
2387#define alc880_asus_dac_nids alc880_w810_dac_nids /* identical with w810 */
2388#define alc880_asus_modes alc880_threestack_modes /* 2/6 channel mode */
2389
c8b6bf9b 2390static struct snd_kcontrol_new alc880_asus_mixer[] = {
16ded525 2391 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 2392 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16ded525 2393 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 2394 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
16ded525
TI
2395 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2396 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
985be54b
TI
2397 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2398 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
16ded525
TI
2399 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2400 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2401 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2402 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16ded525
TI
2403 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2404 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16ded525
TI
2405 {
2406 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2407 .name = "Channel Mode",
df694daa
KY
2408 .info = alc_ch_mode_info,
2409 .get = alc_ch_mode_get,
2410 .put = alc_ch_mode_put,
16ded525
TI
2411 },
2412 { } /* end */
2413};
e9edcee0 2414
e9edcee0
TI
2415/*
2416 * ALC880 ASUS W1V model
2417 *
2418 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2419 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2420 * Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2421 */
2422
2423/* additional mixers to alc880_asus_mixer */
c8b6bf9b 2424static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
e9edcee0
TI
2425 HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2426 HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2427 { } /* end */
2428};
2429
df694daa
KY
2430/* TCL S700 */
2431static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2432 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2433 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2434 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2435 HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
2436 HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
2437 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2438 HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2439 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2440 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
df694daa
KY
2441 { } /* end */
2442};
2443
ccc656ce
KY
2444/* Uniwill */
2445static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2134ea4f
TI
2446 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2447 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2448 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2449 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
ccc656ce
KY
2450 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2451 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2452 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2453 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2454 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2455 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2456 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2457 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2458 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2459 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2460 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2461 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
ccc656ce
KY
2462 {
2463 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2464 .name = "Channel Mode",
2465 .info = alc_ch_mode_info,
2466 .get = alc_ch_mode_get,
2467 .put = alc_ch_mode_put,
2468 },
2469 { } /* end */
2470};
2471
2cf9f0fc
TD
2472static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2473 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2474 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2475 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2476 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2477 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2478 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2479 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2480 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2481 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2482 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2483 { } /* end */
2484};
2485
ccc656ce 2486static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2134ea4f
TI
2487 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2488 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2489 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2490 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
ccc656ce
KY
2491 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2492 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2493 { } /* end */
2494};
2495
2134ea4f
TI
2496/*
2497 * virtual master controls
2498 */
2499
2500/*
2501 * slave controls for virtual master
2502 */
2503static const char *alc_slave_vols[] = {
2504 "Front Playback Volume",
2505 "Surround Playback Volume",
2506 "Center Playback Volume",
2507 "LFE Playback Volume",
2508 "Side Playback Volume",
2509 "Headphone Playback Volume",
2510 "Speaker Playback Volume",
2511 "Mono Playback Volume",
2134ea4f 2512 "Line-Out Playback Volume",
26f5df26 2513 "PCM Playback Volume",
2134ea4f
TI
2514 NULL,
2515};
2516
2517static const char *alc_slave_sws[] = {
2518 "Front Playback Switch",
2519 "Surround Playback Switch",
2520 "Center Playback Switch",
2521 "LFE Playback Switch",
2522 "Side Playback Switch",
2523 "Headphone Playback Switch",
2524 "Speaker Playback Switch",
2525 "Mono Playback Switch",
edb54a55 2526 "IEC958 Playback Switch",
23033b2b
TI
2527 "Line-Out Playback Switch",
2528 "PCM Playback Switch",
2134ea4f
TI
2529 NULL,
2530};
2531
1da177e4 2532/*
e9edcee0 2533 * build control elements
1da177e4 2534 */
603c4019 2535
5b0cb1d8
JK
2536#define NID_MAPPING (-1)
2537
2538#define SUBDEV_SPEAKER_ (0 << 6)
2539#define SUBDEV_HP_ (1 << 6)
2540#define SUBDEV_LINE_ (2 << 6)
2541#define SUBDEV_SPEAKER(x) (SUBDEV_SPEAKER_ | ((x) & 0x3f))
2542#define SUBDEV_HP(x) (SUBDEV_HP_ | ((x) & 0x3f))
2543#define SUBDEV_LINE(x) (SUBDEV_LINE_ | ((x) & 0x3f))
2544
603c4019
TI
2545static void alc_free_kctls(struct hda_codec *codec);
2546
67d634c0 2547#ifdef CONFIG_SND_HDA_INPUT_BEEP
45bdd1c1
TI
2548/* additional beep mixers; the actual parameters are overwritten at build */
2549static struct snd_kcontrol_new alc_beep_mixer[] = {
2550 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
123c07ae 2551 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
45bdd1c1
TI
2552 { } /* end */
2553};
67d634c0 2554#endif
45bdd1c1 2555
1da177e4
LT
2556static int alc_build_controls(struct hda_codec *codec)
2557{
2558 struct alc_spec *spec = codec->spec;
2f44f847 2559 struct snd_kcontrol *kctl = NULL;
5b0cb1d8
JK
2560 struct snd_kcontrol_new *knew;
2561 int i, j, err;
2562 unsigned int u;
2563 hda_nid_t nid;
1da177e4
LT
2564
2565 for (i = 0; i < spec->num_mixers; i++) {
2566 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2567 if (err < 0)
2568 return err;
2569 }
f9e336f6
TI
2570 if (spec->cap_mixer) {
2571 err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2572 if (err < 0)
2573 return err;
2574 }
1da177e4 2575 if (spec->multiout.dig_out_nid) {
9c7f852e
TI
2576 err = snd_hda_create_spdif_out_ctls(codec,
2577 spec->multiout.dig_out_nid);
1da177e4
LT
2578 if (err < 0)
2579 return err;
e64f14f4
TI
2580 if (!spec->no_analog) {
2581 err = snd_hda_create_spdif_share_sw(codec,
2582 &spec->multiout);
2583 if (err < 0)
2584 return err;
2585 spec->multiout.share_spdif = 1;
2586 }
1da177e4
LT
2587 }
2588 if (spec->dig_in_nid) {
2589 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2590 if (err < 0)
2591 return err;
2592 }
2134ea4f 2593
67d634c0 2594#ifdef CONFIG_SND_HDA_INPUT_BEEP
45bdd1c1
TI
2595 /* create beep controls if needed */
2596 if (spec->beep_amp) {
2597 struct snd_kcontrol_new *knew;
2598 for (knew = alc_beep_mixer; knew->name; knew++) {
2599 struct snd_kcontrol *kctl;
2600 kctl = snd_ctl_new1(knew, codec);
2601 if (!kctl)
2602 return -ENOMEM;
2603 kctl->private_value = spec->beep_amp;
5e26dfd0 2604 err = snd_hda_ctl_add(codec, 0, kctl);
45bdd1c1
TI
2605 if (err < 0)
2606 return err;
2607 }
2608 }
67d634c0 2609#endif
45bdd1c1 2610
2134ea4f 2611 /* if we have no master control, let's create it */
e64f14f4
TI
2612 if (!spec->no_analog &&
2613 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
1c82ed1b 2614 unsigned int vmaster_tlv[4];
2134ea4f 2615 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
1c82ed1b 2616 HDA_OUTPUT, vmaster_tlv);
2134ea4f 2617 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
1c82ed1b 2618 vmaster_tlv, alc_slave_vols);
2134ea4f
TI
2619 if (err < 0)
2620 return err;
2621 }
e64f14f4
TI
2622 if (!spec->no_analog &&
2623 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2134ea4f
TI
2624 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2625 NULL, alc_slave_sws);
2626 if (err < 0)
2627 return err;
2628 }
2629
5b0cb1d8 2630 /* assign Capture Source enums to NID */
fbe618f2
TI
2631 if (spec->capsrc_nids || spec->adc_nids) {
2632 kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
2633 if (!kctl)
2634 kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
2635 for (i = 0; kctl && i < kctl->count; i++) {
2636 hda_nid_t *nids = spec->capsrc_nids;
2637 if (!nids)
2638 nids = spec->adc_nids;
2639 err = snd_hda_add_nid(codec, kctl, i, nids[i]);
2640 if (err < 0)
2641 return err;
2642 }
5b0cb1d8
JK
2643 }
2644 if (spec->cap_mixer) {
2645 const char *kname = kctl ? kctl->id.name : NULL;
2646 for (knew = spec->cap_mixer; knew->name; knew++) {
2647 if (kname && strcmp(knew->name, kname) == 0)
2648 continue;
2649 kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2650 for (i = 0; kctl && i < kctl->count; i++) {
2651 err = snd_hda_add_nid(codec, kctl, i,
2652 spec->adc_nids[i]);
2653 if (err < 0)
2654 return err;
2655 }
2656 }
2657 }
2658
2659 /* other nid->control mapping */
2660 for (i = 0; i < spec->num_mixers; i++) {
2661 for (knew = spec->mixers[i]; knew->name; knew++) {
2662 if (knew->iface != NID_MAPPING)
2663 continue;
2664 kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2665 if (kctl == NULL)
2666 continue;
2667 u = knew->subdevice;
2668 for (j = 0; j < 4; j++, u >>= 8) {
2669 nid = u & 0x3f;
2670 if (nid == 0)
2671 continue;
2672 switch (u & 0xc0) {
2673 case SUBDEV_SPEAKER_:
2674 nid = spec->autocfg.speaker_pins[nid];
2675 break;
2676 case SUBDEV_LINE_:
2677 nid = spec->autocfg.line_out_pins[nid];
2678 break;
2679 case SUBDEV_HP_:
2680 nid = spec->autocfg.hp_pins[nid];
2681 break;
2682 default:
2683 continue;
2684 }
2685 err = snd_hda_add_nid(codec, kctl, 0, nid);
2686 if (err < 0)
2687 return err;
2688 }
2689 u = knew->private_value;
2690 for (j = 0; j < 4; j++, u >>= 8) {
2691 nid = u & 0xff;
2692 if (nid == 0)
2693 continue;
2694 err = snd_hda_add_nid(codec, kctl, 0, nid);
2695 if (err < 0)
2696 return err;
2697 }
2698 }
2699 }
bae84e70
TI
2700
2701 alc_free_kctls(codec); /* no longer needed */
2702
1da177e4
LT
2703 return 0;
2704}
2705
e9edcee0 2706
1da177e4
LT
2707/*
2708 * initialize the codec volumes, etc
2709 */
2710
e9edcee0
TI
2711/*
2712 * generic initialization of ADC, input mixers and output mixers
2713 */
2714static struct hda_verb alc880_volume_init_verbs[] = {
2715 /*
2716 * Unmute ADC0-2 and set the default input to mic-in
2717 */
71fe7b82 2718 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
e9edcee0 2719 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
71fe7b82 2720 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
e9edcee0 2721 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
71fe7b82 2722 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
e9edcee0 2723 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1da177e4 2724
e9edcee0
TI
2725 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2726 * mixer widget
9c7f852e
TI
2727 * Note: PASD motherboards uses the Line In 2 as the input for front
2728 * panel mic (mic 2)
1da177e4 2729 */
e9edcee0 2730 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
2731 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2732 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2733 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2734 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2735 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2736 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2737 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
1da177e4 2738
e9edcee0
TI
2739 /*
2740 * Set up output mixers (0x0c - 0x0f)
1da177e4 2741 */
e9edcee0
TI
2742 /* set vol=0 to output mixers */
2743 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2744 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2745 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2746 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2747 /* set up input amps for analog loopback */
2748 /* Amp Indices: DAC = 0, mixer = 1 */
05acb863
TI
2749 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2750 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
05acb863
TI
2751 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2752 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
05acb863
TI
2753 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2754 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
05acb863
TI
2755 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2756 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4
LT
2757
2758 { }
2759};
2760
e9edcee0
TI
2761/*
2762 * 3-stack pin configuration:
2763 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2764 */
2765static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2766 /*
2767 * preset connection lists of input pins
2768 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2769 */
2770 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2771 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2772 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2773
2774 /*
2775 * Set pin mode and muting
2776 */
2777 /* set front pin widgets 0x14 for output */
05acb863 2778 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0
TI
2779 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2780 /* Mic1 (rear panel) pin widget for input and vref at 80% */
2781 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2782 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2783 /* Mic2 (as headphone out) for HP output */
2784 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2785 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 2786 /* Line In pin widget for input */
05acb863 2787 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
e9edcee0
TI
2788 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2789 /* Line2 (as front mic) pin widget for input and vref at 80% */
2790 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2791 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1da177e4 2792 /* CD pin widget for input */
05acb863 2793 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1da177e4 2794
e9edcee0
TI
2795 { }
2796};
1da177e4 2797
e9edcee0
TI
2798/*
2799 * 5-stack pin configuration:
2800 * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
2801 * line-in/side = 0x1a, f-mic = 0x1b
2802 */
2803static struct hda_verb alc880_pin_5stack_init_verbs[] = {
2804 /*
2805 * preset connection lists of input pins
2806 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
1da177e4 2807 */
e9edcee0
TI
2808 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2809 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
1da177e4 2810
e9edcee0
TI
2811 /*
2812 * Set pin mode and muting
1da177e4 2813 */
e9edcee0
TI
2814 /* set pin widgets 0x14-0x17 for output */
2815 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2816 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2817 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2818 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2819 /* unmute pins for output (no gain on this amp) */
2820 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2821 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2822 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2823 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2824
2825 /* Mic1 (rear panel) pin widget for input and vref at 80% */
2826 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2827 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2828 /* Mic2 (as headphone out) for HP output */
2829 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2830 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2831 /* Line In pin widget for input */
2832 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2833 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2834 /* Line2 (as front mic) pin widget for input and vref at 80% */
2835 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2836 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2837 /* CD pin widget for input */
2838 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1da177e4
LT
2839
2840 { }
2841};
2842
e9edcee0
TI
2843/*
2844 * W810 pin configuration:
2845 * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
2846 */
2847static struct hda_verb alc880_pin_w810_init_verbs[] = {
2848 /* hphone/speaker input selector: front DAC */
2849 {0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
1da177e4 2850
05acb863 2851 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2852 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
05acb863 2853 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2854 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
05acb863 2855 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2856 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 2857
e9edcee0 2858 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
05acb863 2859 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
1da177e4 2860
1da177e4
LT
2861 { }
2862};
2863
e9edcee0
TI
2864/*
2865 * Z71V pin configuration:
2866 * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
2867 */
2868static struct hda_verb alc880_pin_z71v_init_verbs[] = {
05acb863 2869 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2870 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
05acb863 2871 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
e9edcee0 2872 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
dfc0ff62 2873
16ded525 2874 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0 2875 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16ded525 2876 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0 2877 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16ded525
TI
2878
2879 { }
2880};
2881
e9edcee0
TI
2882/*
2883 * 6-stack pin configuration:
9c7f852e
TI
2884 * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
2885 * f-mic = 0x19, line = 0x1a, HP = 0x1b
e9edcee0
TI
2886 */
2887static struct hda_verb alc880_pin_6stack_init_verbs[] = {
2888 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2889
16ded525 2890 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2891 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2892 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2893 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2894 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 2895 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2896 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0
TI
2897 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2898
16ded525 2899 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0 2900 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16ded525 2901 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0 2902 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16ded525 2903 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
e9edcee0 2904 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16ded525 2905 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
e9edcee0 2906 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 2907 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
ea1fb29a 2908
e9edcee0
TI
2909 { }
2910};
2911
ccc656ce
KY
2912/*
2913 * Uniwill pin configuration:
2914 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
2915 * line = 0x1a
2916 */
2917static struct hda_verb alc880_uniwill_init_verbs[] = {
2918 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2919
2920 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2921 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2922 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2923 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2924 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2925 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2926 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2927 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2928 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2929 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2930 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2931 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2932 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2933 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2934
2935 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2936 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2937 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2938 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2939 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2940 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2941 /* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
2942 /* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
2943 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2944
2945 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2946 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
2947
2948 { }
2949};
2950
2951/*
2952* Uniwill P53
ea1fb29a 2953* HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
ccc656ce
KY
2954 */
2955static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
2956 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2957
2958 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2959 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2960 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2961 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2962 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2963 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2964 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2965 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2966 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2967 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2968 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2969 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2970
2971 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2972 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2973 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2974 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2975 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2976 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2977
2978 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2979 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
2980
2981 { }
2982};
2983
2cf9f0fc
TD
2984static struct hda_verb alc880_beep_init_verbs[] = {
2985 { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
2986 { }
2987};
2988
458a4fab
TI
2989/* auto-toggle front mic */
2990static void alc880_uniwill_mic_automute(struct hda_codec *codec)
2991{
2992 unsigned int present;
2993 unsigned char bits;
ccc656ce 2994
864f92be 2995 present = snd_hda_jack_detect(codec, 0x18);
47fd830a
TI
2996 bits = present ? HDA_AMP_MUTE : 0;
2997 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
458a4fab
TI
2998}
2999
4f5d1706 3000static void alc880_uniwill_setup(struct hda_codec *codec)
458a4fab 3001{
a9fd4f3f
TI
3002 struct alc_spec *spec = codec->spec;
3003
3004 spec->autocfg.hp_pins[0] = 0x14;
3005 spec->autocfg.speaker_pins[0] = 0x15;
3006 spec->autocfg.speaker_pins[0] = 0x16;
4f5d1706
TI
3007}
3008
3009static void alc880_uniwill_init_hook(struct hda_codec *codec)
3010{
a9fd4f3f 3011 alc_automute_amp(codec);
458a4fab 3012 alc880_uniwill_mic_automute(codec);
ccc656ce
KY
3013}
3014
3015static void alc880_uniwill_unsol_event(struct hda_codec *codec,
3016 unsigned int res)
3017{
3018 /* Looks like the unsol event is incompatible with the standard
3019 * definition. 4bit tag is placed at 28 bit!
3020 */
458a4fab 3021 switch (res >> 28) {
458a4fab
TI
3022 case ALC880_MIC_EVENT:
3023 alc880_uniwill_mic_automute(codec);
3024 break;
a9fd4f3f
TI
3025 default:
3026 alc_automute_amp_unsol_event(codec, res);
3027 break;
458a4fab 3028 }
ccc656ce
KY
3029}
3030
4f5d1706 3031static void alc880_uniwill_p53_setup(struct hda_codec *codec)
ccc656ce 3032{
a9fd4f3f 3033 struct alc_spec *spec = codec->spec;
ccc656ce 3034
a9fd4f3f
TI
3035 spec->autocfg.hp_pins[0] = 0x14;
3036 spec->autocfg.speaker_pins[0] = 0x15;
ccc656ce
KY
3037}
3038
3039static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
3040{
3041 unsigned int present;
ea1fb29a 3042
ccc656ce 3043 present = snd_hda_codec_read(codec, 0x21, 0,
47fd830a
TI
3044 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
3045 present &= HDA_AMP_VOLMASK;
3046 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
3047 HDA_AMP_VOLMASK, present);
3048 snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
3049 HDA_AMP_VOLMASK, present);
ccc656ce 3050}
47fd830a 3051
ccc656ce
KY
3052static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
3053 unsigned int res)
3054{
3055 /* Looks like the unsol event is incompatible with the standard
3056 * definition. 4bit tag is placed at 28 bit!
3057 */
f12ab1e0 3058 if ((res >> 28) == ALC880_DCVOL_EVENT)
ccc656ce 3059 alc880_uniwill_p53_dcvol_automute(codec);
a9fd4f3f
TI
3060 else
3061 alc_automute_amp_unsol_event(codec, res);
ccc656ce
KY
3062}
3063
e9edcee0
TI
3064/*
3065 * F1734 pin configuration:
3066 * HP = 0x14, speaker-out = 0x15, mic = 0x18
3067 */
3068static struct hda_verb alc880_pin_f1734_init_verbs[] = {
ee7a9c7c 3069 {0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
16ded525
TI
3070 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3071 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3072 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3073 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3074
e9edcee0 3075 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16ded525 3076 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
e9edcee0 3077 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16ded525 3078 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 3079
e9edcee0
TI
3080 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3081 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
ee7a9c7c 3082 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
e9edcee0 3083 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16ded525 3084 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 3085 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 3086 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 3087 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 3088 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
dfc0ff62 3089
937b4160
TI
3090 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
3091 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
3092
dfc0ff62
TI
3093 { }
3094};
3095
e9edcee0
TI
3096/*
3097 * ASUS pin configuration:
3098 * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
3099 */
3100static struct hda_verb alc880_pin_asus_init_verbs[] = {
16ded525
TI
3101 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3102 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3103 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3104 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3105
3106 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
e9edcee0 3107 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 3108 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 3109 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 3110 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 3111 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 3112 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0
TI
3113 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3114
3115 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3116 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3117 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3118 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3119 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3120 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16ded525 3121 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
e9edcee0 3122 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16ded525 3123 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
ea1fb29a 3124
e9edcee0
TI
3125 { }
3126};
16ded525 3127
e9edcee0 3128/* Enable GPIO mask and set output */
bc9f98a9
KY
3129#define alc880_gpio1_init_verbs alc_gpio1_init_verbs
3130#define alc880_gpio2_init_verbs alc_gpio2_init_verbs
64a8be74 3131#define alc880_gpio3_init_verbs alc_gpio3_init_verbs
df694daa
KY
3132
3133/* Clevo m520g init */
3134static struct hda_verb alc880_pin_clevo_init_verbs[] = {
3135 /* headphone output */
3136 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3137 /* line-out */
3138 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3139 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3140 /* Line-in */
3141 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3142 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3143 /* CD */
3144 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3145 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3146 /* Mic1 (rear panel) */
3147 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3148 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3149 /* Mic2 (front panel) */
3150 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3151 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3152 /* headphone */
3153 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3154 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3155 /* change to EAPD mode */
3156 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3157 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
3158
3159 { }
16ded525
TI
3160};
3161
df694daa 3162static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
4b146cb0
TI
3163 /* change to EAPD mode */
3164 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3165 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
3166
df694daa
KY
3167 /* Headphone output */
3168 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3169 /* Front output*/
3170 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3171 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
3172
3173 /* Line In pin widget for input */
3174 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3175 /* CD pin widget for input */
3176 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3177 /* Mic1 (rear panel) pin widget for input and vref at 80% */
3178 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3179
3180 /* change to EAPD mode */
3181 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3182 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
3183
3184 { }
3185};
16ded525 3186
e9edcee0 3187/*
ae6b813a
TI
3188 * LG m1 express dual
3189 *
3190 * Pin assignment:
3191 * Rear Line-In/Out (blue): 0x14
3192 * Build-in Mic-In: 0x15
3193 * Speaker-out: 0x17
3194 * HP-Out (green): 0x1b
3195 * Mic-In/Out (red): 0x19
3196 * SPDIF-Out: 0x1e
3197 */
3198
3199/* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
3200static hda_nid_t alc880_lg_dac_nids[3] = {
3201 0x05, 0x02, 0x03
3202};
3203
3204/* seems analog CD is not working */
3205static struct hda_input_mux alc880_lg_capture_source = {
3206 .num_items = 3,
3207 .items = {
3208 { "Mic", 0x1 },
3209 { "Line", 0x5 },
3210 { "Internal Mic", 0x6 },
3211 },
3212};
3213
3214/* 2,4,6 channel modes */
3215static struct hda_verb alc880_lg_ch2_init[] = {
3216 /* set line-in and mic-in to input */
3217 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3218 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3219 { }
3220};
3221
3222static struct hda_verb alc880_lg_ch4_init[] = {
3223 /* set line-in to out and mic-in to input */
3224 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3225 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3226 { }
3227};
3228
3229static struct hda_verb alc880_lg_ch6_init[] = {
3230 /* set line-in and mic-in to output */
3231 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3232 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3233 { }
3234};
3235
3236static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3237 { 2, alc880_lg_ch2_init },
3238 { 4, alc880_lg_ch4_init },
3239 { 6, alc880_lg_ch6_init },
3240};
3241
3242static struct snd_kcontrol_new alc880_lg_mixer[] = {
2134ea4f
TI
3243 HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3244 HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
ae6b813a
TI
3245 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3246 HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3247 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3248 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3249 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3250 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3251 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3252 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3253 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3254 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3255 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3256 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3257 {
3258 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3259 .name = "Channel Mode",
3260 .info = alc_ch_mode_info,
3261 .get = alc_ch_mode_get,
3262 .put = alc_ch_mode_put,
3263 },
3264 { } /* end */
3265};
3266
3267static struct hda_verb alc880_lg_init_verbs[] = {
3268 /* set capture source to mic-in */
3269 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3270 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3271 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3272 /* mute all amp mixer inputs */
3273 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
cb53c626
TI
3274 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3275 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
ae6b813a
TI
3276 /* line-in to input */
3277 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3278 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3279 /* built-in mic */
3280 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3281 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3282 /* speaker-out */
3283 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3284 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3285 /* mic-in to input */
3286 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3287 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3288 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3289 /* HP-out */
3290 {0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3291 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3292 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3293 /* jack sense */
a9fd4f3f 3294 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
ae6b813a
TI
3295 { }
3296};
3297
3298/* toggle speaker-output according to the hp-jack state */
4f5d1706 3299static void alc880_lg_setup(struct hda_codec *codec)
ae6b813a 3300{
a9fd4f3f 3301 struct alc_spec *spec = codec->spec;
ae6b813a 3302
a9fd4f3f
TI
3303 spec->autocfg.hp_pins[0] = 0x1b;
3304 spec->autocfg.speaker_pins[0] = 0x17;
ae6b813a
TI
3305}
3306
d681518a
TI
3307/*
3308 * LG LW20
3309 *
3310 * Pin assignment:
3311 * Speaker-out: 0x14
3312 * Mic-In: 0x18
e4f41da9
CM
3313 * Built-in Mic-In: 0x19
3314 * Line-In: 0x1b
3315 * HP-Out: 0x1a
d681518a
TI
3316 * SPDIF-Out: 0x1e
3317 */
3318
d681518a 3319static struct hda_input_mux alc880_lg_lw_capture_source = {
e4f41da9 3320 .num_items = 3,
d681518a
TI
3321 .items = {
3322 { "Mic", 0x0 },
3323 { "Internal Mic", 0x1 },
e4f41da9 3324 { "Line In", 0x2 },
d681518a
TI
3325 },
3326};
3327
0a8c5da3
CM
3328#define alc880_lg_lw_modes alc880_threestack_modes
3329
d681518a 3330static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
0a8c5da3
CM
3331 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3332 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3333 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3334 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3335 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3336 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3337 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3338 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3339 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3340 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
d681518a
TI
3341 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3342 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3343 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3344 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
0a8c5da3
CM
3345 {
3346 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3347 .name = "Channel Mode",
3348 .info = alc_ch_mode_info,
3349 .get = alc_ch_mode_get,
3350 .put = alc_ch_mode_put,
3351 },
d681518a
TI
3352 { } /* end */
3353};
3354
3355static struct hda_verb alc880_lg_lw_init_verbs[] = {
0a8c5da3
CM
3356 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3357 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3358 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3359
d681518a
TI
3360 /* set capture source to mic-in */
3361 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3362 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3363 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
cb53c626 3364 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
d681518a
TI
3365 /* speaker-out */
3366 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3367 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3368 /* HP-out */
d681518a
TI
3369 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3370 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3371 /* mic-in to input */
3372 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3373 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3374 /* built-in mic */
3375 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3376 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3377 /* jack sense */
a9fd4f3f 3378 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
d681518a
TI
3379 { }
3380};
3381
3382/* toggle speaker-output according to the hp-jack state */
4f5d1706 3383static void alc880_lg_lw_setup(struct hda_codec *codec)
d681518a 3384{
a9fd4f3f 3385 struct alc_spec *spec = codec->spec;
d681518a 3386
a9fd4f3f
TI
3387 spec->autocfg.hp_pins[0] = 0x1b;
3388 spec->autocfg.speaker_pins[0] = 0x14;
d681518a
TI
3389}
3390
df99cd33
TI
3391static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3392 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3393 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3394 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3395 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3396 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3397 HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3398 { } /* end */
3399};
3400
3401static struct hda_input_mux alc880_medion_rim_capture_source = {
3402 .num_items = 2,
3403 .items = {
3404 { "Mic", 0x0 },
3405 { "Internal Mic", 0x1 },
3406 },
3407};
3408
3409static struct hda_verb alc880_medion_rim_init_verbs[] = {
3410 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3411
3412 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3413 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3414
3415 /* Mic1 (rear panel) pin widget for input and vref at 80% */
3416 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3417 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3418 /* Mic2 (as headphone out) for HP output */
3419 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3420 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3421 /* Internal Speaker */
3422 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3423 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3424
3425 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3426 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
3427
3428 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3429 { }
3430};
3431
3432/* toggle speaker-output according to the hp-jack state */
3433static void alc880_medion_rim_automute(struct hda_codec *codec)
3434{
a9fd4f3f
TI
3435 struct alc_spec *spec = codec->spec;
3436 alc_automute_amp(codec);
3437 /* toggle EAPD */
3438 if (spec->jack_present)
df99cd33
TI
3439 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3440 else
3441 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3442}
3443
3444static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3445 unsigned int res)
3446{
3447 /* Looks like the unsol event is incompatible with the standard
3448 * definition. 4bit tag is placed at 28 bit!
3449 */
3450 if ((res >> 28) == ALC880_HP_EVENT)
3451 alc880_medion_rim_automute(codec);
3452}
3453
4f5d1706 3454static void alc880_medion_rim_setup(struct hda_codec *codec)
a9fd4f3f
TI
3455{
3456 struct alc_spec *spec = codec->spec;
3457
3458 spec->autocfg.hp_pins[0] = 0x14;
3459 spec->autocfg.speaker_pins[0] = 0x1b;
a9fd4f3f
TI
3460}
3461
cb53c626
TI
3462#ifdef CONFIG_SND_HDA_POWER_SAVE
3463static struct hda_amp_list alc880_loopbacks[] = {
3464 { 0x0b, HDA_INPUT, 0 },
3465 { 0x0b, HDA_INPUT, 1 },
3466 { 0x0b, HDA_INPUT, 2 },
3467 { 0x0b, HDA_INPUT, 3 },
3468 { 0x0b, HDA_INPUT, 4 },
3469 { } /* end */
3470};
3471
3472static struct hda_amp_list alc880_lg_loopbacks[] = {
3473 { 0x0b, HDA_INPUT, 1 },
3474 { 0x0b, HDA_INPUT, 6 },
3475 { 0x0b, HDA_INPUT, 7 },
3476 { } /* end */
3477};
3478#endif
3479
ae6b813a
TI
3480/*
3481 * Common callbacks
e9edcee0
TI
3482 */
3483
1da177e4
LT
3484static int alc_init(struct hda_codec *codec)
3485{
3486 struct alc_spec *spec = codec->spec;
e9edcee0
TI
3487 unsigned int i;
3488
2c3bf9ab 3489 alc_fix_pll(codec);
4a79ba34 3490 alc_auto_init_amp(codec, spec->init_amp);
2c3bf9ab 3491
e9edcee0
TI
3492 for (i = 0; i < spec->num_init_verbs; i++)
3493 snd_hda_sequence_write(codec, spec->init_verbs[i]);
ae6b813a
TI
3494
3495 if (spec->init_hook)
3496 spec->init_hook(codec);
3497
ad35879a
TI
3498#ifdef CONFIG_SND_HDA_POWER_SAVE
3499 if (codec->patch_ops.check_power_status)
3500 codec->patch_ops.check_power_status(codec, 0x01);
3501#endif
1da177e4
LT
3502 return 0;
3503}
3504
ae6b813a
TI
3505static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3506{
3507 struct alc_spec *spec = codec->spec;
3508
3509 if (spec->unsol_event)
3510 spec->unsol_event(codec, res);
3511}
3512
cb53c626
TI
3513#ifdef CONFIG_SND_HDA_POWER_SAVE
3514static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3515{
3516 struct alc_spec *spec = codec->spec;
3517 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3518}
3519#endif
3520
1da177e4
LT
3521/*
3522 * Analog playback callbacks
3523 */
3524static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3525 struct hda_codec *codec,
c8b6bf9b 3526 struct snd_pcm_substream *substream)
1da177e4
LT
3527{
3528 struct alc_spec *spec = codec->spec;
9a08160b
TI
3529 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3530 hinfo);
1da177e4
LT
3531}
3532
3533static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3534 struct hda_codec *codec,
3535 unsigned int stream_tag,
3536 unsigned int format,
c8b6bf9b 3537 struct snd_pcm_substream *substream)
1da177e4
LT
3538{
3539 struct alc_spec *spec = codec->spec;
9c7f852e
TI
3540 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3541 stream_tag, format, substream);
1da177e4
LT
3542}
3543
3544static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3545 struct hda_codec *codec,
c8b6bf9b 3546 struct snd_pcm_substream *substream)
1da177e4
LT
3547{
3548 struct alc_spec *spec = codec->spec;
3549 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3550}
3551
3552/*
3553 * Digital out
3554 */
3555static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3556 struct hda_codec *codec,
c8b6bf9b 3557 struct snd_pcm_substream *substream)
1da177e4
LT
3558{
3559 struct alc_spec *spec = codec->spec;
3560 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3561}
3562
6b97eb45
TI
3563static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3564 struct hda_codec *codec,
3565 unsigned int stream_tag,
3566 unsigned int format,
3567 struct snd_pcm_substream *substream)
3568{
3569 struct alc_spec *spec = codec->spec;
3570 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3571 stream_tag, format, substream);
3572}
3573
9b5f12e5
TI
3574static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3575 struct hda_codec *codec,
3576 struct snd_pcm_substream *substream)
3577{
3578 struct alc_spec *spec = codec->spec;
3579 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3580}
3581
1da177e4
LT
3582static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3583 struct hda_codec *codec,
c8b6bf9b 3584 struct snd_pcm_substream *substream)
1da177e4
LT
3585{
3586 struct alc_spec *spec = codec->spec;
3587 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3588}
3589
3590/*
3591 * Analog capture
3592 */
6330079f 3593static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
1da177e4
LT
3594 struct hda_codec *codec,
3595 unsigned int stream_tag,
3596 unsigned int format,
c8b6bf9b 3597 struct snd_pcm_substream *substream)
1da177e4
LT
3598{
3599 struct alc_spec *spec = codec->spec;
3600
6330079f 3601 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
1da177e4
LT
3602 stream_tag, 0, format);
3603 return 0;
3604}
3605
6330079f 3606static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
1da177e4 3607 struct hda_codec *codec,
c8b6bf9b 3608 struct snd_pcm_substream *substream)
1da177e4
LT
3609{
3610 struct alc_spec *spec = codec->spec;
3611
888afa15
TI
3612 snd_hda_codec_cleanup_stream(codec,
3613 spec->adc_nids[substream->number + 1]);
1da177e4
LT
3614 return 0;
3615}
3616
3617
3618/*
3619 */
3620static struct hda_pcm_stream alc880_pcm_analog_playback = {
3621 .substreams = 1,
3622 .channels_min = 2,
3623 .channels_max = 8,
e9edcee0 3624 /* NID is set in alc_build_pcms */
1da177e4
LT
3625 .ops = {
3626 .open = alc880_playback_pcm_open,
3627 .prepare = alc880_playback_pcm_prepare,
3628 .cleanup = alc880_playback_pcm_cleanup
3629 },
3630};
3631
3632static struct hda_pcm_stream alc880_pcm_analog_capture = {
6330079f
TI
3633 .substreams = 1,
3634 .channels_min = 2,
3635 .channels_max = 2,
3636 /* NID is set in alc_build_pcms */
3637};
3638
3639static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3640 .substreams = 1,
3641 .channels_min = 2,
3642 .channels_max = 2,
3643 /* NID is set in alc_build_pcms */
3644};
3645
3646static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3647 .substreams = 2, /* can be overridden */
1da177e4
LT
3648 .channels_min = 2,
3649 .channels_max = 2,
e9edcee0 3650 /* NID is set in alc_build_pcms */
1da177e4 3651 .ops = {
6330079f
TI
3652 .prepare = alc880_alt_capture_pcm_prepare,
3653 .cleanup = alc880_alt_capture_pcm_cleanup
1da177e4
LT
3654 },
3655};
3656
3657static struct hda_pcm_stream alc880_pcm_digital_playback = {
3658 .substreams = 1,
3659 .channels_min = 2,
3660 .channels_max = 2,
3661 /* NID is set in alc_build_pcms */
3662 .ops = {
3663 .open = alc880_dig_playback_pcm_open,
6b97eb45 3664 .close = alc880_dig_playback_pcm_close,
9b5f12e5
TI
3665 .prepare = alc880_dig_playback_pcm_prepare,
3666 .cleanup = alc880_dig_playback_pcm_cleanup
1da177e4
LT
3667 },
3668};
3669
3670static struct hda_pcm_stream alc880_pcm_digital_capture = {
3671 .substreams = 1,
3672 .channels_min = 2,
3673 .channels_max = 2,
3674 /* NID is set in alc_build_pcms */
3675};
3676
4c5186ed 3677/* Used by alc_build_pcms to flag that a PCM has no playback stream */
6330079f 3678static struct hda_pcm_stream alc_pcm_null_stream = {
4c5186ed
JW
3679 .substreams = 0,
3680 .channels_min = 0,
3681 .channels_max = 0,
3682};
3683
1da177e4
LT
3684static int alc_build_pcms(struct hda_codec *codec)
3685{
3686 struct alc_spec *spec = codec->spec;
3687 struct hda_pcm *info = spec->pcm_rec;
3688 int i;
3689
3690 codec->num_pcms = 1;
3691 codec->pcm_info = info;
3692
e64f14f4
TI
3693 if (spec->no_analog)
3694 goto skip_analog;
3695
812a2cca
TI
3696 snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3697 "%s Analog", codec->chip_name);
1da177e4 3698 info->name = spec->stream_name_analog;
274693f3 3699
4a471b7d 3700 if (spec->stream_analog_playback) {
da3cec35
TI
3701 if (snd_BUG_ON(!spec->multiout.dac_nids))
3702 return -EINVAL;
4a471b7d
TI
3703 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3704 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3705 }
3706 if (spec->stream_analog_capture) {
da3cec35
TI
3707 if (snd_BUG_ON(!spec->adc_nids))
3708 return -EINVAL;
4a471b7d
TI
3709 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3710 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3711 }
3712
3713 if (spec->channel_mode) {
3714 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3715 for (i = 0; i < spec->num_channel_mode; i++) {
3716 if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3717 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3718 }
1da177e4
LT
3719 }
3720 }
3721
e64f14f4 3722 skip_analog:
e08a007d 3723 /* SPDIF for stream index #1 */
1da177e4 3724 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
812a2cca
TI
3725 snprintf(spec->stream_name_digital,
3726 sizeof(spec->stream_name_digital),
3727 "%s Digital", codec->chip_name);
e08a007d 3728 codec->num_pcms = 2;
b25c9da1 3729 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
c06134d7 3730 info = spec->pcm_rec + 1;
1da177e4 3731 info->name = spec->stream_name_digital;
8c441982
TI
3732 if (spec->dig_out_type)
3733 info->pcm_type = spec->dig_out_type;
3734 else
3735 info->pcm_type = HDA_PCM_TYPE_SPDIF;
4a471b7d
TI
3736 if (spec->multiout.dig_out_nid &&
3737 spec->stream_digital_playback) {
1da177e4
LT
3738 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3739 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3740 }
4a471b7d
TI
3741 if (spec->dig_in_nid &&
3742 spec->stream_digital_capture) {
1da177e4
LT
3743 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3744 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3745 }
963f803f
TI
3746 /* FIXME: do we need this for all Realtek codec models? */
3747 codec->spdif_status_reset = 1;
1da177e4
LT
3748 }
3749
e64f14f4
TI
3750 if (spec->no_analog)
3751 return 0;
3752
e08a007d
TI
3753 /* If the use of more than one ADC is requested for the current
3754 * model, configure a second analog capture-only PCM.
3755 */
3756 /* Additional Analaog capture for index #2 */
6330079f
TI
3757 if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
3758 (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
e08a007d 3759 codec->num_pcms = 3;
c06134d7 3760 info = spec->pcm_rec + 2;
e08a007d 3761 info->name = spec->stream_name_analog;
6330079f
TI
3762 if (spec->alt_dac_nid) {
3763 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3764 *spec->stream_analog_alt_playback;
3765 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3766 spec->alt_dac_nid;
3767 } else {
3768 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3769 alc_pcm_null_stream;
3770 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3771 }
3772 if (spec->num_adc_nids > 1) {
3773 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3774 *spec->stream_analog_alt_capture;
3775 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3776 spec->adc_nids[1];
3777 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3778 spec->num_adc_nids - 1;
3779 } else {
3780 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3781 alc_pcm_null_stream;
3782 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
e08a007d
TI
3783 }
3784 }
3785
1da177e4
LT
3786 return 0;
3787}
3788
a4e09aa3
TI
3789static inline void alc_shutup(struct hda_codec *codec)
3790{
3791 snd_hda_shutup_pins(codec);
3792}
3793
603c4019
TI
3794static void alc_free_kctls(struct hda_codec *codec)
3795{
3796 struct alc_spec *spec = codec->spec;
3797
3798 if (spec->kctls.list) {
3799 struct snd_kcontrol_new *kctl = spec->kctls.list;
3800 int i;
3801 for (i = 0; i < spec->kctls.used; i++)
3802 kfree(kctl[i].name);
3803 }
3804 snd_array_free(&spec->kctls);
3805}
3806
1da177e4
LT
3807static void alc_free(struct hda_codec *codec)
3808{
e9edcee0 3809 struct alc_spec *spec = codec->spec;
e9edcee0 3810
f12ab1e0 3811 if (!spec)
e9edcee0
TI
3812 return;
3813
a4e09aa3 3814 alc_shutup(codec);
603c4019 3815 alc_free_kctls(codec);
e9edcee0 3816 kfree(spec);
680cd536 3817 snd_hda_detach_beep_device(codec);
1da177e4
LT
3818}
3819
f5de24b0 3820#ifdef CONFIG_SND_HDA_POWER_SAVE
c97259df
DC
3821static void alc_power_eapd(struct hda_codec *codec)
3822{
3823 /* We currently only handle front, HP */
3824 switch (codec->vendor_id) {
3825 case 0x10ec0260:
9e4c8496
TI
3826 set_eapd(codec, 0x0f, 0);
3827 set_eapd(codec, 0x10, 0);
c97259df
DC
3828 break;
3829 case 0x10ec0262:
3830 case 0x10ec0267:
3831 case 0x10ec0268:
3832 case 0x10ec0269:
9e4c8496 3833 case 0x10ec0270:
c97259df
DC
3834 case 0x10ec0272:
3835 case 0x10ec0660:
3836 case 0x10ec0662:
3837 case 0x10ec0663:
3838 case 0x10ec0862:
3839 case 0x10ec0889:
9e4c8496
TI
3840 set_eapd(codec, 0x14, 0);
3841 set_eapd(codec, 0x15, 0);
c97259df
DC
3842 break;
3843 }
3844}
3845
f5de24b0
HM
3846static int alc_suspend(struct hda_codec *codec, pm_message_t state)
3847{
3848 struct alc_spec *spec = codec->spec;
a4e09aa3 3849 alc_shutup(codec);
f5de24b0 3850 if (spec && spec->power_hook)
c97259df 3851 spec->power_hook(codec);
f5de24b0
HM
3852 return 0;
3853}
3854#endif
3855
e044c39a 3856#ifdef SND_HDA_NEEDS_RESUME
e044c39a
TI
3857static int alc_resume(struct hda_codec *codec)
3858{
e044c39a
TI
3859 codec->patch_ops.init(codec);
3860 snd_hda_codec_resume_amp(codec);
3861 snd_hda_codec_resume_cache(codec);
ad35879a
TI
3862#ifdef CONFIG_SND_HDA_POWER_SAVE
3863 if (codec->patch_ops.check_power_status)
3864 codec->patch_ops.check_power_status(codec, 0x01);
3865#endif
e044c39a
TI
3866 return 0;
3867}
e044c39a
TI
3868#endif
3869
1da177e4
LT
3870/*
3871 */
3872static struct hda_codec_ops alc_patch_ops = {
3873 .build_controls = alc_build_controls,
3874 .build_pcms = alc_build_pcms,
3875 .init = alc_init,
3876 .free = alc_free,
ae6b813a 3877 .unsol_event = alc_unsol_event,
e044c39a
TI
3878#ifdef SND_HDA_NEEDS_RESUME
3879 .resume = alc_resume,
3880#endif
cb53c626 3881#ifdef CONFIG_SND_HDA_POWER_SAVE
f5de24b0 3882 .suspend = alc_suspend,
cb53c626
TI
3883 .check_power_status = alc_check_power_status,
3884#endif
c97259df 3885 .reboot_notify = alc_shutup,
1da177e4
LT
3886};
3887
c027ddcd
KY
3888/* replace the codec chip_name with the given string */
3889static int alc_codec_rename(struct hda_codec *codec, const char *name)
3890{
3891 kfree(codec->chip_name);
3892 codec->chip_name = kstrdup(name, GFP_KERNEL);
3893 if (!codec->chip_name) {
3894 alc_free(codec);
3895 return -ENOMEM;
3896 }
3897 return 0;
3898}
3899
2fa522be
TI
3900/*
3901 * Test configuration for debugging
3902 *
3903 * Almost all inputs/outputs are enabled. I/O pins can be configured via
3904 * enum controls.
3905 */
3906#ifdef CONFIG_SND_DEBUG
3907static hda_nid_t alc880_test_dac_nids[4] = {
3908 0x02, 0x03, 0x04, 0x05
3909};
3910
3911static struct hda_input_mux alc880_test_capture_source = {
ae6b813a 3912 .num_items = 7,
2fa522be
TI
3913 .items = {
3914 { "In-1", 0x0 },
3915 { "In-2", 0x1 },
3916 { "In-3", 0x2 },
3917 { "In-4", 0x3 },
3918 { "CD", 0x4 },
ae6b813a
TI
3919 { "Front", 0x5 },
3920 { "Surround", 0x6 },
2fa522be
TI
3921 },
3922};
3923
d2a6d7dc 3924static struct hda_channel_mode alc880_test_modes[4] = {
2fa522be 3925 { 2, NULL },
fd2c326d 3926 { 4, NULL },
2fa522be 3927 { 6, NULL },
fd2c326d 3928 { 8, NULL },
2fa522be
TI
3929};
3930
9c7f852e
TI
3931static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
3932 struct snd_ctl_elem_info *uinfo)
2fa522be
TI
3933{
3934 static char *texts[] = {
3935 "N/A", "Line Out", "HP Out",
3936 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
3937 };
3938 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3939 uinfo->count = 1;
3940 uinfo->value.enumerated.items = 8;
3941 if (uinfo->value.enumerated.item >= 8)
3942 uinfo->value.enumerated.item = 7;
3943 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3944 return 0;
3945}
3946
9c7f852e
TI
3947static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
3948 struct snd_ctl_elem_value *ucontrol)
2fa522be
TI
3949{
3950 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3951 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3952 unsigned int pin_ctl, item = 0;
3953
3954 pin_ctl = snd_hda_codec_read(codec, nid, 0,
3955 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3956 if (pin_ctl & AC_PINCTL_OUT_EN) {
3957 if (pin_ctl & AC_PINCTL_HP_EN)
3958 item = 2;
3959 else
3960 item = 1;
3961 } else if (pin_ctl & AC_PINCTL_IN_EN) {
3962 switch (pin_ctl & AC_PINCTL_VREFEN) {
3963 case AC_PINCTL_VREF_HIZ: item = 3; break;
3964 case AC_PINCTL_VREF_50: item = 4; break;
3965 case AC_PINCTL_VREF_GRD: item = 5; break;
3966 case AC_PINCTL_VREF_80: item = 6; break;
3967 case AC_PINCTL_VREF_100: item = 7; break;
3968 }
3969 }
3970 ucontrol->value.enumerated.item[0] = item;
3971 return 0;
3972}
3973
9c7f852e
TI
3974static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
3975 struct snd_ctl_elem_value *ucontrol)
2fa522be
TI
3976{
3977 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3978 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3979 static unsigned int ctls[] = {
3980 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
3981 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
3982 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
3983 AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
3984 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
3985 AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
3986 };
3987 unsigned int old_ctl, new_ctl;
3988
3989 old_ctl = snd_hda_codec_read(codec, nid, 0,
3990 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3991 new_ctl = ctls[ucontrol->value.enumerated.item[0]];
3992 if (old_ctl != new_ctl) {
82beb8fd
TI
3993 int val;
3994 snd_hda_codec_write_cache(codec, nid, 0,
3995 AC_VERB_SET_PIN_WIDGET_CONTROL,
3996 new_ctl);
47fd830a
TI
3997 val = ucontrol->value.enumerated.item[0] >= 3 ?
3998 HDA_AMP_MUTE : 0;
3999 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
4000 HDA_AMP_MUTE, val);
2fa522be
TI
4001 return 1;
4002 }
4003 return 0;
4004}
4005
9c7f852e
TI
4006static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
4007 struct snd_ctl_elem_info *uinfo)
2fa522be
TI
4008{
4009 static char *texts[] = {
4010 "Front", "Surround", "CLFE", "Side"
4011 };
4012 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4013 uinfo->count = 1;
4014 uinfo->value.enumerated.items = 4;
4015 if (uinfo->value.enumerated.item >= 4)
4016 uinfo->value.enumerated.item = 3;
4017 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
4018 return 0;
4019}
4020
9c7f852e
TI
4021static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
4022 struct snd_ctl_elem_value *ucontrol)
2fa522be
TI
4023{
4024 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4025 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4026 unsigned int sel;
4027
4028 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
4029 ucontrol->value.enumerated.item[0] = sel & 3;
4030 return 0;
4031}
4032
9c7f852e
TI
4033static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
4034 struct snd_ctl_elem_value *ucontrol)
2fa522be
TI
4035{
4036 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4037 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4038 unsigned int sel;
4039
4040 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
4041 if (ucontrol->value.enumerated.item[0] != sel) {
4042 sel = ucontrol->value.enumerated.item[0] & 3;
82beb8fd
TI
4043 snd_hda_codec_write_cache(codec, nid, 0,
4044 AC_VERB_SET_CONNECT_SEL, sel);
2fa522be
TI
4045 return 1;
4046 }
4047 return 0;
4048}
4049
4050#define PIN_CTL_TEST(xname,nid) { \
4051 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4052 .name = xname, \
5b0cb1d8 4053 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
2fa522be
TI
4054 .info = alc_test_pin_ctl_info, \
4055 .get = alc_test_pin_ctl_get, \
4056 .put = alc_test_pin_ctl_put, \
4057 .private_value = nid \
4058 }
4059
4060#define PIN_SRC_TEST(xname,nid) { \
4061 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4062 .name = xname, \
5b0cb1d8 4063 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
2fa522be
TI
4064 .info = alc_test_pin_src_info, \
4065 .get = alc_test_pin_src_get, \
4066 .put = alc_test_pin_src_put, \
4067 .private_value = nid \
4068 }
4069
c8b6bf9b 4070static struct snd_kcontrol_new alc880_test_mixer[] = {
05acb863
TI
4071 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
4072 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
4073 HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
4074 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
985be54b
TI
4075 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
4076 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
4077 HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
4078 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2fa522be
TI
4079 PIN_CTL_TEST("Front Pin Mode", 0x14),
4080 PIN_CTL_TEST("Surround Pin Mode", 0x15),
4081 PIN_CTL_TEST("CLFE Pin Mode", 0x16),
4082 PIN_CTL_TEST("Side Pin Mode", 0x17),
4083 PIN_CTL_TEST("In-1 Pin Mode", 0x18),
4084 PIN_CTL_TEST("In-2 Pin Mode", 0x19),
4085 PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
4086 PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
4087 PIN_SRC_TEST("In-1 Pin Source", 0x18),
4088 PIN_SRC_TEST("In-2 Pin Source", 0x19),
4089 PIN_SRC_TEST("In-3 Pin Source", 0x1a),
4090 PIN_SRC_TEST("In-4 Pin Source", 0x1b),
4091 HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
4092 HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
4093 HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
4094 HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
4095 HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
4096 HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
4097 HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
4098 HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
4099 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
4100 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
2fa522be
TI
4101 {
4102 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4103 .name = "Channel Mode",
df694daa
KY
4104 .info = alc_ch_mode_info,
4105 .get = alc_ch_mode_get,
4106 .put = alc_ch_mode_put,
2fa522be
TI
4107 },
4108 { } /* end */
4109};
4110
4111static struct hda_verb alc880_test_init_verbs[] = {
4112 /* Unmute inputs of 0x0c - 0x0f */
05acb863
TI
4113 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4114 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4115 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4116 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4117 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4118 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4119 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4120 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
2fa522be 4121 /* Vol output for 0x0c-0x0f */
05acb863
TI
4122 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4123 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4124 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4125 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2fa522be 4126 /* Set output pins 0x14-0x17 */
05acb863
TI
4127 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4128 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4129 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4130 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2fa522be 4131 /* Unmute output pins 0x14-0x17 */
05acb863
TI
4132 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4133 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4134 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4135 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2fa522be 4136 /* Set input pins 0x18-0x1c */
16ded525
TI
4137 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4138 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
05acb863
TI
4139 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4140 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4141 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2fa522be 4142 /* Mute input pins 0x18-0x1b */
05acb863
TI
4143 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4144 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4145 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4146 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
71fe7b82 4147 /* ADC set up */
05acb863 4148 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
71fe7b82 4149 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
05acb863 4150 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
71fe7b82 4151 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
05acb863 4152 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
71fe7b82 4153 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
05acb863
TI
4154 /* Analog input/passthru */
4155 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4156 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4157 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4158 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4159 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2fa522be
TI
4160 { }
4161};
4162#endif
4163
1da177e4
LT
4164/*
4165 */
4166
f5fcc13c
TI
4167static const char *alc880_models[ALC880_MODEL_LAST] = {
4168 [ALC880_3ST] = "3stack",
4169 [ALC880_TCL_S700] = "tcl",
4170 [ALC880_3ST_DIG] = "3stack-digout",
4171 [ALC880_CLEVO] = "clevo",
4172 [ALC880_5ST] = "5stack",
4173 [ALC880_5ST_DIG] = "5stack-digout",
4174 [ALC880_W810] = "w810",
4175 [ALC880_Z71V] = "z71v",
4176 [ALC880_6ST] = "6stack",
4177 [ALC880_6ST_DIG] = "6stack-digout",
4178 [ALC880_ASUS] = "asus",
4179 [ALC880_ASUS_W1V] = "asus-w1v",
4180 [ALC880_ASUS_DIG] = "asus-dig",
4181 [ALC880_ASUS_DIG2] = "asus-dig2",
4182 [ALC880_UNIWILL_DIG] = "uniwill",
2cf9f0fc
TD
4183 [ALC880_UNIWILL_P53] = "uniwill-p53",
4184 [ALC880_FUJITSU] = "fujitsu",
f5fcc13c
TI
4185 [ALC880_F1734] = "F1734",
4186 [ALC880_LG] = "lg",
4187 [ALC880_LG_LW] = "lg-lw",
df99cd33 4188 [ALC880_MEDION_RIM] = "medion",
2fa522be 4189#ifdef CONFIG_SND_DEBUG
f5fcc13c 4190 [ALC880_TEST] = "test",
2fa522be 4191#endif
f5fcc13c
TI
4192 [ALC880_AUTO] = "auto",
4193};
4194
4195static struct snd_pci_quirk alc880_cfg_tbl[] = {
ac3e3741 4196 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
f5fcc13c
TI
4197 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
4198 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
4199 SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
4200 SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
4201 SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
4202 SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
4203 SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
4204 SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
f5fcc13c
TI
4205 SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
4206 SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
f5fcc13c
TI
4207 SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
4208 SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
4209 SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
4210 SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
4211 SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
4212 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
4213 SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
4214 /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
4215 SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
4216 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
186c3117 4217 SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
f5fcc13c
TI
4218 SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
4219 SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
4220 SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
dea0a509 4221 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
f5fcc13c 4222 SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
ac3e3741
TI
4223 SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
4224 SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
f5fcc13c
TI
4225 SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
4226 SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
f5fcc13c
TI
4227 SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
4228 SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
4229 SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
4230 SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
ac3e3741
TI
4231 SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
4232 SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
f5fcc13c 4233 SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
ac3e3741 4234 SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
f5fcc13c 4235 SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
ac3e3741 4236 SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
f5fcc13c
TI
4237 SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
4238 SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
ac3e3741 4239 SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
df99cd33 4240 SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
ac3e3741 4241 SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
f5fcc13c 4242 SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
f5fcc13c 4243 SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
1d11604e 4244 SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
3353541f 4245 SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_F1734),
2cf9f0fc 4246 SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
ac3e3741 4247 SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
f5fcc13c
TI
4248 SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
4249 SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
f5fcc13c 4250 SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
ac3e3741
TI
4251 SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
4252 SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
4253 SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
4254 SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
f5fcc13c
TI
4255 SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
4256 SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
ac3e3741 4257 SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
f5fcc13c 4258 SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
ac3e3741
TI
4259 SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
4260 SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
f5fcc13c
TI
4261 SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
4262 SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
4263 SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
dea0a509
TI
4264 /* default Intel */
4265 SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
ac3e3741
TI
4266 SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
4267 SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
1da177e4
LT
4268 {}
4269};
4270
16ded525 4271/*
df694daa 4272 * ALC880 codec presets
16ded525 4273 */
16ded525
TI
4274static struct alc_config_preset alc880_presets[] = {
4275 [ALC880_3ST] = {
e9edcee0 4276 .mixers = { alc880_three_stack_mixer },
f12ab1e0
TI
4277 .init_verbs = { alc880_volume_init_verbs,
4278 alc880_pin_3stack_init_verbs },
16ded525 4279 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
16ded525 4280 .dac_nids = alc880_dac_nids,
16ded525
TI
4281 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4282 .channel_mode = alc880_threestack_modes,
4e195a7b 4283 .need_dac_fix = 1,
16ded525
TI
4284 .input_mux = &alc880_capture_source,
4285 },
4286 [ALC880_3ST_DIG] = {
e9edcee0 4287 .mixers = { alc880_three_stack_mixer },
f12ab1e0
TI
4288 .init_verbs = { alc880_volume_init_verbs,
4289 alc880_pin_3stack_init_verbs },
16ded525 4290 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
16ded525
TI
4291 .dac_nids = alc880_dac_nids,
4292 .dig_out_nid = ALC880_DIGOUT_NID,
16ded525
TI
4293 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4294 .channel_mode = alc880_threestack_modes,
4e195a7b 4295 .need_dac_fix = 1,
16ded525
TI
4296 .input_mux = &alc880_capture_source,
4297 },
df694daa
KY
4298 [ALC880_TCL_S700] = {
4299 .mixers = { alc880_tcl_s700_mixer },
4300 .init_verbs = { alc880_volume_init_verbs,
4301 alc880_pin_tcl_S700_init_verbs,
4302 alc880_gpio2_init_verbs },
4303 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4304 .dac_nids = alc880_dac_nids,
f9e336f6
TI
4305 .adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4306 .num_adc_nids = 1, /* single ADC */
df694daa
KY
4307 .hp_nid = 0x03,
4308 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4309 .channel_mode = alc880_2_jack_modes,
4310 .input_mux = &alc880_capture_source,
4311 },
16ded525 4312 [ALC880_5ST] = {
f12ab1e0
TI
4313 .mixers = { alc880_three_stack_mixer,
4314 alc880_five_stack_mixer},
4315 .init_verbs = { alc880_volume_init_verbs,
4316 alc880_pin_5stack_init_verbs },
16ded525
TI
4317 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4318 .dac_nids = alc880_dac_nids,
16ded525
TI
4319 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4320 .channel_mode = alc880_fivestack_modes,
4321 .input_mux = &alc880_capture_source,
4322 },
4323 [ALC880_5ST_DIG] = {
f12ab1e0
TI
4324 .mixers = { alc880_three_stack_mixer,
4325 alc880_five_stack_mixer },
4326 .init_verbs = { alc880_volume_init_verbs,
4327 alc880_pin_5stack_init_verbs },
16ded525
TI
4328 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4329 .dac_nids = alc880_dac_nids,
4330 .dig_out_nid = ALC880_DIGOUT_NID,
16ded525
TI
4331 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4332 .channel_mode = alc880_fivestack_modes,
4333 .input_mux = &alc880_capture_source,
4334 },
b6482d48
TI
4335 [ALC880_6ST] = {
4336 .mixers = { alc880_six_stack_mixer },
f12ab1e0
TI
4337 .init_verbs = { alc880_volume_init_verbs,
4338 alc880_pin_6stack_init_verbs },
b6482d48
TI
4339 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4340 .dac_nids = alc880_6st_dac_nids,
4341 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4342 .channel_mode = alc880_sixstack_modes,
4343 .input_mux = &alc880_6stack_capture_source,
4344 },
16ded525 4345 [ALC880_6ST_DIG] = {
e9edcee0 4346 .mixers = { alc880_six_stack_mixer },
f12ab1e0
TI
4347 .init_verbs = { alc880_volume_init_verbs,
4348 alc880_pin_6stack_init_verbs },
16ded525
TI
4349 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4350 .dac_nids = alc880_6st_dac_nids,
4351 .dig_out_nid = ALC880_DIGOUT_NID,
16ded525
TI
4352 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4353 .channel_mode = alc880_sixstack_modes,
4354 .input_mux = &alc880_6stack_capture_source,
4355 },
4356 [ALC880_W810] = {
e9edcee0 4357 .mixers = { alc880_w810_base_mixer },
f12ab1e0
TI
4358 .init_verbs = { alc880_volume_init_verbs,
4359 alc880_pin_w810_init_verbs,
b0af0de5 4360 alc880_gpio2_init_verbs },
16ded525
TI
4361 .num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4362 .dac_nids = alc880_w810_dac_nids,
4363 .dig_out_nid = ALC880_DIGOUT_NID,
16ded525
TI
4364 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4365 .channel_mode = alc880_w810_modes,
4366 .input_mux = &alc880_capture_source,
4367 },
4368 [ALC880_Z71V] = {
e9edcee0 4369 .mixers = { alc880_z71v_mixer },
f12ab1e0
TI
4370 .init_verbs = { alc880_volume_init_verbs,
4371 alc880_pin_z71v_init_verbs },
16ded525
TI
4372 .num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4373 .dac_nids = alc880_z71v_dac_nids,
4374 .dig_out_nid = ALC880_DIGOUT_NID,
4375 .hp_nid = 0x03,
e9edcee0
TI
4376 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4377 .channel_mode = alc880_2_jack_modes,
16ded525
TI
4378 .input_mux = &alc880_capture_source,
4379 },
4380 [ALC880_F1734] = {
e9edcee0 4381 .mixers = { alc880_f1734_mixer },
f12ab1e0
TI
4382 .init_verbs = { alc880_volume_init_verbs,
4383 alc880_pin_f1734_init_verbs },
e9edcee0
TI
4384 .num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4385 .dac_nids = alc880_f1734_dac_nids,
4386 .hp_nid = 0x02,
4387 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4388 .channel_mode = alc880_2_jack_modes,
937b4160
TI
4389 .input_mux = &alc880_f1734_capture_source,
4390 .unsol_event = alc880_uniwill_p53_unsol_event,
4f5d1706
TI
4391 .setup = alc880_uniwill_p53_setup,
4392 .init_hook = alc_automute_amp,
16ded525
TI
4393 },
4394 [ALC880_ASUS] = {
e9edcee0 4395 .mixers = { alc880_asus_mixer },
f12ab1e0
TI
4396 .init_verbs = { alc880_volume_init_verbs,
4397 alc880_pin_asus_init_verbs,
e9edcee0
TI
4398 alc880_gpio1_init_verbs },
4399 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4400 .dac_nids = alc880_asus_dac_nids,
4401 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4402 .channel_mode = alc880_asus_modes,
4e195a7b 4403 .need_dac_fix = 1,
16ded525
TI
4404 .input_mux = &alc880_capture_source,
4405 },
4406 [ALC880_ASUS_DIG] = {
e9edcee0 4407 .mixers = { alc880_asus_mixer },
f12ab1e0
TI
4408 .init_verbs = { alc880_volume_init_verbs,
4409 alc880_pin_asus_init_verbs,
e9edcee0
TI
4410 alc880_gpio1_init_verbs },
4411 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4412 .dac_nids = alc880_asus_dac_nids,
16ded525 4413 .dig_out_nid = ALC880_DIGOUT_NID,
e9edcee0
TI
4414 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4415 .channel_mode = alc880_asus_modes,
4e195a7b 4416 .need_dac_fix = 1,
16ded525
TI
4417 .input_mux = &alc880_capture_source,
4418 },
df694daa
KY
4419 [ALC880_ASUS_DIG2] = {
4420 .mixers = { alc880_asus_mixer },
f12ab1e0
TI
4421 .init_verbs = { alc880_volume_init_verbs,
4422 alc880_pin_asus_init_verbs,
df694daa
KY
4423 alc880_gpio2_init_verbs }, /* use GPIO2 */
4424 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4425 .dac_nids = alc880_asus_dac_nids,
4426 .dig_out_nid = ALC880_DIGOUT_NID,
4427 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4428 .channel_mode = alc880_asus_modes,
4e195a7b 4429 .need_dac_fix = 1,
df694daa
KY
4430 .input_mux = &alc880_capture_source,
4431 },
16ded525 4432 [ALC880_ASUS_W1V] = {
e9edcee0 4433 .mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
f12ab1e0
TI
4434 .init_verbs = { alc880_volume_init_verbs,
4435 alc880_pin_asus_init_verbs,
e9edcee0
TI
4436 alc880_gpio1_init_verbs },
4437 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4438 .dac_nids = alc880_asus_dac_nids,
16ded525 4439 .dig_out_nid = ALC880_DIGOUT_NID,
e9edcee0
TI
4440 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4441 .channel_mode = alc880_asus_modes,
4e195a7b 4442 .need_dac_fix = 1,
16ded525
TI
4443 .input_mux = &alc880_capture_source,
4444 },
4445 [ALC880_UNIWILL_DIG] = {
45bdd1c1 4446 .mixers = { alc880_asus_mixer },
ccc656ce
KY
4447 .init_verbs = { alc880_volume_init_verbs,
4448 alc880_pin_asus_init_verbs },
e9edcee0
TI
4449 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4450 .dac_nids = alc880_asus_dac_nids,
16ded525 4451 .dig_out_nid = ALC880_DIGOUT_NID,
e9edcee0
TI
4452 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4453 .channel_mode = alc880_asus_modes,
4e195a7b 4454 .need_dac_fix = 1,
16ded525
TI
4455 .input_mux = &alc880_capture_source,
4456 },
ccc656ce
KY
4457 [ALC880_UNIWILL] = {
4458 .mixers = { alc880_uniwill_mixer },
4459 .init_verbs = { alc880_volume_init_verbs,
4460 alc880_uniwill_init_verbs },
4461 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4462 .dac_nids = alc880_asus_dac_nids,
4463 .dig_out_nid = ALC880_DIGOUT_NID,
4464 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4465 .channel_mode = alc880_threestack_modes,
4466 .need_dac_fix = 1,
4467 .input_mux = &alc880_capture_source,
4468 .unsol_event = alc880_uniwill_unsol_event,
4f5d1706 4469 .setup = alc880_uniwill_setup,
a9fd4f3f 4470 .init_hook = alc880_uniwill_init_hook,
ccc656ce
KY
4471 },
4472 [ALC880_UNIWILL_P53] = {
4473 .mixers = { alc880_uniwill_p53_mixer },
4474 .init_verbs = { alc880_volume_init_verbs,
4475 alc880_uniwill_p53_init_verbs },
4476 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4477 .dac_nids = alc880_asus_dac_nids,
4478 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
2cf9f0fc
TD
4479 .channel_mode = alc880_threestack_modes,
4480 .input_mux = &alc880_capture_source,
4481 .unsol_event = alc880_uniwill_p53_unsol_event,
4f5d1706
TI
4482 .setup = alc880_uniwill_p53_setup,
4483 .init_hook = alc_automute_amp,
2cf9f0fc
TD
4484 },
4485 [ALC880_FUJITSU] = {
45bdd1c1 4486 .mixers = { alc880_fujitsu_mixer },
2cf9f0fc
TD
4487 .init_verbs = { alc880_volume_init_verbs,
4488 alc880_uniwill_p53_init_verbs,
4489 alc880_beep_init_verbs },
4490 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4491 .dac_nids = alc880_dac_nids,
d53d7d9e 4492 .dig_out_nid = ALC880_DIGOUT_NID,
2cf9f0fc
TD
4493 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4494 .channel_mode = alc880_2_jack_modes,
ccc656ce
KY
4495 .input_mux = &alc880_capture_source,
4496 .unsol_event = alc880_uniwill_p53_unsol_event,
4f5d1706
TI
4497 .setup = alc880_uniwill_p53_setup,
4498 .init_hook = alc_automute_amp,
ccc656ce 4499 },
df694daa
KY
4500 [ALC880_CLEVO] = {
4501 .mixers = { alc880_three_stack_mixer },
4502 .init_verbs = { alc880_volume_init_verbs,
4503 alc880_pin_clevo_init_verbs },
4504 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4505 .dac_nids = alc880_dac_nids,
4506 .hp_nid = 0x03,
4507 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4508 .channel_mode = alc880_threestack_modes,
4e195a7b 4509 .need_dac_fix = 1,
df694daa
KY
4510 .input_mux = &alc880_capture_source,
4511 },
ae6b813a
TI
4512 [ALC880_LG] = {
4513 .mixers = { alc880_lg_mixer },
4514 .init_verbs = { alc880_volume_init_verbs,
4515 alc880_lg_init_verbs },
4516 .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4517 .dac_nids = alc880_lg_dac_nids,
4518 .dig_out_nid = ALC880_DIGOUT_NID,
4519 .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4520 .channel_mode = alc880_lg_ch_modes,
4e195a7b 4521 .need_dac_fix = 1,
ae6b813a 4522 .input_mux = &alc880_lg_capture_source,
a9fd4f3f 4523 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
4524 .setup = alc880_lg_setup,
4525 .init_hook = alc_automute_amp,
cb53c626
TI
4526#ifdef CONFIG_SND_HDA_POWER_SAVE
4527 .loopbacks = alc880_lg_loopbacks,
4528#endif
ae6b813a 4529 },
d681518a
TI
4530 [ALC880_LG_LW] = {
4531 .mixers = { alc880_lg_lw_mixer },
4532 .init_verbs = { alc880_volume_init_verbs,
4533 alc880_lg_lw_init_verbs },
0a8c5da3 4534 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
d681518a
TI
4535 .dac_nids = alc880_dac_nids,
4536 .dig_out_nid = ALC880_DIGOUT_NID,
0a8c5da3
CM
4537 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4538 .channel_mode = alc880_lg_lw_modes,
d681518a 4539 .input_mux = &alc880_lg_lw_capture_source,
a9fd4f3f 4540 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
4541 .setup = alc880_lg_lw_setup,
4542 .init_hook = alc_automute_amp,
d681518a 4543 },
df99cd33
TI
4544 [ALC880_MEDION_RIM] = {
4545 .mixers = { alc880_medion_rim_mixer },
4546 .init_verbs = { alc880_volume_init_verbs,
4547 alc880_medion_rim_init_verbs,
4548 alc_gpio2_init_verbs },
4549 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4550 .dac_nids = alc880_dac_nids,
4551 .dig_out_nid = ALC880_DIGOUT_NID,
4552 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4553 .channel_mode = alc880_2_jack_modes,
4554 .input_mux = &alc880_medion_rim_capture_source,
4555 .unsol_event = alc880_medion_rim_unsol_event,
4f5d1706
TI
4556 .setup = alc880_medion_rim_setup,
4557 .init_hook = alc880_medion_rim_automute,
df99cd33 4558 },
16ded525
TI
4559#ifdef CONFIG_SND_DEBUG
4560 [ALC880_TEST] = {
e9edcee0
TI
4561 .mixers = { alc880_test_mixer },
4562 .init_verbs = { alc880_test_init_verbs },
16ded525
TI
4563 .num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4564 .dac_nids = alc880_test_dac_nids,
4565 .dig_out_nid = ALC880_DIGOUT_NID,
16ded525
TI
4566 .num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4567 .channel_mode = alc880_test_modes,
4568 .input_mux = &alc880_test_capture_source,
4569 },
4570#endif
4571};
4572
e9edcee0
TI
4573/*
4574 * Automatic parse of I/O pins from the BIOS configuration
4575 */
4576
e9edcee0
TI
4577enum {
4578 ALC_CTL_WIDGET_VOL,
4579 ALC_CTL_WIDGET_MUTE,
4580 ALC_CTL_BIND_MUTE,
4581};
c8b6bf9b 4582static struct snd_kcontrol_new alc880_control_templates[] = {
e9edcee0
TI
4583 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4584 HDA_CODEC_MUTE(NULL, 0, 0, 0),
985be54b 4585 HDA_BIND_MUTE(NULL, 0, 0, 0),
e9edcee0
TI
4586};
4587
4588/* add dynamic controls */
f12ab1e0
TI
4589static int add_control(struct alc_spec *spec, int type, const char *name,
4590 unsigned long val)
e9edcee0 4591{
c8b6bf9b 4592 struct snd_kcontrol_new *knew;
e9edcee0 4593
603c4019
TI
4594 snd_array_init(&spec->kctls, sizeof(*knew), 32);
4595 knew = snd_array_new(&spec->kctls);
4596 if (!knew)
4597 return -ENOMEM;
e9edcee0 4598 *knew = alc880_control_templates[type];
543537bd 4599 knew->name = kstrdup(name, GFP_KERNEL);
f12ab1e0 4600 if (!knew->name)
e9edcee0 4601 return -ENOMEM;
4d02d1b6 4602 if (get_amp_nid_(val))
5e26dfd0 4603 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
e9edcee0 4604 knew->private_value = val;
e9edcee0
TI
4605 return 0;
4606}
4607
0afe5f89
TI
4608static int add_control_with_pfx(struct alc_spec *spec, int type,
4609 const char *pfx, const char *dir,
4610 const char *sfx, unsigned long val)
4611{
4612 char name[32];
4613 snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
4614 return add_control(spec, type, name, val);
4615}
4616
4617#define add_pb_vol_ctrl(spec, type, pfx, val) \
4618 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val)
4619#define add_pb_sw_ctrl(spec, type, pfx, val) \
4620 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val)
4621
e9edcee0
TI
4622#define alc880_is_fixed_pin(nid) ((nid) >= 0x14 && (nid) <= 0x17)
4623#define alc880_fixed_pin_idx(nid) ((nid) - 0x14)
4624#define alc880_is_multi_pin(nid) ((nid) >= 0x18)
4625#define alc880_multi_pin_idx(nid) ((nid) - 0x18)
e9edcee0
TI
4626#define alc880_idx_to_dac(nid) ((nid) + 0x02)
4627#define alc880_dac_to_idx(nid) ((nid) - 0x02)
4628#define alc880_idx_to_mixer(nid) ((nid) + 0x0c)
4629#define alc880_idx_to_selector(nid) ((nid) + 0x10)
4630#define ALC880_PIN_CD_NID 0x1c
4631
4632/* fill in the dac_nids table from the parsed pin configuration */
f12ab1e0
TI
4633static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4634 const struct auto_pin_cfg *cfg)
e9edcee0
TI
4635{
4636 hda_nid_t nid;
4637 int assigned[4];
4638 int i, j;
4639
4640 memset(assigned, 0, sizeof(assigned));
b0af0de5 4641 spec->multiout.dac_nids = spec->private_dac_nids;
e9edcee0
TI
4642
4643 /* check the pins hardwired to audio widget */
4644 for (i = 0; i < cfg->line_outs; i++) {
4645 nid = cfg->line_out_pins[i];
4646 if (alc880_is_fixed_pin(nid)) {
4647 int idx = alc880_fixed_pin_idx(nid);
5014f193 4648 spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
e9edcee0
TI
4649 assigned[idx] = 1;
4650 }
4651 }
4652 /* left pins can be connect to any audio widget */
4653 for (i = 0; i < cfg->line_outs; i++) {
4654 nid = cfg->line_out_pins[i];
4655 if (alc880_is_fixed_pin(nid))
4656 continue;
4657 /* search for an empty channel */
4658 for (j = 0; j < cfg->line_outs; j++) {
f12ab1e0
TI
4659 if (!assigned[j]) {
4660 spec->multiout.dac_nids[i] =
4661 alc880_idx_to_dac(j);
e9edcee0
TI
4662 assigned[j] = 1;
4663 break;
4664 }
4665 }
4666 }
4667 spec->multiout.num_dacs = cfg->line_outs;
4668 return 0;
4669}
4670
4671/* add playback controls from the parsed DAC table */
df694daa
KY
4672static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4673 const struct auto_pin_cfg *cfg)
e9edcee0 4674{
f12ab1e0
TI
4675 static const char *chname[4] = {
4676 "Front", "Surround", NULL /*CLFE*/, "Side"
4677 };
e9edcee0
TI
4678 hda_nid_t nid;
4679 int i, err;
4680
4681 for (i = 0; i < cfg->line_outs; i++) {
f12ab1e0 4682 if (!spec->multiout.dac_nids[i])
e9edcee0
TI
4683 continue;
4684 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4685 if (i == 2) {
4686 /* Center/LFE */
0afe5f89
TI
4687 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4688 "Center",
f12ab1e0
TI
4689 HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4690 HDA_OUTPUT));
4691 if (err < 0)
e9edcee0 4692 return err;
0afe5f89
TI
4693 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4694 "LFE",
f12ab1e0
TI
4695 HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4696 HDA_OUTPUT));
4697 if (err < 0)
e9edcee0 4698 return err;
0afe5f89
TI
4699 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4700 "Center",
f12ab1e0
TI
4701 HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4702 HDA_INPUT));
4703 if (err < 0)
e9edcee0 4704 return err;
0afe5f89
TI
4705 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4706 "LFE",
f12ab1e0
TI
4707 HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4708 HDA_INPUT));
4709 if (err < 0)
e9edcee0
TI
4710 return err;
4711 } else {
cb162b6b
TI
4712 const char *pfx;
4713 if (cfg->line_outs == 1 &&
4714 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4715 pfx = "Speaker";
4716 else
4717 pfx = chname[i];
0afe5f89 4718 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
f12ab1e0
TI
4719 HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4720 HDA_OUTPUT));
4721 if (err < 0)
e9edcee0 4722 return err;
0afe5f89 4723 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
f12ab1e0
TI
4724 HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4725 HDA_INPUT));
4726 if (err < 0)
e9edcee0
TI
4727 return err;
4728 }
4729 }
e9edcee0
TI
4730 return 0;
4731}
4732
8d88bc3d
TI
4733/* add playback controls for speaker and HP outputs */
4734static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4735 const char *pfx)
e9edcee0
TI
4736{
4737 hda_nid_t nid;
4738 int err;
4739
f12ab1e0 4740 if (!pin)
e9edcee0
TI
4741 return 0;
4742
4743 if (alc880_is_fixed_pin(pin)) {
4744 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
82bc955f 4745 /* specify the DAC as the extra output */
f12ab1e0 4746 if (!spec->multiout.hp_nid)
e9edcee0 4747 spec->multiout.hp_nid = nid;
82bc955f
TI
4748 else
4749 spec->multiout.extra_out_nid[0] = nid;
e9edcee0
TI
4750 /* control HP volume/switch on the output mixer amp */
4751 nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
0afe5f89 4752 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
f12ab1e0
TI
4753 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
4754 if (err < 0)
e9edcee0 4755 return err;
0afe5f89 4756 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
f12ab1e0
TI
4757 HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
4758 if (err < 0)
e9edcee0
TI
4759 return err;
4760 } else if (alc880_is_multi_pin(pin)) {
4761 /* set manual connection */
e9edcee0 4762 /* we have only a switch on HP-out PIN */
0afe5f89 4763 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
f12ab1e0
TI
4764 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
4765 if (err < 0)
e9edcee0
TI
4766 return err;
4767 }
4768 return 0;
4769}
4770
4771/* create input playback/capture controls for the given pin */
f12ab1e0
TI
4772static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
4773 const char *ctlname,
df694daa 4774 int idx, hda_nid_t mix_nid)
e9edcee0 4775{
df694daa 4776 int err;
e9edcee0 4777
0afe5f89 4778 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
f12ab1e0
TI
4779 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4780 if (err < 0)
e9edcee0 4781 return err;
0afe5f89 4782 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
f12ab1e0
TI
4783 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4784 if (err < 0)
e9edcee0
TI
4785 return err;
4786 return 0;
4787}
4788
05f5f477
TI
4789static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
4790{
4791 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
4792 return (pincap & AC_PINCAP_IN) != 0;
4793}
4794
e9edcee0 4795/* create playback/capture controls for input pins */
05f5f477
TI
4796static int alc_auto_create_input_ctls(struct hda_codec *codec,
4797 const struct auto_pin_cfg *cfg,
4798 hda_nid_t mixer,
4799 hda_nid_t cap1, hda_nid_t cap2)
e9edcee0 4800{
05f5f477 4801 struct alc_spec *spec = codec->spec;
61b9b9b1 4802 struct hda_input_mux *imux = &spec->private_imux[0];
df694daa 4803 int i, err, idx;
e9edcee0
TI
4804
4805 for (i = 0; i < AUTO_PIN_LAST; i++) {
05f5f477
TI
4806 hda_nid_t pin;
4807
4808 pin = cfg->input_pins[i];
4809 if (!alc_is_input_pin(codec, pin))
4810 continue;
4811
4812 if (mixer) {
4813 idx = get_connection_index(codec, mixer, pin);
4814 if (idx >= 0) {
4815 err = new_analog_input(spec, pin,
4816 auto_pin_cfg_labels[i],
4817 idx, mixer);
4818 if (err < 0)
4819 return err;
4820 }
4821 }
4822
4823 if (!cap1)
4824 continue;
4825 idx = get_connection_index(codec, cap1, pin);
4826 if (idx < 0 && cap2)
4827 idx = get_connection_index(codec, cap2, pin);
4828 if (idx >= 0) {
f12ab1e0
TI
4829 imux->items[imux->num_items].label =
4830 auto_pin_cfg_labels[i];
05f5f477 4831 imux->items[imux->num_items].index = idx;
e9edcee0
TI
4832 imux->num_items++;
4833 }
4834 }
4835 return 0;
4836}
4837
05f5f477
TI
4838static int alc880_auto_create_input_ctls(struct hda_codec *codec,
4839 const struct auto_pin_cfg *cfg)
4840{
4841 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
4842}
4843
f6c7e546
TI
4844static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
4845 unsigned int pin_type)
4846{
4847 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4848 pin_type);
4849 /* unmute pin */
d260cdf6
TI
4850 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4851 AMP_OUT_UNMUTE);
f6c7e546
TI
4852}
4853
df694daa
KY
4854static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
4855 hda_nid_t nid, int pin_type,
e9edcee0
TI
4856 int dac_idx)
4857{
f6c7e546 4858 alc_set_pin_output(codec, nid, pin_type);
e9edcee0
TI
4859 /* need the manual connection? */
4860 if (alc880_is_multi_pin(nid)) {
4861 struct alc_spec *spec = codec->spec;
4862 int idx = alc880_multi_pin_idx(nid);
4863 snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
4864 AC_VERB_SET_CONNECT_SEL,
4865 alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
4866 }
4867}
4868
baba8ee9
TI
4869static int get_pin_type(int line_out_type)
4870{
4871 if (line_out_type == AUTO_PIN_HP_OUT)
4872 return PIN_HP;
4873 else
4874 return PIN_OUT;
4875}
4876
e9edcee0
TI
4877static void alc880_auto_init_multi_out(struct hda_codec *codec)
4878{
4879 struct alc_spec *spec = codec->spec;
4880 int i;
ea1fb29a 4881
e9edcee0
TI
4882 for (i = 0; i < spec->autocfg.line_outs; i++) {
4883 hda_nid_t nid = spec->autocfg.line_out_pins[i];
baba8ee9
TI
4884 int pin_type = get_pin_type(spec->autocfg.line_out_type);
4885 alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
e9edcee0
TI
4886 }
4887}
4888
8d88bc3d 4889static void alc880_auto_init_extra_out(struct hda_codec *codec)
e9edcee0
TI
4890{
4891 struct alc_spec *spec = codec->spec;
4892 hda_nid_t pin;
4893
82bc955f 4894 pin = spec->autocfg.speaker_pins[0];
8d88bc3d
TI
4895 if (pin) /* connect to front */
4896 alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
eb06ed8f 4897 pin = spec->autocfg.hp_pins[0];
e9edcee0
TI
4898 if (pin) /* connect to front */
4899 alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
4900}
4901
4902static void alc880_auto_init_analog_input(struct hda_codec *codec)
4903{
4904 struct alc_spec *spec = codec->spec;
4905 int i;
4906
4907 for (i = 0; i < AUTO_PIN_LAST; i++) {
4908 hda_nid_t nid = spec->autocfg.input_pins[i];
05f5f477 4909 if (alc_is_input_pin(codec, nid)) {
23f0c048 4910 alc_set_input_pin(codec, nid, i);
e82c025b
TI
4911 if (nid != ALC880_PIN_CD_NID &&
4912 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
f12ab1e0
TI
4913 snd_hda_codec_write(codec, nid, 0,
4914 AC_VERB_SET_AMP_GAIN_MUTE,
e9edcee0
TI
4915 AMP_OUT_MUTE);
4916 }
4917 }
4918}
4919
7f311a46
TI
4920static void alc880_auto_init_input_src(struct hda_codec *codec)
4921{
4922 struct alc_spec *spec = codec->spec;
4923 int c;
4924
4925 for (c = 0; c < spec->num_adc_nids; c++) {
4926 unsigned int mux_idx;
4927 const struct hda_input_mux *imux;
4928 mux_idx = c >= spec->num_mux_defs ? 0 : c;
4929 imux = &spec->input_mux[mux_idx];
4930 if (!imux->num_items && mux_idx > 0)
4931 imux = &spec->input_mux[0];
4932 if (imux)
4933 snd_hda_codec_write(codec, spec->adc_nids[c], 0,
4934 AC_VERB_SET_CONNECT_SEL,
4935 imux->items[0].index);
4936 }
4937}
4938
e9edcee0 4939/* parse the BIOS configuration and set up the alc_spec */
f12ab1e0
TI
4940/* return 1 if successful, 0 if the proper config is not found,
4941 * or a negative error code
4942 */
e9edcee0
TI
4943static int alc880_parse_auto_config(struct hda_codec *codec)
4944{
4945 struct alc_spec *spec = codec->spec;
6a05ac4a 4946 int i, err;
df694daa 4947 static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
e9edcee0 4948
f12ab1e0
TI
4949 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4950 alc880_ignore);
4951 if (err < 0)
e9edcee0 4952 return err;
f12ab1e0 4953 if (!spec->autocfg.line_outs)
e9edcee0 4954 return 0; /* can't find valid BIOS pin config */
df694daa 4955
f12ab1e0
TI
4956 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
4957 if (err < 0)
4958 return err;
4959 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
4960 if (err < 0)
4961 return err;
4962 err = alc880_auto_create_extra_out(spec,
4963 spec->autocfg.speaker_pins[0],
4964 "Speaker");
4965 if (err < 0)
4966 return err;
4967 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
4968 "Headphone");
4969 if (err < 0)
4970 return err;
05f5f477 4971 err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 4972 if (err < 0)
e9edcee0
TI
4973 return err;
4974
4975 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4976
6a05ac4a
TI
4977 /* check multiple SPDIF-out (for recent codecs) */
4978 for (i = 0; i < spec->autocfg.dig_outs; i++) {
4979 hda_nid_t dig_nid;
4980 err = snd_hda_get_connections(codec,
4981 spec->autocfg.dig_out_pins[i],
4982 &dig_nid, 1);
4983 if (err < 0)
4984 continue;
4985 if (!i)
4986 spec->multiout.dig_out_nid = dig_nid;
4987 else {
4988 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
71121d9f 4989 if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
6a05ac4a 4990 break;
71121d9f 4991 spec->slave_dig_outs[i - 1] = dig_nid;
6a05ac4a
TI
4992 }
4993 }
e9edcee0
TI
4994 if (spec->autocfg.dig_in_pin)
4995 spec->dig_in_nid = ALC880_DIGIN_NID;
4996
603c4019 4997 if (spec->kctls.list)
d88897ea 4998 add_mixer(spec, spec->kctls.list);
e9edcee0 4999
d88897ea 5000 add_verb(spec, alc880_volume_init_verbs);
e9edcee0 5001
a1e8d2da 5002 spec->num_mux_defs = 1;
61b9b9b1 5003 spec->input_mux = &spec->private_imux[0];
e9edcee0 5004
6227cdce 5005 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4a79ba34 5006
e9edcee0
TI
5007 return 1;
5008}
5009
ae6b813a
TI
5010/* additional initialization for auto-configuration model */
5011static void alc880_auto_init(struct hda_codec *codec)
e9edcee0 5012{
f6c7e546 5013 struct alc_spec *spec = codec->spec;
e9edcee0 5014 alc880_auto_init_multi_out(codec);
8d88bc3d 5015 alc880_auto_init_extra_out(codec);
e9edcee0 5016 alc880_auto_init_analog_input(codec);
7f311a46 5017 alc880_auto_init_input_src(codec);
f6c7e546 5018 if (spec->unsol_event)
7fb0d78f 5019 alc_inithook(codec);
e9edcee0
TI
5020}
5021
b59bdf3b
TI
5022/* check the ADC/MUX contains all input pins; some ADC/MUX contains only
5023 * one of two digital mic pins, e.g. on ALC272
5024 */
5025static void fixup_automic_adc(struct hda_codec *codec)
5026{
5027 struct alc_spec *spec = codec->spec;
5028 int i;
5029
5030 for (i = 0; i < spec->num_adc_nids; i++) {
5031 hda_nid_t cap = spec->capsrc_nids ?
5032 spec->capsrc_nids[i] : spec->adc_nids[i];
5033 int iidx, eidx;
5034
5035 iidx = get_connection_index(codec, cap, spec->int_mic.pin);
5036 if (iidx < 0)
5037 continue;
5038 eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
5039 if (eidx < 0)
5040 continue;
5041 spec->int_mic.mux_idx = iidx;
5042 spec->ext_mic.mux_idx = eidx;
5043 if (spec->capsrc_nids)
5044 spec->capsrc_nids += i;
5045 spec->adc_nids += i;
5046 spec->num_adc_nids = 1;
5047 return;
5048 }
5049 snd_printd(KERN_INFO "hda_codec: %s: "
5050 "No ADC/MUX containing both 0x%x and 0x%x pins\n",
5051 codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
5052 spec->auto_mic = 0; /* disable auto-mic to be sure */
5053}
5054
eaa9b3a7
TI
5055/* choose the ADC/MUX containing the input pin and initialize the setup */
5056static void fixup_single_adc(struct hda_codec *codec)
5057{
5058 struct alc_spec *spec = codec->spec;
d2db09b8 5059 hda_nid_t pin = 0;
eaa9b3a7
TI
5060 int i;
5061
5062 /* search for the input pin; there must be only one */
5063 for (i = 0; i < AUTO_PIN_LAST; i++) {
5064 if (spec->autocfg.input_pins[i]) {
5065 pin = spec->autocfg.input_pins[i];
5066 break;
5067 }
5068 }
5069 if (!pin)
5070 return;
5071
5072 /* set the default connection to that pin */
5073 for (i = 0; i < spec->num_adc_nids; i++) {
5074 hda_nid_t cap = spec->capsrc_nids ?
5075 spec->capsrc_nids[i] : spec->adc_nids[i];
5076 int idx;
5077
5078 idx = get_connection_index(codec, cap, pin);
5079 if (idx < 0)
5080 continue;
5081 /* use only this ADC */
5082 if (spec->capsrc_nids)
5083 spec->capsrc_nids += i;
5084 spec->adc_nids += i;
5085 spec->num_adc_nids = 1;
5086 /* select or unmute this route */
5087 if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
5088 snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
5089 HDA_AMP_MUTE, 0);
5090 } else {
5091 snd_hda_codec_write_cache(codec, cap, 0,
5092 AC_VERB_SET_CONNECT_SEL, idx);
5093 }
5094 return;
5095 }
5096}
5097
b59bdf3b 5098static void set_capture_mixer(struct hda_codec *codec)
f9e336f6 5099{
b59bdf3b 5100 struct alc_spec *spec = codec->spec;
a23b688f
TI
5101 static struct snd_kcontrol_new *caps[2][3] = {
5102 { alc_capture_mixer_nosrc1,
5103 alc_capture_mixer_nosrc2,
5104 alc_capture_mixer_nosrc3 },
5105 { alc_capture_mixer1,
5106 alc_capture_mixer2,
5107 alc_capture_mixer3 },
f9e336f6 5108 };
a23b688f 5109 if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
eaa9b3a7
TI
5110 int mux = 0;
5111 if (spec->auto_mic)
b59bdf3b 5112 fixup_automic_adc(codec);
eaa9b3a7
TI
5113 else if (spec->input_mux) {
5114 if (spec->input_mux->num_items > 1)
5115 mux = 1;
5116 else if (spec->input_mux->num_items == 1)
5117 fixup_single_adc(codec);
5118 }
a23b688f
TI
5119 spec->cap_mixer = caps[mux][spec->num_adc_nids - 1];
5120 }
f9e336f6
TI
5121}
5122
6694635d
TI
5123/* fill adc_nids (and capsrc_nids) containing all active input pins */
5124static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids,
5125 int num_nids)
5126{
5127 struct alc_spec *spec = codec->spec;
5128 int n;
5129 hda_nid_t fallback_adc = 0, fallback_cap = 0;
5130
5131 for (n = 0; n < num_nids; n++) {
5132 hda_nid_t adc, cap;
5133 hda_nid_t conn[HDA_MAX_NUM_INPUTS];
5134 int nconns, i, j;
5135
5136 adc = nids[n];
5137 if (get_wcaps_type(get_wcaps(codec, adc)) != AC_WID_AUD_IN)
5138 continue;
5139 cap = adc;
5140 nconns = snd_hda_get_connections(codec, cap, conn,
5141 ARRAY_SIZE(conn));
5142 if (nconns == 1) {
5143 cap = conn[0];
5144 nconns = snd_hda_get_connections(codec, cap, conn,
5145 ARRAY_SIZE(conn));
5146 }
5147 if (nconns <= 0)
5148 continue;
5149 if (!fallback_adc) {
5150 fallback_adc = adc;
5151 fallback_cap = cap;
5152 }
5153 for (i = 0; i < AUTO_PIN_LAST; i++) {
5154 hda_nid_t nid = spec->autocfg.input_pins[i];
5155 if (!nid)
5156 continue;
5157 for (j = 0; j < nconns; j++) {
5158 if (conn[j] == nid)
5159 break;
5160 }
5161 if (j >= nconns)
5162 break;
5163 }
5164 if (i >= AUTO_PIN_LAST) {
5165 int num_adcs = spec->num_adc_nids;
5166 spec->private_adc_nids[num_adcs] = adc;
5167 spec->private_capsrc_nids[num_adcs] = cap;
5168 spec->num_adc_nids++;
5169 spec->adc_nids = spec->private_adc_nids;
5170 if (adc != cap)
5171 spec->capsrc_nids = spec->private_capsrc_nids;
5172 }
5173 }
5174 if (!spec->num_adc_nids) {
5175 printk(KERN_WARNING "hda_codec: %s: no valid ADC found;"
1f85d72d
TI
5176 " using fallback 0x%x\n",
5177 codec->chip_name, fallback_adc);
6694635d
TI
5178 spec->private_adc_nids[0] = fallback_adc;
5179 spec->adc_nids = spec->private_adc_nids;
5180 if (fallback_adc != fallback_cap) {
5181 spec->private_capsrc_nids[0] = fallback_cap;
5182 spec->capsrc_nids = spec->private_adc_nids;
5183 }
5184 }
5185}
5186
67d634c0 5187#ifdef CONFIG_SND_HDA_INPUT_BEEP
45bdd1c1
TI
5188#define set_beep_amp(spec, nid, idx, dir) \
5189 ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
67d634c0
TI
5190#else
5191#define set_beep_amp(spec, nid, idx, dir) /* NOP */
5192#endif
45bdd1c1
TI
5193
5194/*
5195 * OK, here we have finally the patch for ALC880
5196 */
5197
1da177e4
LT
5198static int patch_alc880(struct hda_codec *codec)
5199{
5200 struct alc_spec *spec;
5201 int board_config;
df694daa 5202 int err;
1da177e4 5203
e560d8d8 5204 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1da177e4
LT
5205 if (spec == NULL)
5206 return -ENOMEM;
5207
5208 codec->spec = spec;
5209
f5fcc13c
TI
5210 board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
5211 alc880_models,
5212 alc880_cfg_tbl);
5213 if (board_config < 0) {
9a11f1aa
TI
5214 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5215 codec->chip_name);
e9edcee0 5216 board_config = ALC880_AUTO;
1da177e4 5217 }
1da177e4 5218
e9edcee0
TI
5219 if (board_config == ALC880_AUTO) {
5220 /* automatic parse from the BIOS config */
5221 err = alc880_parse_auto_config(codec);
5222 if (err < 0) {
5223 alc_free(codec);
5224 return err;
f12ab1e0 5225 } else if (!err) {
9c7f852e
TI
5226 printk(KERN_INFO
5227 "hda_codec: Cannot set up configuration "
5228 "from BIOS. Using 3-stack mode...\n");
e9edcee0
TI
5229 board_config = ALC880_3ST;
5230 }
1da177e4
LT
5231 }
5232
680cd536
KK
5233 err = snd_hda_attach_beep_device(codec, 0x1);
5234 if (err < 0) {
5235 alc_free(codec);
5236 return err;
5237 }
5238
df694daa 5239 if (board_config != ALC880_AUTO)
e9c364c0 5240 setup_preset(codec, &alc880_presets[board_config]);
1da177e4 5241
1da177e4
LT
5242 spec->stream_analog_playback = &alc880_pcm_analog_playback;
5243 spec->stream_analog_capture = &alc880_pcm_analog_capture;
6330079f 5244 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
1da177e4 5245
1da177e4
LT
5246 spec->stream_digital_playback = &alc880_pcm_digital_playback;
5247 spec->stream_digital_capture = &alc880_pcm_digital_capture;
5248
f12ab1e0 5249 if (!spec->adc_nids && spec->input_mux) {
e9edcee0 5250 /* check whether NID 0x07 is valid */
54d17403 5251 unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
f12ab1e0 5252 /* get type */
a22d543a 5253 wcap = get_wcaps_type(wcap);
e9edcee0
TI
5254 if (wcap != AC_WID_AUD_IN) {
5255 spec->adc_nids = alc880_adc_nids_alt;
5256 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
e9edcee0
TI
5257 } else {
5258 spec->adc_nids = alc880_adc_nids;
5259 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
e9edcee0
TI
5260 }
5261 }
b59bdf3b 5262 set_capture_mixer(codec);
45bdd1c1 5263 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1da177e4 5264
2134ea4f
TI
5265 spec->vmaster_nid = 0x0c;
5266
1da177e4 5267 codec->patch_ops = alc_patch_ops;
e9edcee0 5268 if (board_config == ALC880_AUTO)
ae6b813a 5269 spec->init_hook = alc880_auto_init;
cb53c626
TI
5270#ifdef CONFIG_SND_HDA_POWER_SAVE
5271 if (!spec->loopback.amplist)
5272 spec->loopback.amplist = alc880_loopbacks;
5273#endif
1da177e4
LT
5274
5275 return 0;
5276}
5277
e9edcee0 5278
1da177e4
LT
5279/*
5280 * ALC260 support
5281 */
5282
e9edcee0
TI
5283static hda_nid_t alc260_dac_nids[1] = {
5284 /* front */
5285 0x02,
5286};
5287
5288static hda_nid_t alc260_adc_nids[1] = {
5289 /* ADC0 */
5290 0x04,
5291};
5292
df694daa 5293static hda_nid_t alc260_adc_nids_alt[1] = {
e9edcee0
TI
5294 /* ADC1 */
5295 0x05,
5296};
5297
d57fdac0
JW
5298/* NIDs used when simultaneous access to both ADCs makes sense. Note that
5299 * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
5300 */
5301static hda_nid_t alc260_dual_adc_nids[2] = {
4c5186ed
JW
5302 /* ADC0, ADC1 */
5303 0x04, 0x05
5304};
5305
e9edcee0
TI
5306#define ALC260_DIGOUT_NID 0x03
5307#define ALC260_DIGIN_NID 0x06
5308
5309static struct hda_input_mux alc260_capture_source = {
5310 .num_items = 4,
5311 .items = {
5312 { "Mic", 0x0 },
5313 { "Front Mic", 0x1 },
5314 { "Line", 0x2 },
5315 { "CD", 0x4 },
5316 },
5317};
5318
17e7aec6 5319/* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
a1e8d2da
JW
5320 * headphone jack and the internal CD lines since these are the only pins at
5321 * which audio can appear. For flexibility, also allow the option of
5322 * recording the mixer output on the second ADC (ADC0 doesn't have a
5323 * connection to the mixer output).
a9430dd8 5324 */
a1e8d2da
JW
5325static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
5326 {
5327 .num_items = 3,
5328 .items = {
5329 { "Mic/Line", 0x0 },
5330 { "CD", 0x4 },
5331 { "Headphone", 0x2 },
5332 },
a9430dd8 5333 },
a1e8d2da
JW
5334 {
5335 .num_items = 4,
5336 .items = {
5337 { "Mic/Line", 0x0 },
5338 { "CD", 0x4 },
5339 { "Headphone", 0x2 },
5340 { "Mixer", 0x5 },
5341 },
5342 },
5343
a9430dd8
JW
5344};
5345
a1e8d2da
JW
5346/* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
5347 * the Fujitsu S702x, but jacks are marked differently.
0bfc90e9 5348 */
a1e8d2da
JW
5349static struct hda_input_mux alc260_acer_capture_sources[2] = {
5350 {
5351 .num_items = 4,
5352 .items = {
5353 { "Mic", 0x0 },
5354 { "Line", 0x2 },
5355 { "CD", 0x4 },
5356 { "Headphone", 0x5 },
5357 },
5358 },
5359 {
5360 .num_items = 5,
5361 .items = {
5362 { "Mic", 0x0 },
5363 { "Line", 0x2 },
5364 { "CD", 0x4 },
5365 { "Headphone", 0x6 },
5366 { "Mixer", 0x5 },
5367 },
0bfc90e9
JW
5368 },
5369};
cc959489
MS
5370
5371/* Maxdata Favorit 100XS */
5372static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5373 {
5374 .num_items = 2,
5375 .items = {
5376 { "Line/Mic", 0x0 },
5377 { "CD", 0x4 },
5378 },
5379 },
5380 {
5381 .num_items = 3,
5382 .items = {
5383 { "Line/Mic", 0x0 },
5384 { "CD", 0x4 },
5385 { "Mixer", 0x5 },
5386 },
5387 },
5388};
5389
1da177e4
LT
5390/*
5391 * This is just place-holder, so there's something for alc_build_pcms to look
5392 * at when it calculates the maximum number of channels. ALC260 has no mixer
5393 * element which allows changing the channel mode, so the verb list is
5394 * never used.
5395 */
d2a6d7dc 5396static struct hda_channel_mode alc260_modes[1] = {
1da177e4
LT
5397 { 2, NULL },
5398};
5399
df694daa
KY
5400
5401/* Mixer combinations
5402 *
5403 * basic: base_output + input + pc_beep + capture
5404 * HP: base_output + input + capture_alt
5405 * HP_3013: hp_3013 + input + capture
5406 * fujitsu: fujitsu + capture
0bfc90e9 5407 * acer: acer + capture
df694daa
KY
5408 */
5409
5410static struct snd_kcontrol_new alc260_base_output_mixer[] = {
05acb863 5411 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
985be54b 5412 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
05acb863 5413 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
985be54b 5414 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
05acb863 5415 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
985be54b 5416 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
1da177e4 5417 { } /* end */
f12ab1e0 5418};
1da177e4 5419
df694daa 5420static struct snd_kcontrol_new alc260_input_mixer[] = {
16ded525
TI
5421 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5422 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5423 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5424 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5425 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5426 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5427 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5428 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
df694daa
KY
5429 { } /* end */
5430};
5431
bec15c3a
TI
5432/* update HP, line and mono out pins according to the master switch */
5433static void alc260_hp_master_update(struct hda_codec *codec,
5434 hda_nid_t hp, hda_nid_t line,
5435 hda_nid_t mono)
5436{
5437 struct alc_spec *spec = codec->spec;
5438 unsigned int val = spec->master_sw ? PIN_HP : 0;
5439 /* change HP and line-out pins */
30cde0aa 5440 snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
bec15c3a 5441 val);
30cde0aa 5442 snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
bec15c3a
TI
5443 val);
5444 /* mono (speaker) depending on the HP jack sense */
5445 val = (val && !spec->jack_present) ? PIN_OUT : 0;
30cde0aa 5446 snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
bec15c3a
TI
5447 val);
5448}
5449
5450static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5451 struct snd_ctl_elem_value *ucontrol)
5452{
5453 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5454 struct alc_spec *spec = codec->spec;
5455 *ucontrol->value.integer.value = spec->master_sw;
5456 return 0;
5457}
5458
5459static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5460 struct snd_ctl_elem_value *ucontrol)
5461{
5462 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5463 struct alc_spec *spec = codec->spec;
5464 int val = !!*ucontrol->value.integer.value;
5465 hda_nid_t hp, line, mono;
5466
5467 if (val == spec->master_sw)
5468 return 0;
5469 spec->master_sw = val;
5470 hp = (kcontrol->private_value >> 16) & 0xff;
5471 line = (kcontrol->private_value >> 8) & 0xff;
5472 mono = kcontrol->private_value & 0xff;
5473 alc260_hp_master_update(codec, hp, line, mono);
5474 return 1;
5475}
5476
5477static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5478 {
5479 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5480 .name = "Master Playback Switch",
5b0cb1d8 5481 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
bec15c3a
TI
5482 .info = snd_ctl_boolean_mono_info,
5483 .get = alc260_hp_master_sw_get,
5484 .put = alc260_hp_master_sw_put,
5485 .private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5486 },
5487 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5488 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5489 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5490 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5491 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5492 HDA_OUTPUT),
5493 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5494 { } /* end */
5495};
5496
5497static struct hda_verb alc260_hp_unsol_verbs[] = {
5498 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5499 {},
5500};
5501
5502static void alc260_hp_automute(struct hda_codec *codec)
5503{
5504 struct alc_spec *spec = codec->spec;
bec15c3a 5505
864f92be 5506 spec->jack_present = snd_hda_jack_detect(codec, 0x10);
bec15c3a
TI
5507 alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5508}
5509
5510static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5511{
5512 if ((res >> 26) == ALC880_HP_EVENT)
5513 alc260_hp_automute(codec);
5514}
5515
df694daa 5516static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
bec15c3a
TI
5517 {
5518 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5519 .name = "Master Playback Switch",
5b0cb1d8 5520 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
bec15c3a
TI
5521 .info = snd_ctl_boolean_mono_info,
5522 .get = alc260_hp_master_sw_get,
5523 .put = alc260_hp_master_sw_put,
30cde0aa 5524 .private_value = (0x15 << 16) | (0x10 << 8) | 0x11
bec15c3a 5525 },
df694daa
KY
5526 HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5527 HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5528 HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5529 HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5530 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5531 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
86cd9298
TI
5532 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5533 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
16ded525
TI
5534 { } /* end */
5535};
5536
3f878308
KY
5537static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5538 .ops = &snd_hda_bind_vol,
5539 .values = {
5540 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5541 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5542 HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5543 0
5544 },
5545};
5546
5547static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5548 .ops = &snd_hda_bind_sw,
5549 .values = {
5550 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5551 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5552 0
5553 },
5554};
5555
5556static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5557 HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5558 HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5559 HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5560 HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5561 { } /* end */
5562};
5563
bec15c3a
TI
5564static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5565 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5566 {},
5567};
5568
5569static void alc260_hp_3013_automute(struct hda_codec *codec)
5570{
5571 struct alc_spec *spec = codec->spec;
bec15c3a 5572
864f92be 5573 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
30cde0aa 5574 alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
bec15c3a
TI
5575}
5576
5577static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5578 unsigned int res)
5579{
5580 if ((res >> 26) == ALC880_HP_EVENT)
5581 alc260_hp_3013_automute(codec);
5582}
5583
3f878308
KY
5584static void alc260_hp_3012_automute(struct hda_codec *codec)
5585{
864f92be 5586 unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
3f878308 5587
3f878308
KY
5588 snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5589 bits);
5590 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5591 bits);
5592 snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5593 bits);
5594}
5595
5596static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5597 unsigned int res)
5598{
5599 if ((res >> 26) == ALC880_HP_EVENT)
5600 alc260_hp_3012_automute(codec);
5601}
5602
5603/* Fujitsu S702x series laptops. ALC260 pin usage: Mic/Line jack = 0x12,
a1e8d2da
JW
5604 * HP jack = 0x14, CD audio = 0x16, internal speaker = 0x10.
5605 */
c8b6bf9b 5606static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
a9430dd8 5607 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
985be54b 5608 HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
4c5186ed 5609 ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
a9430dd8
JW
5610 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5611 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5612 HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5613 HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
4c5186ed 5614 ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
31bffaa9
TI
5615 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5616 HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
df694daa
KY
5617 { } /* end */
5618};
5619
a1e8d2da
JW
5620/* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks. Note that current
5621 * versions of the ALC260 don't act on requests to enable mic bias from NID
5622 * 0x0f (used to drive the headphone jack in these laptops). The ALC260
5623 * datasheet doesn't mention this restriction. At this stage it's not clear
5624 * whether this behaviour is intentional or is a hardware bug in chip
5625 * revisions available in early 2006. Therefore for now allow the
5626 * "Headphone Jack Mode" control to span all choices, but if it turns out
5627 * that the lack of mic bias for this NID is intentional we could change the
5628 * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5629 *
5630 * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5631 * don't appear to make the mic bias available from the "line" jack, even
5632 * though the NID used for this jack (0x14) can supply it. The theory is
5633 * that perhaps Acer have included blocking capacitors between the ALC260
5634 * and the output jack. If this turns out to be the case for all such
5635 * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5636 * to ALC_PIN_DIR_INOUT_NOMICBIAS.
bd869485
JW
5637 *
5638 * The C20x Tablet series have a mono internal speaker which is controlled
5639 * via the chip's Mono sum widget and pin complex, so include the necessary
5640 * controls for such models. On models without a "mono speaker" the control
5641 * won't do anything.
a1e8d2da 5642 */
0bfc90e9
JW
5643static struct snd_kcontrol_new alc260_acer_mixer[] = {
5644 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5645 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
a1e8d2da 5646 ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
31bffaa9 5647 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
bd869485 5648 HDA_OUTPUT),
31bffaa9 5649 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
bd869485 5650 HDA_INPUT),
0bfc90e9
JW
5651 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5652 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5653 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5654 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5655 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5656 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5657 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5658 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
0bfc90e9
JW
5659 { } /* end */
5660};
5661
cc959489
MS
5662/* Maxdata Favorit 100XS: one output and one input (0x12) jack
5663 */
5664static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5665 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5666 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5667 ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5668 HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5669 HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5670 ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5671 { } /* end */
5672};
5673
bc9f98a9
KY
5674/* Packard bell V7900 ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5675 * Line In jack = 0x14, CD audio = 0x16, pc beep = 0x17.
5676 */
5677static struct snd_kcontrol_new alc260_will_mixer[] = {
5678 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5679 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5680 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5681 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5682 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5683 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5684 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5685 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5686 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5687 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
bc9f98a9
KY
5688 { } /* end */
5689};
5690
5691/* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5692 * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5693 */
5694static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5695 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5696 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5697 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5698 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5699 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5700 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5701 HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5702 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5703 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5704 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5705 { } /* end */
5706};
5707
df694daa
KY
5708/*
5709 * initialization verbs
5710 */
1da177e4
LT
5711static struct hda_verb alc260_init_verbs[] = {
5712 /* Line In pin widget for input */
05acb863 5713 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1da177e4 5714 /* CD pin widget for input */
05acb863 5715 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1da177e4 5716 /* Mic1 (rear panel) pin widget for input and vref at 80% */
16ded525 5717 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1da177e4 5718 /* Mic2 (front panel) pin widget for input and vref at 80% */
16ded525 5719 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
1da177e4 5720 /* LINE-2 is used for line-out in rear */
05acb863 5721 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1da177e4 5722 /* select line-out */
fd56f2db 5723 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
1da177e4 5724 /* LINE-OUT pin */
05acb863 5725 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1da177e4 5726 /* enable HP */
05acb863 5727 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
1da177e4 5728 /* enable Mono */
05acb863
TI
5729 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5730 /* mute capture amp left and right */
16ded525 5731 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1da177e4
LT
5732 /* set connection select to line in (default select for this ADC) */
5733 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
16ded525
TI
5734 /* mute capture amp left and right */
5735 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5736 /* set connection select to line in (default select for this ADC) */
5737 {0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
05acb863
TI
5738 /* set vol=0 Line-Out mixer amp left and right */
5739 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5740 /* unmute pin widget amp left and right (no gain on this amp) */
5741 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5742 /* set vol=0 HP mixer amp left and right */
5743 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5744 /* unmute pin widget amp left and right (no gain on this amp) */
5745 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5746 /* set vol=0 Mono mixer amp left and right */
5747 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5748 /* unmute pin widget amp left and right (no gain on this amp) */
5749 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5750 /* unmute LINE-2 out pin */
5751 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
f12ab1e0
TI
5752 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5753 * Line In 2 = 0x03
5754 */
cb53c626
TI
5755 /* mute analog inputs */
5756 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5757 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5758 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5759 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5760 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
1da177e4 5761 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
05acb863
TI
5762 /* mute Front out path */
5763 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5764 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5765 /* mute Headphone out path */
5766 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5767 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5768 /* mute Mono out path */
5769 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5770 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4
LT
5771 { }
5772};
5773
474167d6 5774#if 0 /* should be identical with alc260_init_verbs? */
df694daa
KY
5775static struct hda_verb alc260_hp_init_verbs[] = {
5776 /* Headphone and output */
5777 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5778 /* mono output */
5779 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5780 /* Mic1 (rear panel) pin widget for input and vref at 80% */
5781 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5782 /* Mic2 (front panel) pin widget for input and vref at 80% */
5783 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5784 /* Line In pin widget for input */
5785 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5786 /* Line-2 pin widget for output */
5787 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5788 /* CD pin widget for input */
5789 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5790 /* unmute amp left and right */
5791 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5792 /* set connection select to line in (default select for this ADC) */
5793 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5794 /* unmute Line-Out mixer amp left and right (volume = 0) */
5795 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5796 /* mute pin widget amp left and right (no gain on this amp) */
5797 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5798 /* unmute HP mixer amp left and right (volume = 0) */
5799 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5800 /* mute pin widget amp left and right (no gain on this amp) */
5801 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
f12ab1e0
TI
5802 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5803 * Line In 2 = 0x03
5804 */
cb53c626
TI
5805 /* mute analog inputs */
5806 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5807 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5808 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5809 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5810 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
df694daa
KY
5811 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5812 /* Unmute Front out path */
5813 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5814 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5815 /* Unmute Headphone out path */
5816 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5817 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5818 /* Unmute Mono out path */
5819 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5820 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5821 { }
5822};
474167d6 5823#endif
df694daa
KY
5824
5825static struct hda_verb alc260_hp_3013_init_verbs[] = {
5826 /* Line out and output */
5827 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5828 /* mono output */
5829 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5830 /* Mic1 (rear panel) pin widget for input and vref at 80% */
5831 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5832 /* Mic2 (front panel) pin widget for input and vref at 80% */
5833 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5834 /* Line In pin widget for input */
5835 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5836 /* Headphone pin widget for output */
5837 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5838 /* CD pin widget for input */
5839 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5840 /* unmute amp left and right */
5841 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5842 /* set connection select to line in (default select for this ADC) */
5843 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5844 /* unmute Line-Out mixer amp left and right (volume = 0) */
5845 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5846 /* mute pin widget amp left and right (no gain on this amp) */
5847 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5848 /* unmute HP mixer amp left and right (volume = 0) */
5849 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5850 /* mute pin widget amp left and right (no gain on this amp) */
5851 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
f12ab1e0
TI
5852 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5853 * Line In 2 = 0x03
5854 */
cb53c626
TI
5855 /* mute analog inputs */
5856 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5857 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5858 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5859 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5860 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
df694daa
KY
5861 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5862 /* Unmute Front out path */
5863 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5864 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5865 /* Unmute Headphone out path */
5866 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5867 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5868 /* Unmute Mono out path */
5869 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5870 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5871 { }
5872};
5873
a9430dd8 5874/* Initialisation sequence for ALC260 as configured in Fujitsu S702x
a1e8d2da
JW
5875 * laptops. ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
5876 * audio = 0x16, internal speaker = 0x10.
a9430dd8
JW
5877 */
5878static struct hda_verb alc260_fujitsu_init_verbs[] = {
5879 /* Disable all GPIOs */
5880 {0x01, AC_VERB_SET_GPIO_MASK, 0},
5881 /* Internal speaker is connected to headphone pin */
5882 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5883 /* Headphone/Line-out jack connects to Line1 pin; make it an output */
5884 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
f7ace40d
JW
5885 /* Mic/Line-in jack is connected to mic1 pin, so make it an input */
5886 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5887 /* Ensure all other unused pins are disabled and muted. */
5888 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5889 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
a9430dd8 5890 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
f7ace40d 5891 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
a9430dd8 5892 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
f7ace40d
JW
5893 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5894 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5895 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5896
5897 /* Disable digital (SPDIF) pins */
5898 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5899 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
a9430dd8 5900
ea1fb29a 5901 /* Ensure Line1 pin widget takes its input from the OUT1 sum bus
f7ace40d
JW
5902 * when acting as an output.
5903 */
5904 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
4c5186ed 5905
f7ace40d 5906 /* Start with output sum widgets muted and their output gains at min */
8b33a5aa
TI
5907 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5908 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5909 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5910 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5911 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5912 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5913 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5914 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5915 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
a9430dd8 5916
f7ace40d
JW
5917 /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
5918 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5919 /* Unmute Line1 pin widget output buffer since it starts as an output.
5920 * If the pin mode is changed by the user the pin mode control will
5921 * take care of enabling the pin's input/output buffers as needed.
5922 * Therefore there's no need to enable the input buffer at this
5923 * stage.
cdcd9268 5924 */
f7ace40d 5925 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
ea1fb29a 5926 /* Unmute input buffer of pin widget used for Line-in (no equiv
cdcd9268
JW
5927 * mixer ctrl)
5928 */
f7ace40d
JW
5929 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5930
5931 /* Mute capture amp left and right */
5932 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
ea1fb29a 5933 /* Set ADC connection select to match default mixer setting - line
f7ace40d
JW
5934 * in (on mic1 pin)
5935 */
5936 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5937
5938 /* Do the same for the second ADC: mute capture input amp and
5939 * set ADC connection to line in (on mic1 pin)
5940 */
5941 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5942 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5943
5944 /* Mute all inputs to mixer widget (even unconnected ones) */
5945 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5946 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5947 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5948 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5949 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5950 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5951 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5952 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
4a471b7d
TI
5953
5954 { }
a9430dd8
JW
5955};
5956
0bfc90e9
JW
5957/* Initialisation sequence for ALC260 as configured in Acer TravelMate and
5958 * similar laptops (adapted from Fujitsu init verbs).
5959 */
5960static struct hda_verb alc260_acer_init_verbs[] = {
5961 /* On TravelMate laptops, GPIO 0 enables the internal speaker and
5962 * the headphone jack. Turn this on and rely on the standard mute
5963 * methods whenever the user wants to turn these outputs off.
5964 */
5965 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5966 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5967 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5968 /* Internal speaker/Headphone jack is connected to Line-out pin */
5969 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5970 /* Internal microphone/Mic jack is connected to Mic1 pin */
5971 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5972 /* Line In jack is connected to Line1 pin */
5973 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
bd869485
JW
5974 /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
5975 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
0bfc90e9
JW
5976 /* Ensure all other unused pins are disabled and muted. */
5977 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5978 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
0bfc90e9
JW
5979 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5980 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5981 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5982 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5983 /* Disable digital (SPDIF) pins */
5984 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5985 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5986
ea1fb29a 5987 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
0bfc90e9
JW
5988 * bus when acting as outputs.
5989 */
5990 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5991 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5992
5993 /* Start with output sum widgets muted and their output gains at min */
5994 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5995 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5996 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5997 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5998 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5999 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6000 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6001 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6002 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6003
f12ab1e0
TI
6004 /* Unmute Line-out pin widget amp left and right
6005 * (no equiv mixer ctrl)
6006 */
0bfc90e9 6007 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
bd869485
JW
6008 /* Unmute mono pin widget amp output (no equiv mixer ctrl) */
6009 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
0bfc90e9
JW
6010 /* Unmute Mic1 and Line1 pin widget input buffers since they start as
6011 * inputs. If the pin mode is changed by the user the pin mode control
6012 * will take care of enabling the pin's input/output buffers as needed.
6013 * Therefore there's no need to enable the input buffer at this
6014 * stage.
6015 */
6016 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6017 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6018
6019 /* Mute capture amp left and right */
6020 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6021 /* Set ADC connection select to match default mixer setting - mic
6022 * (on mic1 pin)
6023 */
6024 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6025
6026 /* Do similar with the second ADC: mute capture input amp and
a1e8d2da 6027 * set ADC connection to mic to match ALSA's default state.
0bfc90e9
JW
6028 */
6029 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
a1e8d2da 6030 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
0bfc90e9
JW
6031
6032 /* Mute all inputs to mixer widget (even unconnected ones) */
6033 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6034 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6035 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6036 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6037 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6038 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6039 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6040 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6041
6042 { }
6043};
6044
cc959489
MS
6045/* Initialisation sequence for Maxdata Favorit 100XS
6046 * (adapted from Acer init verbs).
6047 */
6048static struct hda_verb alc260_favorit100_init_verbs[] = {
6049 /* GPIO 0 enables the output jack.
6050 * Turn this on and rely on the standard mute
6051 * methods whenever the user wants to turn these outputs off.
6052 */
6053 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6054 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6055 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
6056 /* Line/Mic input jack is connected to Mic1 pin */
6057 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
6058 /* Ensure all other unused pins are disabled and muted. */
6059 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6060 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6061 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6062 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6063 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6064 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6065 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6066 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6067 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6068 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6069 /* Disable digital (SPDIF) pins */
6070 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6071 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6072
6073 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
6074 * bus when acting as outputs.
6075 */
6076 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6077 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6078
6079 /* Start with output sum widgets muted and their output gains at min */
6080 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6081 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6082 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6083 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6084 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6085 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6086 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6087 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6088 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6089
6090 /* Unmute Line-out pin widget amp left and right
6091 * (no equiv mixer ctrl)
6092 */
6093 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6094 /* Unmute Mic1 and Line1 pin widget input buffers since they start as
6095 * inputs. If the pin mode is changed by the user the pin mode control
6096 * will take care of enabling the pin's input/output buffers as needed.
6097 * Therefore there's no need to enable the input buffer at this
6098 * stage.
6099 */
6100 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6101
6102 /* Mute capture amp left and right */
6103 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6104 /* Set ADC connection select to match default mixer setting - mic
6105 * (on mic1 pin)
6106 */
6107 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6108
6109 /* Do similar with the second ADC: mute capture input amp and
6110 * set ADC connection to mic to match ALSA's default state.
6111 */
6112 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6113 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6114
6115 /* Mute all inputs to mixer widget (even unconnected ones) */
6116 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6117 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6118 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6119 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6120 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6121 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6122 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6123 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6124
6125 { }
6126};
6127
bc9f98a9
KY
6128static struct hda_verb alc260_will_verbs[] = {
6129 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6130 {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
6131 {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
6132 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6133 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6134 {0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
6135 {}
6136};
6137
6138static struct hda_verb alc260_replacer_672v_verbs[] = {
6139 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6140 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6141 {0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
6142
6143 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6144 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6145 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6146
6147 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6148 {}
6149};
6150
6151/* toggle speaker-output according to the hp-jack state */
6152static void alc260_replacer_672v_automute(struct hda_codec *codec)
6153{
6154 unsigned int present;
6155
6156 /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
864f92be 6157 present = snd_hda_jack_detect(codec, 0x0f);
bc9f98a9 6158 if (present) {
82beb8fd
TI
6159 snd_hda_codec_write_cache(codec, 0x01, 0,
6160 AC_VERB_SET_GPIO_DATA, 1);
6161 snd_hda_codec_write_cache(codec, 0x0f, 0,
6162 AC_VERB_SET_PIN_WIDGET_CONTROL,
6163 PIN_HP);
bc9f98a9 6164 } else {
82beb8fd
TI
6165 snd_hda_codec_write_cache(codec, 0x01, 0,
6166 AC_VERB_SET_GPIO_DATA, 0);
6167 snd_hda_codec_write_cache(codec, 0x0f, 0,
6168 AC_VERB_SET_PIN_WIDGET_CONTROL,
6169 PIN_OUT);
bc9f98a9
KY
6170 }
6171}
6172
6173static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
6174 unsigned int res)
6175{
6176 if ((res >> 26) == ALC880_HP_EVENT)
6177 alc260_replacer_672v_automute(codec);
6178}
6179
3f878308
KY
6180static struct hda_verb alc260_hp_dc7600_verbs[] = {
6181 {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
6182 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6183 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6184 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6185 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6186 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6187 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
6188 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6189 {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6190 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6191 {}
6192};
6193
7cf51e48
JW
6194/* Test configuration for debugging, modelled after the ALC880 test
6195 * configuration.
6196 */
6197#ifdef CONFIG_SND_DEBUG
6198static hda_nid_t alc260_test_dac_nids[1] = {
6199 0x02,
6200};
6201static hda_nid_t alc260_test_adc_nids[2] = {
6202 0x04, 0x05,
6203};
a1e8d2da 6204/* For testing the ALC260, each input MUX needs its own definition since
ea1fb29a 6205 * the signal assignments are different. This assumes that the first ADC
a1e8d2da 6206 * is NID 0x04.
17e7aec6 6207 */
a1e8d2da
JW
6208static struct hda_input_mux alc260_test_capture_sources[2] = {
6209 {
6210 .num_items = 7,
6211 .items = {
6212 { "MIC1 pin", 0x0 },
6213 { "MIC2 pin", 0x1 },
6214 { "LINE1 pin", 0x2 },
6215 { "LINE2 pin", 0x3 },
6216 { "CD pin", 0x4 },
6217 { "LINE-OUT pin", 0x5 },
6218 { "HP-OUT pin", 0x6 },
6219 },
6220 },
6221 {
6222 .num_items = 8,
6223 .items = {
6224 { "MIC1 pin", 0x0 },
6225 { "MIC2 pin", 0x1 },
6226 { "LINE1 pin", 0x2 },
6227 { "LINE2 pin", 0x3 },
6228 { "CD pin", 0x4 },
6229 { "Mixer", 0x5 },
6230 { "LINE-OUT pin", 0x6 },
6231 { "HP-OUT pin", 0x7 },
6232 },
7cf51e48
JW
6233 },
6234};
6235static struct snd_kcontrol_new alc260_test_mixer[] = {
6236 /* Output driver widgets */
6237 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
6238 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
6239 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
6240 HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
6241 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6242 HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
6243
a1e8d2da
JW
6244 /* Modes for retasking pin widgets
6245 * Note: the ALC260 doesn't seem to act on requests to enable mic
6246 * bias from NIDs 0x0f and 0x10. The ALC260 datasheet doesn't
6247 * mention this restriction. At this stage it's not clear whether
6248 * this behaviour is intentional or is a hardware bug in chip
6249 * revisions available at least up until early 2006. Therefore for
6250 * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
6251 * choices, but if it turns out that the lack of mic bias for these
6252 * NIDs is intentional we could change their modes from
6253 * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
6254 */
7cf51e48
JW
6255 ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
6256 ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
6257 ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
6258 ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
6259 ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
6260 ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
6261
6262 /* Loopback mixer controls */
6263 HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
6264 HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
6265 HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
6266 HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
6267 HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
6268 HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
6269 HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
6270 HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
6271 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
6272 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
7cf51e48
JW
6273 HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
6274 HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
6275 HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
6276 HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
5c8f858d
JW
6277
6278 /* Controls for GPIO pins, assuming they are configured as outputs */
6279 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
6280 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
6281 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
6282 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
6283
92621f13
JW
6284 /* Switches to allow the digital IO pins to be enabled. The datasheet
6285 * is ambigious as to which NID is which; testing on laptops which
ea1fb29a 6286 * make this output available should provide clarification.
92621f13
JW
6287 */
6288 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
6289 ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
6290
f8225f6d
JW
6291 /* A switch allowing EAPD to be enabled. Some laptops seem to use
6292 * this output to turn on an external amplifier.
6293 */
6294 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
6295 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
6296
7cf51e48
JW
6297 { } /* end */
6298};
6299static struct hda_verb alc260_test_init_verbs[] = {
5c8f858d
JW
6300 /* Enable all GPIOs as outputs with an initial value of 0 */
6301 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
6302 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6303 {0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
6304
7cf51e48
JW
6305 /* Enable retasking pins as output, initially without power amp */
6306 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6307 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6308 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6309 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6310 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6311 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6312
92621f13
JW
6313 /* Disable digital (SPDIF) pins initially, but users can enable
6314 * them via a mixer switch. In the case of SPDIF-out, this initverb
6315 * payload also sets the generation to 0, output to be in "consumer"
6316 * PCM format, copyright asserted, no pre-emphasis and no validity
6317 * control.
6318 */
7cf51e48
JW
6319 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6320 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6321
ea1fb29a 6322 /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
7cf51e48
JW
6323 * OUT1 sum bus when acting as an output.
6324 */
6325 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6326 {0x0c, AC_VERB_SET_CONNECT_SEL, 0},
6327 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6328 {0x0e, AC_VERB_SET_CONNECT_SEL, 0},
6329
6330 /* Start with output sum widgets muted and their output gains at min */
6331 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6332 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6333 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6334 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6335 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6336 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6337 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6338 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6339 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6340
cdcd9268
JW
6341 /* Unmute retasking pin widget output buffers since the default
6342 * state appears to be output. As the pin mode is changed by the
6343 * user the pin mode control will take care of enabling the pin's
6344 * input/output buffers as needed.
6345 */
7cf51e48
JW
6346 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6347 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6348 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6349 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6350 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6351 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6352 /* Also unmute the mono-out pin widget */
6353 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6354
7cf51e48
JW
6355 /* Mute capture amp left and right */
6356 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
f7ace40d
JW
6357 /* Set ADC connection select to match default mixer setting (mic1
6358 * pin)
7cf51e48
JW
6359 */
6360 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6361
6362 /* Do the same for the second ADC: mute capture input amp and
f7ace40d 6363 * set ADC connection to mic1 pin
7cf51e48
JW
6364 */
6365 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6366 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6367
6368 /* Mute all inputs to mixer widget (even unconnected ones) */
6369 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6370 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6371 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6372 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6373 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6374 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6375 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6376 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6377
6378 { }
6379};
6380#endif
6381
6330079f
TI
6382#define alc260_pcm_analog_playback alc880_pcm_analog_alt_playback
6383#define alc260_pcm_analog_capture alc880_pcm_analog_capture
1da177e4 6384
a3bcba38
TI
6385#define alc260_pcm_digital_playback alc880_pcm_digital_playback
6386#define alc260_pcm_digital_capture alc880_pcm_digital_capture
6387
df694daa
KY
6388/*
6389 * for BIOS auto-configuration
6390 */
16ded525 6391
df694daa 6392static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
863b4518 6393 const char *pfx, int *vol_bits)
df694daa
KY
6394{
6395 hda_nid_t nid_vol;
6396 unsigned long vol_val, sw_val;
df694daa
KY
6397 int err;
6398
6399 if (nid >= 0x0f && nid < 0x11) {
6400 nid_vol = nid - 0x7;
6401 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6402 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6403 } else if (nid == 0x11) {
6404 nid_vol = nid - 0x7;
6405 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
6406 sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
6407 } else if (nid >= 0x12 && nid <= 0x15) {
6408 nid_vol = 0x08;
6409 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6410 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6411 } else
6412 return 0; /* N/A */
ea1fb29a 6413
863b4518
TI
6414 if (!(*vol_bits & (1 << nid_vol))) {
6415 /* first control for the volume widget */
0afe5f89 6416 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
863b4518
TI
6417 if (err < 0)
6418 return err;
6419 *vol_bits |= (1 << nid_vol);
6420 }
0afe5f89 6421 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
f12ab1e0 6422 if (err < 0)
df694daa
KY
6423 return err;
6424 return 1;
6425}
6426
6427/* add playback controls from the parsed DAC table */
6428static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6429 const struct auto_pin_cfg *cfg)
6430{
6431 hda_nid_t nid;
6432 int err;
863b4518 6433 int vols = 0;
df694daa
KY
6434
6435 spec->multiout.num_dacs = 1;
6436 spec->multiout.dac_nids = spec->private_dac_nids;
6437 spec->multiout.dac_nids[0] = 0x02;
6438
6439 nid = cfg->line_out_pins[0];
6440 if (nid) {
23112d6d
TI
6441 const char *pfx;
6442 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6443 pfx = "Master";
6444 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6445 pfx = "Speaker";
6446 else
6447 pfx = "Front";
6448 err = alc260_add_playback_controls(spec, nid, pfx, &vols);
df694daa
KY
6449 if (err < 0)
6450 return err;
6451 }
6452
82bc955f 6453 nid = cfg->speaker_pins[0];
df694daa 6454 if (nid) {
863b4518 6455 err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
df694daa
KY
6456 if (err < 0)
6457 return err;
6458 }
6459
eb06ed8f 6460 nid = cfg->hp_pins[0];
df694daa 6461 if (nid) {
863b4518
TI
6462 err = alc260_add_playback_controls(spec, nid, "Headphone",
6463 &vols);
df694daa
KY
6464 if (err < 0)
6465 return err;
6466 }
f12ab1e0 6467 return 0;
df694daa
KY
6468}
6469
6470/* create playback/capture controls for input pins */
05f5f477 6471static int alc260_auto_create_input_ctls(struct hda_codec *codec,
df694daa
KY
6472 const struct auto_pin_cfg *cfg)
6473{
05f5f477 6474 return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
df694daa
KY
6475}
6476
6477static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6478 hda_nid_t nid, int pin_type,
6479 int sel_idx)
6480{
f6c7e546 6481 alc_set_pin_output(codec, nid, pin_type);
df694daa
KY
6482 /* need the manual connection? */
6483 if (nid >= 0x12) {
6484 int idx = nid - 0x12;
6485 snd_hda_codec_write(codec, idx + 0x0b, 0,
6486 AC_VERB_SET_CONNECT_SEL, sel_idx);
df694daa
KY
6487 }
6488}
6489
6490static void alc260_auto_init_multi_out(struct hda_codec *codec)
6491{
6492 struct alc_spec *spec = codec->spec;
6493 hda_nid_t nid;
6494
f12ab1e0 6495 nid = spec->autocfg.line_out_pins[0];
baba8ee9
TI
6496 if (nid) {
6497 int pin_type = get_pin_type(spec->autocfg.line_out_type);
6498 alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6499 }
ea1fb29a 6500
82bc955f 6501 nid = spec->autocfg.speaker_pins[0];
df694daa
KY
6502 if (nid)
6503 alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6504
eb06ed8f 6505 nid = spec->autocfg.hp_pins[0];
df694daa 6506 if (nid)
baba8ee9 6507 alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
f12ab1e0 6508}
df694daa
KY
6509
6510#define ALC260_PIN_CD_NID 0x16
6511static void alc260_auto_init_analog_input(struct hda_codec *codec)
6512{
6513 struct alc_spec *spec = codec->spec;
6514 int i;
6515
6516 for (i = 0; i < AUTO_PIN_LAST; i++) {
6517 hda_nid_t nid = spec->autocfg.input_pins[i];
6518 if (nid >= 0x12) {
23f0c048 6519 alc_set_input_pin(codec, nid, i);
e82c025b
TI
6520 if (nid != ALC260_PIN_CD_NID &&
6521 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
f12ab1e0
TI
6522 snd_hda_codec_write(codec, nid, 0,
6523 AC_VERB_SET_AMP_GAIN_MUTE,
df694daa
KY
6524 AMP_OUT_MUTE);
6525 }
6526 }
6527}
6528
7f311a46
TI
6529#define alc260_auto_init_input_src alc880_auto_init_input_src
6530
df694daa
KY
6531/*
6532 * generic initialization of ADC, input mixers and output mixers
6533 */
6534static struct hda_verb alc260_volume_init_verbs[] = {
6535 /*
6536 * Unmute ADC0-1 and set the default input to mic-in
6537 */
6538 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6539 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6540 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6541 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
ea1fb29a 6542
df694daa
KY
6543 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6544 * mixer widget
f12ab1e0
TI
6545 * Note: PASD motherboards uses the Line In 2 as the input for
6546 * front panel mic (mic 2)
df694daa
KY
6547 */
6548 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
6549 /* mute analog inputs */
6550 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6551 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6552 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6553 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6554 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
df694daa
KY
6555
6556 /*
6557 * Set up output mixers (0x08 - 0x0a)
6558 */
6559 /* set vol=0 to output mixers */
6560 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6561 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6562 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6563 /* set up input amps for analog loopback */
6564 /* Amp Indices: DAC = 0, mixer = 1 */
6565 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6566 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6567 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6568 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6569 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6570 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 6571
df694daa
KY
6572 { }
6573};
6574
6575static int alc260_parse_auto_config(struct hda_codec *codec)
6576{
6577 struct alc_spec *spec = codec->spec;
df694daa
KY
6578 int err;
6579 static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6580
f12ab1e0
TI
6581 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6582 alc260_ignore);
6583 if (err < 0)
df694daa 6584 return err;
f12ab1e0
TI
6585 err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6586 if (err < 0)
4a471b7d 6587 return err;
603c4019 6588 if (!spec->kctls.list)
df694daa 6589 return 0; /* can't find valid BIOS pin config */
05f5f477 6590 err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 6591 if (err < 0)
df694daa
KY
6592 return err;
6593
6594 spec->multiout.max_channels = 2;
6595
0852d7a6 6596 if (spec->autocfg.dig_outs)
df694daa 6597 spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
603c4019 6598 if (spec->kctls.list)
d88897ea 6599 add_mixer(spec, spec->kctls.list);
df694daa 6600
d88897ea 6601 add_verb(spec, alc260_volume_init_verbs);
df694daa 6602
a1e8d2da 6603 spec->num_mux_defs = 1;
61b9b9b1 6604 spec->input_mux = &spec->private_imux[0];
df694daa 6605
6227cdce 6606 alc_ssid_check(codec, 0x10, 0x15, 0x0f, 0);
4a79ba34 6607
df694daa
KY
6608 return 1;
6609}
6610
ae6b813a
TI
6611/* additional initialization for auto-configuration model */
6612static void alc260_auto_init(struct hda_codec *codec)
df694daa 6613{
f6c7e546 6614 struct alc_spec *spec = codec->spec;
df694daa
KY
6615 alc260_auto_init_multi_out(codec);
6616 alc260_auto_init_analog_input(codec);
7f311a46 6617 alc260_auto_init_input_src(codec);
f6c7e546 6618 if (spec->unsol_event)
7fb0d78f 6619 alc_inithook(codec);
df694daa
KY
6620}
6621
cb53c626
TI
6622#ifdef CONFIG_SND_HDA_POWER_SAVE
6623static struct hda_amp_list alc260_loopbacks[] = {
6624 { 0x07, HDA_INPUT, 0 },
6625 { 0x07, HDA_INPUT, 1 },
6626 { 0x07, HDA_INPUT, 2 },
6627 { 0x07, HDA_INPUT, 3 },
6628 { 0x07, HDA_INPUT, 4 },
6629 { } /* end */
6630};
6631#endif
6632
df694daa
KY
6633/*
6634 * ALC260 configurations
6635 */
f5fcc13c
TI
6636static const char *alc260_models[ALC260_MODEL_LAST] = {
6637 [ALC260_BASIC] = "basic",
6638 [ALC260_HP] = "hp",
6639 [ALC260_HP_3013] = "hp-3013",
2922c9af 6640 [ALC260_HP_DC7600] = "hp-dc7600",
f5fcc13c
TI
6641 [ALC260_FUJITSU_S702X] = "fujitsu",
6642 [ALC260_ACER] = "acer",
bc9f98a9
KY
6643 [ALC260_WILL] = "will",
6644 [ALC260_REPLACER_672V] = "replacer",
cc959489 6645 [ALC260_FAVORIT100] = "favorit100",
7cf51e48 6646#ifdef CONFIG_SND_DEBUG
f5fcc13c 6647 [ALC260_TEST] = "test",
7cf51e48 6648#endif
f5fcc13c
TI
6649 [ALC260_AUTO] = "auto",
6650};
6651
6652static struct snd_pci_quirk alc260_cfg_tbl[] = {
bd869485 6653 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
950200e2 6654 SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
f5fcc13c 6655 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
cc959489 6656 SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
9720b718 6657 SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
4ac55982 6658 SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
f5fcc13c 6659 SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
34ec8a0a 6660 SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
3f878308 6661 SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
f5fcc13c
TI
6662 SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6663 SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6664 SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6665 SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6666 SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6667 SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6668 SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6669 SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6670 SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
bc9f98a9 6671 SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
ac3e3741 6672 SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
df694daa
KY
6673 {}
6674};
6675
6676static struct alc_config_preset alc260_presets[] = {
6677 [ALC260_BASIC] = {
6678 .mixers = { alc260_base_output_mixer,
45bdd1c1 6679 alc260_input_mixer },
df694daa
KY
6680 .init_verbs = { alc260_init_verbs },
6681 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6682 .dac_nids = alc260_dac_nids,
f9e336f6 6683 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
9c4cc0bd 6684 .adc_nids = alc260_dual_adc_nids,
df694daa
KY
6685 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6686 .channel_mode = alc260_modes,
6687 .input_mux = &alc260_capture_source,
6688 },
6689 [ALC260_HP] = {
bec15c3a 6690 .mixers = { alc260_hp_output_mixer,
f9e336f6 6691 alc260_input_mixer },
bec15c3a
TI
6692 .init_verbs = { alc260_init_verbs,
6693 alc260_hp_unsol_verbs },
df694daa
KY
6694 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6695 .dac_nids = alc260_dac_nids,
f9e336f6
TI
6696 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6697 .adc_nids = alc260_adc_nids_alt,
df694daa
KY
6698 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6699 .channel_mode = alc260_modes,
6700 .input_mux = &alc260_capture_source,
bec15c3a
TI
6701 .unsol_event = alc260_hp_unsol_event,
6702 .init_hook = alc260_hp_automute,
df694daa 6703 },
3f878308
KY
6704 [ALC260_HP_DC7600] = {
6705 .mixers = { alc260_hp_dc7600_mixer,
f9e336f6 6706 alc260_input_mixer },
3f878308
KY
6707 .init_verbs = { alc260_init_verbs,
6708 alc260_hp_dc7600_verbs },
6709 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6710 .dac_nids = alc260_dac_nids,
f9e336f6
TI
6711 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6712 .adc_nids = alc260_adc_nids_alt,
3f878308
KY
6713 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6714 .channel_mode = alc260_modes,
6715 .input_mux = &alc260_capture_source,
6716 .unsol_event = alc260_hp_3012_unsol_event,
6717 .init_hook = alc260_hp_3012_automute,
6718 },
df694daa
KY
6719 [ALC260_HP_3013] = {
6720 .mixers = { alc260_hp_3013_mixer,
f9e336f6 6721 alc260_input_mixer },
bec15c3a
TI
6722 .init_verbs = { alc260_hp_3013_init_verbs,
6723 alc260_hp_3013_unsol_verbs },
df694daa
KY
6724 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6725 .dac_nids = alc260_dac_nids,
f9e336f6
TI
6726 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6727 .adc_nids = alc260_adc_nids_alt,
df694daa
KY
6728 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6729 .channel_mode = alc260_modes,
6730 .input_mux = &alc260_capture_source,
bec15c3a
TI
6731 .unsol_event = alc260_hp_3013_unsol_event,
6732 .init_hook = alc260_hp_3013_automute,
df694daa
KY
6733 },
6734 [ALC260_FUJITSU_S702X] = {
f9e336f6 6735 .mixers = { alc260_fujitsu_mixer },
df694daa
KY
6736 .init_verbs = { alc260_fujitsu_init_verbs },
6737 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6738 .dac_nids = alc260_dac_nids,
d57fdac0
JW
6739 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6740 .adc_nids = alc260_dual_adc_nids,
df694daa
KY
6741 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6742 .channel_mode = alc260_modes,
a1e8d2da
JW
6743 .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
6744 .input_mux = alc260_fujitsu_capture_sources,
df694daa 6745 },
0bfc90e9 6746 [ALC260_ACER] = {
f9e336f6 6747 .mixers = { alc260_acer_mixer },
0bfc90e9
JW
6748 .init_verbs = { alc260_acer_init_verbs },
6749 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6750 .dac_nids = alc260_dac_nids,
6751 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6752 .adc_nids = alc260_dual_adc_nids,
6753 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6754 .channel_mode = alc260_modes,
a1e8d2da
JW
6755 .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
6756 .input_mux = alc260_acer_capture_sources,
0bfc90e9 6757 },
cc959489
MS
6758 [ALC260_FAVORIT100] = {
6759 .mixers = { alc260_favorit100_mixer },
6760 .init_verbs = { alc260_favorit100_init_verbs },
6761 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6762 .dac_nids = alc260_dac_nids,
6763 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6764 .adc_nids = alc260_dual_adc_nids,
6765 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6766 .channel_mode = alc260_modes,
6767 .num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
6768 .input_mux = alc260_favorit100_capture_sources,
6769 },
bc9f98a9 6770 [ALC260_WILL] = {
f9e336f6 6771 .mixers = { alc260_will_mixer },
bc9f98a9
KY
6772 .init_verbs = { alc260_init_verbs, alc260_will_verbs },
6773 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6774 .dac_nids = alc260_dac_nids,
6775 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6776 .adc_nids = alc260_adc_nids,
6777 .dig_out_nid = ALC260_DIGOUT_NID,
6778 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6779 .channel_mode = alc260_modes,
6780 .input_mux = &alc260_capture_source,
6781 },
6782 [ALC260_REPLACER_672V] = {
f9e336f6 6783 .mixers = { alc260_replacer_672v_mixer },
bc9f98a9
KY
6784 .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
6785 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6786 .dac_nids = alc260_dac_nids,
6787 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6788 .adc_nids = alc260_adc_nids,
6789 .dig_out_nid = ALC260_DIGOUT_NID,
6790 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6791 .channel_mode = alc260_modes,
6792 .input_mux = &alc260_capture_source,
6793 .unsol_event = alc260_replacer_672v_unsol_event,
6794 .init_hook = alc260_replacer_672v_automute,
6795 },
7cf51e48
JW
6796#ifdef CONFIG_SND_DEBUG
6797 [ALC260_TEST] = {
f9e336f6 6798 .mixers = { alc260_test_mixer },
7cf51e48
JW
6799 .init_verbs = { alc260_test_init_verbs },
6800 .num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
6801 .dac_nids = alc260_test_dac_nids,
6802 .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
6803 .adc_nids = alc260_test_adc_nids,
6804 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6805 .channel_mode = alc260_modes,
a1e8d2da
JW
6806 .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
6807 .input_mux = alc260_test_capture_sources,
7cf51e48
JW
6808 },
6809#endif
df694daa
KY
6810};
6811
6812static int patch_alc260(struct hda_codec *codec)
1da177e4
LT
6813{
6814 struct alc_spec *spec;
df694daa 6815 int err, board_config;
1da177e4 6816
e560d8d8 6817 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1da177e4
LT
6818 if (spec == NULL)
6819 return -ENOMEM;
6820
6821 codec->spec = spec;
6822
f5fcc13c
TI
6823 board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
6824 alc260_models,
6825 alc260_cfg_tbl);
6826 if (board_config < 0) {
9a11f1aa 6827 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6c627f39 6828 codec->chip_name);
df694daa 6829 board_config = ALC260_AUTO;
16ded525 6830 }
1da177e4 6831
df694daa
KY
6832 if (board_config == ALC260_AUTO) {
6833 /* automatic parse from the BIOS config */
6834 err = alc260_parse_auto_config(codec);
6835 if (err < 0) {
6836 alc_free(codec);
6837 return err;
f12ab1e0 6838 } else if (!err) {
9c7f852e
TI
6839 printk(KERN_INFO
6840 "hda_codec: Cannot set up configuration "
6841 "from BIOS. Using base mode...\n");
df694daa
KY
6842 board_config = ALC260_BASIC;
6843 }
a9430dd8 6844 }
e9edcee0 6845
680cd536
KK
6846 err = snd_hda_attach_beep_device(codec, 0x1);
6847 if (err < 0) {
6848 alc_free(codec);
6849 return err;
6850 }
6851
df694daa 6852 if (board_config != ALC260_AUTO)
e9c364c0 6853 setup_preset(codec, &alc260_presets[board_config]);
1da177e4 6854
1da177e4
LT
6855 spec->stream_analog_playback = &alc260_pcm_analog_playback;
6856 spec->stream_analog_capture = &alc260_pcm_analog_capture;
6857
a3bcba38
TI
6858 spec->stream_digital_playback = &alc260_pcm_digital_playback;
6859 spec->stream_digital_capture = &alc260_pcm_digital_capture;
6860
4ef0ef19
TI
6861 if (!spec->adc_nids && spec->input_mux) {
6862 /* check whether NID 0x04 is valid */
6863 unsigned int wcap = get_wcaps(codec, 0x04);
a22d543a 6864 wcap = get_wcaps_type(wcap);
4ef0ef19
TI
6865 /* get type */
6866 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
6867 spec->adc_nids = alc260_adc_nids_alt;
6868 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
6869 } else {
6870 spec->adc_nids = alc260_adc_nids;
6871 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
6872 }
6873 }
b59bdf3b 6874 set_capture_mixer(codec);
45bdd1c1 6875 set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
f9e336f6 6876
2134ea4f
TI
6877 spec->vmaster_nid = 0x08;
6878
1da177e4 6879 codec->patch_ops = alc_patch_ops;
df694daa 6880 if (board_config == ALC260_AUTO)
ae6b813a 6881 spec->init_hook = alc260_auto_init;
cb53c626
TI
6882#ifdef CONFIG_SND_HDA_POWER_SAVE
6883 if (!spec->loopback.amplist)
6884 spec->loopback.amplist = alc260_loopbacks;
6885#endif
1da177e4
LT
6886
6887 return 0;
6888}
6889
e9edcee0 6890
1da177e4 6891/*
4953550a 6892 * ALC882/883/885/888/889 support
1da177e4
LT
6893 *
6894 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
6895 * configuration. Each pin widget can choose any input DACs and a mixer.
6896 * Each ADC is connected from a mixer of all inputs. This makes possible
6897 * 6-channel independent captures.
6898 *
6899 * In addition, an independent DAC for the multi-playback (not used in this
6900 * driver yet).
6901 */
df694daa
KY
6902#define ALC882_DIGOUT_NID 0x06
6903#define ALC882_DIGIN_NID 0x0a
4953550a
TI
6904#define ALC883_DIGOUT_NID ALC882_DIGOUT_NID
6905#define ALC883_DIGIN_NID ALC882_DIGIN_NID
6906#define ALC1200_DIGOUT_NID 0x10
6907
1da177e4 6908
d2a6d7dc 6909static struct hda_channel_mode alc882_ch_modes[1] = {
1da177e4
LT
6910 { 8, NULL }
6911};
6912
4953550a 6913/* DACs */
1da177e4
LT
6914static hda_nid_t alc882_dac_nids[4] = {
6915 /* front, rear, clfe, rear_surr */
6916 0x02, 0x03, 0x04, 0x05
6917};
4953550a 6918#define alc883_dac_nids alc882_dac_nids
1da177e4 6919
4953550a 6920/* ADCs */
df694daa
KY
6921#define alc882_adc_nids alc880_adc_nids
6922#define alc882_adc_nids_alt alc880_adc_nids_alt
4953550a
TI
6923#define alc883_adc_nids alc882_adc_nids_alt
6924static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
6925static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
6926#define alc889_adc_nids alc880_adc_nids
1da177e4 6927
e1406348
TI
6928static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
6929static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
4953550a
TI
6930#define alc883_capsrc_nids alc882_capsrc_nids_alt
6931static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
6932#define alc889_capsrc_nids alc882_capsrc_nids
e1406348 6933
1da177e4
LT
6934/* input MUX */
6935/* FIXME: should be a matrix-type input source selection */
6936
6937static struct hda_input_mux alc882_capture_source = {
6938 .num_items = 4,
6939 .items = {
6940 { "Mic", 0x0 },
6941 { "Front Mic", 0x1 },
6942 { "Line", 0x2 },
6943 { "CD", 0x4 },
6944 },
6945};
41d5545d 6946
4953550a
TI
6947#define alc883_capture_source alc882_capture_source
6948
87a8c370
JK
6949static struct hda_input_mux alc889_capture_source = {
6950 .num_items = 3,
6951 .items = {
6952 { "Front Mic", 0x0 },
6953 { "Mic", 0x3 },
6954 { "Line", 0x2 },
6955 },
6956};
6957
41d5545d
KS
6958static struct hda_input_mux mb5_capture_source = {
6959 .num_items = 3,
6960 .items = {
6961 { "Mic", 0x1 },
b8f171e7 6962 { "Line", 0x7 },
41d5545d
KS
6963 { "CD", 0x4 },
6964 },
6965};
6966
e458b1fa
LY
6967static struct hda_input_mux macmini3_capture_source = {
6968 .num_items = 2,
6969 .items = {
6970 { "Line", 0x2 },
6971 { "CD", 0x4 },
6972 },
6973};
6974
4953550a
TI
6975static struct hda_input_mux alc883_3stack_6ch_intel = {
6976 .num_items = 4,
6977 .items = {
6978 { "Mic", 0x1 },
6979 { "Front Mic", 0x0 },
6980 { "Line", 0x2 },
6981 { "CD", 0x4 },
6982 },
6983};
6984
6985static struct hda_input_mux alc883_lenovo_101e_capture_source = {
6986 .num_items = 2,
6987 .items = {
6988 { "Mic", 0x1 },
6989 { "Line", 0x2 },
6990 },
6991};
6992
6993static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
6994 .num_items = 4,
6995 .items = {
6996 { "Mic", 0x0 },
6997 { "iMic", 0x1 },
6998 { "Line", 0x2 },
6999 { "CD", 0x4 },
7000 },
7001};
7002
7003static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
7004 .num_items = 2,
7005 .items = {
7006 { "Mic", 0x0 },
7007 { "Int Mic", 0x1 },
7008 },
7009};
7010
7011static struct hda_input_mux alc883_lenovo_sky_capture_source = {
7012 .num_items = 3,
7013 .items = {
7014 { "Mic", 0x0 },
7015 { "Front Mic", 0x1 },
7016 { "Line", 0x4 },
7017 },
7018};
7019
7020static struct hda_input_mux alc883_asus_eee1601_capture_source = {
7021 .num_items = 2,
7022 .items = {
7023 { "Mic", 0x0 },
7024 { "Line", 0x2 },
7025 },
7026};
7027
7028static struct hda_input_mux alc889A_mb31_capture_source = {
7029 .num_items = 2,
7030 .items = {
7031 { "Mic", 0x0 },
7032 /* Front Mic (0x01) unused */
7033 { "Line", 0x2 },
7034 /* Line 2 (0x03) unused */
af901ca1 7035 /* CD (0x04) unused? */
4953550a
TI
7036 },
7037};
7038
b7cccc52
JM
7039static struct hda_input_mux alc889A_imac91_capture_source = {
7040 .num_items = 2,
7041 .items = {
7042 { "Mic", 0x01 },
7043 { "Line", 0x2 }, /* Not sure! */
7044 },
7045};
7046
4953550a
TI
7047/*
7048 * 2ch mode
7049 */
7050static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
7051 { 2, NULL }
7052};
7053
272a527c
KY
7054/*
7055 * 2ch mode
7056 */
7057static struct hda_verb alc882_3ST_ch2_init[] = {
7058 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7059 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7060 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7061 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7062 { } /* end */
7063};
7064
4953550a
TI
7065/*
7066 * 4ch mode
7067 */
7068static struct hda_verb alc882_3ST_ch4_init[] = {
7069 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7070 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7071 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7072 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7073 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7074 { } /* end */
7075};
7076
272a527c
KY
7077/*
7078 * 6ch mode
7079 */
7080static struct hda_verb alc882_3ST_ch6_init[] = {
7081 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7082 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7083 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7084 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7085 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7086 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7087 { } /* end */
7088};
7089
4953550a 7090static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
272a527c 7091 { 2, alc882_3ST_ch2_init },
4953550a 7092 { 4, alc882_3ST_ch4_init },
272a527c
KY
7093 { 6, alc882_3ST_ch6_init },
7094};
7095
4953550a
TI
7096#define alc883_3ST_6ch_modes alc882_3ST_6ch_modes
7097
a65cc60f 7098/*
7099 * 2ch mode
7100 */
7101static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
7102 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
7103 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7104 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7105 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7106 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7107 { } /* end */
7108};
7109
7110/*
7111 * 4ch mode
7112 */
7113static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
7114 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7115 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7116 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7117 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7118 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7119 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7120 { } /* end */
7121};
7122
7123/*
7124 * 6ch mode
7125 */
7126static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
7127 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7128 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7129 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7130 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7131 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7132 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7133 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7134 { } /* end */
7135};
7136
7137static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
7138 { 2, alc883_3ST_ch2_clevo_init },
7139 { 4, alc883_3ST_ch4_clevo_init },
7140 { 6, alc883_3ST_ch6_clevo_init },
7141};
7142
7143
df694daa
KY
7144/*
7145 * 6ch mode
7146 */
7147static struct hda_verb alc882_sixstack_ch6_init[] = {
7148 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7149 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7150 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7151 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7152 { } /* end */
7153};
7154
7155/*
7156 * 8ch mode
7157 */
7158static struct hda_verb alc882_sixstack_ch8_init[] = {
7159 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7160 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7161 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7162 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7163 { } /* end */
7164};
7165
7166static struct hda_channel_mode alc882_sixstack_modes[2] = {
7167 { 6, alc882_sixstack_ch6_init },
7168 { 8, alc882_sixstack_ch8_init },
7169};
7170
76e6f5a9
RH
7171
7172/* Macbook Air 2,1 */
7173
7174static struct hda_channel_mode alc885_mba21_ch_modes[1] = {
7175 { 2, NULL },
7176};
7177
87350ad0 7178/*
def319f9 7179 * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
87350ad0
TI
7180 */
7181
7182/*
7183 * 2ch mode
7184 */
7185static struct hda_verb alc885_mbp_ch2_init[] = {
7186 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7187 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7188 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7189 { } /* end */
7190};
7191
7192/*
a3f730af 7193 * 4ch mode
87350ad0 7194 */
a3f730af 7195static struct hda_verb alc885_mbp_ch4_init[] = {
87350ad0
TI
7196 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7197 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7198 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7199 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7200 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7201 { } /* end */
7202};
7203
a3f730af 7204static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
87350ad0 7205 { 2, alc885_mbp_ch2_init },
a3f730af 7206 { 4, alc885_mbp_ch4_init },
87350ad0
TI
7207};
7208
92b9de83
KS
7209/*
7210 * 2ch
7211 * Speakers/Woofer/HP = Front
7212 * LineIn = Input
7213 */
7214static struct hda_verb alc885_mb5_ch2_init[] = {
7215 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7216 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7217 { } /* end */
7218};
7219
7220/*
7221 * 6ch mode
7222 * Speakers/HP = Front
7223 * Woofer = LFE
7224 * LineIn = Surround
7225 */
7226static struct hda_verb alc885_mb5_ch6_init[] = {
7227 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7228 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7229 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7230 { } /* end */
7231};
7232
7233static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
7234 { 2, alc885_mb5_ch2_init },
7235 { 6, alc885_mb5_ch6_init },
7236};
87350ad0 7237
d01aecdf 7238#define alc885_macmini3_6ch_modes alc885_mb5_6ch_modes
4953550a
TI
7239
7240/*
7241 * 2ch mode
7242 */
7243static struct hda_verb alc883_4ST_ch2_init[] = {
7244 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7245 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7246 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7247 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7248 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7249 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7250 { } /* end */
7251};
7252
7253/*
7254 * 4ch mode
7255 */
7256static struct hda_verb alc883_4ST_ch4_init[] = {
7257 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7258 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7259 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7260 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7261 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7262 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7263 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7264 { } /* end */
7265};
7266
7267/*
7268 * 6ch mode
7269 */
7270static struct hda_verb alc883_4ST_ch6_init[] = {
7271 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7272 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7273 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7274 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7275 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7276 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7277 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7278 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7279 { } /* end */
7280};
7281
7282/*
7283 * 8ch mode
7284 */
7285static struct hda_verb alc883_4ST_ch8_init[] = {
7286 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7287 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7288 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7289 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7290 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7291 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7292 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7293 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7294 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7295 { } /* end */
7296};
7297
7298static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
7299 { 2, alc883_4ST_ch2_init },
7300 { 4, alc883_4ST_ch4_init },
7301 { 6, alc883_4ST_ch6_init },
7302 { 8, alc883_4ST_ch8_init },
7303};
7304
7305
7306/*
7307 * 2ch mode
7308 */
7309static struct hda_verb alc883_3ST_ch2_intel_init[] = {
7310 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7311 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7312 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7313 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7314 { } /* end */
7315};
7316
7317/*
7318 * 4ch mode
7319 */
7320static struct hda_verb alc883_3ST_ch4_intel_init[] = {
7321 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7322 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7323 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7324 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7325 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7326 { } /* end */
7327};
7328
7329/*
7330 * 6ch mode
7331 */
7332static struct hda_verb alc883_3ST_ch6_intel_init[] = {
7333 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7334 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7335 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
7336 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7337 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7338 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7339 { } /* end */
7340};
7341
7342static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
7343 { 2, alc883_3ST_ch2_intel_init },
7344 { 4, alc883_3ST_ch4_intel_init },
7345 { 6, alc883_3ST_ch6_intel_init },
7346};
7347
dd7714c9
WF
7348/*
7349 * 2ch mode
7350 */
7351static struct hda_verb alc889_ch2_intel_init[] = {
7352 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7353 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
7354 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
7355 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
7356 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7357 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7358 { } /* end */
7359};
7360
87a8c370
JK
7361/*
7362 * 6ch mode
7363 */
7364static struct hda_verb alc889_ch6_intel_init[] = {
dd7714c9
WF
7365 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7366 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7367 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7368 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7369 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
87a8c370
JK
7370 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7371 { } /* end */
7372};
7373
7374/*
7375 * 8ch mode
7376 */
7377static struct hda_verb alc889_ch8_intel_init[] = {
dd7714c9
WF
7378 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7379 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7380 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7381 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7382 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
87a8c370
JK
7383 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7384 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
87a8c370
JK
7385 { } /* end */
7386};
7387
dd7714c9
WF
7388static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7389 { 2, alc889_ch2_intel_init },
87a8c370
JK
7390 { 6, alc889_ch6_intel_init },
7391 { 8, alc889_ch8_intel_init },
7392};
7393
4953550a
TI
7394/*
7395 * 6ch mode
7396 */
7397static struct hda_verb alc883_sixstack_ch6_init[] = {
7398 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7399 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7400 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7401 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7402 { } /* end */
7403};
7404
7405/*
7406 * 8ch mode
7407 */
7408static struct hda_verb alc883_sixstack_ch8_init[] = {
7409 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7410 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7411 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7412 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7413 { } /* end */
7414};
7415
7416static struct hda_channel_mode alc883_sixstack_modes[2] = {
7417 { 6, alc883_sixstack_ch6_init },
7418 { 8, alc883_sixstack_ch8_init },
7419};
7420
7421
1da177e4
LT
7422/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
7423 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
7424 */
c8b6bf9b 7425static struct snd_kcontrol_new alc882_base_mixer[] = {
05acb863 7426 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
985be54b 7427 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
05acb863 7428 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
985be54b 7429 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
05acb863
TI
7430 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7431 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
985be54b
TI
7432 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7433 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
05acb863 7434 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
985be54b 7435 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1da177e4
LT
7436 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7437 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7438 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7439 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7440 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7441 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 7442 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1da177e4
LT
7443 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7444 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
32360416 7445 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
1da177e4 7446 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
1da177e4
LT
7447 { } /* end */
7448};
7449
76e6f5a9
RH
7450/* Macbook Air 2,1 same control for HP and internal Speaker */
7451
7452static struct snd_kcontrol_new alc885_mba21_mixer[] = {
7453 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7454 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
7455 { }
7456};
7457
7458
87350ad0 7459static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
a3f730af
TI
7460 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7461 HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7462 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7463 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7464 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
2134ea4f
TI
7465 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7466 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
87350ad0
TI
7467 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7468 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
2134ea4f 7469 HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
87350ad0
TI
7470 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7471 { } /* end */
7472};
41d5545d
KS
7473
7474static struct snd_kcontrol_new alc885_mb5_mixer[] = {
92b9de83
KS
7475 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7476 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7477 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7478 HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7479 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7480 HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
a76221d4
AM
7481 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7482 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
b8f171e7
AM
7483 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
7484 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
41d5545d
KS
7485 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7486 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7487 HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7488 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7489 { } /* end */
7490};
92b9de83 7491
e458b1fa
LY
7492static struct snd_kcontrol_new alc885_macmini3_mixer[] = {
7493 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7494 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7495 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7496 HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7497 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7498 HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7499 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7500 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7501 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
7502 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
7503 HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7504 { } /* end */
7505};
7506
4b7e1803 7507static struct snd_kcontrol_new alc885_imac91_mixer[] = {
b7cccc52
JM
7508 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7509 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
4b7e1803
JM
7510 { } /* end */
7511};
7512
7513
bdd148a3
KY
7514static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7515 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7516 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7517 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7518 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7519 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7520 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7521 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7522 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7523 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
bdd148a3
KY
7524 { } /* end */
7525};
7526
272a527c
KY
7527static struct snd_kcontrol_new alc882_targa_mixer[] = {
7528 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7529 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7530 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7531 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7532 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7533 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7534 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7535 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7536 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
96fe7cc8 7537 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
272a527c
KY
7538 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7539 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
96fe7cc8 7540 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
272a527c
KY
7541 { } /* end */
7542};
7543
7544/* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7545 * Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7546 */
7547static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7548 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7549 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7550 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7551 HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7552 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7553 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7554 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7555 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7556 HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7557 HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7558 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7559 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
96fe7cc8 7560 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
272a527c
KY
7561 { } /* end */
7562};
7563
914759b7
TI
7564static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7565 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7566 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7567 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7568 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7569 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7570 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7571 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7572 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7573 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7574 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
914759b7
TI
7575 { } /* end */
7576};
7577
df694daa
KY
7578static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7579 {
7580 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7581 .name = "Channel Mode",
7582 .info = alc_ch_mode_info,
7583 .get = alc_ch_mode_get,
7584 .put = alc_ch_mode_put,
7585 },
7586 { } /* end */
7587};
7588
4953550a 7589static struct hda_verb alc882_base_init_verbs[] = {
1da177e4 7590 /* Front mixer: unmute input/output amp left and right (volume = 0) */
05acb863
TI
7591 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7592 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4 7593 /* Rear mixer */
05acb863
TI
7594 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7595 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4 7596 /* CLFE mixer */
05acb863
TI
7597 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7598 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4 7599 /* Side mixer */
05acb863
TI
7600 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7601 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1da177e4 7602
e9edcee0 7603 /* Front Pin: output 0 (0x0c) */
05acb863 7604 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
05acb863 7605 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 7606 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
e9edcee0 7607 /* Rear Pin: output 1 (0x0d) */
05acb863 7608 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
05acb863 7609 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 7610 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
e9edcee0 7611 /* CLFE Pin: output 2 (0x0e) */
05acb863 7612 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
05acb863 7613 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 7614 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
e9edcee0 7615 /* Side Pin: output 3 (0x0f) */
05acb863 7616 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
05acb863 7617 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1da177e4 7618 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
e9edcee0 7619 /* Mic (rear) pin: input vref at 80% */
16ded525 7620 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0
TI
7621 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7622 /* Front Mic pin: input vref at 80% */
16ded525 7623 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
e9edcee0
TI
7624 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7625 /* Line In pin: input */
05acb863 7626 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
e9edcee0
TI
7627 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7628 /* Line-2 In: Headphone output (output 0 - 0x0c) */
7629 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7630 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7631 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1da177e4 7632 /* CD pin widget for input */
05acb863 7633 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1da177e4
LT
7634
7635 /* FIXME: use matrix-type input source selection */
7636 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
1da177e4 7637 /* Input mixer2 */
05acb863 7638 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1da177e4 7639 /* Input mixer3 */
05acb863 7640 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
05acb863
TI
7641 /* ADC2: mute amp left and right */
7642 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
71fe7b82 7643 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
05acb863
TI
7644 /* ADC3: mute amp left and right */
7645 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
71fe7b82 7646 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
1da177e4
LT
7647
7648 { }
7649};
7650
4953550a
TI
7651static struct hda_verb alc882_adc1_init_verbs[] = {
7652 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7653 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7654 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7655 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7656 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7657 /* ADC1: mute amp left and right */
7658 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7659 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7660 { }
7661};
7662
4b146cb0
TI
7663static struct hda_verb alc882_eapd_verbs[] = {
7664 /* change to EAPD mode */
7665 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
b373bdeb 7666 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
f12ab1e0 7667 { }
4b146cb0
TI
7668};
7669
87a8c370
JK
7670static struct hda_verb alc889_eapd_verbs[] = {
7671 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7672 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7673 { }
7674};
7675
6732bd0d
WF
7676static struct hda_verb alc_hp15_unsol_verbs[] = {
7677 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7678 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7679 {}
7680};
87a8c370
JK
7681
7682static struct hda_verb alc885_init_verbs[] = {
7683 /* Front mixer: unmute input/output amp left and right (volume = 0) */
88102f3f
KY
7684 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7685 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
87a8c370 7686 /* Rear mixer */
88102f3f
KY
7687 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7688 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
87a8c370 7689 /* CLFE mixer */
88102f3f
KY
7690 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7691 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
87a8c370 7692 /* Side mixer */
88102f3f
KY
7693 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7694 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
87a8c370
JK
7695
7696 /* Front HP Pin: output 0 (0x0c) */
6732bd0d 7697 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
87a8c370
JK
7698 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7699 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7700 /* Front Pin: output 0 (0x0c) */
7701 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7702 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7703 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7704 /* Rear Pin: output 1 (0x0d) */
7705 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7706 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7707 {0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
7708 /* CLFE Pin: output 2 (0x0e) */
7709 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7710 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7711 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7712 /* Side Pin: output 3 (0x0f) */
7713 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7714 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7715 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7716 /* Mic (rear) pin: input vref at 80% */
7717 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7718 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7719 /* Front Mic pin: input vref at 80% */
7720 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7721 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7722 /* Line In pin: input */
7723 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7724 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7725
7726 /* Mixer elements: 0x18, , 0x1a, 0x1b */
7727 /* Input mixer1 */
88102f3f 7728 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
87a8c370
JK
7729 /* Input mixer2 */
7730 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
87a8c370 7731 /* Input mixer3 */
88102f3f 7732 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
87a8c370
JK
7733 /* ADC2: mute amp left and right */
7734 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7735 /* ADC3: mute amp left and right */
7736 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7737
7738 { }
7739};
7740
7741static struct hda_verb alc885_init_input_verbs[] = {
7742 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7743 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7744 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7745 { }
7746};
7747
7748
7749/* Unmute Selector 24h and set the default input to front mic */
7750static struct hda_verb alc889_init_input_verbs[] = {
7751 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
7752 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7753 { }
7754};
7755
7756
4953550a
TI
7757#define alc883_init_verbs alc882_base_init_verbs
7758
9102cd1c
TD
7759/* Mac Pro test */
7760static struct snd_kcontrol_new alc882_macpro_mixer[] = {
7761 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7762 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7763 HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
7764 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
7765 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
45bdd1c1 7766 /* FIXME: this looks suspicious...
d355c82a
JK
7767 HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
7768 HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
45bdd1c1 7769 */
9102cd1c
TD
7770 { } /* end */
7771};
7772
7773static struct hda_verb alc882_macpro_init_verbs[] = {
7774 /* Front mixer: unmute input/output amp left and right (volume = 0) */
7775 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7776 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7777 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7778 /* Front Pin: output 0 (0x0c) */
7779 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7780 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7781 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7782 /* Front Mic pin: input vref at 80% */
7783 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7784 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7785 /* Speaker: output */
7786 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7787 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7788 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
7789 /* Headphone output (output 0 - 0x0c) */
7790 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7791 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7792 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7793
7794 /* FIXME: use matrix-type input source selection */
7795 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7796 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7797 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7798 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7799 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7800 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7801 /* Input mixer2 */
7802 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7803 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7804 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7805 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7806 /* Input mixer3 */
7807 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7808 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7809 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7810 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7811 /* ADC1: mute amp left and right */
7812 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7813 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7814 /* ADC2: mute amp left and right */
7815 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7816 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7817 /* ADC3: mute amp left and right */
7818 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7819 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7820
7821 { }
7822};
f12ab1e0 7823
41d5545d
KS
7824/* Macbook 5,1 */
7825static struct hda_verb alc885_mb5_init_verbs[] = {
92b9de83
KS
7826 /* DACs */
7827 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7828 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7829 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7830 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
41d5545d 7831 /* Front mixer */
41d5545d
KS
7832 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7833 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7834 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
92b9de83
KS
7835 /* Surround mixer */
7836 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7837 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7838 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7839 /* LFE mixer */
7840 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7841 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7842 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7843 /* HP mixer */
7844 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7845 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7846 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7847 /* Front Pin (0x0c) */
41d5545d
KS
7848 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7849 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
92b9de83
KS
7850 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7851 /* LFE Pin (0x0e) */
7852 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7853 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7854 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7855 /* HP Pin (0x0f) */
41d5545d
KS
7856 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7857 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
92b9de83 7858 {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
a76221d4 7859 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
41d5545d
KS
7860 /* Front Mic pin: input vref at 80% */
7861 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7862 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7863 /* Line In pin */
7864 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7865 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7866
b8f171e7
AM
7867 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0x1)},
7868 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x7)},
7869 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x4)},
41d5545d
KS
7870 { }
7871};
7872
e458b1fa
LY
7873/* Macmini 3,1 */
7874static struct hda_verb alc885_macmini3_init_verbs[] = {
7875 /* DACs */
7876 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7877 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7878 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7879 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7880 /* Front mixer */
7881 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7882 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7883 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7884 /* Surround mixer */
7885 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7886 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7887 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7888 /* LFE mixer */
7889 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7890 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7891 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7892 /* HP mixer */
7893 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7894 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7895 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7896 /* Front Pin (0x0c) */
7897 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7898 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7899 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7900 /* LFE Pin (0x0e) */
7901 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7902 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7903 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7904 /* HP Pin (0x0f) */
7905 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7906 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7907 {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7908 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7909 /* Line In pin */
7910 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7911 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7912
7913 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7914 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7915 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7916 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7917 { }
7918};
7919
76e6f5a9
RH
7920
7921static struct hda_verb alc885_mba21_init_verbs[] = {
7922 /*Internal and HP Speaker Mixer*/
7923 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7924 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7925 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7926 /*Internal Speaker Pin (0x0c)*/
7927 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
7928 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7929 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7930 /* HP Pin: output 0 (0x0e) */
7931 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7932 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7933 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7934 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
7935 /* Line in (is hp when jack connected)*/
7936 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
7937 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7938
7939 { }
7940 };
7941
7942
87350ad0
TI
7943/* Macbook Pro rev3 */
7944static struct hda_verb alc885_mbp3_init_verbs[] = {
7945 /* Front mixer: unmute input/output amp left and right (volume = 0) */
7946 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7947 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7948 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7949 /* Rear mixer */
7950 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7951 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7952 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
a3f730af
TI
7953 /* HP mixer */
7954 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7955 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7956 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
87350ad0
TI
7957 /* Front Pin: output 0 (0x0c) */
7958 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7959 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7960 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
a3f730af 7961 /* HP Pin: output 0 (0x0e) */
87350ad0 7962 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
a3f730af
TI
7963 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7964 {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
87350ad0
TI
7965 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7966 /* Mic (rear) pin: input vref at 80% */
7967 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7968 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7969 /* Front Mic pin: input vref at 80% */
7970 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7971 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7972 /* Line In pin: use output 1 when in LineOut mode */
7973 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7974 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7975 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7976
7977 /* FIXME: use matrix-type input source selection */
7978 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7979 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7980 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7981 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7982 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7983 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7984 /* Input mixer2 */
7985 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7986 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7987 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7988 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7989 /* Input mixer3 */
7990 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7991 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7992 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7993 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7994 /* ADC1: mute amp left and right */
7995 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7996 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7997 /* ADC2: mute amp left and right */
7998 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7999 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8000 /* ADC3: mute amp left and right */
8001 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8002 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8003
8004 { }
8005};
8006
4b7e1803
JM
8007/* iMac 9,1 */
8008static struct hda_verb alc885_imac91_init_verbs[] = {
b7cccc52
JM
8009 /* Internal Speaker Pin (0x0c) */
8010 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8011 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8012 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8013 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8014 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8015 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8016 /* HP Pin: Rear */
4b7e1803
JM
8017 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8018 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8019 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
b7cccc52
JM
8020 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
8021 /* Line in Rear */
8022 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
4b7e1803 8023 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4b7e1803
JM
8024 /* Front Mic pin: input vref at 80% */
8025 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8026 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
b7cccc52
JM
8027 /* Rear mixer */
8028 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8029 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8030 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8031 /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
8032 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8033 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8034 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8035 /* 0x24 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
4b7e1803
JM
8036 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8037 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8038 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8039 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
b7cccc52 8040 /* 0x23 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
4b7e1803
JM
8041 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8042 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8043 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8044 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
b7cccc52 8045 /* 0x22 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
4b7e1803
JM
8046 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8047 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8048 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8049 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
b7cccc52 8050 /* 0x07 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
4b7e1803
JM
8051 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8052 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
b7cccc52 8053 /* 0x08 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
4b7e1803
JM
8054 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8055 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
b7cccc52 8056 /* 0x09 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
4b7e1803
JM
8057 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8058 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
4b7e1803
JM
8059 { }
8060};
8061
c54728d8
NF
8062/* iMac 24 mixer. */
8063static struct snd_kcontrol_new alc885_imac24_mixer[] = {
8064 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8065 HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
8066 { } /* end */
8067};
8068
8069/* iMac 24 init verbs. */
8070static struct hda_verb alc885_imac24_init_verbs[] = {
8071 /* Internal speakers: output 0 (0x0c) */
8072 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8073 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8074 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8075 /* Internal speakers: output 0 (0x0c) */
8076 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8077 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8078 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8079 /* Headphone: output 0 (0x0c) */
8080 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8081 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8082 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8083 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8084 /* Front Mic: input vref at 80% */
8085 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8086 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8087 { }
8088};
8089
8090/* Toggle speaker-output according to the hp-jack state */
4f5d1706 8091static void alc885_imac24_setup(struct hda_codec *codec)
c54728d8 8092{
a9fd4f3f 8093 struct alc_spec *spec = codec->spec;
c54728d8 8094
a9fd4f3f
TI
8095 spec->autocfg.hp_pins[0] = 0x14;
8096 spec->autocfg.speaker_pins[0] = 0x18;
8097 spec->autocfg.speaker_pins[1] = 0x1a;
c54728d8
NF
8098}
8099
9d54f08b
TI
8100#define alc885_mb5_setup alc885_imac24_setup
8101#define alc885_macmini3_setup alc885_imac24_setup
8102
76e6f5a9
RH
8103/* Macbook Air 2,1 */
8104static void alc885_mba21_setup(struct hda_codec *codec)
8105{
8106 struct alc_spec *spec = codec->spec;
8107
8108 spec->autocfg.hp_pins[0] = 0x14;
8109 spec->autocfg.speaker_pins[0] = 0x18;
8110}
8111
8112
8113
4f5d1706 8114static void alc885_mbp3_setup(struct hda_codec *codec)
87350ad0 8115{
a9fd4f3f 8116 struct alc_spec *spec = codec->spec;
87350ad0 8117
a9fd4f3f
TI
8118 spec->autocfg.hp_pins[0] = 0x15;
8119 spec->autocfg.speaker_pins[0] = 0x14;
87350ad0
TI
8120}
8121
9d54f08b 8122static void alc885_imac91_setup(struct hda_codec *codec)
a76221d4 8123{
9d54f08b 8124 struct alc_spec *spec = codec->spec;
4b7e1803 8125
9d54f08b 8126 spec->autocfg.hp_pins[0] = 0x14;
b7cccc52 8127 spec->autocfg.speaker_pins[0] = 0x18;
9d54f08b 8128 spec->autocfg.speaker_pins[1] = 0x1a;
4b7e1803 8129}
87350ad0 8130
272a527c
KY
8131static struct hda_verb alc882_targa_verbs[] = {
8132 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8133 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8134
8135 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8136 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
ea1fb29a 8137
272a527c
KY
8138 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8139 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8140 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8141
8142 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
272a527c
KY
8143 { } /* end */
8144};
8145
8146/* toggle speaker-output according to the hp-jack state */
8147static void alc882_targa_automute(struct hda_codec *codec)
8148{
a9fd4f3f
TI
8149 struct alc_spec *spec = codec->spec;
8150 alc_automute_amp(codec);
82beb8fd 8151 snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
a9fd4f3f
TI
8152 spec->jack_present ? 1 : 3);
8153}
8154
4f5d1706 8155static void alc882_targa_setup(struct hda_codec *codec)
a9fd4f3f
TI
8156{
8157 struct alc_spec *spec = codec->spec;
8158
8159 spec->autocfg.hp_pins[0] = 0x14;
8160 spec->autocfg.speaker_pins[0] = 0x1b;
272a527c
KY
8161}
8162
8163static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
8164{
a9fd4f3f 8165 if ((res >> 26) == ALC880_HP_EVENT)
272a527c 8166 alc882_targa_automute(codec);
272a527c
KY
8167}
8168
8169static struct hda_verb alc882_asus_a7j_verbs[] = {
8170 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8171 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8172
8173 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8174 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8175 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
ea1fb29a 8176
272a527c
KY
8177 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8178 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8179 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8180
8181 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8182 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8183 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8184 { } /* end */
8185};
8186
914759b7
TI
8187static struct hda_verb alc882_asus_a7m_verbs[] = {
8188 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8189 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8190
8191 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8192 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8193 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
ea1fb29a 8194
914759b7
TI
8195 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8196 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8197 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8198
8199 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8200 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8201 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8202 { } /* end */
8203};
8204
9102cd1c
TD
8205static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
8206{
8207 unsigned int gpiostate, gpiomask, gpiodir;
8208
8209 gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
8210 AC_VERB_GET_GPIO_DATA, 0);
8211
8212 if (!muted)
8213 gpiostate |= (1 << pin);
8214 else
8215 gpiostate &= ~(1 << pin);
8216
8217 gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
8218 AC_VERB_GET_GPIO_MASK, 0);
8219 gpiomask |= (1 << pin);
8220
8221 gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
8222 AC_VERB_GET_GPIO_DIRECTION, 0);
8223 gpiodir |= (1 << pin);
8224
8225
8226 snd_hda_codec_write(codec, codec->afg, 0,
8227 AC_VERB_SET_GPIO_MASK, gpiomask);
8228 snd_hda_codec_write(codec, codec->afg, 0,
8229 AC_VERB_SET_GPIO_DIRECTION, gpiodir);
8230
8231 msleep(1);
8232
8233 snd_hda_codec_write(codec, codec->afg, 0,
8234 AC_VERB_SET_GPIO_DATA, gpiostate);
8235}
8236
7debbe51
TI
8237/* set up GPIO at initialization */
8238static void alc885_macpro_init_hook(struct hda_codec *codec)
8239{
8240 alc882_gpio_mute(codec, 0, 0);
8241 alc882_gpio_mute(codec, 1, 0);
8242}
8243
8244/* set up GPIO and update auto-muting at initialization */
8245static void alc885_imac24_init_hook(struct hda_codec *codec)
8246{
8247 alc885_macpro_init_hook(codec);
4f5d1706 8248 alc_automute_amp(codec);
7debbe51
TI
8249}
8250
df694daa
KY
8251/*
8252 * generic initialization of ADC, input mixers and output mixers
8253 */
4953550a 8254static struct hda_verb alc883_auto_init_verbs[] = {
df694daa
KY
8255 /*
8256 * Unmute ADC0-2 and set the default input to mic-in
8257 */
4953550a
TI
8258 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8259 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8260 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8261 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17bba1b7 8262
4953550a
TI
8263 /*
8264 * Set up output mixers (0x0c - 0x0f)
8265 */
8266 /* set vol=0 to output mixers */
8267 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8268 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8269 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8270 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8271 /* set up input amps for analog loopback */
8272 /* Amp Indices: DAC = 0, mixer = 1 */
8273 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8274 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8275 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8276 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8277 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8278 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8279 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8280 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8281 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8282 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9c7f852e 8283
4953550a
TI
8284 /* FIXME: use matrix-type input source selection */
8285 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8286 /* Input mixer2 */
88102f3f 8287 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4953550a 8288 /* Input mixer3 */
88102f3f 8289 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4953550a 8290 { }
9c7f852e
TI
8291};
8292
eb4c41d3
TS
8293/* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
8294static struct hda_verb alc889A_mb31_ch2_init[] = {
8295 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
8296 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8297 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
8298 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
8299 { } /* end */
8300};
8301
8302/* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
8303static struct hda_verb alc889A_mb31_ch4_init[] = {
8304 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
8305 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8306 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
8307 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8308 { } /* end */
8309};
8310
8311/* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
8312static struct hda_verb alc889A_mb31_ch5_init[] = {
8313 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as rear */
8314 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8315 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
8316 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
8317 { } /* end */
8318};
8319
8320/* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
8321static struct hda_verb alc889A_mb31_ch6_init[] = {
8322 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as front */
8323 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Subwoofer off */
8324 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
8325 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8326 { } /* end */
8327};
8328
8329static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
8330 { 2, alc889A_mb31_ch2_init },
8331 { 4, alc889A_mb31_ch4_init },
8332 { 5, alc889A_mb31_ch5_init },
8333 { 6, alc889A_mb31_ch6_init },
8334};
8335
b373bdeb
AN
8336static struct hda_verb alc883_medion_eapd_verbs[] = {
8337 /* eanable EAPD on medion laptop */
8338 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8339 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
8340 { }
8341};
8342
4953550a 8343#define alc883_base_mixer alc882_base_mixer
834be88d 8344
a8848bd6
AS
8345static struct snd_kcontrol_new alc883_mitac_mixer[] = {
8346 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8347 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8348 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8349 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8350 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8351 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8352 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8353 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8354 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8355 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8356 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8357 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8358 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
a8848bd6
AS
8359 { } /* end */
8360};
8361
0c4cc443 8362static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
368c7a95
J
8363 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8364 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8365 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8366 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8367 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8368 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8369 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8370 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8371 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8372 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
368c7a95
J
8373 { } /* end */
8374};
8375
fb97dc67
J
8376static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
8377 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8378 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8379 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8380 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8381 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8382 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8383 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8384 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8385 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8386 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
fb97dc67
J
8387 { } /* end */
8388};
8389
9c7f852e
TI
8390static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
8391 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8392 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8393 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8394 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8395 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8396 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8397 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8398 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 8399 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9c7f852e
TI
8400 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8401 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
32360416 8402 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
9c7f852e 8403 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
9c7f852e
TI
8404 { } /* end */
8405};
df694daa 8406
9c7f852e
TI
8407static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8408 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8409 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8410 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8411 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8412 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8413 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8414 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8415 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8416 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8417 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8418 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8419 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8420 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8421 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 8422 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9c7f852e
TI
8423 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8424 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
32360416 8425 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
9c7f852e 8426 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
9c7f852e
TI
8427 { } /* end */
8428};
8429
17bba1b7
J
8430static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8431 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8432 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8433 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8434 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8435 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8436 HDA_OUTPUT),
8437 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8438 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8439 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8440 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8441 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8442 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8443 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8444 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8445 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8446 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8447 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8448 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8449 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8450 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17bba1b7
J
8451 { } /* end */
8452};
8453
87a8c370
JK
8454static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8455 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8456 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8457 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8458 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8459 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8460 HDA_OUTPUT),
8461 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8462 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8463 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8464 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8465 HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
8466 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8467 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8468 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8469 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
8470 HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
8471 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
8472 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8473 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8474 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8475 { } /* end */
8476};
8477
d1d985f0 8478static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
c07584c8 8479 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
0701e064 8480 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
c07584c8 8481 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
0701e064 8482 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
c07584c8
TD
8483 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8484 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
0701e064
TI
8485 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8486 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
c07584c8
TD
8487 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8488 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8489 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8490 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8491 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8492 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 8493 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
c07584c8
TD
8494 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8495 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
32360416 8496 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
c07584c8 8497 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
c07584c8
TD
8498 { } /* end */
8499};
8500
c259249f 8501static struct snd_kcontrol_new alc883_targa_mixer[] = {
ccc656ce 8502 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
b99dba34 8503 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
ccc656ce 8504 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
b99dba34 8505 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
ccc656ce
KY
8506 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8507 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8508 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8509 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8510 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8511 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8512 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8513 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8514 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8515 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8516 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 8517 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
ccc656ce 8518 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
ccc656ce 8519 { } /* end */
f12ab1e0 8520};
ccc656ce 8521
c259249f 8522static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
ccc656ce 8523 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
b99dba34 8524 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
ccc656ce 8525 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
b99dba34 8526 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
ccc656ce
KY
8527 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8528 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8529 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
32360416 8530 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
ccc656ce 8531 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
4383fae0
J
8532 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8533 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8534 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
ccc656ce 8535 { } /* end */
f12ab1e0 8536};
ccc656ce 8537
b99dba34
TI
8538static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
8539 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8540 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8541 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8542 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8543 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8544 { } /* end */
8545};
8546
bc9f98a9
KY
8547static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
8548 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8549 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
86cd9298
TI
8550 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8551 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
bc9f98a9
KY
8552 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8553 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8554 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8555 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
bc9f98a9 8556 { } /* end */
f12ab1e0 8557};
bc9f98a9 8558
272a527c
KY
8559static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
8560 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8561 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
8562 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8563 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8564 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8565 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8566 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8567 HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8568 HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT),
272a527c
KY
8569 { } /* end */
8570};
8571
8572static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8573 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8574 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8575 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8576 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8577 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8578 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8579 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8580 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8581 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
272a527c 8582 { } /* end */
ea1fb29a 8583};
272a527c 8584
7ad7b218
MC
8585static struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = {
8586 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8587 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8588 HDA_CODEC_MUTE("Speaker Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8589 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT),
8590 HDA_CODEC_VOLUME("Line Playback Volume", 0x08, 0x0, HDA_INPUT),
8591 HDA_CODEC_MUTE("Line Playback Switch", 0x08, 0x0, HDA_INPUT),
8592 { } /* end */
8593};
8594
8595static struct hda_verb alc883_medion_wim2160_verbs[] = {
8596 /* Unmute front mixer */
8597 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8598 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8599
8600 /* Set speaker pin to front mixer */
8601 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8602
8603 /* Init headphone pin */
8604 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8605 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8606 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8607 {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8608
8609 { } /* end */
8610};
8611
8612/* toggle speaker-output according to the hp-jack state */
8613static void alc883_medion_wim2160_setup(struct hda_codec *codec)
8614{
8615 struct alc_spec *spec = codec->spec;
8616
8617 spec->autocfg.hp_pins[0] = 0x1a;
8618 spec->autocfg.speaker_pins[0] = 0x15;
8619}
8620
2880a867 8621static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
d1a991a6
KY
8622 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8623 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2880a867 8624 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2880a867
TD
8625 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8626 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
d1a991a6
KY
8627 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8628 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8629 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2880a867 8630 { } /* end */
d1a991a6 8631};
2880a867 8632
d2fd4b09
TV
8633static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8634 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
d2fd4b09 8635 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
684a8842
TV
8636 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8637 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
d2fd4b09
TV
8638 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8639 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8640 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8641 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8642 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8643 { } /* end */
8644};
8645
e2757d5e
KY
8646static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8647 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8648 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8649 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8650 HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8651 HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8652 0x0d, 1, 0x0, HDA_OUTPUT),
8653 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8654 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8655 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8656 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8657 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
e2757d5e
KY
8658 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8659 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8660 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8661 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8662 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8663 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8664 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8665 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8666 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8667 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
e2757d5e
KY
8668 { } /* end */
8669};
8670
eb4c41d3
TS
8671static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8672 /* Output mixers */
8673 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8674 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8675 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8676 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8677 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8678 HDA_OUTPUT),
8679 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8680 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8681 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8682 /* Output switches */
8683 HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8684 HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8685 HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8686 /* Boost mixers */
8687 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8688 HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8689 /* Input mixers */
8690 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8691 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8692 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8693 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8694 { } /* end */
8695};
8696
3e1647c5
GG
8697static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
8698 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8699 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8700 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8701 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8702 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8703 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8704 { } /* end */
8705};
8706
e2757d5e
KY
8707static struct hda_bind_ctls alc883_bind_cap_vol = {
8708 .ops = &snd_hda_bind_vol,
8709 .values = {
8710 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8711 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8712 0
8713 },
8714};
8715
8716static struct hda_bind_ctls alc883_bind_cap_switch = {
8717 .ops = &snd_hda_bind_sw,
8718 .values = {
8719 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8720 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8721 0
8722 },
8723};
8724
8725static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
8726 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8727 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8728 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8729 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8730 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8731 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
4953550a
TI
8732 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8733 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8734 { } /* end */
8735};
df694daa 8736
4953550a
TI
8737static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
8738 HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
8739 HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
8740 {
8741 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8742 /* .name = "Capture Source", */
8743 .name = "Input Source",
8744 .count = 1,
8745 .info = alc_mux_enum_info,
8746 .get = alc_mux_enum_get,
8747 .put = alc_mux_enum_put,
8748 },
8749 { } /* end */
8750};
9c7f852e 8751
4953550a
TI
8752static struct snd_kcontrol_new alc883_chmode_mixer[] = {
8753 {
8754 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8755 .name = "Channel Mode",
8756 .info = alc_ch_mode_info,
8757 .get = alc_ch_mode_get,
8758 .put = alc_ch_mode_put,
8759 },
8760 { } /* end */
9c7f852e
TI
8761};
8762
a8848bd6 8763/* toggle speaker-output according to the hp-jack state */
4f5d1706 8764static void alc883_mitac_setup(struct hda_codec *codec)
a8848bd6 8765{
a9fd4f3f 8766 struct alc_spec *spec = codec->spec;
a8848bd6 8767
a9fd4f3f
TI
8768 spec->autocfg.hp_pins[0] = 0x15;
8769 spec->autocfg.speaker_pins[0] = 0x14;
8770 spec->autocfg.speaker_pins[1] = 0x17;
a8848bd6
AS
8771}
8772
8773/* auto-toggle front mic */
8774/*
8775static void alc883_mitac_mic_automute(struct hda_codec *codec)
8776{
864f92be 8777 unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0;
a8848bd6 8778
a8848bd6
AS
8779 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
8780}
8781*/
8782
a8848bd6
AS
8783static struct hda_verb alc883_mitac_verbs[] = {
8784 /* HP */
8785 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8786 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8787 /* Subwoofer */
8788 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8789 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8790
8791 /* enable unsolicited event */
8792 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8793 /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
8794
8795 { } /* end */
8796};
8797
a65cc60f 8798static struct hda_verb alc883_clevo_m540r_verbs[] = {
8799 /* HP */
8800 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8801 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8802 /* Int speaker */
8803 /*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
8804
8805 /* enable unsolicited event */
8806 /*
8807 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8808 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8809 */
8810
8811 { } /* end */
8812};
8813
0c4cc443 8814static struct hda_verb alc883_clevo_m720_verbs[] = {
368c7a95
J
8815 /* HP */
8816 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8817 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8818 /* Int speaker */
8819 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
8820 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8821
8822 /* enable unsolicited event */
8823 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
0c4cc443 8824 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
368c7a95
J
8825
8826 { } /* end */
8827};
8828
fb97dc67
J
8829static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
8830 /* HP */
8831 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8832 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8833 /* Subwoofer */
8834 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
8835 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8836
8837 /* enable unsolicited event */
8838 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8839
8840 { } /* end */
8841};
8842
c259249f 8843static struct hda_verb alc883_targa_verbs[] = {
ccc656ce
KY
8844 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8845 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8846
8847 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8848 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
ea1fb29a 8849
64a8be74
DH
8850/* Connect Line-Out side jack (SPDIF) to Side */
8851 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8852 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8853 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8854/* Connect Mic jack to CLFE */
8855 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8856 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8857 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
8858/* Connect Line-in jack to Surround */
8859 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8860 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8861 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8862/* Connect HP out jack to Front */
8863 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8864 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8865 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
ccc656ce
KY
8866
8867 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
ccc656ce
KY
8868
8869 { } /* end */
8870};
8871
bc9f98a9
KY
8872static struct hda_verb alc883_lenovo_101e_verbs[] = {
8873 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8874 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
8875 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
8876 { } /* end */
8877};
8878
272a527c
KY
8879static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
8880 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8881 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8882 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8883 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8884 { } /* end */
8885};
8886
8887static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
8888 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8889 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8890 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8891 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
8892 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8893 { } /* end */
8894};
8895
189609ae
KY
8896static struct hda_verb alc883_haier_w66_verbs[] = {
8897 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8898 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8899
8900 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8901
8902 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8903 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8904 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8905 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8906 { } /* end */
8907};
8908
e2757d5e
KY
8909static struct hda_verb alc888_lenovo_sky_verbs[] = {
8910 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8911 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8912 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8913 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8914 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8915 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8916 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8917 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8918 { } /* end */
8919};
8920
8718b700
HRK
8921static struct hda_verb alc888_6st_dell_verbs[] = {
8922 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8923 { }
8924};
8925
3e1647c5
GG
8926static struct hda_verb alc883_vaiott_verbs[] = {
8927 /* HP */
8928 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8929 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8930
8931 /* enable unsolicited event */
8932 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8933
8934 { } /* end */
8935};
8936
4f5d1706 8937static void alc888_3st_hp_setup(struct hda_codec *codec)
8718b700 8938{
a9fd4f3f 8939 struct alc_spec *spec = codec->spec;
8718b700 8940
a9fd4f3f
TI
8941 spec->autocfg.hp_pins[0] = 0x1b;
8942 spec->autocfg.speaker_pins[0] = 0x14;
8943 spec->autocfg.speaker_pins[1] = 0x16;
8944 spec->autocfg.speaker_pins[2] = 0x18;
8718b700
HRK
8945}
8946
4723c022 8947static struct hda_verb alc888_3st_hp_verbs[] = {
8341de60 8948 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */
f32a19e3
HRK
8949 {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */
8950 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */
5795b9e6 8951 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8718b700 8952 { } /* end */
5795b9e6
CM
8953};
8954
3ea0d7cf
HRK
8955/*
8956 * 2ch mode
8957 */
4723c022 8958static struct hda_verb alc888_3st_hp_2ch_init[] = {
8341de60
CM
8959 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8960 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8961 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
8962 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
3ea0d7cf 8963 { } /* end */
8341de60
CM
8964};
8965
3ea0d7cf
HRK
8966/*
8967 * 4ch mode
8968 */
8969static struct hda_verb alc888_3st_hp_4ch_init[] = {
8970 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8971 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8972 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8973 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8974 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8975 { } /* end */
8976};
8977
8978/*
8979 * 6ch mode
8980 */
4723c022 8981static struct hda_verb alc888_3st_hp_6ch_init[] = {
8341de60
CM
8982 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8983 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
3ea0d7cf 8984 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
8341de60
CM
8985 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8986 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
3ea0d7cf
HRK
8987 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8988 { } /* end */
8341de60
CM
8989};
8990
3ea0d7cf 8991static struct hda_channel_mode alc888_3st_hp_modes[3] = {
4723c022 8992 { 2, alc888_3st_hp_2ch_init },
3ea0d7cf 8993 { 4, alc888_3st_hp_4ch_init },
4723c022 8994 { 6, alc888_3st_hp_6ch_init },
8341de60
CM
8995};
8996
272a527c
KY
8997/* toggle front-jack and RCA according to the hp-jack state */
8998static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
8999{
864f92be 9000 unsigned int present = snd_hda_jack_detect(codec, 0x1b);
ea1fb29a 9001
47fd830a
TI
9002 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9003 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9004 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9005 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
272a527c
KY
9006}
9007
9008/* toggle RCA according to the front-jack state */
9009static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
9010{
864f92be 9011 unsigned int present = snd_hda_jack_detect(codec, 0x14);
ea1fb29a 9012
47fd830a
TI
9013 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9014 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
272a527c 9015}
47fd830a 9016
272a527c
KY
9017static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
9018 unsigned int res)
9019{
9020 if ((res >> 26) == ALC880_HP_EVENT)
9021 alc888_lenovo_ms7195_front_automute(codec);
9022 if ((res >> 26) == ALC880_FRONT_EVENT)
9023 alc888_lenovo_ms7195_rca_automute(codec);
9024}
9025
9026static struct hda_verb alc883_medion_md2_verbs[] = {
9027 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9028 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9029
9030 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9031
9032 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9033 { } /* end */
9034};
9035
9036/* toggle speaker-output according to the hp-jack state */
4f5d1706 9037static void alc883_medion_md2_setup(struct hda_codec *codec)
272a527c 9038{
a9fd4f3f 9039 struct alc_spec *spec = codec->spec;
272a527c 9040
a9fd4f3f
TI
9041 spec->autocfg.hp_pins[0] = 0x14;
9042 spec->autocfg.speaker_pins[0] = 0x15;
272a527c
KY
9043}
9044
ccc656ce 9045/* toggle speaker-output according to the hp-jack state */
c259249f
SA
9046#define alc883_targa_init_hook alc882_targa_init_hook
9047#define alc883_targa_unsol_event alc882_targa_unsol_event
368c7a95 9048
0c4cc443
HRK
9049static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
9050{
9051 unsigned int present;
9052
d56757ab 9053 present = snd_hda_jack_detect(codec, 0x18);
0c4cc443
HRK
9054 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
9055 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9056}
9057
4f5d1706 9058static void alc883_clevo_m720_setup(struct hda_codec *codec)
0c4cc443 9059{
a9fd4f3f
TI
9060 struct alc_spec *spec = codec->spec;
9061
9062 spec->autocfg.hp_pins[0] = 0x15;
9063 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
9064}
9065
9066static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
9067{
a9fd4f3f 9068 alc_automute_amp(codec);
0c4cc443
HRK
9069 alc883_clevo_m720_mic_automute(codec);
9070}
9071
9072static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
368c7a95
J
9073 unsigned int res)
9074{
0c4cc443 9075 switch (res >> 26) {
0c4cc443
HRK
9076 case ALC880_MIC_EVENT:
9077 alc883_clevo_m720_mic_automute(codec);
9078 break;
a9fd4f3f
TI
9079 default:
9080 alc_automute_amp_unsol_event(codec, res);
9081 break;
0c4cc443 9082 }
368c7a95
J
9083}
9084
fb97dc67 9085/* toggle speaker-output according to the hp-jack state */
4f5d1706 9086static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
fb97dc67 9087{
a9fd4f3f 9088 struct alc_spec *spec = codec->spec;
fb97dc67 9089
a9fd4f3f
TI
9090 spec->autocfg.hp_pins[0] = 0x14;
9091 spec->autocfg.speaker_pins[0] = 0x15;
fb97dc67
J
9092}
9093
4f5d1706 9094static void alc883_haier_w66_setup(struct hda_codec *codec)
fb97dc67 9095{
a9fd4f3f 9096 struct alc_spec *spec = codec->spec;
189609ae 9097
a9fd4f3f
TI
9098 spec->autocfg.hp_pins[0] = 0x1b;
9099 spec->autocfg.speaker_pins[0] = 0x14;
189609ae
KY
9100}
9101
bc9f98a9
KY
9102static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
9103{
864f92be 9104 int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
bc9f98a9 9105
47fd830a
TI
9106 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9107 HDA_AMP_MUTE, bits);
bc9f98a9
KY
9108}
9109
9110static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
9111{
864f92be 9112 int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
bc9f98a9 9113
47fd830a
TI
9114 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9115 HDA_AMP_MUTE, bits);
9116 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9117 HDA_AMP_MUTE, bits);
bc9f98a9
KY
9118}
9119
9120static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
9121 unsigned int res)
9122{
9123 if ((res >> 26) == ALC880_HP_EVENT)
9124 alc883_lenovo_101e_all_automute(codec);
9125 if ((res >> 26) == ALC880_FRONT_EVENT)
9126 alc883_lenovo_101e_ispeaker_automute(codec);
9127}
9128
676a9b53 9129/* toggle speaker-output according to the hp-jack state */
4f5d1706 9130static void alc883_acer_aspire_setup(struct hda_codec *codec)
676a9b53 9131{
a9fd4f3f 9132 struct alc_spec *spec = codec->spec;
676a9b53 9133
a9fd4f3f
TI
9134 spec->autocfg.hp_pins[0] = 0x14;
9135 spec->autocfg.speaker_pins[0] = 0x15;
9136 spec->autocfg.speaker_pins[1] = 0x16;
676a9b53
TI
9137}
9138
d1a991a6
KY
9139static struct hda_verb alc883_acer_eapd_verbs[] = {
9140 /* HP Pin: output 0 (0x0c) */
9141 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9142 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9143 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
9144 /* Front Pin: output 0 (0x0c) */
676a9b53
TI
9145 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9146 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
d1a991a6 9147 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
d1a991a6
KY
9148 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
9149 /* eanable EAPD on medion laptop */
9150 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
9151 {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
676a9b53
TI
9152 /* enable unsolicited event */
9153 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
d1a991a6
KY
9154 { }
9155};
9156
fc86f954
DK
9157static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
9158 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9159 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
9160 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9161 { } /* end */
9162};
9163
4f5d1706 9164static void alc888_6st_dell_setup(struct hda_codec *codec)
5795b9e6 9165{
a9fd4f3f 9166 struct alc_spec *spec = codec->spec;
5795b9e6 9167
a9fd4f3f
TI
9168 spec->autocfg.hp_pins[0] = 0x1b;
9169 spec->autocfg.speaker_pins[0] = 0x14;
9170 spec->autocfg.speaker_pins[1] = 0x15;
9171 spec->autocfg.speaker_pins[2] = 0x16;
9172 spec->autocfg.speaker_pins[3] = 0x17;
5795b9e6
CM
9173}
9174
4f5d1706 9175static void alc888_lenovo_sky_setup(struct hda_codec *codec)
e2757d5e 9176{
a9fd4f3f 9177 struct alc_spec *spec = codec->spec;
e2757d5e 9178
a9fd4f3f
TI
9179 spec->autocfg.hp_pins[0] = 0x1b;
9180 spec->autocfg.speaker_pins[0] = 0x14;
9181 spec->autocfg.speaker_pins[1] = 0x15;
9182 spec->autocfg.speaker_pins[2] = 0x16;
9183 spec->autocfg.speaker_pins[3] = 0x17;
9184 spec->autocfg.speaker_pins[4] = 0x1a;
e2757d5e
KY
9185}
9186
4f5d1706 9187static void alc883_vaiott_setup(struct hda_codec *codec)
3e1647c5
GG
9188{
9189 struct alc_spec *spec = codec->spec;
9190
9191 spec->autocfg.hp_pins[0] = 0x15;
9192 spec->autocfg.speaker_pins[0] = 0x14;
9193 spec->autocfg.speaker_pins[1] = 0x17;
3e1647c5
GG
9194}
9195
e2757d5e
KY
9196static struct hda_verb alc888_asus_m90v_verbs[] = {
9197 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9198 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9199 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9200 /* enable unsolicited event */
9201 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9202 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9203 { } /* end */
9204};
9205
4f5d1706 9206static void alc883_mode2_setup(struct hda_codec *codec)
e2757d5e 9207{
a9fd4f3f 9208 struct alc_spec *spec = codec->spec;
e2757d5e 9209
a9fd4f3f
TI
9210 spec->autocfg.hp_pins[0] = 0x1b;
9211 spec->autocfg.speaker_pins[0] = 0x14;
9212 spec->autocfg.speaker_pins[1] = 0x15;
9213 spec->autocfg.speaker_pins[2] = 0x16;
4f5d1706
TI
9214 spec->ext_mic.pin = 0x18;
9215 spec->int_mic.pin = 0x19;
9216 spec->ext_mic.mux_idx = 0;
9217 spec->int_mic.mux_idx = 1;
9218 spec->auto_mic = 1;
e2757d5e
KY
9219}
9220
9221static struct hda_verb alc888_asus_eee1601_verbs[] = {
9222 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9223 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9224 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9225 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9226 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
9227 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
9228 {0x20, AC_VERB_SET_PROC_COEF, 0x0838},
9229 /* enable unsolicited event */
9230 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9231 { } /* end */
9232};
9233
e2757d5e
KY
9234static void alc883_eee1601_inithook(struct hda_codec *codec)
9235{
a9fd4f3f
TI
9236 struct alc_spec *spec = codec->spec;
9237
9238 spec->autocfg.hp_pins[0] = 0x14;
9239 spec->autocfg.speaker_pins[0] = 0x1b;
9240 alc_automute_pin(codec);
e2757d5e
KY
9241}
9242
eb4c41d3
TS
9243static struct hda_verb alc889A_mb31_verbs[] = {
9244 /* Init rear pin (used as headphone output) */
9245 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */
9246 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Connect to front */
9247 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9248 /* Init line pin (used as output in 4ch and 6ch mode) */
9249 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, /* Connect to CLFE */
9250 /* Init line 2 pin (used as headphone out by default) */
9251 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Use as input */
9252 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
9253 { } /* end */
9254};
9255
9256/* Mute speakers according to the headphone jack state */
9257static void alc889A_mb31_automute(struct hda_codec *codec)
9258{
9259 unsigned int present;
9260
9261 /* Mute only in 2ch or 4ch mode */
9262 if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
9263 == 0x00) {
864f92be 9264 present = snd_hda_jack_detect(codec, 0x15);
eb4c41d3
TS
9265 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9266 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9267 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
9268 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9269 }
9270}
9271
9272static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
9273{
9274 if ((res >> 26) == ALC880_HP_EVENT)
9275 alc889A_mb31_automute(codec);
9276}
9277
4953550a 9278
cb53c626 9279#ifdef CONFIG_SND_HDA_POWER_SAVE
4953550a 9280#define alc882_loopbacks alc880_loopbacks
cb53c626
TI
9281#endif
9282
def319f9 9283/* pcm configuration: identical with ALC880 */
4953550a
TI
9284#define alc882_pcm_analog_playback alc880_pcm_analog_playback
9285#define alc882_pcm_analog_capture alc880_pcm_analog_capture
9286#define alc882_pcm_digital_playback alc880_pcm_digital_playback
9287#define alc882_pcm_digital_capture alc880_pcm_digital_capture
9288
9289static hda_nid_t alc883_slave_dig_outs[] = {
9290 ALC1200_DIGOUT_NID, 0,
9291};
9292
9293static hda_nid_t alc1200_slave_dig_outs[] = {
9294 ALC883_DIGOUT_NID, 0,
9295};
9c7f852e
TI
9296
9297/*
9298 * configuration and preset
9299 */
4953550a
TI
9300static const char *alc882_models[ALC882_MODEL_LAST] = {
9301 [ALC882_3ST_DIG] = "3stack-dig",
9302 [ALC882_6ST_DIG] = "6stack-dig",
9303 [ALC882_ARIMA] = "arima",
9304 [ALC882_W2JC] = "w2jc",
9305 [ALC882_TARGA] = "targa",
9306 [ALC882_ASUS_A7J] = "asus-a7j",
9307 [ALC882_ASUS_A7M] = "asus-a7m",
9308 [ALC885_MACPRO] = "macpro",
9309 [ALC885_MB5] = "mb5",
e458b1fa 9310 [ALC885_MACMINI3] = "macmini3",
76e6f5a9 9311 [ALC885_MBA21] = "mba21",
4953550a
TI
9312 [ALC885_MBP3] = "mbp3",
9313 [ALC885_IMAC24] = "imac24",
4b7e1803 9314 [ALC885_IMAC91] = "imac91",
4953550a 9315 [ALC883_3ST_2ch_DIG] = "3stack-2ch-dig",
f5fcc13c
TI
9316 [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig",
9317 [ALC883_3ST_6ch] = "3stack-6ch",
4953550a 9318 [ALC883_6ST_DIG] = "alc883-6stack-dig",
f5fcc13c
TI
9319 [ALC883_TARGA_DIG] = "targa-dig",
9320 [ALC883_TARGA_2ch_DIG] = "targa-2ch-dig",
64a8be74 9321 [ALC883_TARGA_8ch_DIG] = "targa-8ch-dig",
f5fcc13c 9322 [ALC883_ACER] = "acer",
2880a867 9323 [ALC883_ACER_ASPIRE] = "acer-aspire",
5b2d1eca 9324 [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g",
b1a91469 9325 [ALC888_ACER_ASPIRE_6530G] = "acer-aspire-6530g",
3b315d70 9326 [ALC888_ACER_ASPIRE_8930G] = "acer-aspire-8930g",
fc86f954 9327 [ALC888_ACER_ASPIRE_7730G] = "acer-aspire-7730g",
f5fcc13c 9328 [ALC883_MEDION] = "medion",
272a527c 9329 [ALC883_MEDION_MD2] = "medion-md2",
7ad7b218 9330 [ALC883_MEDION_WIM2160] = "medion-wim2160",
f5fcc13c 9331 [ALC883_LAPTOP_EAPD] = "laptop-eapd",
bc9f98a9 9332 [ALC883_LENOVO_101E_2ch] = "lenovo-101e",
272a527c
KY
9333 [ALC883_LENOVO_NB0763] = "lenovo-nb0763",
9334 [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
e2757d5e 9335 [ALC888_LENOVO_SKY] = "lenovo-sky",
189609ae 9336 [ALC883_HAIER_W66] = "haier-w66",
4723c022 9337 [ALC888_3ST_HP] = "3stack-hp",
5795b9e6 9338 [ALC888_6ST_DELL] = "6stack-dell",
a8848bd6 9339 [ALC883_MITAC] = "mitac",
a65cc60f 9340 [ALC883_CLEVO_M540R] = "clevo-m540r",
0c4cc443 9341 [ALC883_CLEVO_M720] = "clevo-m720",
fb97dc67 9342 [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
ef8ef5fb 9343 [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
17bba1b7 9344 [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel",
87a8c370
JK
9345 [ALC889A_INTEL] = "intel-alc889a",
9346 [ALC889_INTEL] = "intel-x58",
3ab90935 9347 [ALC1200_ASUS_P5Q] = "asus-p5q",
eb4c41d3 9348 [ALC889A_MB31] = "mb31",
3e1647c5 9349 [ALC883_SONY_VAIO_TT] = "sony-vaio-tt",
4953550a 9350 [ALC882_AUTO] = "auto",
f5fcc13c
TI
9351};
9352
4953550a
TI
9353static struct snd_pci_quirk alc882_cfg_tbl[] = {
9354 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
9355
ac3e3741 9356 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
69e50282 9357 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
9b6682ff 9358 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
ac3e3741
TI
9359 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
9360 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
0b18cb18 9361 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
5b2d1eca
VP
9362 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
9363 ALC888_ACER_ASPIRE_4930G),
a8e4f9dd 9364 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
83dd7408 9365 ALC888_ACER_ASPIRE_4930G),
3b315d70
HM
9366 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
9367 ALC888_ACER_ASPIRE_8930G),
e46b0c8c
TI
9368 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
9369 ALC888_ACER_ASPIRE_8930G),
4953550a
TI
9370 SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
9371 SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
a8e4f9dd 9372 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
dde65356 9373 ALC888_ACER_ASPIRE_6530G),
cc374c47 9374 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
d2fd4b09 9375 ALC888_ACER_ASPIRE_6530G),
fc86f954
DK
9376 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
9377 ALC888_ACER_ASPIRE_7730G),
22b530e0
TI
9378 /* default Acer -- disabled as it causes more problems.
9379 * model=auto should work fine now
9380 */
9381 /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
4953550a 9382
5795b9e6 9383 SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
4953550a 9384
febe3375 9385 SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
ac3e3741
TI
9386 SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
9387 SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
5d85f8d0 9388 SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
06bf3e15 9389 SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
7ec30f0e 9390 SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
4953550a
TI
9391
9392 SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
9393 SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
9394 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
a01c30cb 9395 SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
4953550a
TI
9396 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
9397 SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
9398 SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
ac3e3741 9399 SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
44a678d0 9400 SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
3ab90935 9401 SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
e2757d5e 9402 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
4953550a
TI
9403
9404 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
97ec710c 9405 SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
4953550a 9406 SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
2de686d2 9407 SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
ac3e3741
TI
9408 SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
9409 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
e2757d5e 9410 SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
ac3e3741 9411 SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
4953550a
TI
9412 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
9413
6f3bf657 9414 SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
bba8dee7 9415 SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
ac3e3741 9416 SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
4953550a 9417 SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */
2fef62c8 9418 SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
4953550a 9419 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
dd146a60 9420 SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
82808236 9421 SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
f5fcc13c 9422 SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
ac3e3741 9423 SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
f5fcc13c
TI
9424 SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
9425 SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
ac3e3741 9426 SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
64ca1c29 9427 SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
b1e4422f 9428 SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
f5fcc13c
TI
9429 SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
9430 SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
9431 SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
b43f6e5e 9432 SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG),
64a8be74 9433 SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
ac3e3741
TI
9434 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
9435 SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
9436 SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
ee09543c 9437 SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
86d34b7e 9438 SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
ac3e3741
TI
9439 SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
9440 SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
df01b8af 9441 SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
b43f6e5e 9442 SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG),
f5fcc13c 9443 SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
b1e4422f 9444 SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
4953550a 9445
ac3e3741 9446 SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
d1501ea8 9447 SND_PCI_QUIRK(0x1558, 0x0571, "Clevo laptop M570U", ALC883_3ST_6ch_DIG),
0c4cc443
HRK
9448 SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
9449 SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
a65cc60f 9450 SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
dea0a509 9451 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
e60623b4 9452 SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
4953550a 9453 /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
f5fcc13c 9454 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
bfb53037 9455 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
f67d8176 9456 ALC883_FUJITSU_PI2515),
bfb53037 9457 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
ef8ef5fb 9458 ALC888_FUJITSU_XA3530),
272a527c 9459 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
272a527c 9460 SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
ac3e3741
TI
9461 SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9462 SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
e2757d5e 9463 SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
272a527c 9464 SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
959973b9 9465 SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
0b167bf4 9466 SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
189609ae 9467 SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
4953550a 9468
17bba1b7
J
9469 SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
9470 SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
2de686d2 9471 SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
87a8c370
JK
9472 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
9473 SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
9474 SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
572c0e3c 9475 SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG),
9c7f852e 9476
4953550a 9477 {}
f3cd3f5d
WF
9478};
9479
4953550a
TI
9480/* codec SSID table for Intel Mac */
9481static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9482 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
9483 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
9484 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
9485 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
9486 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
9487 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
9488 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
26fd74fc 9489 SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31),
ab669967 9490 SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_ASUS_A7M),
f53dae28 9491 SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC885_MBP3),
6e12970b 9492 SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC885_MBA21),
4953550a
TI
9493 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
9494 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
9495 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
4b7e1803 9496 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
4953550a 9497 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
3bfea98f 9498 SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC885_MB5),
46ef6ec9
DC
9499 /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
9500 * so apparently no perfect solution yet
4953550a
TI
9501 */
9502 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
46ef6ec9 9503 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
e458b1fa 9504 SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3),
4953550a 9505 {} /* terminator */
b25c9da1
WF
9506};
9507
4953550a
TI
9508static struct alc_config_preset alc882_presets[] = {
9509 [ALC882_3ST_DIG] = {
9510 .mixers = { alc882_base_mixer },
8ab9e0af
TI
9511 .init_verbs = { alc882_base_init_verbs,
9512 alc882_adc1_init_verbs },
4953550a
TI
9513 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9514 .dac_nids = alc882_dac_nids,
9515 .dig_out_nid = ALC882_DIGOUT_NID,
9516 .dig_in_nid = ALC882_DIGIN_NID,
9517 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9518 .channel_mode = alc882_ch_modes,
9519 .need_dac_fix = 1,
9520 .input_mux = &alc882_capture_source,
9521 },
9522 [ALC882_6ST_DIG] = {
9523 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
8ab9e0af
TI
9524 .init_verbs = { alc882_base_init_verbs,
9525 alc882_adc1_init_verbs },
4953550a
TI
9526 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9527 .dac_nids = alc882_dac_nids,
9528 .dig_out_nid = ALC882_DIGOUT_NID,
9529 .dig_in_nid = ALC882_DIGIN_NID,
9530 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9531 .channel_mode = alc882_sixstack_modes,
9532 .input_mux = &alc882_capture_source,
9533 },
9534 [ALC882_ARIMA] = {
9535 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
8ab9e0af
TI
9536 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9537 alc882_eapd_verbs },
4953550a
TI
9538 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9539 .dac_nids = alc882_dac_nids,
9540 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9541 .channel_mode = alc882_sixstack_modes,
9542 .input_mux = &alc882_capture_source,
9543 },
9544 [ALC882_W2JC] = {
9545 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
8ab9e0af
TI
9546 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9547 alc882_eapd_verbs, alc880_gpio1_init_verbs },
4953550a
TI
9548 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9549 .dac_nids = alc882_dac_nids,
9550 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9551 .channel_mode = alc880_threestack_modes,
9552 .need_dac_fix = 1,
9553 .input_mux = &alc882_capture_source,
9554 .dig_out_nid = ALC882_DIGOUT_NID,
9555 },
76e6f5a9
RH
9556 [ALC885_MBA21] = {
9557 .mixers = { alc885_mba21_mixer },
9558 .init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
9559 .num_dacs = 2,
9560 .dac_nids = alc882_dac_nids,
9561 .channel_mode = alc885_mba21_ch_modes,
9562 .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9563 .input_mux = &alc882_capture_source,
9564 .unsol_event = alc_automute_amp_unsol_event,
9565 .setup = alc885_mba21_setup,
9566 .init_hook = alc_automute_amp,
9567 },
4953550a
TI
9568 [ALC885_MBP3] = {
9569 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
9570 .init_verbs = { alc885_mbp3_init_verbs,
9571 alc880_gpio1_init_verbs },
be0ae923 9572 .num_dacs = 2,
4953550a 9573 .dac_nids = alc882_dac_nids,
be0ae923
TI
9574 .hp_nid = 0x04,
9575 .channel_mode = alc885_mbp_4ch_modes,
9576 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
4953550a
TI
9577 .input_mux = &alc882_capture_source,
9578 .dig_out_nid = ALC882_DIGOUT_NID,
9579 .dig_in_nid = ALC882_DIGIN_NID,
9580 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9581 .setup = alc885_mbp3_setup,
9582 .init_hook = alc_automute_amp,
4953550a
TI
9583 },
9584 [ALC885_MB5] = {
9585 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
9586 .init_verbs = { alc885_mb5_init_verbs,
9587 alc880_gpio1_init_verbs },
9588 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9589 .dac_nids = alc882_dac_nids,
9590 .channel_mode = alc885_mb5_6ch_modes,
9591 .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
9592 .input_mux = &mb5_capture_source,
9593 .dig_out_nid = ALC882_DIGOUT_NID,
9594 .dig_in_nid = ALC882_DIGIN_NID,
9d54f08b
TI
9595 .unsol_event = alc_automute_amp_unsol_event,
9596 .setup = alc885_mb5_setup,
9597 .init_hook = alc_automute_amp,
4953550a 9598 },
e458b1fa
LY
9599 [ALC885_MACMINI3] = {
9600 .mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
9601 .init_verbs = { alc885_macmini3_init_verbs,
9602 alc880_gpio1_init_verbs },
9603 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9604 .dac_nids = alc882_dac_nids,
9605 .channel_mode = alc885_macmini3_6ch_modes,
9606 .num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes),
9607 .input_mux = &macmini3_capture_source,
9608 .dig_out_nid = ALC882_DIGOUT_NID,
9609 .dig_in_nid = ALC882_DIGIN_NID,
9d54f08b
TI
9610 .unsol_event = alc_automute_amp_unsol_event,
9611 .setup = alc885_macmini3_setup,
9612 .init_hook = alc_automute_amp,
e458b1fa 9613 },
4953550a
TI
9614 [ALC885_MACPRO] = {
9615 .mixers = { alc882_macpro_mixer },
9616 .init_verbs = { alc882_macpro_init_verbs },
9617 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9618 .dac_nids = alc882_dac_nids,
9619 .dig_out_nid = ALC882_DIGOUT_NID,
9620 .dig_in_nid = ALC882_DIGIN_NID,
9621 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9622 .channel_mode = alc882_ch_modes,
9623 .input_mux = &alc882_capture_source,
9624 .init_hook = alc885_macpro_init_hook,
9625 },
9626 [ALC885_IMAC24] = {
9627 .mixers = { alc885_imac24_mixer },
9628 .init_verbs = { alc885_imac24_init_verbs },
9629 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9630 .dac_nids = alc882_dac_nids,
9631 .dig_out_nid = ALC882_DIGOUT_NID,
9632 .dig_in_nid = ALC882_DIGIN_NID,
9633 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9634 .channel_mode = alc882_ch_modes,
9635 .input_mux = &alc882_capture_source,
9636 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706 9637 .setup = alc885_imac24_setup,
4953550a
TI
9638 .init_hook = alc885_imac24_init_hook,
9639 },
4b7e1803 9640 [ALC885_IMAC91] = {
b7cccc52 9641 .mixers = {alc885_imac91_mixer},
4b7e1803
JM
9642 .init_verbs = { alc885_imac91_init_verbs,
9643 alc880_gpio1_init_verbs },
9644 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9645 .dac_nids = alc882_dac_nids,
b7cccc52
JM
9646 .channel_mode = alc885_mba21_ch_modes,
9647 .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9648 .input_mux = &alc889A_imac91_capture_source,
4b7e1803
JM
9649 .dig_out_nid = ALC882_DIGOUT_NID,
9650 .dig_in_nid = ALC882_DIGIN_NID,
9d54f08b
TI
9651 .unsol_event = alc_automute_amp_unsol_event,
9652 .setup = alc885_imac91_setup,
9653 .init_hook = alc_automute_amp,
4b7e1803 9654 },
4953550a
TI
9655 [ALC882_TARGA] = {
9656 .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
8ab9e0af 9657 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
31909b83 9658 alc880_gpio3_init_verbs, alc882_targa_verbs},
4953550a
TI
9659 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9660 .dac_nids = alc882_dac_nids,
9661 .dig_out_nid = ALC882_DIGOUT_NID,
9662 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9663 .adc_nids = alc882_adc_nids,
9664 .capsrc_nids = alc882_capsrc_nids,
9665 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9666 .channel_mode = alc882_3ST_6ch_modes,
9667 .need_dac_fix = 1,
9668 .input_mux = &alc882_capture_source,
9669 .unsol_event = alc882_targa_unsol_event,
4f5d1706
TI
9670 .setup = alc882_targa_setup,
9671 .init_hook = alc882_targa_automute,
4953550a
TI
9672 },
9673 [ALC882_ASUS_A7J] = {
9674 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
8ab9e0af
TI
9675 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9676 alc882_asus_a7j_verbs},
4953550a
TI
9677 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9678 .dac_nids = alc882_dac_nids,
9679 .dig_out_nid = ALC882_DIGOUT_NID,
9680 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9681 .adc_nids = alc882_adc_nids,
9682 .capsrc_nids = alc882_capsrc_nids,
9683 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9684 .channel_mode = alc882_3ST_6ch_modes,
9685 .need_dac_fix = 1,
9686 .input_mux = &alc882_capture_source,
9687 },
9688 [ALC882_ASUS_A7M] = {
9689 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
8ab9e0af
TI
9690 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9691 alc882_eapd_verbs, alc880_gpio1_init_verbs,
4953550a
TI
9692 alc882_asus_a7m_verbs },
9693 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9694 .dac_nids = alc882_dac_nids,
9695 .dig_out_nid = ALC882_DIGOUT_NID,
9696 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9697 .channel_mode = alc880_threestack_modes,
9698 .need_dac_fix = 1,
9699 .input_mux = &alc882_capture_source,
9700 },
9c7f852e
TI
9701 [ALC883_3ST_2ch_DIG] = {
9702 .mixers = { alc883_3ST_2ch_mixer },
9703 .init_verbs = { alc883_init_verbs },
9704 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9705 .dac_nids = alc883_dac_nids,
9706 .dig_out_nid = ALC883_DIGOUT_NID,
9c7f852e
TI
9707 .dig_in_nid = ALC883_DIGIN_NID,
9708 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9709 .channel_mode = alc883_3ST_2ch_modes,
9710 .input_mux = &alc883_capture_source,
9711 },
9712 [ALC883_3ST_6ch_DIG] = {
9713 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9714 .init_verbs = { alc883_init_verbs },
9715 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9716 .dac_nids = alc883_dac_nids,
9717 .dig_out_nid = ALC883_DIGOUT_NID,
9c7f852e
TI
9718 .dig_in_nid = ALC883_DIGIN_NID,
9719 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9720 .channel_mode = alc883_3ST_6ch_modes,
4e195a7b 9721 .need_dac_fix = 1,
9c7f852e 9722 .input_mux = &alc883_capture_source,
f12ab1e0 9723 },
9c7f852e
TI
9724 [ALC883_3ST_6ch] = {
9725 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9726 .init_verbs = { alc883_init_verbs },
9727 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9728 .dac_nids = alc883_dac_nids,
9c7f852e
TI
9729 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9730 .channel_mode = alc883_3ST_6ch_modes,
4e195a7b 9731 .need_dac_fix = 1,
9c7f852e 9732 .input_mux = &alc883_capture_source,
f12ab1e0 9733 },
17bba1b7
J
9734 [ALC883_3ST_6ch_INTEL] = {
9735 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
9736 .init_verbs = { alc883_init_verbs },
9737 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9738 .dac_nids = alc883_dac_nids,
9739 .dig_out_nid = ALC883_DIGOUT_NID,
9740 .dig_in_nid = ALC883_DIGIN_NID,
f3cd3f5d 9741 .slave_dig_outs = alc883_slave_dig_outs,
17bba1b7
J
9742 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
9743 .channel_mode = alc883_3ST_6ch_intel_modes,
9744 .need_dac_fix = 1,
9745 .input_mux = &alc883_3stack_6ch_intel,
9746 },
87a8c370
JK
9747 [ALC889A_INTEL] = {
9748 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
6732bd0d
WF
9749 .init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
9750 alc_hp15_unsol_verbs },
87a8c370
JK
9751 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9752 .dac_nids = alc883_dac_nids,
9753 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9754 .adc_nids = alc889_adc_nids,
9755 .dig_out_nid = ALC883_DIGOUT_NID,
9756 .dig_in_nid = ALC883_DIGIN_NID,
9757 .slave_dig_outs = alc883_slave_dig_outs,
9758 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9759 .channel_mode = alc889_8ch_intel_modes,
9760 .capsrc_nids = alc889_capsrc_nids,
9761 .input_mux = &alc889_capture_source,
4f5d1706
TI
9762 .setup = alc889_automute_setup,
9763 .init_hook = alc_automute_amp,
6732bd0d 9764 .unsol_event = alc_automute_amp_unsol_event,
87a8c370
JK
9765 .need_dac_fix = 1,
9766 },
9767 [ALC889_INTEL] = {
9768 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9769 .init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
6732bd0d 9770 alc889_eapd_verbs, alc_hp15_unsol_verbs},
87a8c370
JK
9771 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9772 .dac_nids = alc883_dac_nids,
9773 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9774 .adc_nids = alc889_adc_nids,
9775 .dig_out_nid = ALC883_DIGOUT_NID,
9776 .dig_in_nid = ALC883_DIGIN_NID,
9777 .slave_dig_outs = alc883_slave_dig_outs,
9778 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9779 .channel_mode = alc889_8ch_intel_modes,
9780 .capsrc_nids = alc889_capsrc_nids,
9781 .input_mux = &alc889_capture_source,
4f5d1706 9782 .setup = alc889_automute_setup,
6732bd0d
WF
9783 .init_hook = alc889_intel_init_hook,
9784 .unsol_event = alc_automute_amp_unsol_event,
87a8c370
JK
9785 .need_dac_fix = 1,
9786 },
9c7f852e
TI
9787 [ALC883_6ST_DIG] = {
9788 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9789 .init_verbs = { alc883_init_verbs },
9790 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9791 .dac_nids = alc883_dac_nids,
9792 .dig_out_nid = ALC883_DIGOUT_NID,
9c7f852e
TI
9793 .dig_in_nid = ALC883_DIGIN_NID,
9794 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9795 .channel_mode = alc883_sixstack_modes,
9796 .input_mux = &alc883_capture_source,
9797 },
ccc656ce 9798 [ALC883_TARGA_DIG] = {
c259249f 9799 .mixers = { alc883_targa_mixer, alc883_chmode_mixer },
005b1076
DH
9800 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9801 alc883_targa_verbs},
ccc656ce
KY
9802 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9803 .dac_nids = alc883_dac_nids,
9804 .dig_out_nid = ALC883_DIGOUT_NID,
ccc656ce
KY
9805 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9806 .channel_mode = alc883_3ST_6ch_modes,
9807 .need_dac_fix = 1,
9808 .input_mux = &alc883_capture_source,
c259249f 9809 .unsol_event = alc883_targa_unsol_event,
4f5d1706
TI
9810 .setup = alc882_targa_setup,
9811 .init_hook = alc882_targa_automute,
ccc656ce
KY
9812 },
9813 [ALC883_TARGA_2ch_DIG] = {
c259249f 9814 .mixers = { alc883_targa_2ch_mixer},
005b1076
DH
9815 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9816 alc883_targa_verbs},
ccc656ce
KY
9817 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9818 .dac_nids = alc883_dac_nids,
f9e336f6
TI
9819 .adc_nids = alc883_adc_nids_alt,
9820 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
035eb0cf 9821 .capsrc_nids = alc883_capsrc_nids,
ccc656ce 9822 .dig_out_nid = ALC883_DIGOUT_NID,
ccc656ce
KY
9823 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9824 .channel_mode = alc883_3ST_2ch_modes,
9825 .input_mux = &alc883_capture_source,
c259249f 9826 .unsol_event = alc883_targa_unsol_event,
4f5d1706
TI
9827 .setup = alc882_targa_setup,
9828 .init_hook = alc882_targa_automute,
ccc656ce 9829 },
64a8be74 9830 [ALC883_TARGA_8ch_DIG] = {
b99dba34
TI
9831 .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
9832 alc883_chmode_mixer },
64a8be74 9833 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
c259249f 9834 alc883_targa_verbs },
64a8be74
DH
9835 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9836 .dac_nids = alc883_dac_nids,
9837 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9838 .adc_nids = alc883_adc_nids_rev,
9839 .capsrc_nids = alc883_capsrc_nids_rev,
9840 .dig_out_nid = ALC883_DIGOUT_NID,
9841 .dig_in_nid = ALC883_DIGIN_NID,
9842 .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
9843 .channel_mode = alc883_4ST_8ch_modes,
9844 .need_dac_fix = 1,
9845 .input_mux = &alc883_capture_source,
c259249f 9846 .unsol_event = alc883_targa_unsol_event,
4f5d1706
TI
9847 .setup = alc882_targa_setup,
9848 .init_hook = alc882_targa_automute,
64a8be74 9849 },
bab282b9 9850 [ALC883_ACER] = {
676a9b53 9851 .mixers = { alc883_base_mixer },
bab282b9
VA
9852 /* On TravelMate laptops, GPIO 0 enables the internal speaker
9853 * and the headphone jack. Turn this on and rely on the
9854 * standard mute methods whenever the user wants to turn
9855 * these outputs off.
9856 */
9857 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
9858 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9859 .dac_nids = alc883_dac_nids,
bab282b9
VA
9860 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9861 .channel_mode = alc883_3ST_2ch_modes,
9862 .input_mux = &alc883_capture_source,
9863 },
2880a867 9864 [ALC883_ACER_ASPIRE] = {
676a9b53 9865 .mixers = { alc883_acer_aspire_mixer },
d1a991a6 9866 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
2880a867
TD
9867 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9868 .dac_nids = alc883_dac_nids,
9869 .dig_out_nid = ALC883_DIGOUT_NID,
2880a867
TD
9870 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9871 .channel_mode = alc883_3ST_2ch_modes,
9872 .input_mux = &alc883_capture_source,
a9fd4f3f 9873 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9874 .setup = alc883_acer_aspire_setup,
9875 .init_hook = alc_automute_amp,
d1a991a6 9876 },
5b2d1eca 9877 [ALC888_ACER_ASPIRE_4930G] = {
ef8ef5fb 9878 .mixers = { alc888_base_mixer,
5b2d1eca
VP
9879 alc883_chmode_mixer },
9880 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9881 alc888_acer_aspire_4930g_verbs },
9882 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9883 .dac_nids = alc883_dac_nids,
9884 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9885 .adc_nids = alc883_adc_nids_rev,
9886 .capsrc_nids = alc883_capsrc_nids_rev,
9887 .dig_out_nid = ALC883_DIGOUT_NID,
9888 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9889 .channel_mode = alc883_3ST_6ch_modes,
9890 .need_dac_fix = 1,
973b8cb0 9891 .const_channel_count = 6,
5b2d1eca 9892 .num_mux_defs =
ef8ef5fb
VP
9893 ARRAY_SIZE(alc888_2_capture_sources),
9894 .input_mux = alc888_2_capture_sources,
d2fd4b09 9895 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9896 .setup = alc888_acer_aspire_4930g_setup,
9897 .init_hook = alc_automute_amp,
d2fd4b09
TV
9898 },
9899 [ALC888_ACER_ASPIRE_6530G] = {
9900 .mixers = { alc888_acer_aspire_6530_mixer },
9901 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9902 alc888_acer_aspire_6530g_verbs },
9903 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9904 .dac_nids = alc883_dac_nids,
9905 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9906 .adc_nids = alc883_adc_nids_rev,
9907 .capsrc_nids = alc883_capsrc_nids_rev,
9908 .dig_out_nid = ALC883_DIGOUT_NID,
9909 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9910 .channel_mode = alc883_3ST_2ch_modes,
9911 .num_mux_defs =
9912 ARRAY_SIZE(alc888_2_capture_sources),
9913 .input_mux = alc888_acer_aspire_6530_sources,
a9fd4f3f 9914 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9915 .setup = alc888_acer_aspire_6530g_setup,
9916 .init_hook = alc_automute_amp,
5b2d1eca 9917 },
3b315d70 9918 [ALC888_ACER_ASPIRE_8930G] = {
556eea9a 9919 .mixers = { alc889_acer_aspire_8930g_mixer,
3b315d70
HM
9920 alc883_chmode_mixer },
9921 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
0f86a228
HM
9922 alc889_acer_aspire_8930g_verbs,
9923 alc889_eapd_verbs},
3b315d70
HM
9924 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9925 .dac_nids = alc883_dac_nids,
018df418
HM
9926 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9927 .adc_nids = alc889_adc_nids,
9928 .capsrc_nids = alc889_capsrc_nids,
3b315d70
HM
9929 .dig_out_nid = ALC883_DIGOUT_NID,
9930 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9931 .channel_mode = alc883_3ST_6ch_modes,
9932 .need_dac_fix = 1,
9933 .const_channel_count = 6,
9934 .num_mux_defs =
018df418
HM
9935 ARRAY_SIZE(alc889_capture_sources),
9936 .input_mux = alc889_capture_sources,
3b315d70 9937 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9938 .setup = alc889_acer_aspire_8930g_setup,
9939 .init_hook = alc_automute_amp,
f5de24b0 9940#ifdef CONFIG_SND_HDA_POWER_SAVE
c97259df 9941 .power_hook = alc_power_eapd,
f5de24b0 9942#endif
3b315d70 9943 },
fc86f954
DK
9944 [ALC888_ACER_ASPIRE_7730G] = {
9945 .mixers = { alc883_3ST_6ch_mixer,
9946 alc883_chmode_mixer },
9947 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9948 alc888_acer_aspire_7730G_verbs },
9949 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9950 .dac_nids = alc883_dac_nids,
9951 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9952 .adc_nids = alc883_adc_nids_rev,
9953 .capsrc_nids = alc883_capsrc_nids_rev,
9954 .dig_out_nid = ALC883_DIGOUT_NID,
9955 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9956 .channel_mode = alc883_3ST_6ch_modes,
9957 .need_dac_fix = 1,
9958 .const_channel_count = 6,
9959 .input_mux = &alc883_capture_source,
9960 .unsol_event = alc_automute_amp_unsol_event,
9961 .setup = alc888_acer_aspire_6530g_setup,
9962 .init_hook = alc_automute_amp,
9963 },
c07584c8
TD
9964 [ALC883_MEDION] = {
9965 .mixers = { alc883_fivestack_mixer,
9966 alc883_chmode_mixer },
9967 .init_verbs = { alc883_init_verbs,
b373bdeb 9968 alc883_medion_eapd_verbs },
c07584c8
TD
9969 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9970 .dac_nids = alc883_dac_nids,
f9e336f6
TI
9971 .adc_nids = alc883_adc_nids_alt,
9972 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
035eb0cf 9973 .capsrc_nids = alc883_capsrc_nids,
c07584c8
TD
9974 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9975 .channel_mode = alc883_sixstack_modes,
9976 .input_mux = &alc883_capture_source,
b373bdeb 9977 },
272a527c
KY
9978 [ALC883_MEDION_MD2] = {
9979 .mixers = { alc883_medion_md2_mixer},
9980 .init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
9981 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9982 .dac_nids = alc883_dac_nids,
9983 .dig_out_nid = ALC883_DIGOUT_NID,
272a527c
KY
9984 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9985 .channel_mode = alc883_3ST_2ch_modes,
9986 .input_mux = &alc883_capture_source,
a9fd4f3f 9987 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
9988 .setup = alc883_medion_md2_setup,
9989 .init_hook = alc_automute_amp,
ea1fb29a 9990 },
7ad7b218
MC
9991 [ALC883_MEDION_WIM2160] = {
9992 .mixers = { alc883_medion_wim2160_mixer },
9993 .init_verbs = { alc883_init_verbs, alc883_medion_wim2160_verbs },
9994 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9995 .dac_nids = alc883_dac_nids,
9996 .dig_out_nid = ALC883_DIGOUT_NID,
9997 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
9998 .adc_nids = alc883_adc_nids,
9999 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10000 .channel_mode = alc883_3ST_2ch_modes,
10001 .input_mux = &alc883_capture_source,
10002 .unsol_event = alc_automute_amp_unsol_event,
10003 .setup = alc883_medion_wim2160_setup,
10004 .init_hook = alc_automute_amp,
10005 },
b373bdeb 10006 [ALC883_LAPTOP_EAPD] = {
676a9b53 10007 .mixers = { alc883_base_mixer },
b373bdeb
AN
10008 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
10009 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10010 .dac_nids = alc883_dac_nids,
b373bdeb
AN
10011 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10012 .channel_mode = alc883_3ST_2ch_modes,
10013 .input_mux = &alc883_capture_source,
10014 },
a65cc60f 10015 [ALC883_CLEVO_M540R] = {
10016 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10017 .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
10018 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10019 .dac_nids = alc883_dac_nids,
10020 .dig_out_nid = ALC883_DIGOUT_NID,
10021 .dig_in_nid = ALC883_DIGIN_NID,
10022 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
10023 .channel_mode = alc883_3ST_6ch_clevo_modes,
10024 .need_dac_fix = 1,
10025 .input_mux = &alc883_capture_source,
10026 /* This machine has the hardware HP auto-muting, thus
10027 * we need no software mute via unsol event
10028 */
10029 },
0c4cc443
HRK
10030 [ALC883_CLEVO_M720] = {
10031 .mixers = { alc883_clevo_m720_mixer },
10032 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
368c7a95
J
10033 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10034 .dac_nids = alc883_dac_nids,
10035 .dig_out_nid = ALC883_DIGOUT_NID,
10036 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10037 .channel_mode = alc883_3ST_2ch_modes,
10038 .input_mux = &alc883_capture_source,
0c4cc443 10039 .unsol_event = alc883_clevo_m720_unsol_event,
4f5d1706 10040 .setup = alc883_clevo_m720_setup,
a9fd4f3f 10041 .init_hook = alc883_clevo_m720_init_hook,
368c7a95 10042 },
bc9f98a9
KY
10043 [ALC883_LENOVO_101E_2ch] = {
10044 .mixers = { alc883_lenovo_101e_2ch_mixer},
10045 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
10046 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10047 .dac_nids = alc883_dac_nids,
f9e336f6
TI
10048 .adc_nids = alc883_adc_nids_alt,
10049 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
035eb0cf 10050 .capsrc_nids = alc883_capsrc_nids,
bc9f98a9
KY
10051 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10052 .channel_mode = alc883_3ST_2ch_modes,
10053 .input_mux = &alc883_lenovo_101e_capture_source,
10054 .unsol_event = alc883_lenovo_101e_unsol_event,
10055 .init_hook = alc883_lenovo_101e_all_automute,
10056 },
272a527c
KY
10057 [ALC883_LENOVO_NB0763] = {
10058 .mixers = { alc883_lenovo_nb0763_mixer },
10059 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
10060 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10061 .dac_nids = alc883_dac_nids,
272a527c
KY
10062 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10063 .channel_mode = alc883_3ST_2ch_modes,
10064 .need_dac_fix = 1,
10065 .input_mux = &alc883_lenovo_nb0763_capture_source,
a9fd4f3f 10066 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
10067 .setup = alc883_medion_md2_setup,
10068 .init_hook = alc_automute_amp,
272a527c
KY
10069 },
10070 [ALC888_LENOVO_MS7195_DIG] = {
10071 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10072 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
10073 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10074 .dac_nids = alc883_dac_nids,
10075 .dig_out_nid = ALC883_DIGOUT_NID,
272a527c
KY
10076 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10077 .channel_mode = alc883_3ST_6ch_modes,
10078 .need_dac_fix = 1,
10079 .input_mux = &alc883_capture_source,
10080 .unsol_event = alc883_lenovo_ms7195_unsol_event,
10081 .init_hook = alc888_lenovo_ms7195_front_automute,
189609ae
KY
10082 },
10083 [ALC883_HAIER_W66] = {
c259249f 10084 .mixers = { alc883_targa_2ch_mixer},
189609ae
KY
10085 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
10086 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10087 .dac_nids = alc883_dac_nids,
10088 .dig_out_nid = ALC883_DIGOUT_NID,
189609ae
KY
10089 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10090 .channel_mode = alc883_3ST_2ch_modes,
10091 .input_mux = &alc883_capture_source,
a9fd4f3f 10092 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
10093 .setup = alc883_haier_w66_setup,
10094 .init_hook = alc_automute_amp,
eea6419e 10095 },
4723c022 10096 [ALC888_3ST_HP] = {
eea6419e 10097 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
4723c022 10098 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
8341de60
CM
10099 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10100 .dac_nids = alc883_dac_nids,
4723c022
CM
10101 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
10102 .channel_mode = alc888_3st_hp_modes,
8341de60
CM
10103 .need_dac_fix = 1,
10104 .input_mux = &alc883_capture_source,
a9fd4f3f 10105 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
10106 .setup = alc888_3st_hp_setup,
10107 .init_hook = alc_automute_amp,
8341de60 10108 },
5795b9e6 10109 [ALC888_6ST_DELL] = {
f24dbdc6 10110 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
5795b9e6
CM
10111 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
10112 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10113 .dac_nids = alc883_dac_nids,
10114 .dig_out_nid = ALC883_DIGOUT_NID,
5795b9e6
CM
10115 .dig_in_nid = ALC883_DIGIN_NID,
10116 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10117 .channel_mode = alc883_sixstack_modes,
10118 .input_mux = &alc883_capture_source,
a9fd4f3f 10119 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
10120 .setup = alc888_6st_dell_setup,
10121 .init_hook = alc_automute_amp,
5795b9e6 10122 },
a8848bd6
AS
10123 [ALC883_MITAC] = {
10124 .mixers = { alc883_mitac_mixer },
10125 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
10126 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10127 .dac_nids = alc883_dac_nids,
a8848bd6
AS
10128 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10129 .channel_mode = alc883_3ST_2ch_modes,
10130 .input_mux = &alc883_capture_source,
a9fd4f3f 10131 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
10132 .setup = alc883_mitac_setup,
10133 .init_hook = alc_automute_amp,
a8848bd6 10134 },
fb97dc67
J
10135 [ALC883_FUJITSU_PI2515] = {
10136 .mixers = { alc883_2ch_fujitsu_pi2515_mixer },
10137 .init_verbs = { alc883_init_verbs,
10138 alc883_2ch_fujitsu_pi2515_verbs},
10139 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10140 .dac_nids = alc883_dac_nids,
10141 .dig_out_nid = ALC883_DIGOUT_NID,
10142 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10143 .channel_mode = alc883_3ST_2ch_modes,
10144 .input_mux = &alc883_fujitsu_pi2515_capture_source,
a9fd4f3f 10145 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
10146 .setup = alc883_2ch_fujitsu_pi2515_setup,
10147 .init_hook = alc_automute_amp,
fb97dc67 10148 },
ef8ef5fb
VP
10149 [ALC888_FUJITSU_XA3530] = {
10150 .mixers = { alc888_base_mixer, alc883_chmode_mixer },
10151 .init_verbs = { alc883_init_verbs,
10152 alc888_fujitsu_xa3530_verbs },
10153 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10154 .dac_nids = alc883_dac_nids,
10155 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10156 .adc_nids = alc883_adc_nids_rev,
10157 .capsrc_nids = alc883_capsrc_nids_rev,
10158 .dig_out_nid = ALC883_DIGOUT_NID,
10159 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
10160 .channel_mode = alc888_4ST_8ch_intel_modes,
10161 .num_mux_defs =
10162 ARRAY_SIZE(alc888_2_capture_sources),
10163 .input_mux = alc888_2_capture_sources,
a9fd4f3f 10164 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
10165 .setup = alc888_fujitsu_xa3530_setup,
10166 .init_hook = alc_automute_amp,
ef8ef5fb 10167 },
e2757d5e
KY
10168 [ALC888_LENOVO_SKY] = {
10169 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
10170 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
10171 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10172 .dac_nids = alc883_dac_nids,
10173 .dig_out_nid = ALC883_DIGOUT_NID,
e2757d5e
KY
10174 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10175 .channel_mode = alc883_sixstack_modes,
10176 .need_dac_fix = 1,
10177 .input_mux = &alc883_lenovo_sky_capture_source,
a9fd4f3f 10178 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
10179 .setup = alc888_lenovo_sky_setup,
10180 .init_hook = alc_automute_amp,
e2757d5e
KY
10181 },
10182 [ALC888_ASUS_M90V] = {
10183 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10184 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
10185 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10186 .dac_nids = alc883_dac_nids,
10187 .dig_out_nid = ALC883_DIGOUT_NID,
10188 .dig_in_nid = ALC883_DIGIN_NID,
10189 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10190 .channel_mode = alc883_3ST_6ch_modes,
10191 .need_dac_fix = 1,
10192 .input_mux = &alc883_fujitsu_pi2515_capture_source,
4f5d1706
TI
10193 .unsol_event = alc_sku_unsol_event,
10194 .setup = alc883_mode2_setup,
10195 .init_hook = alc_inithook,
e2757d5e
KY
10196 },
10197 [ALC888_ASUS_EEE1601] = {
10198 .mixers = { alc883_asus_eee1601_mixer },
f9e336f6 10199 .cap_mixer = alc883_asus_eee1601_cap_mixer,
e2757d5e
KY
10200 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
10201 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10202 .dac_nids = alc883_dac_nids,
10203 .dig_out_nid = ALC883_DIGOUT_NID,
10204 .dig_in_nid = ALC883_DIGIN_NID,
10205 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10206 .channel_mode = alc883_3ST_2ch_modes,
10207 .need_dac_fix = 1,
10208 .input_mux = &alc883_asus_eee1601_capture_source,
a9fd4f3f 10209 .unsol_event = alc_sku_unsol_event,
e2757d5e
KY
10210 .init_hook = alc883_eee1601_inithook,
10211 },
3ab90935
WF
10212 [ALC1200_ASUS_P5Q] = {
10213 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
10214 .init_verbs = { alc883_init_verbs },
10215 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10216 .dac_nids = alc883_dac_nids,
10217 .dig_out_nid = ALC1200_DIGOUT_NID,
10218 .dig_in_nid = ALC883_DIGIN_NID,
b25c9da1 10219 .slave_dig_outs = alc1200_slave_dig_outs,
3ab90935
WF
10220 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10221 .channel_mode = alc883_sixstack_modes,
10222 .input_mux = &alc883_capture_source,
10223 },
eb4c41d3
TS
10224 [ALC889A_MB31] = {
10225 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
10226 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
10227 alc880_gpio1_init_verbs },
10228 .adc_nids = alc883_adc_nids,
10229 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
035eb0cf 10230 .capsrc_nids = alc883_capsrc_nids,
eb4c41d3
TS
10231 .dac_nids = alc883_dac_nids,
10232 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10233 .channel_mode = alc889A_mb31_6ch_modes,
10234 .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
10235 .input_mux = &alc889A_mb31_capture_source,
10236 .dig_out_nid = ALC883_DIGOUT_NID,
10237 .unsol_event = alc889A_mb31_unsol_event,
10238 .init_hook = alc889A_mb31_automute,
10239 },
3e1647c5
GG
10240 [ALC883_SONY_VAIO_TT] = {
10241 .mixers = { alc883_vaiott_mixer },
10242 .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
10243 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10244 .dac_nids = alc883_dac_nids,
10245 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10246 .channel_mode = alc883_3ST_2ch_modes,
10247 .input_mux = &alc883_capture_source,
10248 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
10249 .setup = alc883_vaiott_setup,
10250 .init_hook = alc_automute_amp,
3e1647c5 10251 },
9c7f852e
TI
10252};
10253
10254
4953550a
TI
10255/*
10256 * Pin config fixes
10257 */
10258enum {
10259 PINFIX_ABIT_AW9D_MAX
10260};
10261
10262static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
10263 { 0x15, 0x01080104 }, /* side */
10264 { 0x16, 0x01011012 }, /* rear */
10265 { 0x17, 0x01016011 }, /* clfe */
10266 { }
10267};
10268
f8f25ba3
TI
10269static const struct alc_fixup alc882_fixups[] = {
10270 [PINFIX_ABIT_AW9D_MAX] = {
10271 .pins = alc882_abit_aw9d_pinfix
10272 },
4953550a
TI
10273};
10274
f8f25ba3 10275static struct snd_pci_quirk alc882_fixup_tbl[] = {
4953550a
TI
10276 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
10277 {}
10278};
10279
9c7f852e
TI
10280/*
10281 * BIOS auto configuration
10282 */
05f5f477
TI
10283static int alc882_auto_create_input_ctls(struct hda_codec *codec,
10284 const struct auto_pin_cfg *cfg)
10285{
10286 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
10287}
10288
4953550a 10289static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
9c7f852e 10290 hda_nid_t nid, int pin_type,
489008cd 10291 hda_nid_t dac)
9c7f852e 10292{
f12ab1e0
TI
10293 int idx;
10294
489008cd 10295 /* set as output */
f6c7e546 10296 alc_set_pin_output(codec, nid, pin_type);
489008cd
TI
10297
10298 if (dac == 0x25)
9c7f852e 10299 idx = 4;
489008cd
TI
10300 else if (dac >= 0x02 && dac <= 0x05)
10301 idx = dac - 2;
f9700d5a 10302 else
489008cd 10303 return;
9c7f852e 10304 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
9c7f852e
TI
10305}
10306
4953550a 10307static void alc882_auto_init_multi_out(struct hda_codec *codec)
9c7f852e
TI
10308{
10309 struct alc_spec *spec = codec->spec;
10310 int i;
10311
10312 for (i = 0; i <= HDA_SIDE; i++) {
f12ab1e0 10313 hda_nid_t nid = spec->autocfg.line_out_pins[i];
baba8ee9 10314 int pin_type = get_pin_type(spec->autocfg.line_out_type);
9c7f852e 10315 if (nid)
4953550a 10316 alc882_auto_set_output_and_unmute(codec, nid, pin_type,
489008cd 10317 spec->multiout.dac_nids[i]);
9c7f852e
TI
10318 }
10319}
10320
4953550a 10321static void alc882_auto_init_hp_out(struct hda_codec *codec)
9c7f852e
TI
10322{
10323 struct alc_spec *spec = codec->spec;
489008cd 10324 hda_nid_t pin, dac;
9c7f852e 10325
eb06ed8f 10326 pin = spec->autocfg.hp_pins[0];
489008cd
TI
10327 if (pin) {
10328 dac = spec->multiout.hp_nid;
10329 if (!dac)
10330 dac = spec->multiout.dac_nids[0]; /* to front */
10331 alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, dac);
10332 }
f6c7e546 10333 pin = spec->autocfg.speaker_pins[0];
489008cd
TI
10334 if (pin) {
10335 dac = spec->multiout.extra_out_nid[0];
10336 if (!dac)
10337 dac = spec->multiout.dac_nids[0]; /* to front */
10338 alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, dac);
10339 }
9c7f852e
TI
10340}
10341
4953550a 10342static void alc882_auto_init_analog_input(struct hda_codec *codec)
9c7f852e
TI
10343{
10344 struct alc_spec *spec = codec->spec;
10345 int i;
10346
10347 for (i = 0; i < AUTO_PIN_LAST; i++) {
10348 hda_nid_t nid = spec->autocfg.input_pins[i];
4953550a
TI
10349 if (!nid)
10350 continue;
0d971c9f 10351 alc_set_input_pin(codec, nid, i);
4953550a
TI
10352 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
10353 snd_hda_codec_write(codec, nid, 0,
10354 AC_VERB_SET_AMP_GAIN_MUTE,
10355 AMP_OUT_MUTE);
10356 }
10357}
10358
10359static void alc882_auto_init_input_src(struct hda_codec *codec)
10360{
10361 struct alc_spec *spec = codec->spec;
10362 int c;
10363
10364 for (c = 0; c < spec->num_adc_nids; c++) {
10365 hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
10366 hda_nid_t nid = spec->capsrc_nids[c];
10367 unsigned int mux_idx;
10368 const struct hda_input_mux *imux;
10369 int conns, mute, idx, item;
10370
10371 conns = snd_hda_get_connections(codec, nid, conn_list,
10372 ARRAY_SIZE(conn_list));
10373 if (conns < 0)
10374 continue;
10375 mux_idx = c >= spec->num_mux_defs ? 0 : c;
10376 imux = &spec->input_mux[mux_idx];
5311114d
TI
10377 if (!imux->num_items && mux_idx > 0)
10378 imux = &spec->input_mux[0];
4953550a
TI
10379 for (idx = 0; idx < conns; idx++) {
10380 /* if the current connection is the selected one,
10381 * unmute it as default - otherwise mute it
10382 */
10383 mute = AMP_IN_MUTE(idx);
10384 for (item = 0; item < imux->num_items; item++) {
10385 if (imux->items[item].index == idx) {
10386 if (spec->cur_mux[c] == item)
10387 mute = AMP_IN_UNMUTE(idx);
10388 break;
10389 }
10390 }
10391 /* check if we have a selector or mixer
10392 * we could check for the widget type instead, but
10393 * just check for Amp-In presence (in case of mixer
10394 * without amp-in there is something wrong, this
10395 * function shouldn't be used or capsrc nid is wrong)
10396 */
10397 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
9c7f852e
TI
10398 snd_hda_codec_write(codec, nid, 0,
10399 AC_VERB_SET_AMP_GAIN_MUTE,
4953550a
TI
10400 mute);
10401 else if (mute != AMP_IN_MUTE(idx))
10402 snd_hda_codec_write(codec, nid, 0,
10403 AC_VERB_SET_CONNECT_SEL,
10404 idx);
9c7f852e
TI
10405 }
10406 }
10407}
10408
4953550a
TI
10409/* add mic boosts if needed */
10410static int alc_auto_add_mic_boost(struct hda_codec *codec)
10411{
10412 struct alc_spec *spec = codec->spec;
10413 int err;
10414 hda_nid_t nid;
10415
10416 nid = spec->autocfg.input_pins[AUTO_PIN_MIC];
10417 if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10418 err = add_control(spec, ALC_CTL_WIDGET_VOL,
10419 "Mic Boost",
10420 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10421 if (err < 0)
10422 return err;
10423 }
10424 nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC];
10425 if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10426 err = add_control(spec, ALC_CTL_WIDGET_VOL,
10427 "Front Mic Boost",
10428 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10429 if (err < 0)
10430 return err;
10431 }
10432 return 0;
10433}
f511b01c 10434
9c7f852e 10435/* almost identical with ALC880 parser... */
4953550a 10436static int alc882_parse_auto_config(struct hda_codec *codec)
9c7f852e
TI
10437{
10438 struct alc_spec *spec = codec->spec;
05f5f477
TI
10439 static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
10440 int i, err;
9c7f852e 10441
05f5f477
TI
10442 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
10443 alc882_ignore);
9c7f852e
TI
10444 if (err < 0)
10445 return err;
05f5f477
TI
10446 if (!spec->autocfg.line_outs)
10447 return 0; /* can't find valid BIOS pin config */
776e184e 10448
05f5f477
TI
10449 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
10450 if (err < 0)
10451 return err;
10452 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
489008cd
TI
10453 if (err < 0)
10454 return err;
10455 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
10456 "Headphone");
05f5f477
TI
10457 if (err < 0)
10458 return err;
10459 err = alc880_auto_create_extra_out(spec,
10460 spec->autocfg.speaker_pins[0],
10461 "Speaker");
10462 if (err < 0)
10463 return err;
05f5f477 10464 err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
776e184e
TI
10465 if (err < 0)
10466 return err;
10467
05f5f477
TI
10468 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
10469
10470 /* check multiple SPDIF-out (for recent codecs) */
10471 for (i = 0; i < spec->autocfg.dig_outs; i++) {
10472 hda_nid_t dig_nid;
10473 err = snd_hda_get_connections(codec,
10474 spec->autocfg.dig_out_pins[i],
10475 &dig_nid, 1);
10476 if (err < 0)
10477 continue;
10478 if (!i)
10479 spec->multiout.dig_out_nid = dig_nid;
10480 else {
10481 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
71121d9f 10482 if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
05f5f477 10483 break;
71121d9f 10484 spec->slave_dig_outs[i - 1] = dig_nid;
05f5f477
TI
10485 }
10486 }
10487 if (spec->autocfg.dig_in_pin)
10488 spec->dig_in_nid = ALC880_DIGIN_NID;
10489
10490 if (spec->kctls.list)
10491 add_mixer(spec, spec->kctls.list);
10492
10493 add_verb(spec, alc883_auto_init_verbs);
4953550a 10494 /* if ADC 0x07 is available, initialize it, too */
05f5f477 10495 if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
4953550a 10496 add_verb(spec, alc882_adc1_init_verbs);
776e184e 10497
05f5f477
TI
10498 spec->num_mux_defs = 1;
10499 spec->input_mux = &spec->private_imux[0];
10500
6227cdce 10501 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
05f5f477
TI
10502
10503 err = alc_auto_add_mic_boost(codec);
10504 if (err < 0)
10505 return err;
61b9b9b1 10506
776e184e 10507 return 1; /* config found */
9c7f852e
TI
10508}
10509
10510/* additional initialization for auto-configuration model */
4953550a 10511static void alc882_auto_init(struct hda_codec *codec)
9c7f852e 10512{
f6c7e546 10513 struct alc_spec *spec = codec->spec;
4953550a
TI
10514 alc882_auto_init_multi_out(codec);
10515 alc882_auto_init_hp_out(codec);
10516 alc882_auto_init_analog_input(codec);
10517 alc882_auto_init_input_src(codec);
f6c7e546 10518 if (spec->unsol_event)
7fb0d78f 10519 alc_inithook(codec);
9c7f852e
TI
10520}
10521
4953550a 10522static int patch_alc882(struct hda_codec *codec)
9c7f852e
TI
10523{
10524 struct alc_spec *spec;
10525 int err, board_config;
10526
10527 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
10528 if (spec == NULL)
10529 return -ENOMEM;
10530
10531 codec->spec = spec;
10532
da00c244
KY
10533 alc_auto_parse_customize_define(codec);
10534
4953550a
TI
10535 switch (codec->vendor_id) {
10536 case 0x10ec0882:
10537 case 0x10ec0885:
10538 break;
10539 default:
10540 /* ALC883 and variants */
10541 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
10542 break;
10543 }
2c3bf9ab 10544
4953550a
TI
10545 board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
10546 alc882_models,
10547 alc882_cfg_tbl);
10548
10549 if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
10550 board_config = snd_hda_check_board_codec_sid_config(codec,
10551 ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
10552
10553 if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
9a11f1aa 10554 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4953550a
TI
10555 codec->chip_name);
10556 board_config = ALC882_AUTO;
9c7f852e
TI
10557 }
10558
7fa90e87
TI
10559 if (board_config == ALC882_AUTO)
10560 alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 1);
4953550a
TI
10561
10562 if (board_config == ALC882_AUTO) {
9c7f852e 10563 /* automatic parse from the BIOS config */
4953550a 10564 err = alc882_parse_auto_config(codec);
9c7f852e
TI
10565 if (err < 0) {
10566 alc_free(codec);
10567 return err;
f12ab1e0 10568 } else if (!err) {
9c7f852e
TI
10569 printk(KERN_INFO
10570 "hda_codec: Cannot set up configuration "
10571 "from BIOS. Using base mode...\n");
4953550a 10572 board_config = ALC882_3ST_DIG;
9c7f852e
TI
10573 }
10574 }
10575
680cd536
KK
10576 err = snd_hda_attach_beep_device(codec, 0x1);
10577 if (err < 0) {
10578 alc_free(codec);
10579 return err;
10580 }
10581
4953550a 10582 if (board_config != ALC882_AUTO)
e9c364c0 10583 setup_preset(codec, &alc882_presets[board_config]);
9c7f852e 10584
4953550a
TI
10585 spec->stream_analog_playback = &alc882_pcm_analog_playback;
10586 spec->stream_analog_capture = &alc882_pcm_analog_capture;
10587 /* FIXME: setup DAC5 */
10588 /*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
10589 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
10590
10591 spec->stream_digital_playback = &alc882_pcm_digital_playback;
10592 spec->stream_digital_capture = &alc882_pcm_digital_capture;
10593
4953550a 10594 if (!spec->adc_nids && spec->input_mux) {
d11f74c6 10595 int i, j;
4953550a
TI
10596 spec->num_adc_nids = 0;
10597 for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
d11f74c6 10598 const struct hda_input_mux *imux = spec->input_mux;
4953550a 10599 hda_nid_t cap;
d11f74c6 10600 hda_nid_t items[16];
4953550a
TI
10601 hda_nid_t nid = alc882_adc_nids[i];
10602 unsigned int wcap = get_wcaps(codec, nid);
10603 /* get type */
a22d543a 10604 wcap = get_wcaps_type(wcap);
4953550a
TI
10605 if (wcap != AC_WID_AUD_IN)
10606 continue;
10607 spec->private_adc_nids[spec->num_adc_nids] = nid;
10608 err = snd_hda_get_connections(codec, nid, &cap, 1);
10609 if (err < 0)
10610 continue;
d11f74c6
TI
10611 err = snd_hda_get_connections(codec, cap, items,
10612 ARRAY_SIZE(items));
10613 if (err < 0)
10614 continue;
10615 for (j = 0; j < imux->num_items; j++)
10616 if (imux->items[j].index >= err)
10617 break;
10618 if (j < imux->num_items)
10619 continue;
4953550a
TI
10620 spec->private_capsrc_nids[spec->num_adc_nids] = cap;
10621 spec->num_adc_nids++;
61b9b9b1 10622 }
4953550a
TI
10623 spec->adc_nids = spec->private_adc_nids;
10624 spec->capsrc_nids = spec->private_capsrc_nids;
2f893286
KY
10625 }
10626
b59bdf3b 10627 set_capture_mixer(codec);
da00c244
KY
10628
10629 if (spec->cdefine.enable_pcbeep)
10630 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
9c7f852e 10631
7fa90e87
TI
10632 if (board_config == ALC882_AUTO)
10633 alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 0);
10634
2134ea4f
TI
10635 spec->vmaster_nid = 0x0c;
10636
9c7f852e 10637 codec->patch_ops = alc_patch_ops;
4953550a
TI
10638 if (board_config == ALC882_AUTO)
10639 spec->init_hook = alc882_auto_init;
cb53c626
TI
10640#ifdef CONFIG_SND_HDA_POWER_SAVE
10641 if (!spec->loopback.amplist)
4953550a 10642 spec->loopback.amplist = alc882_loopbacks;
cb53c626 10643#endif
9c7f852e
TI
10644
10645 return 0;
10646}
10647
4953550a 10648
9c7f852e
TI
10649/*
10650 * ALC262 support
10651 */
10652
10653#define ALC262_DIGOUT_NID ALC880_DIGOUT_NID
10654#define ALC262_DIGIN_NID ALC880_DIGIN_NID
10655
10656#define alc262_dac_nids alc260_dac_nids
10657#define alc262_adc_nids alc882_adc_nids
10658#define alc262_adc_nids_alt alc882_adc_nids_alt
88c71a99
TI
10659#define alc262_capsrc_nids alc882_capsrc_nids
10660#define alc262_capsrc_nids_alt alc882_capsrc_nids_alt
9c7f852e
TI
10661
10662#define alc262_modes alc260_modes
10663#define alc262_capture_source alc882_capture_source
10664
4e555fe5
KY
10665static hda_nid_t alc262_dmic_adc_nids[1] = {
10666 /* ADC0 */
10667 0x09
10668};
10669
10670static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
10671
9c7f852e
TI
10672static struct snd_kcontrol_new alc262_base_mixer[] = {
10673 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10674 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10675 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10676 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10677 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10678 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10679 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10680 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
cc69d12d 10681 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9c7f852e
TI
10682 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10683 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
cc69d12d 10684 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
9c7f852e
TI
10685 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
10686 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10687 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
10688 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
10689 { } /* end */
10690};
10691
ce875f07
TI
10692/* update HP, line and mono-out pins according to the master switch */
10693static void alc262_hp_master_update(struct hda_codec *codec)
10694{
10695 struct alc_spec *spec = codec->spec;
10696 int val = spec->master_sw;
10697
10698 /* HP & line-out */
10699 snd_hda_codec_write_cache(codec, 0x1b, 0,
10700 AC_VERB_SET_PIN_WIDGET_CONTROL,
10701 val ? PIN_HP : 0);
10702 snd_hda_codec_write_cache(codec, 0x15, 0,
10703 AC_VERB_SET_PIN_WIDGET_CONTROL,
10704 val ? PIN_HP : 0);
10705 /* mono (speaker) depending on the HP jack sense */
10706 val = val && !spec->jack_present;
10707 snd_hda_codec_write_cache(codec, 0x16, 0,
10708 AC_VERB_SET_PIN_WIDGET_CONTROL,
10709 val ? PIN_OUT : 0);
10710}
10711
10712static void alc262_hp_bpc_automute(struct hda_codec *codec)
10713{
10714 struct alc_spec *spec = codec->spec;
864f92be
WF
10715
10716 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
ce875f07
TI
10717 alc262_hp_master_update(codec);
10718}
10719
10720static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
10721{
10722 if ((res >> 26) != ALC880_HP_EVENT)
10723 return;
10724 alc262_hp_bpc_automute(codec);
10725}
10726
10727static void alc262_hp_wildwest_automute(struct hda_codec *codec)
10728{
10729 struct alc_spec *spec = codec->spec;
864f92be
WF
10730
10731 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
ce875f07
TI
10732 alc262_hp_master_update(codec);
10733}
10734
10735static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
10736 unsigned int res)
10737{
10738 if ((res >> 26) != ALC880_HP_EVENT)
10739 return;
10740 alc262_hp_wildwest_automute(codec);
10741}
10742
b72519b5 10743#define alc262_hp_master_sw_get alc260_hp_master_sw_get
ce875f07
TI
10744
10745static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
10746 struct snd_ctl_elem_value *ucontrol)
10747{
10748 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10749 struct alc_spec *spec = codec->spec;
10750 int val = !!*ucontrol->value.integer.value;
10751
10752 if (val == spec->master_sw)
10753 return 0;
10754 spec->master_sw = val;
10755 alc262_hp_master_update(codec);
10756 return 1;
10757}
10758
b72519b5
TI
10759#define ALC262_HP_MASTER_SWITCH \
10760 { \
10761 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
10762 .name = "Master Playback Switch", \
10763 .info = snd_ctl_boolean_mono_info, \
10764 .get = alc262_hp_master_sw_get, \
10765 .put = alc262_hp_master_sw_put, \
5b0cb1d8
JK
10766 }, \
10767 { \
10768 .iface = NID_MAPPING, \
10769 .name = "Master Playback Switch", \
10770 .private_value = 0x15 | (0x16 << 8) | (0x1b << 16), \
b72519b5
TI
10771 }
10772
5b0cb1d8 10773
9c7f852e 10774static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
b72519b5 10775 ALC262_HP_MASTER_SWITCH,
9c7f852e
TI
10776 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10777 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10778 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
ce875f07
TI
10779 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10780 HDA_OUTPUT),
10781 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10782 HDA_OUTPUT),
9c7f852e
TI
10783 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10784 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
cc69d12d 10785 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9c7f852e
TI
10786 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10787 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
cc69d12d 10788 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
9c7f852e
TI
10789 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10790 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10791 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10792 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
9c7f852e
TI
10793 HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
10794 HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
10795 { } /* end */
10796};
10797
cd7509a4 10798static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
b72519b5 10799 ALC262_HP_MASTER_SWITCH,
cd7509a4
KY
10800 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10801 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10802 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10803 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
ce875f07
TI
10804 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10805 HDA_OUTPUT),
10806 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10807 HDA_OUTPUT),
cd7509a4
KY
10808 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
10809 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
cc69d12d 10810 HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
cd7509a4
KY
10811 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10812 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10813 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10814 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
cd7509a4
KY
10815 { } /* end */
10816};
10817
10818static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
10819 HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10820 HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
cc69d12d 10821 HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
cd7509a4
KY
10822 { } /* end */
10823};
10824
66d2a9d6 10825/* mute/unmute internal speaker according to the hp jack and mute state */
4f5d1706 10826static void alc262_hp_t5735_setup(struct hda_codec *codec)
66d2a9d6
KY
10827{
10828 struct alc_spec *spec = codec->spec;
66d2a9d6 10829
a9fd4f3f 10830 spec->autocfg.hp_pins[0] = 0x15;
dc99be47 10831 spec->autocfg.speaker_pins[0] = 0x14;
66d2a9d6
KY
10832}
10833
66d2a9d6 10834static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
86cd9298
TI
10835 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10836 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
66d2a9d6
KY
10837 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10838 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10839 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10840 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10841 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10842 { } /* end */
10843};
10844
10845static struct hda_verb alc262_hp_t5735_verbs[] = {
10846 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10847 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10848
10849 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
10850 { }
10851};
10852
8c427226 10853static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
f2f48e18
TI
10854 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10855 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
86cd9298
TI
10856 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
10857 HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
8c427226
KY
10858 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10859 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10860 { } /* end */
10861};
10862
10863static struct hda_verb alc262_hp_rp5700_verbs[] = {
10864 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10865 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10866 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10867 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10868 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10869 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10870 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10871 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10872 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10873 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10874 {}
10875};
10876
10877static struct hda_input_mux alc262_hp_rp5700_capture_source = {
10878 .num_items = 1,
10879 .items = {
10880 { "Line", 0x1 },
10881 },
10882};
10883
42171c17
TI
10884/* bind hp and internal speaker mute (with plug check) as master switch */
10885static void alc262_hippo_master_update(struct hda_codec *codec)
0724ea2a 10886{
42171c17
TI
10887 struct alc_spec *spec = codec->spec;
10888 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10889 hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
10890 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
10891 unsigned int mute;
0724ea2a 10892
42171c17
TI
10893 /* HP */
10894 mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
10895 snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
10896 HDA_AMP_MUTE, mute);
10897 /* mute internal speaker per jack sense */
10898 if (spec->jack_present)
10899 mute = HDA_AMP_MUTE;
10900 if (line_nid)
10901 snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
10902 HDA_AMP_MUTE, mute);
10903 if (speaker_nid && speaker_nid != line_nid)
10904 snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
0724ea2a 10905 HDA_AMP_MUTE, mute);
42171c17
TI
10906}
10907
10908#define alc262_hippo_master_sw_get alc262_hp_master_sw_get
10909
10910static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
10911 struct snd_ctl_elem_value *ucontrol)
10912{
10913 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10914 struct alc_spec *spec = codec->spec;
10915 int val = !!*ucontrol->value.integer.value;
10916
10917 if (val == spec->master_sw)
10918 return 0;
10919 spec->master_sw = val;
10920 alc262_hippo_master_update(codec);
10921 return 1;
10922}
10923
10924#define ALC262_HIPPO_MASTER_SWITCH \
10925 { \
10926 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
10927 .name = "Master Playback Switch", \
10928 .info = snd_ctl_boolean_mono_info, \
10929 .get = alc262_hippo_master_sw_get, \
10930 .put = alc262_hippo_master_sw_put, \
5b0cb1d8
JK
10931 }, \
10932 { \
10933 .iface = NID_MAPPING, \
10934 .name = "Master Playback Switch", \
10935 .subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
10936 (SUBDEV_SPEAKER(0) << 16), \
0724ea2a 10937 }
42171c17
TI
10938
10939static struct snd_kcontrol_new alc262_hippo_mixer[] = {
10940 ALC262_HIPPO_MASTER_SWITCH,
10941 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10942 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10943 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10944 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10945 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10946 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10947 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10948 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10949 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10950 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10951 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10952 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10953 { } /* end */
10954};
10955
10956static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
10957 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10958 ALC262_HIPPO_MASTER_SWITCH,
10959 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10960 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10961 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10962 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10963 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10964 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10965 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10966 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10967 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10968 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10969 { } /* end */
10970};
10971
10972/* mute/unmute internal speaker according to the hp jack and mute state */
10973static void alc262_hippo_automute(struct hda_codec *codec)
10974{
10975 struct alc_spec *spec = codec->spec;
10976 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
42171c17 10977
864f92be 10978 spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
42171c17 10979 alc262_hippo_master_update(codec);
0724ea2a 10980}
5b31954e 10981
42171c17
TI
10982static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
10983{
10984 if ((res >> 26) != ALC880_HP_EVENT)
10985 return;
10986 alc262_hippo_automute(codec);
10987}
10988
4f5d1706 10989static void alc262_hippo_setup(struct hda_codec *codec)
42171c17
TI
10990{
10991 struct alc_spec *spec = codec->spec;
10992
10993 spec->autocfg.hp_pins[0] = 0x15;
10994 spec->autocfg.speaker_pins[0] = 0x14;
42171c17
TI
10995}
10996
4f5d1706 10997static void alc262_hippo1_setup(struct hda_codec *codec)
42171c17
TI
10998{
10999 struct alc_spec *spec = codec->spec;
11000
11001 spec->autocfg.hp_pins[0] = 0x1b;
11002 spec->autocfg.speaker_pins[0] = 0x14;
42171c17
TI
11003}
11004
11005
272a527c 11006static struct snd_kcontrol_new alc262_sony_mixer[] = {
0724ea2a 11007 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
42171c17 11008 ALC262_HIPPO_MASTER_SWITCH,
272a527c
KY
11009 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11010 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11011 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11012 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11013 { } /* end */
11014};
11015
83c34218 11016static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
42171c17
TI
11017 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11018 ALC262_HIPPO_MASTER_SWITCH,
83c34218
KY
11019 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11020 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11021 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11022 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11023 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11024 { } /* end */
11025};
272a527c 11026
ba340e82
TV
11027static struct snd_kcontrol_new alc262_tyan_mixer[] = {
11028 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11029 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11030 HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
11031 HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
11032 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11033 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11034 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11035 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11036 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11037 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11038 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11039 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11040 { } /* end */
11041};
11042
11043static struct hda_verb alc262_tyan_verbs[] = {
11044 /* Headphone automute */
11045 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11046 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11047 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11048
11049 /* P11 AUX_IN, white 4-pin connector */
11050 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11051 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
11052 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
11053 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
11054
11055 {}
11056};
11057
11058/* unsolicited event for HP jack sensing */
4f5d1706 11059static void alc262_tyan_setup(struct hda_codec *codec)
ba340e82 11060{
a9fd4f3f 11061 struct alc_spec *spec = codec->spec;
ba340e82 11062
a9fd4f3f
TI
11063 spec->autocfg.hp_pins[0] = 0x1b;
11064 spec->autocfg.speaker_pins[0] = 0x15;
ba340e82
TV
11065}
11066
ba340e82 11067
9c7f852e
TI
11068#define alc262_capture_mixer alc882_capture_mixer
11069#define alc262_capture_alt_mixer alc882_capture_alt_mixer
11070
11071/*
11072 * generic initialization of ADC, input mixers and output mixers
11073 */
11074static struct hda_verb alc262_init_verbs[] = {
11075 /*
11076 * Unmute ADC0-2 and set the default input to mic-in
11077 */
11078 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11079 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11080 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11081 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11082 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11083 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11084
cb53c626 11085 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
9c7f852e 11086 * mixer widget
f12ab1e0
TI
11087 * Note: PASD motherboards uses the Line In 2 as the input for
11088 * front panel mic (mic 2)
9c7f852e
TI
11089 */
11090 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
11091 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11092 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11093 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11094 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11095 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
9c7f852e
TI
11096
11097 /*
df694daa
KY
11098 * Set up output mixers (0x0c - 0x0e)
11099 */
11100 /* set vol=0 to output mixers */
11101 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11102 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11103 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11104 /* set up input amps for analog loopback */
11105 /* Amp Indices: DAC = 0, mixer = 1 */
11106 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11107 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11108 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11109 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11110 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11111 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11112
11113 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11114 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11115 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11116 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11117 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11118 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11119
11120 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11121 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11122 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11123 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11124 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
ea1fb29a 11125
df694daa
KY
11126 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11127 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
ea1fb29a 11128
df694daa
KY
11129 /* FIXME: use matrix-type input source selection */
11130 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11131 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11132 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11133 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11134 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11135 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11136 /* Input mixer2 */
11137 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11138 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11139 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11140 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11141 /* Input mixer3 */
11142 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11143 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11144 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
f12ab1e0 11145 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
df694daa
KY
11146
11147 { }
11148};
1da177e4 11149
4e555fe5
KY
11150static struct hda_verb alc262_eapd_verbs[] = {
11151 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
11152 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
11153 { }
11154};
11155
ccc656ce
KY
11156static struct hda_verb alc262_hippo1_unsol_verbs[] = {
11157 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11158 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11159 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11160
11161 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11162 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11163 {}
11164};
11165
272a527c
KY
11166static struct hda_verb alc262_sony_unsol_verbs[] = {
11167 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11168 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11169 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, // Front Mic
11170
11171 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11172 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7b1e8795 11173 {}
272a527c
KY
11174};
11175
4e555fe5
KY
11176static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
11177 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11178 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11179 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11180 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11181 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
4e555fe5
KY
11182 { } /* end */
11183};
11184
11185static struct hda_verb alc262_toshiba_s06_verbs[] = {
11186 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11187 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11188 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11189 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11190 {0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
11191 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11192 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
11193 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11194 {}
11195};
11196
4f5d1706 11197static void alc262_toshiba_s06_setup(struct hda_codec *codec)
4e555fe5 11198{
a9fd4f3f
TI
11199 struct alc_spec *spec = codec->spec;
11200
11201 spec->autocfg.hp_pins[0] = 0x15;
11202 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
11203 spec->ext_mic.pin = 0x18;
11204 spec->ext_mic.mux_idx = 0;
11205 spec->int_mic.pin = 0x12;
11206 spec->int_mic.mux_idx = 9;
11207 spec->auto_mic = 1;
4e555fe5
KY
11208}
11209
e8f9ae2a
PT
11210/*
11211 * nec model
11212 * 0x15 = headphone
11213 * 0x16 = internal speaker
11214 * 0x18 = external mic
11215 */
11216
11217static struct snd_kcontrol_new alc262_nec_mixer[] = {
11218 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
11219 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
11220
11221 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11222 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11223 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11224
11225 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11226 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11227 { } /* end */
11228};
11229
11230static struct hda_verb alc262_nec_verbs[] = {
11231 /* Unmute Speaker */
11232 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11233
11234 /* Headphone */
11235 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11236 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11237
11238 /* External mic to headphone */
11239 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11240 /* External mic to speaker */
11241 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11242 {}
11243};
11244
834be88d
TI
11245/*
11246 * fujitsu model
5d9fab2d
TV
11247 * 0x14 = headphone/spdif-out, 0x15 = internal speaker,
11248 * 0x1b = port replicator headphone out
834be88d
TI
11249 */
11250
11251#define ALC_HP_EVENT 0x37
11252
11253static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
11254 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11255 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5d9fab2d
TV
11256 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11257 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
834be88d
TI
11258 {}
11259};
11260
0e31daf7
J
11261static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
11262 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11263 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11264 {}
11265};
11266
e2595322
DC
11267static struct hda_verb alc262_lenovo_3000_init_verbs[] = {
11268 /* Front Mic pin: input vref at 50% */
11269 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
11270 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11271 {}
11272};
11273
834be88d 11274static struct hda_input_mux alc262_fujitsu_capture_source = {
39d3ed38 11275 .num_items = 3,
834be88d
TI
11276 .items = {
11277 { "Mic", 0x0 },
39d3ed38 11278 { "Int Mic", 0x1 },
834be88d
TI
11279 { "CD", 0x4 },
11280 },
11281};
11282
9c7f852e
TI
11283static struct hda_input_mux alc262_HP_capture_source = {
11284 .num_items = 5,
11285 .items = {
11286 { "Mic", 0x0 },
accbe498 11287 { "Front Mic", 0x1 },
9c7f852e
TI
11288 { "Line", 0x2 },
11289 { "CD", 0x4 },
11290 { "AUX IN", 0x6 },
11291 },
11292};
11293
accbe498 11294static struct hda_input_mux alc262_HP_D7000_capture_source = {
11295 .num_items = 4,
11296 .items = {
11297 { "Mic", 0x0 },
11298 { "Front Mic", 0x2 },
11299 { "Line", 0x1 },
11300 { "CD", 0x4 },
11301 },
11302};
11303
ebc7a406 11304/* mute/unmute internal speaker according to the hp jacks and mute state */
834be88d
TI
11305static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
11306{
11307 struct alc_spec *spec = codec->spec;
11308 unsigned int mute;
11309
f12ab1e0 11310 if (force || !spec->sense_updated) {
864f92be
WF
11311 spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
11312 snd_hda_jack_detect(codec, 0x1b);
834be88d
TI
11313 spec->sense_updated = 1;
11314 }
ebc7a406
TI
11315 /* unmute internal speaker only if both HPs are unplugged and
11316 * master switch is on
11317 */
11318 if (spec->jack_present)
11319 mute = HDA_AMP_MUTE;
11320 else
834be88d 11321 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
ebc7a406
TI
11322 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11323 HDA_AMP_MUTE, mute);
834be88d
TI
11324}
11325
11326/* unsolicited event for HP jack sensing */
11327static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
11328 unsigned int res)
11329{
11330 if ((res >> 26) != ALC_HP_EVENT)
11331 return;
11332 alc262_fujitsu_automute(codec, 1);
11333}
11334
ebc7a406
TI
11335static void alc262_fujitsu_init_hook(struct hda_codec *codec)
11336{
11337 alc262_fujitsu_automute(codec, 1);
11338}
11339
834be88d 11340/* bind volumes of both NID 0x0c and 0x0d */
cca3b371
TI
11341static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
11342 .ops = &snd_hda_bind_vol,
11343 .values = {
11344 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
11345 HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
11346 0
11347 },
11348};
834be88d 11349
0e31daf7
J
11350/* mute/unmute internal speaker according to the hp jack and mute state */
11351static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
11352{
11353 struct alc_spec *spec = codec->spec;
11354 unsigned int mute;
11355
11356 if (force || !spec->sense_updated) {
864f92be 11357 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
0e31daf7
J
11358 spec->sense_updated = 1;
11359 }
11360 if (spec->jack_present) {
11361 /* mute internal speaker */
11362 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11363 HDA_AMP_MUTE, HDA_AMP_MUTE);
11364 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11365 HDA_AMP_MUTE, HDA_AMP_MUTE);
11366 } else {
11367 /* unmute internal speaker if necessary */
11368 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
11369 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11370 HDA_AMP_MUTE, mute);
11371 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11372 HDA_AMP_MUTE, mute);
11373 }
11374}
11375
11376/* unsolicited event for HP jack sensing */
11377static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
11378 unsigned int res)
11379{
11380 if ((res >> 26) != ALC_HP_EVENT)
11381 return;
11382 alc262_lenovo_3000_automute(codec, 1);
11383}
11384
8de56b7d
TI
11385static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
11386 int dir, int idx, long *valp)
11387{
11388 int i, change = 0;
11389
11390 for (i = 0; i < 2; i++, valp++)
11391 change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
11392 HDA_AMP_MUTE,
11393 *valp ? 0 : HDA_AMP_MUTE);
11394 return change;
11395}
11396
834be88d
TI
11397/* bind hp and internal speaker mute (with plug check) */
11398static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
11399 struct snd_ctl_elem_value *ucontrol)
11400{
11401 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11402 long *valp = ucontrol->value.integer.value;
11403 int change;
11404
8de56b7d
TI
11405 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11406 change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
82beb8fd
TI
11407 if (change)
11408 alc262_fujitsu_automute(codec, 0);
834be88d
TI
11409 return change;
11410}
11411
11412static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
cca3b371 11413 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
834be88d
TI
11414 {
11415 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11416 .name = "Master Playback Switch",
5e26dfd0 11417 .subdevice = HDA_SUBDEV_AMP_FLAG,
834be88d
TI
11418 .info = snd_hda_mixer_amp_switch_info,
11419 .get = snd_hda_mixer_amp_switch_get,
11420 .put = alc262_fujitsu_master_sw_put,
11421 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11422 },
5b0cb1d8
JK
11423 {
11424 .iface = NID_MAPPING,
11425 .name = "Master Playback Switch",
11426 .private_value = 0x1b,
11427 },
834be88d
TI
11428 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11429 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11430 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11431 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11432 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
39d3ed38
TI
11433 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11434 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11435 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
834be88d
TI
11436 { } /* end */
11437};
11438
0e31daf7
J
11439/* bind hp and internal speaker mute (with plug check) */
11440static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
11441 struct snd_ctl_elem_value *ucontrol)
11442{
11443 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11444 long *valp = ucontrol->value.integer.value;
11445 int change;
11446
8de56b7d 11447 change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
0e31daf7
J
11448 if (change)
11449 alc262_lenovo_3000_automute(codec, 0);
11450 return change;
11451}
11452
11453static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
11454 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11455 {
11456 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11457 .name = "Master Playback Switch",
5e26dfd0 11458 .subdevice = HDA_SUBDEV_AMP_FLAG,
0e31daf7
J
11459 .info = snd_hda_mixer_amp_switch_info,
11460 .get = snd_hda_mixer_amp_switch_get,
11461 .put = alc262_lenovo_3000_master_sw_put,
11462 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
11463 },
11464 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11465 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11466 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11467 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11468 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11469 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11470 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11471 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11472 { } /* end */
11473};
11474
9f99a638
HM
11475static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
11476 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
42171c17 11477 ALC262_HIPPO_MASTER_SWITCH,
9f99a638
HM
11478 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11479 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11480 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11481 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11482 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11483 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11484 { } /* end */
11485};
11486
304dcaac
TI
11487/* additional init verbs for Benq laptops */
11488static struct hda_verb alc262_EAPD_verbs[] = {
11489 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11490 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
11491 {}
11492};
11493
83c34218
KY
11494static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
11495 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11496 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11497
11498 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11499 {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
11500 {}
11501};
11502
f651b50b
TD
11503/* Samsung Q1 Ultra Vista model setup */
11504static struct snd_kcontrol_new alc262_ultra_mixer[] = {
bb9f76cd
TI
11505 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11506 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
f651b50b
TD
11507 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11508 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11509 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
bb9f76cd 11510 HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
f651b50b
TD
11511 { } /* end */
11512};
11513
11514static struct hda_verb alc262_ultra_verbs[] = {
bb9f76cd
TI
11515 /* output mixer */
11516 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11517 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11518 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11519 /* speaker */
11520 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11521 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11522 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11523 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11524 /* HP */
f651b50b 11525 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
bb9f76cd
TI
11526 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11527 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11528 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11529 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11530 /* internal mic */
11531 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
11532 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11533 /* ADC, choose mic */
11534 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11535 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11536 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11537 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11538 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11539 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11540 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11541 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11542 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11543 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
f651b50b
TD
11544 {}
11545};
11546
f651b50b
TD
11547/* mute/unmute internal speaker according to the hp jack and mute state */
11548static void alc262_ultra_automute(struct hda_codec *codec)
11549{
11550 struct alc_spec *spec = codec->spec;
11551 unsigned int mute;
f651b50b 11552
bb9f76cd
TI
11553 mute = 0;
11554 /* auto-mute only when HP is used as HP */
11555 if (!spec->cur_mux[0]) {
864f92be 11556 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
bb9f76cd
TI
11557 if (spec->jack_present)
11558 mute = HDA_AMP_MUTE;
f651b50b 11559 }
bb9f76cd
TI
11560 /* mute/unmute internal speaker */
11561 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11562 HDA_AMP_MUTE, mute);
11563 /* mute/unmute HP */
11564 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11565 HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
f651b50b
TD
11566}
11567
11568/* unsolicited event for HP jack sensing */
11569static void alc262_ultra_unsol_event(struct hda_codec *codec,
11570 unsigned int res)
11571{
11572 if ((res >> 26) != ALC880_HP_EVENT)
11573 return;
11574 alc262_ultra_automute(codec);
11575}
11576
bb9f76cd
TI
11577static struct hda_input_mux alc262_ultra_capture_source = {
11578 .num_items = 2,
11579 .items = {
11580 { "Mic", 0x1 },
11581 { "Headphone", 0x7 },
11582 },
11583};
11584
11585static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
11586 struct snd_ctl_elem_value *ucontrol)
11587{
11588 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11589 struct alc_spec *spec = codec->spec;
11590 int ret;
11591
54cbc9ab 11592 ret = alc_mux_enum_put(kcontrol, ucontrol);
bb9f76cd
TI
11593 if (!ret)
11594 return 0;
11595 /* reprogram the HP pin as mic or HP according to the input source */
11596 snd_hda_codec_write_cache(codec, 0x15, 0,
11597 AC_VERB_SET_PIN_WIDGET_CONTROL,
11598 spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
11599 alc262_ultra_automute(codec); /* mute/unmute HP */
11600 return ret;
11601}
11602
11603static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
11604 HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
11605 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
11606 {
11607 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11608 .name = "Capture Source",
54cbc9ab
TI
11609 .info = alc_mux_enum_info,
11610 .get = alc_mux_enum_get,
bb9f76cd
TI
11611 .put = alc262_ultra_mux_enum_put,
11612 },
5b0cb1d8
JK
11613 {
11614 .iface = NID_MAPPING,
11615 .name = "Capture Source",
11616 .private_value = 0x15,
11617 },
bb9f76cd
TI
11618 { } /* end */
11619};
11620
c3fc1f50
TI
11621/* We use two mixers depending on the output pin; 0x16 is a mono output
11622 * and thus it's bound with a different mixer.
11623 * This function returns which mixer amp should be used.
11624 */
11625static int alc262_check_volbit(hda_nid_t nid)
11626{
11627 if (!nid)
11628 return 0;
11629 else if (nid == 0x16)
11630 return 2;
11631 else
11632 return 1;
11633}
11634
11635static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
11636 const char *pfx, int *vbits)
11637{
c3fc1f50
TI
11638 unsigned long val;
11639 int vbit;
11640
11641 vbit = alc262_check_volbit(nid);
11642 if (!vbit)
11643 return 0;
11644 if (*vbits & vbit) /* a volume control for this mixer already there */
11645 return 0;
11646 *vbits |= vbit;
c3fc1f50
TI
11647 if (vbit == 2)
11648 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
11649 else
11650 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
0afe5f89 11651 return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, val);
c3fc1f50
TI
11652}
11653
11654static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
11655 const char *pfx)
11656{
c3fc1f50
TI
11657 unsigned long val;
11658
11659 if (!nid)
11660 return 0;
c3fc1f50
TI
11661 if (nid == 0x16)
11662 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
11663 else
11664 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
0afe5f89 11665 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val);
c3fc1f50
TI
11666}
11667
df694daa 11668/* add playback controls from the parsed DAC table */
f12ab1e0
TI
11669static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
11670 const struct auto_pin_cfg *cfg)
df694daa 11671{
c3fc1f50
TI
11672 const char *pfx;
11673 int vbits;
df694daa
KY
11674 int err;
11675
11676 spec->multiout.num_dacs = 1; /* only use one dac */
11677 spec->multiout.dac_nids = spec->private_dac_nids;
11678 spec->multiout.dac_nids[0] = 2;
11679
c3fc1f50
TI
11680 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
11681 pfx = "Master";
11682 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11683 pfx = "Speaker";
11684 else
11685 pfx = "Front";
11686 err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx);
11687 if (err < 0)
11688 return err;
11689 err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker");
11690 if (err < 0)
11691 return err;
11692 err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone");
11693 if (err < 0)
11694 return err;
df694daa 11695
c3fc1f50
TI
11696 vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
11697 alc262_check_volbit(cfg->speaker_pins[0]) |
11698 alc262_check_volbit(cfg->hp_pins[0]);
11699 if (vbits == 1 || vbits == 2)
11700 pfx = "Master"; /* only one mixer is used */
11701 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11702 pfx = "Speaker";
11703 else
11704 pfx = "Front";
11705 vbits = 0;
11706 err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits);
11707 if (err < 0)
11708 return err;
11709 err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker",
11710 &vbits);
11711 if (err < 0)
11712 return err;
11713 err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone",
11714 &vbits);
11715 if (err < 0)
11716 return err;
f12ab1e0 11717 return 0;
df694daa
KY
11718}
11719
05f5f477 11720#define alc262_auto_create_input_ctls \
eaa9b3a7 11721 alc882_auto_create_input_ctls
df694daa
KY
11722
11723/*
11724 * generic initialization of ADC, input mixers and output mixers
11725 */
11726static struct hda_verb alc262_volume_init_verbs[] = {
11727 /*
11728 * Unmute ADC0-2 and set the default input to mic-in
11729 */
11730 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11731 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11732 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11733 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11734 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11735 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11736
cb53c626 11737 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
df694daa 11738 * mixer widget
f12ab1e0
TI
11739 * Note: PASD motherboards uses the Line In 2 as the input for
11740 * front panel mic (mic 2)
df694daa
KY
11741 */
11742 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
11743 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11744 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11745 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11746 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11747 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
df694daa
KY
11748
11749 /*
11750 * Set up output mixers (0x0c - 0x0f)
11751 */
11752 /* set vol=0 to output mixers */
11753 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11754 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11755 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
ea1fb29a 11756
df694daa
KY
11757 /* set up input amps for analog loopback */
11758 /* Amp Indices: DAC = 0, mixer = 1 */
11759 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11760 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11761 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11762 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11763 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11764 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11765
11766 /* FIXME: use matrix-type input source selection */
11767 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11768 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11769 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11770 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11771 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11772 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11773 /* Input mixer2 */
11774 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11775 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11776 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11777 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11778 /* Input mixer3 */
11779 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11780 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11781 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11782 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11783
11784 { }
11785};
11786
9c7f852e
TI
11787static struct hda_verb alc262_HP_BPC_init_verbs[] = {
11788 /*
11789 * Unmute ADC0-2 and set the default input to mic-in
11790 */
11791 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11792 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11793 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11794 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11795 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11796 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11797
cb53c626 11798 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
9c7f852e 11799 * mixer widget
f12ab1e0
TI
11800 * Note: PASD motherboards uses the Line In 2 as the input for
11801 * front panel mic (mic 2)
9c7f852e
TI
11802 */
11803 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
11804 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11805 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11806 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11807 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11808 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11809 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11810 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
ea1fb29a 11811
9c7f852e
TI
11812 /*
11813 * Set up output mixers (0x0c - 0x0e)
11814 */
11815 /* set vol=0 to output mixers */
11816 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11817 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11818 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11819
11820 /* set up input amps for analog loopback */
11821 /* Amp Indices: DAC = 0, mixer = 1 */
11822 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11823 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11824 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11825 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11826 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11827 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11828
ce875f07 11829 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9c7f852e
TI
11830 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11831 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11832
11833 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11834 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11835
11836 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11837 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11838
11839 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11840 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11841 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11842 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11843 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11844
0e4835c1 11845 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
9c7f852e
TI
11846 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11847 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
0e4835c1 11848 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
9c7f852e
TI
11849 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11850 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11851
11852
11853 /* FIXME: use matrix-type input source selection */
0e4835c1
JK
11854 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
11855 /* Input mixer1: only unmute Mic */
9c7f852e 11856 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
0e4835c1
JK
11857 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11858 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11859 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11860 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11861 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11862 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11863 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11864 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
9c7f852e
TI
11865 /* Input mixer2 */
11866 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
0e4835c1
JK
11867 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11868 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11869 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11870 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11871 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11872 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11873 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11874 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
9c7f852e
TI
11875 /* Input mixer3 */
11876 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
0e4835c1
JK
11877 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11878 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11879 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11880 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11881 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11882 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11883 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11884 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
9c7f852e 11885
ce875f07
TI
11886 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11887
9c7f852e
TI
11888 { }
11889};
11890
cd7509a4
KY
11891static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
11892 /*
11893 * Unmute ADC0-2 and set the default input to mic-in
11894 */
11895 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11896 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11897 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11898 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11899 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11900 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11901
cb53c626 11902 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
cd7509a4
KY
11903 * mixer widget
11904 * Note: PASD motherboards uses the Line In 2 as the input for front
11905 * panel mic (mic 2)
11906 */
11907 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
11908 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11909 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11910 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11911 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11912 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11913 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11914 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11915 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
cd7509a4
KY
11916 /*
11917 * Set up output mixers (0x0c - 0x0e)
11918 */
11919 /* set vol=0 to output mixers */
11920 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11921 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11922 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11923
11924 /* set up input amps for analog loopback */
11925 /* Amp Indices: DAC = 0, mixer = 1 */
11926 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11927 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11928 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11929 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11930 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11931 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11932
11933
11934 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP */
11935 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Mono */
11936 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* rear MIC */
11937 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* Line in */
11938 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
11939 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Line out */
11940 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD in */
11941
11942 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11943 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11944
11945 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11946 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11947
11948 /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
11949 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11950 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11951 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
11952 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11953 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11954
11955 /* FIXME: use matrix-type input source selection */
11956 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11957 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11958 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
11959 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
11960 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
11961 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
11962 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
11963 /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11964 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
11965 /* Input mixer2 */
11966 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11967 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11968 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11969 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11970 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11971 /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11972 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11973 /* Input mixer3 */
11974 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11975 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11976 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11977 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11978 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11979 /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11980 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11981
ce875f07
TI
11982 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11983
cd7509a4
KY
11984 { }
11985};
11986
9f99a638
HM
11987static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
11988
11989 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Front Speaker */
11990 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11991 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
11992
11993 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* MIC jack */
11994 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
11995 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11996 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11997
11998 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP jack */
11999 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
12000 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
12001 {}
12002};
12003
12004
cb53c626
TI
12005#ifdef CONFIG_SND_HDA_POWER_SAVE
12006#define alc262_loopbacks alc880_loopbacks
12007#endif
12008
def319f9 12009/* pcm configuration: identical with ALC880 */
df694daa
KY
12010#define alc262_pcm_analog_playback alc880_pcm_analog_playback
12011#define alc262_pcm_analog_capture alc880_pcm_analog_capture
12012#define alc262_pcm_digital_playback alc880_pcm_digital_playback
12013#define alc262_pcm_digital_capture alc880_pcm_digital_capture
12014
12015/*
12016 * BIOS auto configuration
12017 */
12018static int alc262_parse_auto_config(struct hda_codec *codec)
12019{
12020 struct alc_spec *spec = codec->spec;
12021 int err;
12022 static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
12023
f12ab1e0
TI
12024 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12025 alc262_ignore);
12026 if (err < 0)
df694daa 12027 return err;
e64f14f4 12028 if (!spec->autocfg.line_outs) {
0852d7a6 12029 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
e64f14f4
TI
12030 spec->multiout.max_channels = 2;
12031 spec->no_analog = 1;
12032 goto dig_only;
12033 }
df694daa 12034 return 0; /* can't find valid BIOS pin config */
e64f14f4 12035 }
f12ab1e0
TI
12036 err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
12037 if (err < 0)
12038 return err;
05f5f477 12039 err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 12040 if (err < 0)
df694daa
KY
12041 return err;
12042
12043 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
12044
e64f14f4 12045 dig_only:
0852d7a6 12046 if (spec->autocfg.dig_outs) {
df694daa 12047 spec->multiout.dig_out_nid = ALC262_DIGOUT_NID;
0852d7a6 12048 spec->dig_out_type = spec->autocfg.dig_out_type[0];
e64f14f4 12049 }
df694daa
KY
12050 if (spec->autocfg.dig_in_pin)
12051 spec->dig_in_nid = ALC262_DIGIN_NID;
12052
603c4019 12053 if (spec->kctls.list)
d88897ea 12054 add_mixer(spec, spec->kctls.list);
df694daa 12055
d88897ea 12056 add_verb(spec, alc262_volume_init_verbs);
a1e8d2da 12057 spec->num_mux_defs = 1;
61b9b9b1 12058 spec->input_mux = &spec->private_imux[0];
df694daa 12059
776e184e
TI
12060 err = alc_auto_add_mic_boost(codec);
12061 if (err < 0)
12062 return err;
12063
6227cdce 12064 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4a79ba34 12065
df694daa
KY
12066 return 1;
12067}
12068
12069#define alc262_auto_init_multi_out alc882_auto_init_multi_out
12070#define alc262_auto_init_hp_out alc882_auto_init_hp_out
12071#define alc262_auto_init_analog_input alc882_auto_init_analog_input
f511b01c 12072#define alc262_auto_init_input_src alc882_auto_init_input_src
df694daa
KY
12073
12074
12075/* init callback for auto-configuration model -- overriding the default init */
ae6b813a 12076static void alc262_auto_init(struct hda_codec *codec)
df694daa 12077{
f6c7e546 12078 struct alc_spec *spec = codec->spec;
df694daa
KY
12079 alc262_auto_init_multi_out(codec);
12080 alc262_auto_init_hp_out(codec);
12081 alc262_auto_init_analog_input(codec);
f511b01c 12082 alc262_auto_init_input_src(codec);
f6c7e546 12083 if (spec->unsol_event)
7fb0d78f 12084 alc_inithook(codec);
df694daa
KY
12085}
12086
12087/*
12088 * configuration and preset
12089 */
f5fcc13c
TI
12090static const char *alc262_models[ALC262_MODEL_LAST] = {
12091 [ALC262_BASIC] = "basic",
12092 [ALC262_HIPPO] = "hippo",
12093 [ALC262_HIPPO_1] = "hippo_1",
12094 [ALC262_FUJITSU] = "fujitsu",
12095 [ALC262_HP_BPC] = "hp-bpc",
cd7509a4 12096 [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
61dc35de 12097 [ALC262_HP_TC_T5735] = "hp-tc-t5735",
8c427226 12098 [ALC262_HP_RP5700] = "hp-rp5700",
f5fcc13c 12099 [ALC262_BENQ_ED8] = "benq",
0f40502e
TI
12100 [ALC262_BENQ_T31] = "benq-t31",
12101 [ALC262_SONY_ASSAMD] = "sony-assamd",
2922c9af 12102 [ALC262_TOSHIBA_S06] = "toshiba-s06",
9f99a638 12103 [ALC262_TOSHIBA_RX1] = "toshiba-rx1",
f651b50b 12104 [ALC262_ULTRA] = "ultra",
0e31daf7 12105 [ALC262_LENOVO_3000] = "lenovo-3000",
e8f9ae2a 12106 [ALC262_NEC] = "nec",
ba340e82 12107 [ALC262_TYAN] = "tyan",
f5fcc13c
TI
12108 [ALC262_AUTO] = "auto",
12109};
12110
12111static struct snd_pci_quirk alc262_cfg_tbl[] = {
12112 SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
e8f9ae2a 12113 SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
dea0a509
TI
12114 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
12115 ALC262_HP_BPC),
12116 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
12117 ALC262_HP_BPC),
53eff7e1
TI
12118 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
12119 ALC262_HP_BPC),
cd7509a4 12120 SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
cd7509a4 12121 SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
ac3e3741 12122 SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
cd7509a4 12123 SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
ac3e3741 12124 SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
cd7509a4 12125 SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
ac3e3741 12126 SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
cd7509a4 12127 SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
ac3e3741
TI
12128 SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
12129 SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
12130 SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
66d2a9d6
KY
12131 SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
12132 ALC262_HP_TC_T5735),
8c427226 12133 SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
ac3e3741 12134 SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
f5fcc13c 12135 SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
5b31954e 12136 SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
bd6afe3f 12137 SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
376b508f 12138 SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
95491d90 12139 SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
12929bae 12140 SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
c5b5165c 12141#if 0 /* disable the quirk since model=auto works better in recent versions */
f872a919
TI
12142 SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
12143 ALC262_SONY_ASSAMD),
c5b5165c 12144#endif
36ca6e13 12145 SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
9f99a638 12146 ALC262_TOSHIBA_RX1),
80ffe869 12147 SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
ac3e3741 12148 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
3f1eeaed 12149 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
ba340e82 12150 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
dea0a509
TI
12151 SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
12152 ALC262_ULTRA),
3e420e78 12153 SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
0e31daf7 12154 SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
ac3e3741
TI
12155 SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
12156 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
12157 SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
df694daa
KY
12158 {}
12159};
12160
12161static struct alc_config_preset alc262_presets[] = {
12162 [ALC262_BASIC] = {
12163 .mixers = { alc262_base_mixer },
12164 .init_verbs = { alc262_init_verbs },
12165 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12166 .dac_nids = alc262_dac_nids,
12167 .hp_nid = 0x03,
12168 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12169 .channel_mode = alc262_modes,
a3bcba38 12170 .input_mux = &alc262_capture_source,
df694daa 12171 },
ccc656ce 12172 [ALC262_HIPPO] = {
42171c17 12173 .mixers = { alc262_hippo_mixer },
6732bd0d 12174 .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
ccc656ce
KY
12175 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12176 .dac_nids = alc262_dac_nids,
12177 .hp_nid = 0x03,
12178 .dig_out_nid = ALC262_DIGOUT_NID,
12179 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12180 .channel_mode = alc262_modes,
12181 .input_mux = &alc262_capture_source,
12182 .unsol_event = alc262_hippo_unsol_event,
4f5d1706
TI
12183 .setup = alc262_hippo_setup,
12184 .init_hook = alc262_hippo_automute,
ccc656ce
KY
12185 },
12186 [ALC262_HIPPO_1] = {
12187 .mixers = { alc262_hippo1_mixer },
12188 .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
12189 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12190 .dac_nids = alc262_dac_nids,
12191 .hp_nid = 0x02,
12192 .dig_out_nid = ALC262_DIGOUT_NID,
12193 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12194 .channel_mode = alc262_modes,
12195 .input_mux = &alc262_capture_source,
42171c17 12196 .unsol_event = alc262_hippo_unsol_event,
4f5d1706
TI
12197 .setup = alc262_hippo1_setup,
12198 .init_hook = alc262_hippo_automute,
ccc656ce 12199 },
834be88d
TI
12200 [ALC262_FUJITSU] = {
12201 .mixers = { alc262_fujitsu_mixer },
39d3ed38
TI
12202 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12203 alc262_fujitsu_unsol_verbs },
834be88d
TI
12204 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12205 .dac_nids = alc262_dac_nids,
12206 .hp_nid = 0x03,
12207 .dig_out_nid = ALC262_DIGOUT_NID,
12208 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12209 .channel_mode = alc262_modes,
12210 .input_mux = &alc262_fujitsu_capture_source,
ae6b813a 12211 .unsol_event = alc262_fujitsu_unsol_event,
ebc7a406 12212 .init_hook = alc262_fujitsu_init_hook,
834be88d 12213 },
9c7f852e
TI
12214 [ALC262_HP_BPC] = {
12215 .mixers = { alc262_HP_BPC_mixer },
12216 .init_verbs = { alc262_HP_BPC_init_verbs },
12217 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12218 .dac_nids = alc262_dac_nids,
12219 .hp_nid = 0x03,
12220 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12221 .channel_mode = alc262_modes,
12222 .input_mux = &alc262_HP_capture_source,
ce875f07
TI
12223 .unsol_event = alc262_hp_bpc_unsol_event,
12224 .init_hook = alc262_hp_bpc_automute,
f12ab1e0 12225 },
cd7509a4
KY
12226 [ALC262_HP_BPC_D7000_WF] = {
12227 .mixers = { alc262_HP_BPC_WildWest_mixer },
12228 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12229 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12230 .dac_nids = alc262_dac_nids,
12231 .hp_nid = 0x03,
12232 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12233 .channel_mode = alc262_modes,
accbe498 12234 .input_mux = &alc262_HP_D7000_capture_source,
ce875f07
TI
12235 .unsol_event = alc262_hp_wildwest_unsol_event,
12236 .init_hook = alc262_hp_wildwest_automute,
f12ab1e0 12237 },
cd7509a4
KY
12238 [ALC262_HP_BPC_D7000_WL] = {
12239 .mixers = { alc262_HP_BPC_WildWest_mixer,
12240 alc262_HP_BPC_WildWest_option_mixer },
12241 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12242 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12243 .dac_nids = alc262_dac_nids,
12244 .hp_nid = 0x03,
12245 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12246 .channel_mode = alc262_modes,
accbe498 12247 .input_mux = &alc262_HP_D7000_capture_source,
ce875f07
TI
12248 .unsol_event = alc262_hp_wildwest_unsol_event,
12249 .init_hook = alc262_hp_wildwest_automute,
f12ab1e0 12250 },
66d2a9d6
KY
12251 [ALC262_HP_TC_T5735] = {
12252 .mixers = { alc262_hp_t5735_mixer },
12253 .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
12254 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12255 .dac_nids = alc262_dac_nids,
12256 .hp_nid = 0x03,
12257 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12258 .channel_mode = alc262_modes,
12259 .input_mux = &alc262_capture_source,
dc99be47 12260 .unsol_event = alc_sku_unsol_event,
4f5d1706 12261 .setup = alc262_hp_t5735_setup,
dc99be47 12262 .init_hook = alc_inithook,
8c427226
KY
12263 },
12264 [ALC262_HP_RP5700] = {
12265 .mixers = { alc262_hp_rp5700_mixer },
12266 .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
12267 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12268 .dac_nids = alc262_dac_nids,
12269 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12270 .channel_mode = alc262_modes,
12271 .input_mux = &alc262_hp_rp5700_capture_source,
66d2a9d6 12272 },
304dcaac
TI
12273 [ALC262_BENQ_ED8] = {
12274 .mixers = { alc262_base_mixer },
12275 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
12276 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12277 .dac_nids = alc262_dac_nids,
12278 .hp_nid = 0x03,
12279 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12280 .channel_mode = alc262_modes,
12281 .input_mux = &alc262_capture_source,
f12ab1e0 12282 },
272a527c
KY
12283 [ALC262_SONY_ASSAMD] = {
12284 .mixers = { alc262_sony_mixer },
12285 .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
12286 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12287 .dac_nids = alc262_dac_nids,
12288 .hp_nid = 0x02,
12289 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12290 .channel_mode = alc262_modes,
12291 .input_mux = &alc262_capture_source,
12292 .unsol_event = alc262_hippo_unsol_event,
4f5d1706
TI
12293 .setup = alc262_hippo_setup,
12294 .init_hook = alc262_hippo_automute,
83c34218
KY
12295 },
12296 [ALC262_BENQ_T31] = {
12297 .mixers = { alc262_benq_t31_mixer },
6732bd0d
WF
12298 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
12299 alc_hp15_unsol_verbs },
83c34218
KY
12300 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12301 .dac_nids = alc262_dac_nids,
12302 .hp_nid = 0x03,
12303 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12304 .channel_mode = alc262_modes,
12305 .input_mux = &alc262_capture_source,
12306 .unsol_event = alc262_hippo_unsol_event,
4f5d1706
TI
12307 .setup = alc262_hippo_setup,
12308 .init_hook = alc262_hippo_automute,
ea1fb29a 12309 },
f651b50b 12310 [ALC262_ULTRA] = {
f9e336f6
TI
12311 .mixers = { alc262_ultra_mixer },
12312 .cap_mixer = alc262_ultra_capture_mixer,
bb9f76cd 12313 .init_verbs = { alc262_ultra_verbs },
f651b50b
TD
12314 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12315 .dac_nids = alc262_dac_nids,
f651b50b
TD
12316 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12317 .channel_mode = alc262_modes,
12318 .input_mux = &alc262_ultra_capture_source,
bb9f76cd
TI
12319 .adc_nids = alc262_adc_nids, /* ADC0 */
12320 .capsrc_nids = alc262_capsrc_nids,
12321 .num_adc_nids = 1, /* single ADC */
f651b50b
TD
12322 .unsol_event = alc262_ultra_unsol_event,
12323 .init_hook = alc262_ultra_automute,
12324 },
0e31daf7
J
12325 [ALC262_LENOVO_3000] = {
12326 .mixers = { alc262_lenovo_3000_mixer },
12327 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
e2595322
DC
12328 alc262_lenovo_3000_unsol_verbs,
12329 alc262_lenovo_3000_init_verbs },
0e31daf7
J
12330 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12331 .dac_nids = alc262_dac_nids,
12332 .hp_nid = 0x03,
12333 .dig_out_nid = ALC262_DIGOUT_NID,
12334 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12335 .channel_mode = alc262_modes,
12336 .input_mux = &alc262_fujitsu_capture_source,
12337 .unsol_event = alc262_lenovo_3000_unsol_event,
12338 },
e8f9ae2a
PT
12339 [ALC262_NEC] = {
12340 .mixers = { alc262_nec_mixer },
12341 .init_verbs = { alc262_nec_verbs },
12342 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12343 .dac_nids = alc262_dac_nids,
12344 .hp_nid = 0x03,
12345 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12346 .channel_mode = alc262_modes,
12347 .input_mux = &alc262_capture_source,
12348 },
4e555fe5
KY
12349 [ALC262_TOSHIBA_S06] = {
12350 .mixers = { alc262_toshiba_s06_mixer },
12351 .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
12352 alc262_eapd_verbs },
12353 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12354 .capsrc_nids = alc262_dmic_capsrc_nids,
12355 .dac_nids = alc262_dac_nids,
12356 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
ae14ef68 12357 .num_adc_nids = 1, /* single ADC */
4e555fe5
KY
12358 .dig_out_nid = ALC262_DIGOUT_NID,
12359 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12360 .channel_mode = alc262_modes,
4f5d1706
TI
12361 .unsol_event = alc_sku_unsol_event,
12362 .setup = alc262_toshiba_s06_setup,
12363 .init_hook = alc_inithook,
4e555fe5 12364 },
9f99a638
HM
12365 [ALC262_TOSHIBA_RX1] = {
12366 .mixers = { alc262_toshiba_rx1_mixer },
12367 .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
12368 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12369 .dac_nids = alc262_dac_nids,
12370 .hp_nid = 0x03,
12371 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12372 .channel_mode = alc262_modes,
12373 .input_mux = &alc262_capture_source,
12374 .unsol_event = alc262_hippo_unsol_event,
4f5d1706
TI
12375 .setup = alc262_hippo_setup,
12376 .init_hook = alc262_hippo_automute,
9f99a638 12377 },
ba340e82
TV
12378 [ALC262_TYAN] = {
12379 .mixers = { alc262_tyan_mixer },
12380 .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
12381 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12382 .dac_nids = alc262_dac_nids,
12383 .hp_nid = 0x02,
12384 .dig_out_nid = ALC262_DIGOUT_NID,
12385 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12386 .channel_mode = alc262_modes,
12387 .input_mux = &alc262_capture_source,
a9fd4f3f 12388 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
12389 .setup = alc262_tyan_setup,
12390 .init_hook = alc_automute_amp,
ba340e82 12391 },
df694daa
KY
12392};
12393
12394static int patch_alc262(struct hda_codec *codec)
12395{
12396 struct alc_spec *spec;
12397 int board_config;
12398 int err;
12399
dc041e0b 12400 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
df694daa
KY
12401 if (spec == NULL)
12402 return -ENOMEM;
12403
12404 codec->spec = spec;
12405#if 0
f12ab1e0
TI
12406 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is
12407 * under-run
12408 */
df694daa
KY
12409 {
12410 int tmp;
12411 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12412 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
12413 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12414 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
12415 }
12416#endif
da00c244 12417 alc_auto_parse_customize_define(codec);
df694daa 12418
2c3bf9ab
TI
12419 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
12420
f5fcc13c
TI
12421 board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
12422 alc262_models,
12423 alc262_cfg_tbl);
cd7509a4 12424
f5fcc13c 12425 if (board_config < 0) {
9a11f1aa
TI
12426 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12427 codec->chip_name);
df694daa
KY
12428 board_config = ALC262_AUTO;
12429 }
12430
12431 if (board_config == ALC262_AUTO) {
12432 /* automatic parse from the BIOS config */
12433 err = alc262_parse_auto_config(codec);
12434 if (err < 0) {
12435 alc_free(codec);
12436 return err;
f12ab1e0 12437 } else if (!err) {
9c7f852e
TI
12438 printk(KERN_INFO
12439 "hda_codec: Cannot set up configuration "
12440 "from BIOS. Using base mode...\n");
df694daa
KY
12441 board_config = ALC262_BASIC;
12442 }
12443 }
12444
07eba61d
TI
12445 if (!spec->no_analog) {
12446 err = snd_hda_attach_beep_device(codec, 0x1);
12447 if (err < 0) {
12448 alc_free(codec);
12449 return err;
12450 }
680cd536
KK
12451 }
12452
df694daa 12453 if (board_config != ALC262_AUTO)
e9c364c0 12454 setup_preset(codec, &alc262_presets[board_config]);
df694daa 12455
df694daa
KY
12456 spec->stream_analog_playback = &alc262_pcm_analog_playback;
12457 spec->stream_analog_capture = &alc262_pcm_analog_capture;
ea1fb29a 12458
df694daa
KY
12459 spec->stream_digital_playback = &alc262_pcm_digital_playback;
12460 spec->stream_digital_capture = &alc262_pcm_digital_capture;
12461
f12ab1e0 12462 if (!spec->adc_nids && spec->input_mux) {
8c927b4a
TI
12463 int i;
12464 /* check whether the digital-mic has to be supported */
12465 for (i = 0; i < spec->input_mux->num_items; i++) {
12466 if (spec->input_mux->items[i].index >= 9)
12467 break;
12468 }
12469 if (i < spec->input_mux->num_items) {
12470 /* use only ADC0 */
12471 spec->adc_nids = alc262_dmic_adc_nids;
12472 spec->num_adc_nids = 1;
12473 spec->capsrc_nids = alc262_dmic_capsrc_nids;
df694daa 12474 } else {
8c927b4a
TI
12475 /* all analog inputs */
12476 /* check whether NID 0x07 is valid */
12477 unsigned int wcap = get_wcaps(codec, 0x07);
12478
12479 /* get type */
a22d543a 12480 wcap = get_wcaps_type(wcap);
8c927b4a
TI
12481 if (wcap != AC_WID_AUD_IN) {
12482 spec->adc_nids = alc262_adc_nids_alt;
12483 spec->num_adc_nids =
12484 ARRAY_SIZE(alc262_adc_nids_alt);
12485 spec->capsrc_nids = alc262_capsrc_nids_alt;
12486 } else {
12487 spec->adc_nids = alc262_adc_nids;
12488 spec->num_adc_nids =
12489 ARRAY_SIZE(alc262_adc_nids);
12490 spec->capsrc_nids = alc262_capsrc_nids;
12491 }
df694daa
KY
12492 }
12493 }
e64f14f4 12494 if (!spec->cap_mixer && !spec->no_analog)
b59bdf3b 12495 set_capture_mixer(codec);
da00c244 12496 if (!spec->no_analog && spec->cdefine.enable_pcbeep)
07eba61d 12497 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
df694daa 12498
2134ea4f
TI
12499 spec->vmaster_nid = 0x0c;
12500
df694daa
KY
12501 codec->patch_ops = alc_patch_ops;
12502 if (board_config == ALC262_AUTO)
ae6b813a 12503 spec->init_hook = alc262_auto_init;
cb53c626
TI
12504#ifdef CONFIG_SND_HDA_POWER_SAVE
12505 if (!spec->loopback.amplist)
12506 spec->loopback.amplist = alc262_loopbacks;
12507#endif
ea1fb29a 12508
df694daa
KY
12509 return 0;
12510}
12511
a361d84b
KY
12512/*
12513 * ALC268 channel source setting (2 channel)
12514 */
12515#define ALC268_DIGOUT_NID ALC880_DIGOUT_NID
12516#define alc268_modes alc260_modes
ea1fb29a 12517
a361d84b
KY
12518static hda_nid_t alc268_dac_nids[2] = {
12519 /* front, hp */
12520 0x02, 0x03
12521};
12522
12523static hda_nid_t alc268_adc_nids[2] = {
12524 /* ADC0-1 */
12525 0x08, 0x07
12526};
12527
12528static hda_nid_t alc268_adc_nids_alt[1] = {
12529 /* ADC0 */
12530 0x08
12531};
12532
e1406348
TI
12533static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
12534
a361d84b
KY
12535static struct snd_kcontrol_new alc268_base_mixer[] = {
12536 /* output mixer control */
12537 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12538 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12539 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12540 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
33bf17ab
TI
12541 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12542 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12543 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
a361d84b
KY
12544 { }
12545};
12546
42171c17
TI
12547static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
12548 /* output mixer control */
12549 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12550 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12551 ALC262_HIPPO_MASTER_SWITCH,
12552 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12553 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12554 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12555 { }
12556};
12557
aef9d318
TI
12558/* bind Beep switches of both NID 0x0f and 0x10 */
12559static struct hda_bind_ctls alc268_bind_beep_sw = {
12560 .ops = &snd_hda_bind_sw,
12561 .values = {
12562 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
12563 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
12564 0
12565 },
12566};
12567
12568static struct snd_kcontrol_new alc268_beep_mixer[] = {
12569 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
12570 HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
12571 { }
12572};
12573
d1a991a6
KY
12574static struct hda_verb alc268_eapd_verbs[] = {
12575 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
12576 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
12577 { }
12578};
12579
d273809e 12580/* Toshiba specific */
d273809e
TI
12581static struct hda_verb alc268_toshiba_verbs[] = {
12582 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12583 { } /* end */
12584};
12585
12586/* Acer specific */
889c4395 12587/* bind volumes of both NID 0x02 and 0x03 */
6bc96857
TI
12588static struct hda_bind_ctls alc268_acer_bind_master_vol = {
12589 .ops = &snd_hda_bind_vol,
12590 .values = {
12591 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
12592 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
12593 0
12594 },
12595};
12596
889c4395
TI
12597/* mute/unmute internal speaker according to the hp jack and mute state */
12598static void alc268_acer_automute(struct hda_codec *codec, int force)
12599{
12600 struct alc_spec *spec = codec->spec;
12601 unsigned int mute;
12602
12603 if (force || !spec->sense_updated) {
864f92be 12604 spec->jack_present = snd_hda_jack_detect(codec, 0x14);
889c4395
TI
12605 spec->sense_updated = 1;
12606 }
12607 if (spec->jack_present)
12608 mute = HDA_AMP_MUTE; /* mute internal speaker */
12609 else /* unmute internal speaker if necessary */
12610 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
12611 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
12612 HDA_AMP_MUTE, mute);
12613}
12614
12615
12616/* bind hp and internal speaker mute (with plug check) */
12617static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
12618 struct snd_ctl_elem_value *ucontrol)
12619{
12620 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
12621 long *valp = ucontrol->value.integer.value;
12622 int change;
12623
8de56b7d 12624 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
889c4395
TI
12625 if (change)
12626 alc268_acer_automute(codec, 0);
12627 return change;
12628}
d273809e 12629
8ef355da
KY
12630static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
12631 /* output mixer control */
12632 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12633 {
12634 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12635 .name = "Master Playback Switch",
5e26dfd0 12636 .subdevice = HDA_SUBDEV_AMP_FLAG,
8ef355da
KY
12637 .info = snd_hda_mixer_amp_switch_info,
12638 .get = snd_hda_mixer_amp_switch_get,
12639 .put = alc268_acer_master_sw_put,
12640 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12641 },
12642 HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
12643 { }
12644};
12645
d273809e
TI
12646static struct snd_kcontrol_new alc268_acer_mixer[] = {
12647 /* output mixer control */
12648 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12649 {
12650 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12651 .name = "Master Playback Switch",
5e26dfd0 12652 .subdevice = HDA_SUBDEV_AMP_FLAG,
d273809e
TI
12653 .info = snd_hda_mixer_amp_switch_info,
12654 .get = snd_hda_mixer_amp_switch_get,
12655 .put = alc268_acer_master_sw_put,
12656 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12657 },
33bf17ab
TI
12658 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12659 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12660 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
d273809e
TI
12661 { }
12662};
12663
c238b4f4
TI
12664static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
12665 /* output mixer control */
12666 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12667 {
12668 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12669 .name = "Master Playback Switch",
5e26dfd0 12670 .subdevice = HDA_SUBDEV_AMP_FLAG,
c238b4f4
TI
12671 .info = snd_hda_mixer_amp_switch_info,
12672 .get = snd_hda_mixer_amp_switch_get,
12673 .put = alc268_acer_master_sw_put,
12674 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12675 },
12676 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12677 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12678 { }
12679};
12680
8ef355da
KY
12681static struct hda_verb alc268_acer_aspire_one_verbs[] = {
12682 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12683 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12684 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12685 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12686 {0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
12687 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
12688 { }
12689};
12690
d273809e 12691static struct hda_verb alc268_acer_verbs[] = {
0ccb541c
TI
12692 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
12693 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
d273809e
TI
12694 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12695 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
0ccb541c
TI
12696 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12697 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
d273809e
TI
12698 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12699 { }
12700};
12701
12702/* unsolicited event for HP jack sensing */
42171c17 12703#define alc268_toshiba_unsol_event alc262_hippo_unsol_event
4f5d1706
TI
12704#define alc268_toshiba_setup alc262_hippo_setup
12705#define alc268_toshiba_automute alc262_hippo_automute
d273809e
TI
12706
12707static void alc268_acer_unsol_event(struct hda_codec *codec,
12708 unsigned int res)
12709{
889c4395 12710 if ((res >> 26) != ALC880_HP_EVENT)
d273809e
TI
12711 return;
12712 alc268_acer_automute(codec, 1);
12713}
12714
889c4395
TI
12715static void alc268_acer_init_hook(struct hda_codec *codec)
12716{
12717 alc268_acer_automute(codec, 1);
12718}
12719
8ef355da
KY
12720/* toggle speaker-output according to the hp-jack state */
12721static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
12722{
12723 unsigned int present;
12724 unsigned char bits;
12725
864f92be 12726 present = snd_hda_jack_detect(codec, 0x15);
5dbd5ec6 12727 bits = present ? HDA_AMP_MUTE : 0;
8ef355da 12728 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
5dbd5ec6 12729 HDA_AMP_MUTE, bits);
8ef355da 12730 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
5dbd5ec6 12731 HDA_AMP_MUTE, bits);
8ef355da
KY
12732}
12733
8ef355da
KY
12734static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
12735 unsigned int res)
12736{
4f5d1706
TI
12737 switch (res >> 26) {
12738 case ALC880_HP_EVENT:
8ef355da 12739 alc268_aspire_one_speaker_automute(codec);
4f5d1706
TI
12740 break;
12741 case ALC880_MIC_EVENT:
12742 alc_mic_automute(codec);
12743 break;
12744 }
12745}
12746
12747static void alc268_acer_lc_setup(struct hda_codec *codec)
12748{
12749 struct alc_spec *spec = codec->spec;
12750 spec->ext_mic.pin = 0x18;
12751 spec->ext_mic.mux_idx = 0;
12752 spec->int_mic.pin = 0x12;
12753 spec->int_mic.mux_idx = 6;
12754 spec->auto_mic = 1;
8ef355da
KY
12755}
12756
12757static void alc268_acer_lc_init_hook(struct hda_codec *codec)
12758{
12759 alc268_aspire_one_speaker_automute(codec);
4f5d1706 12760 alc_mic_automute(codec);
8ef355da
KY
12761}
12762
3866f0b0
TI
12763static struct snd_kcontrol_new alc268_dell_mixer[] = {
12764 /* output mixer control */
12765 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12766 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12767 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12768 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12769 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12770 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12771 { }
12772};
12773
12774static struct hda_verb alc268_dell_verbs[] = {
12775 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12776 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12777 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
4f5d1706 12778 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
3866f0b0
TI
12779 { }
12780};
12781
12782/* mute/unmute internal speaker according to the hp jack and mute state */
4f5d1706 12783static void alc268_dell_setup(struct hda_codec *codec)
3866f0b0 12784{
a9fd4f3f 12785 struct alc_spec *spec = codec->spec;
3866f0b0 12786
a9fd4f3f
TI
12787 spec->autocfg.hp_pins[0] = 0x15;
12788 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
12789 spec->ext_mic.pin = 0x18;
12790 spec->ext_mic.mux_idx = 0;
12791 spec->int_mic.pin = 0x19;
12792 spec->int_mic.mux_idx = 1;
12793 spec->auto_mic = 1;
3866f0b0
TI
12794}
12795
eb5a6621
HRK
12796static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
12797 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12798 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12799 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12800 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12801 HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12802 HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
12803 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
12804 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
12805 { }
12806};
12807
12808static struct hda_verb alc267_quanta_il1_verbs[] = {
12809 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12810 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12811 { }
12812};
12813
4f5d1706 12814static void alc267_quanta_il1_setup(struct hda_codec *codec)
eb5a6621 12815{
a9fd4f3f 12816 struct alc_spec *spec = codec->spec;
a9fd4f3f
TI
12817 spec->autocfg.hp_pins[0] = 0x15;
12818 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
12819 spec->ext_mic.pin = 0x18;
12820 spec->ext_mic.mux_idx = 0;
12821 spec->int_mic.pin = 0x19;
12822 spec->int_mic.mux_idx = 1;
12823 spec->auto_mic = 1;
eb5a6621
HRK
12824}
12825
a361d84b
KY
12826/*
12827 * generic initialization of ADC, input mixers and output mixers
12828 */
12829static struct hda_verb alc268_base_init_verbs[] = {
12830 /* Unmute DAC0-1 and set vol = 0 */
12831 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
a361d84b 12832 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
a361d84b
KY
12833
12834 /*
12835 * Set up output mixers (0x0c - 0x0e)
12836 */
12837 /* set vol=0 to output mixers */
12838 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
a361d84b
KY
12839 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
12840
12841 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12842 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12843
12844 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12845 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
12846 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12847 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12848 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12849 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12850 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12851 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12852
12853 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12854 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12855 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12856 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
a361d84b 12857 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
aef9d318
TI
12858
12859 /* set PCBEEP vol = 0, mute connections */
12860 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12861 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12862 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
a361d84b 12863
a9b3aa8a 12864 /* Unmute Selector 23h,24h and set the default input to mic-in */
ea1fb29a 12865
a9b3aa8a
JZ
12866 {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
12867 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12868 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
12869 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
a361d84b 12870
a361d84b
KY
12871 { }
12872};
12873
12874/*
12875 * generic initialization of ADC, input mixers and output mixers
12876 */
12877static struct hda_verb alc268_volume_init_verbs[] = {
12878 /* set output DAC */
4cfb91c6
TI
12879 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12880 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
a361d84b
KY
12881
12882 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12883 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12884 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12885 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12886 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12887
a361d84b 12888 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
a361d84b
KY
12889 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12890 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12891
12892 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
a361d84b 12893 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
a361d84b 12894
aef9d318
TI
12895 /* set PCBEEP vol = 0, mute connections */
12896 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12897 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12898 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
a361d84b
KY
12899
12900 { }
12901};
12902
fdbc6626
TI
12903static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
12904 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12905 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12906 { } /* end */
12907};
12908
a361d84b
KY
12909static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
12910 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12911 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
fdbc6626 12912 _DEFINE_CAPSRC(1),
a361d84b
KY
12913 { } /* end */
12914};
12915
12916static struct snd_kcontrol_new alc268_capture_mixer[] = {
12917 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12918 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12919 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
12920 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
fdbc6626 12921 _DEFINE_CAPSRC(2),
a361d84b
KY
12922 { } /* end */
12923};
12924
12925static struct hda_input_mux alc268_capture_source = {
12926 .num_items = 4,
12927 .items = {
12928 { "Mic", 0x0 },
12929 { "Front Mic", 0x1 },
12930 { "Line", 0x2 },
12931 { "CD", 0x3 },
12932 },
12933};
12934
0ccb541c 12935static struct hda_input_mux alc268_acer_capture_source = {
c238b4f4
TI
12936 .num_items = 3,
12937 .items = {
12938 { "Mic", 0x0 },
12939 { "Internal Mic", 0x1 },
12940 { "Line", 0x2 },
12941 },
12942};
12943
12944static struct hda_input_mux alc268_acer_dmic_capture_source = {
0ccb541c
TI
12945 .num_items = 3,
12946 .items = {
12947 { "Mic", 0x0 },
12948 { "Internal Mic", 0x6 },
12949 { "Line", 0x2 },
12950 },
12951};
12952
86c53bd2
JW
12953#ifdef CONFIG_SND_DEBUG
12954static struct snd_kcontrol_new alc268_test_mixer[] = {
86c53bd2
JW
12955 /* Volume widgets */
12956 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12957 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12958 HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
12959 HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
12960 HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
12961 HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
12962 HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
12963 HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
12964 HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
12965 HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
12966 HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
12967 HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
12968 HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
f0747ee6
TI
12969 /* The below appears problematic on some hardwares */
12970 /*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
86c53bd2
JW
12971 HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12972 HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
12973 HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
12974 HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
12975
12976 /* Modes for retasking pin widgets */
12977 ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
12978 ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
12979 ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
12980 ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
12981
12982 /* Controls for GPIO pins, assuming they are configured as outputs */
12983 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
12984 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
12985 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
12986 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
12987
12988 /* Switches to allow the digital SPDIF output pin to be enabled.
12989 * The ALC268 does not have an SPDIF input.
12990 */
12991 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
12992
12993 /* A switch allowing EAPD to be enabled. Some laptops seem to use
12994 * this output to turn on an external amplifier.
12995 */
12996 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
12997 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
12998
12999 { } /* end */
13000};
13001#endif
13002
a361d84b
KY
13003/* create input playback/capture controls for the given pin */
13004static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
13005 const char *ctlname, int idx)
13006{
3f3b7c1a 13007 hda_nid_t dac;
a361d84b
KY
13008 int err;
13009
3f3b7c1a
TI
13010 switch (nid) {
13011 case 0x14:
13012 case 0x16:
13013 dac = 0x02;
13014 break;
13015 case 0x15:
531d8791 13016 case 0x21: /* ALC269vb has this pin, too */
3f3b7c1a
TI
13017 dac = 0x03;
13018 break;
13019 default:
13020 return 0;
13021 }
13022 if (spec->multiout.dac_nids[0] != dac &&
13023 spec->multiout.dac_nids[1] != dac) {
0afe5f89 13024 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
3f3b7c1a 13025 HDA_COMPOSE_AMP_VAL(dac, 3, idx,
a361d84b
KY
13026 HDA_OUTPUT));
13027 if (err < 0)
13028 return err;
3f3b7c1a
TI
13029 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
13030 }
13031
3f3b7c1a 13032 if (nid != 0x16)
0afe5f89 13033 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
a361d84b 13034 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
3f3b7c1a 13035 else /* mono */
0afe5f89 13036 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
3f3b7c1a 13037 HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
a361d84b
KY
13038 if (err < 0)
13039 return err;
13040 return 0;
13041}
13042
13043/* add playback controls from the parsed DAC table */
13044static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
13045 const struct auto_pin_cfg *cfg)
13046{
13047 hda_nid_t nid;
13048 int err;
13049
a361d84b 13050 spec->multiout.dac_nids = spec->private_dac_nids;
a361d84b
KY
13051
13052 nid = cfg->line_out_pins[0];
3f3b7c1a
TI
13053 if (nid) {
13054 const char *name;
13055 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
13056 name = "Speaker";
13057 else
13058 name = "Front";
13059 err = alc268_new_analog_output(spec, nid, name, 0);
13060 if (err < 0)
13061 return err;
13062 }
a361d84b
KY
13063
13064 nid = cfg->speaker_pins[0];
13065 if (nid == 0x1d) {
0afe5f89 13066 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
a361d84b
KY
13067 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
13068 if (err < 0)
13069 return err;
3f3b7c1a
TI
13070 } else {
13071 err = alc268_new_analog_output(spec, nid, "Speaker", 0);
13072 if (err < 0)
13073 return err;
a361d84b
KY
13074 }
13075 nid = cfg->hp_pins[0];
3f3b7c1a
TI
13076 if (nid) {
13077 err = alc268_new_analog_output(spec, nid, "Headphone", 0);
13078 if (err < 0)
13079 return err;
13080 }
a361d84b
KY
13081
13082 nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
13083 if (nid == 0x16) {
0afe5f89 13084 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
3f3b7c1a 13085 HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
a361d84b
KY
13086 if (err < 0)
13087 return err;
13088 }
ea1fb29a 13089 return 0;
a361d84b
KY
13090}
13091
13092/* create playback/capture controls for input pins */
05f5f477 13093static int alc268_auto_create_input_ctls(struct hda_codec *codec,
a361d84b
KY
13094 const struct auto_pin_cfg *cfg)
13095{
05f5f477 13096 return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
a361d84b
KY
13097}
13098
e9af4f36
TI
13099static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
13100 hda_nid_t nid, int pin_type)
13101{
13102 int idx;
13103
13104 alc_set_pin_output(codec, nid, pin_type);
13105 if (nid == 0x14 || nid == 0x16)
13106 idx = 0;
13107 else
13108 idx = 1;
13109 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
13110}
13111
13112static void alc268_auto_init_multi_out(struct hda_codec *codec)
13113{
13114 struct alc_spec *spec = codec->spec;
13115 hda_nid_t nid = spec->autocfg.line_out_pins[0];
13116 if (nid) {
13117 int pin_type = get_pin_type(spec->autocfg.line_out_type);
13118 alc268_auto_set_output_and_unmute(codec, nid, pin_type);
13119 }
13120}
13121
13122static void alc268_auto_init_hp_out(struct hda_codec *codec)
13123{
13124 struct alc_spec *spec = codec->spec;
13125 hda_nid_t pin;
13126
13127 pin = spec->autocfg.hp_pins[0];
13128 if (pin)
13129 alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
13130 pin = spec->autocfg.speaker_pins[0];
13131 if (pin)
13132 alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
13133}
13134
a361d84b
KY
13135static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
13136{
13137 struct alc_spec *spec = codec->spec;
13138 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
13139 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
13140 hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
13141 unsigned int dac_vol1, dac_vol2;
13142
e9af4f36 13143 if (line_nid == 0x1d || speaker_nid == 0x1d) {
a361d84b
KY
13144 snd_hda_codec_write(codec, speaker_nid, 0,
13145 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
e9af4f36 13146 /* mute mixer inputs from 0x1d */
a361d84b
KY
13147 snd_hda_codec_write(codec, 0x0f, 0,
13148 AC_VERB_SET_AMP_GAIN_MUTE,
13149 AMP_IN_UNMUTE(1));
13150 snd_hda_codec_write(codec, 0x10, 0,
13151 AC_VERB_SET_AMP_GAIN_MUTE,
13152 AMP_IN_UNMUTE(1));
13153 } else {
e9af4f36 13154 /* unmute mixer inputs from 0x1d */
a361d84b
KY
13155 snd_hda_codec_write(codec, 0x0f, 0,
13156 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13157 snd_hda_codec_write(codec, 0x10, 0,
13158 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13159 }
13160
13161 dac_vol1 = dac_vol2 = 0xb000 | 0x40; /* set max volume */
ea1fb29a 13162 if (line_nid == 0x14)
a361d84b
KY
13163 dac_vol2 = AMP_OUT_ZERO;
13164 else if (line_nid == 0x15)
13165 dac_vol1 = AMP_OUT_ZERO;
ea1fb29a 13166 if (hp_nid == 0x14)
a361d84b
KY
13167 dac_vol2 = AMP_OUT_ZERO;
13168 else if (hp_nid == 0x15)
13169 dac_vol1 = AMP_OUT_ZERO;
13170 if (line_nid != 0x16 || hp_nid != 0x16 ||
13171 spec->autocfg.line_out_pins[1] != 0x16 ||
13172 spec->autocfg.line_out_pins[2] != 0x16)
13173 dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
13174
13175 snd_hda_codec_write(codec, 0x02, 0,
13176 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
13177 snd_hda_codec_write(codec, 0x03, 0,
13178 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
13179}
13180
def319f9 13181/* pcm configuration: identical with ALC880 */
a361d84b
KY
13182#define alc268_pcm_analog_playback alc880_pcm_analog_playback
13183#define alc268_pcm_analog_capture alc880_pcm_analog_capture
6330079f 13184#define alc268_pcm_analog_alt_capture alc880_pcm_analog_alt_capture
a361d84b
KY
13185#define alc268_pcm_digital_playback alc880_pcm_digital_playback
13186
13187/*
13188 * BIOS auto configuration
13189 */
13190static int alc268_parse_auto_config(struct hda_codec *codec)
13191{
13192 struct alc_spec *spec = codec->spec;
13193 int err;
13194 static hda_nid_t alc268_ignore[] = { 0 };
13195
13196 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13197 alc268_ignore);
13198 if (err < 0)
13199 return err;
7e0e44d4
TI
13200 if (!spec->autocfg.line_outs) {
13201 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
13202 spec->multiout.max_channels = 2;
13203 spec->no_analog = 1;
13204 goto dig_only;
13205 }
a361d84b 13206 return 0; /* can't find valid BIOS pin config */
7e0e44d4 13207 }
a361d84b
KY
13208 err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
13209 if (err < 0)
13210 return err;
05f5f477 13211 err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
a361d84b
KY
13212 if (err < 0)
13213 return err;
13214
13215 spec->multiout.max_channels = 2;
13216
7e0e44d4 13217 dig_only:
a361d84b 13218 /* digital only support output */
7e0e44d4 13219 if (spec->autocfg.dig_outs) {
a361d84b 13220 spec->multiout.dig_out_nid = ALC268_DIGOUT_NID;
7e0e44d4
TI
13221 spec->dig_out_type = spec->autocfg.dig_out_type[0];
13222 }
603c4019 13223 if (spec->kctls.list)
d88897ea 13224 add_mixer(spec, spec->kctls.list);
a361d84b 13225
892981ff 13226 if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
d88897ea 13227 add_mixer(spec, alc268_beep_mixer);
aef9d318 13228
d88897ea 13229 add_verb(spec, alc268_volume_init_verbs);
5908589f 13230 spec->num_mux_defs = 2;
61b9b9b1 13231 spec->input_mux = &spec->private_imux[0];
a361d84b 13232
776e184e
TI
13233 err = alc_auto_add_mic_boost(codec);
13234 if (err < 0)
13235 return err;
13236
6227cdce 13237 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
1d955ebd 13238
a361d84b
KY
13239 return 1;
13240}
13241
a361d84b
KY
13242#define alc268_auto_init_analog_input alc882_auto_init_analog_input
13243
13244/* init callback for auto-configuration model -- overriding the default init */
13245static void alc268_auto_init(struct hda_codec *codec)
13246{
f6c7e546 13247 struct alc_spec *spec = codec->spec;
a361d84b
KY
13248 alc268_auto_init_multi_out(codec);
13249 alc268_auto_init_hp_out(codec);
13250 alc268_auto_init_mono_speaker_out(codec);
13251 alc268_auto_init_analog_input(codec);
f6c7e546 13252 if (spec->unsol_event)
7fb0d78f 13253 alc_inithook(codec);
a361d84b
KY
13254}
13255
13256/*
13257 * configuration and preset
13258 */
13259static const char *alc268_models[ALC268_MODEL_LAST] = {
eb5a6621 13260 [ALC267_QUANTA_IL1] = "quanta-il1",
a361d84b 13261 [ALC268_3ST] = "3stack",
983f8ae4 13262 [ALC268_TOSHIBA] = "toshiba",
d273809e 13263 [ALC268_ACER] = "acer",
c238b4f4 13264 [ALC268_ACER_DMIC] = "acer-dmic",
8ef355da 13265 [ALC268_ACER_ASPIRE_ONE] = "acer-aspire",
3866f0b0 13266 [ALC268_DELL] = "dell",
f12462c5 13267 [ALC268_ZEPTO] = "zepto",
86c53bd2
JW
13268#ifdef CONFIG_SND_DEBUG
13269 [ALC268_TEST] = "test",
13270#endif
a361d84b
KY
13271 [ALC268_AUTO] = "auto",
13272};
13273
13274static struct snd_pci_quirk alc268_cfg_tbl[] = {
a0b8f7d8 13275 SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
ac3e3741 13276 SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
dafc8357 13277 SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
ac3e3741 13278 SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
29a52c24 13279 SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
8ef355da
KY
13280 SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
13281 ALC268_ACER_ASPIRE_ONE),
3866f0b0 13282 SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
a1bf8088
DC
13283 SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
13284 "Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
33d78674
TI
13285 /* almost compatible with toshiba but with optional digital outs;
13286 * auto-probing seems working fine
13287 */
8871e5b9 13288 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
33d78674 13289 ALC268_AUTO),
a361d84b 13290 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
8871e5b9 13291 SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
378bd6a5 13292 SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
b875bf3a 13293 SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
eb5a6621 13294 SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
8871e5b9 13295 SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL),
a361d84b
KY
13296 {}
13297};
13298
3abf2f36
TI
13299/* Toshiba laptops have no unique PCI SSID but only codec SSID */
13300static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
13301 SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
13302 SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
13303 SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
13304 ALC268_TOSHIBA),
13305 {}
13306};
13307
a361d84b 13308static struct alc_config_preset alc268_presets[] = {
eb5a6621 13309 [ALC267_QUANTA_IL1] = {
fdbc6626
TI
13310 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
13311 alc268_capture_nosrc_mixer },
eb5a6621
HRK
13312 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13313 alc267_quanta_il1_verbs },
13314 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13315 .dac_nids = alc268_dac_nids,
13316 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13317 .adc_nids = alc268_adc_nids_alt,
13318 .hp_nid = 0x03,
13319 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13320 .channel_mode = alc268_modes,
4f5d1706
TI
13321 .unsol_event = alc_sku_unsol_event,
13322 .setup = alc267_quanta_il1_setup,
13323 .init_hook = alc_inithook,
eb5a6621 13324 },
a361d84b 13325 [ALC268_3ST] = {
aef9d318
TI
13326 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13327 alc268_beep_mixer },
a361d84b
KY
13328 .init_verbs = { alc268_base_init_verbs },
13329 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13330 .dac_nids = alc268_dac_nids,
13331 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13332 .adc_nids = alc268_adc_nids_alt,
e1406348 13333 .capsrc_nids = alc268_capsrc_nids,
a361d84b
KY
13334 .hp_nid = 0x03,
13335 .dig_out_nid = ALC268_DIGOUT_NID,
13336 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13337 .channel_mode = alc268_modes,
13338 .input_mux = &alc268_capture_source,
13339 },
d1a991a6 13340 [ALC268_TOSHIBA] = {
42171c17 13341 .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
aef9d318 13342 alc268_beep_mixer },
d273809e
TI
13343 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13344 alc268_toshiba_verbs },
d1a991a6
KY
13345 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13346 .dac_nids = alc268_dac_nids,
13347 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13348 .adc_nids = alc268_adc_nids_alt,
e1406348 13349 .capsrc_nids = alc268_capsrc_nids,
d1a991a6
KY
13350 .hp_nid = 0x03,
13351 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13352 .channel_mode = alc268_modes,
13353 .input_mux = &alc268_capture_source,
d273809e 13354 .unsol_event = alc268_toshiba_unsol_event,
4f5d1706
TI
13355 .setup = alc268_toshiba_setup,
13356 .init_hook = alc268_toshiba_automute,
d273809e
TI
13357 },
13358 [ALC268_ACER] = {
432fd133 13359 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
aef9d318 13360 alc268_beep_mixer },
d273809e
TI
13361 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13362 alc268_acer_verbs },
13363 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13364 .dac_nids = alc268_dac_nids,
13365 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13366 .adc_nids = alc268_adc_nids_alt,
e1406348 13367 .capsrc_nids = alc268_capsrc_nids,
d273809e
TI
13368 .hp_nid = 0x02,
13369 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13370 .channel_mode = alc268_modes,
0ccb541c 13371 .input_mux = &alc268_acer_capture_source,
d273809e 13372 .unsol_event = alc268_acer_unsol_event,
889c4395 13373 .init_hook = alc268_acer_init_hook,
d1a991a6 13374 },
c238b4f4
TI
13375 [ALC268_ACER_DMIC] = {
13376 .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
13377 alc268_beep_mixer },
13378 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13379 alc268_acer_verbs },
13380 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13381 .dac_nids = alc268_dac_nids,
13382 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13383 .adc_nids = alc268_adc_nids_alt,
13384 .capsrc_nids = alc268_capsrc_nids,
13385 .hp_nid = 0x02,
13386 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13387 .channel_mode = alc268_modes,
13388 .input_mux = &alc268_acer_dmic_capture_source,
13389 .unsol_event = alc268_acer_unsol_event,
13390 .init_hook = alc268_acer_init_hook,
13391 },
8ef355da
KY
13392 [ALC268_ACER_ASPIRE_ONE] = {
13393 .mixers = { alc268_acer_aspire_one_mixer,
22971e3a 13394 alc268_beep_mixer,
fdbc6626 13395 alc268_capture_nosrc_mixer },
8ef355da
KY
13396 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13397 alc268_acer_aspire_one_verbs },
13398 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13399 .dac_nids = alc268_dac_nids,
13400 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13401 .adc_nids = alc268_adc_nids_alt,
13402 .capsrc_nids = alc268_capsrc_nids,
13403 .hp_nid = 0x03,
13404 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13405 .channel_mode = alc268_modes,
8ef355da 13406 .unsol_event = alc268_acer_lc_unsol_event,
4f5d1706 13407 .setup = alc268_acer_lc_setup,
8ef355da
KY
13408 .init_hook = alc268_acer_lc_init_hook,
13409 },
3866f0b0 13410 [ALC268_DELL] = {
fdbc6626
TI
13411 .mixers = { alc268_dell_mixer, alc268_beep_mixer,
13412 alc268_capture_nosrc_mixer },
3866f0b0
TI
13413 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13414 alc268_dell_verbs },
13415 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13416 .dac_nids = alc268_dac_nids,
fdbc6626
TI
13417 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13418 .adc_nids = alc268_adc_nids_alt,
13419 .capsrc_nids = alc268_capsrc_nids,
3866f0b0
TI
13420 .hp_nid = 0x02,
13421 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13422 .channel_mode = alc268_modes,
a9fd4f3f 13423 .unsol_event = alc_sku_unsol_event,
4f5d1706
TI
13424 .setup = alc268_dell_setup,
13425 .init_hook = alc_inithook,
3866f0b0 13426 },
f12462c5 13427 [ALC268_ZEPTO] = {
aef9d318
TI
13428 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13429 alc268_beep_mixer },
f12462c5
MT
13430 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13431 alc268_toshiba_verbs },
13432 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13433 .dac_nids = alc268_dac_nids,
13434 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13435 .adc_nids = alc268_adc_nids_alt,
e1406348 13436 .capsrc_nids = alc268_capsrc_nids,
f12462c5
MT
13437 .hp_nid = 0x03,
13438 .dig_out_nid = ALC268_DIGOUT_NID,
13439 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13440 .channel_mode = alc268_modes,
13441 .input_mux = &alc268_capture_source,
4f5d1706
TI
13442 .setup = alc268_toshiba_setup,
13443 .init_hook = alc268_toshiba_automute,
f12462c5 13444 },
86c53bd2
JW
13445#ifdef CONFIG_SND_DEBUG
13446 [ALC268_TEST] = {
13447 .mixers = { alc268_test_mixer, alc268_capture_mixer },
13448 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13449 alc268_volume_init_verbs },
13450 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13451 .dac_nids = alc268_dac_nids,
13452 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13453 .adc_nids = alc268_adc_nids_alt,
e1406348 13454 .capsrc_nids = alc268_capsrc_nids,
86c53bd2
JW
13455 .hp_nid = 0x03,
13456 .dig_out_nid = ALC268_DIGOUT_NID,
13457 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13458 .channel_mode = alc268_modes,
13459 .input_mux = &alc268_capture_source,
13460 },
13461#endif
a361d84b
KY
13462};
13463
13464static int patch_alc268(struct hda_codec *codec)
13465{
13466 struct alc_spec *spec;
13467 int board_config;
22971e3a 13468 int i, has_beep, err;
a361d84b 13469
ef86f581 13470 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
a361d84b
KY
13471 if (spec == NULL)
13472 return -ENOMEM;
13473
13474 codec->spec = spec;
13475
13476 board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
13477 alc268_models,
13478 alc268_cfg_tbl);
13479
3abf2f36
TI
13480 if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
13481 board_config = snd_hda_check_board_codec_sid_config(codec,
50ae0aa8 13482 ALC268_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
3abf2f36 13483
a361d84b 13484 if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
9a11f1aa
TI
13485 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13486 codec->chip_name);
a361d84b
KY
13487 board_config = ALC268_AUTO;
13488 }
13489
13490 if (board_config == ALC268_AUTO) {
13491 /* automatic parse from the BIOS config */
13492 err = alc268_parse_auto_config(codec);
13493 if (err < 0) {
13494 alc_free(codec);
13495 return err;
13496 } else if (!err) {
13497 printk(KERN_INFO
13498 "hda_codec: Cannot set up configuration "
13499 "from BIOS. Using base mode...\n");
13500 board_config = ALC268_3ST;
13501 }
13502 }
13503
13504 if (board_config != ALC268_AUTO)
e9c364c0 13505 setup_preset(codec, &alc268_presets[board_config]);
a361d84b 13506
a361d84b
KY
13507 spec->stream_analog_playback = &alc268_pcm_analog_playback;
13508 spec->stream_analog_capture = &alc268_pcm_analog_capture;
6330079f 13509 spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
a361d84b 13510
a361d84b
KY
13511 spec->stream_digital_playback = &alc268_pcm_digital_playback;
13512
22971e3a
TI
13513 has_beep = 0;
13514 for (i = 0; i < spec->num_mixers; i++) {
13515 if (spec->mixers[i] == alc268_beep_mixer) {
13516 has_beep = 1;
13517 break;
13518 }
13519 }
13520
13521 if (has_beep) {
13522 err = snd_hda_attach_beep_device(codec, 0x1);
13523 if (err < 0) {
13524 alc_free(codec);
13525 return err;
13526 }
13527 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
13528 /* override the amp caps for beep generator */
13529 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
aef9d318
TI
13530 (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
13531 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
13532 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
13533 (0 << AC_AMPCAP_MUTE_SHIFT));
22971e3a 13534 }
aef9d318 13535
7e0e44d4 13536 if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
3866f0b0
TI
13537 /* check whether NID 0x07 is valid */
13538 unsigned int wcap = get_wcaps(codec, 0x07);
85860c06 13539 int i;
3866f0b0 13540
defb5ab2 13541 spec->capsrc_nids = alc268_capsrc_nids;
3866f0b0 13542 /* get type */
a22d543a 13543 wcap = get_wcaps_type(wcap);
fdbc6626
TI
13544 if (spec->auto_mic ||
13545 wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
3866f0b0
TI
13546 spec->adc_nids = alc268_adc_nids_alt;
13547 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
defb5ab2
TI
13548 if (spec->auto_mic)
13549 fixup_automic_adc(codec);
fdbc6626
TI
13550 if (spec->auto_mic || spec->input_mux->num_items == 1)
13551 add_mixer(spec, alc268_capture_nosrc_mixer);
13552 else
13553 add_mixer(spec, alc268_capture_alt_mixer);
3866f0b0
TI
13554 } else {
13555 spec->adc_nids = alc268_adc_nids;
13556 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
d88897ea 13557 add_mixer(spec, alc268_capture_mixer);
a361d84b 13558 }
85860c06
TI
13559 /* set default input source */
13560 for (i = 0; i < spec->num_adc_nids; i++)
13561 snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
13562 0, AC_VERB_SET_CONNECT_SEL,
5908589f
HRK
13563 i < spec->num_mux_defs ?
13564 spec->input_mux[i].items[0].index :
85860c06 13565 spec->input_mux->items[0].index);
a361d84b 13566 }
2134ea4f
TI
13567
13568 spec->vmaster_nid = 0x02;
13569
a361d84b
KY
13570 codec->patch_ops = alc_patch_ops;
13571 if (board_config == ALC268_AUTO)
13572 spec->init_hook = alc268_auto_init;
ea1fb29a 13573
a361d84b
KY
13574 return 0;
13575}
13576
f6a92248
KY
13577/*
13578 * ALC269 channel source setting (2 channel)
13579 */
13580#define ALC269_DIGOUT_NID ALC880_DIGOUT_NID
13581
13582#define alc269_dac_nids alc260_dac_nids
13583
13584static hda_nid_t alc269_adc_nids[1] = {
13585 /* ADC1 */
f53281e6
KY
13586 0x08,
13587};
13588
e01bf509
TI
13589static hda_nid_t alc269_capsrc_nids[1] = {
13590 0x23,
13591};
13592
84898e87
KY
13593static hda_nid_t alc269vb_adc_nids[1] = {
13594 /* ADC1 */
13595 0x09,
13596};
13597
13598static hda_nid_t alc269vb_capsrc_nids[1] = {
13599 0x22,
13600};
13601
6694635d
TI
13602static hda_nid_t alc269_adc_candidates[] = {
13603 0x08, 0x09, 0x07,
13604};
e01bf509 13605
f6a92248
KY
13606#define alc269_modes alc260_modes
13607#define alc269_capture_source alc880_lg_lw_capture_source
13608
13609static struct snd_kcontrol_new alc269_base_mixer[] = {
13610 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13611 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13612 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
13613 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
13614 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13615 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13616 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13617 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13618 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13619 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
13620 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13621 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
13622 { } /* end */
13623};
13624
60db6b53
KY
13625static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
13626 /* output mixer control */
13627 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13628 {
13629 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13630 .name = "Master Playback Switch",
5e26dfd0 13631 .subdevice = HDA_SUBDEV_AMP_FLAG,
60db6b53
KY
13632 .info = snd_hda_mixer_amp_switch_info,
13633 .get = snd_hda_mixer_amp_switch_get,
13634 .put = alc268_acer_master_sw_put,
13635 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13636 },
13637 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13638 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13639 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13640 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13641 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13642 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
60db6b53
KY
13643 { }
13644};
13645
64154835
TV
13646static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
13647 /* output mixer control */
13648 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13649 {
13650 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13651 .name = "Master Playback Switch",
5e26dfd0 13652 .subdevice = HDA_SUBDEV_AMP_FLAG,
64154835
TV
13653 .info = snd_hda_mixer_amp_switch_info,
13654 .get = snd_hda_mixer_amp_switch_get,
13655 .put = alc268_acer_master_sw_put,
13656 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13657 },
13658 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13659 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13660 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13661 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13662 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13663 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13664 HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
13665 HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
13666 HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
64154835
TV
13667 { }
13668};
13669
84898e87 13670static struct snd_kcontrol_new alc269_laptop_mixer[] = {
aa202455 13671 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
508f7110 13672 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
aa202455 13673 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
508f7110 13674 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
f53281e6
KY
13675 { } /* end */
13676};
13677
84898e87
KY
13678static struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
13679 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13680 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13681 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
13682 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13683 { } /* end */
13684};
13685
f53281e6 13686/* capture mixer elements */
84898e87
KY
13687static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
13688 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13689 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13690 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13691 HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13692 { } /* end */
13693};
13694
13695static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
f53281e6
KY
13696 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13697 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
26f5df26
TI
13698 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13699 { } /* end */
13700};
13701
84898e87
KY
13702static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
13703 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13704 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13705 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13706 HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13707 { } /* end */
13708};
13709
13710static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
13711 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13712 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13713 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13714 { } /* end */
13715};
13716
26f5df26 13717/* FSC amilo */
84898e87 13718#define alc269_fujitsu_mixer alc269_laptop_mixer
f53281e6 13719
60db6b53
KY
13720static struct hda_verb alc269_quanta_fl1_verbs[] = {
13721 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13722 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13723 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13724 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13725 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13726 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13727 { }
13728};
f6a92248 13729
64154835
TV
13730static struct hda_verb alc269_lifebook_verbs[] = {
13731 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13732 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
13733 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13734 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13735 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13736 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13737 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13738 {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13739 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13740 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13741 { }
13742};
13743
60db6b53
KY
13744/* toggle speaker-output according to the hp-jack state */
13745static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
13746{
13747 unsigned int present;
13748 unsigned char bits;
f6a92248 13749
864f92be 13750 present = snd_hda_jack_detect(codec, 0x15);
5dbd5ec6 13751 bits = present ? HDA_AMP_MUTE : 0;
60db6b53 13752 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 13753 HDA_AMP_MUTE, bits);
60db6b53 13754 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 13755 HDA_AMP_MUTE, bits);
f6a92248 13756
60db6b53
KY
13757 snd_hda_codec_write(codec, 0x20, 0,
13758 AC_VERB_SET_COEF_INDEX, 0x0c);
13759 snd_hda_codec_write(codec, 0x20, 0,
13760 AC_VERB_SET_PROC_COEF, 0x680);
f6a92248 13761
60db6b53
KY
13762 snd_hda_codec_write(codec, 0x20, 0,
13763 AC_VERB_SET_COEF_INDEX, 0x0c);
13764 snd_hda_codec_write(codec, 0x20, 0,
13765 AC_VERB_SET_PROC_COEF, 0x480);
13766}
f6a92248 13767
64154835
TV
13768/* toggle speaker-output according to the hp-jacks state */
13769static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
13770{
13771 unsigned int present;
13772 unsigned char bits;
13773
13774 /* Check laptop headphone socket */
864f92be 13775 present = snd_hda_jack_detect(codec, 0x15);
64154835
TV
13776
13777 /* Check port replicator headphone socket */
864f92be 13778 present |= snd_hda_jack_detect(codec, 0x1a);
64154835 13779
5dbd5ec6 13780 bits = present ? HDA_AMP_MUTE : 0;
64154835 13781 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 13782 HDA_AMP_MUTE, bits);
64154835 13783 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 13784 HDA_AMP_MUTE, bits);
64154835
TV
13785
13786 snd_hda_codec_write(codec, 0x20, 0,
13787 AC_VERB_SET_COEF_INDEX, 0x0c);
13788 snd_hda_codec_write(codec, 0x20, 0,
13789 AC_VERB_SET_PROC_COEF, 0x680);
13790
13791 snd_hda_codec_write(codec, 0x20, 0,
13792 AC_VERB_SET_COEF_INDEX, 0x0c);
13793 snd_hda_codec_write(codec, 0x20, 0,
13794 AC_VERB_SET_PROC_COEF, 0x480);
13795}
13796
64154835
TV
13797static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
13798{
13799 unsigned int present_laptop;
13800 unsigned int present_dock;
13801
864f92be
WF
13802 present_laptop = snd_hda_jack_detect(codec, 0x18);
13803 present_dock = snd_hda_jack_detect(codec, 0x1b);
64154835
TV
13804
13805 /* Laptop mic port overrides dock mic port, design decision */
13806 if (present_dock)
13807 snd_hda_codec_write(codec, 0x23, 0,
13808 AC_VERB_SET_CONNECT_SEL, 0x3);
13809 if (present_laptop)
13810 snd_hda_codec_write(codec, 0x23, 0,
13811 AC_VERB_SET_CONNECT_SEL, 0x0);
13812 if (!present_dock && !present_laptop)
13813 snd_hda_codec_write(codec, 0x23, 0,
13814 AC_VERB_SET_CONNECT_SEL, 0x1);
13815}
13816
60db6b53
KY
13817static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
13818 unsigned int res)
13819{
4f5d1706
TI
13820 switch (res >> 26) {
13821 case ALC880_HP_EVENT:
60db6b53 13822 alc269_quanta_fl1_speaker_automute(codec);
4f5d1706
TI
13823 break;
13824 case ALC880_MIC_EVENT:
13825 alc_mic_automute(codec);
13826 break;
13827 }
60db6b53 13828}
f6a92248 13829
64154835
TV
13830static void alc269_lifebook_unsol_event(struct hda_codec *codec,
13831 unsigned int res)
13832{
13833 if ((res >> 26) == ALC880_HP_EVENT)
13834 alc269_lifebook_speaker_automute(codec);
13835 if ((res >> 26) == ALC880_MIC_EVENT)
13836 alc269_lifebook_mic_autoswitch(codec);
13837}
13838
4f5d1706
TI
13839static void alc269_quanta_fl1_setup(struct hda_codec *codec)
13840{
13841 struct alc_spec *spec = codec->spec;
20645d70
TI
13842 spec->autocfg.hp_pins[0] = 0x15;
13843 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
13844 spec->ext_mic.pin = 0x18;
13845 spec->ext_mic.mux_idx = 0;
13846 spec->int_mic.pin = 0x19;
13847 spec->int_mic.mux_idx = 1;
13848 spec->auto_mic = 1;
13849}
13850
60db6b53
KY
13851static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
13852{
13853 alc269_quanta_fl1_speaker_automute(codec);
4f5d1706 13854 alc_mic_automute(codec);
60db6b53 13855}
f6a92248 13856
64154835
TV
13857static void alc269_lifebook_init_hook(struct hda_codec *codec)
13858{
13859 alc269_lifebook_speaker_automute(codec);
13860 alc269_lifebook_mic_autoswitch(codec);
13861}
13862
84898e87 13863static struct hda_verb alc269_laptop_dmic_init_verbs[] = {
f53281e6
KY
13864 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13865 {0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
13866 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13867 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13868 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13869 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13870 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13871 {}
13872};
13873
84898e87 13874static struct hda_verb alc269_laptop_amic_init_verbs[] = {
f53281e6
KY
13875 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13876 {0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
13877 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13878 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
13879 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13880 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13881 {}
13882};
13883
84898e87
KY
13884static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
13885 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13886 {0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
13887 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13888 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13889 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13890 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13891 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13892 {}
13893};
13894
13895static struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
13896 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13897 {0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
13898 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13899 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13900 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13901 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13902 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13903 {}
13904};
13905
f53281e6
KY
13906/* toggle speaker-output according to the hp-jack state */
13907static void alc269_speaker_automute(struct hda_codec *codec)
13908{
ebb83eeb
KY
13909 struct alc_spec *spec = codec->spec;
13910 unsigned int nid = spec->autocfg.hp_pins[0];
f53281e6 13911 unsigned int present;
60db6b53 13912 unsigned char bits;
f53281e6 13913
ebb83eeb 13914 present = snd_hda_jack_detect(codec, nid);
5dbd5ec6 13915 bits = present ? HDA_AMP_MUTE : 0;
f53281e6 13916 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 13917 HDA_AMP_MUTE, bits);
f53281e6 13918 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 13919 HDA_AMP_MUTE, bits);
f53281e6
KY
13920}
13921
f53281e6 13922/* unsolicited event for HP jack sensing */
84898e87 13923static void alc269_laptop_unsol_event(struct hda_codec *codec,
60db6b53 13924 unsigned int res)
f53281e6 13925{
4f5d1706
TI
13926 switch (res >> 26) {
13927 case ALC880_HP_EVENT:
f53281e6 13928 alc269_speaker_automute(codec);
4f5d1706
TI
13929 break;
13930 case ALC880_MIC_EVENT:
13931 alc_mic_automute(codec);
13932 break;
13933 }
f53281e6
KY
13934}
13935
226b1ec8 13936static void alc269_laptop_amic_setup(struct hda_codec *codec)
f53281e6 13937{
4f5d1706 13938 struct alc_spec *spec = codec->spec;
20645d70
TI
13939 spec->autocfg.hp_pins[0] = 0x15;
13940 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
13941 spec->ext_mic.pin = 0x18;
13942 spec->ext_mic.mux_idx = 0;
226b1ec8
KY
13943 spec->int_mic.pin = 0x19;
13944 spec->int_mic.mux_idx = 1;
4f5d1706 13945 spec->auto_mic = 1;
f53281e6
KY
13946}
13947
226b1ec8 13948static void alc269_laptop_dmic_setup(struct hda_codec *codec)
84898e87
KY
13949{
13950 struct alc_spec *spec = codec->spec;
20645d70
TI
13951 spec->autocfg.hp_pins[0] = 0x15;
13952 spec->autocfg.speaker_pins[0] = 0x14;
84898e87
KY
13953 spec->ext_mic.pin = 0x18;
13954 spec->ext_mic.mux_idx = 0;
13955 spec->int_mic.pin = 0x12;
226b1ec8 13956 spec->int_mic.mux_idx = 5;
84898e87
KY
13957 spec->auto_mic = 1;
13958}
13959
226b1ec8 13960static void alc269vb_laptop_amic_setup(struct hda_codec *codec)
f53281e6 13961{
4f5d1706 13962 struct alc_spec *spec = codec->spec;
226b1ec8 13963 spec->autocfg.hp_pins[0] = 0x21;
20645d70 13964 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
13965 spec->ext_mic.pin = 0x18;
13966 spec->ext_mic.mux_idx = 0;
13967 spec->int_mic.pin = 0x19;
13968 spec->int_mic.mux_idx = 1;
13969 spec->auto_mic = 1;
f53281e6
KY
13970}
13971
226b1ec8
KY
13972static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
13973{
13974 struct alc_spec *spec = codec->spec;
13975 spec->autocfg.hp_pins[0] = 0x21;
13976 spec->autocfg.speaker_pins[0] = 0x14;
13977 spec->ext_mic.pin = 0x18;
13978 spec->ext_mic.mux_idx = 0;
13979 spec->int_mic.pin = 0x12;
13980 spec->int_mic.mux_idx = 6;
13981 spec->auto_mic = 1;
13982}
13983
84898e87 13984static void alc269_laptop_inithook(struct hda_codec *codec)
f53281e6
KY
13985{
13986 alc269_speaker_automute(codec);
4f5d1706 13987 alc_mic_automute(codec);
f53281e6
KY
13988}
13989
60db6b53
KY
13990/*
13991 * generic initialization of ADC, input mixers and output mixers
13992 */
13993static struct hda_verb alc269_init_verbs[] = {
13994 /*
13995 * Unmute ADC0 and set the default input to mic-in
13996 */
84898e87 13997 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
60db6b53
KY
13998
13999 /*
84898e87 14000 * Set up output mixers (0x02 - 0x03)
60db6b53
KY
14001 */
14002 /* set vol=0 to output mixers */
14003 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14004 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14005
14006 /* set up input amps for analog loopback */
14007 /* Amp Indices: DAC = 0, mixer = 1 */
14008 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14009 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14010 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14011 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14012 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14013 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14014
14015 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14016 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14017 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14018 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14019 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14020 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14021 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14022
14023 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14024 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
60db6b53 14025
84898e87
KY
14026 /* FIXME: use Mux-type input source selection */
14027 /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14028 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
14029 {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
60db6b53 14030
84898e87
KY
14031 /* set EAPD */
14032 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14033 { }
14034};
14035
14036static struct hda_verb alc269vb_init_verbs[] = {
14037 /*
14038 * Unmute ADC0 and set the default input to mic-in
14039 */
14040 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14041
14042 /*
14043 * Set up output mixers (0x02 - 0x03)
14044 */
14045 /* set vol=0 to output mixers */
14046 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14047 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14048
14049 /* set up input amps for analog loopback */
14050 /* Amp Indices: DAC = 0, mixer = 1 */
14051 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14052 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14053 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14054 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14055 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14056 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14057
14058 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14059 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14060 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14061 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14062 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14063 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14064 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14065
14066 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14067 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14068
14069 /* FIXME: use Mux-type input source selection */
60db6b53
KY
14070 /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14071 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
84898e87 14072 {0x22, AC_VERB_SET_CONNECT_SEL, 0x00},
60db6b53
KY
14073
14074 /* set EAPD */
14075 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
60db6b53
KY
14076 { }
14077};
14078
9d0b71b1
TI
14079#define alc269_auto_create_multi_out_ctls \
14080 alc268_auto_create_multi_out_ctls
05f5f477
TI
14081#define alc269_auto_create_input_ctls \
14082 alc268_auto_create_input_ctls
f6a92248
KY
14083
14084#ifdef CONFIG_SND_HDA_POWER_SAVE
14085#define alc269_loopbacks alc880_loopbacks
14086#endif
14087
def319f9 14088/* pcm configuration: identical with ALC880 */
f6a92248
KY
14089#define alc269_pcm_analog_playback alc880_pcm_analog_playback
14090#define alc269_pcm_analog_capture alc880_pcm_analog_capture
14091#define alc269_pcm_digital_playback alc880_pcm_digital_playback
14092#define alc269_pcm_digital_capture alc880_pcm_digital_capture
14093
f03d3115
TI
14094static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
14095 .substreams = 1,
14096 .channels_min = 2,
14097 .channels_max = 8,
14098 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14099 /* NID is set in alc_build_pcms */
14100 .ops = {
14101 .open = alc880_playback_pcm_open,
14102 .prepare = alc880_playback_pcm_prepare,
14103 .cleanup = alc880_playback_pcm_cleanup
14104 },
14105};
14106
14107static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
14108 .substreams = 1,
14109 .channels_min = 2,
14110 .channels_max = 2,
14111 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14112 /* NID is set in alc_build_pcms */
14113};
14114
ad35879a
TI
14115#ifdef CONFIG_SND_HDA_POWER_SAVE
14116static int alc269_mic2_for_mute_led(struct hda_codec *codec)
14117{
14118 switch (codec->subsystem_id) {
14119 case 0x103c1586:
14120 return 1;
14121 }
14122 return 0;
14123}
14124
14125static int alc269_mic2_mute_check_ps(struct hda_codec *codec, hda_nid_t nid)
14126{
14127 /* update mute-LED according to the speaker mute state */
14128 if (nid == 0x01 || nid == 0x14) {
14129 int pinval;
14130 if (snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0) &
14131 HDA_AMP_MUTE)
14132 pinval = 0x24;
14133 else
14134 pinval = 0x20;
14135 /* mic2 vref pin is used for mute LED control */
a68d5a54
TI
14136 snd_hda_codec_update_cache(codec, 0x19, 0,
14137 AC_VERB_SET_PIN_WIDGET_CONTROL,
14138 pinval);
ad35879a
TI
14139 }
14140 return alc_check_power_status(codec, nid);
14141}
14142#endif /* CONFIG_SND_HDA_POWER_SAVE */
14143
f6a92248
KY
14144/*
14145 * BIOS auto configuration
14146 */
14147static int alc269_parse_auto_config(struct hda_codec *codec)
14148{
14149 struct alc_spec *spec = codec->spec;
cfb9fb55 14150 int err;
f6a92248
KY
14151 static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
14152
14153 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
14154 alc269_ignore);
14155 if (err < 0)
14156 return err;
14157
14158 err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
14159 if (err < 0)
14160 return err;
05f5f477 14161 err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
f6a92248
KY
14162 if (err < 0)
14163 return err;
14164
14165 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
14166
0852d7a6 14167 if (spec->autocfg.dig_outs)
f6a92248
KY
14168 spec->multiout.dig_out_nid = ALC269_DIGOUT_NID;
14169
603c4019 14170 if (spec->kctls.list)
d88897ea 14171 add_mixer(spec, spec->kctls.list);
f6a92248 14172
84898e87
KY
14173 if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010) {
14174 add_verb(spec, alc269vb_init_verbs);
6227cdce 14175 alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21);
84898e87
KY
14176 } else {
14177 add_verb(spec, alc269_init_verbs);
6227cdce 14178 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
84898e87
KY
14179 }
14180
f6a92248 14181 spec->num_mux_defs = 1;
61b9b9b1 14182 spec->input_mux = &spec->private_imux[0];
6694635d
TI
14183 fillup_priv_adc_nids(codec, alc269_adc_candidates,
14184 sizeof(alc269_adc_candidates));
14185
e01bf509 14186 /* set default input source */
6694635d 14187 snd_hda_codec_write_cache(codec, spec->capsrc_nids[0],
e01bf509
TI
14188 0, AC_VERB_SET_CONNECT_SEL,
14189 spec->input_mux->items[0].index);
f6a92248
KY
14190
14191 err = alc_auto_add_mic_boost(codec);
14192 if (err < 0)
14193 return err;
14194
7e0e44d4 14195 if (!spec->cap_mixer && !spec->no_analog)
b59bdf3b 14196 set_capture_mixer(codec);
f53281e6 14197
f6a92248
KY
14198 return 1;
14199}
14200
e9af4f36
TI
14201#define alc269_auto_init_multi_out alc268_auto_init_multi_out
14202#define alc269_auto_init_hp_out alc268_auto_init_hp_out
f6a92248
KY
14203#define alc269_auto_init_analog_input alc882_auto_init_analog_input
14204
14205
14206/* init callback for auto-configuration model -- overriding the default init */
14207static void alc269_auto_init(struct hda_codec *codec)
14208{
f6c7e546 14209 struct alc_spec *spec = codec->spec;
f6a92248
KY
14210 alc269_auto_init_multi_out(codec);
14211 alc269_auto_init_hp_out(codec);
14212 alc269_auto_init_analog_input(codec);
f6c7e546 14213 if (spec->unsol_event)
7fb0d78f 14214 alc_inithook(codec);
f6a92248
KY
14215}
14216
ff818c24
TI
14217enum {
14218 ALC269_FIXUP_SONY_VAIO,
14219};
14220
fbc25669 14221static const struct hda_verb alc269_sony_vaio_fixup_verbs[] = {
ff818c24
TI
14222 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
14223 {}
14224};
14225
14226static const struct alc_fixup alc269_fixups[] = {
14227 [ALC269_FIXUP_SONY_VAIO] = {
14228 .verbs = alc269_sony_vaio_fixup_verbs
14229 },
14230};
14231
14232static struct snd_pci_quirk alc269_fixup_tbl[] = {
14233 SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
14234 {}
14235};
14236
14237
f6a92248
KY
14238/*
14239 * configuration and preset
14240 */
14241static const char *alc269_models[ALC269_MODEL_LAST] = {
60db6b53 14242 [ALC269_BASIC] = "basic",
2922c9af 14243 [ALC269_QUANTA_FL1] = "quanta",
84898e87
KY
14244 [ALC269_AMIC] = "laptop-amic",
14245 [ALC269_DMIC] = "laptop-dmic",
64154835 14246 [ALC269_FUJITSU] = "fujitsu",
3d3792cb
TI
14247 [ALC269_LIFEBOOK] = "lifebook",
14248 [ALC269_AUTO] = "auto",
f6a92248
KY
14249};
14250
14251static struct snd_pci_quirk alc269_cfg_tbl[] = {
60db6b53 14252 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
f53281e6 14253 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
84898e87
KY
14254 ALC269_AMIC),
14255 SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC),
14256 SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC),
14257 SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC),
14258 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC),
14259 SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC),
14260 SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC),
14261 SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),
14262 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),
14263 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC),
14264 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_AMIC),
14265 SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),
14266 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),
14267 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC),
14268 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC),
14269 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC),
14270 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC),
14271 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC),
14272 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC),
14273 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC),
14274 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC),
14275 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC),
14276 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC),
14277 SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC),
14278 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC),
14279 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC),
14280 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC),
14281 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC),
14282 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC),
14283 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
14284 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
14285 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
14286 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC),
14287 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
14288 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
14289 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
14290 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
f53281e6 14291 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
84898e87 14292 ALC269_DMIC),
60db6b53 14293 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
84898e87
KY
14294 ALC269_DMIC),
14295 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
14296 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
ff818c24 14297 SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO),
64154835 14298 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
61c2d2b5
KY
14299 SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
14300 SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
14301 SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC),
14302 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC),
14303 SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC),
14304 SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC),
f6a92248
KY
14305 {}
14306};
14307
14308static struct alc_config_preset alc269_presets[] = {
14309 [ALC269_BASIC] = {
f9e336f6 14310 .mixers = { alc269_base_mixer },
f6a92248
KY
14311 .init_verbs = { alc269_init_verbs },
14312 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14313 .dac_nids = alc269_dac_nids,
14314 .hp_nid = 0x03,
14315 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14316 .channel_mode = alc269_modes,
14317 .input_mux = &alc269_capture_source,
14318 },
60db6b53
KY
14319 [ALC269_QUANTA_FL1] = {
14320 .mixers = { alc269_quanta_fl1_mixer },
14321 .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
14322 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14323 .dac_nids = alc269_dac_nids,
14324 .hp_nid = 0x03,
14325 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14326 .channel_mode = alc269_modes,
14327 .input_mux = &alc269_capture_source,
14328 .unsol_event = alc269_quanta_fl1_unsol_event,
4f5d1706 14329 .setup = alc269_quanta_fl1_setup,
60db6b53
KY
14330 .init_hook = alc269_quanta_fl1_init_hook,
14331 },
84898e87
KY
14332 [ALC269_AMIC] = {
14333 .mixers = { alc269_laptop_mixer },
14334 .cap_mixer = alc269_laptop_analog_capture_mixer,
f53281e6 14335 .init_verbs = { alc269_init_verbs,
84898e87 14336 alc269_laptop_amic_init_verbs },
f53281e6
KY
14337 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14338 .dac_nids = alc269_dac_nids,
14339 .hp_nid = 0x03,
14340 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14341 .channel_mode = alc269_modes,
84898e87
KY
14342 .unsol_event = alc269_laptop_unsol_event,
14343 .setup = alc269_laptop_amic_setup,
14344 .init_hook = alc269_laptop_inithook,
f53281e6 14345 },
84898e87
KY
14346 [ALC269_DMIC] = {
14347 .mixers = { alc269_laptop_mixer },
14348 .cap_mixer = alc269_laptop_digital_capture_mixer,
f53281e6 14349 .init_verbs = { alc269_init_verbs,
84898e87
KY
14350 alc269_laptop_dmic_init_verbs },
14351 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14352 .dac_nids = alc269_dac_nids,
14353 .hp_nid = 0x03,
14354 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14355 .channel_mode = alc269_modes,
14356 .unsol_event = alc269_laptop_unsol_event,
14357 .setup = alc269_laptop_dmic_setup,
14358 .init_hook = alc269_laptop_inithook,
14359 },
14360 [ALC269VB_AMIC] = {
14361 .mixers = { alc269vb_laptop_mixer },
14362 .cap_mixer = alc269vb_laptop_analog_capture_mixer,
14363 .init_verbs = { alc269vb_init_verbs,
14364 alc269vb_laptop_amic_init_verbs },
f53281e6
KY
14365 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14366 .dac_nids = alc269_dac_nids,
14367 .hp_nid = 0x03,
14368 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14369 .channel_mode = alc269_modes,
84898e87 14370 .unsol_event = alc269_laptop_unsol_event,
226b1ec8 14371 .setup = alc269vb_laptop_amic_setup,
84898e87
KY
14372 .init_hook = alc269_laptop_inithook,
14373 },
14374 [ALC269VB_DMIC] = {
14375 .mixers = { alc269vb_laptop_mixer },
14376 .cap_mixer = alc269vb_laptop_digital_capture_mixer,
14377 .init_verbs = { alc269vb_init_verbs,
14378 alc269vb_laptop_dmic_init_verbs },
14379 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14380 .dac_nids = alc269_dac_nids,
14381 .hp_nid = 0x03,
14382 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14383 .channel_mode = alc269_modes,
14384 .unsol_event = alc269_laptop_unsol_event,
14385 .setup = alc269vb_laptop_dmic_setup,
14386 .init_hook = alc269_laptop_inithook,
f53281e6 14387 },
26f5df26 14388 [ALC269_FUJITSU] = {
45bdd1c1 14389 .mixers = { alc269_fujitsu_mixer },
84898e87 14390 .cap_mixer = alc269_laptop_digital_capture_mixer,
26f5df26 14391 .init_verbs = { alc269_init_verbs,
84898e87 14392 alc269_laptop_dmic_init_verbs },
26f5df26
TI
14393 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14394 .dac_nids = alc269_dac_nids,
14395 .hp_nid = 0x03,
14396 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14397 .channel_mode = alc269_modes,
84898e87
KY
14398 .unsol_event = alc269_laptop_unsol_event,
14399 .setup = alc269_laptop_dmic_setup,
14400 .init_hook = alc269_laptop_inithook,
26f5df26 14401 },
64154835
TV
14402 [ALC269_LIFEBOOK] = {
14403 .mixers = { alc269_lifebook_mixer },
14404 .init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
14405 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14406 .dac_nids = alc269_dac_nids,
14407 .hp_nid = 0x03,
14408 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14409 .channel_mode = alc269_modes,
14410 .input_mux = &alc269_capture_source,
14411 .unsol_event = alc269_lifebook_unsol_event,
14412 .init_hook = alc269_lifebook_init_hook,
14413 },
f6a92248
KY
14414};
14415
14416static int patch_alc269(struct hda_codec *codec)
14417{
14418 struct alc_spec *spec;
14419 int board_config;
14420 int err;
84898e87 14421 int is_alc269vb = 0;
f6a92248
KY
14422
14423 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
14424 if (spec == NULL)
14425 return -ENOMEM;
14426
14427 codec->spec = spec;
14428
da00c244
KY
14429 alc_auto_parse_customize_define(codec);
14430
274693f3 14431 if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){
c027ddcd
KY
14432 if (codec->bus->pci->subsystem_vendor == 0x1025 &&
14433 spec->cdefine.platform_type == 1)
14434 alc_codec_rename(codec, "ALC271X");
14435 else
14436 alc_codec_rename(codec, "ALC259");
84898e87 14437 is_alc269vb = 1;
c027ddcd
KY
14438 } else
14439 alc_fix_pll_init(codec, 0x20, 0x04, 15);
274693f3 14440
f6a92248
KY
14441 board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
14442 alc269_models,
14443 alc269_cfg_tbl);
14444
14445 if (board_config < 0) {
9a11f1aa
TI
14446 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14447 codec->chip_name);
f6a92248
KY
14448 board_config = ALC269_AUTO;
14449 }
14450
ff818c24
TI
14451 if (board_config == ALC269_AUTO)
14452 alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 1);
14453
f6a92248
KY
14454 if (board_config == ALC269_AUTO) {
14455 /* automatic parse from the BIOS config */
14456 err = alc269_parse_auto_config(codec);
14457 if (err < 0) {
14458 alc_free(codec);
14459 return err;
14460 } else if (!err) {
14461 printk(KERN_INFO
14462 "hda_codec: Cannot set up configuration "
14463 "from BIOS. Using base mode...\n");
14464 board_config = ALC269_BASIC;
14465 }
14466 }
14467
680cd536
KK
14468 err = snd_hda_attach_beep_device(codec, 0x1);
14469 if (err < 0) {
14470 alc_free(codec);
14471 return err;
14472 }
14473
f6a92248 14474 if (board_config != ALC269_AUTO)
e9c364c0 14475 setup_preset(codec, &alc269_presets[board_config]);
f6a92248 14476
84898e87 14477 if (board_config == ALC269_QUANTA_FL1) {
f03d3115
TI
14478 /* Due to a hardware problem on Lenovo Ideadpad, we need to
14479 * fix the sample rate of analog I/O to 44.1kHz
14480 */
14481 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
14482 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
14483 } else {
14484 spec->stream_analog_playback = &alc269_pcm_analog_playback;
14485 spec->stream_analog_capture = &alc269_pcm_analog_capture;
14486 }
f6a92248
KY
14487 spec->stream_digital_playback = &alc269_pcm_digital_playback;
14488 spec->stream_digital_capture = &alc269_pcm_digital_capture;
14489
6694635d
TI
14490 if (!spec->adc_nids) { /* wasn't filled automatically? use default */
14491 if (!is_alc269vb) {
14492 spec->adc_nids = alc269_adc_nids;
14493 spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
14494 spec->capsrc_nids = alc269_capsrc_nids;
14495 } else {
14496 spec->adc_nids = alc269vb_adc_nids;
14497 spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids);
14498 spec->capsrc_nids = alc269vb_capsrc_nids;
14499 }
84898e87
KY
14500 }
14501
f9e336f6 14502 if (!spec->cap_mixer)
b59bdf3b 14503 set_capture_mixer(codec);
da00c244
KY
14504 if (spec->cdefine.enable_pcbeep)
14505 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
f6a92248 14506
ff818c24
TI
14507 if (board_config == ALC269_AUTO)
14508 alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 0);
14509
100d5eb3
TI
14510 spec->vmaster_nid = 0x02;
14511
f6a92248
KY
14512 codec->patch_ops = alc_patch_ops;
14513 if (board_config == ALC269_AUTO)
14514 spec->init_hook = alc269_auto_init;
14515#ifdef CONFIG_SND_HDA_POWER_SAVE
14516 if (!spec->loopback.amplist)
14517 spec->loopback.amplist = alc269_loopbacks;
ad35879a
TI
14518 if (alc269_mic2_for_mute_led(codec))
14519 codec->patch_ops.check_power_status = alc269_mic2_mute_check_ps;
f6a92248
KY
14520#endif
14521
14522 return 0;
14523}
14524
df694daa
KY
14525/*
14526 * ALC861 channel source setting (2/6 channel selection for 3-stack)
14527 */
14528
14529/*
14530 * set the path ways for 2 channel output
14531 * need to set the codec line out and mic 1 pin widgets to inputs
14532 */
14533static struct hda_verb alc861_threestack_ch2_init[] = {
14534 /* set pin widget 1Ah (line in) for input */
14535 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
f12ab1e0
TI
14536 /* set pin widget 18h (mic1/2) for input, for mic also enable
14537 * the vref
14538 */
df694daa
KY
14539 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14540
9c7f852e
TI
14541 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14542#if 0
14543 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14544 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14545#endif
df694daa
KY
14546 { } /* end */
14547};
14548/*
14549 * 6ch mode
14550 * need to set the codec line out and mic 1 pin widgets to outputs
14551 */
14552static struct hda_verb alc861_threestack_ch6_init[] = {
14553 /* set pin widget 1Ah (line in) for output (Back Surround)*/
14554 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14555 /* set pin widget 18h (mic1) for output (CLFE)*/
14556 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14557
14558 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
9c7f852e 14559 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
df694daa 14560
9c7f852e
TI
14561 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14562#if 0
14563 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14564 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14565#endif
df694daa
KY
14566 { } /* end */
14567};
14568
14569static struct hda_channel_mode alc861_threestack_modes[2] = {
14570 { 2, alc861_threestack_ch2_init },
14571 { 6, alc861_threestack_ch6_init },
14572};
22309c3e
TI
14573/* Set mic1 as input and unmute the mixer */
14574static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
14575 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14576 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14577 { } /* end */
14578};
14579/* Set mic1 as output and mute mixer */
14580static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
14581 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14582 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14583 { } /* end */
14584};
14585
14586static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
14587 { 2, alc861_uniwill_m31_ch2_init },
14588 { 4, alc861_uniwill_m31_ch4_init },
14589};
df694daa 14590
7cdbff94
MD
14591/* Set mic1 and line-in as input and unmute the mixer */
14592static struct hda_verb alc861_asus_ch2_init[] = {
14593 /* set pin widget 1Ah (line in) for input */
14594 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
f12ab1e0
TI
14595 /* set pin widget 18h (mic1/2) for input, for mic also enable
14596 * the vref
14597 */
7cdbff94
MD
14598 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14599
14600 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14601#if 0
14602 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14603 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14604#endif
14605 { } /* end */
14606};
14607/* Set mic1 nad line-in as output and mute mixer */
14608static struct hda_verb alc861_asus_ch6_init[] = {
14609 /* set pin widget 1Ah (line in) for output (Back Surround)*/
14610 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14611 /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14612 /* set pin widget 18h (mic1) for output (CLFE)*/
14613 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14614 /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14615 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14616 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14617
14618 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14619#if 0
14620 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14621 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14622#endif
14623 { } /* end */
14624};
14625
14626static struct hda_channel_mode alc861_asus_modes[2] = {
14627 { 2, alc861_asus_ch2_init },
14628 { 6, alc861_asus_ch6_init },
14629};
14630
df694daa
KY
14631/* patch-ALC861 */
14632
14633static struct snd_kcontrol_new alc861_base_mixer[] = {
14634 /* output mixer control */
14635 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14636 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14637 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14638 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14639 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14640
14641 /*Input mixer control */
14642 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14643 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14644 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14645 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14646 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14647 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14648 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14649 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14650 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14651 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
f12ab1e0 14652
df694daa
KY
14653 { } /* end */
14654};
14655
14656static struct snd_kcontrol_new alc861_3ST_mixer[] = {
14657 /* output mixer control */
14658 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14659 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14660 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14661 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14662 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14663
14664 /* Input mixer control */
14665 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14666 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14667 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14668 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14669 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14670 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14671 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14672 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14673 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14674 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
f12ab1e0 14675
df694daa
KY
14676 {
14677 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14678 .name = "Channel Mode",
14679 .info = alc_ch_mode_info,
14680 .get = alc_ch_mode_get,
14681 .put = alc_ch_mode_put,
14682 .private_value = ARRAY_SIZE(alc861_threestack_modes),
14683 },
14684 { } /* end */
a53d1aec
TD
14685};
14686
d1d985f0 14687static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
a53d1aec
TD
14688 /* output mixer control */
14689 HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14690 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14691 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
ea1fb29a 14692
a53d1aec 14693 { } /* end */
f12ab1e0 14694};
a53d1aec 14695
22309c3e
TI
14696static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
14697 /* output mixer control */
14698 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14699 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14700 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14701 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14702 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14703
14704 /* Input mixer control */
14705 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14706 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14707 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14708 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14709 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14710 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14711 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14712 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14713 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14714 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
f12ab1e0 14715
22309c3e
TI
14716 {
14717 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14718 .name = "Channel Mode",
14719 .info = alc_ch_mode_info,
14720 .get = alc_ch_mode_get,
14721 .put = alc_ch_mode_put,
14722 .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
14723 },
14724 { } /* end */
f12ab1e0 14725};
7cdbff94
MD
14726
14727static struct snd_kcontrol_new alc861_asus_mixer[] = {
14728 /* output mixer control */
14729 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14730 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14731 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14732 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14733 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14734
14735 /* Input mixer control */
14736 HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14737 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
14738 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14739 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14740 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14741 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14742 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14743 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14744 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
f12ab1e0
TI
14745 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
14746
7cdbff94
MD
14747 {
14748 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14749 .name = "Channel Mode",
14750 .info = alc_ch_mode_info,
14751 .get = alc_ch_mode_get,
14752 .put = alc_ch_mode_put,
14753 .private_value = ARRAY_SIZE(alc861_asus_modes),
14754 },
14755 { }
56bb0cab
TI
14756};
14757
14758/* additional mixer */
d1d985f0 14759static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
56bb0cab
TI
14760 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14761 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
56bb0cab
TI
14762 { }
14763};
7cdbff94 14764
df694daa
KY
14765/*
14766 * generic initialization of ADC, input mixers and output mixers
14767 */
14768static struct hda_verb alc861_base_init_verbs[] = {
14769 /*
14770 * Unmute ADC0 and set the default input to mic-in
14771 */
14772 /* port-A for surround (rear panel) */
14773 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14774 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
14775 /* port-B for mic-in (rear panel) with vref */
14776 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14777 /* port-C for line-in (rear panel) */
14778 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14779 /* port-D for Front */
14780 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14781 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14782 /* port-E for HP out (front panel) */
14783 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14784 /* route front PCM to HP */
9dece1d7 14785 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
df694daa
KY
14786 /* port-F for mic-in (front panel) with vref */
14787 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14788 /* port-G for CLFE (rear panel) */
14789 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14790 { 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14791 /* port-H for side (rear panel) */
14792 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14793 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
14794 /* CD-in */
14795 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14796 /* route front mic to ADC1*/
14797 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14798 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
ea1fb29a 14799
df694daa
KY
14800 /* Unmute DAC0~3 & spdif out*/
14801 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14802 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14803 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14804 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14805 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
ea1fb29a 14806
df694daa
KY
14807 /* Unmute Mixer 14 (mic) 1c (Line in)*/
14808 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14809 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14810 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14811 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 14812
df694daa
KY
14813 /* Unmute Stereo Mixer 15 */
14814 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14815 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14816 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
f12ab1e0 14817 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
df694daa
KY
14818
14819 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14820 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14821 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14822 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14823 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14824 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14825 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14826 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
f12ab1e0
TI
14827 /* hp used DAC 3 (Front) */
14828 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
df694daa
KY
14829 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14830
14831 { }
14832};
14833
14834static struct hda_verb alc861_threestack_init_verbs[] = {
14835 /*
14836 * Unmute ADC0 and set the default input to mic-in
14837 */
14838 /* port-A for surround (rear panel) */
14839 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14840 /* port-B for mic-in (rear panel) with vref */
14841 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14842 /* port-C for line-in (rear panel) */
14843 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14844 /* port-D for Front */
14845 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14846 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14847 /* port-E for HP out (front panel) */
14848 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14849 /* route front PCM to HP */
9dece1d7 14850 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
df694daa
KY
14851 /* port-F for mic-in (front panel) with vref */
14852 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14853 /* port-G for CLFE (rear panel) */
14854 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14855 /* port-H for side (rear panel) */
14856 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14857 /* CD-in */
14858 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14859 /* route front mic to ADC1*/
14860 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14861 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14862 /* Unmute DAC0~3 & spdif out*/
14863 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14864 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14865 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14866 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14867 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
ea1fb29a 14868
df694daa
KY
14869 /* Unmute Mixer 14 (mic) 1c (Line in)*/
14870 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14871 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14872 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14873 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 14874
df694daa
KY
14875 /* Unmute Stereo Mixer 15 */
14876 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14877 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14878 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
f12ab1e0 14879 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
df694daa
KY
14880
14881 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14882 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14883 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14884 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14885 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14886 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14887 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14888 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
f12ab1e0
TI
14889 /* hp used DAC 3 (Front) */
14890 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
df694daa
KY
14891 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14892 { }
14893};
22309c3e
TI
14894
14895static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
14896 /*
14897 * Unmute ADC0 and set the default input to mic-in
14898 */
14899 /* port-A for surround (rear panel) */
14900 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14901 /* port-B for mic-in (rear panel) with vref */
14902 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14903 /* port-C for line-in (rear panel) */
14904 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14905 /* port-D for Front */
14906 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14907 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14908 /* port-E for HP out (front panel) */
f12ab1e0
TI
14909 /* this has to be set to VREF80 */
14910 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
22309c3e 14911 /* route front PCM to HP */
9dece1d7 14912 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
22309c3e
TI
14913 /* port-F for mic-in (front panel) with vref */
14914 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14915 /* port-G for CLFE (rear panel) */
14916 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14917 /* port-H for side (rear panel) */
14918 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14919 /* CD-in */
14920 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14921 /* route front mic to ADC1*/
14922 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14923 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14924 /* Unmute DAC0~3 & spdif out*/
14925 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14926 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14927 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14928 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14929 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
ea1fb29a 14930
22309c3e
TI
14931 /* Unmute Mixer 14 (mic) 1c (Line in)*/
14932 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14933 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14934 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14935 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 14936
22309c3e
TI
14937 /* Unmute Stereo Mixer 15 */
14938 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14939 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14940 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
f12ab1e0 14941 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
22309c3e
TI
14942
14943 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14944 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14945 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14946 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14947 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14948 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14949 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14950 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
f12ab1e0
TI
14951 /* hp used DAC 3 (Front) */
14952 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
22309c3e
TI
14953 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14954 { }
14955};
14956
7cdbff94
MD
14957static struct hda_verb alc861_asus_init_verbs[] = {
14958 /*
14959 * Unmute ADC0 and set the default input to mic-in
14960 */
f12ab1e0
TI
14961 /* port-A for surround (rear panel)
14962 * according to codec#0 this is the HP jack
14963 */
7cdbff94
MD
14964 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
14965 /* route front PCM to HP */
14966 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
14967 /* port-B for mic-in (rear panel) with vref */
14968 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14969 /* port-C for line-in (rear panel) */
14970 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14971 /* port-D for Front */
14972 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14973 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14974 /* port-E for HP out (front panel) */
f12ab1e0
TI
14975 /* this has to be set to VREF80 */
14976 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
7cdbff94 14977 /* route front PCM to HP */
9dece1d7 14978 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
7cdbff94
MD
14979 /* port-F for mic-in (front panel) with vref */
14980 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14981 /* port-G for CLFE (rear panel) */
14982 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14983 /* port-H for side (rear panel) */
14984 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14985 /* CD-in */
14986 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14987 /* route front mic to ADC1*/
14988 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14989 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14990 /* Unmute DAC0~3 & spdif out*/
14991 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14992 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14993 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14994 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14995 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14996 /* Unmute Mixer 14 (mic) 1c (Line in)*/
14997 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14998 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14999 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15000 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 15001
7cdbff94
MD
15002 /* Unmute Stereo Mixer 15 */
15003 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15004 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15005 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
f12ab1e0 15006 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
7cdbff94
MD
15007
15008 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15009 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15010 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15011 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15012 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15013 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15014 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15015 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
f12ab1e0
TI
15016 /* hp used DAC 3 (Front) */
15017 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7cdbff94
MD
15018 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15019 { }
15020};
15021
56bb0cab
TI
15022/* additional init verbs for ASUS laptops */
15023static struct hda_verb alc861_asus_laptop_init_verbs[] = {
15024 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
15025 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
15026 { }
15027};
7cdbff94 15028
df694daa
KY
15029/*
15030 * generic initialization of ADC, input mixers and output mixers
15031 */
15032static struct hda_verb alc861_auto_init_verbs[] = {
15033 /*
15034 * Unmute ADC0 and set the default input to mic-in
15035 */
f12ab1e0 15036 /* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
df694daa 15037 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
ea1fb29a 15038
df694daa
KY
15039 /* Unmute DAC0~3 & spdif out*/
15040 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15041 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15042 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15043 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15044 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
ea1fb29a 15045
df694daa
KY
15046 /* Unmute Mixer 14 (mic) 1c (Line in)*/
15047 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15048 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15049 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15050 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
ea1fb29a 15051
df694daa
KY
15052 /* Unmute Stereo Mixer 15 */
15053 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15054 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15055 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15056 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
15057
1c20930a
TI
15058 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15059 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15060 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15061 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15062 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15063 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15064 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15065 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
df694daa
KY
15066
15067 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15068 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1c20930a
TI
15069 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15070 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
df694daa
KY
15071 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15072 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
1c20930a
TI
15073 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15074 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
df694daa 15075
f12ab1e0 15076 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, /* set Mic 1 */
df694daa
KY
15077
15078 { }
15079};
15080
a53d1aec
TD
15081static struct hda_verb alc861_toshiba_init_verbs[] = {
15082 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
f12ab1e0 15083
a53d1aec
TD
15084 { }
15085};
15086
15087/* toggle speaker-output according to the hp-jack state */
15088static void alc861_toshiba_automute(struct hda_codec *codec)
15089{
864f92be 15090 unsigned int present = snd_hda_jack_detect(codec, 0x0f);
a53d1aec 15091
47fd830a
TI
15092 snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
15093 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
15094 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
15095 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
a53d1aec
TD
15096}
15097
15098static void alc861_toshiba_unsol_event(struct hda_codec *codec,
15099 unsigned int res)
15100{
a53d1aec
TD
15101 if ((res >> 26) == ALC880_HP_EVENT)
15102 alc861_toshiba_automute(codec);
15103}
15104
def319f9 15105/* pcm configuration: identical with ALC880 */
df694daa
KY
15106#define alc861_pcm_analog_playback alc880_pcm_analog_playback
15107#define alc861_pcm_analog_capture alc880_pcm_analog_capture
15108#define alc861_pcm_digital_playback alc880_pcm_digital_playback
15109#define alc861_pcm_digital_capture alc880_pcm_digital_capture
15110
15111
15112#define ALC861_DIGOUT_NID 0x07
15113
15114static struct hda_channel_mode alc861_8ch_modes[1] = {
15115 { 8, NULL }
15116};
15117
15118static hda_nid_t alc861_dac_nids[4] = {
15119 /* front, surround, clfe, side */
15120 0x03, 0x06, 0x05, 0x04
15121};
15122
9c7f852e
TI
15123static hda_nid_t alc660_dac_nids[3] = {
15124 /* front, clfe, surround */
15125 0x03, 0x05, 0x06
15126};
15127
df694daa
KY
15128static hda_nid_t alc861_adc_nids[1] = {
15129 /* ADC0-2 */
15130 0x08,
15131};
15132
15133static struct hda_input_mux alc861_capture_source = {
15134 .num_items = 5,
15135 .items = {
15136 { "Mic", 0x0 },
15137 { "Front Mic", 0x3 },
15138 { "Line", 0x1 },
15139 { "CD", 0x4 },
15140 { "Mixer", 0x5 },
15141 },
15142};
15143
1c20930a
TI
15144static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
15145{
15146 struct alc_spec *spec = codec->spec;
15147 hda_nid_t mix, srcs[5];
15148 int i, j, num;
15149
15150 if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
15151 return 0;
15152 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15153 if (num < 0)
15154 return 0;
15155 for (i = 0; i < num; i++) {
15156 unsigned int type;
a22d543a 15157 type = get_wcaps_type(get_wcaps(codec, srcs[i]));
1c20930a
TI
15158 if (type != AC_WID_AUD_OUT)
15159 continue;
15160 for (j = 0; j < spec->multiout.num_dacs; j++)
15161 if (spec->multiout.dac_nids[j] == srcs[i])
15162 break;
15163 if (j >= spec->multiout.num_dacs)
15164 return srcs[i];
15165 }
15166 return 0;
15167}
15168
df694daa 15169/* fill in the dac_nids table from the parsed pin configuration */
1c20930a 15170static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
f12ab1e0 15171 const struct auto_pin_cfg *cfg)
df694daa 15172{
1c20930a 15173 struct alc_spec *spec = codec->spec;
df694daa 15174 int i;
1c20930a 15175 hda_nid_t nid, dac;
df694daa
KY
15176
15177 spec->multiout.dac_nids = spec->private_dac_nids;
15178 for (i = 0; i < cfg->line_outs; i++) {
15179 nid = cfg->line_out_pins[i];
1c20930a
TI
15180 dac = alc861_look_for_dac(codec, nid);
15181 if (!dac)
15182 continue;
15183 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
df694daa 15184 }
df694daa
KY
15185 return 0;
15186}
15187
1c20930a
TI
15188static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
15189 hda_nid_t nid, unsigned int chs)
15190{
0afe5f89 15191 return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx,
1c20930a
TI
15192 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
15193}
15194
df694daa 15195/* add playback controls from the parsed DAC table */
1c20930a 15196static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
df694daa
KY
15197 const struct auto_pin_cfg *cfg)
15198{
1c20930a 15199 struct alc_spec *spec = codec->spec;
f12ab1e0
TI
15200 static const char *chname[4] = {
15201 "Front", "Surround", NULL /*CLFE*/, "Side"
15202 };
df694daa 15203 hda_nid_t nid;
1c20930a
TI
15204 int i, err;
15205
15206 if (cfg->line_outs == 1) {
15207 const char *pfx = NULL;
15208 if (!cfg->hp_outs)
15209 pfx = "Master";
15210 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
15211 pfx = "Speaker";
15212 if (pfx) {
15213 nid = spec->multiout.dac_nids[0];
15214 return alc861_create_out_sw(codec, pfx, nid, 3);
15215 }
15216 }
df694daa
KY
15217
15218 for (i = 0; i < cfg->line_outs; i++) {
15219 nid = spec->multiout.dac_nids[i];
f12ab1e0 15220 if (!nid)
df694daa 15221 continue;
1c20930a 15222 if (i == 2) {
df694daa 15223 /* Center/LFE */
1c20930a 15224 err = alc861_create_out_sw(codec, "Center", nid, 1);
f12ab1e0 15225 if (err < 0)
df694daa 15226 return err;
1c20930a 15227 err = alc861_create_out_sw(codec, "LFE", nid, 2);
f12ab1e0 15228 if (err < 0)
df694daa
KY
15229 return err;
15230 } else {
1c20930a 15231 err = alc861_create_out_sw(codec, chname[i], nid, 3);
f12ab1e0 15232 if (err < 0)
df694daa
KY
15233 return err;
15234 }
15235 }
15236 return 0;
15237}
15238
1c20930a 15239static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
df694daa 15240{
1c20930a 15241 struct alc_spec *spec = codec->spec;
df694daa
KY
15242 int err;
15243 hda_nid_t nid;
15244
f12ab1e0 15245 if (!pin)
df694daa
KY
15246 return 0;
15247
15248 if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
1c20930a
TI
15249 nid = alc861_look_for_dac(codec, pin);
15250 if (nid) {
15251 err = alc861_create_out_sw(codec, "Headphone", nid, 3);
15252 if (err < 0)
15253 return err;
15254 spec->multiout.hp_nid = nid;
15255 }
df694daa
KY
15256 }
15257 return 0;
15258}
15259
15260/* create playback/capture controls for input pins */
05f5f477 15261static int alc861_auto_create_input_ctls(struct hda_codec *codec,
f12ab1e0 15262 const struct auto_pin_cfg *cfg)
df694daa 15263{
05f5f477 15264 return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
df694daa
KY
15265}
15266
f12ab1e0
TI
15267static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
15268 hda_nid_t nid,
1c20930a 15269 int pin_type, hda_nid_t dac)
df694daa 15270{
1c20930a
TI
15271 hda_nid_t mix, srcs[5];
15272 int i, num;
15273
564c5bea
JL
15274 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
15275 pin_type);
1c20930a 15276 snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
564c5bea 15277 AMP_OUT_UNMUTE);
1c20930a
TI
15278 if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
15279 return;
15280 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15281 if (num < 0)
15282 return;
15283 for (i = 0; i < num; i++) {
15284 unsigned int mute;
15285 if (srcs[i] == dac || srcs[i] == 0x15)
15286 mute = AMP_IN_UNMUTE(i);
15287 else
15288 mute = AMP_IN_MUTE(i);
15289 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15290 mute);
15291 }
df694daa
KY
15292}
15293
15294static void alc861_auto_init_multi_out(struct hda_codec *codec)
15295{
15296 struct alc_spec *spec = codec->spec;
15297 int i;
15298
15299 for (i = 0; i < spec->autocfg.line_outs; i++) {
15300 hda_nid_t nid = spec->autocfg.line_out_pins[i];
baba8ee9 15301 int pin_type = get_pin_type(spec->autocfg.line_out_type);
df694daa 15302 if (nid)
baba8ee9 15303 alc861_auto_set_output_and_unmute(codec, nid, pin_type,
f12ab1e0 15304 spec->multiout.dac_nids[i]);
df694daa
KY
15305 }
15306}
15307
15308static void alc861_auto_init_hp_out(struct hda_codec *codec)
15309{
15310 struct alc_spec *spec = codec->spec;
df694daa 15311
15870f05
TI
15312 if (spec->autocfg.hp_outs)
15313 alc861_auto_set_output_and_unmute(codec,
15314 spec->autocfg.hp_pins[0],
15315 PIN_HP,
1c20930a 15316 spec->multiout.hp_nid);
15870f05
TI
15317 if (spec->autocfg.speaker_outs)
15318 alc861_auto_set_output_and_unmute(codec,
15319 spec->autocfg.speaker_pins[0],
15320 PIN_OUT,
1c20930a 15321 spec->multiout.dac_nids[0]);
df694daa
KY
15322}
15323
15324static void alc861_auto_init_analog_input(struct hda_codec *codec)
15325{
15326 struct alc_spec *spec = codec->spec;
15327 int i;
15328
15329 for (i = 0; i < AUTO_PIN_LAST; i++) {
15330 hda_nid_t nid = spec->autocfg.input_pins[i];
23f0c048
TI
15331 if (nid >= 0x0c && nid <= 0x11)
15332 alc_set_input_pin(codec, nid, i);
df694daa
KY
15333 }
15334}
15335
15336/* parse the BIOS configuration and set up the alc_spec */
f12ab1e0
TI
15337/* return 1 if successful, 0 if the proper config is not found,
15338 * or a negative error code
15339 */
df694daa
KY
15340static int alc861_parse_auto_config(struct hda_codec *codec)
15341{
15342 struct alc_spec *spec = codec->spec;
15343 int err;
15344 static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
15345
f12ab1e0
TI
15346 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15347 alc861_ignore);
15348 if (err < 0)
df694daa 15349 return err;
f12ab1e0 15350 if (!spec->autocfg.line_outs)
df694daa
KY
15351 return 0; /* can't find valid BIOS pin config */
15352
1c20930a 15353 err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
f12ab1e0
TI
15354 if (err < 0)
15355 return err;
1c20930a 15356 err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
f12ab1e0
TI
15357 if (err < 0)
15358 return err;
1c20930a 15359 err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
f12ab1e0
TI
15360 if (err < 0)
15361 return err;
05f5f477 15362 err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 15363 if (err < 0)
df694daa
KY
15364 return err;
15365
15366 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
15367
0852d7a6 15368 if (spec->autocfg.dig_outs)
df694daa
KY
15369 spec->multiout.dig_out_nid = ALC861_DIGOUT_NID;
15370
603c4019 15371 if (spec->kctls.list)
d88897ea 15372 add_mixer(spec, spec->kctls.list);
df694daa 15373
d88897ea 15374 add_verb(spec, alc861_auto_init_verbs);
df694daa 15375
a1e8d2da 15376 spec->num_mux_defs = 1;
61b9b9b1 15377 spec->input_mux = &spec->private_imux[0];
df694daa
KY
15378
15379 spec->adc_nids = alc861_adc_nids;
15380 spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
b59bdf3b 15381 set_capture_mixer(codec);
df694daa 15382
6227cdce 15383 alc_ssid_check(codec, 0x0e, 0x0f, 0x0b, 0);
4a79ba34 15384
df694daa
KY
15385 return 1;
15386}
15387
ae6b813a
TI
15388/* additional initialization for auto-configuration model */
15389static void alc861_auto_init(struct hda_codec *codec)
df694daa 15390{
f6c7e546 15391 struct alc_spec *spec = codec->spec;
df694daa
KY
15392 alc861_auto_init_multi_out(codec);
15393 alc861_auto_init_hp_out(codec);
15394 alc861_auto_init_analog_input(codec);
f6c7e546 15395 if (spec->unsol_event)
7fb0d78f 15396 alc_inithook(codec);
df694daa
KY
15397}
15398
cb53c626
TI
15399#ifdef CONFIG_SND_HDA_POWER_SAVE
15400static struct hda_amp_list alc861_loopbacks[] = {
15401 { 0x15, HDA_INPUT, 0 },
15402 { 0x15, HDA_INPUT, 1 },
15403 { 0x15, HDA_INPUT, 2 },
15404 { 0x15, HDA_INPUT, 3 },
15405 { } /* end */
15406};
15407#endif
15408
df694daa
KY
15409
15410/*
15411 * configuration and preset
15412 */
f5fcc13c
TI
15413static const char *alc861_models[ALC861_MODEL_LAST] = {
15414 [ALC861_3ST] = "3stack",
15415 [ALC660_3ST] = "3stack-660",
15416 [ALC861_3ST_DIG] = "3stack-dig",
15417 [ALC861_6ST_DIG] = "6stack-dig",
15418 [ALC861_UNIWILL_M31] = "uniwill-m31",
15419 [ALC861_TOSHIBA] = "toshiba",
15420 [ALC861_ASUS] = "asus",
15421 [ALC861_ASUS_LAPTOP] = "asus-laptop",
15422 [ALC861_AUTO] = "auto",
15423};
15424
15425static struct snd_pci_quirk alc861_cfg_tbl[] = {
687a47bd 15426 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
f5fcc13c
TI
15427 SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15428 SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15429 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
ac3e3741 15430 SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
83c34218 15431 SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
ad5e7737 15432 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
341d4eb0
TI
15433 /* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
15434 * Any other models that need this preset?
15435 */
15436 /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
ac3e3741
TI
15437 SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
15438 SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
4147dab6 15439 SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
ac3e3741
TI
15440 SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
15441 SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
15442 /* FIXME: the below seems conflict */
15443 /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
07e038b3 15444 SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
f5fcc13c 15445 SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
df694daa
KY
15446 {}
15447};
15448
15449static struct alc_config_preset alc861_presets[] = {
15450 [ALC861_3ST] = {
15451 .mixers = { alc861_3ST_mixer },
15452 .init_verbs = { alc861_threestack_init_verbs },
15453 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15454 .dac_nids = alc861_dac_nids,
15455 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15456 .channel_mode = alc861_threestack_modes,
4e195a7b 15457 .need_dac_fix = 1,
df694daa
KY
15458 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15459 .adc_nids = alc861_adc_nids,
15460 .input_mux = &alc861_capture_source,
15461 },
15462 [ALC861_3ST_DIG] = {
15463 .mixers = { alc861_base_mixer },
15464 .init_verbs = { alc861_threestack_init_verbs },
15465 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15466 .dac_nids = alc861_dac_nids,
15467 .dig_out_nid = ALC861_DIGOUT_NID,
15468 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15469 .channel_mode = alc861_threestack_modes,
4e195a7b 15470 .need_dac_fix = 1,
df694daa
KY
15471 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15472 .adc_nids = alc861_adc_nids,
15473 .input_mux = &alc861_capture_source,
15474 },
15475 [ALC861_6ST_DIG] = {
15476 .mixers = { alc861_base_mixer },
15477 .init_verbs = { alc861_base_init_verbs },
15478 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15479 .dac_nids = alc861_dac_nids,
15480 .dig_out_nid = ALC861_DIGOUT_NID,
15481 .num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
15482 .channel_mode = alc861_8ch_modes,
15483 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15484 .adc_nids = alc861_adc_nids,
15485 .input_mux = &alc861_capture_source,
15486 },
9c7f852e
TI
15487 [ALC660_3ST] = {
15488 .mixers = { alc861_3ST_mixer },
15489 .init_verbs = { alc861_threestack_init_verbs },
15490 .num_dacs = ARRAY_SIZE(alc660_dac_nids),
15491 .dac_nids = alc660_dac_nids,
15492 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15493 .channel_mode = alc861_threestack_modes,
4e195a7b 15494 .need_dac_fix = 1,
9c7f852e
TI
15495 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15496 .adc_nids = alc861_adc_nids,
15497 .input_mux = &alc861_capture_source,
15498 },
22309c3e
TI
15499 [ALC861_UNIWILL_M31] = {
15500 .mixers = { alc861_uniwill_m31_mixer },
15501 .init_verbs = { alc861_uniwill_m31_init_verbs },
15502 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15503 .dac_nids = alc861_dac_nids,
15504 .dig_out_nid = ALC861_DIGOUT_NID,
15505 .num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
15506 .channel_mode = alc861_uniwill_m31_modes,
15507 .need_dac_fix = 1,
15508 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15509 .adc_nids = alc861_adc_nids,
15510 .input_mux = &alc861_capture_source,
15511 },
a53d1aec
TD
15512 [ALC861_TOSHIBA] = {
15513 .mixers = { alc861_toshiba_mixer },
f12ab1e0
TI
15514 .init_verbs = { alc861_base_init_verbs,
15515 alc861_toshiba_init_verbs },
a53d1aec
TD
15516 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15517 .dac_nids = alc861_dac_nids,
15518 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15519 .channel_mode = alc883_3ST_2ch_modes,
15520 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15521 .adc_nids = alc861_adc_nids,
15522 .input_mux = &alc861_capture_source,
15523 .unsol_event = alc861_toshiba_unsol_event,
15524 .init_hook = alc861_toshiba_automute,
15525 },
7cdbff94
MD
15526 [ALC861_ASUS] = {
15527 .mixers = { alc861_asus_mixer },
15528 .init_verbs = { alc861_asus_init_verbs },
15529 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15530 .dac_nids = alc861_dac_nids,
15531 .dig_out_nid = ALC861_DIGOUT_NID,
15532 .num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
15533 .channel_mode = alc861_asus_modes,
15534 .need_dac_fix = 1,
15535 .hp_nid = 0x06,
15536 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15537 .adc_nids = alc861_adc_nids,
15538 .input_mux = &alc861_capture_source,
15539 },
56bb0cab
TI
15540 [ALC861_ASUS_LAPTOP] = {
15541 .mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
15542 .init_verbs = { alc861_asus_init_verbs,
15543 alc861_asus_laptop_init_verbs },
15544 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15545 .dac_nids = alc861_dac_nids,
15546 .dig_out_nid = ALC861_DIGOUT_NID,
15547 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15548 .channel_mode = alc883_3ST_2ch_modes,
15549 .need_dac_fix = 1,
15550 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15551 .adc_nids = alc861_adc_nids,
15552 .input_mux = &alc861_capture_source,
15553 },
15554};
df694daa 15555
cfc9b06f
TI
15556/* Pin config fixes */
15557enum {
15558 PINFIX_FSC_AMILO_PI1505,
15559};
15560
15561static struct alc_pincfg alc861_fsc_amilo_pi1505_pinfix[] = {
15562 { 0x0b, 0x0221101f }, /* HP */
15563 { 0x0f, 0x90170310 }, /* speaker */
15564 { }
15565};
15566
15567static const struct alc_fixup alc861_fixups[] = {
15568 [PINFIX_FSC_AMILO_PI1505] = {
15569 .pins = alc861_fsc_amilo_pi1505_pinfix
15570 },
15571};
15572
15573static struct snd_pci_quirk alc861_fixup_tbl[] = {
15574 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
15575 {}
15576};
df694daa
KY
15577
15578static int patch_alc861(struct hda_codec *codec)
15579{
15580 struct alc_spec *spec;
15581 int board_config;
15582 int err;
15583
dc041e0b 15584 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
df694daa
KY
15585 if (spec == NULL)
15586 return -ENOMEM;
15587
f12ab1e0 15588 codec->spec = spec;
df694daa 15589
f5fcc13c
TI
15590 board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
15591 alc861_models,
15592 alc861_cfg_tbl);
9c7f852e 15593
f5fcc13c 15594 if (board_config < 0) {
9a11f1aa
TI
15595 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15596 codec->chip_name);
df694daa
KY
15597 board_config = ALC861_AUTO;
15598 }
15599
7fa90e87
TI
15600 if (board_config == ALC861_AUTO)
15601 alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 1);
cfc9b06f 15602
df694daa
KY
15603 if (board_config == ALC861_AUTO) {
15604 /* automatic parse from the BIOS config */
15605 err = alc861_parse_auto_config(codec);
15606 if (err < 0) {
15607 alc_free(codec);
15608 return err;
f12ab1e0 15609 } else if (!err) {
9c7f852e
TI
15610 printk(KERN_INFO
15611 "hda_codec: Cannot set up configuration "
15612 "from BIOS. Using base mode...\n");
df694daa
KY
15613 board_config = ALC861_3ST_DIG;
15614 }
15615 }
15616
680cd536
KK
15617 err = snd_hda_attach_beep_device(codec, 0x23);
15618 if (err < 0) {
15619 alc_free(codec);
15620 return err;
15621 }
15622
df694daa 15623 if (board_config != ALC861_AUTO)
e9c364c0 15624 setup_preset(codec, &alc861_presets[board_config]);
df694daa 15625
df694daa
KY
15626 spec->stream_analog_playback = &alc861_pcm_analog_playback;
15627 spec->stream_analog_capture = &alc861_pcm_analog_capture;
15628
df694daa
KY
15629 spec->stream_digital_playback = &alc861_pcm_digital_playback;
15630 spec->stream_digital_capture = &alc861_pcm_digital_capture;
15631
c7a8eb10
TI
15632 if (!spec->cap_mixer)
15633 set_capture_mixer(codec);
45bdd1c1
TI
15634 set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
15635
2134ea4f
TI
15636 spec->vmaster_nid = 0x03;
15637
7fa90e87
TI
15638 if (board_config == ALC861_AUTO)
15639 alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 0);
15640
df694daa 15641 codec->patch_ops = alc_patch_ops;
c97259df 15642 if (board_config == ALC861_AUTO) {
ae6b813a 15643 spec->init_hook = alc861_auto_init;
c97259df
DC
15644#ifdef CONFIG_SND_HDA_POWER_SAVE
15645 spec->power_hook = alc_power_eapd;
15646#endif
15647 }
cb53c626
TI
15648#ifdef CONFIG_SND_HDA_POWER_SAVE
15649 if (!spec->loopback.amplist)
15650 spec->loopback.amplist = alc861_loopbacks;
15651#endif
ea1fb29a 15652
1da177e4
LT
15653 return 0;
15654}
15655
f32610ed
JS
15656/*
15657 * ALC861-VD support
15658 *
15659 * Based on ALC882
15660 *
15661 * In addition, an independent DAC
15662 */
15663#define ALC861VD_DIGOUT_NID 0x06
15664
15665static hda_nid_t alc861vd_dac_nids[4] = {
15666 /* front, surr, clfe, side surr */
15667 0x02, 0x03, 0x04, 0x05
15668};
15669
15670/* dac_nids for ALC660vd are in a different order - according to
15671 * Realtek's driver.
def319f9 15672 * This should probably result in a different mixer for 6stack models
f32610ed
JS
15673 * of ALC660vd codecs, but for now there is only 3stack mixer
15674 * - and it is the same as in 861vd.
15675 * adc_nids in ALC660vd are (is) the same as in 861vd
15676 */
15677static hda_nid_t alc660vd_dac_nids[3] = {
15678 /* front, rear, clfe, rear_surr */
15679 0x02, 0x04, 0x03
15680};
15681
15682static hda_nid_t alc861vd_adc_nids[1] = {
15683 /* ADC0 */
15684 0x09,
15685};
15686
e1406348
TI
15687static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
15688
f32610ed
JS
15689/* input MUX */
15690/* FIXME: should be a matrix-type input source selection */
15691static struct hda_input_mux alc861vd_capture_source = {
15692 .num_items = 4,
15693 .items = {
15694 { "Mic", 0x0 },
15695 { "Front Mic", 0x1 },
15696 { "Line", 0x2 },
15697 { "CD", 0x4 },
15698 },
15699};
15700
272a527c 15701static struct hda_input_mux alc861vd_dallas_capture_source = {
b419f346 15702 .num_items = 2,
272a527c 15703 .items = {
b419f346
TD
15704 { "Ext Mic", 0x0 },
15705 { "Int Mic", 0x1 },
272a527c
KY
15706 },
15707};
15708
d1a991a6
KY
15709static struct hda_input_mux alc861vd_hp_capture_source = {
15710 .num_items = 2,
15711 .items = {
15712 { "Front Mic", 0x0 },
15713 { "ATAPI Mic", 0x1 },
15714 },
15715};
15716
f32610ed
JS
15717/*
15718 * 2ch mode
15719 */
15720static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
15721 { 2, NULL }
15722};
15723
15724/*
15725 * 6ch mode
15726 */
15727static struct hda_verb alc861vd_6stack_ch6_init[] = {
15728 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15729 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15730 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15731 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15732 { } /* end */
15733};
15734
15735/*
15736 * 8ch mode
15737 */
15738static struct hda_verb alc861vd_6stack_ch8_init[] = {
15739 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15740 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15741 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15742 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15743 { } /* end */
15744};
15745
15746static struct hda_channel_mode alc861vd_6stack_modes[2] = {
15747 { 6, alc861vd_6stack_ch6_init },
15748 { 8, alc861vd_6stack_ch8_init },
15749};
15750
15751static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
15752 {
15753 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15754 .name = "Channel Mode",
15755 .info = alc_ch_mode_info,
15756 .get = alc_ch_mode_get,
15757 .put = alc_ch_mode_put,
15758 },
15759 { } /* end */
15760};
15761
f32610ed
JS
15762/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
15763 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
15764 */
15765static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
15766 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15767 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15768
15769 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15770 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
15771
15772 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
15773 HDA_OUTPUT),
15774 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
15775 HDA_OUTPUT),
15776 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
15777 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
15778
15779 HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
15780 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
15781
15782 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15783
15784 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15785 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15786 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15787
15788 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15789 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15790 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15791
15792 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15793 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15794
15795 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15796 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15797
f32610ed
JS
15798 { } /* end */
15799};
15800
15801static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
15802 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15803 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15804
15805 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15806
15807 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15808 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15809 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15810
15811 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15812 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15813 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15814
15815 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15816 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15817
15818 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15819 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15820
f32610ed
JS
15821 { } /* end */
15822};
15823
bdd148a3
KY
15824static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
15825 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15826 /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
15827 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
15828
15829 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15830
15831 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15832 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15833 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15834
15835 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15836 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15837 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15838
15839 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15840 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15841
15842 { } /* end */
15843};
15844
b419f346
TD
15845/* Pin assignment: Speaker=0x14, HP = 0x15,
15846 * Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
272a527c
KY
15847 */
15848static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
b419f346
TD
15849 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15850 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
272a527c
KY
15851 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15852 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
b419f346
TD
15853 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
15854 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15855 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15856 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
15857 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15858 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
272a527c
KY
15859 { } /* end */
15860};
15861
d1a991a6
KY
15862/* Pin assignment: Speaker=0x14, Line-out = 0x15,
15863 * Front Mic=0x18, ATAPI Mic = 0x19,
15864 */
15865static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
15866 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15867 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15868 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15869 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15870 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15871 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15872 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15873 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
ea1fb29a 15874
d1a991a6
KY
15875 { } /* end */
15876};
15877
f32610ed
JS
15878/*
15879 * generic initialization of ADC, input mixers and output mixers
15880 */
15881static struct hda_verb alc861vd_volume_init_verbs[] = {
15882 /*
15883 * Unmute ADC0 and set the default input to mic-in
15884 */
15885 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15886 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15887
15888 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
15889 * the analog-loopback mixer widget
15890 */
15891 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
cb53c626
TI
15892 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15893 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15894 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15895 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15896 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
f32610ed
JS
15897
15898 /* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
bdd148a3
KY
15899 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15900 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15901 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
f32610ed 15902 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
f32610ed
JS
15903
15904 /*
15905 * Set up output mixers (0x02 - 0x05)
15906 */
15907 /* set vol=0 to output mixers */
15908 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15909 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15910 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15911 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15912
15913 /* set up input amps for analog loopback */
15914 /* Amp Indices: DAC = 0, mixer = 1 */
15915 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15916 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15917 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15918 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15919 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15920 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15921 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15922 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15923
15924 { }
15925};
15926
15927/*
15928 * 3-stack pin configuration:
15929 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
15930 */
15931static struct hda_verb alc861vd_3stack_init_verbs[] = {
15932 /*
15933 * Set pin mode and muting
15934 */
15935 /* set front pin widgets 0x14 for output */
15936 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15937 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15938 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15939
15940 /* Mic (rear) pin: input vref at 80% */
15941 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15942 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15943 /* Front Mic pin: input vref at 80% */
15944 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15945 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15946 /* Line In pin: input */
15947 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15948 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15949 /* Line-2 In: Headphone output (output 0 - 0x0c) */
15950 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15951 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15952 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15953 /* CD pin widget for input */
15954 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15955
15956 { }
15957};
15958
15959/*
15960 * 6-stack pin configuration:
15961 */
15962static struct hda_verb alc861vd_6stack_init_verbs[] = {
15963 /*
15964 * Set pin mode and muting
15965 */
15966 /* set front pin widgets 0x14 for output */
15967 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15968 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15969 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15970
15971 /* Rear Pin: output 1 (0x0d) */
15972 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15973 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15974 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
15975 /* CLFE Pin: output 2 (0x0e) */
15976 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15977 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15978 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
15979 /* Side Pin: output 3 (0x0f) */
15980 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15981 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15982 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
15983
15984 /* Mic (rear) pin: input vref at 80% */
15985 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15986 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15987 /* Front Mic pin: input vref at 80% */
15988 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15989 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15990 /* Line In pin: input */
15991 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15992 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15993 /* Line-2 In: Headphone output (output 0 - 0x0c) */
15994 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15995 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15996 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15997 /* CD pin widget for input */
15998 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15999
16000 { }
16001};
16002
bdd148a3
KY
16003static struct hda_verb alc861vd_eapd_verbs[] = {
16004 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16005 { }
16006};
16007
f9423e7a
KY
16008static struct hda_verb alc660vd_eapd_verbs[] = {
16009 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16010 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16011 { }
16012};
16013
bdd148a3
KY
16014static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
16015 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16016 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16017 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
16018 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
ea1fb29a 16019 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
bdd148a3
KY
16020 {}
16021};
16022
bdd148a3
KY
16023static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
16024{
16025 unsigned int present;
16026 unsigned char bits;
16027
864f92be 16028 present = snd_hda_jack_detect(codec, 0x18);
47fd830a 16029 bits = present ? HDA_AMP_MUTE : 0;
864f92be 16030
47fd830a
TI
16031 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
16032 HDA_AMP_MUTE, bits);
bdd148a3
KY
16033}
16034
4f5d1706 16035static void alc861vd_lenovo_setup(struct hda_codec *codec)
bdd148a3 16036{
a9fd4f3f 16037 struct alc_spec *spec = codec->spec;
a9fd4f3f
TI
16038 spec->autocfg.hp_pins[0] = 0x1b;
16039 spec->autocfg.speaker_pins[0] = 0x14;
4f5d1706
TI
16040}
16041
16042static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
16043{
a9fd4f3f 16044 alc_automute_amp(codec);
bdd148a3
KY
16045 alc861vd_lenovo_mic_automute(codec);
16046}
16047
16048static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
16049 unsigned int res)
16050{
16051 switch (res >> 26) {
bdd148a3
KY
16052 case ALC880_MIC_EVENT:
16053 alc861vd_lenovo_mic_automute(codec);
16054 break;
a9fd4f3f
TI
16055 default:
16056 alc_automute_amp_unsol_event(codec, res);
16057 break;
bdd148a3
KY
16058 }
16059}
16060
272a527c
KY
16061static struct hda_verb alc861vd_dallas_verbs[] = {
16062 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16063 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16064 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16065 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16066
16067 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16068 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16069 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16070 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16071 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16072 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16073 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16074 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
ea1fb29a 16075
272a527c
KY
16076 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16077 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16078 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16079 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16080 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16081 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16082 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16083 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16084
16085 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16086 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16087 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16088 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16089 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16090 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16091 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16092 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16093
16094 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16095 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16096 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16097 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16098
16099 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
ea1fb29a 16100 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
272a527c
KY
16101 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16102
16103 { } /* end */
16104};
16105
16106/* toggle speaker-output according to the hp-jack state */
4f5d1706 16107static void alc861vd_dallas_setup(struct hda_codec *codec)
272a527c 16108{
a9fd4f3f 16109 struct alc_spec *spec = codec->spec;
272a527c 16110
a9fd4f3f
TI
16111 spec->autocfg.hp_pins[0] = 0x15;
16112 spec->autocfg.speaker_pins[0] = 0x14;
272a527c
KY
16113}
16114
cb53c626
TI
16115#ifdef CONFIG_SND_HDA_POWER_SAVE
16116#define alc861vd_loopbacks alc880_loopbacks
16117#endif
16118
def319f9 16119/* pcm configuration: identical with ALC880 */
f32610ed
JS
16120#define alc861vd_pcm_analog_playback alc880_pcm_analog_playback
16121#define alc861vd_pcm_analog_capture alc880_pcm_analog_capture
16122#define alc861vd_pcm_digital_playback alc880_pcm_digital_playback
16123#define alc861vd_pcm_digital_capture alc880_pcm_digital_capture
16124
16125/*
16126 * configuration and preset
16127 */
16128static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
16129 [ALC660VD_3ST] = "3stack-660",
983f8ae4 16130 [ALC660VD_3ST_DIG] = "3stack-660-digout",
13c94744 16131 [ALC660VD_ASUS_V1S] = "asus-v1s",
f32610ed
JS
16132 [ALC861VD_3ST] = "3stack",
16133 [ALC861VD_3ST_DIG] = "3stack-digout",
16134 [ALC861VD_6ST_DIG] = "6stack-digout",
bdd148a3 16135 [ALC861VD_LENOVO] = "lenovo",
272a527c 16136 [ALC861VD_DALLAS] = "dallas",
983f8ae4 16137 [ALC861VD_HP] = "hp",
f32610ed
JS
16138 [ALC861VD_AUTO] = "auto",
16139};
16140
16141static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
ac3e3741
TI
16142 SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
16143 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
07e038b3 16144 SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
f8f25ba3 16145 /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
13c94744 16146 SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
6963f84c 16147 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
f32610ed 16148 SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
ac3e3741 16149 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
38baf5ad 16150 /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
ce577e8c 16151 SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
542d7c66 16152 SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
b419f346 16153 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
39c5d41f 16154 SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
dea0a509 16155 SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
625dc0bf 16156 SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
f32610ed
JS
16157 {}
16158};
16159
16160static struct alc_config_preset alc861vd_presets[] = {
16161 [ALC660VD_3ST] = {
16162 .mixers = { alc861vd_3st_mixer },
16163 .init_verbs = { alc861vd_volume_init_verbs,
16164 alc861vd_3stack_init_verbs },
16165 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16166 .dac_nids = alc660vd_dac_nids,
f32610ed
JS
16167 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16168 .channel_mode = alc861vd_3stack_2ch_modes,
16169 .input_mux = &alc861vd_capture_source,
16170 },
6963f84c
MC
16171 [ALC660VD_3ST_DIG] = {
16172 .mixers = { alc861vd_3st_mixer },
16173 .init_verbs = { alc861vd_volume_init_verbs,
16174 alc861vd_3stack_init_verbs },
16175 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16176 .dac_nids = alc660vd_dac_nids,
16177 .dig_out_nid = ALC861VD_DIGOUT_NID,
6963f84c
MC
16178 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16179 .channel_mode = alc861vd_3stack_2ch_modes,
16180 .input_mux = &alc861vd_capture_source,
16181 },
f32610ed
JS
16182 [ALC861VD_3ST] = {
16183 .mixers = { alc861vd_3st_mixer },
16184 .init_verbs = { alc861vd_volume_init_verbs,
16185 alc861vd_3stack_init_verbs },
16186 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16187 .dac_nids = alc861vd_dac_nids,
16188 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16189 .channel_mode = alc861vd_3stack_2ch_modes,
16190 .input_mux = &alc861vd_capture_source,
16191 },
16192 [ALC861VD_3ST_DIG] = {
16193 .mixers = { alc861vd_3st_mixer },
16194 .init_verbs = { alc861vd_volume_init_verbs,
16195 alc861vd_3stack_init_verbs },
16196 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16197 .dac_nids = alc861vd_dac_nids,
16198 .dig_out_nid = ALC861VD_DIGOUT_NID,
16199 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16200 .channel_mode = alc861vd_3stack_2ch_modes,
16201 .input_mux = &alc861vd_capture_source,
16202 },
16203 [ALC861VD_6ST_DIG] = {
16204 .mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
16205 .init_verbs = { alc861vd_volume_init_verbs,
16206 alc861vd_6stack_init_verbs },
16207 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16208 .dac_nids = alc861vd_dac_nids,
16209 .dig_out_nid = ALC861VD_DIGOUT_NID,
16210 .num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
16211 .channel_mode = alc861vd_6stack_modes,
16212 .input_mux = &alc861vd_capture_source,
16213 },
bdd148a3
KY
16214 [ALC861VD_LENOVO] = {
16215 .mixers = { alc861vd_lenovo_mixer },
16216 .init_verbs = { alc861vd_volume_init_verbs,
16217 alc861vd_3stack_init_verbs,
16218 alc861vd_eapd_verbs,
16219 alc861vd_lenovo_unsol_verbs },
16220 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16221 .dac_nids = alc660vd_dac_nids,
bdd148a3
KY
16222 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16223 .channel_mode = alc861vd_3stack_2ch_modes,
16224 .input_mux = &alc861vd_capture_source,
16225 .unsol_event = alc861vd_lenovo_unsol_event,
4f5d1706 16226 .setup = alc861vd_lenovo_setup,
a9fd4f3f 16227 .init_hook = alc861vd_lenovo_init_hook,
bdd148a3 16228 },
272a527c
KY
16229 [ALC861VD_DALLAS] = {
16230 .mixers = { alc861vd_dallas_mixer },
16231 .init_verbs = { alc861vd_dallas_verbs },
16232 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16233 .dac_nids = alc861vd_dac_nids,
272a527c
KY
16234 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16235 .channel_mode = alc861vd_3stack_2ch_modes,
16236 .input_mux = &alc861vd_dallas_capture_source,
a9fd4f3f 16237 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
16238 .setup = alc861vd_dallas_setup,
16239 .init_hook = alc_automute_amp,
d1a991a6
KY
16240 },
16241 [ALC861VD_HP] = {
16242 .mixers = { alc861vd_hp_mixer },
16243 .init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
16244 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16245 .dac_nids = alc861vd_dac_nids,
d1a991a6 16246 .dig_out_nid = ALC861VD_DIGOUT_NID,
d1a991a6
KY
16247 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16248 .channel_mode = alc861vd_3stack_2ch_modes,
16249 .input_mux = &alc861vd_hp_capture_source,
a9fd4f3f 16250 .unsol_event = alc_automute_amp_unsol_event,
4f5d1706
TI
16251 .setup = alc861vd_dallas_setup,
16252 .init_hook = alc_automute_amp,
ea1fb29a 16253 },
13c94744
TI
16254 [ALC660VD_ASUS_V1S] = {
16255 .mixers = { alc861vd_lenovo_mixer },
16256 .init_verbs = { alc861vd_volume_init_verbs,
16257 alc861vd_3stack_init_verbs,
16258 alc861vd_eapd_verbs,
16259 alc861vd_lenovo_unsol_verbs },
16260 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16261 .dac_nids = alc660vd_dac_nids,
16262 .dig_out_nid = ALC861VD_DIGOUT_NID,
16263 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16264 .channel_mode = alc861vd_3stack_2ch_modes,
16265 .input_mux = &alc861vd_capture_source,
16266 .unsol_event = alc861vd_lenovo_unsol_event,
4f5d1706 16267 .setup = alc861vd_lenovo_setup,
a9fd4f3f 16268 .init_hook = alc861vd_lenovo_init_hook,
13c94744 16269 },
f32610ed
JS
16270};
16271
16272/*
16273 * BIOS auto configuration
16274 */
05f5f477
TI
16275static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
16276 const struct auto_pin_cfg *cfg)
16277{
6227cdce 16278 return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0);
05f5f477
TI
16279}
16280
16281
f32610ed
JS
16282static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
16283 hda_nid_t nid, int pin_type, int dac_idx)
16284{
f6c7e546 16285 alc_set_pin_output(codec, nid, pin_type);
f32610ed
JS
16286}
16287
16288static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
16289{
16290 struct alc_spec *spec = codec->spec;
16291 int i;
16292
16293 for (i = 0; i <= HDA_SIDE; i++) {
16294 hda_nid_t nid = spec->autocfg.line_out_pins[i];
baba8ee9 16295 int pin_type = get_pin_type(spec->autocfg.line_out_type);
f32610ed
JS
16296 if (nid)
16297 alc861vd_auto_set_output_and_unmute(codec, nid,
baba8ee9 16298 pin_type, i);
f32610ed
JS
16299 }
16300}
16301
16302
16303static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
16304{
16305 struct alc_spec *spec = codec->spec;
16306 hda_nid_t pin;
16307
16308 pin = spec->autocfg.hp_pins[0];
def319f9 16309 if (pin) /* connect to front and use dac 0 */
f32610ed 16310 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
f6c7e546
TI
16311 pin = spec->autocfg.speaker_pins[0];
16312 if (pin)
16313 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
f32610ed
JS
16314}
16315
f32610ed
JS
16316#define ALC861VD_PIN_CD_NID ALC880_PIN_CD_NID
16317
16318static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
16319{
16320 struct alc_spec *spec = codec->spec;
16321 int i;
16322
16323 for (i = 0; i < AUTO_PIN_LAST; i++) {
16324 hda_nid_t nid = spec->autocfg.input_pins[i];
05f5f477 16325 if (alc_is_input_pin(codec, nid)) {
23f0c048 16326 alc_set_input_pin(codec, nid, i);
e82c025b
TI
16327 if (nid != ALC861VD_PIN_CD_NID &&
16328 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
f32610ed
JS
16329 snd_hda_codec_write(codec, nid, 0,
16330 AC_VERB_SET_AMP_GAIN_MUTE,
16331 AMP_OUT_MUTE);
16332 }
16333 }
16334}
16335
f511b01c
TI
16336#define alc861vd_auto_init_input_src alc882_auto_init_input_src
16337
f32610ed
JS
16338#define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02)
16339#define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c)
16340
16341/* add playback controls from the parsed DAC table */
16342/* Based on ALC880 version. But ALC861VD has separate,
16343 * different NIDs for mute/unmute switch and volume control */
16344static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
16345 const struct auto_pin_cfg *cfg)
16346{
f32610ed
JS
16347 static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
16348 hda_nid_t nid_v, nid_s;
16349 int i, err;
16350
16351 for (i = 0; i < cfg->line_outs; i++) {
f12ab1e0 16352 if (!spec->multiout.dac_nids[i])
f32610ed
JS
16353 continue;
16354 nid_v = alc861vd_idx_to_mixer_vol(
16355 alc880_dac_to_idx(
16356 spec->multiout.dac_nids[i]));
16357 nid_s = alc861vd_idx_to_mixer_switch(
16358 alc880_dac_to_idx(
16359 spec->multiout.dac_nids[i]));
16360
16361 if (i == 2) {
16362 /* Center/LFE */
0afe5f89
TI
16363 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16364 "Center",
f12ab1e0
TI
16365 HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
16366 HDA_OUTPUT));
16367 if (err < 0)
f32610ed 16368 return err;
0afe5f89
TI
16369 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16370 "LFE",
f12ab1e0
TI
16371 HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
16372 HDA_OUTPUT));
16373 if (err < 0)
f32610ed 16374 return err;
0afe5f89
TI
16375 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16376 "Center",
f12ab1e0
TI
16377 HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
16378 HDA_INPUT));
16379 if (err < 0)
f32610ed 16380 return err;
0afe5f89
TI
16381 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16382 "LFE",
f12ab1e0
TI
16383 HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
16384 HDA_INPUT));
16385 if (err < 0)
f32610ed
JS
16386 return err;
16387 } else {
a4fcd491
TI
16388 const char *pfx;
16389 if (cfg->line_outs == 1 &&
16390 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
16391 if (!cfg->hp_pins)
16392 pfx = "Speaker";
16393 else
16394 pfx = "PCM";
16395 } else
16396 pfx = chname[i];
0afe5f89 16397 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
f12ab1e0
TI
16398 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
16399 HDA_OUTPUT));
16400 if (err < 0)
f32610ed 16401 return err;
a4fcd491
TI
16402 if (cfg->line_outs == 1 &&
16403 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
16404 pfx = "Speaker";
0afe5f89 16405 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
bdd148a3 16406 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
f12ab1e0
TI
16407 HDA_INPUT));
16408 if (err < 0)
f32610ed
JS
16409 return err;
16410 }
16411 }
16412 return 0;
16413}
16414
16415/* add playback controls for speaker and HP outputs */
16416/* Based on ALC880 version. But ALC861VD has separate,
16417 * different NIDs for mute/unmute switch and volume control */
16418static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
16419 hda_nid_t pin, const char *pfx)
16420{
16421 hda_nid_t nid_v, nid_s;
16422 int err;
f32610ed 16423
f12ab1e0 16424 if (!pin)
f32610ed
JS
16425 return 0;
16426
16427 if (alc880_is_fixed_pin(pin)) {
16428 nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
16429 /* specify the DAC as the extra output */
f12ab1e0 16430 if (!spec->multiout.hp_nid)
f32610ed
JS
16431 spec->multiout.hp_nid = nid_v;
16432 else
16433 spec->multiout.extra_out_nid[0] = nid_v;
16434 /* control HP volume/switch on the output mixer amp */
16435 nid_v = alc861vd_idx_to_mixer_vol(
16436 alc880_fixed_pin_idx(pin));
16437 nid_s = alc861vd_idx_to_mixer_switch(
16438 alc880_fixed_pin_idx(pin));
16439
0afe5f89 16440 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
f12ab1e0
TI
16441 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
16442 if (err < 0)
f32610ed 16443 return err;
0afe5f89 16444 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
f12ab1e0
TI
16445 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
16446 if (err < 0)
f32610ed
JS
16447 return err;
16448 } else if (alc880_is_multi_pin(pin)) {
16449 /* set manual connection */
16450 /* we have only a switch on HP-out PIN */
0afe5f89 16451 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
f12ab1e0
TI
16452 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
16453 if (err < 0)
f32610ed
JS
16454 return err;
16455 }
16456 return 0;
16457}
16458
16459/* parse the BIOS configuration and set up the alc_spec
16460 * return 1 if successful, 0 if the proper config is not found,
16461 * or a negative error code
16462 * Based on ALC880 version - had to change it to override
16463 * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
16464static int alc861vd_parse_auto_config(struct hda_codec *codec)
16465{
16466 struct alc_spec *spec = codec->spec;
16467 int err;
16468 static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
16469
f12ab1e0
TI
16470 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
16471 alc861vd_ignore);
16472 if (err < 0)
f32610ed 16473 return err;
f12ab1e0 16474 if (!spec->autocfg.line_outs)
f32610ed
JS
16475 return 0; /* can't find valid BIOS pin config */
16476
f12ab1e0
TI
16477 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
16478 if (err < 0)
16479 return err;
16480 err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
16481 if (err < 0)
16482 return err;
16483 err = alc861vd_auto_create_extra_out(spec,
16484 spec->autocfg.speaker_pins[0],
16485 "Speaker");
16486 if (err < 0)
16487 return err;
16488 err = alc861vd_auto_create_extra_out(spec,
16489 spec->autocfg.hp_pins[0],
16490 "Headphone");
16491 if (err < 0)
16492 return err;
05f5f477 16493 err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 16494 if (err < 0)
f32610ed
JS
16495 return err;
16496
16497 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
16498
0852d7a6 16499 if (spec->autocfg.dig_outs)
f32610ed
JS
16500 spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID;
16501
603c4019 16502 if (spec->kctls.list)
d88897ea 16503 add_mixer(spec, spec->kctls.list);
f32610ed 16504
d88897ea 16505 add_verb(spec, alc861vd_volume_init_verbs);
f32610ed
JS
16506
16507 spec->num_mux_defs = 1;
61b9b9b1 16508 spec->input_mux = &spec->private_imux[0];
f32610ed 16509
776e184e
TI
16510 err = alc_auto_add_mic_boost(codec);
16511 if (err < 0)
16512 return err;
16513
6227cdce 16514 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4a79ba34 16515
f32610ed
JS
16516 return 1;
16517}
16518
16519/* additional initialization for auto-configuration model */
16520static void alc861vd_auto_init(struct hda_codec *codec)
16521{
f6c7e546 16522 struct alc_spec *spec = codec->spec;
f32610ed
JS
16523 alc861vd_auto_init_multi_out(codec);
16524 alc861vd_auto_init_hp_out(codec);
16525 alc861vd_auto_init_analog_input(codec);
f511b01c 16526 alc861vd_auto_init_input_src(codec);
f6c7e546 16527 if (spec->unsol_event)
7fb0d78f 16528 alc_inithook(codec);
f32610ed
JS
16529}
16530
f8f25ba3
TI
16531enum {
16532 ALC660VD_FIX_ASUS_GPIO1
16533};
16534
16535/* reset GPIO1 */
16536static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
16537 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
16538 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
16539 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
16540 { }
16541};
16542
16543static const struct alc_fixup alc861vd_fixups[] = {
16544 [ALC660VD_FIX_ASUS_GPIO1] = {
16545 .verbs = alc660vd_fix_asus_gpio1_verbs,
16546 },
16547};
16548
16549static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
16550 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
16551 {}
16552};
16553
f32610ed
JS
16554static int patch_alc861vd(struct hda_codec *codec)
16555{
16556 struct alc_spec *spec;
16557 int err, board_config;
16558
16559 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
16560 if (spec == NULL)
16561 return -ENOMEM;
16562
16563 codec->spec = spec;
16564
16565 board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
16566 alc861vd_models,
16567 alc861vd_cfg_tbl);
16568
16569 if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
9a11f1aa
TI
16570 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
16571 codec->chip_name);
f32610ed
JS
16572 board_config = ALC861VD_AUTO;
16573 }
16574
7fa90e87
TI
16575 if (board_config == ALC861VD_AUTO)
16576 alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 1);
f8f25ba3 16577
f32610ed
JS
16578 if (board_config == ALC861VD_AUTO) {
16579 /* automatic parse from the BIOS config */
16580 err = alc861vd_parse_auto_config(codec);
16581 if (err < 0) {
16582 alc_free(codec);
16583 return err;
f12ab1e0 16584 } else if (!err) {
f32610ed
JS
16585 printk(KERN_INFO
16586 "hda_codec: Cannot set up configuration "
16587 "from BIOS. Using base mode...\n");
16588 board_config = ALC861VD_3ST;
16589 }
16590 }
16591
680cd536
KK
16592 err = snd_hda_attach_beep_device(codec, 0x23);
16593 if (err < 0) {
16594 alc_free(codec);
16595 return err;
16596 }
16597
f32610ed 16598 if (board_config != ALC861VD_AUTO)
e9c364c0 16599 setup_preset(codec, &alc861vd_presets[board_config]);
f32610ed 16600
2f893286 16601 if (codec->vendor_id == 0x10ec0660) {
f9423e7a 16602 /* always turn on EAPD */
d88897ea 16603 add_verb(spec, alc660vd_eapd_verbs);
2f893286
KY
16604 }
16605
f32610ed
JS
16606 spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
16607 spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
16608
f32610ed
JS
16609 spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
16610 spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
16611
dd704698
TI
16612 if (!spec->adc_nids) {
16613 spec->adc_nids = alc861vd_adc_nids;
16614 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
16615 }
16616 if (!spec->capsrc_nids)
16617 spec->capsrc_nids = alc861vd_capsrc_nids;
f32610ed 16618
b59bdf3b 16619 set_capture_mixer(codec);
45bdd1c1 16620 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
f32610ed 16621
2134ea4f
TI
16622 spec->vmaster_nid = 0x02;
16623
7fa90e87
TI
16624 if (board_config == ALC861VD_AUTO)
16625 alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 0);
16626
f32610ed
JS
16627 codec->patch_ops = alc_patch_ops;
16628
16629 if (board_config == ALC861VD_AUTO)
16630 spec->init_hook = alc861vd_auto_init;
cb53c626
TI
16631#ifdef CONFIG_SND_HDA_POWER_SAVE
16632 if (!spec->loopback.amplist)
16633 spec->loopback.amplist = alc861vd_loopbacks;
16634#endif
f32610ed
JS
16635
16636 return 0;
16637}
16638
bc9f98a9
KY
16639/*
16640 * ALC662 support
16641 *
16642 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
16643 * configuration. Each pin widget can choose any input DACs and a mixer.
16644 * Each ADC is connected from a mixer of all inputs. This makes possible
16645 * 6-channel independent captures.
16646 *
16647 * In addition, an independent DAC for the multi-playback (not used in this
16648 * driver yet).
16649 */
16650#define ALC662_DIGOUT_NID 0x06
16651#define ALC662_DIGIN_NID 0x0a
16652
16653static hda_nid_t alc662_dac_nids[4] = {
16654 /* front, rear, clfe, rear_surr */
16655 0x02, 0x03, 0x04
16656};
16657
622e84cd
KY
16658static hda_nid_t alc272_dac_nids[2] = {
16659 0x02, 0x03
16660};
16661
b59bdf3b 16662static hda_nid_t alc662_adc_nids[2] = {
bc9f98a9 16663 /* ADC1-2 */
b59bdf3b 16664 0x09, 0x08
bc9f98a9 16665};
e1406348 16666
622e84cd
KY
16667static hda_nid_t alc272_adc_nids[1] = {
16668 /* ADC1-2 */
16669 0x08,
16670};
16671
b59bdf3b 16672static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
622e84cd
KY
16673static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
16674
e1406348 16675
bc9f98a9
KY
16676/* input MUX */
16677/* FIXME: should be a matrix-type input source selection */
bc9f98a9
KY
16678static struct hda_input_mux alc662_capture_source = {
16679 .num_items = 4,
16680 .items = {
16681 { "Mic", 0x0 },
16682 { "Front Mic", 0x1 },
16683 { "Line", 0x2 },
16684 { "CD", 0x4 },
16685 },
16686};
16687
16688static struct hda_input_mux alc662_lenovo_101e_capture_source = {
16689 .num_items = 2,
16690 .items = {
16691 { "Mic", 0x1 },
16692 { "Line", 0x2 },
16693 },
16694};
291702f0 16695
6dda9f4a
KY
16696static struct hda_input_mux alc663_capture_source = {
16697 .num_items = 3,
16698 .items = {
16699 { "Mic", 0x0 },
16700 { "Front Mic", 0x1 },
16701 { "Line", 0x2 },
16702 },
16703};
16704
4f5d1706 16705#if 0 /* set to 1 for testing other input sources below */
9541ba1d
CP
16706static struct hda_input_mux alc272_nc10_capture_source = {
16707 .num_items = 16,
16708 .items = {
16709 { "Autoselect Mic", 0x0 },
16710 { "Internal Mic", 0x1 },
16711 { "In-0x02", 0x2 },
16712 { "In-0x03", 0x3 },
16713 { "In-0x04", 0x4 },
16714 { "In-0x05", 0x5 },
16715 { "In-0x06", 0x6 },
16716 { "In-0x07", 0x7 },
16717 { "In-0x08", 0x8 },
16718 { "In-0x09", 0x9 },
16719 { "In-0x0a", 0x0a },
16720 { "In-0x0b", 0x0b },
16721 { "In-0x0c", 0x0c },
16722 { "In-0x0d", 0x0d },
16723 { "In-0x0e", 0x0e },
16724 { "In-0x0f", 0x0f },
16725 },
16726};
16727#endif
16728
bc9f98a9
KY
16729/*
16730 * 2ch mode
16731 */
16732static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
16733 { 2, NULL }
16734};
16735
16736/*
16737 * 2ch mode
16738 */
16739static struct hda_verb alc662_3ST_ch2_init[] = {
16740 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
16741 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16742 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
16743 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16744 { } /* end */
16745};
16746
16747/*
16748 * 6ch mode
16749 */
16750static struct hda_verb alc662_3ST_ch6_init[] = {
16751 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16752 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16753 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
16754 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16755 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16756 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
16757 { } /* end */
16758};
16759
16760static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
16761 { 2, alc662_3ST_ch2_init },
16762 { 6, alc662_3ST_ch6_init },
16763};
16764
16765/*
16766 * 2ch mode
16767 */
16768static struct hda_verb alc662_sixstack_ch6_init[] = {
16769 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16770 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16771 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16772 { } /* end */
16773};
16774
16775/*
16776 * 6ch mode
16777 */
16778static struct hda_verb alc662_sixstack_ch8_init[] = {
16779 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16780 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16781 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16782 { } /* end */
16783};
16784
16785static struct hda_channel_mode alc662_5stack_modes[2] = {
16786 { 2, alc662_sixstack_ch6_init },
16787 { 6, alc662_sixstack_ch8_init },
16788};
16789
16790/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
16791 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
16792 */
16793
16794static struct snd_kcontrol_new alc662_base_mixer[] = {
16795 /* output mixer control */
16796 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
7055ad8a 16797 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
bc9f98a9 16798 HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
7055ad8a 16799 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
bc9f98a9
KY
16800 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16801 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
7055ad8a
HRK
16802 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16803 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
bc9f98a9
KY
16804 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16805
16806 /*Input mixer control */
16807 HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
16808 HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
16809 HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
16810 HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
16811 HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
16812 HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
16813 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
16814 HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
bc9f98a9
KY
16815 { } /* end */
16816};
16817
16818static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
16819 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
7055ad8a 16820 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
bc9f98a9
KY
16821 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16822 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16823 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16824 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16825 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16826 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16827 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16828 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16829 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
bc9f98a9
KY
16830 { } /* end */
16831};
16832
16833static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
16834 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
7055ad8a 16835 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
bc9f98a9 16836 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
7055ad8a 16837 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
bc9f98a9
KY
16838 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16839 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
7055ad8a
HRK
16840 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16841 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
bc9f98a9
KY
16842 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16843 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16844 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16845 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16846 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16847 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16848 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16849 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16850 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
bc9f98a9
KY
16851 { } /* end */
16852};
16853
16854static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
16855 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16856 HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
86cd9298
TI
16857 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16858 HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
bc9f98a9
KY
16859 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16860 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16861 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16862 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16863 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
bc9f98a9
KY
16864 { } /* end */
16865};
16866
291702f0 16867static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
42171c17
TI
16868 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16869 ALC262_HIPPO_MASTER_SWITCH,
291702f0
KY
16870
16871 HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
16872 HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16873 HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16874
16875 HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
16876 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16877 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16878 { } /* end */
16879};
16880
8c427226 16881static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
42171c17
TI
16882 ALC262_HIPPO_MASTER_SWITCH,
16883 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
8c427226 16884 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
8c427226
KY
16885 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16886 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
8c427226
KY
16887 HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
16888 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16889 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16890 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16891 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16892 { } /* end */
16893};
16894
f1d4e28b
KY
16895static struct hda_bind_ctls alc663_asus_bind_master_vol = {
16896 .ops = &snd_hda_bind_vol,
16897 .values = {
16898 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16899 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
16900 0
16901 },
16902};
16903
16904static struct hda_bind_ctls alc663_asus_one_bind_switch = {
16905 .ops = &snd_hda_bind_sw,
16906 .values = {
16907 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16908 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16909 0
16910 },
16911};
16912
6dda9f4a 16913static struct snd_kcontrol_new alc663_m51va_mixer[] = {
f1d4e28b
KY
16914 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16915 HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
16916 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16917 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16918 { } /* end */
16919};
16920
16921static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
16922 .ops = &snd_hda_bind_sw,
16923 .values = {
16924 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16925 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16926 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16927 0
16928 },
16929};
16930
16931static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
16932 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16933 HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
16934 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16935 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16936 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16937 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16938
16939 { } /* end */
16940};
16941
16942static struct hda_bind_ctls alc663_asus_four_bind_switch = {
16943 .ops = &snd_hda_bind_sw,
16944 .values = {
16945 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16946 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16947 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16948 0
16949 },
16950};
16951
16952static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
16953 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16954 HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
16955 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16956 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16957 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16958 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16959 { } /* end */
16960};
16961
16962static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
6dda9f4a
KY
16963 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16964 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
f1d4e28b
KY
16965 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16966 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16967 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16968 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16969 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16970 { } /* end */
16971};
16972
16973static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
16974 .ops = &snd_hda_bind_vol,
16975 .values = {
16976 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16977 HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
16978 0
16979 },
16980};
16981
16982static struct hda_bind_ctls alc663_asus_two_bind_switch = {
16983 .ops = &snd_hda_bind_sw,
16984 .values = {
16985 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16986 HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
16987 0
16988 },
16989};
16990
16991static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
16992 HDA_BIND_VOL("Master Playback Volume",
16993 &alc663_asus_two_bind_master_vol),
16994 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16995 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
6dda9f4a
KY
16996 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16997 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16998 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
f1d4e28b
KY
16999 { } /* end */
17000};
17001
17002static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
17003 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17004 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
17005 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17006 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17007 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17008 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
6dda9f4a
KY
17009 { } /* end */
17010};
17011
17012static struct snd_kcontrol_new alc663_g71v_mixer[] = {
17013 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17014 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17015 HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17016 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17017 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17018
17019 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17020 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17021 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17022 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17023 { } /* end */
17024};
17025
17026static struct snd_kcontrol_new alc663_g50v_mixer[] = {
17027 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17028 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17029 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17030
17031 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17032 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17033 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17034 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17035 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17036 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17037 { } /* end */
17038};
17039
ebb83eeb
KY
17040static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
17041 .ops = &snd_hda_bind_sw,
17042 .values = {
17043 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17044 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
17045 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17046 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
17047 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
17048 0
17049 },
17050};
17051
17052static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
17053 .ops = &snd_hda_bind_sw,
17054 .values = {
17055 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17056 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17057 0
17058 },
17059};
17060
17061static struct snd_kcontrol_new alc663_mode7_mixer[] = {
17062 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17063 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17064 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17065 HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17066 HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17067 HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17068 HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17069 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17070 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17071 { } /* end */
17072};
17073
17074static struct snd_kcontrol_new alc663_mode8_mixer[] = {
17075 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17076 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17077 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17078 HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17079 HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17080 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17081 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17082 { } /* end */
17083};
17084
17085
bc9f98a9
KY
17086static struct snd_kcontrol_new alc662_chmode_mixer[] = {
17087 {
17088 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
17089 .name = "Channel Mode",
17090 .info = alc_ch_mode_info,
17091 .get = alc_ch_mode_get,
17092 .put = alc_ch_mode_put,
17093 },
17094 { } /* end */
17095};
17096
17097static struct hda_verb alc662_init_verbs[] = {
17098 /* ADC: mute amp left and right */
17099 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17100 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
bc9f98a9 17101
b60dd394
KY
17102 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17103 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17104 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17105 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17106 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17107 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
bc9f98a9
KY
17108
17109 /* Front Pin: output 0 (0x0c) */
17110 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17111 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17112
17113 /* Rear Pin: output 1 (0x0d) */
17114 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17115 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17116
17117 /* CLFE Pin: output 2 (0x0e) */
17118 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17119 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17120
17121 /* Mic (rear) pin: input vref at 80% */
17122 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17123 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17124 /* Front Mic pin: input vref at 80% */
17125 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17126 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17127 /* Line In pin: input */
17128 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17129 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17130 /* Line-2 In: Headphone output (output 0 - 0x0c) */
17131 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17132 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17133 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
17134 /* CD pin widget for input */
17135 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17136
17137 /* FIXME: use matrix-type input source selection */
17138 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
17139 /* Input mixer */
17140 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
291702f0 17141 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6dda9f4a
KY
17142
17143 /* always trun on EAPD */
17144 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
17145 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
17146
bc9f98a9
KY
17147 { }
17148};
17149
cec27c89
KY
17150static struct hda_verb alc663_init_verbs[] = {
17151 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17152 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17153 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17154 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17155 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17156 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17157 { }
17158};
17159
17160static struct hda_verb alc272_init_verbs[] = {
17161 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17162 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17163 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17164 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17165 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17166 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17167 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17168 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17169 { }
17170};
17171
bc9f98a9
KY
17172static struct hda_verb alc662_sue_init_verbs[] = {
17173 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17174 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
291702f0
KY
17175 {}
17176};
17177
17178static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
17179 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17180 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17181 {}
bc9f98a9
KY
17182};
17183
8c427226
KY
17184/* Set Unsolicited Event*/
17185static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
17186 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17187 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17188 {}
17189};
17190
6dda9f4a 17191static struct hda_verb alc663_m51va_init_verbs[] = {
f1d4e28b
KY
17192 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17193 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6dda9f4a
KY
17194 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17195 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
f1d4e28b
KY
17196 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17197 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17198 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17199 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17200 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17201 {}
17202};
17203
17204static struct hda_verb alc663_21jd_amic_init_verbs[] = {
17205 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17206 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17207 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17208 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17209 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17210 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17211 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17212 {}
17213};
17214
17215static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
17216 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17217 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17218 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17219 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
17220 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17221 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17222 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17223 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17224 {}
17225};
6dda9f4a 17226
f1d4e28b
KY
17227static struct hda_verb alc663_15jd_amic_init_verbs[] = {
17228 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17229 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17230 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17231 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17232 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17233 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17234 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17235 {}
17236};
6dda9f4a 17237
f1d4e28b
KY
17238static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
17239 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17240 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17241 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17242 {0x21, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
17243 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17244 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17245 {0x15, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
17246 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17247 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6dda9f4a
KY
17248 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17249 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
f1d4e28b
KY
17250 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17251 {}
17252};
17253
17254static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
17255 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17256 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17257 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17258 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17259 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17260 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17261 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17262 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17263 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17264 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17265 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17266 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6dda9f4a
KY
17267 {}
17268};
17269
17270static struct hda_verb alc663_g71v_init_verbs[] = {
17271 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17272 /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
17273 /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
17274
17275 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17276 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17277 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
17278
17279 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17280 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
17281 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17282 {}
17283};
17284
17285static struct hda_verb alc663_g50v_init_verbs[] = {
17286 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17287 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17288 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
17289
17290 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17291 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17292 {}
17293};
17294
f1d4e28b
KY
17295static struct hda_verb alc662_ecs_init_verbs[] = {
17296 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
17297 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17298 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17299 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17300 {}
17301};
17302
622e84cd
KY
17303static struct hda_verb alc272_dell_zm1_init_verbs[] = {
17304 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17305 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17306 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17307 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17308 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17309 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17310 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17311 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17312 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17313 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17314 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17315 {}
17316};
17317
17318static struct hda_verb alc272_dell_init_verbs[] = {
17319 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17320 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17321 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17322 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17323 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17324 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17325 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17326 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17327 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17328 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17329 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17330 {}
17331};
17332
ebb83eeb
KY
17333static struct hda_verb alc663_mode7_init_verbs[] = {
17334 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17335 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17336 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17337 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17338 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17339 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17340 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
17341 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17342 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17343 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17344 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17345 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17346 {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17347 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17348 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17349 {}
17350};
17351
17352static struct hda_verb alc663_mode8_init_verbs[] = {
17353 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17354 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17355 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17356 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
17357 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17358 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17359 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17360 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17361 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17362 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17363 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17364 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17365 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17366 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17367 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17368 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17369 {}
17370};
17371
f1d4e28b
KY
17372static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
17373 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
17374 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
17375 { } /* end */
17376};
17377
622e84cd
KY
17378static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
17379 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
17380 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
17381 { } /* end */
17382};
17383
bc9f98a9
KY
17384static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
17385{
17386 unsigned int present;
f12ab1e0 17387 unsigned char bits;
bc9f98a9 17388
864f92be 17389 present = snd_hda_jack_detect(codec, 0x14);
47fd830a 17390 bits = present ? HDA_AMP_MUTE : 0;
864f92be 17391
47fd830a
TI
17392 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17393 HDA_AMP_MUTE, bits);
bc9f98a9
KY
17394}
17395
17396static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
17397{
17398 unsigned int present;
f12ab1e0 17399 unsigned char bits;
bc9f98a9 17400
864f92be 17401 present = snd_hda_jack_detect(codec, 0x1b);
47fd830a 17402 bits = present ? HDA_AMP_MUTE : 0;
864f92be 17403
47fd830a
TI
17404 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17405 HDA_AMP_MUTE, bits);
17406 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17407 HDA_AMP_MUTE, bits);
bc9f98a9
KY
17408}
17409
17410static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
17411 unsigned int res)
17412{
17413 if ((res >> 26) == ALC880_HP_EVENT)
17414 alc662_lenovo_101e_all_automute(codec);
17415 if ((res >> 26) == ALC880_FRONT_EVENT)
17416 alc662_lenovo_101e_ispeaker_automute(codec);
17417}
17418
291702f0
KY
17419/* unsolicited event for HP jack sensing */
17420static void alc662_eeepc_unsol_event(struct hda_codec *codec,
17421 unsigned int res)
17422{
291702f0 17423 if ((res >> 26) == ALC880_MIC_EVENT)
4f5d1706 17424 alc_mic_automute(codec);
42171c17
TI
17425 else
17426 alc262_hippo_unsol_event(codec, res);
291702f0
KY
17427}
17428
4f5d1706
TI
17429static void alc662_eeepc_setup(struct hda_codec *codec)
17430{
17431 struct alc_spec *spec = codec->spec;
17432
17433 alc262_hippo1_setup(codec);
17434 spec->ext_mic.pin = 0x18;
17435 spec->ext_mic.mux_idx = 0;
17436 spec->int_mic.pin = 0x19;
17437 spec->int_mic.mux_idx = 1;
17438 spec->auto_mic = 1;
17439}
17440
291702f0
KY
17441static void alc662_eeepc_inithook(struct hda_codec *codec)
17442{
4f5d1706
TI
17443 alc262_hippo_automute(codec);
17444 alc_mic_automute(codec);
291702f0
KY
17445}
17446
4f5d1706 17447static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
8c427226 17448{
42171c17
TI
17449 struct alc_spec *spec = codec->spec;
17450
17451 spec->autocfg.hp_pins[0] = 0x14;
17452 spec->autocfg.speaker_pins[0] = 0x1b;
8c427226
KY
17453}
17454
4f5d1706
TI
17455#define alc662_eeepc_ep20_inithook alc262_hippo_master_update
17456
6dda9f4a
KY
17457static void alc663_m51va_speaker_automute(struct hda_codec *codec)
17458{
17459 unsigned int present;
17460 unsigned char bits;
17461
864f92be 17462 present = snd_hda_jack_detect(codec, 0x21);
6dda9f4a 17463 bits = present ? HDA_AMP_MUTE : 0;
f1d4e28b 17464 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 17465 HDA_AMP_MUTE, bits);
f1d4e28b 17466 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 17467 HDA_AMP_MUTE, bits);
f1d4e28b
KY
17468}
17469
17470static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
17471{
17472 unsigned int present;
17473 unsigned char bits;
17474
864f92be 17475 present = snd_hda_jack_detect(codec, 0x21);
f1d4e28b
KY
17476 bits = present ? HDA_AMP_MUTE : 0;
17477 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 17478 HDA_AMP_MUTE, bits);
f1d4e28b 17479 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 17480 HDA_AMP_MUTE, bits);
f1d4e28b 17481 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
5dbd5ec6 17482 HDA_AMP_MUTE, bits);
f1d4e28b 17483 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
5dbd5ec6 17484 HDA_AMP_MUTE, bits);
f1d4e28b
KY
17485}
17486
17487static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
17488{
17489 unsigned int present;
17490 unsigned char bits;
17491
864f92be 17492 present = snd_hda_jack_detect(codec, 0x15);
f1d4e28b
KY
17493 bits = present ? HDA_AMP_MUTE : 0;
17494 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 17495 HDA_AMP_MUTE, bits);
f1d4e28b 17496 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 17497 HDA_AMP_MUTE, bits);
f1d4e28b 17498 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
5dbd5ec6 17499 HDA_AMP_MUTE, bits);
f1d4e28b 17500 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
5dbd5ec6 17501 HDA_AMP_MUTE, bits);
f1d4e28b
KY
17502}
17503
17504static void alc662_f5z_speaker_automute(struct hda_codec *codec)
17505{
17506 unsigned int present;
17507 unsigned char bits;
17508
864f92be 17509 present = snd_hda_jack_detect(codec, 0x1b);
f1d4e28b
KY
17510 bits = present ? 0 : PIN_OUT;
17511 snd_hda_codec_write(codec, 0x14, 0,
17512 AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
17513}
17514
17515static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
17516{
17517 unsigned int present1, present2;
17518
864f92be
WF
17519 present1 = snd_hda_jack_detect(codec, 0x21);
17520 present2 = snd_hda_jack_detect(codec, 0x15);
f1d4e28b
KY
17521
17522 if (present1 || present2) {
17523 snd_hda_codec_write_cache(codec, 0x14, 0,
17524 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17525 } else {
17526 snd_hda_codec_write_cache(codec, 0x14, 0,
17527 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17528 }
17529}
17530
17531static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
17532{
17533 unsigned int present1, present2;
17534
864f92be
WF
17535 present1 = snd_hda_jack_detect(codec, 0x1b);
17536 present2 = snd_hda_jack_detect(codec, 0x15);
f1d4e28b
KY
17537
17538 if (present1 || present2) {
17539 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 17540 HDA_AMP_MUTE, HDA_AMP_MUTE);
f1d4e28b 17541 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 17542 HDA_AMP_MUTE, HDA_AMP_MUTE);
f1d4e28b
KY
17543 } else {
17544 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
5dbd5ec6 17545 HDA_AMP_MUTE, 0);
f1d4e28b 17546 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
5dbd5ec6 17547 HDA_AMP_MUTE, 0);
f1d4e28b 17548 }
6dda9f4a
KY
17549}
17550
ebb83eeb
KY
17551static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
17552{
17553 unsigned int present1, present2;
17554
17555 present1 = snd_hda_codec_read(codec, 0x1b, 0,
17556 AC_VERB_GET_PIN_SENSE, 0)
17557 & AC_PINSENSE_PRESENCE;
17558 present2 = snd_hda_codec_read(codec, 0x21, 0,
17559 AC_VERB_GET_PIN_SENSE, 0)
17560 & AC_PINSENSE_PRESENCE;
17561
17562 if (present1 || present2) {
17563 snd_hda_codec_write_cache(codec, 0x14, 0,
17564 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17565 snd_hda_codec_write_cache(codec, 0x17, 0,
17566 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17567 } else {
17568 snd_hda_codec_write_cache(codec, 0x14, 0,
17569 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17570 snd_hda_codec_write_cache(codec, 0x17, 0,
17571 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17572 }
17573}
17574
17575static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
17576{
17577 unsigned int present1, present2;
17578
17579 present1 = snd_hda_codec_read(codec, 0x21, 0,
17580 AC_VERB_GET_PIN_SENSE, 0)
17581 & AC_PINSENSE_PRESENCE;
17582 present2 = snd_hda_codec_read(codec, 0x15, 0,
17583 AC_VERB_GET_PIN_SENSE, 0)
17584 & AC_PINSENSE_PRESENCE;
17585
17586 if (present1 || present2) {
17587 snd_hda_codec_write_cache(codec, 0x14, 0,
17588 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17589 snd_hda_codec_write_cache(codec, 0x17, 0,
17590 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17591 } else {
17592 snd_hda_codec_write_cache(codec, 0x14, 0,
17593 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17594 snd_hda_codec_write_cache(codec, 0x17, 0,
17595 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17596 }
17597}
17598
6dda9f4a
KY
17599static void alc663_m51va_unsol_event(struct hda_codec *codec,
17600 unsigned int res)
17601{
17602 switch (res >> 26) {
17603 case ALC880_HP_EVENT:
17604 alc663_m51va_speaker_automute(codec);
17605 break;
17606 case ALC880_MIC_EVENT:
4f5d1706 17607 alc_mic_automute(codec);
6dda9f4a
KY
17608 break;
17609 }
17610}
17611
4f5d1706
TI
17612static void alc663_m51va_setup(struct hda_codec *codec)
17613{
17614 struct alc_spec *spec = codec->spec;
17615 spec->ext_mic.pin = 0x18;
17616 spec->ext_mic.mux_idx = 0;
17617 spec->int_mic.pin = 0x12;
ebb83eeb 17618 spec->int_mic.mux_idx = 9;
4f5d1706
TI
17619 spec->auto_mic = 1;
17620}
17621
6dda9f4a
KY
17622static void alc663_m51va_inithook(struct hda_codec *codec)
17623{
17624 alc663_m51va_speaker_automute(codec);
4f5d1706 17625 alc_mic_automute(codec);
6dda9f4a
KY
17626}
17627
f1d4e28b 17628/* ***************** Mode1 ******************************/
4f5d1706 17629#define alc663_mode1_unsol_event alc663_m51va_unsol_event
ebb83eeb
KY
17630
17631static void alc663_mode1_setup(struct hda_codec *codec)
17632{
17633 struct alc_spec *spec = codec->spec;
17634 spec->ext_mic.pin = 0x18;
17635 spec->ext_mic.mux_idx = 0;
17636 spec->int_mic.pin = 0x19;
17637 spec->int_mic.mux_idx = 1;
17638 spec->auto_mic = 1;
17639}
17640
4f5d1706 17641#define alc663_mode1_inithook alc663_m51va_inithook
f1d4e28b 17642
f1d4e28b
KY
17643/* ***************** Mode2 ******************************/
17644static void alc662_mode2_unsol_event(struct hda_codec *codec,
17645 unsigned int res)
17646{
17647 switch (res >> 26) {
17648 case ALC880_HP_EVENT:
17649 alc662_f5z_speaker_automute(codec);
17650 break;
17651 case ALC880_MIC_EVENT:
4f5d1706 17652 alc_mic_automute(codec);
f1d4e28b
KY
17653 break;
17654 }
17655}
17656
ebb83eeb 17657#define alc662_mode2_setup alc663_mode1_setup
4f5d1706 17658
f1d4e28b
KY
17659static void alc662_mode2_inithook(struct hda_codec *codec)
17660{
17661 alc662_f5z_speaker_automute(codec);
4f5d1706 17662 alc_mic_automute(codec);
f1d4e28b
KY
17663}
17664/* ***************** Mode3 ******************************/
17665static void alc663_mode3_unsol_event(struct hda_codec *codec,
17666 unsigned int res)
17667{
17668 switch (res >> 26) {
17669 case ALC880_HP_EVENT:
17670 alc663_two_hp_m1_speaker_automute(codec);
17671 break;
17672 case ALC880_MIC_EVENT:
4f5d1706 17673 alc_mic_automute(codec);
f1d4e28b
KY
17674 break;
17675 }
17676}
17677
ebb83eeb 17678#define alc663_mode3_setup alc663_mode1_setup
4f5d1706 17679
f1d4e28b
KY
17680static void alc663_mode3_inithook(struct hda_codec *codec)
17681{
17682 alc663_two_hp_m1_speaker_automute(codec);
4f5d1706 17683 alc_mic_automute(codec);
f1d4e28b
KY
17684}
17685/* ***************** Mode4 ******************************/
17686static void alc663_mode4_unsol_event(struct hda_codec *codec,
17687 unsigned int res)
17688{
17689 switch (res >> 26) {
17690 case ALC880_HP_EVENT:
17691 alc663_21jd_two_speaker_automute(codec);
17692 break;
17693 case ALC880_MIC_EVENT:
4f5d1706 17694 alc_mic_automute(codec);
f1d4e28b
KY
17695 break;
17696 }
17697}
17698
ebb83eeb 17699#define alc663_mode4_setup alc663_mode1_setup
4f5d1706 17700
f1d4e28b
KY
17701static void alc663_mode4_inithook(struct hda_codec *codec)
17702{
17703 alc663_21jd_two_speaker_automute(codec);
4f5d1706 17704 alc_mic_automute(codec);
f1d4e28b
KY
17705}
17706/* ***************** Mode5 ******************************/
17707static void alc663_mode5_unsol_event(struct hda_codec *codec,
17708 unsigned int res)
17709{
17710 switch (res >> 26) {
17711 case ALC880_HP_EVENT:
17712 alc663_15jd_two_speaker_automute(codec);
17713 break;
17714 case ALC880_MIC_EVENT:
4f5d1706 17715 alc_mic_automute(codec);
f1d4e28b
KY
17716 break;
17717 }
17718}
17719
ebb83eeb 17720#define alc663_mode5_setup alc663_mode1_setup
4f5d1706 17721
f1d4e28b
KY
17722static void alc663_mode5_inithook(struct hda_codec *codec)
17723{
17724 alc663_15jd_two_speaker_automute(codec);
4f5d1706 17725 alc_mic_automute(codec);
f1d4e28b
KY
17726}
17727/* ***************** Mode6 ******************************/
17728static void alc663_mode6_unsol_event(struct hda_codec *codec,
17729 unsigned int res)
17730{
17731 switch (res >> 26) {
17732 case ALC880_HP_EVENT:
17733 alc663_two_hp_m2_speaker_automute(codec);
17734 break;
17735 case ALC880_MIC_EVENT:
4f5d1706 17736 alc_mic_automute(codec);
f1d4e28b
KY
17737 break;
17738 }
17739}
17740
ebb83eeb 17741#define alc663_mode6_setup alc663_mode1_setup
4f5d1706 17742
f1d4e28b
KY
17743static void alc663_mode6_inithook(struct hda_codec *codec)
17744{
17745 alc663_two_hp_m2_speaker_automute(codec);
4f5d1706 17746 alc_mic_automute(codec);
f1d4e28b
KY
17747}
17748
ebb83eeb
KY
17749/* ***************** Mode7 ******************************/
17750static void alc663_mode7_unsol_event(struct hda_codec *codec,
17751 unsigned int res)
17752{
17753 switch (res >> 26) {
17754 case ALC880_HP_EVENT:
17755 alc663_two_hp_m7_speaker_automute(codec);
17756 break;
17757 case ALC880_MIC_EVENT:
17758 alc_mic_automute(codec);
17759 break;
17760 }
17761}
17762
17763#define alc663_mode7_setup alc663_mode1_setup
17764
17765static void alc663_mode7_inithook(struct hda_codec *codec)
17766{
17767 alc663_two_hp_m7_speaker_automute(codec);
17768 alc_mic_automute(codec);
17769}
17770
17771/* ***************** Mode8 ******************************/
17772static void alc663_mode8_unsol_event(struct hda_codec *codec,
17773 unsigned int res)
17774{
17775 switch (res >> 26) {
17776 case ALC880_HP_EVENT:
17777 alc663_two_hp_m8_speaker_automute(codec);
17778 break;
17779 case ALC880_MIC_EVENT:
17780 alc_mic_automute(codec);
17781 break;
17782 }
17783}
17784
17785#define alc663_mode8_setup alc663_m51va_setup
17786
17787static void alc663_mode8_inithook(struct hda_codec *codec)
17788{
17789 alc663_two_hp_m8_speaker_automute(codec);
17790 alc_mic_automute(codec);
17791}
17792
6dda9f4a
KY
17793static void alc663_g71v_hp_automute(struct hda_codec *codec)
17794{
17795 unsigned int present;
17796 unsigned char bits;
17797
864f92be 17798 present = snd_hda_jack_detect(codec, 0x21);
6dda9f4a
KY
17799 bits = present ? HDA_AMP_MUTE : 0;
17800 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17801 HDA_AMP_MUTE, bits);
17802 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17803 HDA_AMP_MUTE, bits);
17804}
17805
17806static void alc663_g71v_front_automute(struct hda_codec *codec)
17807{
17808 unsigned int present;
17809 unsigned char bits;
17810
864f92be 17811 present = snd_hda_jack_detect(codec, 0x15);
6dda9f4a
KY
17812 bits = present ? HDA_AMP_MUTE : 0;
17813 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17814 HDA_AMP_MUTE, bits);
17815}
17816
17817static void alc663_g71v_unsol_event(struct hda_codec *codec,
17818 unsigned int res)
17819{
17820 switch (res >> 26) {
17821 case ALC880_HP_EVENT:
17822 alc663_g71v_hp_automute(codec);
17823 break;
17824 case ALC880_FRONT_EVENT:
17825 alc663_g71v_front_automute(codec);
17826 break;
17827 case ALC880_MIC_EVENT:
4f5d1706 17828 alc_mic_automute(codec);
6dda9f4a
KY
17829 break;
17830 }
17831}
17832
4f5d1706
TI
17833#define alc663_g71v_setup alc663_m51va_setup
17834
6dda9f4a
KY
17835static void alc663_g71v_inithook(struct hda_codec *codec)
17836{
17837 alc663_g71v_front_automute(codec);
17838 alc663_g71v_hp_automute(codec);
4f5d1706 17839 alc_mic_automute(codec);
6dda9f4a
KY
17840}
17841
17842static void alc663_g50v_unsol_event(struct hda_codec *codec,
17843 unsigned int res)
17844{
17845 switch (res >> 26) {
17846 case ALC880_HP_EVENT:
17847 alc663_m51va_speaker_automute(codec);
17848 break;
17849 case ALC880_MIC_EVENT:
4f5d1706 17850 alc_mic_automute(codec);
6dda9f4a
KY
17851 break;
17852 }
17853}
17854
4f5d1706
TI
17855#define alc663_g50v_setup alc663_m51va_setup
17856
6dda9f4a
KY
17857static void alc663_g50v_inithook(struct hda_codec *codec)
17858{
17859 alc663_m51va_speaker_automute(codec);
4f5d1706 17860 alc_mic_automute(codec);
6dda9f4a
KY
17861}
17862
f1d4e28b
KY
17863static struct snd_kcontrol_new alc662_ecs_mixer[] = {
17864 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
42171c17 17865 ALC262_HIPPO_MASTER_SWITCH,
f1d4e28b
KY
17866
17867 HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
17868 HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
17869 HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
17870
17871 HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
17872 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17873 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17874 { } /* end */
17875};
17876
9541ba1d
CP
17877static struct snd_kcontrol_new alc272_nc10_mixer[] = {
17878 /* Master Playback automatically created from Speaker and Headphone */
17879 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17880 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17881 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17882 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17883
17884 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17885 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17886 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
17887
17888 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17889 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17890 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
17891 { } /* end */
17892};
17893
cb53c626
TI
17894#ifdef CONFIG_SND_HDA_POWER_SAVE
17895#define alc662_loopbacks alc880_loopbacks
17896#endif
17897
bc9f98a9 17898
def319f9 17899/* pcm configuration: identical with ALC880 */
bc9f98a9
KY
17900#define alc662_pcm_analog_playback alc880_pcm_analog_playback
17901#define alc662_pcm_analog_capture alc880_pcm_analog_capture
17902#define alc662_pcm_digital_playback alc880_pcm_digital_playback
17903#define alc662_pcm_digital_capture alc880_pcm_digital_capture
17904
17905/*
17906 * configuration and preset
17907 */
17908static const char *alc662_models[ALC662_MODEL_LAST] = {
17909 [ALC662_3ST_2ch_DIG] = "3stack-dig",
17910 [ALC662_3ST_6ch_DIG] = "3stack-6ch-dig",
17911 [ALC662_3ST_6ch] = "3stack-6ch",
17912 [ALC662_5ST_DIG] = "6stack-dig",
17913 [ALC662_LENOVO_101E] = "lenovo-101e",
b995d76d 17914 [ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
8c427226 17915 [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
f1d4e28b 17916 [ALC662_ECS] = "ecs",
6dda9f4a
KY
17917 [ALC663_ASUS_M51VA] = "m51va",
17918 [ALC663_ASUS_G71V] = "g71v",
17919 [ALC663_ASUS_H13] = "h13",
17920 [ALC663_ASUS_G50V] = "g50v",
f1d4e28b
KY
17921 [ALC663_ASUS_MODE1] = "asus-mode1",
17922 [ALC662_ASUS_MODE2] = "asus-mode2",
17923 [ALC663_ASUS_MODE3] = "asus-mode3",
17924 [ALC663_ASUS_MODE4] = "asus-mode4",
17925 [ALC663_ASUS_MODE5] = "asus-mode5",
17926 [ALC663_ASUS_MODE6] = "asus-mode6",
ebb83eeb
KY
17927 [ALC663_ASUS_MODE7] = "asus-mode7",
17928 [ALC663_ASUS_MODE8] = "asus-mode8",
01f2bd48
TI
17929 [ALC272_DELL] = "dell",
17930 [ALC272_DELL_ZM1] = "dell-zm1",
9541ba1d 17931 [ALC272_SAMSUNG_NC10] = "samsung-nc10",
bc9f98a9
KY
17932 [ALC662_AUTO] = "auto",
17933};
17934
17935static struct snd_pci_quirk alc662_cfg_tbl[] = {
dea0a509 17936 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
622e84cd
KY
17937 SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
17938 SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
f1d4e28b 17939 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
dea0a509 17940 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
cec27c89 17941 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC663_ASUS_MODE1),
dea0a509 17942 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
f1d4e28b 17943 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
dea0a509 17944 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
f1d4e28b 17945 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
ebb83eeb
KY
17946 SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
17947 SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
f1d4e28b 17948 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
ebb83eeb
KY
17949 SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
17950 SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
17951 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
17952 SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
17953 SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
dea0a509 17954 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
ebb83eeb
KY
17955 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
17956 SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
dea0a509
TI
17957 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
17958 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
17959 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
17960 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
ebb83eeb 17961 SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
622e84cd
KY
17962 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
17963 SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
17964 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
f1d4e28b 17965 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
dea0a509
TI
17966 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
17967 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
17968 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
622e84cd 17969 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
f1d4e28b 17970 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
dea0a509
TI
17971 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
17972 SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
17973 /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
f1d4e28b 17974 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
f1d4e28b 17975 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
622e84cd 17976 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
cec27c89 17977 SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC663_ASUS_MODE1),
622e84cd
KY
17978 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
17979 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
dea0a509
TI
17980 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
17981 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
17982 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
622e84cd 17983 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
dea0a509
TI
17984 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
17985 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
622e84cd 17986 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
dea0a509
TI
17987 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
17988 SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
17989 /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
17990 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
17991 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
622e84cd 17992 SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
dea0a509 17993 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
f1d4e28b 17994 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
dea0a509
TI
17995 SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
17996 SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
17997 SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
17998 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
95fe5f2c
HRK
17999 SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
18000 ALC662_3ST_6ch_DIG),
4dee8baa 18001 SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO),
9541ba1d 18002 SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
cb55974c
HRK
18003 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
18004 ALC662_3ST_6ch_DIG),
6227cdce 18005 SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13),
19c009aa 18006 SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
5bd3729f 18007 SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
dea0a509 18008 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
238713d4 18009 SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
19c009aa 18010 ALC662_3ST_6ch_DIG),
dea0a509
TI
18011 SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
18012 ALC663_ASUS_H13),
bc9f98a9
KY
18013 {}
18014};
18015
18016static struct alc_config_preset alc662_presets[] = {
18017 [ALC662_3ST_2ch_DIG] = {
f9e336f6 18018 .mixers = { alc662_3ST_2ch_mixer },
bc9f98a9
KY
18019 .init_verbs = { alc662_init_verbs },
18020 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18021 .dac_nids = alc662_dac_nids,
18022 .dig_out_nid = ALC662_DIGOUT_NID,
bc9f98a9
KY
18023 .dig_in_nid = ALC662_DIGIN_NID,
18024 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18025 .channel_mode = alc662_3ST_2ch_modes,
18026 .input_mux = &alc662_capture_source,
18027 },
18028 [ALC662_3ST_6ch_DIG] = {
f9e336f6 18029 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
bc9f98a9
KY
18030 .init_verbs = { alc662_init_verbs },
18031 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18032 .dac_nids = alc662_dac_nids,
18033 .dig_out_nid = ALC662_DIGOUT_NID,
bc9f98a9
KY
18034 .dig_in_nid = ALC662_DIGIN_NID,
18035 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18036 .channel_mode = alc662_3ST_6ch_modes,
18037 .need_dac_fix = 1,
18038 .input_mux = &alc662_capture_source,
f12ab1e0 18039 },
bc9f98a9 18040 [ALC662_3ST_6ch] = {
f9e336f6 18041 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
bc9f98a9
KY
18042 .init_verbs = { alc662_init_verbs },
18043 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18044 .dac_nids = alc662_dac_nids,
bc9f98a9
KY
18045 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18046 .channel_mode = alc662_3ST_6ch_modes,
18047 .need_dac_fix = 1,
18048 .input_mux = &alc662_capture_source,
f12ab1e0 18049 },
bc9f98a9 18050 [ALC662_5ST_DIG] = {
f9e336f6 18051 .mixers = { alc662_base_mixer, alc662_chmode_mixer },
bc9f98a9
KY
18052 .init_verbs = { alc662_init_verbs },
18053 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18054 .dac_nids = alc662_dac_nids,
18055 .dig_out_nid = ALC662_DIGOUT_NID,
bc9f98a9
KY
18056 .dig_in_nid = ALC662_DIGIN_NID,
18057 .num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
18058 .channel_mode = alc662_5stack_modes,
18059 .input_mux = &alc662_capture_source,
18060 },
18061 [ALC662_LENOVO_101E] = {
f9e336f6 18062 .mixers = { alc662_lenovo_101e_mixer },
bc9f98a9
KY
18063 .init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
18064 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18065 .dac_nids = alc662_dac_nids,
bc9f98a9
KY
18066 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18067 .channel_mode = alc662_3ST_2ch_modes,
18068 .input_mux = &alc662_lenovo_101e_capture_source,
18069 .unsol_event = alc662_lenovo_101e_unsol_event,
18070 .init_hook = alc662_lenovo_101e_all_automute,
18071 },
291702f0 18072 [ALC662_ASUS_EEEPC_P701] = {
f9e336f6 18073 .mixers = { alc662_eeepc_p701_mixer },
291702f0
KY
18074 .init_verbs = { alc662_init_verbs,
18075 alc662_eeepc_sue_init_verbs },
18076 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18077 .dac_nids = alc662_dac_nids,
291702f0
KY
18078 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18079 .channel_mode = alc662_3ST_2ch_modes,
291702f0 18080 .unsol_event = alc662_eeepc_unsol_event,
4f5d1706 18081 .setup = alc662_eeepc_setup,
291702f0
KY
18082 .init_hook = alc662_eeepc_inithook,
18083 },
8c427226 18084 [ALC662_ASUS_EEEPC_EP20] = {
f9e336f6 18085 .mixers = { alc662_eeepc_ep20_mixer,
8c427226
KY
18086 alc662_chmode_mixer },
18087 .init_verbs = { alc662_init_verbs,
18088 alc662_eeepc_ep20_sue_init_verbs },
18089 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18090 .dac_nids = alc662_dac_nids,
8c427226
KY
18091 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18092 .channel_mode = alc662_3ST_6ch_modes,
18093 .input_mux = &alc662_lenovo_101e_capture_source,
42171c17 18094 .unsol_event = alc662_eeepc_unsol_event,
4f5d1706 18095 .setup = alc662_eeepc_ep20_setup,
8c427226
KY
18096 .init_hook = alc662_eeepc_ep20_inithook,
18097 },
f1d4e28b 18098 [ALC662_ECS] = {
f9e336f6 18099 .mixers = { alc662_ecs_mixer },
f1d4e28b
KY
18100 .init_verbs = { alc662_init_verbs,
18101 alc662_ecs_init_verbs },
18102 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18103 .dac_nids = alc662_dac_nids,
18104 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18105 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 18106 .unsol_event = alc662_eeepc_unsol_event,
4f5d1706 18107 .setup = alc662_eeepc_setup,
f1d4e28b
KY
18108 .init_hook = alc662_eeepc_inithook,
18109 },
6dda9f4a 18110 [ALC663_ASUS_M51VA] = {
f9e336f6 18111 .mixers = { alc663_m51va_mixer },
6dda9f4a
KY
18112 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18113 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18114 .dac_nids = alc662_dac_nids,
18115 .dig_out_nid = ALC662_DIGOUT_NID,
18116 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18117 .channel_mode = alc662_3ST_2ch_modes,
6dda9f4a 18118 .unsol_event = alc663_m51va_unsol_event,
4f5d1706 18119 .setup = alc663_m51va_setup,
6dda9f4a
KY
18120 .init_hook = alc663_m51va_inithook,
18121 },
18122 [ALC663_ASUS_G71V] = {
f9e336f6 18123 .mixers = { alc663_g71v_mixer },
6dda9f4a
KY
18124 .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
18125 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18126 .dac_nids = alc662_dac_nids,
18127 .dig_out_nid = ALC662_DIGOUT_NID,
18128 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18129 .channel_mode = alc662_3ST_2ch_modes,
6dda9f4a 18130 .unsol_event = alc663_g71v_unsol_event,
4f5d1706 18131 .setup = alc663_g71v_setup,
6dda9f4a
KY
18132 .init_hook = alc663_g71v_inithook,
18133 },
18134 [ALC663_ASUS_H13] = {
f9e336f6 18135 .mixers = { alc663_m51va_mixer },
6dda9f4a
KY
18136 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18137 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18138 .dac_nids = alc662_dac_nids,
18139 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18140 .channel_mode = alc662_3ST_2ch_modes,
6dda9f4a
KY
18141 .unsol_event = alc663_m51va_unsol_event,
18142 .init_hook = alc663_m51va_inithook,
18143 },
18144 [ALC663_ASUS_G50V] = {
f9e336f6 18145 .mixers = { alc663_g50v_mixer },
6dda9f4a
KY
18146 .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
18147 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18148 .dac_nids = alc662_dac_nids,
18149 .dig_out_nid = ALC662_DIGOUT_NID,
18150 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18151 .channel_mode = alc662_3ST_6ch_modes,
18152 .input_mux = &alc663_capture_source,
18153 .unsol_event = alc663_g50v_unsol_event,
4f5d1706 18154 .setup = alc663_g50v_setup,
6dda9f4a
KY
18155 .init_hook = alc663_g50v_inithook,
18156 },
f1d4e28b 18157 [ALC663_ASUS_MODE1] = {
f9e336f6
TI
18158 .mixers = { alc663_m51va_mixer },
18159 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
18160 .init_verbs = { alc662_init_verbs,
18161 alc663_21jd_amic_init_verbs },
18162 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18163 .hp_nid = 0x03,
18164 .dac_nids = alc662_dac_nids,
18165 .dig_out_nid = ALC662_DIGOUT_NID,
18166 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18167 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 18168 .unsol_event = alc663_mode1_unsol_event,
4f5d1706 18169 .setup = alc663_mode1_setup,
f1d4e28b
KY
18170 .init_hook = alc663_mode1_inithook,
18171 },
18172 [ALC662_ASUS_MODE2] = {
f9e336f6
TI
18173 .mixers = { alc662_1bjd_mixer },
18174 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
18175 .init_verbs = { alc662_init_verbs,
18176 alc662_1bjd_amic_init_verbs },
18177 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18178 .dac_nids = alc662_dac_nids,
18179 .dig_out_nid = ALC662_DIGOUT_NID,
18180 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18181 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 18182 .unsol_event = alc662_mode2_unsol_event,
4f5d1706 18183 .setup = alc662_mode2_setup,
f1d4e28b
KY
18184 .init_hook = alc662_mode2_inithook,
18185 },
18186 [ALC663_ASUS_MODE3] = {
f9e336f6
TI
18187 .mixers = { alc663_two_hp_m1_mixer },
18188 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
18189 .init_verbs = { alc662_init_verbs,
18190 alc663_two_hp_amic_m1_init_verbs },
18191 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18192 .hp_nid = 0x03,
18193 .dac_nids = alc662_dac_nids,
18194 .dig_out_nid = ALC662_DIGOUT_NID,
18195 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18196 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 18197 .unsol_event = alc663_mode3_unsol_event,
4f5d1706 18198 .setup = alc663_mode3_setup,
f1d4e28b
KY
18199 .init_hook = alc663_mode3_inithook,
18200 },
18201 [ALC663_ASUS_MODE4] = {
f9e336f6
TI
18202 .mixers = { alc663_asus_21jd_clfe_mixer },
18203 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
18204 .init_verbs = { alc662_init_verbs,
18205 alc663_21jd_amic_init_verbs},
18206 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18207 .hp_nid = 0x03,
18208 .dac_nids = alc662_dac_nids,
18209 .dig_out_nid = ALC662_DIGOUT_NID,
18210 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18211 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 18212 .unsol_event = alc663_mode4_unsol_event,
4f5d1706 18213 .setup = alc663_mode4_setup,
f1d4e28b
KY
18214 .init_hook = alc663_mode4_inithook,
18215 },
18216 [ALC663_ASUS_MODE5] = {
f9e336f6
TI
18217 .mixers = { alc663_asus_15jd_clfe_mixer },
18218 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
18219 .init_verbs = { alc662_init_verbs,
18220 alc663_15jd_amic_init_verbs },
18221 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18222 .hp_nid = 0x03,
18223 .dac_nids = alc662_dac_nids,
18224 .dig_out_nid = ALC662_DIGOUT_NID,
18225 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18226 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 18227 .unsol_event = alc663_mode5_unsol_event,
4f5d1706 18228 .setup = alc663_mode5_setup,
f1d4e28b
KY
18229 .init_hook = alc663_mode5_inithook,
18230 },
18231 [ALC663_ASUS_MODE6] = {
f9e336f6
TI
18232 .mixers = { alc663_two_hp_m2_mixer },
18233 .cap_mixer = alc662_auto_capture_mixer,
f1d4e28b
KY
18234 .init_verbs = { alc662_init_verbs,
18235 alc663_two_hp_amic_m2_init_verbs },
18236 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18237 .hp_nid = 0x03,
18238 .dac_nids = alc662_dac_nids,
18239 .dig_out_nid = ALC662_DIGOUT_NID,
18240 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18241 .channel_mode = alc662_3ST_2ch_modes,
f1d4e28b 18242 .unsol_event = alc663_mode6_unsol_event,
4f5d1706 18243 .setup = alc663_mode6_setup,
f1d4e28b
KY
18244 .init_hook = alc663_mode6_inithook,
18245 },
ebb83eeb
KY
18246 [ALC663_ASUS_MODE7] = {
18247 .mixers = { alc663_mode7_mixer },
18248 .cap_mixer = alc662_auto_capture_mixer,
18249 .init_verbs = { alc662_init_verbs,
18250 alc663_mode7_init_verbs },
18251 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18252 .hp_nid = 0x03,
18253 .dac_nids = alc662_dac_nids,
18254 .dig_out_nid = ALC662_DIGOUT_NID,
18255 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18256 .channel_mode = alc662_3ST_2ch_modes,
18257 .unsol_event = alc663_mode7_unsol_event,
18258 .setup = alc663_mode7_setup,
18259 .init_hook = alc663_mode7_inithook,
18260 },
18261 [ALC663_ASUS_MODE8] = {
18262 .mixers = { alc663_mode8_mixer },
18263 .cap_mixer = alc662_auto_capture_mixer,
18264 .init_verbs = { alc662_init_verbs,
18265 alc663_mode8_init_verbs },
18266 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18267 .hp_nid = 0x03,
18268 .dac_nids = alc662_dac_nids,
18269 .dig_out_nid = ALC662_DIGOUT_NID,
18270 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18271 .channel_mode = alc662_3ST_2ch_modes,
18272 .unsol_event = alc663_mode8_unsol_event,
18273 .setup = alc663_mode8_setup,
18274 .init_hook = alc663_mode8_inithook,
18275 },
622e84cd
KY
18276 [ALC272_DELL] = {
18277 .mixers = { alc663_m51va_mixer },
18278 .cap_mixer = alc272_auto_capture_mixer,
18279 .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
18280 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
18281 .dac_nids = alc662_dac_nids,
18282 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18283 .adc_nids = alc272_adc_nids,
18284 .num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
18285 .capsrc_nids = alc272_capsrc_nids,
18286 .channel_mode = alc662_3ST_2ch_modes,
622e84cd 18287 .unsol_event = alc663_m51va_unsol_event,
4f5d1706 18288 .setup = alc663_m51va_setup,
622e84cd
KY
18289 .init_hook = alc663_m51va_inithook,
18290 },
18291 [ALC272_DELL_ZM1] = {
18292 .mixers = { alc663_m51va_mixer },
18293 .cap_mixer = alc662_auto_capture_mixer,
18294 .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
18295 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
18296 .dac_nids = alc662_dac_nids,
18297 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18298 .adc_nids = alc662_adc_nids,
b59bdf3b 18299 .num_adc_nids = 1,
622e84cd
KY
18300 .capsrc_nids = alc662_capsrc_nids,
18301 .channel_mode = alc662_3ST_2ch_modes,
622e84cd 18302 .unsol_event = alc663_m51va_unsol_event,
4f5d1706 18303 .setup = alc663_m51va_setup,
622e84cd
KY
18304 .init_hook = alc663_m51va_inithook,
18305 },
9541ba1d
CP
18306 [ALC272_SAMSUNG_NC10] = {
18307 .mixers = { alc272_nc10_mixer },
18308 .init_verbs = { alc662_init_verbs,
18309 alc663_21jd_amic_init_verbs },
18310 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
18311 .dac_nids = alc272_dac_nids,
18312 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18313 .channel_mode = alc662_3ST_2ch_modes,
4f5d1706 18314 /*.input_mux = &alc272_nc10_capture_source,*/
9541ba1d 18315 .unsol_event = alc663_mode4_unsol_event,
4f5d1706 18316 .setup = alc663_mode4_setup,
9541ba1d
CP
18317 .init_hook = alc663_mode4_inithook,
18318 },
bc9f98a9
KY
18319};
18320
18321
18322/*
18323 * BIOS auto configuration
18324 */
18325
7085ec12
TI
18326/* convert from MIX nid to DAC */
18327static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
18328{
18329 if (nid == 0x0f)
18330 return 0x02;
18331 else if (nid >= 0x0c && nid <= 0x0e)
18332 return nid - 0x0c + 0x02;
18333 else
18334 return 0;
18335}
18336
18337/* get MIX nid connected to the given pin targeted to DAC */
18338static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
18339 hda_nid_t dac)
18340{
18341 hda_nid_t mix[4];
18342 int i, num;
18343
18344 num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
18345 for (i = 0; i < num; i++) {
18346 if (alc662_mix_to_dac(mix[i]) == dac)
18347 return mix[i];
18348 }
18349 return 0;
18350}
18351
18352/* look for an empty DAC slot */
18353static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
18354{
18355 struct alc_spec *spec = codec->spec;
18356 hda_nid_t srcs[5];
18357 int i, j, num;
18358
18359 num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
18360 if (num < 0)
18361 return 0;
18362 for (i = 0; i < num; i++) {
18363 hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
18364 if (!nid)
18365 continue;
18366 for (j = 0; j < spec->multiout.num_dacs; j++)
18367 if (spec->multiout.dac_nids[j] == nid)
18368 break;
18369 if (j >= spec->multiout.num_dacs)
18370 return nid;
18371 }
18372 return 0;
18373}
18374
18375/* fill in the dac_nids table from the parsed pin configuration */
18376static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
18377 const struct auto_pin_cfg *cfg)
18378{
18379 struct alc_spec *spec = codec->spec;
18380 int i;
18381 hda_nid_t dac;
18382
18383 spec->multiout.dac_nids = spec->private_dac_nids;
18384 for (i = 0; i < cfg->line_outs; i++) {
18385 dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
18386 if (!dac)
18387 continue;
18388 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
18389 }
18390 return 0;
18391}
18392
0afe5f89 18393static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
7085ec12
TI
18394 hda_nid_t nid, unsigned int chs)
18395{
0afe5f89 18396 return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
7085ec12
TI
18397 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
18398}
18399
0afe5f89 18400static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
7085ec12
TI
18401 hda_nid_t nid, unsigned int chs)
18402{
0afe5f89 18403 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
7085ec12
TI
18404 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
18405}
18406
18407#define alc662_add_stereo_vol(spec, pfx, nid) \
18408 alc662_add_vol_ctl(spec, pfx, nid, 3)
18409#define alc662_add_stereo_sw(spec, pfx, nid) \
18410 alc662_add_sw_ctl(spec, pfx, nid, 3)
18411
bc9f98a9 18412/* add playback controls from the parsed DAC table */
7085ec12 18413static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
bc9f98a9
KY
18414 const struct auto_pin_cfg *cfg)
18415{
7085ec12 18416 struct alc_spec *spec = codec->spec;
bc9f98a9
KY
18417 static const char *chname[4] = {
18418 "Front", "Surround", NULL /*CLFE*/, "Side"
18419 };
7085ec12 18420 hda_nid_t nid, mix;
bc9f98a9
KY
18421 int i, err;
18422
18423 for (i = 0; i < cfg->line_outs; i++) {
7085ec12
TI
18424 nid = spec->multiout.dac_nids[i];
18425 if (!nid)
18426 continue;
18427 mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
18428 if (!mix)
bc9f98a9 18429 continue;
bc9f98a9
KY
18430 if (i == 2) {
18431 /* Center/LFE */
7085ec12 18432 err = alc662_add_vol_ctl(spec, "Center", nid, 1);
bc9f98a9
KY
18433 if (err < 0)
18434 return err;
7085ec12 18435 err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
bc9f98a9
KY
18436 if (err < 0)
18437 return err;
7085ec12 18438 err = alc662_add_sw_ctl(spec, "Center", mix, 1);
bc9f98a9
KY
18439 if (err < 0)
18440 return err;
7085ec12 18441 err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
bc9f98a9
KY
18442 if (err < 0)
18443 return err;
18444 } else {
0d884cb9
TI
18445 const char *pfx;
18446 if (cfg->line_outs == 1 &&
18447 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
7085ec12 18448 if (cfg->hp_outs)
0d884cb9
TI
18449 pfx = "Speaker";
18450 else
18451 pfx = "PCM";
18452 } else
18453 pfx = chname[i];
7085ec12 18454 err = alc662_add_vol_ctl(spec, pfx, nid, 3);
bc9f98a9
KY
18455 if (err < 0)
18456 return err;
0d884cb9
TI
18457 if (cfg->line_outs == 1 &&
18458 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
18459 pfx = "Speaker";
7085ec12 18460 err = alc662_add_sw_ctl(spec, pfx, mix, 3);
bc9f98a9
KY
18461 if (err < 0)
18462 return err;
18463 }
18464 }
18465 return 0;
18466}
18467
18468/* add playback controls for speaker and HP outputs */
7085ec12
TI
18469/* return DAC nid if any new DAC is assigned */
18470static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
bc9f98a9
KY
18471 const char *pfx)
18472{
7085ec12
TI
18473 struct alc_spec *spec = codec->spec;
18474 hda_nid_t nid, mix;
bc9f98a9 18475 int err;
bc9f98a9
KY
18476
18477 if (!pin)
18478 return 0;
7085ec12
TI
18479 nid = alc662_look_for_dac(codec, pin);
18480 if (!nid) {
7085ec12
TI
18481 /* the corresponding DAC is already occupied */
18482 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
18483 return 0; /* no way */
18484 /* create a switch only */
0afe5f89 18485 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
7085ec12 18486 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
24fb9173
TI
18487 }
18488
7085ec12
TI
18489 mix = alc662_dac_to_mix(codec, pin, nid);
18490 if (!mix)
18491 return 0;
18492 err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18493 if (err < 0)
18494 return err;
18495 err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18496 if (err < 0)
18497 return err;
18498 return nid;
bc9f98a9
KY
18499}
18500
18501/* create playback/capture controls for input pins */
05f5f477 18502#define alc662_auto_create_input_ctls \
4b7348a1 18503 alc882_auto_create_input_ctls
bc9f98a9
KY
18504
18505static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
18506 hda_nid_t nid, int pin_type,
7085ec12 18507 hda_nid_t dac)
bc9f98a9 18508{
7085ec12
TI
18509 int i, num;
18510 hda_nid_t srcs[4];
18511
f6c7e546 18512 alc_set_pin_output(codec, nid, pin_type);
bc9f98a9 18513 /* need the manual connection? */
7085ec12
TI
18514 num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
18515 if (num <= 1)
18516 return;
18517 for (i = 0; i < num; i++) {
18518 if (alc662_mix_to_dac(srcs[i]) != dac)
18519 continue;
18520 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
18521 return;
bc9f98a9
KY
18522 }
18523}
18524
18525static void alc662_auto_init_multi_out(struct hda_codec *codec)
18526{
18527 struct alc_spec *spec = codec->spec;
7085ec12 18528 int pin_type = get_pin_type(spec->autocfg.line_out_type);
bc9f98a9
KY
18529 int i;
18530
18531 for (i = 0; i <= HDA_SIDE; i++) {
18532 hda_nid_t nid = spec->autocfg.line_out_pins[i];
18533 if (nid)
baba8ee9 18534 alc662_auto_set_output_and_unmute(codec, nid, pin_type,
7085ec12 18535 spec->multiout.dac_nids[i]);
bc9f98a9
KY
18536 }
18537}
18538
18539static void alc662_auto_init_hp_out(struct hda_codec *codec)
18540{
18541 struct alc_spec *spec = codec->spec;
18542 hda_nid_t pin;
18543
18544 pin = spec->autocfg.hp_pins[0];
7085ec12
TI
18545 if (pin)
18546 alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
18547 spec->multiout.hp_nid);
f6c7e546
TI
18548 pin = spec->autocfg.speaker_pins[0];
18549 if (pin)
7085ec12
TI
18550 alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
18551 spec->multiout.extra_out_nid[0]);
bc9f98a9
KY
18552}
18553
bc9f98a9
KY
18554#define ALC662_PIN_CD_NID ALC880_PIN_CD_NID
18555
18556static void alc662_auto_init_analog_input(struct hda_codec *codec)
18557{
18558 struct alc_spec *spec = codec->spec;
18559 int i;
18560
18561 for (i = 0; i < AUTO_PIN_LAST; i++) {
18562 hda_nid_t nid = spec->autocfg.input_pins[i];
05f5f477 18563 if (alc_is_input_pin(codec, nid)) {
23f0c048 18564 alc_set_input_pin(codec, nid, i);
52ca15b7 18565 if (nid != ALC662_PIN_CD_NID &&
e82c025b 18566 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
bc9f98a9
KY
18567 snd_hda_codec_write(codec, nid, 0,
18568 AC_VERB_SET_AMP_GAIN_MUTE,
18569 AMP_OUT_MUTE);
18570 }
18571 }
18572}
18573
f511b01c
TI
18574#define alc662_auto_init_input_src alc882_auto_init_input_src
18575
bc9f98a9
KY
18576static int alc662_parse_auto_config(struct hda_codec *codec)
18577{
18578 struct alc_spec *spec = codec->spec;
18579 int err;
18580 static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
18581
18582 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
18583 alc662_ignore);
18584 if (err < 0)
18585 return err;
18586 if (!spec->autocfg.line_outs)
18587 return 0; /* can't find valid BIOS pin config */
18588
7085ec12 18589 err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
f12ab1e0
TI
18590 if (err < 0)
18591 return err;
7085ec12 18592 err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
f12ab1e0
TI
18593 if (err < 0)
18594 return err;
7085ec12 18595 err = alc662_auto_create_extra_out(codec,
f12ab1e0
TI
18596 spec->autocfg.speaker_pins[0],
18597 "Speaker");
18598 if (err < 0)
18599 return err;
7085ec12
TI
18600 if (err)
18601 spec->multiout.extra_out_nid[0] = err;
18602 err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
f12ab1e0
TI
18603 "Headphone");
18604 if (err < 0)
18605 return err;
7085ec12
TI
18606 if (err)
18607 spec->multiout.hp_nid = err;
05f5f477 18608 err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
f12ab1e0 18609 if (err < 0)
bc9f98a9
KY
18610 return err;
18611
18612 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
18613
0852d7a6 18614 if (spec->autocfg.dig_outs)
bc9f98a9
KY
18615 spec->multiout.dig_out_nid = ALC880_DIGOUT_NID;
18616
603c4019 18617 if (spec->kctls.list)
d88897ea 18618 add_mixer(spec, spec->kctls.list);
bc9f98a9
KY
18619
18620 spec->num_mux_defs = 1;
61b9b9b1 18621 spec->input_mux = &spec->private_imux[0];
ea1fb29a 18622
cec27c89
KY
18623 add_verb(spec, alc662_init_verbs);
18624 if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
d1eb57f4 18625 codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
cec27c89
KY
18626 add_verb(spec, alc663_init_verbs);
18627
18628 if (codec->vendor_id == 0x10ec0272)
18629 add_verb(spec, alc272_init_verbs);
ee979a14
TI
18630
18631 err = alc_auto_add_mic_boost(codec);
18632 if (err < 0)
18633 return err;
18634
6227cdce
KY
18635 if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18636 codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
18637 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0x21);
18638 else
18639 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4a79ba34 18640
8c87286f 18641 return 1;
bc9f98a9
KY
18642}
18643
18644/* additional initialization for auto-configuration model */
18645static void alc662_auto_init(struct hda_codec *codec)
18646{
f6c7e546 18647 struct alc_spec *spec = codec->spec;
bc9f98a9
KY
18648 alc662_auto_init_multi_out(codec);
18649 alc662_auto_init_hp_out(codec);
18650 alc662_auto_init_analog_input(codec);
f511b01c 18651 alc662_auto_init_input_src(codec);
f6c7e546 18652 if (spec->unsol_event)
7fb0d78f 18653 alc_inithook(codec);
bc9f98a9
KY
18654}
18655
18656static int patch_alc662(struct hda_codec *codec)
18657{
18658 struct alc_spec *spec;
18659 int err, board_config;
18660
18661 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
18662 if (!spec)
18663 return -ENOMEM;
18664
18665 codec->spec = spec;
18666
da00c244
KY
18667 alc_auto_parse_customize_define(codec);
18668
2c3bf9ab
TI
18669 alc_fix_pll_init(codec, 0x20, 0x04, 15);
18670
c027ddcd
KY
18671 if (alc_read_coef_idx(codec, 0) == 0x8020)
18672 alc_codec_rename(codec, "ALC661");
18673 else if ((alc_read_coef_idx(codec, 0) & (1 << 14)) &&
18674 codec->bus->pci->subsystem_vendor == 0x1025 &&
18675 spec->cdefine.platform_type == 1)
18676 alc_codec_rename(codec, "ALC272X");
274693f3 18677
bc9f98a9
KY
18678 board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
18679 alc662_models,
18680 alc662_cfg_tbl);
18681 if (board_config < 0) {
9a11f1aa
TI
18682 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
18683 codec->chip_name);
bc9f98a9
KY
18684 board_config = ALC662_AUTO;
18685 }
18686
18687 if (board_config == ALC662_AUTO) {
18688 /* automatic parse from the BIOS config */
18689 err = alc662_parse_auto_config(codec);
18690 if (err < 0) {
18691 alc_free(codec);
18692 return err;
8c87286f 18693 } else if (!err) {
bc9f98a9
KY
18694 printk(KERN_INFO
18695 "hda_codec: Cannot set up configuration "
18696 "from BIOS. Using base mode...\n");
18697 board_config = ALC662_3ST_2ch_DIG;
18698 }
18699 }
18700
680cd536
KK
18701 err = snd_hda_attach_beep_device(codec, 0x1);
18702 if (err < 0) {
18703 alc_free(codec);
18704 return err;
18705 }
18706
bc9f98a9 18707 if (board_config != ALC662_AUTO)
e9c364c0 18708 setup_preset(codec, &alc662_presets[board_config]);
bc9f98a9 18709
bc9f98a9
KY
18710 spec->stream_analog_playback = &alc662_pcm_analog_playback;
18711 spec->stream_analog_capture = &alc662_pcm_analog_capture;
18712
bc9f98a9
KY
18713 spec->stream_digital_playback = &alc662_pcm_digital_playback;
18714 spec->stream_digital_capture = &alc662_pcm_digital_capture;
18715
dd704698
TI
18716 if (!spec->adc_nids) {
18717 spec->adc_nids = alc662_adc_nids;
18718 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
18719 }
18720 if (!spec->capsrc_nids)
18721 spec->capsrc_nids = alc662_capsrc_nids;
bc9f98a9 18722
f9e336f6 18723 if (!spec->cap_mixer)
b59bdf3b 18724 set_capture_mixer(codec);
cec27c89 18725
da00c244
KY
18726 if (spec->cdefine.enable_pcbeep) {
18727 switch (codec->vendor_id) {
18728 case 0x10ec0662:
18729 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
18730 break;
18731 case 0x10ec0272:
18732 case 0x10ec0663:
18733 case 0x10ec0665:
18734 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
18735 break;
18736 case 0x10ec0273:
18737 set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
18738 break;
18739 }
cec27c89 18740 }
2134ea4f
TI
18741 spec->vmaster_nid = 0x02;
18742
bc9f98a9
KY
18743 codec->patch_ops = alc_patch_ops;
18744 if (board_config == ALC662_AUTO)
18745 spec->init_hook = alc662_auto_init;
cb53c626
TI
18746#ifdef CONFIG_SND_HDA_POWER_SAVE
18747 if (!spec->loopback.amplist)
18748 spec->loopback.amplist = alc662_loopbacks;
18749#endif
bc9f98a9
KY
18750
18751 return 0;
18752}
18753
274693f3
KY
18754static int patch_alc888(struct hda_codec *codec)
18755{
18756 if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
18757 kfree(codec->chip_name);
18758 codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
ac2c92e0
TI
18759 if (!codec->chip_name) {
18760 alc_free(codec);
274693f3 18761 return -ENOMEM;
ac2c92e0
TI
18762 }
18763 return patch_alc662(codec);
274693f3 18764 }
ac2c92e0 18765 return patch_alc882(codec);
274693f3
KY
18766}
18767
d1eb57f4
KY
18768/*
18769 * ALC680 support
18770 */
18771#define ALC680_DIGOUT_NID ALC880_DIGOUT_NID
18772#define alc680_modes alc260_modes
18773
18774static hda_nid_t alc680_dac_nids[3] = {
18775 /* Lout1, Lout2, hp */
18776 0x02, 0x03, 0x04
18777};
18778
18779static hda_nid_t alc680_adc_nids[3] = {
18780 /* ADC0-2 */
18781 /* DMIC, MIC, Line-in*/
18782 0x07, 0x08, 0x09
18783};
18784
18785static struct snd_kcontrol_new alc680_base_mixer[] = {
18786 /* output mixer control */
18787 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
18788 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
18789 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT),
18790 HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT),
18791 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
18792 { }
18793};
18794
18795static struct snd_kcontrol_new alc680_capture_mixer[] = {
18796 HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
18797 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
18798 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT),
18799 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT),
18800 HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x09, 0x0, HDA_INPUT),
18801 HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x09, 0x0, HDA_INPUT),
18802 { } /* end */
18803};
18804
18805/*
18806 * generic initialization of ADC, input mixers and output mixers
18807 */
18808static struct hda_verb alc680_init_verbs[] = {
18809 /* Unmute DAC0-1 and set vol = 0 */
18810 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
18811 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
18812 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
18813
18814 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
18815 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
18816 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
18817 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
18818 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
18819
18820 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
18821 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
18822 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
18823 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
18824 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
18825 { }
18826};
18827
18828/* create input playback/capture controls for the given pin */
18829static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
18830 const char *ctlname, int idx)
18831{
18832 hda_nid_t dac;
18833 int err;
18834
18835 switch (nid) {
18836 case 0x14:
18837 dac = 0x02;
18838 break;
18839 case 0x15:
18840 dac = 0x03;
18841 break;
18842 case 0x16:
18843 dac = 0x04;
18844 break;
18845 default:
18846 return 0;
18847 }
18848 if (spec->multiout.dac_nids[0] != dac &&
18849 spec->multiout.dac_nids[1] != dac) {
18850 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
18851 HDA_COMPOSE_AMP_VAL(dac, 3, idx,
18852 HDA_OUTPUT));
18853 if (err < 0)
18854 return err;
18855
18856 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
18857 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
18858
18859 if (err < 0)
18860 return err;
18861 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
18862 }
18863
18864 return 0;
18865}
18866
18867/* add playback controls from the parsed DAC table */
18868static int alc680_auto_create_multi_out_ctls(struct alc_spec *spec,
18869 const struct auto_pin_cfg *cfg)
18870{
18871 hda_nid_t nid;
18872 int err;
18873
18874 spec->multiout.dac_nids = spec->private_dac_nids;
18875
18876 nid = cfg->line_out_pins[0];
18877 if (nid) {
18878 const char *name;
18879 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
18880 name = "Speaker";
18881 else
18882 name = "Front";
18883 err = alc680_new_analog_output(spec, nid, name, 0);
18884 if (err < 0)
18885 return err;
18886 }
18887
18888 nid = cfg->speaker_pins[0];
18889 if (nid) {
18890 err = alc680_new_analog_output(spec, nid, "Speaker", 0);
18891 if (err < 0)
18892 return err;
18893 }
18894 nid = cfg->hp_pins[0];
18895 if (nid) {
18896 err = alc680_new_analog_output(spec, nid, "Headphone", 0);
18897 if (err < 0)
18898 return err;
18899 }
18900
18901 return 0;
18902}
18903
18904static void alc680_auto_set_output_and_unmute(struct hda_codec *codec,
18905 hda_nid_t nid, int pin_type)
18906{
18907 alc_set_pin_output(codec, nid, pin_type);
18908}
18909
18910static void alc680_auto_init_multi_out(struct hda_codec *codec)
18911{
18912 struct alc_spec *spec = codec->spec;
18913 hda_nid_t nid = spec->autocfg.line_out_pins[0];
18914 if (nid) {
18915 int pin_type = get_pin_type(spec->autocfg.line_out_type);
18916 alc680_auto_set_output_and_unmute(codec, nid, pin_type);
18917 }
18918}
18919
18920static void alc680_auto_init_hp_out(struct hda_codec *codec)
18921{
18922 struct alc_spec *spec = codec->spec;
18923 hda_nid_t pin;
18924
18925 pin = spec->autocfg.hp_pins[0];
18926 if (pin)
18927 alc680_auto_set_output_and_unmute(codec, pin, PIN_HP);
18928 pin = spec->autocfg.speaker_pins[0];
18929 if (pin)
18930 alc680_auto_set_output_and_unmute(codec, pin, PIN_OUT);
18931}
18932
18933/* pcm configuration: identical with ALC880 */
18934#define alc680_pcm_analog_playback alc880_pcm_analog_playback
18935#define alc680_pcm_analog_capture alc880_pcm_analog_capture
18936#define alc680_pcm_analog_alt_capture alc880_pcm_analog_alt_capture
18937#define alc680_pcm_digital_playback alc880_pcm_digital_playback
18938
18939static struct hda_input_mux alc680_capture_source = {
18940 .num_items = 1,
18941 .items = {
18942 { "Mic", 0x0 },
18943 },
18944};
18945
18946/*
18947 * BIOS auto configuration
18948 */
18949static int alc680_parse_auto_config(struct hda_codec *codec)
18950{
18951 struct alc_spec *spec = codec->spec;
18952 int err;
18953 static hda_nid_t alc680_ignore[] = { 0 };
18954
18955 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
18956 alc680_ignore);
18957 if (err < 0)
18958 return err;
18959 if (!spec->autocfg.line_outs) {
18960 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
18961 spec->multiout.max_channels = 2;
18962 spec->no_analog = 1;
18963 goto dig_only;
18964 }
18965 return 0; /* can't find valid BIOS pin config */
18966 }
18967 err = alc680_auto_create_multi_out_ctls(spec, &spec->autocfg);
18968 if (err < 0)
18969 return err;
18970
18971 spec->multiout.max_channels = 2;
18972
18973 dig_only:
18974 /* digital only support output */
18975 if (spec->autocfg.dig_outs) {
18976 spec->multiout.dig_out_nid = ALC680_DIGOUT_NID;
18977 spec->dig_out_type = spec->autocfg.dig_out_type[0];
18978 }
18979 if (spec->kctls.list)
18980 add_mixer(spec, spec->kctls.list);
18981
18982 add_verb(spec, alc680_init_verbs);
18983 spec->num_mux_defs = 1;
18984 spec->input_mux = &alc680_capture_source;
18985
18986 err = alc_auto_add_mic_boost(codec);
18987 if (err < 0)
18988 return err;
18989
18990 return 1;
18991}
18992
18993#define alc680_auto_init_analog_input alc882_auto_init_analog_input
18994
18995/* init callback for auto-configuration model -- overriding the default init */
18996static void alc680_auto_init(struct hda_codec *codec)
18997{
18998 struct alc_spec *spec = codec->spec;
18999 alc680_auto_init_multi_out(codec);
19000 alc680_auto_init_hp_out(codec);
19001 alc680_auto_init_analog_input(codec);
19002 if (spec->unsol_event)
19003 alc_inithook(codec);
19004}
19005
19006/*
19007 * configuration and preset
19008 */
19009static const char *alc680_models[ALC680_MODEL_LAST] = {
d4a86d81
TI
19010 [ALC680_BASE] = "base",
19011 [ALC680_AUTO] = "auto",
d1eb57f4
KY
19012};
19013
19014static struct snd_pci_quirk alc680_cfg_tbl[] = {
19015 SND_PCI_QUIRK(0x1043, 0x12f3, "ASUS NX90", ALC680_BASE),
19016 {}
19017};
19018
19019static struct alc_config_preset alc680_presets[] = {
19020 [ALC680_BASE] = {
19021 .mixers = { alc680_base_mixer },
19022 .cap_mixer = alc680_capture_mixer,
19023 .init_verbs = { alc680_init_verbs },
19024 .num_dacs = ARRAY_SIZE(alc680_dac_nids),
19025 .dac_nids = alc680_dac_nids,
19026 .num_adc_nids = ARRAY_SIZE(alc680_adc_nids),
19027 .adc_nids = alc680_adc_nids,
19028 .hp_nid = 0x04,
19029 .dig_out_nid = ALC680_DIGOUT_NID,
19030 .num_channel_mode = ARRAY_SIZE(alc680_modes),
19031 .channel_mode = alc680_modes,
19032 .input_mux = &alc680_capture_source,
19033 },
19034};
19035
19036static int patch_alc680(struct hda_codec *codec)
19037{
19038 struct alc_spec *spec;
19039 int board_config;
19040 int err;
19041
19042 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
19043 if (spec == NULL)
19044 return -ENOMEM;
19045
19046 codec->spec = spec;
19047
19048 board_config = snd_hda_check_board_config(codec, ALC680_MODEL_LAST,
19049 alc680_models,
19050 alc680_cfg_tbl);
19051
19052 if (board_config < 0 || board_config >= ALC680_MODEL_LAST) {
19053 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
19054 codec->chip_name);
19055 board_config = ALC680_AUTO;
19056 }
19057
19058 if (board_config == ALC680_AUTO) {
19059 /* automatic parse from the BIOS config */
19060 err = alc680_parse_auto_config(codec);
19061 if (err < 0) {
19062 alc_free(codec);
19063 return err;
19064 } else if (!err) {
19065 printk(KERN_INFO
19066 "hda_codec: Cannot set up configuration "
19067 "from BIOS. Using base mode...\n");
19068 board_config = ALC680_BASE;
19069 }
19070 }
19071
19072 if (board_config != ALC680_AUTO)
19073 setup_preset(codec, &alc680_presets[board_config]);
19074
19075 spec->stream_analog_playback = &alc680_pcm_analog_playback;
19076 spec->stream_analog_capture = &alc680_pcm_analog_capture;
19077 spec->stream_analog_alt_capture = &alc680_pcm_analog_alt_capture;
19078 spec->stream_digital_playback = &alc680_pcm_digital_playback;
19079
19080 if (!spec->adc_nids) {
19081 spec->adc_nids = alc680_adc_nids;
19082 spec->num_adc_nids = ARRAY_SIZE(alc680_adc_nids);
19083 }
19084
19085 if (!spec->cap_mixer)
19086 set_capture_mixer(codec);
19087
19088 spec->vmaster_nid = 0x02;
19089
19090 codec->patch_ops = alc_patch_ops;
19091 if (board_config == ALC680_AUTO)
19092 spec->init_hook = alc680_auto_init;
19093
19094 return 0;
19095}
19096
1da177e4
LT
19097/*
19098 * patch entries
19099 */
1289e9e8 19100static struct hda_codec_preset snd_hda_preset_realtek[] = {
1da177e4 19101 { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
df694daa 19102 { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
f6a92248 19103 { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
a361d84b 19104 { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
f6a92248 19105 { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
ebb83eeb 19106 { .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
01afd41f 19107 { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
ebb83eeb 19108 { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
f32610ed 19109 { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
bc9f98a9 19110 .patch = patch_alc861 },
f32610ed
JS
19111 { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
19112 { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
19113 { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
bc9f98a9 19114 { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
4953550a 19115 .patch = patch_alc882 },
bc9f98a9
KY
19116 { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
19117 .patch = patch_alc662 },
6dda9f4a 19118 { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
cec27c89 19119 { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
6227cdce 19120 { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
d1eb57f4 19121 { .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 },
f32610ed 19122 { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
1da177e4 19123 { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
4953550a 19124 { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
669faba2 19125 { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
4953550a 19126 .patch = patch_alc882 },
cb308f97 19127 { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
4953550a 19128 .patch = patch_alc882 },
df694daa 19129 { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
4953550a 19130 { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
4442608d 19131 { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
4953550a 19132 .patch = patch_alc882 },
274693f3 19133 { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
4953550a 19134 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
274693f3 19135 { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
1da177e4
LT
19136 {} /* terminator */
19137};
1289e9e8
TI
19138
19139MODULE_ALIAS("snd-hda-codec-id:10ec*");
19140
19141MODULE_LICENSE("GPL");
19142MODULE_DESCRIPTION("Realtek HD-audio codec");
19143
19144static struct hda_codec_preset_list realtek_list = {
19145 .preset = snd_hda_preset_realtek,
19146 .owner = THIS_MODULE,
19147};
19148
19149static int __init patch_realtek_init(void)
19150{
19151 return snd_hda_add_codec_preset(&realtek_list);
19152}
19153
19154static void __exit patch_realtek_exit(void)
19155{
19156 snd_hda_delete_codec_preset(&realtek_list);
19157}
19158
19159module_init(patch_realtek_init)
19160module_exit(patch_realtek_exit)