xref: /linux/sound/pci/ice1712/prodigy_hifi.c (revision f49f4ab95c301dbccad0efe85296d908b8ae7ad4)
1 /*
2  *   ALSA driver for ICEnsemble VT1724 (Envy24HT)
3  *
4  *   Lowlevel functions for Audiotrak Prodigy 7.1 Hifi
5  *   based on pontis.c
6  *
7  *      Copyright (c) 2007 Julian Scheel <julian@jusst.de>
8  *      Copyright (c) 2007 allank
9  *      Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
10  *
11  *   This program is free software; you can redistribute it and/or modify
12  *   it under the terms of the GNU General Public License as published by
13  *   the Free Software Foundation; either version 2 of the License, or
14  *   (at your option) any later version.
15  *
16  *   This program is distributed in the hope that it will be useful,
17  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  *   GNU General Public License for more details.
20  *
21  *   You should have received a copy of the GNU General Public License
22  *   along with this program; if not, write to the Free Software
23  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
24  *
25  */
26 
27 
28 #include <asm/io.h>
29 #include <linux/delay.h>
30 #include <linux/interrupt.h>
31 #include <linux/init.h>
32 #include <linux/slab.h>
33 #include <linux/mutex.h>
34 
35 #include <sound/core.h>
36 #include <sound/info.h>
37 #include <sound/tlv.h>
38 
39 #include "ice1712.h"
40 #include "envy24ht.h"
41 #include "prodigy_hifi.h"
42 
43 struct prodigy_hifi_spec {
44 	unsigned short master[2];
45 	unsigned short vol[8];
46 };
47 
48 /* I2C addresses */
49 #define WM_DEV		0x34
50 
51 /* WM8776 registers */
52 #define WM_HP_ATTEN_L		0x00	/* headphone left attenuation */
53 #define WM_HP_ATTEN_R		0x01	/* headphone left attenuation */
54 #define WM_HP_MASTER		0x02	/* headphone master (both channels),
55 						override LLR */
56 #define WM_DAC_ATTEN_L		0x03	/* digital left attenuation */
57 #define WM_DAC_ATTEN_R		0x04
58 #define WM_DAC_MASTER		0x05
59 #define WM_PHASE_SWAP		0x06	/* DAC phase swap */
60 #define WM_DAC_CTRL1		0x07
61 #define WM_DAC_MUTE		0x08
62 #define WM_DAC_CTRL2		0x09
63 #define WM_DAC_INT		0x0a
64 #define WM_ADC_INT		0x0b
65 #define WM_MASTER_CTRL		0x0c
66 #define WM_POWERDOWN		0x0d
67 #define WM_ADC_ATTEN_L		0x0e
68 #define WM_ADC_ATTEN_R		0x0f
69 #define WM_ALC_CTRL1		0x10
70 #define WM_ALC_CTRL2		0x11
71 #define WM_ALC_CTRL3		0x12
72 #define WM_NOISE_GATE		0x13
73 #define WM_LIMITER		0x14
74 #define WM_ADC_MUX		0x15
75 #define WM_OUT_MUX		0x16
76 #define WM_RESET		0x17
77 
78 /* Analog Recording Source :- Mic, LineIn, CD/Video, */
79 
80 /* implement capture source select control for WM8776 */
81 
82 #define WM_AIN1 "AIN1"
83 #define WM_AIN2 "AIN2"
84 #define WM_AIN3 "AIN3"
85 #define WM_AIN4 "AIN4"
86 #define WM_AIN5 "AIN5"
87 
88 /* GPIO pins of envy24ht connected to wm8766 */
89 #define WM8766_SPI_CLK	 (1<<17) /* CLK, Pin97 on ICE1724 */
90 #define WM8766_SPI_MD	  (1<<16) /* DATA VT1724 -> WM8766, Pin96 */
91 #define WM8766_SPI_ML	  (1<<18) /* Latch, Pin98 */
92 
93 /* WM8766 registers */
94 #define WM8766_DAC_CTRL	 0x02   /* DAC Control */
95 #define WM8766_INT_CTRL	 0x03   /* Interface Control */
96 #define WM8766_DAC_CTRL2	0x09
97 #define WM8766_DAC_CTRL3	0x0a
98 #define WM8766_RESET	    0x1f
99 #define WM8766_LDA1	     0x00
100 #define WM8766_LDA2	     0x04
101 #define WM8766_LDA3	     0x06
102 #define WM8766_RDA1	     0x01
103 #define WM8766_RDA2	     0x05
104 #define WM8766_RDA3	     0x07
105 #define WM8766_MUTE1	    0x0C
106 #define WM8766_MUTE2	    0x0F
107 
108 
109 /*
110  * Prodigy HD2
111  */
112 #define AK4396_ADDR    0x00
113 #define AK4396_CSN    (1 << 8)    /* CSN->GPIO8, pin 75 */
114 #define AK4396_CCLK   (1 << 9)    /* CCLK->GPIO9, pin 76 */
115 #define AK4396_CDTI   (1 << 10)   /* CDTI->GPIO10, pin 77 */
116 
117 /* ak4396 registers */
118 #define AK4396_CTRL1	    0x00
119 #define AK4396_CTRL2	    0x01
120 #define AK4396_CTRL3	    0x02
121 #define AK4396_LCH_ATT	  0x03
122 #define AK4396_RCH_ATT	  0x04
123 
124 
125 /*
126  * get the current register value of WM codec
127  */
128 static unsigned short wm_get(struct snd_ice1712 *ice, int reg)
129 {
130 	reg <<= 1;
131 	return ((unsigned short)ice->akm[0].images[reg] << 8) |
132 		ice->akm[0].images[reg + 1];
133 }
134 
135 /*
136  * set the register value of WM codec and remember it
137  */
138 static void wm_put_nocache(struct snd_ice1712 *ice, int reg, unsigned short val)
139 {
140 	unsigned short cval;
141 	cval = (reg << 9) | val;
142 	snd_vt1724_write_i2c(ice, WM_DEV, cval >> 8, cval & 0xff);
143 }
144 
145 static void wm_put(struct snd_ice1712 *ice, int reg, unsigned short val)
146 {
147 	wm_put_nocache(ice, reg, val);
148 	reg <<= 1;
149 	ice->akm[0].images[reg] = val >> 8;
150 	ice->akm[0].images[reg + 1] = val;
151 }
152 
153 /*
154  * write data in the SPI mode
155  */
156 
157 static void set_gpio_bit(struct snd_ice1712 *ice, unsigned int bit, int val)
158 {
159 	unsigned int tmp = snd_ice1712_gpio_read(ice);
160 	if (val)
161 		tmp |= bit;
162 	else
163 		tmp &= ~bit;
164 	snd_ice1712_gpio_write(ice, tmp);
165 }
166 
167 /*
168  * SPI implementation for WM8766 codec - only writing supported, no readback
169  */
170 
171 static void wm8766_spi_send_word(struct snd_ice1712 *ice, unsigned int data)
172 {
173 	int i;
174 	for (i = 0; i < 16; i++) {
175 		set_gpio_bit(ice, WM8766_SPI_CLK, 0);
176 		udelay(1);
177 		set_gpio_bit(ice, WM8766_SPI_MD, data & 0x8000);
178 		udelay(1);
179 		set_gpio_bit(ice, WM8766_SPI_CLK, 1);
180 		udelay(1);
181 		data <<= 1;
182 	}
183 }
184 
185 static void wm8766_spi_write(struct snd_ice1712 *ice, unsigned int reg,
186 			     unsigned int data)
187 {
188 	unsigned int block;
189 
190 	snd_ice1712_gpio_set_dir(ice, WM8766_SPI_MD|
191 					WM8766_SPI_CLK|WM8766_SPI_ML);
192 	snd_ice1712_gpio_set_mask(ice, ~(WM8766_SPI_MD|
193 					WM8766_SPI_CLK|WM8766_SPI_ML));
194 	/* latch must be low when writing */
195 	set_gpio_bit(ice, WM8766_SPI_ML, 0);
196 	block = (reg << 9) | (data & 0x1ff);
197 	wm8766_spi_send_word(ice, block); /* REGISTER ADDRESS */
198 	/* release latch */
199 	set_gpio_bit(ice, WM8766_SPI_ML, 1);
200 	udelay(1);
201 	/* restore */
202 	snd_ice1712_gpio_set_mask(ice, ice->gpio.write_mask);
203 	snd_ice1712_gpio_set_dir(ice, ice->gpio.direction);
204 }
205 
206 
207 /*
208  * serial interface for ak4396 - only writing supported, no readback
209  */
210 
211 static void ak4396_send_word(struct snd_ice1712 *ice, unsigned int data)
212 {
213 	int i;
214 	for (i = 0; i < 16; i++) {
215 		set_gpio_bit(ice, AK4396_CCLK, 0);
216 		udelay(1);
217 		set_gpio_bit(ice, AK4396_CDTI, data & 0x8000);
218 		udelay(1);
219 		set_gpio_bit(ice, AK4396_CCLK, 1);
220 		udelay(1);
221 		data <<= 1;
222 	}
223 }
224 
225 static void ak4396_write(struct snd_ice1712 *ice, unsigned int reg,
226 			 unsigned int data)
227 {
228 	unsigned int block;
229 
230 	snd_ice1712_gpio_set_dir(ice, AK4396_CSN|AK4396_CCLK|AK4396_CDTI);
231 	snd_ice1712_gpio_set_mask(ice, ~(AK4396_CSN|AK4396_CCLK|AK4396_CDTI));
232 	/* latch must be low when writing */
233 	set_gpio_bit(ice, AK4396_CSN, 0);
234 	block =  ((AK4396_ADDR & 0x03) << 14) | (1 << 13) |
235 			((reg & 0x1f) << 8) | (data & 0xff);
236 	ak4396_send_word(ice, block); /* REGISTER ADDRESS */
237 	/* release latch */
238 	set_gpio_bit(ice, AK4396_CSN, 1);
239 	udelay(1);
240 	/* restore */
241 	snd_ice1712_gpio_set_mask(ice, ice->gpio.write_mask);
242 	snd_ice1712_gpio_set_dir(ice, ice->gpio.direction);
243 }
244 
245 
246 /*
247  * ak4396 mixers
248  */
249 
250 
251 
252 /*
253  * DAC volume attenuation mixer control (-64dB to 0dB)
254  */
255 
256 static int ak4396_dac_vol_info(struct snd_kcontrol *kcontrol,
257 			       struct snd_ctl_elem_info *uinfo)
258 {
259 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
260 	uinfo->count = 2;
261 	uinfo->value.integer.min = 0;   /* mute */
262 	uinfo->value.integer.max = 0xFF; /* linear */
263 	return 0;
264 }
265 
266 static int ak4396_dac_vol_get(struct snd_kcontrol *kcontrol,
267 			      struct snd_ctl_elem_value *ucontrol)
268 {
269 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
270 	struct prodigy_hifi_spec *spec = ice->spec;
271 	int i;
272 
273 	for (i = 0; i < 2; i++)
274 		ucontrol->value.integer.value[i] = spec->vol[i];
275 
276 	return 0;
277 }
278 
279 static int ak4396_dac_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
280 {
281 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
282 	struct prodigy_hifi_spec *spec = ice->spec;
283 	int i;
284 	int change = 0;
285 
286 	mutex_lock(&ice->gpio_mutex);
287 	for (i = 0; i < 2; i++) {
288 		if (ucontrol->value.integer.value[i] != spec->vol[i]) {
289 			spec->vol[i] = ucontrol->value.integer.value[i];
290 			ak4396_write(ice, AK4396_LCH_ATT + i,
291 				     spec->vol[i] & 0xff);
292 			change = 1;
293 		}
294 	}
295 	mutex_unlock(&ice->gpio_mutex);
296 	return change;
297 }
298 
299 static const DECLARE_TLV_DB_SCALE(db_scale_wm_dac, -12700, 100, 1);
300 static const DECLARE_TLV_DB_LINEAR(ak4396_db_scale, TLV_DB_GAIN_MUTE, 0);
301 
302 static struct snd_kcontrol_new prodigy_hd2_controls[] __devinitdata = {
303     {
304 	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
305 	.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
306 		SNDRV_CTL_ELEM_ACCESS_TLV_READ),
307 	.name = "Front Playback Volume",
308 	.info = ak4396_dac_vol_info,
309 	.get = ak4396_dac_vol_get,
310 	.put = ak4396_dac_vol_put,
311 	.tlv = { .p = ak4396_db_scale },
312     },
313 };
314 
315 
316 /* --------------- */
317 
318 /*
319  * Logarithmic volume values for WM87*6
320  * Computed as 20 * Log10(255 / x)
321  */
322 static const unsigned char wm_vol[256] = {
323 	127, 48, 42, 39, 36, 34, 33, 31, 30, 29, 28, 27, 27, 26, 25, 25, 24, 24, 23,
324 	23, 22, 22, 21, 21, 21, 20, 20, 20, 19, 19, 19, 18, 18, 18, 18, 17, 17, 17,
325 	17, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 13,
326 	13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11,
327 	11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8,
328 	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6,
329 	6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
330 	5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3,
331 	3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
332 	2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
333 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
334 	0, 0
335 };
336 
337 #define WM_VOL_MAX	(sizeof(wm_vol) - 1)
338 #define WM_VOL_MUTE	0x8000
339 
340 
341 #define DAC_0dB	0xff
342 #define DAC_RES	128
343 #define DAC_MIN	(DAC_0dB - DAC_RES)
344 
345 
346 static void wm_set_vol(struct snd_ice1712 *ice, unsigned int index,
347 		       unsigned short vol, unsigned short master)
348 {
349 	unsigned char nvol;
350 
351 	if ((master & WM_VOL_MUTE) || (vol & WM_VOL_MUTE))
352 		nvol = 0;
353 	else {
354 		nvol = (((vol & ~WM_VOL_MUTE) * (master & ~WM_VOL_MUTE)) / 128)
355 				& WM_VOL_MAX;
356 		nvol = (nvol ? (nvol + DAC_MIN) : 0) & 0xff;
357 	}
358 
359 	wm_put(ice, index, nvol);
360 	wm_put_nocache(ice, index, 0x100 | nvol);
361 }
362 
363 static void wm8766_set_vol(struct snd_ice1712 *ice, unsigned int index,
364 			   unsigned short vol, unsigned short master)
365 {
366 	unsigned char nvol;
367 
368 	if ((master & WM_VOL_MUTE) || (vol & WM_VOL_MUTE))
369 		nvol = 0;
370 	else {
371 		nvol = (((vol & ~WM_VOL_MUTE) * (master & ~WM_VOL_MUTE)) / 128)
372 				& WM_VOL_MAX;
373 		nvol = (nvol ? (nvol + DAC_MIN) : 0) & 0xff;
374 	}
375 
376 	wm8766_spi_write(ice, index, (0x0100 | nvol));
377 }
378 
379 
380 /*
381  * DAC volume attenuation mixer control (-64dB to 0dB)
382  */
383 
384 static int wm_dac_vol_info(struct snd_kcontrol *kcontrol,
385 			   struct snd_ctl_elem_info *uinfo)
386 {
387 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
388 	uinfo->count = 2;
389 	uinfo->value.integer.min = 0;	/* mute */
390 	uinfo->value.integer.max = DAC_RES;	/* 0dB, 0.5dB step */
391 	return 0;
392 }
393 
394 static int wm_dac_vol_get(struct snd_kcontrol *kcontrol,
395 			  struct snd_ctl_elem_value *ucontrol)
396 {
397 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
398 	struct prodigy_hifi_spec *spec = ice->spec;
399 	int i;
400 
401 	for (i = 0; i < 2; i++)
402 		ucontrol->value.integer.value[i] =
403 			spec->vol[2 + i] & ~WM_VOL_MUTE;
404 	return 0;
405 }
406 
407 static int wm_dac_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
408 {
409 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
410 	struct prodigy_hifi_spec *spec = ice->spec;
411 	int i, idx, change = 0;
412 
413 	mutex_lock(&ice->gpio_mutex);
414 	for (i = 0; i < 2; i++) {
415 		if (ucontrol->value.integer.value[i] != spec->vol[2 + i]) {
416 			idx = WM_DAC_ATTEN_L + i;
417 			spec->vol[2 + i] &= WM_VOL_MUTE;
418 			spec->vol[2 + i] |= ucontrol->value.integer.value[i];
419 			wm_set_vol(ice, idx, spec->vol[2 + i], spec->master[i]);
420 			change = 1;
421 		}
422 	}
423 	mutex_unlock(&ice->gpio_mutex);
424 	return change;
425 }
426 
427 
428 /*
429  * WM8766 DAC volume attenuation mixer control
430  */
431 static int wm8766_vol_info(struct snd_kcontrol *kcontrol,
432 			   struct snd_ctl_elem_info *uinfo)
433 {
434 	int voices = kcontrol->private_value >> 8;
435 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
436 	uinfo->count = voices;
437 	uinfo->value.integer.min = 0;		/* mute */
438 	uinfo->value.integer.max = DAC_RES;	/* 0dB */
439 	return 0;
440 }
441 
442 static int wm8766_vol_get(struct snd_kcontrol *kcontrol,
443 			  struct snd_ctl_elem_value *ucontrol)
444 {
445 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
446 	struct prodigy_hifi_spec *spec = ice->spec;
447 	int i, ofs, voices;
448 
449 	voices = kcontrol->private_value >> 8;
450 	ofs = kcontrol->private_value & 0xff;
451 	for (i = 0; i < voices; i++)
452 		ucontrol->value.integer.value[i] = spec->vol[ofs + i];
453 	return 0;
454 }
455 
456 static int wm8766_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
457 {
458 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
459 	struct prodigy_hifi_spec *spec = ice->spec;
460 	int i, idx, ofs, voices;
461 	int change = 0;
462 
463 	voices = kcontrol->private_value >> 8;
464 	ofs = kcontrol->private_value & 0xff;
465 	mutex_lock(&ice->gpio_mutex);
466 	for (i = 0; i < voices; i++) {
467 		if (ucontrol->value.integer.value[i] != spec->vol[ofs + i]) {
468 			idx = WM8766_LDA1 + ofs + i;
469 			spec->vol[ofs + i] &= WM_VOL_MUTE;
470 			spec->vol[ofs + i] |= ucontrol->value.integer.value[i];
471 			wm8766_set_vol(ice, idx,
472 				       spec->vol[ofs + i], spec->master[i]);
473 			change = 1;
474 		}
475 	}
476 	mutex_unlock(&ice->gpio_mutex);
477 	return change;
478 }
479 
480 /*
481  * Master volume attenuation mixer control / applied to WM8776+WM8766
482  */
483 static int wm_master_vol_info(struct snd_kcontrol *kcontrol,
484 			      struct snd_ctl_elem_info *uinfo)
485 {
486 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
487 	uinfo->count = 2;
488 	uinfo->value.integer.min = 0;
489 	uinfo->value.integer.max = DAC_RES;
490 	return 0;
491 }
492 
493 static int wm_master_vol_get(struct snd_kcontrol *kcontrol,
494 			     struct snd_ctl_elem_value *ucontrol)
495 {
496 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
497 	struct prodigy_hifi_spec *spec = ice->spec;
498 	int i;
499 	for (i = 0; i < 2; i++)
500 		ucontrol->value.integer.value[i] = spec->master[i];
501 	return 0;
502 }
503 
504 static int wm_master_vol_put(struct snd_kcontrol *kcontrol,
505 			     struct snd_ctl_elem_value *ucontrol)
506 {
507 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
508 	struct prodigy_hifi_spec *spec = ice->spec;
509 	int ch, change = 0;
510 
511 	mutex_lock(&ice->gpio_mutex);
512 	for (ch = 0; ch < 2; ch++) {
513 		if (ucontrol->value.integer.value[ch] != spec->master[ch]) {
514 			spec->master[ch] = ucontrol->value.integer.value[ch];
515 
516 			/* Apply to front DAC */
517 			wm_set_vol(ice, WM_DAC_ATTEN_L + ch,
518 				   spec->vol[2 + ch], spec->master[ch]);
519 
520 			wm8766_set_vol(ice, WM8766_LDA1 + ch,
521 				       spec->vol[0 + ch], spec->master[ch]);
522 
523 			wm8766_set_vol(ice, WM8766_LDA2 + ch,
524 				       spec->vol[4 + ch], spec->master[ch]);
525 
526 			wm8766_set_vol(ice, WM8766_LDA3 + ch,
527 				       spec->vol[6 + ch], spec->master[ch]);
528 			change = 1;
529 		}
530 	}
531 	mutex_unlock(&ice->gpio_mutex);
532 	return change;
533 }
534 
535 
536 /* KONSTI */
537 
538 static int wm_adc_mux_enum_info(struct snd_kcontrol *kcontrol,
539 				struct snd_ctl_elem_info *uinfo)
540 {
541 	static char* texts[32] = {
542 		"NULL", WM_AIN1, WM_AIN2, WM_AIN1 "+" WM_AIN2,
543 		WM_AIN3, WM_AIN1 "+" WM_AIN3, WM_AIN2 "+" WM_AIN3,
544 		WM_AIN1 "+" WM_AIN2 "+" WM_AIN3,
545 		WM_AIN4, WM_AIN1 "+" WM_AIN4, WM_AIN2 "+" WM_AIN4,
546 		WM_AIN1 "+" WM_AIN2 "+" WM_AIN4,
547 		WM_AIN3 "+" WM_AIN4, WM_AIN1 "+" WM_AIN3 "+" WM_AIN4,
548 		WM_AIN2 "+" WM_AIN3 "+" WM_AIN4,
549 		WM_AIN1 "+" WM_AIN2 "+" WM_AIN3 "+" WM_AIN4,
550 		WM_AIN5, WM_AIN1 "+" WM_AIN5, WM_AIN2 "+" WM_AIN5,
551 		WM_AIN1 "+" WM_AIN2 "+" WM_AIN5,
552 		WM_AIN3 "+" WM_AIN5, WM_AIN1 "+" WM_AIN3 "+" WM_AIN5,
553 		WM_AIN2 "+" WM_AIN3 "+" WM_AIN5,
554 		WM_AIN1 "+" WM_AIN2 "+" WM_AIN3 "+" WM_AIN5,
555 		WM_AIN4 "+" WM_AIN5, WM_AIN1 "+" WM_AIN4 "+" WM_AIN5,
556 		WM_AIN2 "+" WM_AIN4 "+" WM_AIN5,
557 		WM_AIN1 "+" WM_AIN2 "+" WM_AIN4 "+" WM_AIN5,
558 		WM_AIN3 "+" WM_AIN4 "+" WM_AIN5,
559 		WM_AIN1 "+" WM_AIN3 "+" WM_AIN4 "+" WM_AIN5,
560 		WM_AIN2 "+" WM_AIN3 "+" WM_AIN4 "+" WM_AIN5,
561 		WM_AIN1 "+" WM_AIN2 "+" WM_AIN3 "+" WM_AIN4 "+" WM_AIN5
562 	};
563 
564 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
565 	uinfo->count = 1;
566 	uinfo->value.enumerated.items = 32;
567 	if (uinfo->value.enumerated.item > 31)
568 		uinfo->value.enumerated.item = 31;
569 	strcpy(uinfo->value.enumerated.name,
570 	       texts[uinfo->value.enumerated.item]);
571 	return 0;
572 }
573 
574 static int wm_adc_mux_enum_get(struct snd_kcontrol *kcontrol,
575 			       struct snd_ctl_elem_value *ucontrol)
576 {
577 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
578 
579 	mutex_lock(&ice->gpio_mutex);
580 	ucontrol->value.integer.value[0] = wm_get(ice, WM_ADC_MUX) & 0x1f;
581 	mutex_unlock(&ice->gpio_mutex);
582 	return 0;
583 }
584 
585 static int wm_adc_mux_enum_put(struct snd_kcontrol *kcontrol,
586 			       struct snd_ctl_elem_value *ucontrol)
587 {
588 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
589 	unsigned short oval, nval;
590 	int change = 0;
591 
592 	mutex_lock(&ice->gpio_mutex);
593 	oval = wm_get(ice, WM_ADC_MUX);
594 	nval = (oval & 0xe0) | ucontrol->value.integer.value[0];
595 	if (nval != oval) {
596 		wm_put(ice, WM_ADC_MUX, nval);
597 		change = 1;
598 	}
599 	mutex_unlock(&ice->gpio_mutex);
600 	return change;
601 }
602 
603 /* KONSTI */
604 
605 /*
606  * ADC gain mixer control (-64dB to 0dB)
607  */
608 
609 #define ADC_0dB	0xcf
610 #define ADC_RES	128
611 #define ADC_MIN	(ADC_0dB - ADC_RES)
612 
613 static int wm_adc_vol_info(struct snd_kcontrol *kcontrol,
614 			   struct snd_ctl_elem_info *uinfo)
615 {
616 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
617 	uinfo->count = 2;
618 	uinfo->value.integer.min = 0;	/* mute (-64dB) */
619 	uinfo->value.integer.max = ADC_RES;	/* 0dB, 0.5dB step */
620 	return 0;
621 }
622 
623 static int wm_adc_vol_get(struct snd_kcontrol *kcontrol,
624 			  struct snd_ctl_elem_value *ucontrol)
625 {
626 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
627 	unsigned short val;
628 	int i;
629 
630 	mutex_lock(&ice->gpio_mutex);
631 	for (i = 0; i < 2; i++) {
632 		val = wm_get(ice, WM_ADC_ATTEN_L + i) & 0xff;
633 		val = val > ADC_MIN ? (val - ADC_MIN) : 0;
634 		ucontrol->value.integer.value[i] = val;
635 	}
636 	mutex_unlock(&ice->gpio_mutex);
637 	return 0;
638 }
639 
640 static int wm_adc_vol_put(struct snd_kcontrol *kcontrol,
641 			  struct snd_ctl_elem_value *ucontrol)
642 {
643 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
644 	unsigned short ovol, nvol;
645 	int i, idx, change = 0;
646 
647 	mutex_lock(&ice->gpio_mutex);
648 	for (i = 0; i < 2; i++) {
649 		nvol = ucontrol->value.integer.value[i];
650 		nvol = nvol ? (nvol + ADC_MIN) : 0;
651 		idx  = WM_ADC_ATTEN_L + i;
652 		ovol = wm_get(ice, idx) & 0xff;
653 		if (ovol != nvol) {
654 			wm_put(ice, idx, nvol);
655 			change = 1;
656 		}
657 	}
658 	mutex_unlock(&ice->gpio_mutex);
659 	return change;
660 }
661 
662 /*
663  * ADC input mux mixer control
664  */
665 #define wm_adc_mux_info		snd_ctl_boolean_mono_info
666 
667 static int wm_adc_mux_get(struct snd_kcontrol *kcontrol,
668 			  struct snd_ctl_elem_value *ucontrol)
669 {
670 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
671 	int bit = kcontrol->private_value;
672 
673 	mutex_lock(&ice->gpio_mutex);
674 	ucontrol->value.integer.value[0] =
675 		(wm_get(ice, WM_ADC_MUX) & (1 << bit)) ? 1 : 0;
676 	mutex_unlock(&ice->gpio_mutex);
677 	return 0;
678 }
679 
680 static int wm_adc_mux_put(struct snd_kcontrol *kcontrol,
681 			  struct snd_ctl_elem_value *ucontrol)
682 {
683 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
684 	int bit = kcontrol->private_value;
685 	unsigned short oval, nval;
686 	int change;
687 
688 	mutex_lock(&ice->gpio_mutex);
689 	nval = oval = wm_get(ice, WM_ADC_MUX);
690 	if (ucontrol->value.integer.value[0])
691 		nval |= (1 << bit);
692 	else
693 		nval &= ~(1 << bit);
694 	change = nval != oval;
695 	if (change) {
696 		wm_put(ice, WM_ADC_MUX, nval);
697 	}
698 	mutex_unlock(&ice->gpio_mutex);
699 	return 0;
700 }
701 
702 /*
703  * Analog bypass (In -> Out)
704  */
705 #define wm_bypass_info		snd_ctl_boolean_mono_info
706 
707 static int wm_bypass_get(struct snd_kcontrol *kcontrol,
708 			 struct snd_ctl_elem_value *ucontrol)
709 {
710 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
711 
712 	mutex_lock(&ice->gpio_mutex);
713 	ucontrol->value.integer.value[0] =
714 		(wm_get(ice, WM_OUT_MUX) & 0x04) ? 1 : 0;
715 	mutex_unlock(&ice->gpio_mutex);
716 	return 0;
717 }
718 
719 static int wm_bypass_put(struct snd_kcontrol *kcontrol,
720 			 struct snd_ctl_elem_value *ucontrol)
721 {
722 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
723 	unsigned short val, oval;
724 	int change = 0;
725 
726 	mutex_lock(&ice->gpio_mutex);
727 	val = oval = wm_get(ice, WM_OUT_MUX);
728 	if (ucontrol->value.integer.value[0])
729 		val |= 0x04;
730 	else
731 		val &= ~0x04;
732 	if (val != oval) {
733 		wm_put(ice, WM_OUT_MUX, val);
734 		change = 1;
735 	}
736 	mutex_unlock(&ice->gpio_mutex);
737 	return change;
738 }
739 
740 /*
741  * Left/Right swap
742  */
743 #define wm_chswap_info		snd_ctl_boolean_mono_info
744 
745 static int wm_chswap_get(struct snd_kcontrol *kcontrol,
746 			 struct snd_ctl_elem_value *ucontrol)
747 {
748 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
749 
750 	mutex_lock(&ice->gpio_mutex);
751 	ucontrol->value.integer.value[0] =
752 			(wm_get(ice, WM_DAC_CTRL1) & 0xf0) != 0x90;
753 	mutex_unlock(&ice->gpio_mutex);
754 	return 0;
755 }
756 
757 static int wm_chswap_put(struct snd_kcontrol *kcontrol,
758 			 struct snd_ctl_elem_value *ucontrol)
759 {
760 	struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
761 	unsigned short val, oval;
762 	int change = 0;
763 
764 	mutex_lock(&ice->gpio_mutex);
765 	oval = wm_get(ice, WM_DAC_CTRL1);
766 	val = oval & 0x0f;
767 	if (ucontrol->value.integer.value[0])
768 		val |= 0x60;
769 	else
770 		val |= 0x90;
771 	if (val != oval) {
772 		wm_put(ice, WM_DAC_CTRL1, val);
773 		wm_put_nocache(ice, WM_DAC_CTRL1, val);
774 		change = 1;
775 	}
776 	mutex_unlock(&ice->gpio_mutex);
777 	return change;
778 }
779 
780 
781 /*
782  * mixers
783  */
784 
785 static struct snd_kcontrol_new prodigy_hifi_controls[] __devinitdata = {
786 	{
787 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
788 		.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
789 			   SNDRV_CTL_ELEM_ACCESS_TLV_READ),
790 		.name = "Master Playback Volume",
791 		.info = wm_master_vol_info,
792 		.get = wm_master_vol_get,
793 		.put = wm_master_vol_put,
794 		.tlv = { .p = db_scale_wm_dac }
795 	},
796 	{
797 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
798 		.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
799 			   SNDRV_CTL_ELEM_ACCESS_TLV_READ),
800 		.name = "Front Playback Volume",
801 		.info = wm_dac_vol_info,
802 		.get = wm_dac_vol_get,
803 		.put = wm_dac_vol_put,
804 		.tlv = { .p = db_scale_wm_dac },
805 	},
806 	{
807 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
808 		.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
809 			   SNDRV_CTL_ELEM_ACCESS_TLV_READ),
810 		.name = "Rear Playback Volume",
811 		.info = wm8766_vol_info,
812 		.get = wm8766_vol_get,
813 		.put = wm8766_vol_put,
814 		.private_value = (2 << 8) | 0,
815 		.tlv = { .p = db_scale_wm_dac },
816 	},
817 	{
818 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
819 		.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
820 			   SNDRV_CTL_ELEM_ACCESS_TLV_READ),
821 		.name = "Center Playback Volume",
822 		.info = wm8766_vol_info,
823 		.get = wm8766_vol_get,
824 		.put = wm8766_vol_put,
825 		.private_value = (1 << 8) | 4,
826 		.tlv = { .p = db_scale_wm_dac }
827 	},
828 	{
829 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
830 		.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
831 			   SNDRV_CTL_ELEM_ACCESS_TLV_READ),
832 		.name = "LFE Playback Volume",
833 		.info = wm8766_vol_info,
834 		.get = wm8766_vol_get,
835 		.put = wm8766_vol_put,
836 		.private_value = (1 << 8) | 5,
837 		.tlv = { .p = db_scale_wm_dac }
838 	},
839 	{
840 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
841 		.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
842 			   SNDRV_CTL_ELEM_ACCESS_TLV_READ),
843 		.name = "Side Playback Volume",
844 		.info = wm8766_vol_info,
845 		.get = wm8766_vol_get,
846 		.put = wm8766_vol_put,
847 		.private_value = (2 << 8) | 6,
848 		.tlv = { .p = db_scale_wm_dac },
849 	},
850 	{
851 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
852 		.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
853 			   SNDRV_CTL_ELEM_ACCESS_TLV_READ),
854 		.name = "Capture Volume",
855 		.info = wm_adc_vol_info,
856 		.get = wm_adc_vol_get,
857 		.put = wm_adc_vol_put,
858 		.tlv = { .p = db_scale_wm_dac },
859 	},
860 	{
861 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
862 		.name = "CD Capture Switch",
863 		.info = wm_adc_mux_info,
864 		.get = wm_adc_mux_get,
865 		.put = wm_adc_mux_put,
866 		.private_value = 0,
867 	},
868 	{
869 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
870 		.name = "Line Capture Switch",
871 		.info = wm_adc_mux_info,
872 		.get = wm_adc_mux_get,
873 		.put = wm_adc_mux_put,
874 		.private_value = 1,
875 	},
876 	{
877 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
878 		.name = "Analog Bypass Switch",
879 		.info = wm_bypass_info,
880 		.get = wm_bypass_get,
881 		.put = wm_bypass_put,
882 	},
883 	{
884 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
885 		.name = "Swap Output Channels",
886 		.info = wm_chswap_info,
887 		.get = wm_chswap_get,
888 		.put = wm_chswap_put,
889 	},
890 	{
891 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
892 		.name = "Analog Capture Source",
893 		.info = wm_adc_mux_enum_info,
894 		.get = wm_adc_mux_enum_get,
895 		.put = wm_adc_mux_enum_put,
896 	},
897 };
898 
899 /*
900  * WM codec registers
901  */
902 static void wm_proc_regs_write(struct snd_info_entry *entry,
903 			       struct snd_info_buffer *buffer)
904 {
905 	struct snd_ice1712 *ice = entry->private_data;
906 	char line[64];
907 	unsigned int reg, val;
908 	mutex_lock(&ice->gpio_mutex);
909 	while (!snd_info_get_line(buffer, line, sizeof(line))) {
910 		if (sscanf(line, "%x %x", &reg, &val) != 2)
911 			continue;
912 		if (reg <= 0x17 && val <= 0xffff)
913 			wm_put(ice, reg, val);
914 	}
915 	mutex_unlock(&ice->gpio_mutex);
916 }
917 
918 static void wm_proc_regs_read(struct snd_info_entry *entry,
919 			      struct snd_info_buffer *buffer)
920 {
921 	struct snd_ice1712 *ice = entry->private_data;
922 	int reg, val;
923 
924 	mutex_lock(&ice->gpio_mutex);
925 	for (reg = 0; reg <= 0x17; reg++) {
926 		val = wm_get(ice, reg);
927 		snd_iprintf(buffer, "%02x = %04x\n", reg, val);
928 	}
929 	mutex_unlock(&ice->gpio_mutex);
930 }
931 
932 static void wm_proc_init(struct snd_ice1712 *ice)
933 {
934 	struct snd_info_entry *entry;
935 	if (!snd_card_proc_new(ice->card, "wm_codec", &entry)) {
936 		snd_info_set_text_ops(entry, ice, wm_proc_regs_read);
937 		entry->mode |= S_IWUSR;
938 		entry->c.text.write = wm_proc_regs_write;
939 	}
940 }
941 
942 static int __devinit prodigy_hifi_add_controls(struct snd_ice1712 *ice)
943 {
944 	unsigned int i;
945 	int err;
946 
947 	for (i = 0; i < ARRAY_SIZE(prodigy_hifi_controls); i++) {
948 		err = snd_ctl_add(ice->card,
949 				  snd_ctl_new1(&prodigy_hifi_controls[i], ice));
950 		if (err < 0)
951 			return err;
952 	}
953 
954 	wm_proc_init(ice);
955 
956 	return 0;
957 }
958 
959 static int __devinit prodigy_hd2_add_controls(struct snd_ice1712 *ice)
960 {
961 	unsigned int i;
962 	int err;
963 
964 	for (i = 0; i < ARRAY_SIZE(prodigy_hd2_controls); i++) {
965 		err = snd_ctl_add(ice->card,
966 				  snd_ctl_new1(&prodigy_hd2_controls[i], ice));
967 		if (err < 0)
968 			return err;
969 	}
970 
971 	wm_proc_init(ice);
972 
973 	return 0;
974 }
975 
976 
977 /*
978  * initialize the chip
979  */
980 static int __devinit prodigy_hifi_init(struct snd_ice1712 *ice)
981 {
982 	static unsigned short wm_inits[] = {
983 		/* These come first to reduce init pop noise */
984 		WM_ADC_MUX,	0x0003,	/* ADC mute */
985 		/* 0x00c0 replaced by 0x0003 */
986 
987 		WM_DAC_MUTE,	0x0001,	/* DAC softmute */
988 		WM_DAC_CTRL1,	0x0000,	/* DAC mute */
989 
990 		WM_POWERDOWN,	0x0008,	/* All power-up except HP */
991 		WM_RESET,	0x0000,	/* reset */
992 	};
993 	static unsigned short wm_inits2[] = {
994 		WM_MASTER_CTRL,  0x0022, /* 256fs, slave mode */
995 		WM_DAC_INT,	0x0022,	/* I2S, normal polarity, 24bit */
996 		WM_ADC_INT,	0x0022,	/* I2S, normal polarity, 24bit */
997 		WM_DAC_CTRL1,	0x0090,	/* DAC L/R */
998 		WM_OUT_MUX,	0x0001,	/* OUT DAC */
999 		WM_HP_ATTEN_L,	0x0179,	/* HP 0dB */
1000 		WM_HP_ATTEN_R,	0x0179,	/* HP 0dB */
1001 		WM_DAC_ATTEN_L,	0x0000,	/* DAC 0dB */
1002 		WM_DAC_ATTEN_L,	0x0100,	/* DAC 0dB */
1003 		WM_DAC_ATTEN_R,	0x0000,	/* DAC 0dB */
1004 		WM_DAC_ATTEN_R,	0x0100,	/* DAC 0dB */
1005 		WM_PHASE_SWAP,	0x0000,	/* phase normal */
1006 #if 0
1007 		WM_DAC_MASTER,	0x0100,	/* DAC master muted */
1008 #endif
1009 		WM_DAC_CTRL2,	0x0000,	/* no deemphasis, no ZFLG */
1010 		WM_ADC_ATTEN_L,	0x0000,	/* ADC muted */
1011 		WM_ADC_ATTEN_R,	0x0000,	/* ADC muted */
1012 #if 1
1013 		WM_ALC_CTRL1,	0x007b,	/* */
1014 		WM_ALC_CTRL2,	0x0000,	/* */
1015 		WM_ALC_CTRL3,	0x0000,	/* */
1016 		WM_NOISE_GATE,	0x0000,	/* */
1017 #endif
1018 		WM_DAC_MUTE,	0x0000,	/* DAC unmute */
1019 		WM_ADC_MUX,	0x0003,	/* ADC unmute, both CD/Line On */
1020 	};
1021 	static unsigned short wm8766_inits[] = {
1022 		WM8766_RESET,	   0x0000,
1023 		WM8766_DAC_CTRL,	0x0120,
1024 		WM8766_INT_CTRL,	0x0022, /* I2S Normal Mode, 24 bit */
1025 		WM8766_DAC_CTRL2,       0x0001,
1026 		WM8766_DAC_CTRL3,       0x0080,
1027 		WM8766_LDA1,	    0x0100,
1028 		WM8766_LDA2,	    0x0100,
1029 		WM8766_LDA3,	    0x0100,
1030 		WM8766_RDA1,	    0x0100,
1031 		WM8766_RDA2,	    0x0100,
1032 		WM8766_RDA3,	    0x0100,
1033 		WM8766_MUTE1,	   0x0000,
1034 		WM8766_MUTE2,	   0x0000,
1035 	};
1036 
1037 	struct prodigy_hifi_spec *spec;
1038 	unsigned int i;
1039 
1040 	ice->vt1720 = 0;
1041 	ice->vt1724 = 1;
1042 
1043 	ice->num_total_dacs = 8;
1044 	ice->num_total_adcs = 1;
1045 
1046 	/* HACK - use this as the SPDIF source.
1047 	* don't call snd_ice1712_gpio_get/put(), otherwise it's overwritten
1048 	*/
1049 	ice->gpio.saved[0] = 0;
1050 	/* to remember the register values */
1051 
1052 	ice->akm = kzalloc(sizeof(struct snd_akm4xxx), GFP_KERNEL);
1053 	if (! ice->akm)
1054 		return -ENOMEM;
1055 	ice->akm_codecs = 1;
1056 
1057 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1058 	if (!spec)
1059 		return -ENOMEM;
1060 	ice->spec = spec;
1061 
1062 	/* initialize WM8776 codec */
1063 	for (i = 0; i < ARRAY_SIZE(wm_inits); i += 2)
1064 		wm_put(ice, wm_inits[i], wm_inits[i+1]);
1065 	schedule_timeout_uninterruptible(1);
1066 	for (i = 0; i < ARRAY_SIZE(wm_inits2); i += 2)
1067 		wm_put(ice, wm_inits2[i], wm_inits2[i+1]);
1068 
1069 	/* initialize WM8766 codec */
1070 	for (i = 0; i < ARRAY_SIZE(wm8766_inits); i += 2)
1071 		wm8766_spi_write(ice, wm8766_inits[i], wm8766_inits[i+1]);
1072 
1073 
1074 	return 0;
1075 }
1076 
1077 
1078 /*
1079  * initialize the chip
1080  */
1081 static void ak4396_init(struct snd_ice1712 *ice)
1082 {
1083 	static unsigned short ak4396_inits[] = {
1084 		AK4396_CTRL1,	   0x87,   /* I2S Normal Mode, 24 bit */
1085 		AK4396_CTRL2,	   0x02,
1086 		AK4396_CTRL3,	   0x00,
1087 		AK4396_LCH_ATT,	 0x00,
1088 		AK4396_RCH_ATT,	 0x00,
1089 	};
1090 
1091 	unsigned int i;
1092 
1093 	/* initialize ak4396 codec */
1094 	/* reset codec */
1095 	ak4396_write(ice, AK4396_CTRL1, 0x86);
1096 	msleep(100);
1097 	ak4396_write(ice, AK4396_CTRL1, 0x87);
1098 
1099 	for (i = 0; i < ARRAY_SIZE(ak4396_inits); i += 2)
1100 		ak4396_write(ice, ak4396_inits[i], ak4396_inits[i+1]);
1101 }
1102 
1103 #ifdef CONFIG_PM_SLEEP
1104 static int prodigy_hd2_resume(struct snd_ice1712 *ice)
1105 {
1106 	/* initialize ak4396 codec and restore previous mixer volumes */
1107 	struct prodigy_hifi_spec *spec = ice->spec;
1108 	int i;
1109 	mutex_lock(&ice->gpio_mutex);
1110 	ak4396_init(ice);
1111 	for (i = 0; i < 2; i++)
1112 		ak4396_write(ice, AK4396_LCH_ATT + i, spec->vol[i] & 0xff);
1113 	mutex_unlock(&ice->gpio_mutex);
1114 	return 0;
1115 }
1116 #endif
1117 
1118 static int __devinit prodigy_hd2_init(struct snd_ice1712 *ice)
1119 {
1120 	struct prodigy_hifi_spec *spec;
1121 
1122 	ice->vt1720 = 0;
1123 	ice->vt1724 = 1;
1124 
1125 	ice->num_total_dacs = 1;
1126 	ice->num_total_adcs = 1;
1127 
1128 	/* HACK - use this as the SPDIF source.
1129 	* don't call snd_ice1712_gpio_get/put(), otherwise it's overwritten
1130 	*/
1131 	ice->gpio.saved[0] = 0;
1132 	/* to remember the register values */
1133 
1134 	ice->akm = kzalloc(sizeof(struct snd_akm4xxx), GFP_KERNEL);
1135 	if (! ice->akm)
1136 		return -ENOMEM;
1137 	ice->akm_codecs = 1;
1138 
1139 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1140 	if (!spec)
1141 		return -ENOMEM;
1142 	ice->spec = spec;
1143 
1144 #ifdef CONFIG_PM_SLEEP
1145 	ice->pm_resume = &prodigy_hd2_resume;
1146 	ice->pm_suspend_enabled = 1;
1147 #endif
1148 
1149 	ak4396_init(ice);
1150 
1151 	return 0;
1152 }
1153 
1154 
1155 static unsigned char prodigy71hifi_eeprom[] __devinitdata = {
1156 	0x4b,   /* SYSCONF: clock 512, spdif-in/ADC, 4DACs */
1157 	0x80,   /* ACLINK: I2S */
1158 	0xfc,   /* I2S: vol, 96k, 24bit, 192k */
1159 	0xc3,   /* SPDIF: out-en, out-int, spdif-in */
1160 	0xff,   /* GPIO_DIR */
1161 	0xff,   /* GPIO_DIR1 */
1162 	0x5f,   /* GPIO_DIR2 */
1163 	0x00,   /* GPIO_MASK */
1164 	0x00,   /* GPIO_MASK1 */
1165 	0x00,   /* GPIO_MASK2 */
1166 	0x00,   /* GPIO_STATE */
1167 	0x00,   /* GPIO_STATE1 */
1168 	0x00,   /* GPIO_STATE2 */
1169 };
1170 
1171 static unsigned char prodigyhd2_eeprom[] __devinitdata = {
1172 	0x4b,   /* SYSCONF: clock 512, spdif-in/ADC, 4DACs */
1173 	0x80,   /* ACLINK: I2S */
1174 	0xfc,   /* I2S: vol, 96k, 24bit, 192k */
1175 	0xc3,   /* SPDIF: out-en, out-int, spdif-in */
1176 	0xff,   /* GPIO_DIR */
1177 	0xff,   /* GPIO_DIR1 */
1178 	0x5f,   /* GPIO_DIR2 */
1179 	0x00,   /* GPIO_MASK */
1180 	0x00,   /* GPIO_MASK1 */
1181 	0x00,   /* GPIO_MASK2 */
1182 	0x00,   /* GPIO_STATE */
1183 	0x00,   /* GPIO_STATE1 */
1184 	0x00,   /* GPIO_STATE2 */
1185 };
1186 
1187 static unsigned char fortissimo4_eeprom[] __devinitdata = {
1188 	0x43,   /* SYSCONF: clock 512, ADC, 4DACs */
1189 	0x80,   /* ACLINK: I2S */
1190 	0xfc,   /* I2S: vol, 96k, 24bit, 192k */
1191 	0xc1,   /* SPDIF: out-en, out-int */
1192 	0xff,   /* GPIO_DIR */
1193 	0xff,   /* GPIO_DIR1 */
1194 	0x5f,   /* GPIO_DIR2 */
1195 	0x00,   /* GPIO_MASK */
1196 	0x00,   /* GPIO_MASK1 */
1197 	0x00,   /* GPIO_MASK2 */
1198 	0x00,   /* GPIO_STATE */
1199 	0x00,   /* GPIO_STATE1 */
1200 	0x00,   /* GPIO_STATE2 */
1201 };
1202 
1203 /* entry point */
1204 struct snd_ice1712_card_info snd_vt1724_prodigy_hifi_cards[] __devinitdata = {
1205 	{
1206 		.subvendor = VT1724_SUBDEVICE_PRODIGY_HIFI,
1207 		.name = "Audiotrak Prodigy 7.1 HiFi",
1208 		.model = "prodigy71hifi",
1209 		.chip_init = prodigy_hifi_init,
1210 		.build_controls = prodigy_hifi_add_controls,
1211 		.eeprom_size = sizeof(prodigy71hifi_eeprom),
1212 		.eeprom_data = prodigy71hifi_eeprom,
1213 		.driver = "Prodigy71HIFI",
1214 	},
1215 	{
1216 	.subvendor = VT1724_SUBDEVICE_PRODIGY_HD2,
1217 	.name = "Audiotrak Prodigy HD2",
1218 	.model = "prodigyhd2",
1219 	.chip_init = prodigy_hd2_init,
1220 	.build_controls = prodigy_hd2_add_controls,
1221 	.eeprom_size = sizeof(prodigyhd2_eeprom),
1222 	.eeprom_data = prodigyhd2_eeprom,
1223 	.driver = "Prodigy71HD2",
1224 	},
1225 	{
1226 		.subvendor = VT1724_SUBDEVICE_FORTISSIMO4,
1227 		.name = "Hercules Fortissimo IV",
1228 		.model = "fortissimo4",
1229 		.chip_init = prodigy_hifi_init,
1230 		.build_controls = prodigy_hifi_add_controls,
1231 		.eeprom_size = sizeof(fortissimo4_eeprom),
1232 		.eeprom_data = fortissimo4_eeprom,
1233 		.driver = "Fortissimo4",
1234 	},
1235 	{ } /* terminator */
1236 };
1237 
1238