pandora: defconfig: update
[pandora-kernel.git] / sound / pci / ice1712 / prodigy_hifi.c
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
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
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