1 /* 2 * ALSA driver for ICEnsemble ICE1724 (Envy24) 3 * 4 * Lowlevel functions for Terratec PHASE 22 5 * 6 * Copyright (c) 2005 Misha Zhilin <misha@epiphan.com> 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) { 131 case VT1724_SUBDEVICE_PHASE22: 132 case VT1724_SUBDEVICE_TS22: 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) { 149 case VT1724_SUBDEVICE_PHASE22: 150 case VT1724_SUBDEVICE_TS22: 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) { 166 case VT1724_SUBDEVICE_PHASE22: 167 case VT1724_SUBDEVICE_TS22: 168 err = snd_ice1712_akm4xxx_build_controls(ice); 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| 221 PHASE28_SPI_CLK|PHASE28_WM_CS)); 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 { 336 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 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; 483 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 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) { 539 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 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 { 643 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 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 727 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 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 { 775 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 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 { 782 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 783 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | 784 SNDRV_CTL_ELEM_ACCESS_TLV_READ), 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 { 792 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 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 { 800 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 801 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | 802 SNDRV_CTL_ELEM_ACCESS_TLV_READ), 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 { 811 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 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 { 819 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 820 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | 821 SNDRV_CTL_ELEM_ACCESS_TLV_READ), 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 { 830 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 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 { 838 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 839 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | 840 SNDRV_CTL_ELEM_ACCESS_TLV_READ), 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 { 849 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 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 { 857 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 858 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | 859 SNDRV_CTL_ELEM_ACCESS_TLV_READ), 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 { 868 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 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 { 876 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 877 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | 878 SNDRV_CTL_ELEM_ACCESS_TLV_READ), 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 { 890 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 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 { 897 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 898 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | 899 SNDRV_CTL_ELEM_ACCESS_TLV_READ), 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 { 907 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 908 .name = "DAC Deemphasis Switch", 909 .info = phase28_deemp_info, 910 .get = phase28_deemp_get, 911 .put = phase28_deemp_put 912 }, 913 { 914 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 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 946 struct snd_ice1712_card_info snd_vt1724_phase_cards[] __devinitdata = { 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 }; 976