2 * ALC269/ALC270/ALC275/ALC276 quirk models
3 * included by patch_realtek.c
18 ALC269_MODEL_LAST
/* last tag */
22 * ALC269 channel source setting (2 channel)
24 #define ALC269_DIGOUT_NID ALC880_DIGOUT_NID
26 #define alc269_dac_nids alc260_dac_nids
28 static const hda_nid_t alc269_adc_nids
[1] = {
33 static const hda_nid_t alc269_capsrc_nids
[1] = {
37 static const hda_nid_t alc269vb_adc_nids
[1] = {
42 static const hda_nid_t alc269vb_capsrc_nids
[1] = {
46 #define alc269_modes alc260_modes
47 #define alc269_capture_source alc880_lg_lw_capture_source
49 static const struct snd_kcontrol_new alc269_base_mixer
[] = {
50 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT
),
51 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT
),
52 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT
),
53 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT
),
54 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT
),
55 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT
),
56 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT
),
57 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT
),
58 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT
),
59 HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT
),
60 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT
),
61 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT
),
65 static const struct snd_kcontrol_new alc269_quanta_fl1_mixer
[] = {
66 /* output mixer control */
67 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol
),
69 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
70 .name
= "Master Playback Switch",
71 .subdevice
= HDA_SUBDEV_AMP_FLAG
,
72 .info
= snd_hda_mixer_amp_switch_info
,
73 .get
= snd_hda_mixer_amp_switch_get
,
74 .put
= alc268_acer_master_sw_put
,
75 .private_value
= HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT
),
77 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT
),
78 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT
),
79 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT
),
80 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT
),
81 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT
),
82 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT
),
86 static const struct snd_kcontrol_new alc269_lifebook_mixer
[] = {
87 /* output mixer control */
88 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol
),
90 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
91 .name
= "Master Playback Switch",
92 .subdevice
= HDA_SUBDEV_AMP_FLAG
,
93 .info
= snd_hda_mixer_amp_switch_info
,
94 .get
= snd_hda_mixer_amp_switch_get
,
95 .put
= alc268_acer_master_sw_put
,
96 .private_value
= HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT
),
98 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT
),
99 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT
),
100 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT
),
101 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT
),
102 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT
),
103 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT
),
104 HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT
),
105 HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT
),
106 HDA_CODEC_VOLUME("Dock Mic Boost Volume", 0x1b, 0, HDA_INPUT
),
110 static const struct snd_kcontrol_new alc269_laptop_mixer
[] = {
111 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT
),
112 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT
),
113 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT
),
114 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT
),
118 static const struct snd_kcontrol_new alc269vb_laptop_mixer
[] = {
119 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT
),
120 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT
),
121 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT
),
122 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT
),
126 static const struct snd_kcontrol_new alc269_asus_mixer
[] = {
127 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT
),
128 HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x0, HDA_INPUT
),
132 /* capture mixer elements */
133 static const struct snd_kcontrol_new alc269_laptop_analog_capture_mixer
[] = {
134 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT
),
135 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT
),
136 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT
),
137 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT
),
141 static const struct snd_kcontrol_new alc269_laptop_digital_capture_mixer
[] = {
142 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT
),
143 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT
),
144 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT
),
148 static const struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer
[] = {
149 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT
),
150 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT
),
151 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT
),
152 HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT
),
156 static const struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer
[] = {
157 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT
),
158 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT
),
159 HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT
),
164 #define alc269_fujitsu_mixer alc269_laptop_mixer
166 static const struct hda_verb alc269_quanta_fl1_verbs
[] = {
167 {0x15, AC_VERB_SET_CONNECT_SEL
, 0x01},
168 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
169 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_HP
},
170 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE
, ALC_HP_EVENT
| AC_USRSP_EN
},
171 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_MIC_EVENT
},
172 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
176 static const struct hda_verb alc269_lifebook_verbs
[] = {
177 {0x15, AC_VERB_SET_CONNECT_SEL
, 0x01},
178 {0x1a, AC_VERB_SET_CONNECT_SEL
, 0x01},
179 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
180 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_HP
},
181 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE
, ALC_HP_EVENT
| AC_USRSP_EN
},
182 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
183 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_HP
},
184 {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE
, ALC_HP_EVENT
| AC_USRSP_EN
},
185 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_MIC_EVENT
},
186 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
190 /* toggle speaker-output according to the hp-jack state */
191 static void alc269_quanta_fl1_speaker_automute(struct hda_codec
*codec
)
193 alc_hp_automute(codec
);
195 snd_hda_codec_write(codec
, 0x20, 0,
196 AC_VERB_SET_COEF_INDEX
, 0x0c);
197 snd_hda_codec_write(codec
, 0x20, 0,
198 AC_VERB_SET_PROC_COEF
, 0x680);
200 snd_hda_codec_write(codec
, 0x20, 0,
201 AC_VERB_SET_COEF_INDEX
, 0x0c);
202 snd_hda_codec_write(codec
, 0x20, 0,
203 AC_VERB_SET_PROC_COEF
, 0x480);
206 #define alc269_lifebook_speaker_automute \
207 alc269_quanta_fl1_speaker_automute
209 static void alc269_lifebook_mic_autoswitch(struct hda_codec
*codec
)
211 unsigned int present_laptop
;
212 unsigned int present_dock
;
214 present_laptop
= snd_hda_jack_detect(codec
, 0x18);
215 present_dock
= snd_hda_jack_detect(codec
, 0x1b);
217 /* Laptop mic port overrides dock mic port, design decision */
219 snd_hda_codec_write(codec
, 0x23, 0,
220 AC_VERB_SET_CONNECT_SEL
, 0x3);
222 snd_hda_codec_write(codec
, 0x23, 0,
223 AC_VERB_SET_CONNECT_SEL
, 0x0);
224 if (!present_dock
&& !present_laptop
)
225 snd_hda_codec_write(codec
, 0x23, 0,
226 AC_VERB_SET_CONNECT_SEL
, 0x1);
229 static void alc269_quanta_fl1_unsol_event(struct hda_codec
*codec
,
234 alc269_quanta_fl1_speaker_automute(codec
);
237 alc_mic_automute(codec
);
242 static void alc269_lifebook_unsol_event(struct hda_codec
*codec
,
245 if ((res
>> 26) == ALC_HP_EVENT
)
246 alc269_lifebook_speaker_automute(codec
);
247 if ((res
>> 26) == ALC_MIC_EVENT
)
248 alc269_lifebook_mic_autoswitch(codec
);
251 static void alc269_quanta_fl1_setup(struct hda_codec
*codec
)
253 struct alc_spec
*spec
= codec
->spec
;
254 spec
->autocfg
.hp_pins
[0] = 0x15;
255 spec
->autocfg
.speaker_pins
[0] = 0x14;
256 spec
->automute_mixer_nid
[0] = 0x0c;
258 spec
->automute_mode
= ALC_AUTOMUTE_MIXER
;
259 spec
->ext_mic_pin
= 0x18;
260 spec
->int_mic_pin
= 0x19;
264 static void alc269_quanta_fl1_init_hook(struct hda_codec
*codec
)
266 alc269_quanta_fl1_speaker_automute(codec
);
267 alc_mic_automute(codec
);
270 static void alc269_lifebook_setup(struct hda_codec
*codec
)
272 struct alc_spec
*spec
= codec
->spec
;
273 spec
->autocfg
.hp_pins
[0] = 0x15;
274 spec
->autocfg
.hp_pins
[1] = 0x1a;
275 spec
->autocfg
.speaker_pins
[0] = 0x14;
276 spec
->automute_mixer_nid
[0] = 0x0c;
278 spec
->automute_mode
= ALC_AUTOMUTE_MIXER
;
281 static void alc269_lifebook_init_hook(struct hda_codec
*codec
)
283 alc269_lifebook_speaker_automute(codec
);
284 alc269_lifebook_mic_autoswitch(codec
);
287 static const struct hda_verb alc269_laptop_dmic_init_verbs
[] = {
288 {0x15, AC_VERB_SET_CONNECT_SEL
, 0x01},
289 {0x23, AC_VERB_SET_CONNECT_SEL
, 0x05},
290 {0x02, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb026 },
291 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7019 | (0x00 << 8))},
292 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
293 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_MIC_EVENT
},
294 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_HP_EVENT
},
298 static const struct hda_verb alc269_laptop_amic_init_verbs
[] = {
299 {0x15, AC_VERB_SET_CONNECT_SEL
, 0x01},
300 {0x23, AC_VERB_SET_CONNECT_SEL
, 0x01},
301 {0x02, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb026 },
302 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, (0x701b | (0x00 << 8))},
303 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_MIC_EVENT
},
304 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_HP_EVENT
},
308 static const struct hda_verb alc269vb_laptop_dmic_init_verbs
[] = {
309 {0x21, AC_VERB_SET_CONNECT_SEL
, 0x01},
310 {0x22, AC_VERB_SET_CONNECT_SEL
, 0x06},
311 {0x02, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb026 },
312 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7019 | (0x00 << 8))},
313 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
314 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_MIC_EVENT
},
315 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_HP_EVENT
},
319 static const struct hda_verb alc269vb_laptop_amic_init_verbs
[] = {
320 {0x21, AC_VERB_SET_CONNECT_SEL
, 0x01},
321 {0x22, AC_VERB_SET_CONNECT_SEL
, 0x01},
322 {0x02, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb026 },
323 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7019 | (0x00 << 8))},
324 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
325 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_MIC_EVENT
},
326 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_HP_EVENT
},
330 static const struct hda_verb alc271_acer_dmic_verbs
[] = {
331 {0x20, AC_VERB_SET_COEF_INDEX
, 0x0d},
332 {0x20, AC_VERB_SET_PROC_COEF
, 0x4000},
333 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
334 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
335 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_HP
},
336 {0x21, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
337 {0x21, AC_VERB_SET_CONNECT_SEL
, 0x00},
338 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_HP_EVENT
},
339 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_MIC_EVENT
},
340 {0x22, AC_VERB_SET_CONNECT_SEL
, 6},
344 static void alc269_laptop_amic_setup(struct hda_codec
*codec
)
346 struct alc_spec
*spec
= codec
->spec
;
347 spec
->autocfg
.hp_pins
[0] = 0x15;
348 spec
->autocfg
.speaker_pins
[0] = 0x14;
349 spec
->automute_mixer_nid
[0] = 0x0c;
351 spec
->automute_mode
= ALC_AUTOMUTE_MIXER
;
352 spec
->ext_mic_pin
= 0x18;
353 spec
->int_mic_pin
= 0x19;
357 static void alc269_laptop_dmic_setup(struct hda_codec
*codec
)
359 struct alc_spec
*spec
= codec
->spec
;
360 spec
->autocfg
.hp_pins
[0] = 0x15;
361 spec
->autocfg
.speaker_pins
[0] = 0x14;
362 spec
->automute_mixer_nid
[0] = 0x0c;
364 spec
->automute_mode
= ALC_AUTOMUTE_MIXER
;
365 spec
->ext_mic_pin
= 0x18;
366 spec
->int_mic_pin
= 0x12;
370 static void alc269vb_laptop_amic_setup(struct hda_codec
*codec
)
372 struct alc_spec
*spec
= codec
->spec
;
373 spec
->autocfg
.hp_pins
[0] = 0x21;
374 spec
->autocfg
.speaker_pins
[0] = 0x14;
375 spec
->automute_mixer_nid
[0] = 0x0c;
377 spec
->automute_mode
= ALC_AUTOMUTE_MIXER
;
378 spec
->ext_mic_pin
= 0x18;
379 spec
->int_mic_pin
= 0x19;
383 static void alc269vb_laptop_dmic_setup(struct hda_codec
*codec
)
385 struct alc_spec
*spec
= codec
->spec
;
386 spec
->autocfg
.hp_pins
[0] = 0x21;
387 spec
->autocfg
.speaker_pins
[0] = 0x14;
388 spec
->automute_mixer_nid
[0] = 0x0c;
390 spec
->automute_mode
= ALC_AUTOMUTE_MIXER
;
391 spec
->ext_mic_pin
= 0x18;
392 spec
->int_mic_pin
= 0x12;
397 * generic initialization of ADC, input mixers and output mixers
399 static const struct hda_verb alc269_init_verbs
[] = {
401 * Unmute ADC0 and set the default input to mic-in
403 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
406 * Set up output mixers (0x02 - 0x03)
408 /* set vol=0 to output mixers */
409 {0x02, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
410 {0x03, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
412 /* set up input amps for analog loopback */
413 /* Amp Indices: DAC = 0, mixer = 1 */
414 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
415 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
416 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
417 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
418 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
419 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
421 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
422 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_HP
},
423 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
424 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_VREF80
},
425 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_VREF80
},
426 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
427 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
429 {0x14, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
430 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
432 /* FIXME: use Mux-type input source selection */
433 /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
434 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
435 {0x23, AC_VERB_SET_CONNECT_SEL
, 0x00},
438 {0x14, AC_VERB_SET_EAPD_BTLENABLE
, 2},
442 static const struct hda_verb alc269vb_init_verbs
[] = {
444 * Unmute ADC0 and set the default input to mic-in
446 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
449 * Set up output mixers (0x02 - 0x03)
451 /* set vol=0 to output mixers */
452 {0x02, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
453 {0x03, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
455 /* set up input amps for analog loopback */
456 /* Amp Indices: DAC = 0, mixer = 1 */
457 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
458 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
459 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
460 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
461 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
462 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(1)},
464 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
465 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_HP
},
466 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
467 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_VREF80
},
468 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_VREF80
},
469 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
470 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
472 {0x14, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
473 {0x21, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
475 /* FIXME: use Mux-type input source selection */
476 /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
477 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
478 {0x22, AC_VERB_SET_CONNECT_SEL
, 0x00},
481 {0x14, AC_VERB_SET_EAPD_BTLENABLE
, 2},
486 * configuration and preset
488 static const char * const alc269_models
[ALC269_MODEL_LAST
] = {
489 [ALC269_BASIC
] = "basic",
490 [ALC269_QUANTA_FL1
] = "quanta",
491 [ALC269_AMIC
] = "laptop-amic",
492 [ALC269_DMIC
] = "laptop-dmic",
493 [ALC269_FUJITSU
] = "fujitsu",
494 [ALC269_LIFEBOOK
] = "lifebook",
495 [ALC269_AUTO
] = "auto",
498 static const struct snd_pci_quirk alc269_cfg_tbl
[] = {
499 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1
),
500 SND_PCI_QUIRK(0x1025, 0x047c, "ACER ZGA", ALC271_ACER
),
501 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
503 SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC
),
504 SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC
),
505 SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC
),
506 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC
),
507 SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC
),
508 SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC
),
509 SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC
),
510 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC
),
511 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC
),
512 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269VB_AMIC
),
513 SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC
),
514 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC
),
515 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC
),
516 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC
),
517 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC
),
518 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC
),
519 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC
),
520 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC
),
521 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC
),
522 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC
),
523 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC
),
524 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC
),
525 SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC
),
526 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC
),
527 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC
),
528 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC
),
529 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC
),
530 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC
),
531 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC
),
532 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC
),
533 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC
),
534 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC
),
535 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC
),
536 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC
),
537 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC
),
538 SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO
),
539 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK
),
540 SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC
),
541 SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU
),
542 SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC
),
543 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC
),
544 SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC
),
545 SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC
),
549 static const struct alc_config_preset alc269_presets
[] = {
551 .mixers
= { alc269_base_mixer
},
552 .init_verbs
= { alc269_init_verbs
},
553 .num_dacs
= ARRAY_SIZE(alc269_dac_nids
),
554 .dac_nids
= alc269_dac_nids
,
556 .num_channel_mode
= ARRAY_SIZE(alc269_modes
),
557 .channel_mode
= alc269_modes
,
558 .input_mux
= &alc269_capture_source
,
560 [ALC269_QUANTA_FL1
] = {
561 .mixers
= { alc269_quanta_fl1_mixer
},
562 .init_verbs
= { alc269_init_verbs
, alc269_quanta_fl1_verbs
},
563 .num_dacs
= ARRAY_SIZE(alc269_dac_nids
),
564 .dac_nids
= alc269_dac_nids
,
566 .num_channel_mode
= ARRAY_SIZE(alc269_modes
),
567 .channel_mode
= alc269_modes
,
568 .input_mux
= &alc269_capture_source
,
569 .unsol_event
= alc269_quanta_fl1_unsol_event
,
570 .setup
= alc269_quanta_fl1_setup
,
571 .init_hook
= alc269_quanta_fl1_init_hook
,
574 .mixers
= { alc269_laptop_mixer
},
575 .cap_mixer
= alc269_laptop_analog_capture_mixer
,
576 .init_verbs
= { alc269_init_verbs
,
577 alc269_laptop_amic_init_verbs
},
578 .num_dacs
= ARRAY_SIZE(alc269_dac_nids
),
579 .dac_nids
= alc269_dac_nids
,
581 .num_channel_mode
= ARRAY_SIZE(alc269_modes
),
582 .channel_mode
= alc269_modes
,
583 .unsol_event
= alc_sku_unsol_event
,
584 .setup
= alc269_laptop_amic_setup
,
585 .init_hook
= alc_inithook
,
588 .mixers
= { alc269_laptop_mixer
},
589 .cap_mixer
= alc269_laptop_digital_capture_mixer
,
590 .init_verbs
= { alc269_init_verbs
,
591 alc269_laptop_dmic_init_verbs
},
592 .num_dacs
= ARRAY_SIZE(alc269_dac_nids
),
593 .dac_nids
= alc269_dac_nids
,
595 .num_channel_mode
= ARRAY_SIZE(alc269_modes
),
596 .channel_mode
= alc269_modes
,
597 .unsol_event
= alc_sku_unsol_event
,
598 .setup
= alc269_laptop_dmic_setup
,
599 .init_hook
= alc_inithook
,
602 .mixers
= { alc269vb_laptop_mixer
},
603 .cap_mixer
= alc269vb_laptop_analog_capture_mixer
,
604 .init_verbs
= { alc269vb_init_verbs
,
605 alc269vb_laptop_amic_init_verbs
},
606 .num_dacs
= ARRAY_SIZE(alc269_dac_nids
),
607 .dac_nids
= alc269_dac_nids
,
609 .num_channel_mode
= ARRAY_SIZE(alc269_modes
),
610 .channel_mode
= alc269_modes
,
611 .unsol_event
= alc_sku_unsol_event
,
612 .setup
= alc269vb_laptop_amic_setup
,
613 .init_hook
= alc_inithook
,
616 .mixers
= { alc269vb_laptop_mixer
},
617 .cap_mixer
= alc269vb_laptop_digital_capture_mixer
,
618 .init_verbs
= { alc269vb_init_verbs
,
619 alc269vb_laptop_dmic_init_verbs
},
620 .num_dacs
= ARRAY_SIZE(alc269_dac_nids
),
621 .dac_nids
= alc269_dac_nids
,
623 .num_channel_mode
= ARRAY_SIZE(alc269_modes
),
624 .channel_mode
= alc269_modes
,
625 .unsol_event
= alc_sku_unsol_event
,
626 .setup
= alc269vb_laptop_dmic_setup
,
627 .init_hook
= alc_inithook
,
630 .mixers
= { alc269_fujitsu_mixer
},
631 .cap_mixer
= alc269_laptop_digital_capture_mixer
,
632 .init_verbs
= { alc269_init_verbs
,
633 alc269_laptop_dmic_init_verbs
},
634 .num_dacs
= ARRAY_SIZE(alc269_dac_nids
),
635 .dac_nids
= alc269_dac_nids
,
637 .num_channel_mode
= ARRAY_SIZE(alc269_modes
),
638 .channel_mode
= alc269_modes
,
639 .unsol_event
= alc_sku_unsol_event
,
640 .setup
= alc269_laptop_dmic_setup
,
641 .init_hook
= alc_inithook
,
643 [ALC269_LIFEBOOK
] = {
644 .mixers
= { alc269_lifebook_mixer
},
645 .init_verbs
= { alc269_init_verbs
, alc269_lifebook_verbs
},
646 .num_dacs
= ARRAY_SIZE(alc269_dac_nids
),
647 .dac_nids
= alc269_dac_nids
,
649 .num_channel_mode
= ARRAY_SIZE(alc269_modes
),
650 .channel_mode
= alc269_modes
,
651 .input_mux
= &alc269_capture_source
,
652 .unsol_event
= alc269_lifebook_unsol_event
,
653 .setup
= alc269_lifebook_setup
,
654 .init_hook
= alc269_lifebook_init_hook
,
657 .mixers
= { alc269_asus_mixer
},
658 .cap_mixer
= alc269vb_laptop_digital_capture_mixer
,
659 .init_verbs
= { alc269_init_verbs
, alc271_acer_dmic_verbs
},
660 .num_dacs
= ARRAY_SIZE(alc269_dac_nids
),
661 .dac_nids
= alc269_dac_nids
,
662 .adc_nids
= alc262_dmic_adc_nids
,
663 .num_adc_nids
= ARRAY_SIZE(alc262_dmic_adc_nids
),
664 .capsrc_nids
= alc262_dmic_capsrc_nids
,
665 .num_channel_mode
= ARRAY_SIZE(alc269_modes
),
666 .channel_mode
= alc269_modes
,
667 .input_mux
= &alc269_capture_source
,
668 .dig_out_nid
= ALC880_DIGOUT_NID
,
669 .unsol_event
= alc_sku_unsol_event
,
670 .setup
= alc269vb_laptop_dmic_setup
,
671 .init_hook
= alc_inithook
,