1/*
2 * Universal Interface for Intel High Definition Audio Codec
3 *
4 * HD audio interface patch for SigmaTel STAC92xx
5 *
6 * Copyright (c) 2005 Embedded Alley Solutions, Inc.
7 * Matt Porter <mporter@embeddedalley.com>
8 *
9 * Based on patch_cmedia.c and patch_realtek.c
10 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
11 *
12 *  This driver is free software; you can redistribute it and/or modify
13 *  it under the terms of the GNU General Public License as published by
14 *  the Free Software Foundation; either version 2 of the License, or
15 *  (at your option) any later version.
16 *
17 *  This driver is distributed in the hope that it will be useful,
18 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
19 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 *  GNU General Public License for more details.
21 *
22 *  You should have received a copy of the GNU General Public License
23 *  along with this program; if not, write to the Free Software
24 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
25 */
26
27#include <sound/driver.h>
28#include <linux/init.h>
29#include <linux/delay.h>
30#include <linux/slab.h>
31#include <linux/pci.h>
32#include <sound/core.h>
33#include <sound/asoundef.h>
34#include "hda_codec.h"
35#include "hda_local.h"
36
37#define NUM_CONTROL_ALLOC	32
38#define STAC_HP_EVENT		0x37
39
40enum {
41	STAC_REF,
42	STAC_9200_MODELS
43};
44
45enum {
46	STAC_9205_REF,
47	STAC_9205_MODELS
48};
49
50enum {
51	STAC_925x_REF,
52	STAC_M2_2,
53	STAC_MA6,
54	STAC_PA6,
55	STAC_925x_MODELS
56};
57
58enum {
59	STAC_D945_REF,
60	STAC_D945GTP3,
61	STAC_D945GTP5,
62	STAC_MACMINI,
63	STAC_MACBOOK,
64	STAC_MACBOOK_PRO_V1,
65	STAC_MACBOOK_PRO_V2,
66	STAC_IMAC_INTEL,
67	STAC_922X_MODELS
68};
69
70enum {
71	STAC_D965_REF,
72	STAC_D965_3ST,
73	STAC_D965_5ST,
74	STAC_927X_MODELS
75};
76
77struct sigmatel_spec {
78	struct snd_kcontrol_new *mixers[4];
79	unsigned int num_mixers;
80
81	int board_config;
82	unsigned int surr_switch: 1;
83	unsigned int line_switch: 1;
84	unsigned int mic_switch: 1;
85	unsigned int alt_switch: 1;
86	unsigned int hp_detect: 1;
87	unsigned int gpio_mute: 1;
88
89	/* playback */
90	struct hda_multi_out multiout;
91	hda_nid_t dac_nids[5];
92
93	/* capture */
94	hda_nid_t *adc_nids;
95	unsigned int num_adcs;
96	hda_nid_t *mux_nids;
97	unsigned int num_muxes;
98	hda_nid_t *dmic_nids;
99	unsigned int num_dmics;
100	hda_nid_t dmux_nid;
101	hda_nid_t dig_in_nid;
102
103	/* pin widgets */
104	hda_nid_t *pin_nids;
105	unsigned int num_pins;
106	unsigned int *pin_configs;
107	unsigned int *bios_pin_configs;
108
109	/* codec specific stuff */
110	struct hda_verb *init;
111	struct snd_kcontrol_new *mixer;
112
113	/* capture source */
114	struct hda_input_mux *dinput_mux;
115	unsigned int cur_dmux;
116	struct hda_input_mux *input_mux;
117	unsigned int cur_mux[3];
118
119	/* i/o switches */
120	unsigned int io_switch[2];
121
122	struct hda_pcm pcm_rec[2];	/* PCM information */
123
124	/* dynamic controls and input_mux */
125	struct auto_pin_cfg autocfg;
126	unsigned int num_kctl_alloc, num_kctl_used;
127	struct snd_kcontrol_new *kctl_alloc;
128	struct hda_input_mux private_dimux;
129	struct hda_input_mux private_imux;
130};
131
132static hda_nid_t stac9200_adc_nids[1] = {
133        0x03,
134};
135
136static hda_nid_t stac9200_mux_nids[1] = {
137        0x0c,
138};
139
140static hda_nid_t stac9200_dac_nids[1] = {
141        0x02,
142};
143
144static hda_nid_t stac925x_adc_nids[1] = {
145        0x03,
146};
147
148static hda_nid_t stac925x_mux_nids[1] = {
149        0x0f,
150};
151
152static hda_nid_t stac925x_dac_nids[1] = {
153        0x02,
154};
155
156static hda_nid_t stac925x_dmic_nids[1] = {
157	0x15,
158};
159
160static hda_nid_t stac922x_adc_nids[2] = {
161        0x06, 0x07,
162};
163
164static hda_nid_t stac922x_mux_nids[2] = {
165        0x12, 0x13,
166};
167
168static hda_nid_t stac927x_adc_nids[3] = {
169        0x07, 0x08, 0x09
170};
171
172static hda_nid_t stac927x_mux_nids[3] = {
173        0x15, 0x16, 0x17
174};
175
176static hda_nid_t stac9205_adc_nids[2] = {
177        0x12, 0x13
178};
179
180static hda_nid_t stac9205_mux_nids[2] = {
181        0x19, 0x1a
182};
183
184static hda_nid_t stac9205_dmic_nids[2] = {
185        0x17, 0x18,
186};
187
188static hda_nid_t stac9200_pin_nids[8] = {
189	0x08, 0x09, 0x0d, 0x0e,
190	0x0f, 0x10, 0x11, 0x12,
191};
192
193static hda_nid_t stac925x_pin_nids[8] = {
194	0x07, 0x08, 0x0a, 0x0b,
195	0x0c, 0x0d, 0x10, 0x11,
196};
197
198static hda_nid_t stac922x_pin_nids[10] = {
199	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
200	0x0f, 0x10, 0x11, 0x15, 0x1b,
201};
202
203static hda_nid_t stac927x_pin_nids[14] = {
204	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
205	0x0f, 0x10, 0x11, 0x12, 0x13,
206	0x14, 0x21, 0x22, 0x23,
207};
208
209static hda_nid_t stac9205_pin_nids[12] = {
210	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
211	0x0f, 0x14, 0x16, 0x17, 0x18,
212	0x21, 0x22,
213
214};
215
216static int stac92xx_dmux_enum_info(struct snd_kcontrol *kcontrol,
217				   struct snd_ctl_elem_info *uinfo)
218{
219	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
220	struct sigmatel_spec *spec = codec->spec;
221	return snd_hda_input_mux_info(spec->dinput_mux, uinfo);
222}
223
224static int stac92xx_dmux_enum_get(struct snd_kcontrol *kcontrol,
225				  struct snd_ctl_elem_value *ucontrol)
226{
227	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
228	struct sigmatel_spec *spec = codec->spec;
229
230	ucontrol->value.enumerated.item[0] = spec->cur_dmux;
231	return 0;
232}
233
234static int stac92xx_dmux_enum_put(struct snd_kcontrol *kcontrol,
235				  struct snd_ctl_elem_value *ucontrol)
236{
237	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
238	struct sigmatel_spec *spec = codec->spec;
239
240	return snd_hda_input_mux_put(codec, spec->dinput_mux, ucontrol,
241				     spec->dmux_nid, &spec->cur_dmux);
242}
243
244static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
245{
246	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
247	struct sigmatel_spec *spec = codec->spec;
248	return snd_hda_input_mux_info(spec->input_mux, uinfo);
249}
250
251static int stac92xx_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
252{
253	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
254	struct sigmatel_spec *spec = codec->spec;
255	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
256
257	ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
258	return 0;
259}
260
261static int stac92xx_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
262{
263	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
264	struct sigmatel_spec *spec = codec->spec;
265	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
266
267	return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
268				     spec->mux_nids[adc_idx], &spec->cur_mux[adc_idx]);
269}
270
271static struct hda_verb stac9200_core_init[] = {
272	/* set dac0mux for dac converter */
273	{ 0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
274	{}
275};
276
277static struct hda_verb stac925x_core_init[] = {
278	/* set dac0mux for dac converter */
279	{ 0x06, AC_VERB_SET_CONNECT_SEL, 0x00},
280	{}
281};
282
283static struct hda_verb stac922x_core_init[] = {
284	/* set master volume and direct control */
285	{ 0x16, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
286	{}
287};
288
289static struct hda_verb d965_core_init[] = {
290	/* set master volume and direct control */
291	{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
292	/* unmute node 0x1b */
293	{ 0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
294	/* select node 0x03 as DAC */
295	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
296	{}
297};
298
299static struct hda_verb stac927x_core_init[] = {
300	/* set master volume and direct control */
301	{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
302	{}
303};
304
305static struct hda_verb stac9205_core_init[] = {
306	/* set master volume and direct control */
307	{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
308	{}
309};
310
311static struct snd_kcontrol_new stac9200_mixer[] = {
312	HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT),
313	HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT),
314	{
315		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
316		.name = "Input Source",
317		.count = 1,
318		.info = stac92xx_mux_enum_info,
319		.get = stac92xx_mux_enum_get,
320		.put = stac92xx_mux_enum_put,
321	},
322	HDA_CODEC_VOLUME("Capture Volume", 0x0a, 0, HDA_OUTPUT),
323	HDA_CODEC_MUTE("Capture Switch", 0x0a, 0, HDA_OUTPUT),
324	HDA_CODEC_VOLUME("Capture Mux Volume", 0x0c, 0, HDA_OUTPUT),
325	{ } /* end */
326};
327
328static struct snd_kcontrol_new stac925x_mixer[] = {
329	HDA_CODEC_VOLUME("Master Playback Volume", 0xe, 0, HDA_OUTPUT),
330	HDA_CODEC_MUTE("Master Playback Switch", 0xe, 0, HDA_OUTPUT),
331	{
332		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
333		.name = "Input Source",
334		.count = 1,
335		.info = stac92xx_mux_enum_info,
336		.get = stac92xx_mux_enum_get,
337		.put = stac92xx_mux_enum_put,
338	},
339	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_OUTPUT),
340	HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_OUTPUT),
341	HDA_CODEC_VOLUME("Capture Mux Volume", 0x0f, 0, HDA_OUTPUT),
342	{ } /* end */
343};
344
345/* This needs to be generated dynamically based on sequence */
346static struct snd_kcontrol_new stac922x_mixer[] = {
347	{
348		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
349		.name = "Input Source",
350		.count = 1,
351		.info = stac92xx_mux_enum_info,
352		.get = stac92xx_mux_enum_get,
353		.put = stac92xx_mux_enum_put,
354	},
355	HDA_CODEC_VOLUME("Capture Volume", 0x17, 0x0, HDA_INPUT),
356	HDA_CODEC_MUTE("Capture Switch", 0x17, 0x0, HDA_INPUT),
357	HDA_CODEC_VOLUME("Mux Capture Volume", 0x12, 0x0, HDA_OUTPUT),
358	{ } /* end */
359};
360
361/* This needs to be generated dynamically based on sequence */
362static struct snd_kcontrol_new stac9227_mixer[] = {
363	{
364		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
365		.name = "Input Source",
366		.count = 1,
367		.info = stac92xx_mux_enum_info,
368		.get = stac92xx_mux_enum_get,
369		.put = stac92xx_mux_enum_put,
370	},
371	HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_OUTPUT),
372	HDA_CODEC_MUTE("Capture Switch", 0x1b, 0x0, HDA_OUTPUT),
373	{ } /* end */
374};
375
376static struct snd_kcontrol_new stac927x_mixer[] = {
377	{
378		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
379		.name = "Input Source",
380		.count = 1,
381		.info = stac92xx_mux_enum_info,
382		.get = stac92xx_mux_enum_get,
383		.put = stac92xx_mux_enum_put,
384	},
385	HDA_CODEC_VOLUME("InMux Capture Volume", 0x15, 0x0, HDA_OUTPUT),
386	HDA_CODEC_VOLUME("InVol Capture Volume", 0x18, 0x0, HDA_INPUT),
387	HDA_CODEC_MUTE("ADCMux Capture Switch", 0x1b, 0x0, HDA_OUTPUT),
388	{ } /* end */
389};
390
391static struct snd_kcontrol_new stac9205_mixer[] = {
392	{
393		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
394		.name = "Digital Input Source",
395		.count = 1,
396		.info = stac92xx_dmux_enum_info,
397		.get = stac92xx_dmux_enum_get,
398		.put = stac92xx_dmux_enum_put,
399	},
400	{
401		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
402		.name = "Input Source",
403		.count = 1,
404		.info = stac92xx_mux_enum_info,
405		.get = stac92xx_mux_enum_get,
406		.put = stac92xx_mux_enum_put,
407	},
408	HDA_CODEC_VOLUME("InMux Capture Volume", 0x19, 0x0, HDA_OUTPUT),
409	HDA_CODEC_VOLUME("InVol Capture Volume", 0x1b, 0x0, HDA_INPUT),
410	HDA_CODEC_MUTE("ADCMux Capture Switch", 0x1d, 0x0, HDA_OUTPUT),
411	{ } /* end */
412};
413
414static int stac92xx_build_controls(struct hda_codec *codec)
415{
416	struct sigmatel_spec *spec = codec->spec;
417	int err;
418	int i;
419
420	err = snd_hda_add_new_ctls(codec, spec->mixer);
421	if (err < 0)
422		return err;
423
424	for (i = 0; i < spec->num_mixers; i++) {
425		err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
426		if (err < 0)
427			return err;
428	}
429
430	if (spec->multiout.dig_out_nid) {
431		err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid);
432		if (err < 0)
433			return err;
434	}
435	if (spec->dig_in_nid) {
436		err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
437		if (err < 0)
438			return err;
439	}
440	return 0;
441}
442
443static unsigned int ref9200_pin_configs[8] = {
444	0x01c47010, 0x01447010, 0x0221401f, 0x01114010,
445	0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
446};
447
448static unsigned int *stac9200_brd_tbl[STAC_9200_MODELS] = {
449	[STAC_REF] = ref9200_pin_configs,
450};
451
452static const char *stac9200_models[STAC_9200_MODELS] = {
453	[STAC_REF] = "ref",
454};
455
456static struct snd_pci_quirk stac9200_cfg_tbl[] = {
457	/* SigmaTel reference board */
458	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
459		      "DFI LanParty", STAC_REF),
460	/* Dell laptops have BIOS problem */
461	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01b5,
462		      "Dell Inspiron 630m", STAC_REF),
463	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c2,
464		      "Dell Latitude D620", STAC_REF),
465	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cb,
466		      "Dell Latitude 120L", STAC_REF),
467	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cc,
468		      "Dell Latitude D820", STAC_REF),
469	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cd,
470		      "Dell Inspiron E1705/9400", STAC_REF),
471	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ce,
472		      "Dell XPS M1710", STAC_REF),
473	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cf,
474		      "Dell Precision M90", STAC_REF),
475	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6,
476		      "unknown Dell", STAC_REF),
477	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d8,
478		      "Dell Inspiron 640m", STAC_REF),
479	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f5,
480		      "Dell Inspiron 1501", STAC_REF),
481
482	/* Panasonic */
483	SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_REF),
484
485	{} /* terminator */
486};
487
488static unsigned int ref925x_pin_configs[8] = {
489	0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
490	0x90a70320, 0x02214210, 0x400003f1, 0x9033032e,
491};
492
493static unsigned int stac925x_MA6_pin_configs[8] = {
494	0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
495	0x90a70320, 0x90100211, 0x400003f1, 0x9033032e,
496};
497
498static unsigned int stac925x_PA6_pin_configs[8] = {
499	0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
500	0x50a103f0, 0x90100211, 0x400003f1, 0x9033032e,
501};
502
503static unsigned int stac925xM2_2_pin_configs[8] = {
504	0x40c003f3, 0x424503f2, 0x04180011, 0x02a19020,
505	0x50a103f0, 0x90100212, 0x400003f1, 0x9033032e,
506};
507
508static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = {
509	[STAC_REF] = ref925x_pin_configs,
510	[STAC_M2_2] = stac925xM2_2_pin_configs,
511	[STAC_MA6] = stac925x_MA6_pin_configs,
512	[STAC_PA6] = stac925x_PA6_pin_configs,
513};
514
515static const char *stac925x_models[STAC_925x_MODELS] = {
516	[STAC_REF] = "ref",
517	[STAC_M2_2] = "m2-2",
518	[STAC_MA6] = "m6",
519	[STAC_PA6] = "pa6",
520};
521
522static struct snd_pci_quirk stac925x_cfg_tbl[] = {
523	/* SigmaTel reference board */
524	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
525	SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
526	SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_REF),
527	SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_REF),
528	SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_MA6),
529	SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_PA6),
530	SND_PCI_QUIRK(0x1002, 0x437b, "Gateway MX6453", STAC_M2_2),
531	{} /* terminator */
532};
533
534static unsigned int ref922x_pin_configs[10] = {
535	0x01014010, 0x01016011, 0x01012012, 0x0221401f,
536	0x01813122, 0x01011014, 0x01441030, 0x01c41030,
537	0x40000100, 0x40000100,
538};
539
540static unsigned int d945gtp3_pin_configs[10] = {
541	0x0221401f, 0x01a19022, 0x01813021, 0x01014010,
542	0x40000100, 0x40000100, 0x40000100, 0x40000100,
543	0x02a19120, 0x40000100,
544};
545
546static unsigned int d945gtp5_pin_configs[10] = {
547	0x0221401f, 0x01011012, 0x01813024, 0x01014010,
548	0x01a19021, 0x01016011, 0x01452130, 0x40000100,
549	0x02a19320, 0x40000100,
550};
551
552static unsigned int macbook_pro_v1_pin_configs[10] = {
553	0x0321e230, 0x03a1e020, 0x9017e110, 0x01014010,
554	0x01a19021, 0x0381e021, 0x1345e240, 0x13c5e22e,
555	0x02a19320, 0x400000fb
556};
557
558static unsigned int macbook_pro_v2_pin_configs[10] = {
559	0x0221401f, 0x90a70120, 0x01813024, 0x01014010,
560	0x400000fd, 0x01016011, 0x1345e240, 0x13c5e22e,
561	0x400000fc, 0x400000fb,
562};
563
564static unsigned int imac_intel_pin_configs[10] = {
565	0x0121e230, 0x90a70120, 0x9017e110, 0x400000fe,
566	0x400000fd, 0x0181e021, 0x1145e040, 0x400000fa,
567	0x400000fc, 0x400000fb,
568};
569
570static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
571	[STAC_D945_REF] = ref922x_pin_configs,
572	[STAC_D945GTP3] = d945gtp3_pin_configs,
573	[STAC_D945GTP5] = d945gtp5_pin_configs,
574	[STAC_MACMINI] = macbook_pro_v1_pin_configs,
575	[STAC_MACBOOK] = macbook_pro_v1_pin_configs,
576	[STAC_MACBOOK_PRO_V1] = macbook_pro_v1_pin_configs,
577	[STAC_MACBOOK_PRO_V2] = macbook_pro_v2_pin_configs,
578	[STAC_IMAC_INTEL] = imac_intel_pin_configs,
579};
580
581static const char *stac922x_models[STAC_922X_MODELS] = {
582	[STAC_D945_REF]	= "ref",
583	[STAC_D945GTP5]	= "5stack",
584	[STAC_D945GTP3]	= "3stack",
585	[STAC_MACMINI]	= "macmini",
586	[STAC_MACBOOK]	= "macbook",
587	[STAC_MACBOOK_PRO_V1]	= "macbook-pro-v1",
588	[STAC_MACBOOK_PRO_V2]	= "macbook-pro",
589	[STAC_IMAC_INTEL] = "imac-intel",
590};
591
592static struct snd_pci_quirk stac922x_cfg_tbl[] = {
593	/* SigmaTel reference board */
594	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
595		      "DFI LanParty", STAC_D945_REF),
596	/* Intel 945G based systems */
597	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101,
598		      "Intel D945G", STAC_D945GTP3),
599	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0202,
600		      "Intel D945G", STAC_D945GTP3),
601	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0606,
602		      "Intel D945G", STAC_D945GTP3),
603	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0601,
604		      "Intel D945G", STAC_D945GTP3),
605	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0111,
606		      "Intel D945G", STAC_D945GTP3),
607	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1115,
608		      "Intel D945G", STAC_D945GTP3),
609	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1116,
610		      "Intel D945G", STAC_D945GTP3),
611	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1117,
612		      "Intel D945G", STAC_D945GTP3),
613	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1118,
614		      "Intel D945G", STAC_D945GTP3),
615	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1119,
616		      "Intel D945G", STAC_D945GTP3),
617	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x8826,
618		      "Intel D945G", STAC_D945GTP3),
619	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5049,
620		      "Intel D945G", STAC_D945GTP3),
621	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5055,
622		      "Intel D945G", STAC_D945GTP3),
623	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5048,
624		      "Intel D945G", STAC_D945GTP3),
625	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0110,
626		      "Intel D945G", STAC_D945GTP3),
627	/* Intel D945G 5-stack systems */
628	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0404,
629		      "Intel D945G", STAC_D945GTP5),
630	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0303,
631		      "Intel D945G", STAC_D945GTP5),
632	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0013,
633		      "Intel D945G", STAC_D945GTP5),
634	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0417,
635		      "Intel D945G", STAC_D945GTP5),
636	/* Intel 945P based systems */
637	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0b0b,
638		      "Intel D945P", STAC_D945GTP3),
639	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0112,
640		      "Intel D945P", STAC_D945GTP3),
641	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0d0d,
642		      "Intel D945P", STAC_D945GTP3),
643	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0909,
644		      "Intel D945P", STAC_D945GTP3),
645	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0505,
646		      "Intel D945P", STAC_D945GTP3),
647	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707,
648		      "Intel D945P", STAC_D945GTP5),
649	/* other systems  */
650	/* Apple Mac Mini (early 2006) */
651	SND_PCI_QUIRK(0x8384, 0x7680,
652		      "Mac Mini", STAC_MACMINI),
653	{} /* terminator */
654};
655
656static unsigned int ref927x_pin_configs[14] = {
657	0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
658	0x01a19040, 0x01011012, 0x01016011, 0x0101201f,
659	0x183301f0, 0x18a001f0, 0x18a001f0, 0x01442070,
660	0x01c42190, 0x40000100,
661};
662
663static unsigned int d965_3st_pin_configs[14] = {
664	0x0221401f, 0x02a19120, 0x40000100, 0x01014011,
665	0x01a19021, 0x01813024, 0x40000100, 0x40000100,
666	0x40000100, 0x40000100, 0x40000100, 0x40000100,
667	0x40000100, 0x40000100
668};
669
670static unsigned int d965_5st_pin_configs[14] = {
671	0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
672	0x01a19040, 0x01011012, 0x01016011, 0x40000100,
673	0x40000100, 0x40000100, 0x40000100, 0x01442070,
674	0x40000100, 0x40000100
675};
676
677static unsigned int *stac927x_brd_tbl[STAC_927X_MODELS] = {
678	[STAC_D965_REF] = ref927x_pin_configs,
679	[STAC_D965_3ST] = d965_3st_pin_configs,
680	[STAC_D965_5ST] = d965_5st_pin_configs,
681};
682
683static const char *stac927x_models[STAC_927X_MODELS] = {
684	[STAC_D965_REF]	= "ref",
685	[STAC_D965_3ST]	= "3stack",
686	[STAC_D965_5ST] = "5stack",
687};
688
689static struct snd_pci_quirk stac927x_cfg_tbl[] = {
690	/* SigmaTel reference board */
691	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
692		      "DFI LanParty", STAC_D965_REF),
693	 /* Intel 946 based systems */
694	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x3d01, "Intel D946", STAC_D965_3ST),
695	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xa301, "Intel D946", STAC_D965_3ST),
696	/* 965 based 3 stack systems */
697	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2116, "Intel D965", STAC_D965_3ST),
698	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2115, "Intel D965", STAC_D965_3ST),
699	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2114, "Intel D965", STAC_D965_3ST),
700	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2113, "Intel D965", STAC_D965_3ST),
701	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2112, "Intel D965", STAC_D965_3ST),
702	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2111, "Intel D965", STAC_D965_3ST),
703	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2110, "Intel D965", STAC_D965_3ST),
704	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2009, "Intel D965", STAC_D965_3ST),
705	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2008, "Intel D965", STAC_D965_3ST),
706	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2007, "Intel D965", STAC_D965_3ST),
707	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2006, "Intel D965", STAC_D965_3ST),
708	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2005, "Intel D965", STAC_D965_3ST),
709	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2004, "Intel D965", STAC_D965_3ST),
710	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2003, "Intel D965", STAC_D965_3ST),
711	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2002, "Intel D965", STAC_D965_3ST),
712	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2001, "Intel D965", STAC_D965_3ST),
713	/* 965 based 5 stack systems */
714	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2301, "Intel D965", STAC_D965_5ST),
715	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2302, "Intel D965", STAC_D965_5ST),
716	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2303, "Intel D965", STAC_D965_5ST),
717	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2304, "Intel D965", STAC_D965_5ST),
718	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2305, "Intel D965", STAC_D965_5ST),
719	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2501, "Intel D965", STAC_D965_5ST),
720	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2502, "Intel D965", STAC_D965_5ST),
721	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2503, "Intel D965", STAC_D965_5ST),
722	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2504, "Intel D965", STAC_D965_5ST),
723	{} /* terminator */
724};
725
726static unsigned int ref9205_pin_configs[12] = {
727	0x40000100, 0x40000100, 0x01016011, 0x01014010,
728	0x01813122, 0x01a19021, 0x40000100, 0x40000100,
729	0x90a000f0, 0x90a000f0, 0x01441030, 0x01c41030
730};
731
732static unsigned int *stac9205_brd_tbl[STAC_9205_MODELS] = {
733	ref9205_pin_configs,
734};
735
736static const char *stac9205_models[STAC_9205_MODELS] = {
737	[STAC_9205_REF] = "ref",
738};
739
740static struct snd_pci_quirk stac9205_cfg_tbl[] = {
741	/* SigmaTel reference board */
742	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
743		      "DFI LanParty", STAC_9205_REF),
744	{} /* terminator */
745};
746
747static int stac92xx_save_bios_config_regs(struct hda_codec *codec)
748{
749	int i;
750	struct sigmatel_spec *spec = codec->spec;
751
752	if (! spec->bios_pin_configs) {
753		spec->bios_pin_configs = kcalloc(spec->num_pins,
754		                                 sizeof(*spec->bios_pin_configs), GFP_KERNEL);
755		if (! spec->bios_pin_configs)
756			return -ENOMEM;
757	}
758
759	for (i = 0; i < spec->num_pins; i++) {
760		hda_nid_t nid = spec->pin_nids[i];
761		unsigned int pin_cfg;
762
763		pin_cfg = snd_hda_codec_read(codec, nid, 0,
764			AC_VERB_GET_CONFIG_DEFAULT, 0x00);
765		snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x bios pin config %8.8x\n",
766					nid, pin_cfg);
767		spec->bios_pin_configs[i] = pin_cfg;
768	}
769
770	return 0;
771}
772
773static void stac92xx_set_config_regs(struct hda_codec *codec)
774{
775	int i;
776	struct sigmatel_spec *spec = codec->spec;
777	unsigned int pin_cfg;
778
779	if (! spec->pin_nids || ! spec->pin_configs)
780		return;
781
782	for (i = 0; i < spec->num_pins; i++) {
783		snd_hda_codec_write(codec, spec->pin_nids[i], 0,
784				    AC_VERB_SET_CONFIG_DEFAULT_BYTES_0,
785				    spec->pin_configs[i] & 0x000000ff);
786		snd_hda_codec_write(codec, spec->pin_nids[i], 0,
787				    AC_VERB_SET_CONFIG_DEFAULT_BYTES_1,
788				    (spec->pin_configs[i] & 0x0000ff00) >> 8);
789		snd_hda_codec_write(codec, spec->pin_nids[i], 0,
790				    AC_VERB_SET_CONFIG_DEFAULT_BYTES_2,
791				    (spec->pin_configs[i] & 0x00ff0000) >> 16);
792		snd_hda_codec_write(codec, spec->pin_nids[i], 0,
793				    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3,
794				    spec->pin_configs[i] >> 24);
795		pin_cfg = snd_hda_codec_read(codec, spec->pin_nids[i], 0,
796					     AC_VERB_GET_CONFIG_DEFAULT,
797					     0x00);
798		snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x pin config %8.8x\n", spec->pin_nids[i], pin_cfg);
799	}
800}
801
802/*
803 * Analog playback callbacks
804 */
805static int stac92xx_playback_pcm_open(struct hda_pcm_stream *hinfo,
806				      struct hda_codec *codec,
807				      struct snd_pcm_substream *substream)
808{
809	struct sigmatel_spec *spec = codec->spec;
810	return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream);
811}
812
813static int stac92xx_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
814					 struct hda_codec *codec,
815					 unsigned int stream_tag,
816					 unsigned int format,
817					 struct snd_pcm_substream *substream)
818{
819	struct sigmatel_spec *spec = codec->spec;
820	return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag, format, substream);
821}
822
823static int stac92xx_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
824					struct hda_codec *codec,
825					struct snd_pcm_substream *substream)
826{
827	struct sigmatel_spec *spec = codec->spec;
828	return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
829}
830
831/*
832 * Digital playback callbacks
833 */
834static int stac92xx_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
835					  struct hda_codec *codec,
836					  struct snd_pcm_substream *substream)
837{
838	struct sigmatel_spec *spec = codec->spec;
839	return snd_hda_multi_out_dig_open(codec, &spec->multiout);
840}
841
842static int stac92xx_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
843					   struct hda_codec *codec,
844					   struct snd_pcm_substream *substream)
845{
846	struct sigmatel_spec *spec = codec->spec;
847	return snd_hda_multi_out_dig_close(codec, &spec->multiout);
848}
849
850static int stac92xx_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
851					 struct hda_codec *codec,
852					 unsigned int stream_tag,
853					 unsigned int format,
854					 struct snd_pcm_substream *substream)
855{
856	struct sigmatel_spec *spec = codec->spec;
857	return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
858					     stream_tag, format, substream);
859}
860
861
862/*
863 * Analog capture callbacks
864 */
865static int stac92xx_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
866					struct hda_codec *codec,
867					unsigned int stream_tag,
868					unsigned int format,
869					struct snd_pcm_substream *substream)
870{
871	struct sigmatel_spec *spec = codec->spec;
872
873	snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],
874                                   stream_tag, 0, format);
875	return 0;
876}
877
878static int stac92xx_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
879					struct hda_codec *codec,
880					struct snd_pcm_substream *substream)
881{
882	struct sigmatel_spec *spec = codec->spec;
883
884	snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number], 0, 0, 0);
885	return 0;
886}
887
888static struct hda_pcm_stream stac92xx_pcm_digital_playback = {
889	.substreams = 1,
890	.channels_min = 2,
891	.channels_max = 2,
892	/* NID is set in stac92xx_build_pcms */
893	.ops = {
894		.open = stac92xx_dig_playback_pcm_open,
895		.close = stac92xx_dig_playback_pcm_close,
896		.prepare = stac92xx_dig_playback_pcm_prepare
897	},
898};
899
900static struct hda_pcm_stream stac92xx_pcm_digital_capture = {
901	.substreams = 1,
902	.channels_min = 2,
903	.channels_max = 2,
904	/* NID is set in stac92xx_build_pcms */
905};
906
907static struct hda_pcm_stream stac92xx_pcm_analog_playback = {
908	.substreams = 1,
909	.channels_min = 2,
910	.channels_max = 8,
911	.nid = 0x02, /* NID to query formats and rates */
912	.ops = {
913		.open = stac92xx_playback_pcm_open,
914		.prepare = stac92xx_playback_pcm_prepare,
915		.cleanup = stac92xx_playback_pcm_cleanup
916	},
917};
918
919static struct hda_pcm_stream stac92xx_pcm_analog_alt_playback = {
920	.substreams = 1,
921	.channels_min = 2,
922	.channels_max = 2,
923	.nid = 0x06, /* NID to query formats and rates */
924	.ops = {
925		.open = stac92xx_playback_pcm_open,
926		.prepare = stac92xx_playback_pcm_prepare,
927		.cleanup = stac92xx_playback_pcm_cleanup
928	},
929};
930
931static struct hda_pcm_stream stac92xx_pcm_analog_capture = {
932	.substreams = 2,
933	.channels_min = 2,
934	.channels_max = 2,
935	/* NID is set in stac92xx_build_pcms */
936	.ops = {
937		.prepare = stac92xx_capture_pcm_prepare,
938		.cleanup = stac92xx_capture_pcm_cleanup
939	},
940};
941
942static int stac92xx_build_pcms(struct hda_codec *codec)
943{
944	struct sigmatel_spec *spec = codec->spec;
945	struct hda_pcm *info = spec->pcm_rec;
946
947	codec->num_pcms = 1;
948	codec->pcm_info = info;
949
950	info->name = "STAC92xx Analog";
951	info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;
952	info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;
953	info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
954
955	if (spec->alt_switch) {
956		codec->num_pcms++;
957		info++;
958		info->name = "STAC92xx Analog Alt";
959		info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_alt_playback;
960	}
961
962	if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
963		codec->num_pcms++;
964		info++;
965		info->name = "STAC92xx Digital";
966		if (spec->multiout.dig_out_nid) {
967			info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_digital_playback;
968			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
969		}
970		if (spec->dig_in_nid) {
971			info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_digital_capture;
972			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
973		}
974	}
975
976	return 0;
977}
978
979static unsigned int stac92xx_get_vref(struct hda_codec *codec, hda_nid_t nid)
980{
981	unsigned int pincap = snd_hda_param_read(codec, nid,
982						 AC_PAR_PIN_CAP);
983	pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
984	if (pincap & AC_PINCAP_VREF_100)
985		return AC_PINCTL_VREF_100;
986	if (pincap & AC_PINCAP_VREF_80)
987		return AC_PINCTL_VREF_80;
988	if (pincap & AC_PINCAP_VREF_50)
989		return AC_PINCTL_VREF_50;
990	if (pincap & AC_PINCAP_VREF_GRD)
991		return AC_PINCTL_VREF_GRD;
992	return 0;
993}
994
995static void stac92xx_auto_set_pinctl(struct hda_codec *codec, hda_nid_t nid, int pin_type)
996
997{
998	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
999}
1000
1001static int stac92xx_io_switch_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1002{
1003	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
1004	uinfo->count = 1;
1005	uinfo->value.integer.min = 0;
1006	uinfo->value.integer.max = 1;
1007	return 0;
1008}
1009
1010static int stac92xx_io_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1011{
1012	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1013	struct sigmatel_spec *spec = codec->spec;
1014	int io_idx = kcontrol-> private_value & 0xff;
1015
1016	ucontrol->value.integer.value[0] = spec->io_switch[io_idx];
1017	return 0;
1018}
1019
1020static int stac92xx_io_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1021{
1022        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1023	struct sigmatel_spec *spec = codec->spec;
1024        hda_nid_t nid = kcontrol->private_value >> 8;
1025	int io_idx = kcontrol-> private_value & 0xff;
1026        unsigned short val = ucontrol->value.integer.value[0];
1027
1028	spec->io_switch[io_idx] = val;
1029
1030	if (val)
1031		stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
1032	else {
1033		unsigned int pinctl = AC_PINCTL_IN_EN;
1034		if (io_idx) /* set VREF for mic */
1035			pinctl |= stac92xx_get_vref(codec, nid);
1036		stac92xx_auto_set_pinctl(codec, nid, pinctl);
1037	}
1038        return 1;
1039}
1040
1041#define STAC_CODEC_IO_SWITCH(xname, xpval) \
1042	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1043	  .name = xname, \
1044	  .index = 0, \
1045          .info = stac92xx_io_switch_info, \
1046          .get = stac92xx_io_switch_get, \
1047          .put = stac92xx_io_switch_put, \
1048          .private_value = xpval, \
1049	}
1050
1051
1052enum {
1053	STAC_CTL_WIDGET_VOL,
1054	STAC_CTL_WIDGET_MUTE,
1055	STAC_CTL_WIDGET_IO_SWITCH,
1056};
1057
1058static struct snd_kcontrol_new stac92xx_control_templates[] = {
1059	HDA_CODEC_VOLUME(NULL, 0, 0, 0),
1060	HDA_CODEC_MUTE(NULL, 0, 0, 0),
1061	STAC_CODEC_IO_SWITCH(NULL, 0),
1062};
1063
1064/* add dynamic controls */
1065static int stac92xx_add_control(struct sigmatel_spec *spec, int type, const char *name, unsigned long val)
1066{
1067	struct snd_kcontrol_new *knew;
1068
1069	if (spec->num_kctl_used >= spec->num_kctl_alloc) {
1070		int num = spec->num_kctl_alloc + NUM_CONTROL_ALLOC;
1071
1072		knew = kcalloc(num + 1, sizeof(*knew), GFP_KERNEL); /* array + terminator */
1073		if (! knew)
1074			return -ENOMEM;
1075		if (spec->kctl_alloc) {
1076			memcpy(knew, spec->kctl_alloc, sizeof(*knew) * spec->num_kctl_alloc);
1077			kfree(spec->kctl_alloc);
1078		}
1079		spec->kctl_alloc = knew;
1080		spec->num_kctl_alloc = num;
1081	}
1082
1083	knew = &spec->kctl_alloc[spec->num_kctl_used];
1084	*knew = stac92xx_control_templates[type];
1085	knew->name = kstrdup(name, GFP_KERNEL);
1086	if (! knew->name)
1087		return -ENOMEM;
1088	knew->private_value = val;
1089	spec->num_kctl_used++;
1090	return 0;
1091}
1092
1093/* flag inputs as additional dynamic lineouts */
1094static int stac92xx_add_dyn_out_pins(struct hda_codec *codec, struct auto_pin_cfg *cfg)
1095{
1096	struct sigmatel_spec *spec = codec->spec;
1097	unsigned int wcaps, wtype;
1098	int i, num_dacs = 0;
1099
1100	/* use the wcaps cache to count all DACs available for line-outs */
1101	for (i = 0; i < codec->num_nodes; i++) {
1102		wcaps = codec->wcaps[i];
1103		wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
1104		if (wtype == AC_WID_AUD_OUT && !(wcaps & AC_WCAP_DIGITAL))
1105			num_dacs++;
1106	}
1107
1108	snd_printdd("%s: total dac count=%d\n", __func__, num_dacs);
1109
1110	switch (cfg->line_outs) {
1111	case 3:
1112		/* add line-in as side */
1113		if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 3) {
1114			cfg->line_out_pins[3] = cfg->input_pins[AUTO_PIN_LINE];
1115			spec->line_switch = 1;
1116			cfg->line_outs++;
1117		}
1118		break;
1119	case 2:
1120		/* add line-in as clfe and mic as side */
1121		if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 2) {
1122			cfg->line_out_pins[2] = cfg->input_pins[AUTO_PIN_LINE];
1123			spec->line_switch = 1;
1124			cfg->line_outs++;
1125		}
1126		if (cfg->input_pins[AUTO_PIN_MIC] && num_dacs > 3) {
1127			cfg->line_out_pins[3] = cfg->input_pins[AUTO_PIN_MIC];
1128			spec->mic_switch = 1;
1129			cfg->line_outs++;
1130		}
1131		break;
1132	case 1:
1133		/* add line-in as surr and mic as clfe */
1134		if (cfg->input_pins[AUTO_PIN_LINE] && num_dacs > 1) {
1135			cfg->line_out_pins[1] = cfg->input_pins[AUTO_PIN_LINE];
1136			spec->line_switch = 1;
1137			cfg->line_outs++;
1138		}
1139		if (cfg->input_pins[AUTO_PIN_MIC] && num_dacs > 2) {
1140			cfg->line_out_pins[2] = cfg->input_pins[AUTO_PIN_MIC];
1141			spec->mic_switch = 1;
1142			cfg->line_outs++;
1143		}
1144		break;
1145	}
1146
1147	return 0;
1148}
1149
1150
1151static int is_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
1152{
1153	int i;
1154
1155	for (i = 0; i < spec->multiout.num_dacs; i++) {
1156		if (spec->multiout.dac_nids[i] == nid)
1157			return 1;
1158	}
1159
1160	return 0;
1161}
1162
1163/*
1164 * Fill in the dac_nids table from the parsed pin configuration
1165 * This function only works when every pin in line_out_pins[]
1166 * contains atleast one DAC in its connection list. Some 92xx
1167 * codecs are not connected directly to a DAC, such as the 9200
1168 * and 9202/925x. For those, dac_nids[] must be hard-coded.
1169 */
1170static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec,
1171				       const struct auto_pin_cfg *cfg)
1172{
1173	struct sigmatel_spec *spec = codec->spec;
1174	int i, j, conn_len = 0;
1175	hda_nid_t nid, conn[HDA_MAX_CONNECTIONS];
1176	unsigned int wcaps, wtype;
1177
1178	for (i = 0; i < cfg->line_outs; i++) {
1179		nid = cfg->line_out_pins[i];
1180		conn_len = snd_hda_get_connections(codec, nid, conn,
1181						   HDA_MAX_CONNECTIONS);
1182		for (j = 0; j < conn_len; j++) {
1183			wcaps = snd_hda_param_read(codec, conn[j],
1184						   AC_PAR_AUDIO_WIDGET_CAP);
1185			wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
1186
1187			if (wtype != AC_WID_AUD_OUT ||
1188			    (wcaps & AC_WCAP_DIGITAL))
1189				continue;
1190			/* conn[j] is a DAC routed to this line-out */
1191			if (!is_in_dac_nids(spec, conn[j]))
1192				break;
1193		}
1194
1195		if (j == conn_len) {
1196			/* error out, no available DAC found */
1197			snd_printk(KERN_ERR
1198				   "%s: No available DAC for pin 0x%x\n",
1199				   __func__, nid);
1200			return -ENODEV;
1201		}
1202
1203		spec->multiout.dac_nids[i] = conn[j];
1204		spec->multiout.num_dacs++;
1205		if (conn_len > 1) {
1206			/* select this DAC in the pin's input mux */
1207			snd_hda_codec_write(codec, nid, 0,
1208					    AC_VERB_SET_CONNECT_SEL, j);
1209
1210		}
1211	}
1212
1213	snd_printd("dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n",
1214		   spec->multiout.num_dacs,
1215		   spec->multiout.dac_nids[0],
1216		   spec->multiout.dac_nids[1],
1217		   spec->multiout.dac_nids[2],
1218		   spec->multiout.dac_nids[3],
1219		   spec->multiout.dac_nids[4]);
1220	return 0;
1221}
1222
1223/* create volume control/switch for the given prefx type */
1224static int create_controls(struct sigmatel_spec *spec, const char *pfx, hda_nid_t nid, int chs)
1225{
1226	char name[32];
1227	int err;
1228
1229	sprintf(name, "%s Playback Volume", pfx);
1230	err = stac92xx_add_control(spec, STAC_CTL_WIDGET_VOL, name,
1231				   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
1232	if (err < 0)
1233		return err;
1234	sprintf(name, "%s Playback Switch", pfx);
1235	err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE, name,
1236				   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
1237	if (err < 0)
1238		return err;
1239	return 0;
1240}
1241
1242/* add playback controls from the parsed DAC table */
1243static int stac92xx_auto_create_multi_out_ctls(struct sigmatel_spec *spec,
1244					       const struct auto_pin_cfg *cfg)
1245{
1246	static const char *chname[4] = {
1247		"Front", "Surround", NULL /*CLFE*/, "Side"
1248	};
1249	hda_nid_t nid;
1250	int i, err;
1251
1252	for (i = 0; i < cfg->line_outs; i++) {
1253		if (!spec->multiout.dac_nids[i])
1254			continue;
1255
1256		nid = spec->multiout.dac_nids[i];
1257
1258		if (i == 2) {
1259			/* Center/LFE */
1260			err = create_controls(spec, "Center", nid, 1);
1261			if (err < 0)
1262				return err;
1263			err = create_controls(spec, "LFE", nid, 2);
1264			if (err < 0)
1265				return err;
1266		} else {
1267			err = create_controls(spec, chname[i], nid, 3);
1268			if (err < 0)
1269				return err;
1270		}
1271	}
1272
1273	if (spec->line_switch)
1274		if ((err = stac92xx_add_control(spec, STAC_CTL_WIDGET_IO_SWITCH, "Line In as Output Switch", cfg->input_pins[AUTO_PIN_LINE] << 8)) < 0)
1275			return err;
1276
1277	if (spec->mic_switch)
1278		if ((err = stac92xx_add_control(spec, STAC_CTL_WIDGET_IO_SWITCH, "Mic as Output Switch", (cfg->input_pins[AUTO_PIN_MIC] << 8) | 1)) < 0)
1279			return err;
1280
1281	return 0;
1282}
1283
1284static int check_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
1285{
1286	if (is_in_dac_nids(spec, nid))
1287		return 1;
1288	if (spec->multiout.hp_nid == nid)
1289		return 1;
1290	return 0;
1291}
1292
1293static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
1294{
1295	if (!spec->multiout.hp_nid)
1296		spec->multiout.hp_nid = nid;
1297	else if (spec->multiout.num_dacs > 4) {
1298		printk(KERN_WARNING "stac92xx: No space for DAC 0x%x\n", nid);
1299		return 1;
1300	} else {
1301		spec->multiout.dac_nids[spec->multiout.num_dacs] = nid;
1302		spec->multiout.num_dacs++;
1303	}
1304	return 0;
1305}
1306
1307/* add playback controls for Speaker and HP outputs */
1308static int stac92xx_auto_create_hp_ctls(struct hda_codec *codec,
1309					struct auto_pin_cfg *cfg)
1310{
1311	struct sigmatel_spec *spec = codec->spec;
1312	hda_nid_t nid;
1313	int i, old_num_dacs, err;
1314
1315	old_num_dacs = spec->multiout.num_dacs;
1316	for (i = 0; i < cfg->hp_outs; i++) {
1317		unsigned int wid_caps = get_wcaps(codec, cfg->hp_pins[i]);
1318		if (wid_caps & AC_WCAP_UNSOL_CAP)
1319			spec->hp_detect = 1;
1320		nid = snd_hda_codec_read(codec, cfg->hp_pins[i], 0,
1321					 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
1322		if (check_in_dac_nids(spec, nid))
1323			nid = 0;
1324		if (! nid)
1325			continue;
1326		add_spec_dacs(spec, nid);
1327	}
1328	for (i = 0; i < cfg->speaker_outs; i++) {
1329		nid = snd_hda_codec_read(codec, cfg->speaker_pins[i], 0,
1330					 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
1331		if (check_in_dac_nids(spec, nid))
1332			nid = 0;
1333		if (! nid)
1334			continue;
1335		add_spec_dacs(spec, nid);
1336	}
1337
1338	for (i = old_num_dacs; i < spec->multiout.num_dacs; i++) {
1339		static const char *pfxs[] = {
1340			"Speaker", "External Speaker", "Speaker2",
1341		};
1342		err = create_controls(spec, pfxs[i - old_num_dacs],
1343				      spec->multiout.dac_nids[i], 3);
1344		if (err < 0)
1345			return err;
1346	}
1347	if (spec->multiout.hp_nid) {
1348		const char *pfx;
1349		if (old_num_dacs == spec->multiout.num_dacs)
1350			pfx = "Master";
1351		else
1352			pfx = "Headphone";
1353		err = create_controls(spec, pfx, spec->multiout.hp_nid, 3);
1354		if (err < 0)
1355			return err;
1356	}
1357
1358	return 0;
1359}
1360
1361/* labels for dmic mux inputs */
1362static const char *stac92xx_dmic_labels[5] = {
1363	"Analog Inputs", "Digital Mic 1", "Digital Mic 2",
1364	"Digital Mic 3", "Digital Mic 4"
1365};
1366
1367/* create playback/capture controls for input pins on dmic capable codecs */
1368static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec,
1369						const struct auto_pin_cfg *cfg)
1370{
1371	struct sigmatel_spec *spec = codec->spec;
1372	struct hda_input_mux *dimux = &spec->private_dimux;
1373	hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
1374	int i, j;
1375
1376	dimux->items[dimux->num_items].label = stac92xx_dmic_labels[0];
1377	dimux->items[dimux->num_items].index = 0;
1378	dimux->num_items++;
1379
1380	for (i = 0; i < spec->num_dmics; i++) {
1381		int index;
1382		int num_cons;
1383		unsigned int def_conf;
1384
1385		def_conf = snd_hda_codec_read(codec,
1386					      spec->dmic_nids[i],
1387					      0,
1388					      AC_VERB_GET_CONFIG_DEFAULT,
1389					      0);
1390		if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE)
1391			continue;
1392
1393		num_cons = snd_hda_get_connections(codec,
1394				spec->dmux_nid,
1395				con_lst,
1396				HDA_MAX_NUM_INPUTS);
1397		for (j = 0; j < num_cons; j++)
1398			if (con_lst[j] == spec->dmic_nids[i]) {
1399				index = j;
1400				goto found;
1401			}
1402		continue;
1403found:
1404		dimux->items[dimux->num_items].label =
1405			stac92xx_dmic_labels[dimux->num_items];
1406		dimux->items[dimux->num_items].index = index;
1407		dimux->num_items++;
1408	}
1409
1410	return 0;
1411}
1412
1413/* create playback/capture controls for input pins */
1414static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const struct auto_pin_cfg *cfg)
1415{
1416	struct sigmatel_spec *spec = codec->spec;
1417	struct hda_input_mux *imux = &spec->private_imux;
1418	hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
1419	int i, j, k;
1420
1421	for (i = 0; i < AUTO_PIN_LAST; i++) {
1422		int index;
1423
1424		if (!cfg->input_pins[i])
1425			continue;
1426		index = -1;
1427		for (j = 0; j < spec->num_muxes; j++) {
1428			int num_cons;
1429			num_cons = snd_hda_get_connections(codec,
1430							   spec->mux_nids[j],
1431							   con_lst,
1432							   HDA_MAX_NUM_INPUTS);
1433			for (k = 0; k < num_cons; k++)
1434				if (con_lst[k] == cfg->input_pins[i]) {
1435					index = k;
1436					goto found;
1437				}
1438		}
1439		continue;
1440	found:
1441		imux->items[imux->num_items].label = auto_pin_cfg_labels[i];
1442		imux->items[imux->num_items].index = index;
1443		imux->num_items++;
1444	}
1445
1446	if (imux->num_items) {
1447		/*
1448		 * Set the current input for the muxes.
1449		 * The STAC9221 has two input muxes with identical source
1450		 * NID lists.  Hopefully this won't get confused.
1451		 */
1452		for (i = 0; i < spec->num_muxes; i++) {
1453			snd_hda_codec_write(codec, spec->mux_nids[i], 0,
1454					    AC_VERB_SET_CONNECT_SEL,
1455					    imux->items[0].index);
1456		}
1457	}
1458
1459	return 0;
1460}
1461
1462static void stac92xx_auto_init_multi_out(struct hda_codec *codec)
1463{
1464	struct sigmatel_spec *spec = codec->spec;
1465	int i;
1466
1467	for (i = 0; i < spec->autocfg.line_outs; i++) {
1468		hda_nid_t nid = spec->autocfg.line_out_pins[i];
1469		stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
1470	}
1471}
1472
1473static void stac92xx_auto_init_hp_out(struct hda_codec *codec)
1474{
1475	struct sigmatel_spec *spec = codec->spec;
1476	int i;
1477
1478	for (i = 0; i < spec->autocfg.hp_outs; i++) {
1479		hda_nid_t pin;
1480		pin = spec->autocfg.hp_pins[i];
1481		if (pin) /* connect to front */
1482			stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
1483	}
1484	for (i = 0; i < spec->autocfg.speaker_outs; i++) {
1485		hda_nid_t pin;
1486		pin = spec->autocfg.speaker_pins[i];
1487		if (pin) /* connect to front */
1488			stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN);
1489	}
1490}
1491
1492static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in)
1493{
1494	struct sigmatel_spec *spec = codec->spec;
1495	int err;
1496
1497	if ((err = snd_hda_parse_pin_def_config(codec,
1498						&spec->autocfg,
1499						spec->dmic_nids)) < 0)
1500		return err;
1501	if (! spec->autocfg.line_outs)
1502		return 0; /* can't find valid pin config */
1503
1504	if ((err = stac92xx_add_dyn_out_pins(codec, &spec->autocfg)) < 0)
1505		return err;
1506	if (spec->multiout.num_dacs == 0)
1507		if ((err = stac92xx_auto_fill_dac_nids(codec, &spec->autocfg)) < 0)
1508			return err;
1509
1510	if ((err = stac92xx_auto_create_multi_out_ctls(spec, &spec->autocfg)) < 0 ||
1511	    (err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg)) < 0 ||
1512	    (err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg)) < 0)
1513		return err;
1514
1515	if (spec->num_dmics > 0)
1516		if ((err = stac92xx_auto_create_dmic_input_ctls(codec,
1517						&spec->autocfg)) < 0)
1518			return err;
1519
1520	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
1521	if (spec->multiout.max_channels > 2)
1522		spec->surr_switch = 1;
1523
1524	if (spec->autocfg.dig_out_pin)
1525		spec->multiout.dig_out_nid = dig_out;
1526	if (spec->autocfg.dig_in_pin)
1527		spec->dig_in_nid = dig_in;
1528
1529	if (spec->kctl_alloc)
1530		spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
1531
1532	spec->input_mux = &spec->private_imux;
1533	spec->dinput_mux = &spec->private_dimux;
1534
1535	return 1;
1536}
1537
1538/* add playback controls for HP output */
1539static int stac9200_auto_create_hp_ctls(struct hda_codec *codec,
1540					struct auto_pin_cfg *cfg)
1541{
1542	struct sigmatel_spec *spec = codec->spec;
1543	hda_nid_t pin = cfg->hp_pins[0];
1544	unsigned int wid_caps;
1545
1546	if (! pin)
1547		return 0;
1548
1549	wid_caps = get_wcaps(codec, pin);
1550	if (wid_caps & AC_WCAP_UNSOL_CAP)
1551		spec->hp_detect = 1;
1552
1553	return 0;
1554}
1555
1556/* add playback controls for LFE output */
1557static int stac9200_auto_create_lfe_ctls(struct hda_codec *codec,
1558					struct auto_pin_cfg *cfg)
1559{
1560	struct sigmatel_spec *spec = codec->spec;
1561	int err;
1562	hda_nid_t lfe_pin = 0x0;
1563	int i;
1564
1565	/*
1566	 * search speaker outs and line outs for a mono speaker pin
1567	 * with an amp.  If one is found, add LFE controls
1568	 * for it.
1569	 */
1570	for (i = 0; i < spec->autocfg.speaker_outs && lfe_pin == 0x0; i++) {
1571		hda_nid_t pin = spec->autocfg.speaker_pins[i];
1572		unsigned long wcaps = get_wcaps(codec, pin);
1573		wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
1574		if (wcaps == AC_WCAP_OUT_AMP)
1575			/* found a mono speaker with an amp, must be lfe */
1576			lfe_pin = pin;
1577	}
1578
1579	/* if speaker_outs is 0, then speakers may be in line_outs */
1580	if (lfe_pin == 0 && spec->autocfg.speaker_outs == 0) {
1581		for (i = 0; i < spec->autocfg.line_outs && lfe_pin == 0x0; i++) {
1582			hda_nid_t pin = spec->autocfg.line_out_pins[i];
1583			unsigned long cfg;
1584			cfg = snd_hda_codec_read(codec, pin, 0,
1585						 AC_VERB_GET_CONFIG_DEFAULT,
1586						 0x00);
1587			if (get_defcfg_device(cfg) == AC_JACK_SPEAKER) {
1588				unsigned long wcaps = get_wcaps(codec, pin);
1589				wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
1590				if (wcaps == AC_WCAP_OUT_AMP)
1591					/* found a mono speaker with an amp,
1592					   must be lfe */
1593					lfe_pin = pin;
1594			}
1595		}
1596	}
1597
1598	if (lfe_pin) {
1599		err = create_controls(spec, "LFE", lfe_pin, 1);
1600		if (err < 0)
1601			return err;
1602	}
1603
1604	return 0;
1605}
1606
1607static int stac9200_parse_auto_config(struct hda_codec *codec)
1608{
1609	struct sigmatel_spec *spec = codec->spec;
1610	int err;
1611
1612	if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
1613		return err;
1614
1615	if ((err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg)) < 0)
1616		return err;
1617
1618	if ((err = stac9200_auto_create_hp_ctls(codec, &spec->autocfg)) < 0)
1619		return err;
1620
1621	if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0)
1622		return err;
1623
1624	if (spec->autocfg.dig_out_pin)
1625		spec->multiout.dig_out_nid = 0x05;
1626	if (spec->autocfg.dig_in_pin)
1627		spec->dig_in_nid = 0x04;
1628
1629	if (spec->kctl_alloc)
1630		spec->mixers[spec->num_mixers++] = spec->kctl_alloc;
1631
1632	spec->input_mux = &spec->private_imux;
1633	spec->dinput_mux = &spec->private_dimux;
1634
1635	return 1;
1636}
1637
1638/*
1639 * Early 2006 Intel Macintoshes with STAC9220X5 codecs seem to have a
1640 * funky external mute control using GPIO pins.
1641 */
1642
1643static void stac922x_gpio_mute(struct hda_codec *codec, int pin, int muted)
1644{
1645	unsigned int gpiostate, gpiomask, gpiodir;
1646
1647	gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
1648				       AC_VERB_GET_GPIO_DATA, 0);
1649
1650	if (!muted)
1651		gpiostate |= (1 << pin);
1652	else
1653		gpiostate &= ~(1 << pin);
1654
1655	gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
1656				      AC_VERB_GET_GPIO_MASK, 0);
1657	gpiomask |= (1 << pin);
1658
1659	gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
1660				     AC_VERB_GET_GPIO_DIRECTION, 0);
1661	gpiodir |= (1 << pin);
1662
1663	/* AppleHDA seems to do this -- WTF is this verb?? */
1664	snd_hda_codec_write(codec, codec->afg, 0, 0x7e7, 0);
1665
1666	snd_hda_codec_write(codec, codec->afg, 0,
1667			    AC_VERB_SET_GPIO_MASK, gpiomask);
1668	snd_hda_codec_write(codec, codec->afg, 0,
1669			    AC_VERB_SET_GPIO_DIRECTION, gpiodir);
1670
1671	msleep(1);
1672
1673	snd_hda_codec_write(codec, codec->afg, 0,
1674			    AC_VERB_SET_GPIO_DATA, gpiostate);
1675}
1676
1677static void enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
1678			      unsigned int event)
1679{
1680	if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP)
1681		snd_hda_codec_write(codec, nid, 0,
1682				    AC_VERB_SET_UNSOLICITED_ENABLE,
1683				    (AC_USRSP_EN | event));
1684}
1685
1686static int stac92xx_init(struct hda_codec *codec)
1687{
1688	struct sigmatel_spec *spec = codec->spec;
1689	struct auto_pin_cfg *cfg = &spec->autocfg;
1690	int i;
1691
1692	snd_hda_sequence_write(codec, spec->init);
1693
1694	/* set up pins */
1695	if (spec->hp_detect) {
1696		/* Enable unsolicited responses on the HP widget */
1697		for (i = 0; i < cfg->hp_outs; i++)
1698			enable_pin_detect(codec, cfg->hp_pins[i],
1699					  STAC_HP_EVENT);
1700		/* force to enable the first line-out; the others are set up
1701		 * in unsol_event
1702		 */
1703		stac92xx_auto_set_pinctl(codec, spec->autocfg.line_out_pins[0],
1704					 AC_PINCTL_OUT_EN);
1705		stac92xx_auto_init_hp_out(codec);
1706		/* fake event to set up pins */
1707		codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
1708	} else {
1709		stac92xx_auto_init_multi_out(codec);
1710		stac92xx_auto_init_hp_out(codec);
1711	}
1712	for (i = 0; i < AUTO_PIN_LAST; i++) {
1713		hda_nid_t nid = cfg->input_pins[i];
1714		if (nid) {
1715			unsigned int pinctl = AC_PINCTL_IN_EN;
1716			if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC)
1717				pinctl |= stac92xx_get_vref(codec, nid);
1718			stac92xx_auto_set_pinctl(codec, nid, pinctl);
1719		}
1720	}
1721	if (spec->num_dmics > 0)
1722		for (i = 0; i < spec->num_dmics; i++)
1723			stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i],
1724						 AC_PINCTL_IN_EN);
1725
1726	if (cfg->dig_out_pin)
1727		stac92xx_auto_set_pinctl(codec, cfg->dig_out_pin,
1728					 AC_PINCTL_OUT_EN);
1729	if (cfg->dig_in_pin)
1730		stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin,
1731					 AC_PINCTL_IN_EN);
1732
1733	if (spec->gpio_mute) {
1734		stac922x_gpio_mute(codec, 0, 0);
1735		stac922x_gpio_mute(codec, 1, 0);
1736	}
1737
1738	return 0;
1739}
1740
1741static void stac92xx_free(struct hda_codec *codec)
1742{
1743	struct sigmatel_spec *spec = codec->spec;
1744	int i;
1745
1746	if (! spec)
1747		return;
1748
1749	if (spec->kctl_alloc) {
1750		for (i = 0; i < spec->num_kctl_used; i++)
1751			kfree(spec->kctl_alloc[i].name);
1752		kfree(spec->kctl_alloc);
1753	}
1754
1755	if (spec->bios_pin_configs)
1756		kfree(spec->bios_pin_configs);
1757
1758	kfree(spec);
1759}
1760
1761static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
1762				unsigned int flag)
1763{
1764	unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
1765			0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
1766
1767	if (pin_ctl & AC_PINCTL_IN_EN) {
1768		struct sigmatel_spec *spec = codec->spec;
1769		struct auto_pin_cfg *cfg = &spec->autocfg;
1770		if ((nid == cfg->input_pins[AUTO_PIN_LINE] &&
1771		     spec->line_switch) ||
1772		    (nid == cfg->input_pins[AUTO_PIN_MIC] &&
1773		     spec->mic_switch))
1774			return;
1775	}
1776
1777	/* if setting pin direction bits, clear the current
1778	   direction bits first */
1779	if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))
1780		pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
1781
1782	snd_hda_codec_write(codec, nid, 0,
1783			AC_VERB_SET_PIN_WIDGET_CONTROL,
1784			pin_ctl | flag);
1785}
1786
1787static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
1788				  unsigned int flag)
1789{
1790	unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
1791			0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
1792	snd_hda_codec_write(codec, nid, 0,
1793			AC_VERB_SET_PIN_WIDGET_CONTROL,
1794			pin_ctl & ~flag);
1795}
1796
1797static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
1798{
1799	if (!nid)
1800		return 0;
1801	if (snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_SENSE, 0x00)
1802	    & (1 << 31))
1803		return 1;
1804	return 0;
1805}
1806
1807static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res)
1808{
1809	struct sigmatel_spec *spec = codec->spec;
1810	struct auto_pin_cfg *cfg = &spec->autocfg;
1811	int i, presence;
1812
1813	presence = 0;
1814	for (i = 0; i < cfg->hp_outs; i++) {
1815		presence = get_pin_presence(codec, cfg->hp_pins[i]);
1816		if (presence)
1817			break;
1818	}
1819
1820	if (presence) {
1821		/* disable lineouts, enable hp */
1822		for (i = 0; i < cfg->line_outs; i++)
1823			stac92xx_reset_pinctl(codec, cfg->line_out_pins[i],
1824						AC_PINCTL_OUT_EN);
1825		for (i = 0; i < cfg->speaker_outs; i++)
1826			stac92xx_reset_pinctl(codec, cfg->speaker_pins[i],
1827						AC_PINCTL_OUT_EN);
1828	} else {
1829		/* enable lineouts, disable hp */
1830		for (i = 0; i < cfg->line_outs; i++)
1831			stac92xx_set_pinctl(codec, cfg->line_out_pins[i],
1832						AC_PINCTL_OUT_EN);
1833		for (i = 0; i < cfg->speaker_outs; i++)
1834			stac92xx_set_pinctl(codec, cfg->speaker_pins[i],
1835						AC_PINCTL_OUT_EN);
1836	}
1837}
1838
1839static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
1840{
1841	switch (res >> 26) {
1842	case STAC_HP_EVENT:
1843		stac92xx_hp_detect(codec, res);
1844		break;
1845	}
1846}
1847
1848#ifdef CONFIG_PM
1849static int stac92xx_resume(struct hda_codec *codec)
1850{
1851	struct sigmatel_spec *spec = codec->spec;
1852	int i;
1853
1854	stac92xx_init(codec);
1855	stac92xx_set_config_regs(codec);
1856	snd_hda_resume_ctls(codec, spec->mixer);
1857	for (i = 0; i < spec->num_mixers; i++)
1858		snd_hda_resume_ctls(codec, spec->mixers[i]);
1859	if (spec->multiout.dig_out_nid)
1860		snd_hda_resume_spdif_out(codec);
1861	if (spec->dig_in_nid)
1862		snd_hda_resume_spdif_in(codec);
1863
1864	return 0;
1865}
1866#endif
1867
1868static struct hda_codec_ops stac92xx_patch_ops = {
1869	.build_controls = stac92xx_build_controls,
1870	.build_pcms = stac92xx_build_pcms,
1871	.init = stac92xx_init,
1872	.free = stac92xx_free,
1873	.unsol_event = stac92xx_unsol_event,
1874#ifdef CONFIG_PM
1875	.resume = stac92xx_resume,
1876#endif
1877};
1878
1879static int patch_stac9200(struct hda_codec *codec)
1880{
1881	struct sigmatel_spec *spec;
1882	int err;
1883
1884	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
1885	if (spec == NULL)
1886		return -ENOMEM;
1887
1888	codec->spec = spec;
1889	spec->num_pins = 8;
1890	spec->pin_nids = stac9200_pin_nids;
1891	spec->board_config = snd_hda_check_board_config(codec, STAC_9200_MODELS,
1892							stac9200_models,
1893							stac9200_cfg_tbl);
1894	if (spec->board_config < 0) {
1895		snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9200, using BIOS defaults\n");
1896		err = stac92xx_save_bios_config_regs(codec);
1897		if (err < 0) {
1898			stac92xx_free(codec);
1899			return err;
1900		}
1901		spec->pin_configs = spec->bios_pin_configs;
1902	} else {
1903		spec->pin_configs = stac9200_brd_tbl[spec->board_config];
1904		stac92xx_set_config_regs(codec);
1905	}
1906
1907	spec->multiout.max_channels = 2;
1908	spec->multiout.num_dacs = 1;
1909	spec->multiout.dac_nids = stac9200_dac_nids;
1910	spec->adc_nids = stac9200_adc_nids;
1911	spec->mux_nids = stac9200_mux_nids;
1912	spec->num_muxes = 1;
1913	spec->num_dmics = 0;
1914
1915	spec->init = stac9200_core_init;
1916	spec->mixer = stac9200_mixer;
1917
1918	err = stac9200_parse_auto_config(codec);
1919	if (err < 0) {
1920		stac92xx_free(codec);
1921		return err;
1922	}
1923
1924	codec->patch_ops = stac92xx_patch_ops;
1925
1926	return 0;
1927}
1928
1929static int patch_stac925x(struct hda_codec *codec)
1930{
1931	struct sigmatel_spec *spec;
1932	int err;
1933
1934	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
1935	if (spec == NULL)
1936		return -ENOMEM;
1937
1938	codec->spec = spec;
1939	spec->num_pins = 8;
1940	spec->pin_nids = stac925x_pin_nids;
1941	spec->board_config = snd_hda_check_board_config(codec, STAC_925x_MODELS,
1942							stac925x_models,
1943							stac925x_cfg_tbl);
1944 again:
1945	if (spec->board_config < 0) {
1946		snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x,"
1947				      "using BIOS defaults\n");
1948		err = stac92xx_save_bios_config_regs(codec);
1949		if (err < 0) {
1950			stac92xx_free(codec);
1951			return err;
1952		}
1953		spec->pin_configs = spec->bios_pin_configs;
1954	} else if (stac925x_brd_tbl[spec->board_config] != NULL){
1955		spec->pin_configs = stac925x_brd_tbl[spec->board_config];
1956		stac92xx_set_config_regs(codec);
1957	}
1958
1959	spec->multiout.max_channels = 2;
1960	spec->multiout.num_dacs = 1;
1961	spec->multiout.dac_nids = stac925x_dac_nids;
1962	spec->adc_nids = stac925x_adc_nids;
1963	spec->mux_nids = stac925x_mux_nids;
1964	spec->num_muxes = 1;
1965	switch (codec->vendor_id) {
1966	case 0x83847632: /* STAC9202  */
1967	case 0x83847633: /* STAC9202D */
1968	case 0x83847636: /* STAC9251  */
1969	case 0x83847637: /* STAC9251D */
1970		spec->num_dmics = 1;
1971		spec->dmic_nids = stac925x_dmic_nids;
1972		break;
1973	default:
1974		spec->num_dmics = 0;
1975		break;
1976	}
1977
1978	spec->init = stac925x_core_init;
1979	spec->mixer = stac925x_mixer;
1980
1981	err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
1982	if (!err) {
1983		if (spec->board_config < 0) {
1984			printk(KERN_WARNING "hda_codec: No auto-config is "
1985			       "available, default to model=ref\n");
1986			spec->board_config = STAC_925x_REF;
1987			goto again;
1988		}
1989		err = -EINVAL;
1990	}
1991	if (err < 0) {
1992		stac92xx_free(codec);
1993		return err;
1994	}
1995
1996	codec->patch_ops = stac92xx_patch_ops;
1997
1998	return 0;
1999}
2000
2001static int patch_stac922x(struct hda_codec *codec)
2002{
2003	struct sigmatel_spec *spec;
2004	int err;
2005
2006	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
2007	if (spec == NULL)
2008		return -ENOMEM;
2009
2010	codec->spec = spec;
2011	spec->num_pins = 10;
2012	spec->pin_nids = stac922x_pin_nids;
2013	spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
2014							stac922x_models,
2015							stac922x_cfg_tbl);
2016	if (spec->board_config == STAC_MACMINI) {
2017		spec->gpio_mute = 1;
2018		/* Intel Macs have all same PCI SSID, so we need to check
2019		 * codec SSID to distinguish the exact models
2020		 */
2021		printk(KERN_INFO "hda_codec: STAC922x, Apple subsys_id=%x\n", codec->subsystem_id);
2022		switch (codec->subsystem_id) {
2023		case 0x106b0a00: /* MacBook First generatoin */
2024			spec->board_config = STAC_MACBOOK;
2025			break;
2026		case 0x106b0200: /* MacBook Pro first generation */
2027			spec->board_config = STAC_MACBOOK_PRO_V1;
2028			break;
2029		case 0x106b1e00: /* MacBook Pro second generation */
2030			spec->board_config = STAC_MACBOOK_PRO_V2;
2031			break;
2032		case 0x106b0700: /* Intel-based iMac */
2033			spec->board_config = STAC_IMAC_INTEL;
2034			break;
2035		}
2036	}
2037
2038 again:
2039	if (spec->board_config < 0) {
2040		snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC922x, "
2041			"using BIOS defaults\n");
2042		err = stac92xx_save_bios_config_regs(codec);
2043		if (err < 0) {
2044			stac92xx_free(codec);
2045			return err;
2046		}
2047		spec->pin_configs = spec->bios_pin_configs;
2048	} else if (stac922x_brd_tbl[spec->board_config] != NULL) {
2049		spec->pin_configs = stac922x_brd_tbl[spec->board_config];
2050		stac92xx_set_config_regs(codec);
2051	}
2052
2053	spec->adc_nids = stac922x_adc_nids;
2054	spec->mux_nids = stac922x_mux_nids;
2055	spec->num_muxes = ARRAY_SIZE(stac922x_mux_nids);
2056	spec->num_dmics = 0;
2057
2058	spec->init = stac922x_core_init;
2059	spec->mixer = stac922x_mixer;
2060
2061	spec->multiout.dac_nids = spec->dac_nids;
2062
2063	err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
2064	if (!err) {
2065		if (spec->board_config < 0) {
2066			printk(KERN_WARNING "hda_codec: No auto-config is "
2067			       "available, default to model=ref\n");
2068			spec->board_config = STAC_D945_REF;
2069			goto again;
2070		}
2071		err = -EINVAL;
2072	}
2073	if (err < 0) {
2074		stac92xx_free(codec);
2075		return err;
2076	}
2077
2078	codec->patch_ops = stac92xx_patch_ops;
2079
2080	return 0;
2081}
2082
2083static int patch_stac927x(struct hda_codec *codec)
2084{
2085	struct sigmatel_spec *spec;
2086	int err;
2087
2088	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
2089	if (spec == NULL)
2090		return -ENOMEM;
2091
2092	codec->spec = spec;
2093	spec->num_pins = 14;
2094	spec->pin_nids = stac927x_pin_nids;
2095	spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,
2096							stac927x_models,
2097							stac927x_cfg_tbl);
2098 again:
2099	if (spec->board_config < 0) {
2100                snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC927x, using BIOS defaults\n");
2101		err = stac92xx_save_bios_config_regs(codec);
2102		if (err < 0) {
2103			stac92xx_free(codec);
2104			return err;
2105		}
2106		spec->pin_configs = spec->bios_pin_configs;
2107	} else if (stac927x_brd_tbl[spec->board_config] != NULL) {
2108		spec->pin_configs = stac927x_brd_tbl[spec->board_config];
2109		stac92xx_set_config_regs(codec);
2110	}
2111
2112	switch (spec->board_config) {
2113	case STAC_D965_3ST:
2114		spec->adc_nids = stac927x_adc_nids;
2115		spec->mux_nids = stac927x_mux_nids;
2116		spec->num_muxes = ARRAY_SIZE(stac927x_mux_nids);
2117		spec->num_dmics = 0;
2118		spec->init = d965_core_init;
2119		spec->mixer = stac9227_mixer;
2120		break;
2121	case STAC_D965_5ST:
2122		spec->adc_nids = stac927x_adc_nids;
2123		spec->mux_nids = stac927x_mux_nids;
2124		spec->num_muxes = ARRAY_SIZE(stac927x_mux_nids);
2125		spec->num_dmics = 0;
2126		spec->init = d965_core_init;
2127		spec->mixer = stac9227_mixer;
2128		break;
2129	default:
2130		spec->adc_nids = stac927x_adc_nids;
2131		spec->mux_nids = stac927x_mux_nids;
2132		spec->num_muxes = ARRAY_SIZE(stac927x_mux_nids);
2133		spec->num_dmics = 0;
2134		spec->init = stac927x_core_init;
2135		spec->mixer = stac927x_mixer;
2136	}
2137
2138	spec->multiout.dac_nids = spec->dac_nids;
2139
2140	err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
2141	if (!err) {
2142		if (spec->board_config < 0) {
2143			printk(KERN_WARNING "hda_codec: No auto-config is "
2144			       "available, default to model=ref\n");
2145			spec->board_config = STAC_D965_REF;
2146			goto again;
2147		}
2148		err = -EINVAL;
2149	}
2150	if (err < 0) {
2151		stac92xx_free(codec);
2152		return err;
2153	}
2154
2155	codec->patch_ops = stac92xx_patch_ops;
2156
2157	/* Fix Mux capture level; max to 2 */
2158	snd_hda_override_amp_caps(codec, 0x12, HDA_OUTPUT,
2159				  (0 << AC_AMPCAP_OFFSET_SHIFT) |
2160				  (2 << AC_AMPCAP_NUM_STEPS_SHIFT) |
2161				  (0x27 << AC_AMPCAP_STEP_SIZE_SHIFT) |
2162				  (0 << AC_AMPCAP_MUTE_SHIFT));
2163
2164	return 0;
2165}
2166
2167static int patch_stac9205(struct hda_codec *codec)
2168{
2169	struct sigmatel_spec *spec;
2170	int err;
2171
2172	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
2173	if (spec == NULL)
2174		return -ENOMEM;
2175
2176	codec->spec = spec;
2177	spec->num_pins = 14;
2178	spec->pin_nids = stac9205_pin_nids;
2179	spec->board_config = snd_hda_check_board_config(codec, STAC_9205_MODELS,
2180							stac9205_models,
2181							stac9205_cfg_tbl);
2182 again:
2183	if (spec->board_config < 0) {
2184		snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9205, using BIOS defaults\n");
2185		err = stac92xx_save_bios_config_regs(codec);
2186		if (err < 0) {
2187			stac92xx_free(codec);
2188			return err;
2189		}
2190		spec->pin_configs = spec->bios_pin_configs;
2191	} else {
2192		spec->pin_configs = stac9205_brd_tbl[spec->board_config];
2193		stac92xx_set_config_regs(codec);
2194	}
2195
2196	spec->adc_nids = stac9205_adc_nids;
2197	spec->mux_nids = stac9205_mux_nids;
2198	spec->num_muxes = ARRAY_SIZE(stac9205_mux_nids);
2199	spec->dmic_nids = stac9205_dmic_nids;
2200	spec->num_dmics = ARRAY_SIZE(stac9205_dmic_nids);
2201	spec->dmux_nid = 0x1d;
2202
2203	spec->init = stac9205_core_init;
2204	spec->mixer = stac9205_mixer;
2205
2206	spec->multiout.dac_nids = spec->dac_nids;
2207
2208	/* Configure GPIO0 as EAPD output */
2209	snd_hda_codec_write(codec, codec->afg, 0,
2210			    AC_VERB_SET_GPIO_DIRECTION, 0x00000001);
2211	/* Configure GPIO0 as CMOS */
2212	snd_hda_codec_write(codec, codec->afg, 0, 0x7e7, 0x00000000);
2213	/* Assert GPIO0 high */
2214	snd_hda_codec_write(codec, codec->afg, 0,
2215			    AC_VERB_SET_GPIO_DATA, 0x00000001);
2216	/* Enable GPIO0 */
2217	snd_hda_codec_write(codec, codec->afg, 0,
2218			    AC_VERB_SET_GPIO_MASK, 0x00000001);
2219
2220	err = stac92xx_parse_auto_config(codec, 0x1f, 0x20);
2221	if (!err) {
2222		if (spec->board_config < 0) {
2223			printk(KERN_WARNING "hda_codec: No auto-config is "
2224			       "available, default to model=ref\n");
2225			spec->board_config = STAC_9205_REF;
2226			goto again;
2227		}
2228		err = -EINVAL;
2229	}
2230	if (err < 0) {
2231		stac92xx_free(codec);
2232		return err;
2233	}
2234
2235	codec->patch_ops = stac92xx_patch_ops;
2236
2237	return 0;
2238}
2239
2240/*
2241 * STAC9872 hack
2242 */
2243
2244/* static config for Sony VAIO FE550G and Sony VAIO AR */
2245static hda_nid_t vaio_dacs[] = { 0x2 };
2246#define VAIO_HP_DAC	0x5
2247static hda_nid_t vaio_adcs[] = { 0x8 /*,0x6*/ };
2248static hda_nid_t vaio_mux_nids[] = { 0x15 };
2249
2250static struct hda_input_mux vaio_mux = {
2251	.num_items = 2,
2252	.items = {
2253		/* { "HP", 0x0 }, */
2254		{ "Line", 0x1 },
2255		{ "Mic", 0x2 },
2256		{ "PCM", 0x3 },
2257	}
2258};
2259
2260static struct hda_verb vaio_init[] = {
2261	{0x0a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP <- 0x2 */
2262	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Speaker <- 0x5 */
2263	{0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? (<- 0x2) */
2264	{0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD */
2265	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? */
2266	{0x15, AC_VERB_SET_CONNECT_SEL, 0x2}, /* mic-sel: 0a,0d,14,02 */
2267	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* HP */
2268	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Speaker */
2269	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* capture sw/vol -> 0x8 */
2270	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, /* CD-in -> 0x6 */
2271	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
2272	{}
2273};
2274
2275static struct hda_verb vaio_ar_init[] = {
2276	{0x0a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP <- 0x2 */
2277	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Speaker <- 0x5 */
2278	{0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? (<- 0x2) */
2279	{0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD */
2280/*	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },*/ /* Optical Out */
2281	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Mic? */
2282	{0x15, AC_VERB_SET_CONNECT_SEL, 0x2}, /* mic-sel: 0a,0d,14,02 */
2283	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* HP */
2284	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Speaker */
2285/*	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},*/ /* Optical Out */
2286	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* capture sw/vol -> 0x8 */
2287	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, /* CD-in -> 0x6 */
2288	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
2289	{}
2290};
2291
2292/* bind volumes of both NID 0x02 and 0x05 */
2293static int vaio_master_vol_put(struct snd_kcontrol *kcontrol,
2294			       struct snd_ctl_elem_value *ucontrol)
2295{
2296	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2297	long *valp = ucontrol->value.integer.value;
2298	int change;
2299
2300	change = snd_hda_codec_amp_update(codec, 0x02, 0, HDA_OUTPUT, 0,
2301					  0x7f, valp[0] & 0x7f);
2302	change |= snd_hda_codec_amp_update(codec, 0x02, 1, HDA_OUTPUT, 0,
2303					   0x7f, valp[1] & 0x7f);
2304	snd_hda_codec_amp_update(codec, 0x05, 0, HDA_OUTPUT, 0,
2305				 0x7f, valp[0] & 0x7f);
2306	snd_hda_codec_amp_update(codec, 0x05, 1, HDA_OUTPUT, 0,
2307				 0x7f, valp[1] & 0x7f);
2308	return change;
2309}
2310
2311/* bind volumes of both NID 0x02 and 0x05 */
2312static int vaio_master_sw_put(struct snd_kcontrol *kcontrol,
2313			      struct snd_ctl_elem_value *ucontrol)
2314{
2315	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2316	long *valp = ucontrol->value.integer.value;
2317	int change;
2318
2319	change = snd_hda_codec_amp_update(codec, 0x02, 0, HDA_OUTPUT, 0,
2320					  0x80, (valp[0] ? 0 : 0x80));
2321	change |= snd_hda_codec_amp_update(codec, 0x02, 1, HDA_OUTPUT, 0,
2322					   0x80, (valp[1] ? 0 : 0x80));
2323	snd_hda_codec_amp_update(codec, 0x05, 0, HDA_OUTPUT, 0,
2324				 0x80, (valp[0] ? 0 : 0x80));
2325	snd_hda_codec_amp_update(codec, 0x05, 1, HDA_OUTPUT, 0,
2326				 0x80, (valp[1] ? 0 : 0x80));
2327	return change;
2328}
2329
2330static struct snd_kcontrol_new vaio_mixer[] = {
2331	{
2332		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2333		.name = "Master Playback Volume",
2334		.info = snd_hda_mixer_amp_volume_info,
2335		.get = snd_hda_mixer_amp_volume_get,
2336		.put = vaio_master_vol_put,
2337		.tlv = { .c = snd_hda_mixer_amp_tlv },
2338		.private_value = HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
2339	},
2340	{
2341		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2342		.name = "Master Playback Switch",
2343		.info = snd_hda_mixer_amp_switch_info,
2344		.get = snd_hda_mixer_amp_switch_get,
2345		.put = vaio_master_sw_put,
2346		.private_value = HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
2347	},
2348	/* HDA_CODEC_VOLUME("CD Capture Volume", 0x07, 0, HDA_INPUT), */
2349	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT),
2350	HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT),
2351	{
2352		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2353		.name = "Capture Source",
2354		.count = 1,
2355		.info = stac92xx_mux_enum_info,
2356		.get = stac92xx_mux_enum_get,
2357		.put = stac92xx_mux_enum_put,
2358	},
2359	{}
2360};
2361
2362static struct snd_kcontrol_new vaio_ar_mixer[] = {
2363	{
2364		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2365		.name = "Master Playback Volume",
2366		.info = snd_hda_mixer_amp_volume_info,
2367		.get = snd_hda_mixer_amp_volume_get,
2368		.put = vaio_master_vol_put,
2369		.private_value = HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
2370	},
2371	{
2372		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2373		.name = "Master Playback Switch",
2374		.info = snd_hda_mixer_amp_switch_info,
2375		.get = snd_hda_mixer_amp_switch_get,
2376		.put = vaio_master_sw_put,
2377		.private_value = HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
2378	},
2379	/* HDA_CODEC_VOLUME("CD Capture Volume", 0x07, 0, HDA_INPUT), */
2380	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT),
2381	HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT),
2382	/*HDA_CODEC_MUTE("Optical Out Switch", 0x10, 0, HDA_OUTPUT),
2383	HDA_CODEC_VOLUME("Optical Out Volume", 0x10, 0, HDA_OUTPUT),*/
2384	{
2385		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2386		.name = "Capture Source",
2387		.count = 1,
2388		.info = stac92xx_mux_enum_info,
2389		.get = stac92xx_mux_enum_get,
2390		.put = stac92xx_mux_enum_put,
2391	},
2392	{}
2393};
2394
2395static struct hda_codec_ops stac9872_patch_ops = {
2396	.build_controls = stac92xx_build_controls,
2397	.build_pcms = stac92xx_build_pcms,
2398	.init = stac92xx_init,
2399	.free = stac92xx_free,
2400#ifdef CONFIG_PM
2401	.resume = stac92xx_resume,
2402#endif
2403};
2404
2405enum { /* FE and SZ series. id=0x83847661 and subsys=0x104D0700 or 104D1000. */
2406       CXD9872RD_VAIO,
2407       /* Unknown. id=0x83847662 and subsys=0x104D1200 or 104D1000. */
2408       STAC9872AK_VAIO,
2409       /* Unknown. id=0x83847661 and subsys=0x104D1200. */
2410       STAC9872K_VAIO,
2411       /* AR Series. id=0x83847664 and subsys=104D1300 */
2412       CXD9872AKD_VAIO,
2413       STAC_9872_MODELS,
2414};
2415
2416static const char *stac9872_models[STAC_9872_MODELS] = {
2417	[CXD9872RD_VAIO]	= "vaio",
2418	[CXD9872AKD_VAIO]	= "vaio-ar",
2419};
2420
2421static struct snd_pci_quirk stac9872_cfg_tbl[] = {
2422	SND_PCI_QUIRK(0x104d, 0x81e6, "Sony VAIO F/S", CXD9872RD_VAIO),
2423	SND_PCI_QUIRK(0x104d, 0x81ef, "Sony VAIO F/S", CXD9872RD_VAIO),
2424	SND_PCI_QUIRK(0x104d, 0x81fd, "Sony VAIO AR", CXD9872AKD_VAIO),
2425	SND_PCI_QUIRK(0x104d, 0x8205, "Sony VAIO AR", CXD9872AKD_VAIO),
2426	{}
2427};
2428
2429static int patch_stac9872(struct hda_codec *codec)
2430{
2431	struct sigmatel_spec *spec;
2432	int board_config;
2433
2434	board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS,
2435						  stac9872_models,
2436						  stac9872_cfg_tbl);
2437	if (board_config < 0)
2438		/* unknown config, let generic-parser do its job... */
2439		return snd_hda_parse_generic_codec(codec);
2440
2441	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
2442	if (spec == NULL)
2443		return -ENOMEM;
2444
2445	codec->spec = spec;
2446	switch (board_config) {
2447	case CXD9872RD_VAIO:
2448	case STAC9872AK_VAIO:
2449	case STAC9872K_VAIO:
2450		spec->mixer = vaio_mixer;
2451		spec->init = vaio_init;
2452		spec->multiout.max_channels = 2;
2453		spec->multiout.num_dacs = ARRAY_SIZE(vaio_dacs);
2454		spec->multiout.dac_nids = vaio_dacs;
2455		spec->multiout.hp_nid = VAIO_HP_DAC;
2456		spec->num_adcs = ARRAY_SIZE(vaio_adcs);
2457		spec->adc_nids = vaio_adcs;
2458		spec->input_mux = &vaio_mux;
2459		spec->mux_nids = vaio_mux_nids;
2460		break;
2461
2462	case CXD9872AKD_VAIO:
2463		spec->mixer = vaio_ar_mixer;
2464		spec->init = vaio_ar_init;
2465		spec->multiout.max_channels = 2;
2466		spec->multiout.num_dacs = ARRAY_SIZE(vaio_dacs);
2467		spec->multiout.dac_nids = vaio_dacs;
2468		spec->multiout.hp_nid = VAIO_HP_DAC;
2469		spec->num_adcs = ARRAY_SIZE(vaio_adcs);
2470		spec->adc_nids = vaio_adcs;
2471		spec->input_mux = &vaio_mux;
2472		spec->mux_nids = vaio_mux_nids;
2473		break;
2474	}
2475
2476	codec->patch_ops = stac9872_patch_ops;
2477	return 0;
2478}
2479
2480
2481/*
2482 * patch entries
2483 */
2484struct hda_codec_preset snd_hda_preset_sigmatel[] = {
2485 	{ .id = 0x83847690, .name = "STAC9200", .patch = patch_stac9200 },
2486 	{ .id = 0x83847882, .name = "STAC9220 A1", .patch = patch_stac922x },
2487 	{ .id = 0x83847680, .name = "STAC9221 A1", .patch = patch_stac922x },
2488 	{ .id = 0x83847880, .name = "STAC9220 A2", .patch = patch_stac922x },
2489 	{ .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x },
2490 	{ .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x },
2491 	{ .id = 0x83847683, .name = "STAC9221D A2", .patch = patch_stac922x },
2492 	{ .id = 0x83847618, .name = "STAC9227", .patch = patch_stac927x },
2493 	{ .id = 0x83847619, .name = "STAC9227", .patch = patch_stac927x },
2494 	{ .id = 0x83847616, .name = "STAC9228", .patch = patch_stac927x },
2495 	{ .id = 0x83847617, .name = "STAC9228", .patch = patch_stac927x },
2496 	{ .id = 0x83847614, .name = "STAC9229", .patch = patch_stac927x },
2497 	{ .id = 0x83847615, .name = "STAC9229", .patch = patch_stac927x },
2498 	{ .id = 0x83847620, .name = "STAC9274", .patch = patch_stac927x },
2499 	{ .id = 0x83847621, .name = "STAC9274D", .patch = patch_stac927x },
2500 	{ .id = 0x83847622, .name = "STAC9273X", .patch = patch_stac927x },
2501 	{ .id = 0x83847623, .name = "STAC9273D", .patch = patch_stac927x },
2502 	{ .id = 0x83847624, .name = "STAC9272X", .patch = patch_stac927x },
2503 	{ .id = 0x83847625, .name = "STAC9272D", .patch = patch_stac927x },
2504 	{ .id = 0x83847626, .name = "STAC9271X", .patch = patch_stac927x },
2505 	{ .id = 0x83847627, .name = "STAC9271D", .patch = patch_stac927x },
2506 	{ .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x },
2507 	{ .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x },
2508	{ .id = 0x83847632, .name = "STAC9202",  .patch = patch_stac925x },
2509	{ .id = 0x83847633, .name = "STAC9202D", .patch = patch_stac925x },
2510	{ .id = 0x83847634, .name = "STAC9250", .patch = patch_stac925x },
2511	{ .id = 0x83847635, .name = "STAC9250D", .patch = patch_stac925x },
2512	{ .id = 0x83847636, .name = "STAC9251", .patch = patch_stac925x },
2513	{ .id = 0x83847637, .name = "STAC9250D", .patch = patch_stac925x },
2514 	/* The following does not take into account .id=0x83847661 when subsys =
2515 	 * 104D0C00 which is STAC9225s. Because of this, some SZ Notebooks are
2516 	 * currently not fully supported.
2517 	 */
2518 	{ .id = 0x83847661, .name = "CXD9872RD/K", .patch = patch_stac9872 },
2519 	{ .id = 0x83847662, .name = "STAC9872AK", .patch = patch_stac9872 },
2520 	{ .id = 0x83847664, .name = "CXD9872AKD", .patch = patch_stac9872 },
2521 	{ .id = 0x838476a0, .name = "STAC9205", .patch = patch_stac9205 },
2522 	{ .id = 0x838476a1, .name = "STAC9205D", .patch = patch_stac9205 },
2523 	{ .id = 0x838476a2, .name = "STAC9204", .patch = patch_stac9205 },
2524 	{ .id = 0x838476a3, .name = "STAC9204D", .patch = patch_stac9205 },
2525 	{ .id = 0x838476a4, .name = "STAC9255", .patch = patch_stac9205 },
2526 	{ .id = 0x838476a5, .name = "STAC9255D", .patch = patch_stac9205 },
2527 	{ .id = 0x838476a6, .name = "STAC9254", .patch = patch_stac9205 },
2528 	{ .id = 0x838476a7, .name = "STAC9254D", .patch = patch_stac9205 },
2529	{} /* terminator */
2530};
2531