Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
phase.c
Go to the documentation of this file.
1 /*
2  * ALSA driver for ICEnsemble ICE1724 (Envy24)
3  *
4  * Lowlevel functions for Terratec PHASE 22
5  *
6  * Copyright (c) 2005 Misha Zhilin <[email protected]>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21  *
22  */
23 
24 /* PHASE 22 overview:
25  * Audio controller: VIA Envy24HT-S (slightly trimmed down Envy24HT, 4in/4out)
26  * Analog chip: AK4524 (partially via Philip's 74HCT125)
27  * Digital receiver: CS8414-CS (supported in this release)
28  * PHASE 22 revision 2.0 and Terrasoniq/Musonik TS22PCI have CS8416
29  * (support status unknown, please test and report)
30  *
31  * Envy connects to AK4524
32  * - CS directly from GPIO 10
33  * - CCLK via 74HCT125's gate #4 from GPIO 4
34  * - CDTI via 74HCT125's gate #2 from GPIO 5
35  * CDTI may be completely blocked by 74HCT125's gate #1
36  * controlled by GPIO 3
37  */
38 
39 /* PHASE 28 overview:
40  * Audio controller: VIA Envy24HT (full untrimmed version, 4in/8out)
41  * Analog chip: WM8770 (8 channel 192k DAC, 2 channel 96k ADC)
42  * Digital receiver: CS8414-CS (supported in this release)
43  */
44 
45 #include <asm/io.h>
46 #include <linux/delay.h>
47 #include <linux/interrupt.h>
48 #include <linux/init.h>
49 #include <linux/slab.h>
50 #include <linux/mutex.h>
51 
52 #include <sound/core.h>
53 
54 #include "ice1712.h"
55 #include "envy24ht.h"
56 #include "phase.h"
57 #include <sound/tlv.h>
58 
59 /* AC97 register cache for Phase28 */
60 struct phase28_spec {
61  unsigned short master[2];
62  unsigned short vol[8];
63 };
64 
65 /* WM8770 registers */
66 #define WM_DAC_ATTEN 0x00 /* DAC1-8 analog attenuation */
67 #define WM_DAC_MASTER_ATTEN 0x08 /* DAC master analog attenuation */
68 #define WM_DAC_DIG_ATTEN 0x09 /* DAC1-8 digital attenuation */
69 #define WM_DAC_DIG_MASTER_ATTEN 0x11 /* DAC master digital attenuation */
70 #define WM_PHASE_SWAP 0x12 /* DAC phase */
71 #define WM_DAC_CTRL1 0x13 /* DAC control bits */
72 #define WM_MUTE 0x14 /* mute controls */
73 #define WM_DAC_CTRL2 0x15 /* de-emphasis and zefo-flag */
74 #define WM_INT_CTRL 0x16 /* interface control */
75 #define WM_MASTER 0x17 /* master clock and mode */
76 #define WM_POWERDOWN 0x18 /* power-down controls */
77 #define WM_ADC_GAIN 0x19 /* ADC gain L(19)/R(1a) */
78 #define WM_ADC_MUX 0x1b /* input MUX */
79 #define WM_OUT_MUX1 0x1c /* output MUX */
80 #define WM_OUT_MUX2 0x1e /* output MUX */
81 #define WM_RESET 0x1f /* software reset */
82 
83 
84 /*
85  * Logarithmic volume values for WM8770
86  * Computed as 20 * Log10(255 / x)
87  */
88 static const unsigned char wm_vol[256] = {
89  127, 48, 42, 39, 36, 34, 33, 31, 30, 29, 28, 27, 27, 26, 25, 25, 24,
90  24, 23, 23, 22, 22, 21, 21, 21, 20, 20, 20, 19, 19, 19, 18, 18, 18, 18,
91  17, 17, 17, 17, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14,
92  14, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11,
93  11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9,
94  9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7,
95  7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5,
96  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
97  4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
98  3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
99  2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
100  1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
101 };
102 
103 #define WM_VOL_MAX (sizeof(wm_vol) - 1)
104 #define WM_VOL_MUTE 0x8000
105 
106 static struct snd_akm4xxx akm_phase22 __devinitdata = {
107  .type = SND_AK4524,
108  .num_dacs = 2,
109  .num_adcs = 2,
110 };
111 
112 static struct snd_ak4xxx_private akm_phase22_priv __devinitdata = {
113  .caddr = 2,
114  .cif = 1,
115  .data_mask = 1 << 4,
116  .clk_mask = 1 << 5,
117  .cs_mask = 1 << 10,
118  .cs_addr = 1 << 10,
119  .cs_none = 0,
120  .add_flags = 1 << 3,
121  .mask_flags = 0,
122 };
123 
124 static int __devinit phase22_init(struct snd_ice1712 *ice)
125 {
126  struct snd_akm4xxx *ak;
127  int err;
128 
129  /* Configure DAC/ADC description for generic part of ice1724 */
130  switch (ice->eeprom.subvendor) {
133  ice->num_total_dacs = 2;
134  ice->num_total_adcs = 2;
135  ice->vt1720 = 1; /* Envy24HT-S have 16 bit wide GPIO */
136  break;
137  default:
138  snd_BUG();
139  return -EINVAL;
140  }
141 
142  /* Initialize analog chips */
143  ice->akm = kzalloc(sizeof(struct snd_akm4xxx), GFP_KERNEL);
144  ak = ice->akm;
145  if (!ak)
146  return -ENOMEM;
147  ice->akm_codecs = 1;
148  switch (ice->eeprom.subvendor) {
151  err = snd_ice1712_akm4xxx_init(ak, &akm_phase22,
152  &akm_phase22_priv, ice);
153  if (err < 0)
154  return err;
155  break;
156  }
157 
158  return 0;
159 }
160 
161 static int __devinit phase22_add_controls(struct snd_ice1712 *ice)
162 {
163  int err = 0;
164 
165  switch (ice->eeprom.subvendor) {
169  if (err < 0)
170  return err;
171  }
172  return 0;
173 }
174 
175 static unsigned char phase22_eeprom[] __devinitdata = {
176  [ICE_EEP2_SYSCONF] = 0x28, /* clock 512, mpu 401,
177  spdif-in/1xADC, 1xDACs */
178  [ICE_EEP2_ACLINK] = 0x80, /* I2S */
179  [ICE_EEP2_I2S] = 0xf0, /* vol, 96k, 24bit */
180  [ICE_EEP2_SPDIF] = 0xc3, /* out-en, out-int, spdif-in */
181  [ICE_EEP2_GPIO_DIR] = 0xff,
182  [ICE_EEP2_GPIO_DIR1] = 0xff,
183  [ICE_EEP2_GPIO_DIR2] = 0xff,
184  [ICE_EEP2_GPIO_MASK] = 0x00,
185  [ICE_EEP2_GPIO_MASK1] = 0x00,
186  [ICE_EEP2_GPIO_MASK2] = 0x00,
187  [ICE_EEP2_GPIO_STATE] = 0x00,
188  [ICE_EEP2_GPIO_STATE1] = 0x00,
189  [ICE_EEP2_GPIO_STATE2] = 0x00,
190 };
191 
192 static unsigned char phase28_eeprom[] __devinitdata = {
193  [ICE_EEP2_SYSCONF] = 0x2b, /* clock 512, mpu401,
194  spdif-in/1xADC, 4xDACs */
195  [ICE_EEP2_ACLINK] = 0x80, /* I2S */
196  [ICE_EEP2_I2S] = 0xfc, /* vol, 96k, 24bit, 192k */
197  [ICE_EEP2_SPDIF] = 0xc3, /* out-en, out-int, spdif-in */
198  [ICE_EEP2_GPIO_DIR] = 0xff,
199  [ICE_EEP2_GPIO_DIR1] = 0xff,
200  [ICE_EEP2_GPIO_DIR2] = 0x5f,
201  [ICE_EEP2_GPIO_MASK] = 0x00,
202  [ICE_EEP2_GPIO_MASK1] = 0x00,
203  [ICE_EEP2_GPIO_MASK2] = 0x00,
204  [ICE_EEP2_GPIO_STATE] = 0x00,
205  [ICE_EEP2_GPIO_STATE1] = 0x00,
206  [ICE_EEP2_GPIO_STATE2] = 0x00,
207 };
208 
209 /*
210  * write data in the SPI mode
211  */
212 static void phase28_spi_write(struct snd_ice1712 *ice, unsigned int cs,
213  unsigned int data, int bits)
214 {
215  unsigned int tmp;
216  int i;
217 
218  tmp = snd_ice1712_gpio_read(ice);
219 
220  snd_ice1712_gpio_set_mask(ice, ~(PHASE28_WM_RW|PHASE28_SPI_MOSI|
222  tmp |= PHASE28_WM_RW;
223  tmp &= ~cs;
224  snd_ice1712_gpio_write(ice, tmp);
225  udelay(1);
226 
227  for (i = bits - 1; i >= 0; i--) {
228  tmp &= ~PHASE28_SPI_CLK;
229  snd_ice1712_gpio_write(ice, tmp);
230  udelay(1);
231  if (data & (1 << i))
232  tmp |= PHASE28_SPI_MOSI;
233  else
234  tmp &= ~PHASE28_SPI_MOSI;
235  snd_ice1712_gpio_write(ice, tmp);
236  udelay(1);
237  tmp |= PHASE28_SPI_CLK;
238  snd_ice1712_gpio_write(ice, tmp);
239  udelay(1);
240  }
241 
242  tmp &= ~PHASE28_SPI_CLK;
243  tmp |= cs;
244  snd_ice1712_gpio_write(ice, tmp);
245  udelay(1);
246  tmp |= PHASE28_SPI_CLK;
247  snd_ice1712_gpio_write(ice, tmp);
248  udelay(1);
249 }
250 
251 /*
252  * get the current register value of WM codec
253  */
254 static unsigned short wm_get(struct snd_ice1712 *ice, int reg)
255 {
256  reg <<= 1;
257  return ((unsigned short)ice->akm[0].images[reg] << 8) |
258  ice->akm[0].images[reg + 1];
259 }
260 
261 /*
262  * set the register value of WM codec
263  */
264 static void wm_put_nocache(struct snd_ice1712 *ice, int reg, unsigned short val)
265 {
266  phase28_spi_write(ice, PHASE28_WM_CS, (reg << 9) | (val & 0x1ff), 16);
267 }
268 
269 /*
270  * set the register value of WM codec and remember it
271  */
272 static void wm_put(struct snd_ice1712 *ice, int reg, unsigned short val)
273 {
274  wm_put_nocache(ice, reg, val);
275  reg <<= 1;
276  ice->akm[0].images[reg] = val >> 8;
277  ice->akm[0].images[reg + 1] = val;
278 }
279 
280 static void wm_set_vol(struct snd_ice1712 *ice, unsigned int index,
281  unsigned short vol, unsigned short master)
282 {
283  unsigned char nvol;
284 
285  if ((master & WM_VOL_MUTE) || (vol & WM_VOL_MUTE))
286  nvol = 0;
287  else
288  nvol = 127 - wm_vol[(((vol & ~WM_VOL_MUTE) *
289  (master & ~WM_VOL_MUTE)) / 127) & WM_VOL_MAX];
290 
291  wm_put(ice, index, nvol);
292  wm_put_nocache(ice, index, 0x180 | nvol);
293 }
294 
295 /*
296  * DAC mute control
297  */
298 #define wm_pcm_mute_info snd_ctl_boolean_mono_info
299 
300 static int wm_pcm_mute_get(struct snd_kcontrol *kcontrol,
301  struct snd_ctl_elem_value *ucontrol)
302 {
303  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
304 
305  mutex_lock(&ice->gpio_mutex);
306  ucontrol->value.integer.value[0] = (wm_get(ice, WM_MUTE) & 0x10) ?
307  0 : 1;
308  mutex_unlock(&ice->gpio_mutex);
309  return 0;
310 }
311 
312 static int wm_pcm_mute_put(struct snd_kcontrol *kcontrol,
313  struct snd_ctl_elem_value *ucontrol)
314 {
315  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
316  unsigned short nval, oval;
317  int change;
318 
319  snd_ice1712_save_gpio_status(ice);
320  oval = wm_get(ice, WM_MUTE);
321  nval = (oval & ~0x10) | (ucontrol->value.integer.value[0] ? 0 : 0x10);
322  change = (nval != oval);
323  if (change)
324  wm_put(ice, WM_MUTE, nval);
325  snd_ice1712_restore_gpio_status(ice);
326 
327  return change;
328 }
329 
330 /*
331  * Master volume attenuation mixer control
332  */
333 static int wm_master_vol_info(struct snd_kcontrol *kcontrol,
334  struct snd_ctl_elem_info *uinfo)
335 {
337  uinfo->count = 2;
338  uinfo->value.integer.min = 0;
339  uinfo->value.integer.max = WM_VOL_MAX;
340  return 0;
341 }
342 
343 static int wm_master_vol_get(struct snd_kcontrol *kcontrol,
344  struct snd_ctl_elem_value *ucontrol)
345 {
346  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
347  struct phase28_spec *spec = ice->spec;
348  int i;
349  for (i = 0; i < 2; i++)
350  ucontrol->value.integer.value[i] = spec->master[i] &
351  ~WM_VOL_MUTE;
352  return 0;
353 }
354 
355 static int wm_master_vol_put(struct snd_kcontrol *kcontrol,
356  struct snd_ctl_elem_value *ucontrol)
357 {
358  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
359  struct phase28_spec *spec = ice->spec;
360  int ch, change = 0;
361 
362  snd_ice1712_save_gpio_status(ice);
363  for (ch = 0; ch < 2; ch++) {
364  unsigned int vol = ucontrol->value.integer.value[ch];
365  if (vol > WM_VOL_MAX)
366  continue;
367  vol |= spec->master[ch] & WM_VOL_MUTE;
368  if (vol != spec->master[ch]) {
369  int dac;
370  spec->master[ch] = vol;
371  for (dac = 0; dac < ice->num_total_dacs; dac += 2)
372  wm_set_vol(ice, WM_DAC_ATTEN + dac + ch,
373  spec->vol[dac + ch],
374  spec->master[ch]);
375  change = 1;
376  }
377  }
378  snd_ice1712_restore_gpio_status(ice);
379  return change;
380 }
381 
382 static int __devinit phase28_init(struct snd_ice1712 *ice)
383 {
384  static const unsigned short wm_inits_phase28[] = {
385  /* These come first to reduce init pop noise */
386  0x1b, 0x044, /* ADC Mux (AC'97 source) */
387  0x1c, 0x00B, /* Out Mux1 (VOUT1 = DAC+AUX, VOUT2 = DAC) */
388  0x1d, 0x009, /* Out Mux2 (VOUT2 = DAC, VOUT3 = DAC) */
389 
390  0x18, 0x000, /* All power-up */
391 
392  0x16, 0x122, /* I2S, normal polarity, 24bit */
393  0x17, 0x022, /* 256fs, slave mode */
394  0x00, 0, /* DAC1 analog mute */
395  0x01, 0, /* DAC2 analog mute */
396  0x02, 0, /* DAC3 analog mute */
397  0x03, 0, /* DAC4 analog mute */
398  0x04, 0, /* DAC5 analog mute */
399  0x05, 0, /* DAC6 analog mute */
400  0x06, 0, /* DAC7 analog mute */
401  0x07, 0, /* DAC8 analog mute */
402  0x08, 0x100, /* master analog mute */
403  0x09, 0xff, /* DAC1 digital full */
404  0x0a, 0xff, /* DAC2 digital full */
405  0x0b, 0xff, /* DAC3 digital full */
406  0x0c, 0xff, /* DAC4 digital full */
407  0x0d, 0xff, /* DAC5 digital full */
408  0x0e, 0xff, /* DAC6 digital full */
409  0x0f, 0xff, /* DAC7 digital full */
410  0x10, 0xff, /* DAC8 digital full */
411  0x11, 0x1ff, /* master digital full */
412  0x12, 0x000, /* phase normal */
413  0x13, 0x090, /* unmute DAC L/R */
414  0x14, 0x000, /* all unmute */
415  0x15, 0x000, /* no deemphasis, no ZFLG */
416  0x19, 0x000, /* -12dB ADC/L */
417  0x1a, 0x000, /* -12dB ADC/R */
418  (unsigned short)-1
419  };
420 
421  unsigned int tmp;
422  struct snd_akm4xxx *ak;
423  struct phase28_spec *spec;
424  const unsigned short *p;
425  int i;
426 
427  ice->num_total_dacs = 8;
428  ice->num_total_adcs = 2;
429 
430  spec = kzalloc(sizeof(*spec), GFP_KERNEL);
431  if (!spec)
432  return -ENOMEM;
433  ice->spec = spec;
434 
435  /* Initialize analog chips */
436  ice->akm = kzalloc(sizeof(struct snd_akm4xxx), GFP_KERNEL);
437  ak = ice->akm;
438  if (!ak)
439  return -ENOMEM;
440  ice->akm_codecs = 1;
441 
442  snd_ice1712_gpio_set_dir(ice, 0x5fffff); /* fix this for time being */
443 
444  /* reset the wm codec as the SPI mode */
445  snd_ice1712_save_gpio_status(ice);
446  snd_ice1712_gpio_set_mask(ice, ~(PHASE28_WM_RESET|PHASE28_WM_CS|
447  PHASE28_HP_SEL));
448 
449  tmp = snd_ice1712_gpio_read(ice);
450  tmp &= ~PHASE28_WM_RESET;
451  snd_ice1712_gpio_write(ice, tmp);
452  udelay(1);
453  tmp |= PHASE28_WM_CS;
454  snd_ice1712_gpio_write(ice, tmp);
455  udelay(1);
456  tmp |= PHASE28_WM_RESET;
457  snd_ice1712_gpio_write(ice, tmp);
458  udelay(1);
459 
460  p = wm_inits_phase28;
461  for (; *p != (unsigned short)-1; p += 2)
462  wm_put(ice, p[0], p[1]);
463 
464  snd_ice1712_restore_gpio_status(ice);
465 
466  spec->master[0] = WM_VOL_MUTE;
467  spec->master[1] = WM_VOL_MUTE;
468  for (i = 0; i < ice->num_total_dacs; i++) {
469  spec->vol[i] = WM_VOL_MUTE;
470  wm_set_vol(ice, i, spec->vol[i], spec->master[i % 2]);
471  }
472 
473  return 0;
474 }
475 
476 /*
477  * DAC volume attenuation mixer control
478  */
479 static int wm_vol_info(struct snd_kcontrol *kcontrol,
480  struct snd_ctl_elem_info *uinfo)
481 {
482  int voices = kcontrol->private_value >> 8;
484  uinfo->count = voices;
485  uinfo->value.integer.min = 0; /* mute (-101dB) */
486  uinfo->value.integer.max = 0x7F; /* 0dB */
487  return 0;
488 }
489 
490 static int wm_vol_get(struct snd_kcontrol *kcontrol,
491  struct snd_ctl_elem_value *ucontrol)
492 {
493  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
494  struct phase28_spec *spec = ice->spec;
495  int i, ofs, voices;
496 
497  voices = kcontrol->private_value >> 8;
498  ofs = kcontrol->private_value & 0xff;
499  for (i = 0; i < voices; i++)
500  ucontrol->value.integer.value[i] =
501  spec->vol[ofs+i] & ~WM_VOL_MUTE;
502  return 0;
503 }
504 
505 static int wm_vol_put(struct snd_kcontrol *kcontrol,
506  struct snd_ctl_elem_value *ucontrol)
507 {
508  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
509  struct phase28_spec *spec = ice->spec;
510  int i, idx, ofs, voices;
511  int change = 0;
512 
513  voices = kcontrol->private_value >> 8;
514  ofs = kcontrol->private_value & 0xff;
515  snd_ice1712_save_gpio_status(ice);
516  for (i = 0; i < voices; i++) {
517  unsigned int vol;
518  vol = ucontrol->value.integer.value[i];
519  if (vol > 0x7f)
520  continue;
521  vol |= spec->vol[ofs+i] & WM_VOL_MUTE;
522  if (vol != spec->vol[ofs+i]) {
523  spec->vol[ofs+i] = vol;
524  idx = WM_DAC_ATTEN + ofs + i;
525  wm_set_vol(ice, idx, spec->vol[ofs+i],
526  spec->master[i]);
527  change = 1;
528  }
529  }
530  snd_ice1712_restore_gpio_status(ice);
531  return change;
532 }
533 
534 /*
535  * WM8770 mute control
536  */
537 static int wm_mute_info(struct snd_kcontrol *kcontrol,
538  struct snd_ctl_elem_info *uinfo) {
540  uinfo->count = kcontrol->private_value >> 8;
541  uinfo->value.integer.min = 0;
542  uinfo->value.integer.max = 1;
543  return 0;
544 }
545 
546 static int wm_mute_get(struct snd_kcontrol *kcontrol,
547  struct snd_ctl_elem_value *ucontrol)
548 {
549  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
550  struct phase28_spec *spec = ice->spec;
551  int voices, ofs, i;
552 
553  voices = kcontrol->private_value >> 8;
554  ofs = kcontrol->private_value & 0xFF;
555 
556  for (i = 0; i < voices; i++)
557  ucontrol->value.integer.value[i] =
558  (spec->vol[ofs+i] & WM_VOL_MUTE) ? 0 : 1;
559  return 0;
560 }
561 
562 static int wm_mute_put(struct snd_kcontrol *kcontrol,
563  struct snd_ctl_elem_value *ucontrol)
564 {
565  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
566  struct phase28_spec *spec = ice->spec;
567  int change = 0, voices, ofs, i;
568 
569  voices = kcontrol->private_value >> 8;
570  ofs = kcontrol->private_value & 0xFF;
571 
572  snd_ice1712_save_gpio_status(ice);
573  for (i = 0; i < voices; i++) {
574  int val = (spec->vol[ofs + i] & WM_VOL_MUTE) ? 0 : 1;
575  if (ucontrol->value.integer.value[i] != val) {
576  spec->vol[ofs + i] &= ~WM_VOL_MUTE;
577  spec->vol[ofs + i] |=
578  ucontrol->value.integer.value[i] ? 0 :
579  WM_VOL_MUTE;
580  wm_set_vol(ice, ofs + i, spec->vol[ofs + i],
581  spec->master[i]);
582  change = 1;
583  }
584  }
585  snd_ice1712_restore_gpio_status(ice);
586 
587  return change;
588 }
589 
590 /*
591  * WM8770 master mute control
592  */
593 #define wm_master_mute_info snd_ctl_boolean_stereo_info
594 
595 static int wm_master_mute_get(struct snd_kcontrol *kcontrol,
596  struct snd_ctl_elem_value *ucontrol)
597 {
598  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
599  struct phase28_spec *spec = ice->spec;
600 
601  ucontrol->value.integer.value[0] =
602  (spec->master[0] & WM_VOL_MUTE) ? 0 : 1;
603  ucontrol->value.integer.value[1] =
604  (spec->master[1] & WM_VOL_MUTE) ? 0 : 1;
605  return 0;
606 }
607 
608 static int wm_master_mute_put(struct snd_kcontrol *kcontrol,
609  struct snd_ctl_elem_value *ucontrol)
610 {
611  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
612  struct phase28_spec *spec = ice->spec;
613  int change = 0, i;
614 
615  snd_ice1712_save_gpio_status(ice);
616  for (i = 0; i < 2; i++) {
617  int val = (spec->master[i] & WM_VOL_MUTE) ? 0 : 1;
618  if (ucontrol->value.integer.value[i] != val) {
619  int dac;
620  spec->master[i] &= ~WM_VOL_MUTE;
621  spec->master[i] |=
622  ucontrol->value.integer.value[i] ? 0 :
623  WM_VOL_MUTE;
624  for (dac = 0; dac < ice->num_total_dacs; dac += 2)
625  wm_set_vol(ice, WM_DAC_ATTEN + dac + i,
626  spec->vol[dac + i],
627  spec->master[i]);
628  change = 1;
629  }
630  }
631  snd_ice1712_restore_gpio_status(ice);
632 
633  return change;
634 }
635 
636 /* digital master volume */
637 #define PCM_0dB 0xff
638 #define PCM_RES 128 /* -64dB */
639 #define PCM_MIN (PCM_0dB - PCM_RES)
640 static int wm_pcm_vol_info(struct snd_kcontrol *kcontrol,
641  struct snd_ctl_elem_info *uinfo)
642 {
644  uinfo->count = 1;
645  uinfo->value.integer.min = 0; /* mute (-64dB) */
646  uinfo->value.integer.max = PCM_RES; /* 0dB */
647  return 0;
648 }
649 
650 static int wm_pcm_vol_get(struct snd_kcontrol *kcontrol,
651  struct snd_ctl_elem_value *ucontrol)
652 {
653  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
654  unsigned short val;
655 
656  mutex_lock(&ice->gpio_mutex);
657  val = wm_get(ice, WM_DAC_DIG_MASTER_ATTEN) & 0xff;
658  val = val > PCM_MIN ? (val - PCM_MIN) : 0;
659  ucontrol->value.integer.value[0] = val;
660  mutex_unlock(&ice->gpio_mutex);
661  return 0;
662 }
663 
664 static int wm_pcm_vol_put(struct snd_kcontrol *kcontrol,
665  struct snd_ctl_elem_value *ucontrol)
666 {
667  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
668  unsigned short ovol, nvol;
669  int change = 0;
670 
671  nvol = ucontrol->value.integer.value[0];
672  if (nvol > PCM_RES)
673  return -EINVAL;
674  snd_ice1712_save_gpio_status(ice);
675  nvol = (nvol ? (nvol + PCM_MIN) : 0) & 0xff;
676  ovol = wm_get(ice, WM_DAC_DIG_MASTER_ATTEN) & 0xff;
677  if (ovol != nvol) {
678  wm_put(ice, WM_DAC_DIG_MASTER_ATTEN, nvol); /* prelatch */
679  /* update */
680  wm_put_nocache(ice, WM_DAC_DIG_MASTER_ATTEN, nvol | 0x100);
681  change = 1;
682  }
683  snd_ice1712_restore_gpio_status(ice);
684  return change;
685 }
686 
687 /*
688  * Deemphasis
689  */
690 #define phase28_deemp_info snd_ctl_boolean_mono_info
691 
692 static int phase28_deemp_get(struct snd_kcontrol *kcontrol,
693  struct snd_ctl_elem_value *ucontrol)
694 {
695  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
696  ucontrol->value.integer.value[0] = (wm_get(ice, WM_DAC_CTRL2) & 0xf) ==
697  0xf;
698  return 0;
699 }
700 
701 static int phase28_deemp_put(struct snd_kcontrol *kcontrol,
702  struct snd_ctl_elem_value *ucontrol)
703 {
704  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
705  int temp, temp2;
706  temp = wm_get(ice, WM_DAC_CTRL2);
707  temp2 = temp;
708  if (ucontrol->value.integer.value[0])
709  temp |= 0xf;
710  else
711  temp &= ~0xf;
712  if (temp != temp2) {
713  wm_put(ice, WM_DAC_CTRL2, temp);
714  return 1;
715  }
716  return 0;
717 }
718 
719 /*
720  * ADC Oversampling
721  */
722 static int phase28_oversampling_info(struct snd_kcontrol *k,
723  struct snd_ctl_elem_info *uinfo)
724 {
725  static char *texts[2] = { "128x", "64x" };
726 
728  uinfo->count = 1;
729  uinfo->value.enumerated.items = 2;
730 
731  if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
732  uinfo->value.enumerated.item = uinfo->value.enumerated.items -
733  1;
734  strcpy(uinfo->value.enumerated.name,
735  texts[uinfo->value.enumerated.item]);
736 
737  return 0;
738 }
739 
740 static int phase28_oversampling_get(struct snd_kcontrol *kcontrol,
741  struct snd_ctl_elem_value *ucontrol)
742 {
743  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
744  ucontrol->value.enumerated.item[0] = (wm_get(ice, WM_MASTER) & 0x8) ==
745  0x8;
746  return 0;
747 }
748 
749 static int phase28_oversampling_put(struct snd_kcontrol *kcontrol,
750  struct snd_ctl_elem_value *ucontrol)
751 {
752  int temp, temp2;
753  struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
754 
755  temp = wm_get(ice, WM_MASTER);
756  temp2 = temp;
757 
758  if (ucontrol->value.enumerated.item[0])
759  temp |= 0x8;
760  else
761  temp &= ~0x8;
762 
763  if (temp != temp2) {
764  wm_put(ice, WM_MASTER, temp);
765  return 1;
766  }
767  return 0;
768 }
769 
770 static const DECLARE_TLV_DB_SCALE(db_scale_wm_dac, -12700, 100, 1);
771 static const DECLARE_TLV_DB_SCALE(db_scale_wm_pcm, -6400, 50, 1);
772 
773 static struct snd_kcontrol_new phase28_dac_controls[] __devinitdata = {
774  {
776  .name = "Master Playback Switch",
777  .info = wm_master_mute_info,
778  .get = wm_master_mute_get,
779  .put = wm_master_mute_put
780  },
781  {
785  .name = "Master Playback Volume",
786  .info = wm_master_vol_info,
787  .get = wm_master_vol_get,
788  .put = wm_master_vol_put,
789  .tlv = { .p = db_scale_wm_dac }
790  },
791  {
793  .name = "Front Playback Switch",
794  .info = wm_mute_info,
795  .get = wm_mute_get,
796  .put = wm_mute_put,
797  .private_value = (2 << 8) | 0
798  },
799  {
803  .name = "Front Playback Volume",
804  .info = wm_vol_info,
805  .get = wm_vol_get,
806  .put = wm_vol_put,
807  .private_value = (2 << 8) | 0,
808  .tlv = { .p = db_scale_wm_dac }
809  },
810  {
812  .name = "Rear Playback Switch",
813  .info = wm_mute_info,
814  .get = wm_mute_get,
815  .put = wm_mute_put,
816  .private_value = (2 << 8) | 2
817  },
818  {
822  .name = "Rear Playback Volume",
823  .info = wm_vol_info,
824  .get = wm_vol_get,
825  .put = wm_vol_put,
826  .private_value = (2 << 8) | 2,
827  .tlv = { .p = db_scale_wm_dac }
828  },
829  {
831  .name = "Center Playback Switch",
832  .info = wm_mute_info,
833  .get = wm_mute_get,
834  .put = wm_mute_put,
835  .private_value = (1 << 8) | 4
836  },
837  {
841  .name = "Center Playback Volume",
842  .info = wm_vol_info,
843  .get = wm_vol_get,
844  .put = wm_vol_put,
845  .private_value = (1 << 8) | 4,
846  .tlv = { .p = db_scale_wm_dac }
847  },
848  {
850  .name = "LFE Playback Switch",
851  .info = wm_mute_info,
852  .get = wm_mute_get,
853  .put = wm_mute_put,
854  .private_value = (1 << 8) | 5
855  },
856  {
860  .name = "LFE Playback Volume",
861  .info = wm_vol_info,
862  .get = wm_vol_get,
863  .put = wm_vol_put,
864  .private_value = (1 << 8) | 5,
865  .tlv = { .p = db_scale_wm_dac }
866  },
867  {
869  .name = "Side Playback Switch",
870  .info = wm_mute_info,
871  .get = wm_mute_get,
872  .put = wm_mute_put,
873  .private_value = (2 << 8) | 6
874  },
875  {
879  .name = "Side Playback Volume",
880  .info = wm_vol_info,
881  .get = wm_vol_get,
882  .put = wm_vol_put,
883  .private_value = (2 << 8) | 6,
884  .tlv = { .p = db_scale_wm_dac }
885  }
886 };
887 
888 static struct snd_kcontrol_new wm_controls[] __devinitdata = {
889  {
891  .name = "PCM Playback Switch",
892  .info = wm_pcm_mute_info,
893  .get = wm_pcm_mute_get,
894  .put = wm_pcm_mute_put
895  },
896  {
900  .name = "PCM Playback Volume",
901  .info = wm_pcm_vol_info,
902  .get = wm_pcm_vol_get,
903  .put = wm_pcm_vol_put,
904  .tlv = { .p = db_scale_wm_pcm }
905  },
906  {
908  .name = "DAC Deemphasis Switch",
909  .info = phase28_deemp_info,
910  .get = phase28_deemp_get,
911  .put = phase28_deemp_put
912  },
913  {
915  .name = "ADC Oversampling",
916  .info = phase28_oversampling_info,
917  .get = phase28_oversampling_get,
918  .put = phase28_oversampling_put
919  }
920 };
921 
922 static int __devinit phase28_add_controls(struct snd_ice1712 *ice)
923 {
924  unsigned int i, counts;
925  int err;
926 
927  counts = ARRAY_SIZE(phase28_dac_controls);
928  for (i = 0; i < counts; i++) {
929  err = snd_ctl_add(ice->card,
930  snd_ctl_new1(&phase28_dac_controls[i],
931  ice));
932  if (err < 0)
933  return err;
934  }
935 
936  for (i = 0; i < ARRAY_SIZE(wm_controls); i++) {
937  err = snd_ctl_add(ice->card,
938  snd_ctl_new1(&wm_controls[i], ice));
939  if (err < 0)
940  return err;
941  }
942 
943  return 0;
944 }
945 
947  {
948  .subvendor = VT1724_SUBDEVICE_PHASE22,
949  .name = "Terratec PHASE 22",
950  .model = "phase22",
951  .chip_init = phase22_init,
952  .build_controls = phase22_add_controls,
953  .eeprom_size = sizeof(phase22_eeprom),
954  .eeprom_data = phase22_eeprom,
955  },
956  {
957  .subvendor = VT1724_SUBDEVICE_PHASE28,
958  .name = "Terratec PHASE 28",
959  .model = "phase28",
960  .chip_init = phase28_init,
961  .build_controls = phase28_add_controls,
962  .eeprom_size = sizeof(phase28_eeprom),
963  .eeprom_data = phase28_eeprom,
964  },
965  {
966  .subvendor = VT1724_SUBDEVICE_TS22,
967  .name = "Terrasoniq TS22 PCI",
968  .model = "TS22",
969  .chip_init = phase22_init,
970  .build_controls = phase22_add_controls,
971  .eeprom_size = sizeof(phase22_eeprom),
972  .eeprom_data = phase22_eeprom,
973  },
974  { } /* terminator */
975 };