2 * ALSA driver for ICEnsemble ICE1712 (Envy24)
4 * Lowlevel functions for Terratec EWS88MT/D, EWX24/96, DMX 6Fire
6 * Copyright (c) 2000 Jaroslav Kysela <perex@perex.cz>
7 * 2002 Takashi Iwai <tiwai@suse.de>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #include <linux/delay.h>
27 #include <linux/interrupt.h>
28 #include <linux/init.h>
29 #include <linux/slab.h>
30 #include <sound/core.h>
31 #include <sound/cs8427.h>
32 #include <sound/asoundef.h>
38 #include <sound/cs8403.h>
41 EWS_I2C_CS8404
= 0, EWS_I2C_PCF1
, EWS_I2C_PCF2
,
47 /* additional i2c devices for EWS boards */
49 struct snd_i2c_device
*i2cdevs
[3];
53 * access via i2c mode (for EWX 24/96, EWS 88MT&D)
56 /* send SDA and SCL */
57 static void ewx_i2c_setlines(struct snd_i2c_bus
*bus
, int clk
, int data
)
59 struct snd_ice1712
*ice
= bus
->private_data
;
60 unsigned char tmp
= 0;
62 tmp
|= ICE1712_EWX2496_SERIAL_CLOCK
;
64 tmp
|= ICE1712_EWX2496_SERIAL_DATA
;
65 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_DATA
, tmp
);
69 static int ewx_i2c_getclock(struct snd_i2c_bus
*bus
)
71 struct snd_ice1712
*ice
= bus
->private_data
;
72 return snd_ice1712_read(ice
, ICE1712_IREG_GPIO_DATA
) & ICE1712_EWX2496_SERIAL_CLOCK
? 1 : 0;
75 static int ewx_i2c_getdata(struct snd_i2c_bus
*bus
, int ack
)
77 struct snd_ice1712
*ice
= bus
->private_data
;
79 /* set RW pin to low */
80 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_WRITE_MASK
, ~ICE1712_EWX2496_RW
);
81 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_DATA
, 0);
84 bit
= snd_ice1712_read(ice
, ICE1712_IREG_GPIO_DATA
) & ICE1712_EWX2496_SERIAL_DATA
? 1 : 0;
85 /* set RW pin to high */
86 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_DATA
, ICE1712_EWX2496_RW
);
87 /* reset write mask */
88 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_WRITE_MASK
, ~ICE1712_EWX2496_SERIAL_CLOCK
);
92 static void ewx_i2c_start(struct snd_i2c_bus
*bus
)
94 struct snd_ice1712
*ice
= bus
->private_data
;
97 snd_ice1712_save_gpio_status(ice
);
99 mask
= ICE1712_EWX2496_RW
;
100 switch (ice
->eeprom
.subvendor
) {
101 case ICE1712_SUBDEVICE_EWX2496
:
102 mask
|= ICE1712_EWX2496_AK4524_CS
; /* CS high also */
104 case ICE1712_SUBDEVICE_DMX6FIRE
:
105 mask
|= ICE1712_6FIRE_AK4524_CS_MASK
; /* CS high also */
108 snd_ice1712_gpio_write_bits(ice
, mask
, mask
);
111 static void ewx_i2c_stop(struct snd_i2c_bus
*bus
)
113 struct snd_ice1712
*ice
= bus
->private_data
;
114 snd_ice1712_restore_gpio_status(ice
);
117 static void ewx_i2c_direction(struct snd_i2c_bus
*bus
, int clock
, int data
)
119 struct snd_ice1712
*ice
= bus
->private_data
;
120 unsigned char mask
= 0;
123 mask
|= ICE1712_EWX2496_SERIAL_CLOCK
; /* write SCL */
125 mask
|= ICE1712_EWX2496_SERIAL_DATA
; /* write SDA */
126 ice
->gpio
.direction
&= ~(ICE1712_EWX2496_SERIAL_CLOCK
|ICE1712_EWX2496_SERIAL_DATA
);
127 ice
->gpio
.direction
|= mask
;
128 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_DIRECTION
, ice
->gpio
.direction
);
129 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_WRITE_MASK
, ~mask
);
132 static struct snd_i2c_bit_ops snd_ice1712_ewx_cs8427_bit_ops
= {
133 .start
= ewx_i2c_start
,
134 .stop
= ewx_i2c_stop
,
135 .direction
= ewx_i2c_direction
,
136 .setlines
= ewx_i2c_setlines
,
137 .getclock
= ewx_i2c_getclock
,
138 .getdata
= ewx_i2c_getdata
,
146 /* AK4524 chip select; address 0x48 bit 0-3 */
147 static int snd_ice1712_ews88mt_chip_select(struct snd_ice1712
*ice
, int chip_mask
)
149 struct ews_spec
*spec
= ice
->spec
;
150 unsigned char data
, ndata
;
152 if (snd_BUG_ON(chip_mask
< 0 || chip_mask
> 0x0f))
154 snd_i2c_lock(ice
->i2c
);
155 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_PCF2
], &data
, 1) != 1)
157 ndata
= (data
& 0xf0) | chip_mask
;
159 if (snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_PCF2
], &ndata
, 1)
162 snd_i2c_unlock(ice
->i2c
);
166 snd_i2c_unlock(ice
->i2c
);
167 snd_printk(KERN_ERR
"AK4524 chip select failed, check cable to the front module\n");
171 /* start callback for EWS88MT, needs to select a certain chip mask */
172 static void ews88mt_ak4524_lock(struct snd_akm4xxx
*ak
, int chip
)
174 struct snd_ice1712
*ice
= ak
->private_data
[0];
176 /* assert AK4524 CS */
177 if (snd_ice1712_ews88mt_chip_select(ice
, ~(1 << chip
) & 0x0f) < 0)
178 snd_printk(KERN_ERR
"fatal error (ews88mt chip select)\n");
179 snd_ice1712_save_gpio_status(ice
);
180 tmp
= ICE1712_EWS88_SERIAL_DATA
|
181 ICE1712_EWS88_SERIAL_CLOCK
|
183 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_DIRECTION
,
184 ice
->gpio
.direction
| tmp
);
185 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_WRITE_MASK
, ~tmp
);
188 /* stop callback for EWS88MT, needs to deselect chip mask */
189 static void ews88mt_ak4524_unlock(struct snd_akm4xxx
*ak
, int chip
)
191 struct snd_ice1712
*ice
= ak
->private_data
[0];
192 snd_ice1712_restore_gpio_status(ice
);
194 snd_ice1712_ews88mt_chip_select(ice
, 0x0f);
197 /* start callback for EWX24/96 */
198 static void ewx2496_ak4524_lock(struct snd_akm4xxx
*ak
, int chip
)
200 struct snd_ice1712
*ice
= ak
->private_data
[0];
202 snd_ice1712_save_gpio_status(ice
);
203 tmp
= ICE1712_EWX2496_SERIAL_DATA
|
204 ICE1712_EWX2496_SERIAL_CLOCK
|
205 ICE1712_EWX2496_AK4524_CS
|
207 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_DIRECTION
,
208 ice
->gpio
.direction
| tmp
);
209 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_WRITE_MASK
, ~tmp
);
212 /* start callback for DMX 6fire */
213 static void dmx6fire_ak4524_lock(struct snd_akm4xxx
*ak
, int chip
)
215 struct snd_ak4xxx_private
*priv
= (void *)ak
->private_value
[0];
216 struct snd_ice1712
*ice
= ak
->private_data
[0];
218 snd_ice1712_save_gpio_status(ice
);
219 tmp
= priv
->cs_mask
= priv
->cs_addr
= (1 << chip
) & ICE1712_6FIRE_AK4524_CS_MASK
;
220 tmp
|= ICE1712_6FIRE_SERIAL_DATA
|
221 ICE1712_6FIRE_SERIAL_CLOCK
|
223 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_DIRECTION
,
224 ice
->gpio
.direction
| tmp
);
225 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_WRITE_MASK
, ~tmp
);
229 * CS8404 interface on EWS88MT/D
232 static void snd_ice1712_ews_cs8404_spdif_write(struct snd_ice1712
*ice
, unsigned char bits
)
234 struct ews_spec
*spec
= ice
->spec
;
235 unsigned char bytes
[2];
237 snd_i2c_lock(ice
->i2c
);
238 switch (ice
->eeprom
.subvendor
) {
239 case ICE1712_SUBDEVICE_EWS88MT
:
240 case ICE1712_SUBDEVICE_EWS88MT_NEW
:
241 case ICE1712_SUBDEVICE_PHASE88
:
242 case ICE1712_SUBDEVICE_TS88
:
243 if (snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_CS8404
], &bits
, 1)
247 case ICE1712_SUBDEVICE_EWS88D
:
248 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_88D
], bytes
, 2)
251 if (bits
!= bytes
[1]) {
253 if (snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_88D
],
260 snd_i2c_unlock(ice
->i2c
);
266 static void ews88_spdif_default_get(struct snd_ice1712
*ice
, struct snd_ctl_elem_value
*ucontrol
)
268 snd_cs8404_decode_spdif_bits(&ucontrol
->value
.iec958
, ice
->spdif
.cs8403_bits
);
271 static int ews88_spdif_default_put(struct snd_ice1712
*ice
, struct snd_ctl_elem_value
*ucontrol
)
276 val
= snd_cs8404_encode_spdif_bits(&ucontrol
->value
.iec958
);
277 spin_lock_irq(&ice
->reg_lock
);
278 change
= ice
->spdif
.cs8403_bits
!= val
;
279 ice
->spdif
.cs8403_bits
= val
;
280 if (change
&& ice
->playback_pro_substream
== NULL
) {
281 spin_unlock_irq(&ice
->reg_lock
);
282 snd_ice1712_ews_cs8404_spdif_write(ice
, val
);
284 spin_unlock_irq(&ice
->reg_lock
);
289 static void ews88_spdif_stream_get(struct snd_ice1712
*ice
, struct snd_ctl_elem_value
*ucontrol
)
291 snd_cs8404_decode_spdif_bits(&ucontrol
->value
.iec958
, ice
->spdif
.cs8403_stream_bits
);
294 static int ews88_spdif_stream_put(struct snd_ice1712
*ice
, struct snd_ctl_elem_value
*ucontrol
)
299 val
= snd_cs8404_encode_spdif_bits(&ucontrol
->value
.iec958
);
300 spin_lock_irq(&ice
->reg_lock
);
301 change
= ice
->spdif
.cs8403_stream_bits
!= val
;
302 ice
->spdif
.cs8403_stream_bits
= val
;
303 if (change
&& ice
->playback_pro_substream
!= NULL
) {
304 spin_unlock_irq(&ice
->reg_lock
);
305 snd_ice1712_ews_cs8404_spdif_write(ice
, val
);
307 spin_unlock_irq(&ice
->reg_lock
);
314 static void ews88_open_spdif(struct snd_ice1712
*ice
, struct snd_pcm_substream
*substream
)
316 ice
->spdif
.cs8403_stream_bits
= ice
->spdif
.cs8403_bits
;
319 /* set up SPDIF for EWS88MT / EWS88D */
320 static void ews88_setup_spdif(struct snd_ice1712
*ice
, int rate
)
326 spin_lock_irqsave(&ice
->reg_lock
, flags
);
327 tmp
= ice
->spdif
.cs8403_stream_bits
;
328 if (tmp
& 0x10) /* consumer */
329 tmp
&= (tmp
& 0x01) ? ~0x06 : ~0x60;
331 case 32000: tmp
|= (tmp
& 0x01) ? 0x02 : 0x00; break;
332 case 44100: tmp
|= (tmp
& 0x01) ? 0x06 : 0x40; break;
333 case 48000: tmp
|= (tmp
& 0x01) ? 0x04 : 0x20; break;
334 default: tmp
|= (tmp
& 0x01) ? 0x06 : 0x40; break;
336 change
= ice
->spdif
.cs8403_stream_bits
!= tmp
;
337 ice
->spdif
.cs8403_stream_bits
= tmp
;
338 spin_unlock_irqrestore(&ice
->reg_lock
, flags
);
340 snd_ctl_notify(ice
->card
, SNDRV_CTL_EVENT_MASK_VALUE
, &ice
->spdif
.stream_ctl
->id
);
341 snd_ice1712_ews_cs8404_spdif_write(ice
, tmp
);
347 static struct snd_akm4xxx akm_ews88mt __devinitdata
= {
352 .lock
= ews88mt_ak4524_lock
,
353 .unlock
= ews88mt_ak4524_unlock
357 static struct snd_ak4xxx_private akm_ews88mt_priv __devinitdata
= {
359 .cif
= 1, /* CIF high */
360 .data_mask
= ICE1712_EWS88_SERIAL_DATA
,
361 .clk_mask
= ICE1712_EWS88_SERIAL_CLOCK
,
364 .cs_none
= 0, /* no chip select on gpio */
365 .add_flags
= ICE1712_EWS88_RW
, /* set rw bit high */
369 static struct snd_akm4xxx akm_ewx2496 __devinitdata
= {
374 .lock
= ewx2496_ak4524_lock
378 static struct snd_ak4xxx_private akm_ewx2496_priv __devinitdata
= {
380 .cif
= 1, /* CIF high */
381 .data_mask
= ICE1712_EWS88_SERIAL_DATA
,
382 .clk_mask
= ICE1712_EWS88_SERIAL_CLOCK
,
383 .cs_mask
= ICE1712_EWX2496_AK4524_CS
,
384 .cs_addr
= ICE1712_EWX2496_AK4524_CS
,
386 .add_flags
= ICE1712_EWS88_RW
, /* set rw bit high */
390 static struct snd_akm4xxx akm_6fire __devinitdata
= {
395 .lock
= dmx6fire_ak4524_lock
399 static struct snd_ak4xxx_private akm_6fire_priv __devinitdata
= {
401 .cif
= 1, /* CIF high */
402 .data_mask
= ICE1712_6FIRE_SERIAL_DATA
,
403 .clk_mask
= ICE1712_6FIRE_SERIAL_CLOCK
,
405 .cs_addr
= 0, /* set later */
407 .add_flags
= ICE1712_6FIRE_RW
, /* set rw bit high */
412 * initialize the chip
416 #define PCF9554_REG_INPUT 0
417 #define PCF9554_REG_OUTPUT 1
418 #define PCF9554_REG_POLARITY 2
419 #define PCF9554_REG_CONFIG 3
421 static int snd_ice1712_6fire_write_pca(struct snd_ice1712
*ice
, unsigned char reg
, unsigned char data
);
423 static int __devinit
snd_ice1712_ews_init(struct snd_ice1712
*ice
)
426 struct snd_akm4xxx
*ak
;
427 struct ews_spec
*spec
;
429 /* set the analog DACs */
430 switch (ice
->eeprom
.subvendor
) {
431 case ICE1712_SUBDEVICE_EWX2496
:
432 ice
->num_total_dacs
= 2;
433 ice
->num_total_adcs
= 2;
435 case ICE1712_SUBDEVICE_EWS88MT
:
436 case ICE1712_SUBDEVICE_EWS88MT_NEW
:
437 case ICE1712_SUBDEVICE_PHASE88
:
438 case ICE1712_SUBDEVICE_TS88
:
439 ice
->num_total_dacs
= 8;
440 ice
->num_total_adcs
= 8;
442 case ICE1712_SUBDEVICE_EWS88D
:
443 /* Note: not analog but ADAT I/O */
444 ice
->num_total_dacs
= 8;
445 ice
->num_total_adcs
= 8;
447 case ICE1712_SUBDEVICE_DMX6FIRE
:
448 ice
->num_total_dacs
= 6;
449 ice
->num_total_adcs
= 6;
453 spec
= kzalloc(sizeof(*spec
), GFP_KERNEL
);
459 if ((err
= snd_i2c_bus_create(ice
->card
, "ICE1712 GPIO 1", NULL
, &ice
->i2c
)) < 0) {
460 snd_printk(KERN_ERR
"unable to create I2C bus\n");
463 ice
->i2c
->private_data
= ice
;
464 ice
->i2c
->hw_ops
.bit
= &snd_ice1712_ewx_cs8427_bit_ops
;
466 /* create i2c devices */
467 switch (ice
->eeprom
.subvendor
) {
468 case ICE1712_SUBDEVICE_DMX6FIRE
:
469 err
= snd_i2c_device_create(ice
->i2c
, "PCF9554",
470 ICE1712_6FIRE_PCF9554_ADDR
,
471 &spec
->i2cdevs
[EWS_I2C_6FIRE
]);
473 snd_printk(KERN_ERR
"PCF9554 initialization failed\n");
476 snd_ice1712_6fire_write_pca(ice
, PCF9554_REG_CONFIG
, 0x80);
478 case ICE1712_SUBDEVICE_EWS88MT
:
479 case ICE1712_SUBDEVICE_EWS88MT_NEW
:
480 case ICE1712_SUBDEVICE_PHASE88
:
481 case ICE1712_SUBDEVICE_TS88
:
483 err
= snd_i2c_device_create(ice
->i2c
, "CS8404",
484 ICE1712_EWS88MT_CS8404_ADDR
,
485 &spec
->i2cdevs
[EWS_I2C_CS8404
]);
488 err
= snd_i2c_device_create(ice
->i2c
, "PCF8574 (1st)",
489 ICE1712_EWS88MT_INPUT_ADDR
,
490 &spec
->i2cdevs
[EWS_I2C_PCF1
]);
493 err
= snd_i2c_device_create(ice
->i2c
, "PCF8574 (2nd)",
494 ICE1712_EWS88MT_OUTPUT_ADDR
,
495 &spec
->i2cdevs
[EWS_I2C_PCF2
]);
498 /* Check if the front module is connected */
499 if ((err
= snd_ice1712_ews88mt_chip_select(ice
, 0x0f)) < 0)
502 case ICE1712_SUBDEVICE_EWS88D
:
503 err
= snd_i2c_device_create(ice
->i2c
, "PCF8575",
504 ICE1712_EWS88D_PCF_ADDR
,
505 &spec
->i2cdevs
[EWS_I2C_88D
]);
511 /* set up SPDIF interface */
512 switch (ice
->eeprom
.subvendor
) {
513 case ICE1712_SUBDEVICE_EWX2496
:
514 if ((err
= snd_ice1712_init_cs8427(ice
, CS8427_BASE_ADDR
)) < 0)
516 snd_cs8427_reg_write(ice
->cs8427
, CS8427_REG_RECVERRMASK
, CS8427_UNLOCK
| CS8427_CONF
| CS8427_BIP
| CS8427_PAR
);
518 case ICE1712_SUBDEVICE_DMX6FIRE
:
519 if ((err
= snd_ice1712_init_cs8427(ice
, ICE1712_6FIRE_CS8427_ADDR
)) < 0)
521 snd_cs8427_reg_write(ice
->cs8427
, CS8427_REG_RECVERRMASK
, CS8427_UNLOCK
| CS8427_CONF
| CS8427_BIP
| CS8427_PAR
);
523 case ICE1712_SUBDEVICE_EWS88MT
:
524 case ICE1712_SUBDEVICE_EWS88MT_NEW
:
525 case ICE1712_SUBDEVICE_PHASE88
:
526 case ICE1712_SUBDEVICE_TS88
:
527 case ICE1712_SUBDEVICE_EWS88D
:
529 ice
->spdif
.ops
.open
= ews88_open_spdif
;
530 ice
->spdif
.ops
.setup_rate
= ews88_setup_spdif
;
531 ice
->spdif
.ops
.default_get
= ews88_spdif_default_get
;
532 ice
->spdif
.ops
.default_put
= ews88_spdif_default_put
;
533 ice
->spdif
.ops
.stream_get
= ews88_spdif_stream_get
;
534 ice
->spdif
.ops
.stream_put
= ews88_spdif_stream_put
;
535 /* Set spdif defaults */
536 snd_ice1712_ews_cs8404_spdif_write(ice
, ice
->spdif
.cs8403_bits
);
541 switch (ice
->eeprom
.subvendor
) {
542 case ICE1712_SUBDEVICE_EWS88D
:
547 ak
= ice
->akm
= kzalloc(sizeof(struct snd_akm4xxx
), GFP_KERNEL
);
552 switch (ice
->eeprom
.subvendor
) {
553 case ICE1712_SUBDEVICE_EWS88MT
:
554 case ICE1712_SUBDEVICE_EWS88MT_NEW
:
555 case ICE1712_SUBDEVICE_PHASE88
:
556 case ICE1712_SUBDEVICE_TS88
:
557 err
= snd_ice1712_akm4xxx_init(ak
, &akm_ews88mt
, &akm_ews88mt_priv
, ice
);
559 case ICE1712_SUBDEVICE_EWX2496
:
560 err
= snd_ice1712_akm4xxx_init(ak
, &akm_ewx2496
, &akm_ewx2496_priv
, ice
);
562 case ICE1712_SUBDEVICE_DMX6FIRE
:
563 err
= snd_ice1712_akm4xxx_init(ak
, &akm_6fire
, &akm_6fire_priv
, ice
);
573 * EWX 24/96 specific controls
576 /* i/o sensitivity - this callback is shared among other devices, too */
577 static int snd_ice1712_ewx_io_sense_info(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_info
*uinfo
){
579 static char *texts
[2] = {
582 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
584 uinfo
->value
.enumerated
.items
= 2;
585 if (uinfo
->value
.enumerated
.item
>= 2)
586 uinfo
->value
.enumerated
.item
= 1;
587 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
591 static int snd_ice1712_ewx_io_sense_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
593 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
594 unsigned char mask
= kcontrol
->private_value
& 0xff;
596 snd_ice1712_save_gpio_status(ice
);
597 ucontrol
->value
.enumerated
.item
[0] = snd_ice1712_read(ice
, ICE1712_IREG_GPIO_DATA
) & mask
? 1 : 0;
598 snd_ice1712_restore_gpio_status(ice
);
602 static int snd_ice1712_ewx_io_sense_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
604 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
605 unsigned char mask
= kcontrol
->private_value
& 0xff;
608 if (kcontrol
->private_value
& (1 << 31))
610 nval
= ucontrol
->value
.enumerated
.item
[0] ? mask
: 0;
611 snd_ice1712_save_gpio_status(ice
);
612 val
= snd_ice1712_read(ice
, ICE1712_IREG_GPIO_DATA
);
614 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_DATA
, nval
);
615 snd_ice1712_restore_gpio_status(ice
);
619 static struct snd_kcontrol_new snd_ice1712_ewx2496_controls
[] __devinitdata
= {
621 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
622 .name
= "Input Sensitivity Switch",
623 .info
= snd_ice1712_ewx_io_sense_info
,
624 .get
= snd_ice1712_ewx_io_sense_get
,
625 .put
= snd_ice1712_ewx_io_sense_put
,
626 .private_value
= ICE1712_EWX2496_AIN_SEL
,
629 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
630 .name
= "Output Sensitivity Switch",
631 .info
= snd_ice1712_ewx_io_sense_info
,
632 .get
= snd_ice1712_ewx_io_sense_get
,
633 .put
= snd_ice1712_ewx_io_sense_put
,
634 .private_value
= ICE1712_EWX2496_AOUT_SEL
,
640 * EWS88MT specific controls
642 /* analog output sensitivity;; address 0x48 bit 6 */
643 static int snd_ice1712_ews88mt_output_sense_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
645 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
646 struct ews_spec
*spec
= ice
->spec
;
649 snd_i2c_lock(ice
->i2c
);
650 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_PCF2
], &data
, 1) != 1) {
651 snd_i2c_unlock(ice
->i2c
);
654 snd_i2c_unlock(ice
->i2c
);
655 ucontrol
->value
.enumerated
.item
[0] = data
& ICE1712_EWS88MT_OUTPUT_SENSE
? 1 : 0; /* high = -10dBV, low = +4dBu */
659 /* analog output sensitivity;; address 0x48 bit 6 */
660 static int snd_ice1712_ews88mt_output_sense_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
662 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
663 struct ews_spec
*spec
= ice
->spec
;
664 unsigned char data
, ndata
;
666 snd_i2c_lock(ice
->i2c
);
667 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_PCF2
], &data
, 1) != 1) {
668 snd_i2c_unlock(ice
->i2c
);
671 ndata
= (data
& ~ICE1712_EWS88MT_OUTPUT_SENSE
) | (ucontrol
->value
.enumerated
.item
[0] ? ICE1712_EWS88MT_OUTPUT_SENSE
: 0);
672 if (ndata
!= data
&& snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_PCF2
],
674 snd_i2c_unlock(ice
->i2c
);
677 snd_i2c_unlock(ice
->i2c
);
678 return ndata
!= data
;
681 /* analog input sensitivity; address 0x46 */
682 static int snd_ice1712_ews88mt_input_sense_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
684 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
685 struct ews_spec
*spec
= ice
->spec
;
686 int channel
= snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
);
689 if (snd_BUG_ON(channel
< 0 || channel
> 7))
691 snd_i2c_lock(ice
->i2c
);
692 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_PCF1
], &data
, 1) != 1) {
693 snd_i2c_unlock(ice
->i2c
);
696 /* reversed; high = +4dBu, low = -10dBV */
697 ucontrol
->value
.enumerated
.item
[0] = data
& (1 << channel
) ? 0 : 1;
698 snd_i2c_unlock(ice
->i2c
);
702 /* analog output sensitivity; address 0x46 */
703 static int snd_ice1712_ews88mt_input_sense_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
705 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
706 struct ews_spec
*spec
= ice
->spec
;
707 int channel
= snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
);
708 unsigned char data
, ndata
;
710 if (snd_BUG_ON(channel
< 0 || channel
> 7))
712 snd_i2c_lock(ice
->i2c
);
713 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_PCF1
], &data
, 1) != 1) {
714 snd_i2c_unlock(ice
->i2c
);
717 ndata
= (data
& ~(1 << channel
)) | (ucontrol
->value
.enumerated
.item
[0] ? 0 : (1 << channel
));
718 if (ndata
!= data
&& snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_PCF1
],
720 snd_i2c_unlock(ice
->i2c
);
723 snd_i2c_unlock(ice
->i2c
);
724 return ndata
!= data
;
727 static struct snd_kcontrol_new snd_ice1712_ews88mt_input_sense __devinitdata
= {
728 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
729 .name
= "Input Sensitivity Switch",
730 .info
= snd_ice1712_ewx_io_sense_info
,
731 .get
= snd_ice1712_ews88mt_input_sense_get
,
732 .put
= snd_ice1712_ews88mt_input_sense_put
,
736 static struct snd_kcontrol_new snd_ice1712_ews88mt_output_sense __devinitdata
= {
737 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
738 .name
= "Output Sensitivity Switch",
739 .info
= snd_ice1712_ewx_io_sense_info
,
740 .get
= snd_ice1712_ews88mt_output_sense_get
,
741 .put
= snd_ice1712_ews88mt_output_sense_put
,
746 * EWS88D specific controls
749 #define snd_ice1712_ews88d_control_info snd_ctl_boolean_mono_info
751 static int snd_ice1712_ews88d_control_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
753 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
754 struct ews_spec
*spec
= ice
->spec
;
755 int shift
= kcontrol
->private_value
& 0xff;
756 int invert
= (kcontrol
->private_value
>> 8) & 1;
757 unsigned char data
[2];
759 snd_i2c_lock(ice
->i2c
);
760 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_88D
], data
, 2) != 2) {
761 snd_i2c_unlock(ice
->i2c
);
764 snd_i2c_unlock(ice
->i2c
);
765 data
[0] = (data
[shift
>> 3] >> (shift
& 7)) & 0x01;
768 ucontrol
->value
.integer
.value
[0] = data
[0];
772 static int snd_ice1712_ews88d_control_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
774 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
775 struct ews_spec
*spec
= ice
->spec
;
776 int shift
= kcontrol
->private_value
& 0xff;
777 int invert
= (kcontrol
->private_value
>> 8) & 1;
778 unsigned char data
[2], ndata
[2];
781 snd_i2c_lock(ice
->i2c
);
782 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_88D
], data
, 2) != 2) {
783 snd_i2c_unlock(ice
->i2c
);
786 ndata
[shift
>> 3] = data
[shift
>> 3] & ~(1 << (shift
& 7));
788 if (! ucontrol
->value
.integer
.value
[0])
789 ndata
[shift
>> 3] |= (1 << (shift
& 7));
791 if (ucontrol
->value
.integer
.value
[0])
792 ndata
[shift
>> 3] |= (1 << (shift
& 7));
794 change
= (data
[shift
>> 3] != ndata
[shift
>> 3]);
796 snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_88D
], data
, 2) != 2) {
797 snd_i2c_unlock(ice
->i2c
);
800 snd_i2c_unlock(ice
->i2c
);
804 #define EWS88D_CONTROL(xiface, xname, xshift, xinvert, xaccess) \
808 .info = snd_ice1712_ews88d_control_info,\
809 .get = snd_ice1712_ews88d_control_get,\
810 .put = snd_ice1712_ews88d_control_put,\
811 .private_value = xshift | (xinvert << 8),\
814 static struct snd_kcontrol_new snd_ice1712_ews88d_controls
[] __devinitdata
= {
815 EWS88D_CONTROL(SNDRV_CTL_ELEM_IFACE_MIXER
, "IEC958 Input Optical", 0, 1, 0), /* inverted */
816 EWS88D_CONTROL(SNDRV_CTL_ELEM_IFACE_MIXER
, "ADAT Output Optical", 1, 0, 0),
817 EWS88D_CONTROL(SNDRV_CTL_ELEM_IFACE_MIXER
, "ADAT External Master Clock", 2, 0, 0),
818 EWS88D_CONTROL(SNDRV_CTL_ELEM_IFACE_MIXER
, "Enable ADAT", 3, 0, 0),
819 EWS88D_CONTROL(SNDRV_CTL_ELEM_IFACE_MIXER
, "ADAT Through", 4, 1, 0),
824 * DMX 6Fire specific controls
827 static int snd_ice1712_6fire_read_pca(struct snd_ice1712
*ice
, unsigned char reg
)
830 struct ews_spec
*spec
= ice
->spec
;
832 snd_i2c_lock(ice
->i2c
);
834 snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_6FIRE
], &byte
, 1);
836 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_6FIRE
], &byte
, 1) != 1) {
837 snd_i2c_unlock(ice
->i2c
);
838 printk(KERN_ERR
"cannot read pca\n");
841 snd_i2c_unlock(ice
->i2c
);
845 static int snd_ice1712_6fire_write_pca(struct snd_ice1712
*ice
, unsigned char reg
, unsigned char data
)
847 unsigned char bytes
[2];
848 struct ews_spec
*spec
= ice
->spec
;
850 snd_i2c_lock(ice
->i2c
);
853 if (snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_6FIRE
], bytes
, 2) != 2) {
854 snd_i2c_unlock(ice
->i2c
);
857 snd_i2c_unlock(ice
->i2c
);
861 #define snd_ice1712_6fire_control_info snd_ctl_boolean_mono_info
863 static int snd_ice1712_6fire_control_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
865 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
866 int shift
= kcontrol
->private_value
& 0xff;
867 int invert
= (kcontrol
->private_value
>> 8) & 1;
870 if ((data
= snd_ice1712_6fire_read_pca(ice
, PCF9554_REG_OUTPUT
)) < 0)
872 data
= (data
>> shift
) & 1;
875 ucontrol
->value
.integer
.value
[0] = data
;
879 static int snd_ice1712_6fire_control_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
881 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
882 int shift
= kcontrol
->private_value
& 0xff;
883 int invert
= (kcontrol
->private_value
>> 8) & 1;
886 if ((data
= snd_ice1712_6fire_read_pca(ice
, PCF9554_REG_OUTPUT
)) < 0)
888 ndata
= data
& ~(1 << shift
);
889 if (ucontrol
->value
.integer
.value
[0])
890 ndata
|= (1 << shift
);
892 ndata
^= (1 << shift
);
894 snd_ice1712_6fire_write_pca(ice
, PCF9554_REG_OUTPUT
, (unsigned char)ndata
);
900 static int snd_ice1712_6fire_select_input_info(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_info
*uinfo
)
902 static char *texts
[4] = {
903 "Internal", "Front Input", "Rear Input", "Wave Table"
905 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
907 uinfo
->value
.enumerated
.items
= 4;
908 if (uinfo
->value
.enumerated
.item
>= 4)
909 uinfo
->value
.enumerated
.item
= 1;
910 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
914 static int snd_ice1712_6fire_select_input_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
916 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
919 if ((data
= snd_ice1712_6fire_read_pca(ice
, PCF9554_REG_OUTPUT
)) < 0)
921 ucontrol
->value
.integer
.value
[0] = data
& 3;
925 static int snd_ice1712_6fire_select_input_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
927 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
930 if ((data
= snd_ice1712_6fire_read_pca(ice
, PCF9554_REG_OUTPUT
)) < 0)
933 ndata
|= (ucontrol
->value
.integer
.value
[0] & 3);
935 snd_ice1712_6fire_write_pca(ice
, PCF9554_REG_OUTPUT
, (unsigned char)ndata
);
942 #define DMX6FIRE_CONTROL(xname, xshift, xinvert) \
943 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,\
945 .info = snd_ice1712_6fire_control_info,\
946 .get = snd_ice1712_6fire_control_get,\
947 .put = snd_ice1712_6fire_control_put,\
948 .private_value = xshift | (xinvert << 8),\
951 static struct snd_kcontrol_new snd_ice1712_6fire_controls
[] __devinitdata
= {
953 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
954 .name
= "Analog Input Select",
955 .info
= snd_ice1712_6fire_select_input_info
,
956 .get
= snd_ice1712_6fire_select_input_get
,
957 .put
= snd_ice1712_6fire_select_input_put
,
959 DMX6FIRE_CONTROL("Front Digital Input Switch", 2, 1),
960 // DMX6FIRE_CONTROL("Master Clock Select", 3, 0),
961 DMX6FIRE_CONTROL("Optical Digital Input Switch", 4, 0),
962 DMX6FIRE_CONTROL("Phono Analog Input Switch", 5, 0),
963 DMX6FIRE_CONTROL("Breakbox LED", 6, 0),
967 static int __devinit
snd_ice1712_ews_add_controls(struct snd_ice1712
*ice
)
972 /* all terratec cards have spdif, but cs8427 module builds it's own controls */
973 if (ice
->cs8427
== NULL
) {
974 err
= snd_ice1712_spdif_build_controls(ice
);
979 /* ak4524 controls */
980 switch (ice
->eeprom
.subvendor
) {
981 case ICE1712_SUBDEVICE_EWX2496
:
982 case ICE1712_SUBDEVICE_EWS88MT
:
983 case ICE1712_SUBDEVICE_EWS88MT_NEW
:
984 case ICE1712_SUBDEVICE_PHASE88
:
985 case ICE1712_SUBDEVICE_TS88
:
986 case ICE1712_SUBDEVICE_DMX6FIRE
:
987 err
= snd_ice1712_akm4xxx_build_controls(ice
);
993 /* card specific controls */
994 switch (ice
->eeprom
.subvendor
) {
995 case ICE1712_SUBDEVICE_EWX2496
:
996 for (idx
= 0; idx
< ARRAY_SIZE(snd_ice1712_ewx2496_controls
); idx
++) {
997 err
= snd_ctl_add(ice
->card
, snd_ctl_new1(&snd_ice1712_ewx2496_controls
[idx
], ice
));
1002 case ICE1712_SUBDEVICE_EWS88MT
:
1003 case ICE1712_SUBDEVICE_EWS88MT_NEW
:
1004 case ICE1712_SUBDEVICE_PHASE88
:
1005 case ICE1712_SUBDEVICE_TS88
:
1006 err
= snd_ctl_add(ice
->card
, snd_ctl_new1(&snd_ice1712_ews88mt_input_sense
, ice
));
1009 err
= snd_ctl_add(ice
->card
, snd_ctl_new1(&snd_ice1712_ews88mt_output_sense
, ice
));
1013 case ICE1712_SUBDEVICE_EWS88D
:
1014 for (idx
= 0; idx
< ARRAY_SIZE(snd_ice1712_ews88d_controls
); idx
++) {
1015 err
= snd_ctl_add(ice
->card
, snd_ctl_new1(&snd_ice1712_ews88d_controls
[idx
], ice
));
1020 case ICE1712_SUBDEVICE_DMX6FIRE
:
1021 for (idx
= 0; idx
< ARRAY_SIZE(snd_ice1712_6fire_controls
); idx
++) {
1022 err
= snd_ctl_add(ice
->card
, snd_ctl_new1(&snd_ice1712_6fire_controls
[idx
], ice
));
1033 struct snd_ice1712_card_info snd_ice1712_ews_cards
[] __devinitdata
= {
1035 .subvendor
= ICE1712_SUBDEVICE_EWX2496
,
1036 .name
= "TerraTec EWX24/96",
1038 .chip_init
= snd_ice1712_ews_init
,
1039 .build_controls
= snd_ice1712_ews_add_controls
,
1042 .subvendor
= ICE1712_SUBDEVICE_EWS88MT
,
1043 .name
= "TerraTec EWS88MT",
1045 .chip_init
= snd_ice1712_ews_init
,
1046 .build_controls
= snd_ice1712_ews_add_controls
,
1049 .subvendor
= ICE1712_SUBDEVICE_EWS88MT_NEW
,
1050 .name
= "TerraTec EWS88MT",
1051 .model
= "ews88mt_new",
1052 .chip_init
= snd_ice1712_ews_init
,
1053 .build_controls
= snd_ice1712_ews_add_controls
,
1056 .subvendor
= ICE1712_SUBDEVICE_PHASE88
,
1057 .name
= "TerraTec Phase88",
1059 .chip_init
= snd_ice1712_ews_init
,
1060 .build_controls
= snd_ice1712_ews_add_controls
,
1063 .subvendor
= ICE1712_SUBDEVICE_TS88
,
1064 .name
= "terrasoniq TS88",
1066 .chip_init
= snd_ice1712_ews_init
,
1067 .build_controls
= snd_ice1712_ews_add_controls
,
1070 .subvendor
= ICE1712_SUBDEVICE_EWS88D
,
1071 .name
= "TerraTec EWS88D",
1073 .chip_init
= snd_ice1712_ews_init
,
1074 .build_controls
= snd_ice1712_ews_add_controls
,
1077 .subvendor
= ICE1712_SUBDEVICE_DMX6FIRE
,
1078 .name
= "TerraTec DMX6Fire",
1079 .model
= "dmx6fire",
1080 .chip_init
= snd_ice1712_ews_init
,
1081 .build_controls
= snd_ice1712_ews_add_controls
,
1082 .mpu401_1_name
= "MIDI-Front DMX6fire",
1083 .mpu401_2_name
= "Wavetable DMX6fire",
1084 .mpu401_2_info_flags
= MPU401_INFO_OUTPUT
,
1086 { } /* terminator */