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
25 #include <linux/delay.h>
26 #include <linux/interrupt.h>
27 #include <linux/init.h>
28 #include <linux/slab.h>
29 #include <sound/core.h>
30 #include <sound/cs8427.h>
31 #include <sound/asoundef.h>
37 #include <sound/cs8403.h>
40 EWS_I2C_CS8404
= 0, EWS_I2C_PCF1
, EWS_I2C_PCF2
,
46 /* additional i2c devices for EWS boards */
48 struct snd_i2c_device
*i2cdevs
[3];
52 * access via i2c mode (for EWX 24/96, EWS 88MT&D)
55 /* send SDA and SCL */
56 static void ewx_i2c_setlines(struct snd_i2c_bus
*bus
, int clk
, int data
)
58 struct snd_ice1712
*ice
= bus
->private_data
;
59 unsigned char tmp
= 0;
61 tmp
|= ICE1712_EWX2496_SERIAL_CLOCK
;
63 tmp
|= ICE1712_EWX2496_SERIAL_DATA
;
64 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_DATA
, tmp
);
68 static int ewx_i2c_getclock(struct snd_i2c_bus
*bus
)
70 struct snd_ice1712
*ice
= bus
->private_data
;
71 return snd_ice1712_read(ice
, ICE1712_IREG_GPIO_DATA
) & ICE1712_EWX2496_SERIAL_CLOCK
? 1 : 0;
74 static int ewx_i2c_getdata(struct snd_i2c_bus
*bus
, int ack
)
76 struct snd_ice1712
*ice
= bus
->private_data
;
78 /* set RW pin to low */
79 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_WRITE_MASK
, ~ICE1712_EWX2496_RW
);
80 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_DATA
, 0);
83 bit
= snd_ice1712_read(ice
, ICE1712_IREG_GPIO_DATA
) & ICE1712_EWX2496_SERIAL_DATA
? 1 : 0;
84 /* set RW pin to high */
85 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_DATA
, ICE1712_EWX2496_RW
);
86 /* reset write mask */
87 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_WRITE_MASK
, ~ICE1712_EWX2496_SERIAL_CLOCK
);
91 static void ewx_i2c_start(struct snd_i2c_bus
*bus
)
93 struct snd_ice1712
*ice
= bus
->private_data
;
96 snd_ice1712_save_gpio_status(ice
);
98 mask
= ICE1712_EWX2496_RW
;
99 switch (ice
->eeprom
.subvendor
) {
100 case ICE1712_SUBDEVICE_EWX2496
:
101 mask
|= ICE1712_EWX2496_AK4524_CS
; /* CS high also */
103 case ICE1712_SUBDEVICE_DMX6FIRE
:
104 mask
|= ICE1712_6FIRE_AK4524_CS_MASK
; /* CS high also */
107 snd_ice1712_gpio_write_bits(ice
, mask
, mask
);
110 static void ewx_i2c_stop(struct snd_i2c_bus
*bus
)
112 struct snd_ice1712
*ice
= bus
->private_data
;
113 snd_ice1712_restore_gpio_status(ice
);
116 static void ewx_i2c_direction(struct snd_i2c_bus
*bus
, int clock
, int data
)
118 struct snd_ice1712
*ice
= bus
->private_data
;
119 unsigned char mask
= 0;
122 mask
|= ICE1712_EWX2496_SERIAL_CLOCK
; /* write SCL */
124 mask
|= ICE1712_EWX2496_SERIAL_DATA
; /* write SDA */
125 ice
->gpio
.direction
&= ~(ICE1712_EWX2496_SERIAL_CLOCK
|ICE1712_EWX2496_SERIAL_DATA
);
126 ice
->gpio
.direction
|= mask
;
127 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_DIRECTION
, ice
->gpio
.direction
);
128 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_WRITE_MASK
, ~mask
);
131 static struct snd_i2c_bit_ops snd_ice1712_ewx_cs8427_bit_ops
= {
132 .start
= ewx_i2c_start
,
133 .stop
= ewx_i2c_stop
,
134 .direction
= ewx_i2c_direction
,
135 .setlines
= ewx_i2c_setlines
,
136 .getclock
= ewx_i2c_getclock
,
137 .getdata
= ewx_i2c_getdata
,
145 /* AK4524 chip select; address 0x48 bit 0-3 */
146 static int snd_ice1712_ews88mt_chip_select(struct snd_ice1712
*ice
, int chip_mask
)
148 struct ews_spec
*spec
= ice
->spec
;
149 unsigned char data
, ndata
;
151 if (snd_BUG_ON(chip_mask
< 0 || chip_mask
> 0x0f))
153 snd_i2c_lock(ice
->i2c
);
154 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_PCF2
], &data
, 1) != 1)
156 ndata
= (data
& 0xf0) | chip_mask
;
158 if (snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_PCF2
], &ndata
, 1)
161 snd_i2c_unlock(ice
->i2c
);
165 snd_i2c_unlock(ice
->i2c
);
166 dev_err(ice
->card
->dev
,
167 "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 dev_err(ice
->card
->dev
, "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
= {
352 .lock
= ews88mt_ak4524_lock
,
353 .unlock
= ews88mt_ak4524_unlock
357 static struct snd_ak4xxx_private akm_ews88mt_priv
= {
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
= {
374 .lock
= ewx2496_ak4524_lock
378 static struct snd_ak4xxx_private akm_ewx2496_priv
= {
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
= {
395 .lock
= dmx6fire_ak4524_lock
399 static struct snd_ak4xxx_private akm_6fire_priv
= {
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 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 dev_err(ice
->card
->dev
, "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 dev_err(ice
->card
->dev
,
474 "PCF9554 initialization failed\n");
477 snd_ice1712_6fire_write_pca(ice
, PCF9554_REG_CONFIG
, 0x80);
479 case ICE1712_SUBDEVICE_EWS88MT
:
480 case ICE1712_SUBDEVICE_EWS88MT_NEW
:
481 case ICE1712_SUBDEVICE_PHASE88
:
482 case ICE1712_SUBDEVICE_TS88
:
484 err
= snd_i2c_device_create(ice
->i2c
, "CS8404",
485 ICE1712_EWS88MT_CS8404_ADDR
,
486 &spec
->i2cdevs
[EWS_I2C_CS8404
]);
489 err
= snd_i2c_device_create(ice
->i2c
, "PCF8574 (1st)",
490 ICE1712_EWS88MT_INPUT_ADDR
,
491 &spec
->i2cdevs
[EWS_I2C_PCF1
]);
494 err
= snd_i2c_device_create(ice
->i2c
, "PCF8574 (2nd)",
495 ICE1712_EWS88MT_OUTPUT_ADDR
,
496 &spec
->i2cdevs
[EWS_I2C_PCF2
]);
499 /* Check if the front module is connected */
500 if ((err
= snd_ice1712_ews88mt_chip_select(ice
, 0x0f)) < 0)
503 case ICE1712_SUBDEVICE_EWS88D
:
504 err
= snd_i2c_device_create(ice
->i2c
, "PCF8575",
505 ICE1712_EWS88D_PCF_ADDR
,
506 &spec
->i2cdevs
[EWS_I2C_88D
]);
512 /* set up SPDIF interface */
513 switch (ice
->eeprom
.subvendor
) {
514 case ICE1712_SUBDEVICE_EWX2496
:
515 if ((err
= snd_ice1712_init_cs8427(ice
, CS8427_BASE_ADDR
)) < 0)
517 snd_cs8427_reg_write(ice
->cs8427
, CS8427_REG_RECVERRMASK
, CS8427_UNLOCK
| CS8427_CONF
| CS8427_BIP
| CS8427_PAR
);
519 case ICE1712_SUBDEVICE_DMX6FIRE
:
520 if ((err
= snd_ice1712_init_cs8427(ice
, ICE1712_6FIRE_CS8427_ADDR
)) < 0)
522 snd_cs8427_reg_write(ice
->cs8427
, CS8427_REG_RECVERRMASK
, CS8427_UNLOCK
| CS8427_CONF
| CS8427_BIP
| CS8427_PAR
);
524 case ICE1712_SUBDEVICE_EWS88MT
:
525 case ICE1712_SUBDEVICE_EWS88MT_NEW
:
526 case ICE1712_SUBDEVICE_PHASE88
:
527 case ICE1712_SUBDEVICE_TS88
:
528 case ICE1712_SUBDEVICE_EWS88D
:
530 ice
->spdif
.ops
.open
= ews88_open_spdif
;
531 ice
->spdif
.ops
.setup_rate
= ews88_setup_spdif
;
532 ice
->spdif
.ops
.default_get
= ews88_spdif_default_get
;
533 ice
->spdif
.ops
.default_put
= ews88_spdif_default_put
;
534 ice
->spdif
.ops
.stream_get
= ews88_spdif_stream_get
;
535 ice
->spdif
.ops
.stream_put
= ews88_spdif_stream_put
;
536 /* Set spdif defaults */
537 snd_ice1712_ews_cs8404_spdif_write(ice
, ice
->spdif
.cs8403_bits
);
542 switch (ice
->eeprom
.subvendor
) {
543 case ICE1712_SUBDEVICE_EWS88D
:
548 ak
= ice
->akm
= kzalloc(sizeof(struct snd_akm4xxx
), GFP_KERNEL
);
553 switch (ice
->eeprom
.subvendor
) {
554 case ICE1712_SUBDEVICE_EWS88MT
:
555 case ICE1712_SUBDEVICE_EWS88MT_NEW
:
556 case ICE1712_SUBDEVICE_PHASE88
:
557 case ICE1712_SUBDEVICE_TS88
:
558 err
= snd_ice1712_akm4xxx_init(ak
, &akm_ews88mt
, &akm_ews88mt_priv
, ice
);
560 case ICE1712_SUBDEVICE_EWX2496
:
561 err
= snd_ice1712_akm4xxx_init(ak
, &akm_ewx2496
, &akm_ewx2496_priv
, ice
);
563 case ICE1712_SUBDEVICE_DMX6FIRE
:
564 err
= snd_ice1712_akm4xxx_init(ak
, &akm_6fire
, &akm_6fire_priv
, ice
);
574 * EWX 24/96 specific controls
577 /* i/o sensitivity - this callback is shared among other devices, too */
578 static int snd_ice1712_ewx_io_sense_info(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_info
*uinfo
){
580 static const char * const texts
[2] = {
583 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
585 uinfo
->value
.enumerated
.items
= 2;
586 if (uinfo
->value
.enumerated
.item
>= 2)
587 uinfo
->value
.enumerated
.item
= 1;
588 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
592 static int snd_ice1712_ewx_io_sense_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
594 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
595 unsigned char mask
= kcontrol
->private_value
& 0xff;
597 snd_ice1712_save_gpio_status(ice
);
598 ucontrol
->value
.enumerated
.item
[0] = snd_ice1712_read(ice
, ICE1712_IREG_GPIO_DATA
) & mask
? 1 : 0;
599 snd_ice1712_restore_gpio_status(ice
);
603 static int snd_ice1712_ewx_io_sense_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
605 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
606 unsigned char mask
= kcontrol
->private_value
& 0xff;
609 if (kcontrol
->private_value
& (1 << 31))
611 nval
= ucontrol
->value
.enumerated
.item
[0] ? mask
: 0;
612 snd_ice1712_save_gpio_status(ice
);
613 val
= snd_ice1712_read(ice
, ICE1712_IREG_GPIO_DATA
);
615 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_DATA
, nval
);
616 snd_ice1712_restore_gpio_status(ice
);
620 static struct snd_kcontrol_new snd_ice1712_ewx2496_controls
[] = {
622 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
623 .name
= "Input Sensitivity Switch",
624 .info
= snd_ice1712_ewx_io_sense_info
,
625 .get
= snd_ice1712_ewx_io_sense_get
,
626 .put
= snd_ice1712_ewx_io_sense_put
,
627 .private_value
= ICE1712_EWX2496_AIN_SEL
,
630 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
631 .name
= "Output Sensitivity Switch",
632 .info
= snd_ice1712_ewx_io_sense_info
,
633 .get
= snd_ice1712_ewx_io_sense_get
,
634 .put
= snd_ice1712_ewx_io_sense_put
,
635 .private_value
= ICE1712_EWX2496_AOUT_SEL
,
641 * EWS88MT specific controls
643 /* analog output sensitivity;; address 0x48 bit 6 */
644 static int snd_ice1712_ews88mt_output_sense_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
646 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
647 struct ews_spec
*spec
= ice
->spec
;
650 snd_i2c_lock(ice
->i2c
);
651 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_PCF2
], &data
, 1) != 1) {
652 snd_i2c_unlock(ice
->i2c
);
655 snd_i2c_unlock(ice
->i2c
);
656 ucontrol
->value
.enumerated
.item
[0] = data
& ICE1712_EWS88MT_OUTPUT_SENSE
? 1 : 0; /* high = -10dBV, low = +4dBu */
660 /* analog output sensitivity;; address 0x48 bit 6 */
661 static int snd_ice1712_ews88mt_output_sense_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
663 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
664 struct ews_spec
*spec
= ice
->spec
;
665 unsigned char data
, ndata
;
667 snd_i2c_lock(ice
->i2c
);
668 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_PCF2
], &data
, 1) != 1) {
669 snd_i2c_unlock(ice
->i2c
);
672 ndata
= (data
& ~ICE1712_EWS88MT_OUTPUT_SENSE
) | (ucontrol
->value
.enumerated
.item
[0] ? ICE1712_EWS88MT_OUTPUT_SENSE
: 0);
673 if (ndata
!= data
&& snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_PCF2
],
675 snd_i2c_unlock(ice
->i2c
);
678 snd_i2c_unlock(ice
->i2c
);
679 return ndata
!= data
;
682 /* analog input sensitivity; address 0x46 */
683 static int snd_ice1712_ews88mt_input_sense_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
685 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
686 struct ews_spec
*spec
= ice
->spec
;
687 int channel
= snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
);
690 if (snd_BUG_ON(channel
< 0 || channel
> 7))
692 snd_i2c_lock(ice
->i2c
);
693 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_PCF1
], &data
, 1) != 1) {
694 snd_i2c_unlock(ice
->i2c
);
697 /* reversed; high = +4dBu, low = -10dBV */
698 ucontrol
->value
.enumerated
.item
[0] = data
& (1 << channel
) ? 0 : 1;
699 snd_i2c_unlock(ice
->i2c
);
703 /* analog output sensitivity; address 0x46 */
704 static int snd_ice1712_ews88mt_input_sense_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
706 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
707 struct ews_spec
*spec
= ice
->spec
;
708 int channel
= snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
);
709 unsigned char data
, ndata
;
711 if (snd_BUG_ON(channel
< 0 || channel
> 7))
713 snd_i2c_lock(ice
->i2c
);
714 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_PCF1
], &data
, 1) != 1) {
715 snd_i2c_unlock(ice
->i2c
);
718 ndata
= (data
& ~(1 << channel
)) | (ucontrol
->value
.enumerated
.item
[0] ? 0 : (1 << channel
));
719 if (ndata
!= data
&& snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_PCF1
],
721 snd_i2c_unlock(ice
->i2c
);
724 snd_i2c_unlock(ice
->i2c
);
725 return ndata
!= data
;
728 static struct snd_kcontrol_new snd_ice1712_ews88mt_input_sense
= {
729 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
730 .name
= "Input Sensitivity Switch",
731 .info
= snd_ice1712_ewx_io_sense_info
,
732 .get
= snd_ice1712_ews88mt_input_sense_get
,
733 .put
= snd_ice1712_ews88mt_input_sense_put
,
737 static struct snd_kcontrol_new snd_ice1712_ews88mt_output_sense
= {
738 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
739 .name
= "Output Sensitivity Switch",
740 .info
= snd_ice1712_ewx_io_sense_info
,
741 .get
= snd_ice1712_ews88mt_output_sense_get
,
742 .put
= snd_ice1712_ews88mt_output_sense_put
,
747 * EWS88D specific controls
750 #define snd_ice1712_ews88d_control_info snd_ctl_boolean_mono_info
752 static int snd_ice1712_ews88d_control_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
754 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
755 struct ews_spec
*spec
= ice
->spec
;
756 int shift
= kcontrol
->private_value
& 0xff;
757 int invert
= (kcontrol
->private_value
>> 8) & 1;
758 unsigned char data
[2];
760 snd_i2c_lock(ice
->i2c
);
761 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_88D
], data
, 2) != 2) {
762 snd_i2c_unlock(ice
->i2c
);
765 snd_i2c_unlock(ice
->i2c
);
766 data
[0] = (data
[shift
>> 3] >> (shift
& 7)) & 0x01;
769 ucontrol
->value
.integer
.value
[0] = data
[0];
773 static int snd_ice1712_ews88d_control_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
775 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
776 struct ews_spec
*spec
= ice
->spec
;
777 int shift
= kcontrol
->private_value
& 0xff;
778 int invert
= (kcontrol
->private_value
>> 8) & 1;
779 unsigned char data
[2], ndata
[2];
782 snd_i2c_lock(ice
->i2c
);
783 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_88D
], data
, 2) != 2) {
784 snd_i2c_unlock(ice
->i2c
);
787 ndata
[shift
>> 3] = data
[shift
>> 3] & ~(1 << (shift
& 7));
789 if (! ucontrol
->value
.integer
.value
[0])
790 ndata
[shift
>> 3] |= (1 << (shift
& 7));
792 if (ucontrol
->value
.integer
.value
[0])
793 ndata
[shift
>> 3] |= (1 << (shift
& 7));
795 change
= (data
[shift
>> 3] != ndata
[shift
>> 3]);
797 snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_88D
], data
, 2) != 2) {
798 snd_i2c_unlock(ice
->i2c
);
801 snd_i2c_unlock(ice
->i2c
);
805 #define EWS88D_CONTROL(xiface, xname, xshift, xinvert, xaccess) \
809 .info = snd_ice1712_ews88d_control_info,\
810 .get = snd_ice1712_ews88d_control_get,\
811 .put = snd_ice1712_ews88d_control_put,\
812 .private_value = xshift | (xinvert << 8),\
815 static struct snd_kcontrol_new snd_ice1712_ews88d_controls
[] = {
816 EWS88D_CONTROL(SNDRV_CTL_ELEM_IFACE_MIXER
, "IEC958 Input Optical", 0, 1, 0), /* inverted */
817 EWS88D_CONTROL(SNDRV_CTL_ELEM_IFACE_MIXER
, "ADAT Output Optical", 1, 0, 0),
818 EWS88D_CONTROL(SNDRV_CTL_ELEM_IFACE_MIXER
, "ADAT External Master Clock", 2, 0, 0),
819 EWS88D_CONTROL(SNDRV_CTL_ELEM_IFACE_MIXER
, "Enable ADAT", 3, 0, 0),
820 EWS88D_CONTROL(SNDRV_CTL_ELEM_IFACE_MIXER
, "ADAT Through", 4, 1, 0),
825 * DMX 6Fire specific controls
828 static int snd_ice1712_6fire_read_pca(struct snd_ice1712
*ice
, unsigned char reg
)
831 struct ews_spec
*spec
= ice
->spec
;
833 snd_i2c_lock(ice
->i2c
);
835 snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_6FIRE
], &byte
, 1);
837 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_6FIRE
], &byte
, 1) != 1) {
838 snd_i2c_unlock(ice
->i2c
);
839 dev_err(ice
->card
->dev
, "cannot read pca\n");
842 snd_i2c_unlock(ice
->i2c
);
846 static int snd_ice1712_6fire_write_pca(struct snd_ice1712
*ice
, unsigned char reg
, unsigned char data
)
848 unsigned char bytes
[2];
849 struct ews_spec
*spec
= ice
->spec
;
851 snd_i2c_lock(ice
->i2c
);
854 if (snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_6FIRE
], bytes
, 2) != 2) {
855 snd_i2c_unlock(ice
->i2c
);
858 snd_i2c_unlock(ice
->i2c
);
862 #define snd_ice1712_6fire_control_info snd_ctl_boolean_mono_info
864 static int snd_ice1712_6fire_control_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
866 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
867 int shift
= kcontrol
->private_value
& 0xff;
868 int invert
= (kcontrol
->private_value
>> 8) & 1;
871 if ((data
= snd_ice1712_6fire_read_pca(ice
, PCF9554_REG_OUTPUT
)) < 0)
873 data
= (data
>> shift
) & 1;
876 ucontrol
->value
.integer
.value
[0] = data
;
880 static int snd_ice1712_6fire_control_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
882 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
883 int shift
= kcontrol
->private_value
& 0xff;
884 int invert
= (kcontrol
->private_value
>> 8) & 1;
887 if ((data
= snd_ice1712_6fire_read_pca(ice
, PCF9554_REG_OUTPUT
)) < 0)
889 ndata
= data
& ~(1 << shift
);
890 if (ucontrol
->value
.integer
.value
[0])
891 ndata
|= (1 << shift
);
893 ndata
^= (1 << shift
);
895 snd_ice1712_6fire_write_pca(ice
, PCF9554_REG_OUTPUT
, (unsigned char)ndata
);
901 static int snd_ice1712_6fire_select_input_info(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_info
*uinfo
)
903 static const char * const texts
[4] = {
904 "Internal", "Front Input", "Rear Input", "Wave Table"
906 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_ENUMERATED
;
908 uinfo
->value
.enumerated
.items
= 4;
909 if (uinfo
->value
.enumerated
.item
>= 4)
910 uinfo
->value
.enumerated
.item
= 1;
911 strcpy(uinfo
->value
.enumerated
.name
, texts
[uinfo
->value
.enumerated
.item
]);
915 static int snd_ice1712_6fire_select_input_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
917 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
920 if ((data
= snd_ice1712_6fire_read_pca(ice
, PCF9554_REG_OUTPUT
)) < 0)
922 ucontrol
->value
.integer
.value
[0] = data
& 3;
926 static int snd_ice1712_6fire_select_input_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
928 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
931 if ((data
= snd_ice1712_6fire_read_pca(ice
, PCF9554_REG_OUTPUT
)) < 0)
934 ndata
|= (ucontrol
->value
.integer
.value
[0] & 3);
936 snd_ice1712_6fire_write_pca(ice
, PCF9554_REG_OUTPUT
, (unsigned char)ndata
);
943 #define DMX6FIRE_CONTROL(xname, xshift, xinvert) \
944 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,\
946 .info = snd_ice1712_6fire_control_info,\
947 .get = snd_ice1712_6fire_control_get,\
948 .put = snd_ice1712_6fire_control_put,\
949 .private_value = xshift | (xinvert << 8),\
952 static struct snd_kcontrol_new snd_ice1712_6fire_controls
[] = {
954 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
955 .name
= "Analog Input Select",
956 .info
= snd_ice1712_6fire_select_input_info
,
957 .get
= snd_ice1712_6fire_select_input_get
,
958 .put
= snd_ice1712_6fire_select_input_put
,
960 DMX6FIRE_CONTROL("Front Digital Input Switch", 2, 1),
961 // DMX6FIRE_CONTROL("Master Clock Select", 3, 0),
962 DMX6FIRE_CONTROL("Optical Digital Input Switch", 4, 0),
963 DMX6FIRE_CONTROL("Phono Analog Input Switch", 5, 0),
964 DMX6FIRE_CONTROL("Breakbox LED", 6, 0),
968 static int snd_ice1712_ews_add_controls(struct snd_ice1712
*ice
)
973 /* all terratec cards have spdif, but cs8427 module builds it's own controls */
974 if (ice
->cs8427
== NULL
) {
975 err
= snd_ice1712_spdif_build_controls(ice
);
980 /* ak4524 controls */
981 switch (ice
->eeprom
.subvendor
) {
982 case ICE1712_SUBDEVICE_EWX2496
:
983 case ICE1712_SUBDEVICE_EWS88MT
:
984 case ICE1712_SUBDEVICE_EWS88MT_NEW
:
985 case ICE1712_SUBDEVICE_PHASE88
:
986 case ICE1712_SUBDEVICE_TS88
:
987 case ICE1712_SUBDEVICE_DMX6FIRE
:
988 err
= snd_ice1712_akm4xxx_build_controls(ice
);
994 /* card specific controls */
995 switch (ice
->eeprom
.subvendor
) {
996 case ICE1712_SUBDEVICE_EWX2496
:
997 for (idx
= 0; idx
< ARRAY_SIZE(snd_ice1712_ewx2496_controls
); idx
++) {
998 err
= snd_ctl_add(ice
->card
, snd_ctl_new1(&snd_ice1712_ewx2496_controls
[idx
], ice
));
1003 case ICE1712_SUBDEVICE_EWS88MT
:
1004 case ICE1712_SUBDEVICE_EWS88MT_NEW
:
1005 case ICE1712_SUBDEVICE_PHASE88
:
1006 case ICE1712_SUBDEVICE_TS88
:
1007 err
= snd_ctl_add(ice
->card
, snd_ctl_new1(&snd_ice1712_ews88mt_input_sense
, ice
));
1010 err
= snd_ctl_add(ice
->card
, snd_ctl_new1(&snd_ice1712_ews88mt_output_sense
, ice
));
1014 case ICE1712_SUBDEVICE_EWS88D
:
1015 for (idx
= 0; idx
< ARRAY_SIZE(snd_ice1712_ews88d_controls
); idx
++) {
1016 err
= snd_ctl_add(ice
->card
, snd_ctl_new1(&snd_ice1712_ews88d_controls
[idx
], ice
));
1021 case ICE1712_SUBDEVICE_DMX6FIRE
:
1022 for (idx
= 0; idx
< ARRAY_SIZE(snd_ice1712_6fire_controls
); idx
++) {
1023 err
= snd_ctl_add(ice
->card
, snd_ctl_new1(&snd_ice1712_6fire_controls
[idx
], ice
));
1034 struct snd_ice1712_card_info snd_ice1712_ews_cards
[] = {
1036 .subvendor
= ICE1712_SUBDEVICE_EWX2496
,
1037 .name
= "TerraTec EWX24/96",
1039 .chip_init
= snd_ice1712_ews_init
,
1040 .build_controls
= snd_ice1712_ews_add_controls
,
1043 .subvendor
= ICE1712_SUBDEVICE_EWS88MT
,
1044 .name
= "TerraTec EWS88MT",
1046 .chip_init
= snd_ice1712_ews_init
,
1047 .build_controls
= snd_ice1712_ews_add_controls
,
1050 .subvendor
= ICE1712_SUBDEVICE_EWS88MT_NEW
,
1051 .name
= "TerraTec EWS88MT",
1052 .model
= "ews88mt_new",
1053 .chip_init
= snd_ice1712_ews_init
,
1054 .build_controls
= snd_ice1712_ews_add_controls
,
1057 .subvendor
= ICE1712_SUBDEVICE_PHASE88
,
1058 .name
= "TerraTec Phase88",
1060 .chip_init
= snd_ice1712_ews_init
,
1061 .build_controls
= snd_ice1712_ews_add_controls
,
1064 .subvendor
= ICE1712_SUBDEVICE_TS88
,
1065 .name
= "terrasoniq TS88",
1067 .chip_init
= snd_ice1712_ews_init
,
1068 .build_controls
= snd_ice1712_ews_add_controls
,
1071 .subvendor
= ICE1712_SUBDEVICE_EWS88D
,
1072 .name
= "TerraTec EWS88D",
1074 .chip_init
= snd_ice1712_ews_init
,
1075 .build_controls
= snd_ice1712_ews_add_controls
,
1078 .subvendor
= ICE1712_SUBDEVICE_DMX6FIRE
,
1079 .name
= "TerraTec DMX6Fire",
1080 .model
= "dmx6fire",
1081 .chip_init
= snd_ice1712_ews_init
,
1082 .build_controls
= snd_ice1712_ews_add_controls
,
1083 .mpu401_1_name
= "MIDI-Front DMX6fire",
1084 .mpu401_2_name
= "Wavetable DMX6fire",
1085 .mpu401_2_info_flags
= MPU401_INFO_OUTPUT
,
1087 { } /* terminator */