3 * included by patch_realtek.c
18 #ifdef CONFIG_SND_DEBUG
21 ALC260_MODEL_LAST
/* last tag */
24 static const hda_nid_t alc260_dac_nids
[1] = {
29 static const hda_nid_t alc260_adc_nids
[1] = {
34 static const hda_nid_t alc260_adc_nids_alt
[1] = {
39 /* NIDs used when simultaneous access to both ADCs makes sense. Note that
40 * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
42 static const hda_nid_t alc260_dual_adc_nids
[2] = {
47 #define ALC260_DIGOUT_NID 0x03
48 #define ALC260_DIGIN_NID 0x06
50 static const struct hda_input_mux alc260_capture_source
= {
60 /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
61 * headphone jack and the internal CD lines since these are the only pins at
62 * which audio can appear. For flexibility, also allow the option of
63 * recording the mixer output on the second ADC (ADC0 doesn't have a
64 * connection to the mixer output).
66 static const struct hda_input_mux alc260_fujitsu_capture_sources
[2] = {
87 /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
88 * the Fujitsu S702x, but jacks are marked differently.
90 static const struct hda_input_mux alc260_acer_capture_sources
[2] = {
106 { "Headphone", 0x6 },
112 /* Maxdata Favorit 100XS */
113 static const struct hda_input_mux alc260_favorit100_capture_sources
[2] = {
132 * This is just place-holder, so there's something for alc_build_pcms to look
133 * at when it calculates the maximum number of channels. ALC260 has no mixer
134 * element which allows changing the channel mode, so the verb list is
137 static const struct hda_channel_mode alc260_modes
[1] = {
142 /* Mixer combinations
144 * basic: base_output + input + pc_beep + capture
145 * HP: base_output + input + capture_alt
146 * HP_3013: hp_3013 + input + capture
147 * fujitsu: fujitsu + capture
148 * acer: acer + capture
151 static const struct snd_kcontrol_new alc260_base_output_mixer
[] = {
152 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT
),
153 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT
),
154 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT
),
155 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT
),
156 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT
),
157 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT
),
161 static const struct snd_kcontrol_new alc260_input_mixer
[] = {
162 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT
),
163 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT
),
164 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT
),
165 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT
),
166 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT
),
167 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT
),
168 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT
),
169 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT
),
173 /* update HP, line and mono out pins according to the master switch */
174 static void alc260_hp_master_update(struct hda_codec
*codec
)
176 update_speakers(codec
);
179 static int alc260_hp_master_sw_get(struct snd_kcontrol
*kcontrol
,
180 struct snd_ctl_elem_value
*ucontrol
)
182 struct hda_codec
*codec
= snd_kcontrol_chip(kcontrol
);
183 struct alc_spec
*spec
= codec
->spec
;
184 *ucontrol
->value
.integer
.value
= !spec
->master_mute
;
188 static int alc260_hp_master_sw_put(struct snd_kcontrol
*kcontrol
,
189 struct snd_ctl_elem_value
*ucontrol
)
191 struct hda_codec
*codec
= snd_kcontrol_chip(kcontrol
);
192 struct alc_spec
*spec
= codec
->spec
;
193 int val
= !*ucontrol
->value
.integer
.value
;
195 if (val
== spec
->master_mute
)
197 spec
->master_mute
= val
;
198 alc260_hp_master_update(codec
);
202 static const struct snd_kcontrol_new alc260_hp_output_mixer
[] = {
204 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
205 .name
= "Master Playback Switch",
206 .subdevice
= HDA_SUBDEV_NID_FLAG
| 0x11,
207 .info
= snd_ctl_boolean_mono_info
,
208 .get
= alc260_hp_master_sw_get
,
209 .put
= alc260_hp_master_sw_put
,
211 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT
),
212 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT
),
213 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT
),
214 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT
),
215 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
217 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT
),
221 static const struct hda_verb alc260_hp_unsol_verbs
[] = {
222 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_HP_EVENT
},
226 static void alc260_hp_setup(struct hda_codec
*codec
)
228 struct alc_spec
*spec
= codec
->spec
;
230 spec
->autocfg
.hp_pins
[0] = 0x0f;
231 spec
->autocfg
.speaker_pins
[0] = 0x10;
232 spec
->autocfg
.speaker_pins
[1] = 0x11;
234 spec
->automute_mode
= ALC_AUTOMUTE_PIN
;
237 static const struct snd_kcontrol_new alc260_hp_3013_mixer
[] = {
239 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
240 .name
= "Master Playback Switch",
241 .subdevice
= HDA_SUBDEV_NID_FLAG
| 0x11,
242 .info
= snd_ctl_boolean_mono_info
,
243 .get
= alc260_hp_master_sw_get
,
244 .put
= alc260_hp_master_sw_put
,
246 HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT
),
247 HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT
),
248 HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT
),
249 HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT
),
250 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT
),
251 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT
),
252 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT
),
253 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT
),
257 static void alc260_hp_3013_setup(struct hda_codec
*codec
)
259 struct alc_spec
*spec
= codec
->spec
;
261 spec
->autocfg
.hp_pins
[0] = 0x15;
262 spec
->autocfg
.speaker_pins
[0] = 0x10;
263 spec
->autocfg
.speaker_pins
[1] = 0x11;
265 spec
->automute_mode
= ALC_AUTOMUTE_PIN
;
268 static const struct hda_bind_ctls alc260_dc7600_bind_master_vol
= {
269 .ops
= &snd_hda_bind_vol
,
271 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT
),
272 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT
),
273 HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT
),
278 static const struct hda_bind_ctls alc260_dc7600_bind_switch
= {
279 .ops
= &snd_hda_bind_sw
,
281 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT
),
282 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT
),
287 static const struct snd_kcontrol_new alc260_hp_dc7600_mixer
[] = {
288 HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol
),
289 HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch
),
290 HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT
),
291 HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT
),
295 static const struct hda_verb alc260_hp_3013_unsol_verbs
[] = {
296 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_HP_EVENT
},
300 static void alc260_hp_3012_setup(struct hda_codec
*codec
)
302 struct alc_spec
*spec
= codec
->spec
;
304 spec
->autocfg
.hp_pins
[0] = 0x10;
305 spec
->autocfg
.speaker_pins
[0] = 0x0f;
306 spec
->autocfg
.speaker_pins
[1] = 0x11;
307 spec
->autocfg
.speaker_pins
[2] = 0x15;
309 spec
->automute_mode
= ALC_AUTOMUTE_PIN
;
312 /* Fujitsu S702x series laptops. ALC260 pin usage: Mic/Line jack = 0x12,
313 * HP jack = 0x14, CD audio = 0x16, internal speaker = 0x10.
315 static const struct snd_kcontrol_new alc260_fujitsu_mixer
[] = {
316 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT
),
317 HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT
),
318 ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT
),
319 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT
),
320 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT
),
321 HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT
),
322 HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT
),
323 ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN
),
324 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT
),
325 HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT
),
329 /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks. Note that current
330 * versions of the ALC260 don't act on requests to enable mic bias from NID
331 * 0x0f (used to drive the headphone jack in these laptops). The ALC260
332 * datasheet doesn't mention this restriction. At this stage it's not clear
333 * whether this behaviour is intentional or is a hardware bug in chip
334 * revisions available in early 2006. Therefore for now allow the
335 * "Headphone Jack Mode" control to span all choices, but if it turns out
336 * that the lack of mic bias for this NID is intentional we could change the
337 * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
339 * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
340 * don't appear to make the mic bias available from the "line" jack, even
341 * though the NID used for this jack (0x14) can supply it. The theory is
342 * that perhaps Acer have included blocking capacitors between the ALC260
343 * and the output jack. If this turns out to be the case for all such
344 * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
345 * to ALC_PIN_DIR_INOUT_NOMICBIAS.
347 * The C20x Tablet series have a mono internal speaker which is controlled
348 * via the chip's Mono sum widget and pin complex, so include the necessary
349 * controls for such models. On models without a "mono speaker" the control
352 static const struct snd_kcontrol_new alc260_acer_mixer
[] = {
353 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT
),
354 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT
),
355 ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT
),
356 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
358 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
360 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT
),
361 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT
),
362 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT
),
363 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT
),
364 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN
),
365 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT
),
366 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT
),
367 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT
),
371 /* Maxdata Favorit 100XS: one output and one input (0x12) jack
373 static const struct snd_kcontrol_new alc260_favorit100_mixer
[] = {
374 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT
),
375 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT
),
376 ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT
),
377 HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT
),
378 HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT
),
379 ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN
),
383 /* Packard bell V7900 ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
384 * Line In jack = 0x14, CD audio = 0x16, pc beep = 0x17.
386 static const struct snd_kcontrol_new alc260_will_mixer
[] = {
387 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT
),
388 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT
),
389 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT
),
390 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT
),
391 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN
),
392 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT
),
393 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT
),
394 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT
),
395 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT
),
396 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT
),
400 /* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
401 * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
403 static const struct snd_kcontrol_new alc260_replacer_672v_mixer
[] = {
404 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT
),
405 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT
),
406 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT
),
407 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT
),
408 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN
),
409 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT
),
410 HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT
),
411 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT
),
412 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT
),
413 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT
),
418 * initialization verbs
420 static const struct hda_verb alc260_init_verbs
[] = {
421 /* Line In pin widget for input */
422 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
423 /* CD pin widget for input */
424 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
425 /* Mic1 (rear panel) pin widget for input and vref at 80% */
426 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_VREF80
},
427 /* Mic2 (front panel) pin widget for input and vref at 80% */
428 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_VREF80
},
429 /* LINE-2 is used for line-out in rear */
430 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
431 /* select line-out */
432 {0x0e, AC_VERB_SET_CONNECT_SEL
, 0x00},
434 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
436 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_HP
},
438 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
439 /* mute capture amp left and right */
440 {0x04, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
441 /* set connection select to line in (default select for this ADC) */
442 {0x04, AC_VERB_SET_CONNECT_SEL
, 0x02},
443 /* mute capture amp left and right */
444 {0x05, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
445 /* set connection select to line in (default select for this ADC) */
446 {0x05, AC_VERB_SET_CONNECT_SEL
, 0x02},
447 /* set vol=0 Line-Out mixer amp left and right */
448 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
449 /* unmute pin widget amp left and right (no gain on this amp) */
450 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
451 /* set vol=0 HP mixer amp left and right */
452 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
453 /* unmute pin widget amp left and right (no gain on this amp) */
454 {0x10, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
455 /* set vol=0 Mono mixer amp left and right */
456 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
457 /* unmute pin widget amp left and right (no gain on this amp) */
458 {0x11, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
459 /* unmute LINE-2 out pin */
460 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
461 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
464 /* mute analog inputs */
465 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
466 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
467 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(2)},
468 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(3)},
469 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(4)},
470 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
471 /* mute Front out path */
472 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
473 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
474 /* mute Headphone out path */
475 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
476 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
477 /* mute Mono out path */
478 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
479 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
483 #if 0 /* should be identical with alc260_init_verbs? */
484 static const struct hda_verb alc260_hp_init_verbs
[] = {
485 /* Headphone and output */
486 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0xc0},
488 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40},
489 /* Mic1 (rear panel) pin widget for input and vref at 80% */
490 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24},
491 /* Mic2 (front panel) pin widget for input and vref at 80% */
492 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24},
493 /* Line In pin widget for input */
494 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x20},
495 /* Line-2 pin widget for output */
496 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40},
497 /* CD pin widget for input */
498 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x20},
499 /* unmute amp left and right */
500 {0x04, AC_VERB_SET_AMP_GAIN_MUTE
, 0x7000},
501 /* set connection select to line in (default select for this ADC) */
502 {0x04, AC_VERB_SET_CONNECT_SEL
, 0x02},
503 /* unmute Line-Out mixer amp left and right (volume = 0) */
504 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb000},
505 /* mute pin widget amp left and right (no gain on this amp) */
506 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, 0x0000},
507 /* unmute HP mixer amp left and right (volume = 0) */
508 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb000},
509 /* mute pin widget amp left and right (no gain on this amp) */
510 {0x10, AC_VERB_SET_AMP_GAIN_MUTE
, 0x0000},
511 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
514 /* mute analog inputs */
515 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
516 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
517 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(2)},
518 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(3)},
519 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(4)},
520 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
521 /* Unmute Front out path */
522 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x00 << 8))},
523 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x01 << 8))},
524 /* Unmute Headphone out path */
525 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x00 << 8))},
526 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x01 << 8))},
527 /* Unmute Mono out path */
528 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x00 << 8))},
529 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x01 << 8))},
534 static const struct hda_verb alc260_hp_3013_init_verbs
[] = {
535 /* Line out and output */
536 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40},
538 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x40},
539 /* Mic1 (rear panel) pin widget for input and vref at 80% */
540 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24},
541 /* Mic2 (front panel) pin widget for input and vref at 80% */
542 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x24},
543 /* Line In pin widget for input */
544 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x20},
545 /* Headphone pin widget for output */
546 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0xc0},
547 /* CD pin widget for input */
548 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0x20},
549 /* unmute amp left and right */
550 {0x04, AC_VERB_SET_AMP_GAIN_MUTE
, 0x7000},
551 /* set connection select to line in (default select for this ADC) */
552 {0x04, AC_VERB_SET_CONNECT_SEL
, 0x02},
553 /* unmute Line-Out mixer amp left and right (volume = 0) */
554 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb000},
555 /* mute pin widget amp left and right (no gain on this amp) */
556 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, 0x0000},
557 /* unmute HP mixer amp left and right (volume = 0) */
558 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, 0xb000},
559 /* mute pin widget amp left and right (no gain on this amp) */
560 {0x10, AC_VERB_SET_AMP_GAIN_MUTE
, 0x0000},
561 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
564 /* mute analog inputs */
565 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
566 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
567 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(2)},
568 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(3)},
569 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(4)},
570 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
571 /* Unmute Front out path */
572 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x00 << 8))},
573 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x01 << 8))},
574 /* Unmute Headphone out path */
575 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x00 << 8))},
576 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x01 << 8))},
577 /* Unmute Mono out path */
578 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x00 << 8))},
579 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, (0x7000 | (0x01 << 8))},
583 /* Initialisation sequence for ALC260 as configured in Fujitsu S702x
584 * laptops. ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
585 * audio = 0x16, internal speaker = 0x10.
587 static const struct hda_verb alc260_fujitsu_init_verbs
[] = {
588 /* Disable all GPIOs */
589 {0x01, AC_VERB_SET_GPIO_MASK
, 0},
590 /* Internal speaker is connected to headphone pin */
591 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_HP
},
592 /* Headphone/Line-out jack connects to Line1 pin; make it an output */
593 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
594 /* Mic/Line-in jack is connected to mic1 pin, so make it an input */
595 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
596 /* Ensure all other unused pins are disabled and muted. */
597 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0},
598 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
599 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0},
600 {0x11, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
601 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0},
602 {0x13, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
603 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0},
604 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
606 /* Disable digital (SPDIF) pins */
607 {0x03, AC_VERB_SET_DIGI_CONVERT_1
, 0},
608 {0x06, AC_VERB_SET_DIGI_CONVERT_1
, 0},
610 /* Ensure Line1 pin widget takes its input from the OUT1 sum bus
611 * when acting as an output.
613 {0x0d, AC_VERB_SET_CONNECT_SEL
, 0},
615 /* Start with output sum widgets muted and their output gains at min */
616 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
617 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
618 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
619 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
620 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
621 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
622 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
623 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
624 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
626 /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
627 {0x10, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
628 /* Unmute Line1 pin widget output buffer since it starts as an output.
629 * If the pin mode is changed by the user the pin mode control will
630 * take care of enabling the pin's input/output buffers as needed.
631 * Therefore there's no need to enable the input buffer at this
634 {0x14, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
635 /* Unmute input buffer of pin widget used for Line-in (no equiv
638 {0x12, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
640 /* Mute capture amp left and right */
641 {0x04, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
642 /* Set ADC connection select to match default mixer setting - line
645 {0x04, AC_VERB_SET_CONNECT_SEL
, 0x00},
647 /* Do the same for the second ADC: mute capture input amp and
648 * set ADC connection to line in (on mic1 pin)
650 {0x05, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
651 {0x05, AC_VERB_SET_CONNECT_SEL
, 0x00},
653 /* Mute all inputs to mixer widget (even unconnected ones) */
654 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)}, /* mic1 pin */
655 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)}, /* mic2 pin */
656 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(2)}, /* line1 pin */
657 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(3)}, /* line2 pin */
658 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(4)}, /* CD pin */
659 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(5)}, /* Beep-gen pin */
660 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(6)}, /* Line-out pin */
661 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(7)}, /* HP-pin pin */
666 /* Initialisation sequence for ALC260 as configured in Acer TravelMate and
667 * similar laptops (adapted from Fujitsu init verbs).
669 static const struct hda_verb alc260_acer_init_verbs
[] = {
670 /* On TravelMate laptops, GPIO 0 enables the internal speaker and
671 * the headphone jack. Turn this on and rely on the standard mute
672 * methods whenever the user wants to turn these outputs off.
674 {0x01, AC_VERB_SET_GPIO_MASK
, 0x01},
675 {0x01, AC_VERB_SET_GPIO_DIRECTION
, 0x01},
676 {0x01, AC_VERB_SET_GPIO_DATA
, 0x01},
677 /* Internal speaker/Headphone jack is connected to Line-out pin */
678 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_HP
},
679 /* Internal microphone/Mic jack is connected to Mic1 pin */
680 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_VREF50
},
681 /* Line In jack is connected to Line1 pin */
682 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_IN
},
683 /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
684 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_HP
},
685 /* Ensure all other unused pins are disabled and muted. */
686 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0},
687 {0x10, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
688 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0},
689 {0x13, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
690 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0},
691 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
692 /* Disable digital (SPDIF) pins */
693 {0x03, AC_VERB_SET_DIGI_CONVERT_1
, 0},
694 {0x06, AC_VERB_SET_DIGI_CONVERT_1
, 0},
696 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
697 * bus when acting as outputs.
699 {0x0b, AC_VERB_SET_CONNECT_SEL
, 0},
700 {0x0d, AC_VERB_SET_CONNECT_SEL
, 0},
702 /* Start with output sum widgets muted and their output gains at min */
703 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
704 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
705 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
706 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
707 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
708 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
709 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
710 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
711 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
713 /* Unmute Line-out pin widget amp left and right
714 * (no equiv mixer ctrl)
716 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
717 /* Unmute mono pin widget amp output (no equiv mixer ctrl) */
718 {0x11, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
719 /* Unmute Mic1 and Line1 pin widget input buffers since they start as
720 * inputs. If the pin mode is changed by the user the pin mode control
721 * will take care of enabling the pin's input/output buffers as needed.
722 * Therefore there's no need to enable the input buffer at this
725 {0x12, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
726 {0x14, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
728 /* Mute capture amp left and right */
729 {0x04, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
730 /* Set ADC connection select to match default mixer setting - mic
733 {0x04, AC_VERB_SET_CONNECT_SEL
, 0x00},
735 /* Do similar with the second ADC: mute capture input amp and
736 * set ADC connection to mic to match ALSA's default state.
738 {0x05, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
739 {0x05, AC_VERB_SET_CONNECT_SEL
, 0x00},
741 /* Mute all inputs to mixer widget (even unconnected ones) */
742 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)}, /* mic1 pin */
743 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)}, /* mic2 pin */
744 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(2)}, /* line1 pin */
745 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(3)}, /* line2 pin */
746 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(4)}, /* CD pin */
747 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(5)}, /* Beep-gen pin */
748 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(6)}, /* Line-out pin */
749 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(7)}, /* HP-pin pin */
754 /* Initialisation sequence for Maxdata Favorit 100XS
755 * (adapted from Acer init verbs).
757 static const struct hda_verb alc260_favorit100_init_verbs
[] = {
758 /* GPIO 0 enables the output jack.
759 * Turn this on and rely on the standard mute
760 * methods whenever the user wants to turn these outputs off.
762 {0x01, AC_VERB_SET_GPIO_MASK
, 0x01},
763 {0x01, AC_VERB_SET_GPIO_DIRECTION
, 0x01},
764 {0x01, AC_VERB_SET_GPIO_DATA
, 0x01},
765 /* Line/Mic input jack is connected to Mic1 pin */
766 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_VREF50
},
767 /* Ensure all other unused pins are disabled and muted. */
768 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0},
769 {0x10, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
770 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0},
771 {0x11, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
772 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0},
773 {0x13, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
774 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0},
775 {0x14, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
776 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL
, 0},
777 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
778 /* Disable digital (SPDIF) pins */
779 {0x03, AC_VERB_SET_DIGI_CONVERT_1
, 0},
780 {0x06, AC_VERB_SET_DIGI_CONVERT_1
, 0},
782 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
783 * bus when acting as outputs.
785 {0x0b, AC_VERB_SET_CONNECT_SEL
, 0},
786 {0x0d, AC_VERB_SET_CONNECT_SEL
, 0},
788 /* Start with output sum widgets muted and their output gains at min */
789 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
790 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
791 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
792 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
793 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
794 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
795 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
796 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
797 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
799 /* Unmute Line-out pin widget amp left and right
800 * (no equiv mixer ctrl)
802 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
803 /* Unmute Mic1 and Line1 pin widget input buffers since they start as
804 * inputs. If the pin mode is changed by the user the pin mode control
805 * will take care of enabling the pin's input/output buffers as needed.
806 * Therefore there's no need to enable the input buffer at this
809 {0x12, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_UNMUTE(0)},
811 /* Mute capture amp left and right */
812 {0x04, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
813 /* Set ADC connection select to match default mixer setting - mic
816 {0x04, AC_VERB_SET_CONNECT_SEL
, 0x00},
818 /* Do similar with the second ADC: mute capture input amp and
819 * set ADC connection to mic to match ALSA's default state.
821 {0x05, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
822 {0x05, AC_VERB_SET_CONNECT_SEL
, 0x00},
824 /* Mute all inputs to mixer widget (even unconnected ones) */
825 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)}, /* mic1 pin */
826 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)}, /* mic2 pin */
827 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(2)}, /* line1 pin */
828 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(3)}, /* line2 pin */
829 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(4)}, /* CD pin */
830 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(5)}, /* Beep-gen pin */
831 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(6)}, /* Line-out pin */
832 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(7)}, /* HP-pin pin */
837 static const struct hda_verb alc260_will_verbs
[] = {
838 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_HP
},
839 {0x0b, AC_VERB_SET_CONNECT_SEL
, 0x00},
840 {0x0d, AC_VERB_SET_CONNECT_SEL
, 0x00},
841 {0x0f, AC_VERB_SET_EAPD_BTLENABLE
, 0x02},
842 {0x1a, AC_VERB_SET_COEF_INDEX
, 0x07},
843 {0x1a, AC_VERB_SET_PROC_COEF
, 0x3040},
847 static const struct hda_verb alc260_replacer_672v_verbs
[] = {
848 {0x0f, AC_VERB_SET_EAPD_BTLENABLE
, 0x02},
849 {0x1a, AC_VERB_SET_COEF_INDEX
, 0x07},
850 {0x1a, AC_VERB_SET_PROC_COEF
, 0x3050},
852 {0x01, AC_VERB_SET_GPIO_MASK
, 0x01},
853 {0x01, AC_VERB_SET_GPIO_DIRECTION
, 0x01},
854 {0x01, AC_VERB_SET_GPIO_DATA
, 0x00},
856 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_HP_EVENT
},
860 /* toggle speaker-output according to the hp-jack state */
861 static void alc260_replacer_672v_automute(struct hda_codec
*codec
)
863 unsigned int present
;
865 /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
866 present
= snd_hda_jack_detect(codec
, 0x0f);
868 snd_hda_codec_write_cache(codec
, 0x01, 0,
869 AC_VERB_SET_GPIO_DATA
, 1);
870 snd_hda_codec_write_cache(codec
, 0x0f, 0,
871 AC_VERB_SET_PIN_WIDGET_CONTROL
,
874 snd_hda_codec_write_cache(codec
, 0x01, 0,
875 AC_VERB_SET_GPIO_DATA
, 0);
876 snd_hda_codec_write_cache(codec
, 0x0f, 0,
877 AC_VERB_SET_PIN_WIDGET_CONTROL
,
882 static void alc260_replacer_672v_unsol_event(struct hda_codec
*codec
,
885 if ((res
>> 26) == ALC_HP_EVENT
)
886 alc260_replacer_672v_automute(codec
);
889 static const struct hda_verb alc260_hp_dc7600_verbs
[] = {
890 {0x05, AC_VERB_SET_CONNECT_SEL
, 0x01},
891 {0x15, AC_VERB_SET_CONNECT_SEL
, 0x01},
892 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
893 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_HP
},
894 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
895 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
896 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_VREF80
},
897 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_HP_EVENT
},
898 {0x11, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_HP_EVENT
},
899 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE
, AC_USRSP_EN
| ALC_HP_EVENT
},
903 /* Test configuration for debugging, modelled after the ALC880 test
906 #ifdef CONFIG_SND_DEBUG
907 static const hda_nid_t alc260_test_dac_nids
[1] = {
910 static const hda_nid_t alc260_test_adc_nids
[2] = {
913 /* For testing the ALC260, each input MUX needs its own definition since
914 * the signal assignments are different. This assumes that the first ADC
917 static const struct hda_input_mux alc260_test_capture_sources
[2] = {
923 { "LINE1 pin", 0x2 },
924 { "LINE2 pin", 0x3 },
926 { "LINE-OUT pin", 0x5 },
927 { "HP-OUT pin", 0x6 },
935 { "LINE1 pin", 0x2 },
936 { "LINE2 pin", 0x3 },
939 { "LINE-OUT pin", 0x6 },
940 { "HP-OUT pin", 0x7 },
944 static const struct snd_kcontrol_new alc260_test_mixer
[] = {
945 /* Output driver widgets */
946 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT
),
947 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT
),
948 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT
),
949 HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT
),
950 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT
),
951 HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT
),
953 /* Modes for retasking pin widgets
954 * Note: the ALC260 doesn't seem to act on requests to enable mic
955 * bias from NIDs 0x0f and 0x10. The ALC260 datasheet doesn't
956 * mention this restriction. At this stage it's not clear whether
957 * this behaviour is intentional or is a hardware bug in chip
958 * revisions available at least up until early 2006. Therefore for
959 * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
960 * choices, but if it turns out that the lack of mic bias for these
961 * NIDs is intentional we could change their modes from
962 * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
964 ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT
),
965 ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT
),
966 ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT
),
967 ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT
),
968 ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT
),
969 ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT
),
971 /* Loopback mixer controls */
972 HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT
),
973 HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT
),
974 HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT
),
975 HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT
),
976 HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT
),
977 HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT
),
978 HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT
),
979 HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT
),
980 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT
),
981 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT
),
982 HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT
),
983 HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT
),
984 HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT
),
985 HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT
),
987 /* Controls for GPIO pins, assuming they are configured as outputs */
988 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
989 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
990 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
991 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
993 /* Switches to allow the digital IO pins to be enabled. The datasheet
994 * is ambigious as to which NID is which; testing on laptops which
995 * make this output available should provide clarification.
997 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
998 ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
1000 /* A switch allowing EAPD to be enabled. Some laptops seem to use
1001 * this output to turn on an external amplifier.
1003 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
1004 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
1008 static const struct hda_verb alc260_test_init_verbs
[] = {
1009 /* Enable all GPIOs as outputs with an initial value of 0 */
1010 {0x01, AC_VERB_SET_GPIO_DIRECTION
, 0x0f},
1011 {0x01, AC_VERB_SET_GPIO_DATA
, 0x00},
1012 {0x01, AC_VERB_SET_GPIO_MASK
, 0x0f},
1014 /* Enable retasking pins as output, initially without power amp */
1015 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
1016 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
1017 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
1018 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
1019 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
1020 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL
, PIN_OUT
},
1022 /* Disable digital (SPDIF) pins initially, but users can enable
1023 * them via a mixer switch. In the case of SPDIF-out, this initverb
1024 * payload also sets the generation to 0, output to be in "consumer"
1025 * PCM format, copyright asserted, no pre-emphasis and no validity
1028 {0x03, AC_VERB_SET_DIGI_CONVERT_1
, 0},
1029 {0x06, AC_VERB_SET_DIGI_CONVERT_1
, 0},
1031 /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
1032 * OUT1 sum bus when acting as an output.
1034 {0x0b, AC_VERB_SET_CONNECT_SEL
, 0},
1035 {0x0c, AC_VERB_SET_CONNECT_SEL
, 0},
1036 {0x0d, AC_VERB_SET_CONNECT_SEL
, 0},
1037 {0x0e, AC_VERB_SET_CONNECT_SEL
, 0},
1039 /* Start with output sum widgets muted and their output gains at min */
1040 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
1041 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
1042 {0x08, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
1043 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
1044 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
1045 {0x09, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
1046 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
1047 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)},
1048 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_ZERO
},
1050 /* Unmute retasking pin widget output buffers since the default
1051 * state appears to be output. As the pin mode is changed by the
1052 * user the pin mode control will take care of enabling the pin's
1053 * input/output buffers as needed.
1055 {0x10, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
1056 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
1057 {0x15, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
1058 {0x14, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
1059 {0x13, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
1060 {0x12, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
1061 /* Also unmute the mono-out pin widget */
1062 {0x11, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_OUT_UNMUTE
},
1064 /* Mute capture amp left and right */
1065 {0x04, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
1066 /* Set ADC connection select to match default mixer setting (mic1
1069 {0x04, AC_VERB_SET_CONNECT_SEL
, 0x00},
1071 /* Do the same for the second ADC: mute capture input amp and
1072 * set ADC connection to mic1 pin
1074 {0x05, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)},
1075 {0x05, AC_VERB_SET_CONNECT_SEL
, 0x00},
1077 /* Mute all inputs to mixer widget (even unconnected ones) */
1078 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(0)}, /* mic1 pin */
1079 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(1)}, /* mic2 pin */
1080 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(2)}, /* line1 pin */
1081 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(3)}, /* line2 pin */
1082 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(4)}, /* CD pin */
1083 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(5)}, /* Beep-gen pin */
1084 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(6)}, /* Line-out pin */
1085 {0x07, AC_VERB_SET_AMP_GAIN_MUTE
, AMP_IN_MUTE(7)}, /* HP-pin pin */
1092 * ALC260 configurations
1094 static const char * const alc260_models
[ALC260_MODEL_LAST
] = {
1095 [ALC260_BASIC
] = "basic",
1097 [ALC260_HP_3013
] = "hp-3013",
1098 [ALC260_HP_DC7600
] = "hp-dc7600",
1099 [ALC260_FUJITSU_S702X
] = "fujitsu",
1100 [ALC260_ACER
] = "acer",
1101 [ALC260_WILL
] = "will",
1102 [ALC260_REPLACER_672V
] = "replacer",
1103 [ALC260_FAVORIT100
] = "favorit100",
1104 #ifdef CONFIG_SND_DEBUG
1105 [ALC260_TEST
] = "test",
1107 [ALC260_AUTO
] = "auto",
1110 static const struct snd_pci_quirk alc260_cfg_tbl
[] = {
1111 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER
),
1112 SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL
),
1113 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER
),
1114 SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100
),
1115 SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013
),
1116 SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO
), /* no quirk */
1117 SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013
),
1118 SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013
),
1119 SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600
),
1120 SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013
),
1121 SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP
),
1122 SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP
),
1123 SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP
),
1124 SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC
),
1125 SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC
),
1126 SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC
),
1127 SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X
),
1128 SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC
),
1129 SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V
),
1130 SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL
),
1134 static const struct alc_config_preset alc260_presets
[] = {
1136 .mixers
= { alc260_base_output_mixer
,
1137 alc260_input_mixer
},
1138 .init_verbs
= { alc260_init_verbs
},
1139 .num_dacs
= ARRAY_SIZE(alc260_dac_nids
),
1140 .dac_nids
= alc260_dac_nids
,
1141 .num_adc_nids
= ARRAY_SIZE(alc260_dual_adc_nids
),
1142 .adc_nids
= alc260_dual_adc_nids
,
1143 .num_channel_mode
= ARRAY_SIZE(alc260_modes
),
1144 .channel_mode
= alc260_modes
,
1145 .input_mux
= &alc260_capture_source
,
1148 .mixers
= { alc260_hp_output_mixer
,
1149 alc260_input_mixer
},
1150 .init_verbs
= { alc260_init_verbs
,
1151 alc260_hp_unsol_verbs
},
1152 .num_dacs
= ARRAY_SIZE(alc260_dac_nids
),
1153 .dac_nids
= alc260_dac_nids
,
1154 .num_adc_nids
= ARRAY_SIZE(alc260_adc_nids_alt
),
1155 .adc_nids
= alc260_adc_nids_alt
,
1156 .num_channel_mode
= ARRAY_SIZE(alc260_modes
),
1157 .channel_mode
= alc260_modes
,
1158 .input_mux
= &alc260_capture_source
,
1159 .unsol_event
= alc_sku_unsol_event
,
1160 .setup
= alc260_hp_setup
,
1161 .init_hook
= alc_inithook
,
1163 [ALC260_HP_DC7600
] = {
1164 .mixers
= { alc260_hp_dc7600_mixer
,
1165 alc260_input_mixer
},
1166 .init_verbs
= { alc260_init_verbs
,
1167 alc260_hp_dc7600_verbs
},
1168 .num_dacs
= ARRAY_SIZE(alc260_dac_nids
),
1169 .dac_nids
= alc260_dac_nids
,
1170 .num_adc_nids
= ARRAY_SIZE(alc260_adc_nids_alt
),
1171 .adc_nids
= alc260_adc_nids_alt
,
1172 .num_channel_mode
= ARRAY_SIZE(alc260_modes
),
1173 .channel_mode
= alc260_modes
,
1174 .input_mux
= &alc260_capture_source
,
1175 .unsol_event
= alc_sku_unsol_event
,
1176 .setup
= alc260_hp_3012_setup
,
1177 .init_hook
= alc_inithook
,
1179 [ALC260_HP_3013
] = {
1180 .mixers
= { alc260_hp_3013_mixer
,
1181 alc260_input_mixer
},
1182 .init_verbs
= { alc260_hp_3013_init_verbs
,
1183 alc260_hp_3013_unsol_verbs
},
1184 .num_dacs
= ARRAY_SIZE(alc260_dac_nids
),
1185 .dac_nids
= alc260_dac_nids
,
1186 .num_adc_nids
= ARRAY_SIZE(alc260_adc_nids_alt
),
1187 .adc_nids
= alc260_adc_nids_alt
,
1188 .num_channel_mode
= ARRAY_SIZE(alc260_modes
),
1189 .channel_mode
= alc260_modes
,
1190 .input_mux
= &alc260_capture_source
,
1191 .unsol_event
= alc_sku_unsol_event
,
1192 .setup
= alc260_hp_3013_setup
,
1193 .init_hook
= alc_inithook
,
1195 [ALC260_FUJITSU_S702X
] = {
1196 .mixers
= { alc260_fujitsu_mixer
},
1197 .init_verbs
= { alc260_fujitsu_init_verbs
},
1198 .num_dacs
= ARRAY_SIZE(alc260_dac_nids
),
1199 .dac_nids
= alc260_dac_nids
,
1200 .num_adc_nids
= ARRAY_SIZE(alc260_dual_adc_nids
),
1201 .adc_nids
= alc260_dual_adc_nids
,
1202 .num_channel_mode
= ARRAY_SIZE(alc260_modes
),
1203 .channel_mode
= alc260_modes
,
1204 .num_mux_defs
= ARRAY_SIZE(alc260_fujitsu_capture_sources
),
1205 .input_mux
= alc260_fujitsu_capture_sources
,
1208 .mixers
= { alc260_acer_mixer
},
1209 .init_verbs
= { alc260_acer_init_verbs
},
1210 .num_dacs
= ARRAY_SIZE(alc260_dac_nids
),
1211 .dac_nids
= alc260_dac_nids
,
1212 .num_adc_nids
= ARRAY_SIZE(alc260_dual_adc_nids
),
1213 .adc_nids
= alc260_dual_adc_nids
,
1214 .num_channel_mode
= ARRAY_SIZE(alc260_modes
),
1215 .channel_mode
= alc260_modes
,
1216 .num_mux_defs
= ARRAY_SIZE(alc260_acer_capture_sources
),
1217 .input_mux
= alc260_acer_capture_sources
,
1219 [ALC260_FAVORIT100
] = {
1220 .mixers
= { alc260_favorit100_mixer
},
1221 .init_verbs
= { alc260_favorit100_init_verbs
},
1222 .num_dacs
= ARRAY_SIZE(alc260_dac_nids
),
1223 .dac_nids
= alc260_dac_nids
,
1224 .num_adc_nids
= ARRAY_SIZE(alc260_dual_adc_nids
),
1225 .adc_nids
= alc260_dual_adc_nids
,
1226 .num_channel_mode
= ARRAY_SIZE(alc260_modes
),
1227 .channel_mode
= alc260_modes
,
1228 .num_mux_defs
= ARRAY_SIZE(alc260_favorit100_capture_sources
),
1229 .input_mux
= alc260_favorit100_capture_sources
,
1232 .mixers
= { alc260_will_mixer
},
1233 .init_verbs
= { alc260_init_verbs
, alc260_will_verbs
},
1234 .num_dacs
= ARRAY_SIZE(alc260_dac_nids
),
1235 .dac_nids
= alc260_dac_nids
,
1236 .num_adc_nids
= ARRAY_SIZE(alc260_adc_nids
),
1237 .adc_nids
= alc260_adc_nids
,
1238 .dig_out_nid
= ALC260_DIGOUT_NID
,
1239 .num_channel_mode
= ARRAY_SIZE(alc260_modes
),
1240 .channel_mode
= alc260_modes
,
1241 .input_mux
= &alc260_capture_source
,
1243 [ALC260_REPLACER_672V
] = {
1244 .mixers
= { alc260_replacer_672v_mixer
},
1245 .init_verbs
= { alc260_init_verbs
, alc260_replacer_672v_verbs
},
1246 .num_dacs
= ARRAY_SIZE(alc260_dac_nids
),
1247 .dac_nids
= alc260_dac_nids
,
1248 .num_adc_nids
= ARRAY_SIZE(alc260_adc_nids
),
1249 .adc_nids
= alc260_adc_nids
,
1250 .dig_out_nid
= ALC260_DIGOUT_NID
,
1251 .num_channel_mode
= ARRAY_SIZE(alc260_modes
),
1252 .channel_mode
= alc260_modes
,
1253 .input_mux
= &alc260_capture_source
,
1254 .unsol_event
= alc260_replacer_672v_unsol_event
,
1255 .init_hook
= alc260_replacer_672v_automute
,
1257 #ifdef CONFIG_SND_DEBUG
1259 .mixers
= { alc260_test_mixer
},
1260 .init_verbs
= { alc260_test_init_verbs
},
1261 .num_dacs
= ARRAY_SIZE(alc260_test_dac_nids
),
1262 .dac_nids
= alc260_test_dac_nids
,
1263 .num_adc_nids
= ARRAY_SIZE(alc260_test_adc_nids
),
1264 .adc_nids
= alc260_test_adc_nids
,
1265 .num_channel_mode
= ARRAY_SIZE(alc260_modes
),
1266 .channel_mode
= alc260_modes
,
1267 .num_mux_defs
= ARRAY_SIZE(alc260_test_capture_sources
),
1268 .input_mux
= alc260_test_capture_sources
,