Merge branch 'btrfs-3.0' of git://github.com/chrismason/linux
[pandora-kernel.git] / sound / pci / hda / alc262_quirks.c
1 /*
2  * ALC262 quirk models
3  * included by patch_realtek.c
4  */
5
6 /* ALC262 models */
7 enum {
8         ALC262_AUTO,
9         ALC262_BASIC,
10         ALC262_HIPPO,
11         ALC262_HIPPO_1,
12         ALC262_FUJITSU,
13         ALC262_HP_BPC,
14         ALC262_HP_BPC_D7000_WL,
15         ALC262_HP_BPC_D7000_WF,
16         ALC262_HP_TC_T5735,
17         ALC262_HP_RP5700,
18         ALC262_BENQ_ED8,
19         ALC262_SONY_ASSAMD,
20         ALC262_BENQ_T31,
21         ALC262_ULTRA,
22         ALC262_LENOVO_3000,
23         ALC262_NEC,
24         ALC262_TOSHIBA_S06,
25         ALC262_TOSHIBA_RX1,
26         ALC262_TYAN,
27         ALC262_MODEL_LAST /* last tag */
28 };
29
30 #define ALC262_DIGOUT_NID       ALC880_DIGOUT_NID
31 #define ALC262_DIGIN_NID        ALC880_DIGIN_NID
32
33 #define alc262_dac_nids         alc260_dac_nids
34 #define alc262_adc_nids         alc882_adc_nids
35 #define alc262_adc_nids_alt     alc882_adc_nids_alt
36 #define alc262_capsrc_nids      alc882_capsrc_nids
37 #define alc262_capsrc_nids_alt  alc882_capsrc_nids_alt
38
39 #define alc262_modes            alc260_modes
40 #define alc262_capture_source   alc882_capture_source
41
42 static const hda_nid_t alc262_dmic_adc_nids[1] = {
43         /* ADC0 */
44         0x09
45 };
46
47 static const hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
48
49 static const struct snd_kcontrol_new alc262_base_mixer[] = {
50         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
51         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
52         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
53         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
54         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
55         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
56         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
57         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
58         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
59         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
60         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
61         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
62         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
63         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
64         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
65         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
66         { } /* end */
67 };
68
69 /* update HP, line and mono-out pins according to the master switch */
70 #define alc262_hp_master_update         alc260_hp_master_update
71
72 static void alc262_hp_bpc_setup(struct hda_codec *codec)
73 {
74         struct alc_spec *spec = codec->spec;
75
76         spec->autocfg.hp_pins[0] = 0x1b;
77         spec->autocfg.speaker_pins[0] = 0x16;
78         spec->automute = 1;
79         spec->automute_mode = ALC_AUTOMUTE_PIN;
80 }
81
82 static void alc262_hp_wildwest_setup(struct hda_codec *codec)
83 {
84         struct alc_spec *spec = codec->spec;
85
86         spec->autocfg.hp_pins[0] = 0x15;
87         spec->autocfg.speaker_pins[0] = 0x16;
88         spec->automute = 1;
89         spec->automute_mode = ALC_AUTOMUTE_PIN;
90 }
91
92 #define alc262_hp_master_sw_get         alc260_hp_master_sw_get
93 #define alc262_hp_master_sw_put         alc260_hp_master_sw_put
94
95 #define ALC262_HP_MASTER_SWITCH                                 \
96         {                                                       \
97                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,            \
98                 .name = "Master Playback Switch",               \
99                 .info = snd_ctl_boolean_mono_info,              \
100                 .get = alc262_hp_master_sw_get,                 \
101                 .put = alc262_hp_master_sw_put,                 \
102         }, \
103         {                                                       \
104                 .iface = NID_MAPPING,                           \
105                 .name = "Master Playback Switch",               \
106                 .private_value = 0x15 | (0x16 << 8) | (0x1b << 16),     \
107         }
108
109
110 static const struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
111         ALC262_HP_MASTER_SWITCH,
112         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
113         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
114         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
115         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
116                               HDA_OUTPUT),
117         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
118                             HDA_OUTPUT),
119         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
120         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
121         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
122         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
123         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
124         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
125         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
126         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
127         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
128         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
129         HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
130         HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
131         { } /* end */
132 };
133
134 static const struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
135         ALC262_HP_MASTER_SWITCH,
136         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
137         HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
138         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
139         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
140         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
141                               HDA_OUTPUT),
142         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
143                             HDA_OUTPUT),
144         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
145         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
146         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x1a, 0, HDA_INPUT),
147         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
148         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
149         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
150         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
151         { } /* end */
152 };
153
154 static const struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
155         HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
156         HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
157         HDA_CODEC_VOLUME("Rear Mic Boost Volume", 0x18, 0, HDA_INPUT),
158         { } /* end */
159 };
160
161 /* mute/unmute internal speaker according to the hp jack and mute state */
162 static void alc262_hp_t5735_setup(struct hda_codec *codec)
163 {
164         struct alc_spec *spec = codec->spec;
165
166         spec->autocfg.hp_pins[0] = 0x15;
167         spec->autocfg.speaker_pins[0] = 0x14;
168         spec->automute = 1;
169         spec->automute_mode = ALC_AUTOMUTE_PIN;
170 }
171
172 static const struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
173         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
174         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
175         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
176         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
177         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
178         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
179         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
180         { } /* end */
181 };
182
183 static const struct hda_verb alc262_hp_t5735_verbs[] = {
184         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
185         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
186
187         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
188         { }
189 };
190
191 static const struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
192         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
193         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
194         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
195         HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
196         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
197         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
198         { } /* end */
199 };
200
201 static const struct hda_verb alc262_hp_rp5700_verbs[] = {
202         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
203         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
204         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
205         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
206         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
207         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
208         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
209         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
210         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
211         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
212         {}
213 };
214
215 static const struct hda_input_mux alc262_hp_rp5700_capture_source = {
216         .num_items = 1,
217         .items = {
218                 { "Line", 0x1 },
219         },
220 };
221
222 /* bind hp and internal speaker mute (with plug check) as master switch */
223 #define alc262_hippo_master_update      alc262_hp_master_update
224 #define alc262_hippo_master_sw_get      alc262_hp_master_sw_get
225 #define alc262_hippo_master_sw_put      alc262_hp_master_sw_put
226
227 #define ALC262_HIPPO_MASTER_SWITCH                              \
228         {                                                       \
229                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,            \
230                 .name = "Master Playback Switch",               \
231                 .info = snd_ctl_boolean_mono_info,              \
232                 .get = alc262_hippo_master_sw_get,              \
233                 .put = alc262_hippo_master_sw_put,              \
234         },                                                      \
235         {                                                       \
236                 .iface = NID_MAPPING,                           \
237                 .name = "Master Playback Switch",               \
238                 .subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
239                              (SUBDEV_SPEAKER(0) << 16), \
240         }
241
242 static const struct snd_kcontrol_new alc262_hippo_mixer[] = {
243         ALC262_HIPPO_MASTER_SWITCH,
244         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
245         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
246         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
247         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
248         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
249         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
250         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
251         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
252         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
253         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
254         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
255         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
256         { } /* end */
257 };
258
259 static const struct snd_kcontrol_new alc262_hippo1_mixer[] = {
260         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
261         ALC262_HIPPO_MASTER_SWITCH,
262         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
263         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
264         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
265         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
266         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
267         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
268         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
269         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
270         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
271         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
272         { } /* end */
273 };
274
275 /* mute/unmute internal speaker according to the hp jack and mute state */
276 static void alc262_hippo_setup(struct hda_codec *codec)
277 {
278         struct alc_spec *spec = codec->spec;
279
280         spec->autocfg.hp_pins[0] = 0x15;
281         spec->autocfg.speaker_pins[0] = 0x14;
282         spec->automute = 1;
283         spec->automute_mode = ALC_AUTOMUTE_AMP;
284 }
285
286 static void alc262_hippo1_setup(struct hda_codec *codec)
287 {
288         struct alc_spec *spec = codec->spec;
289
290         spec->autocfg.hp_pins[0] = 0x1b;
291         spec->autocfg.speaker_pins[0] = 0x14;
292         spec->automute = 1;
293         spec->automute_mode = ALC_AUTOMUTE_AMP;
294 }
295
296
297 static const struct snd_kcontrol_new alc262_sony_mixer[] = {
298         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
299         ALC262_HIPPO_MASTER_SWITCH,
300         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
301         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
302         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
303         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
304         { } /* end */
305 };
306
307 static const struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
308         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
309         ALC262_HIPPO_MASTER_SWITCH,
310         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
311         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
312         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
313         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
314         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
315         { } /* end */
316 };
317
318 static const struct snd_kcontrol_new alc262_tyan_mixer[] = {
319         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
320         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
321         HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
322         HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
323         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
324         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
325         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
326         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
327         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
328         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
329         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
330         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
331         { } /* end */
332 };
333
334 static const struct hda_verb alc262_tyan_verbs[] = {
335         /* Headphone automute */
336         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
337         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
338         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
339
340         /* P11 AUX_IN, white 4-pin connector */
341         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
342         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
343         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
344         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
345
346         {}
347 };
348
349 /* unsolicited event for HP jack sensing */
350 static void alc262_tyan_setup(struct hda_codec *codec)
351 {
352         struct alc_spec *spec = codec->spec;
353
354         spec->autocfg.hp_pins[0] = 0x1b;
355         spec->autocfg.speaker_pins[0] = 0x15;
356         spec->automute = 1;
357         spec->automute_mode = ALC_AUTOMUTE_AMP;
358 }
359
360
361 #define alc262_capture_mixer            alc882_capture_mixer
362 #define alc262_capture_alt_mixer        alc882_capture_alt_mixer
363
364 /*
365  * generic initialization of ADC, input mixers and output mixers
366  */
367 static const struct hda_verb alc262_init_verbs[] = {
368         /*
369          * Unmute ADC0-2 and set the default input to mic-in
370          */
371         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
372         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
373         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
374         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
375         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
376         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
377
378         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
379          * mixer widget
380          * Note: PASD motherboards uses the Line In 2 as the input for
381          * front panel mic (mic 2)
382          */
383         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
384         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
385         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
386         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
387         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
388         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
389
390         /*
391          * Set up output mixers (0x0c - 0x0e)
392          */
393         /* set vol=0 to output mixers */
394         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
395         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
396         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
397         /* set up input amps for analog loopback */
398         /* Amp Indices: DAC = 0, mixer = 1 */
399         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
400         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
401         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
402         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
403         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
404         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
405
406         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
407         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
408         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
409         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
410         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
411         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
412
413         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
414         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
415         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
416         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
417         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
418
419         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
420         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
421
422         /* FIXME: use matrix-type input source selection */
423         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
424         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
425         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
426         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
427         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
428         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
429         /* Input mixer2 */
430         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
431         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
432         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
433         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
434         /* Input mixer3 */
435         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
436         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
437         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
438         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
439
440         { }
441 };
442
443 static const struct hda_verb alc262_eapd_verbs[] = {
444         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
445         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
446         { }
447 };
448
449 static const struct hda_verb alc262_hippo1_unsol_verbs[] = {
450         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
451         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
452         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
453
454         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
455         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
456         {}
457 };
458
459 static const struct hda_verb alc262_sony_unsol_verbs[] = {
460         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
461         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
462         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},   // Front Mic
463
464         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
465         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
466         {}
467 };
468
469 static const struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
470         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
471         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
472         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
473         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
474         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
475         { } /* end */
476 };
477
478 static const struct hda_verb alc262_toshiba_s06_verbs[] = {
479         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
480         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
481         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
482         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
483         {0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
484         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
485         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_MIC_EVENT},
486         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
487         {}
488 };
489
490 static void alc262_toshiba_s06_setup(struct hda_codec *codec)
491 {
492         struct alc_spec *spec = codec->spec;
493
494         spec->autocfg.hp_pins[0] = 0x15;
495         spec->autocfg.speaker_pins[0] = 0x14;
496         spec->ext_mic_pin = 0x18;
497         spec->int_mic_pin = 0x12;
498         spec->auto_mic = 1;
499         spec->automute = 1;
500         spec->automute_mode = ALC_AUTOMUTE_PIN;
501 }
502
503 /*
504  * nec model
505  *  0x15 = headphone
506  *  0x16 = internal speaker
507  *  0x18 = external mic
508  */
509
510 static const struct snd_kcontrol_new alc262_nec_mixer[] = {
511         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
512         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
513
514         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
515         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
516         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
517
518         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
519         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
520         { } /* end */
521 };
522
523 static const struct hda_verb alc262_nec_verbs[] = {
524         /* Unmute Speaker */
525         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
526
527         /* Headphone */
528         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
529         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
530
531         /* External mic to headphone */
532         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
533         /* External mic to speaker */
534         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
535         {}
536 };
537
538 /*
539  * fujitsu model
540  *  0x14 = headphone/spdif-out, 0x15 = internal speaker,
541  *  0x1b = port replicator headphone out
542  */
543
544 static const struct hda_verb alc262_fujitsu_unsol_verbs[] = {
545         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
546         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
547         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
548         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
549         {}
550 };
551
552 static const struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
553         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
554         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
555         {}
556 };
557
558 static const struct hda_verb alc262_lenovo_3000_init_verbs[] = {
559         /* Front Mic pin: input vref at 50% */
560         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
561         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
562         {}
563 };
564
565 static const struct hda_input_mux alc262_fujitsu_capture_source = {
566         .num_items = 3,
567         .items = {
568                 { "Mic", 0x0 },
569                 { "Internal Mic", 0x1 },
570                 { "CD", 0x4 },
571         },
572 };
573
574 static const struct hda_input_mux alc262_HP_capture_source = {
575         .num_items = 5,
576         .items = {
577                 { "Mic", 0x0 },
578                 { "Front Mic", 0x1 },
579                 { "Line", 0x2 },
580                 { "CD", 0x4 },
581                 { "AUX IN", 0x6 },
582         },
583 };
584
585 static const struct hda_input_mux alc262_HP_D7000_capture_source = {
586         .num_items = 4,
587         .items = {
588                 { "Mic", 0x0 },
589                 { "Front Mic", 0x2 },
590                 { "Line", 0x1 },
591                 { "CD", 0x4 },
592         },
593 };
594
595 static void alc262_fujitsu_setup(struct hda_codec *codec)
596 {
597         struct alc_spec *spec = codec->spec;
598
599         spec->autocfg.hp_pins[0] = 0x14;
600         spec->autocfg.hp_pins[1] = 0x1b;
601         spec->autocfg.speaker_pins[0] = 0x15;
602         spec->automute = 1;
603         spec->automute_mode = ALC_AUTOMUTE_AMP;
604 }
605
606 /* bind volumes of both NID 0x0c and 0x0d */
607 static const struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
608         .ops = &snd_hda_bind_vol,
609         .values = {
610                 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
611                 HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
612                 0
613         },
614 };
615
616 static const struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
617         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
618         {
619                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
620                 .name = "Master Playback Switch",
621                 .subdevice = HDA_SUBDEV_NID_FLAG | 0x14,
622                 .info = snd_ctl_boolean_mono_info,
623                 .get = alc262_hp_master_sw_get,
624                 .put = alc262_hp_master_sw_put,
625         },
626         {
627                 .iface = NID_MAPPING,
628                 .name = "Master Playback Switch",
629                 .private_value = 0x1b,
630         },
631         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
632         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
633         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
634         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
635         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
636         HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
637         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
638         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
639         { } /* end */
640 };
641
642 static void alc262_lenovo_3000_setup(struct hda_codec *codec)
643 {
644         struct alc_spec *spec = codec->spec;
645
646         spec->autocfg.hp_pins[0] = 0x1b;
647         spec->autocfg.speaker_pins[0] = 0x14;
648         spec->autocfg.speaker_pins[1] = 0x16;
649         spec->automute = 1;
650         spec->automute_mode = ALC_AUTOMUTE_AMP;
651 }
652
653 static const struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
654         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
655         {
656                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
657                 .name = "Master Playback Switch",
658                 .subdevice = HDA_SUBDEV_NID_FLAG | 0x1b,
659                 .info = snd_ctl_boolean_mono_info,
660                 .get = alc262_hp_master_sw_get,
661                 .put = alc262_hp_master_sw_put,
662         },
663         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
664         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
665         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
666         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
667         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
668         HDA_CODEC_VOLUME("Internal Mic Boost Volume", 0x19, 0, HDA_INPUT),
669         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
670         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
671         { } /* end */
672 };
673
674 static const struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
675         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
676         ALC262_HIPPO_MASTER_SWITCH,
677         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
678         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
679         HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
680         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
681         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
682         HDA_CODEC_VOLUME("Front Mic Boost Volume", 0x19, 0, HDA_INPUT),
683         { } /* end */
684 };
685
686 /* additional init verbs for Benq laptops */
687 static const struct hda_verb alc262_EAPD_verbs[] = {
688         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
689         {0x20, AC_VERB_SET_PROC_COEF,  0x3070},
690         {}
691 };
692
693 static const struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
694         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
695         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
696
697         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
698         {0x20, AC_VERB_SET_PROC_COEF,  0x3050},
699         {}
700 };
701
702 /* Samsung Q1 Ultra Vista model setup */
703 static const struct snd_kcontrol_new alc262_ultra_mixer[] = {
704         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
705         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
706         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
707         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
708         HDA_CODEC_VOLUME("Mic Boost Volume", 0x19, 0, HDA_INPUT),
709         HDA_CODEC_VOLUME("Headphone Mic Boost Volume", 0x15, 0, HDA_INPUT),
710         { } /* end */
711 };
712
713 static const struct hda_verb alc262_ultra_verbs[] = {
714         /* output mixer */
715         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
716         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
717         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
718         /* speaker */
719         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
720         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
721         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
722         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
723         /* HP */
724         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
725         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
726         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
727         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
728         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
729         /* internal mic */
730         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
731         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
732         /* ADC, choose mic */
733         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
734         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
735         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
736         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
737         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
738         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
739         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
740         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
741         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
742         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
743         {}
744 };
745
746 /* mute/unmute internal speaker according to the hp jack and mute state */
747 static void alc262_ultra_automute(struct hda_codec *codec)
748 {
749         struct alc_spec *spec = codec->spec;
750         unsigned int mute;
751
752         mute = 0;
753         /* auto-mute only when HP is used as HP */
754         if (!spec->cur_mux[0]) {
755                 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
756                 if (spec->jack_present)
757                         mute = HDA_AMP_MUTE;
758         }
759         /* mute/unmute internal speaker */
760         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
761                                  HDA_AMP_MUTE, mute);
762         /* mute/unmute HP */
763         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
764                                  HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
765 }
766
767 /* unsolicited event for HP jack sensing */
768 static void alc262_ultra_unsol_event(struct hda_codec *codec,
769                                        unsigned int res)
770 {
771         if ((res >> 26) != ALC_HP_EVENT)
772                 return;
773         alc262_ultra_automute(codec);
774 }
775
776 static const struct hda_input_mux alc262_ultra_capture_source = {
777         .num_items = 2,
778         .items = {
779                 { "Mic", 0x1 },
780                 { "Headphone", 0x7 },
781         },
782 };
783
784 static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
785                                      struct snd_ctl_elem_value *ucontrol)
786 {
787         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
788         struct alc_spec *spec = codec->spec;
789         int ret;
790
791         ret = alc_mux_enum_put(kcontrol, ucontrol);
792         if (!ret)
793                 return 0;
794         /* reprogram the HP pin as mic or HP according to the input source */
795         snd_hda_codec_write_cache(codec, 0x15, 0,
796                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
797                                   spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
798         alc262_ultra_automute(codec); /* mute/unmute HP */
799         return ret;
800 }
801
802 static const struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
803         HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
804         HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
805         {
806                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
807                 .name = "Capture Source",
808                 .info = alc_mux_enum_info,
809                 .get = alc_mux_enum_get,
810                 .put = alc262_ultra_mux_enum_put,
811         },
812         {
813                 .iface = NID_MAPPING,
814                 .name = "Capture Source",
815                 .private_value = 0x15,
816         },
817         { } /* end */
818 };
819
820 static const struct hda_verb alc262_HP_BPC_init_verbs[] = {
821         /*
822          * Unmute ADC0-2 and set the default input to mic-in
823          */
824         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
825         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
826         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
827         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
828         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
829         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
830
831         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
832          * mixer widget
833          * Note: PASD motherboards uses the Line In 2 as the input for
834          * front panel mic (mic 2)
835          */
836         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
837         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
838         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
839         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
840         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
841         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
842         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
843         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
844
845         /*
846          * Set up output mixers (0x0c - 0x0e)
847          */
848         /* set vol=0 to output mixers */
849         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
850         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
851         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
852
853         /* set up input amps for analog loopback */
854         /* Amp Indices: DAC = 0, mixer = 1 */
855         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
856         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
857         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
858         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
859         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
860         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
861
862         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
863         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
864         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
865
866         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
867         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
868
869         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
870         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
871
872         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
873         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
874         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
875         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
876         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
877
878         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
879         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
880         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
881         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
882         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
883         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
884
885
886         /* FIXME: use matrix-type input source selection */
887         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
888         /* Input mixer1: only unmute Mic */
889         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
890         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
891         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
892         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
893         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
894         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
895         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
896         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
897         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
898         /* Input mixer2 */
899         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
900         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
901         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
902         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
903         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
904         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
905         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
906         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
907         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
908         /* Input mixer3 */
909         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
910         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
911         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
912         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
913         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
914         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
915         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
916         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
917         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
918
919         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
920
921         { }
922 };
923
924 static const struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
925         /*
926          * Unmute ADC0-2 and set the default input to mic-in
927          */
928         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
929         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
930         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
931         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
932         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
933         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
934
935         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
936          * mixer widget
937          * Note: PASD motherboards uses the Line In 2 as the input for front
938          * panel mic (mic 2)
939          */
940         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
941         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
942         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
943         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
944         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
945         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
946         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
947         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
948         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
949         /*
950          * Set up output mixers (0x0c - 0x0e)
951          */
952         /* set vol=0 to output mixers */
953         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
954         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
955         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
956
957         /* set up input amps for analog loopback */
958         /* Amp Indices: DAC = 0, mixer = 1 */
959         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
960         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
961         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
962         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
963         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
964         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
965
966
967         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },        /* HP */
968         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Mono */
969         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* rear MIC */
970         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },        /* Line in */
971         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* Front MIC */
972         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Line out */
973         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },        /* CD in */
974
975         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
976         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
977
978         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
979         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
980
981         /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
982         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
983         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
984         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
985         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
986         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
987
988         /* FIXME: use matrix-type input source selection */
989         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
990         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
991         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
992         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
993         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
994         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
995         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
996         /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))},  */
997         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
998         /* Input mixer2 */
999         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
1000         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
1001         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
1002         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
1003         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
1004         /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
1005         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
1006         /* Input mixer3 */
1007         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
1008         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
1009         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
1010         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
1011         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
1012         /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
1013         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
1014
1015         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC_HP_EVENT | AC_USRSP_EN},
1016
1017         { }
1018 };
1019
1020 static const struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
1021
1022         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Front Speaker */
1023         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1024         {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
1025
1026         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* MIC jack */
1027         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* Front MIC */
1028         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
1029         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
1030
1031         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },        /* HP  jack */
1032         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1033         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
1034         {}
1035 };
1036
1037 /*
1038  * configuration and preset
1039  */
1040 static const char * const alc262_models[ALC262_MODEL_LAST] = {
1041         [ALC262_BASIC]          = "basic",
1042         [ALC262_HIPPO]          = "hippo",
1043         [ALC262_HIPPO_1]        = "hippo_1",
1044         [ALC262_FUJITSU]        = "fujitsu",
1045         [ALC262_HP_BPC]         = "hp-bpc",
1046         [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
1047         [ALC262_HP_TC_T5735]    = "hp-tc-t5735",
1048         [ALC262_HP_RP5700]      = "hp-rp5700",
1049         [ALC262_BENQ_ED8]       = "benq",
1050         [ALC262_BENQ_T31]       = "benq-t31",
1051         [ALC262_SONY_ASSAMD]    = "sony-assamd",
1052         [ALC262_TOSHIBA_S06]    = "toshiba-s06",
1053         [ALC262_TOSHIBA_RX1]    = "toshiba-rx1",
1054         [ALC262_ULTRA]          = "ultra",
1055         [ALC262_LENOVO_3000]    = "lenovo-3000",
1056         [ALC262_NEC]            = "nec",
1057         [ALC262_TYAN]           = "tyan",
1058         [ALC262_AUTO]           = "auto",
1059 };
1060
1061 static const struct snd_pci_quirk alc262_cfg_tbl[] = {
1062         SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
1063         SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
1064         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
1065                            ALC262_HP_BPC),
1066         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
1067                            ALC262_HP_BPC),
1068         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1500, "HP z series",
1069                            ALC262_HP_BPC),
1070         SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200",
1071                            ALC262_AUTO),
1072         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
1073                            ALC262_HP_BPC),
1074         SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
1075         SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
1076         SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
1077         SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
1078         SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
1079         SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
1080         SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
1081         SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
1082         SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
1083         SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
1084         SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
1085         SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
1086                       ALC262_HP_TC_T5735),
1087         SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
1088         SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
1089         SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
1090         SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
1091         SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
1092         SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
1093         SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
1094         SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
1095 #if 0 /* disable the quirk since model=auto works better in recent versions */
1096         SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
1097                            ALC262_SONY_ASSAMD),
1098 #endif
1099         SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
1100                       ALC262_TOSHIBA_RX1),
1101         SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
1102         SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
1103         SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
1104         SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
1105         SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
1106                            ALC262_ULTRA),
1107         SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
1108         SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
1109         SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
1110         SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
1111         SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
1112         {}
1113 };
1114
1115 static const struct alc_config_preset alc262_presets[] = {
1116         [ALC262_BASIC] = {
1117                 .mixers = { alc262_base_mixer },
1118                 .init_verbs = { alc262_init_verbs },
1119                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1120                 .dac_nids = alc262_dac_nids,
1121                 .hp_nid = 0x03,
1122                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1123                 .channel_mode = alc262_modes,
1124                 .input_mux = &alc262_capture_source,
1125         },
1126         [ALC262_HIPPO] = {
1127                 .mixers = { alc262_hippo_mixer },
1128                 .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
1129                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1130                 .dac_nids = alc262_dac_nids,
1131                 .hp_nid = 0x03,
1132                 .dig_out_nid = ALC262_DIGOUT_NID,
1133                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1134                 .channel_mode = alc262_modes,
1135                 .input_mux = &alc262_capture_source,
1136                 .unsol_event = alc_sku_unsol_event,
1137                 .setup = alc262_hippo_setup,
1138                 .init_hook = alc_inithook,
1139         },
1140         [ALC262_HIPPO_1] = {
1141                 .mixers = { alc262_hippo1_mixer },
1142                 .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
1143                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1144                 .dac_nids = alc262_dac_nids,
1145                 .hp_nid = 0x02,
1146                 .dig_out_nid = ALC262_DIGOUT_NID,
1147                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1148                 .channel_mode = alc262_modes,
1149                 .input_mux = &alc262_capture_source,
1150                 .unsol_event = alc_sku_unsol_event,
1151                 .setup = alc262_hippo1_setup,
1152                 .init_hook = alc_inithook,
1153         },
1154         [ALC262_FUJITSU] = {
1155                 .mixers = { alc262_fujitsu_mixer },
1156                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
1157                                 alc262_fujitsu_unsol_verbs },
1158                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1159                 .dac_nids = alc262_dac_nids,
1160                 .hp_nid = 0x03,
1161                 .dig_out_nid = ALC262_DIGOUT_NID,
1162                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1163                 .channel_mode = alc262_modes,
1164                 .input_mux = &alc262_fujitsu_capture_source,
1165                 .unsol_event = alc_sku_unsol_event,
1166                 .setup = alc262_fujitsu_setup,
1167                 .init_hook = alc_inithook,
1168         },
1169         [ALC262_HP_BPC] = {
1170                 .mixers = { alc262_HP_BPC_mixer },
1171                 .init_verbs = { alc262_HP_BPC_init_verbs },
1172                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1173                 .dac_nids = alc262_dac_nids,
1174                 .hp_nid = 0x03,
1175                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1176                 .channel_mode = alc262_modes,
1177                 .input_mux = &alc262_HP_capture_source,
1178                 .unsol_event = alc_sku_unsol_event,
1179                 .setup = alc262_hp_bpc_setup,
1180                 .init_hook = alc_inithook,
1181         },
1182         [ALC262_HP_BPC_D7000_WF] = {
1183                 .mixers = { alc262_HP_BPC_WildWest_mixer },
1184                 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
1185                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1186                 .dac_nids = alc262_dac_nids,
1187                 .hp_nid = 0x03,
1188                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1189                 .channel_mode = alc262_modes,
1190                 .input_mux = &alc262_HP_D7000_capture_source,
1191                 .unsol_event = alc_sku_unsol_event,
1192                 .setup = alc262_hp_wildwest_setup,
1193                 .init_hook = alc_inithook,
1194         },
1195         [ALC262_HP_BPC_D7000_WL] = {
1196                 .mixers = { alc262_HP_BPC_WildWest_mixer,
1197                             alc262_HP_BPC_WildWest_option_mixer },
1198                 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
1199                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1200                 .dac_nids = alc262_dac_nids,
1201                 .hp_nid = 0x03,
1202                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1203                 .channel_mode = alc262_modes,
1204                 .input_mux = &alc262_HP_D7000_capture_source,
1205                 .unsol_event = alc_sku_unsol_event,
1206                 .setup = alc262_hp_wildwest_setup,
1207                 .init_hook = alc_inithook,
1208         },
1209         [ALC262_HP_TC_T5735] = {
1210                 .mixers = { alc262_hp_t5735_mixer },
1211                 .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
1212                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1213                 .dac_nids = alc262_dac_nids,
1214                 .hp_nid = 0x03,
1215                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1216                 .channel_mode = alc262_modes,
1217                 .input_mux = &alc262_capture_source,
1218                 .unsol_event = alc_sku_unsol_event,
1219                 .setup = alc262_hp_t5735_setup,
1220                 .init_hook = alc_inithook,
1221         },
1222         [ALC262_HP_RP5700] = {
1223                 .mixers = { alc262_hp_rp5700_mixer },
1224                 .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
1225                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1226                 .dac_nids = alc262_dac_nids,
1227                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1228                 .channel_mode = alc262_modes,
1229                 .input_mux = &alc262_hp_rp5700_capture_source,
1230         },
1231         [ALC262_BENQ_ED8] = {
1232                 .mixers = { alc262_base_mixer },
1233                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
1234                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1235                 .dac_nids = alc262_dac_nids,
1236                 .hp_nid = 0x03,
1237                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1238                 .channel_mode = alc262_modes,
1239                 .input_mux = &alc262_capture_source,
1240         },
1241         [ALC262_SONY_ASSAMD] = {
1242                 .mixers = { alc262_sony_mixer },
1243                 .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
1244                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1245                 .dac_nids = alc262_dac_nids,
1246                 .hp_nid = 0x02,
1247                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1248                 .channel_mode = alc262_modes,
1249                 .input_mux = &alc262_capture_source,
1250                 .unsol_event = alc_sku_unsol_event,
1251                 .setup = alc262_hippo_setup,
1252                 .init_hook = alc_inithook,
1253         },
1254         [ALC262_BENQ_T31] = {
1255                 .mixers = { alc262_benq_t31_mixer },
1256                 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
1257                                 alc_hp15_unsol_verbs },
1258                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1259                 .dac_nids = alc262_dac_nids,
1260                 .hp_nid = 0x03,
1261                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1262                 .channel_mode = alc262_modes,
1263                 .input_mux = &alc262_capture_source,
1264                 .unsol_event = alc_sku_unsol_event,
1265                 .setup = alc262_hippo_setup,
1266                 .init_hook = alc_inithook,
1267         },
1268         [ALC262_ULTRA] = {
1269                 .mixers = { alc262_ultra_mixer },
1270                 .cap_mixer = alc262_ultra_capture_mixer,
1271                 .init_verbs = { alc262_ultra_verbs },
1272                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1273                 .dac_nids = alc262_dac_nids,
1274                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1275                 .channel_mode = alc262_modes,
1276                 .input_mux = &alc262_ultra_capture_source,
1277                 .adc_nids = alc262_adc_nids, /* ADC0 */
1278                 .capsrc_nids = alc262_capsrc_nids,
1279                 .num_adc_nids = 1, /* single ADC */
1280                 .unsol_event = alc262_ultra_unsol_event,
1281                 .init_hook = alc262_ultra_automute,
1282         },
1283         [ALC262_LENOVO_3000] = {
1284                 .mixers = { alc262_lenovo_3000_mixer },
1285                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
1286                                 alc262_lenovo_3000_unsol_verbs,
1287                                 alc262_lenovo_3000_init_verbs },
1288                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1289                 .dac_nids = alc262_dac_nids,
1290                 .hp_nid = 0x03,
1291                 .dig_out_nid = ALC262_DIGOUT_NID,
1292                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1293                 .channel_mode = alc262_modes,
1294                 .input_mux = &alc262_fujitsu_capture_source,
1295                 .unsol_event = alc_sku_unsol_event,
1296                 .setup = alc262_lenovo_3000_setup,
1297                 .init_hook = alc_inithook,
1298         },
1299         [ALC262_NEC] = {
1300                 .mixers = { alc262_nec_mixer },
1301                 .init_verbs = { alc262_nec_verbs },
1302                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1303                 .dac_nids = alc262_dac_nids,
1304                 .hp_nid = 0x03,
1305                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1306                 .channel_mode = alc262_modes,
1307                 .input_mux = &alc262_capture_source,
1308         },
1309         [ALC262_TOSHIBA_S06] = {
1310                 .mixers = { alc262_toshiba_s06_mixer },
1311                 .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
1312                                                         alc262_eapd_verbs },
1313                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1314                 .capsrc_nids = alc262_dmic_capsrc_nids,
1315                 .dac_nids = alc262_dac_nids,
1316                 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
1317                 .num_adc_nids = 1, /* single ADC */
1318                 .dig_out_nid = ALC262_DIGOUT_NID,
1319                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1320                 .channel_mode = alc262_modes,
1321                 .unsol_event = alc_sku_unsol_event,
1322                 .setup = alc262_toshiba_s06_setup,
1323                 .init_hook = alc_inithook,
1324         },
1325         [ALC262_TOSHIBA_RX1] = {
1326                 .mixers = { alc262_toshiba_rx1_mixer },
1327                 .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
1328                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1329                 .dac_nids = alc262_dac_nids,
1330                 .hp_nid = 0x03,
1331                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1332                 .channel_mode = alc262_modes,
1333                 .input_mux = &alc262_capture_source,
1334                 .unsol_event = alc_sku_unsol_event,
1335                 .setup = alc262_hippo_setup,
1336                 .init_hook = alc_inithook,
1337         },
1338         [ALC262_TYAN] = {
1339                 .mixers = { alc262_tyan_mixer },
1340                 .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
1341                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
1342                 .dac_nids = alc262_dac_nids,
1343                 .hp_nid = 0x02,
1344                 .dig_out_nid = ALC262_DIGOUT_NID,
1345                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
1346                 .channel_mode = alc262_modes,
1347                 .input_mux = &alc262_capture_source,
1348                 .unsol_event = alc_sku_unsol_event,
1349                 .setup = alc262_tyan_setup,
1350                 .init_hook = alc_hp_automute,
1351         },
1352 };
1353