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 const struct snd_akm4xxx akm_ews88mt
= {
352 .lock
= ews88mt_ak4524_lock
,
353 .unlock
= ews88mt_ak4524_unlock
357 static const 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 const struct snd_akm4xxx akm_ewx2496
= {
374 .lock
= ewx2496_ak4524_lock
378 static const 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 const struct snd_akm4xxx akm_6fire
= {
395 .lock
= dmx6fire_ak4524_lock
399 static const 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 return snd_ctl_enum_info(uinfo
, 1, 2, texts
);
586 static int snd_ice1712_ewx_io_sense_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
588 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
589 unsigned char mask
= kcontrol
->private_value
& 0xff;
591 snd_ice1712_save_gpio_status(ice
);
592 ucontrol
->value
.enumerated
.item
[0] = snd_ice1712_read(ice
, ICE1712_IREG_GPIO_DATA
) & mask
? 1 : 0;
593 snd_ice1712_restore_gpio_status(ice
);
597 static int snd_ice1712_ewx_io_sense_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
599 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
600 unsigned char mask
= kcontrol
->private_value
& 0xff;
603 if (kcontrol
->private_value
& (1 << 31))
605 nval
= ucontrol
->value
.enumerated
.item
[0] ? mask
: 0;
606 snd_ice1712_save_gpio_status(ice
);
607 val
= snd_ice1712_read(ice
, ICE1712_IREG_GPIO_DATA
);
609 snd_ice1712_write(ice
, ICE1712_IREG_GPIO_DATA
, nval
);
610 snd_ice1712_restore_gpio_status(ice
);
614 static struct snd_kcontrol_new snd_ice1712_ewx2496_controls
[] = {
616 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
617 .name
= "Input Sensitivity Switch",
618 .info
= snd_ice1712_ewx_io_sense_info
,
619 .get
= snd_ice1712_ewx_io_sense_get
,
620 .put
= snd_ice1712_ewx_io_sense_put
,
621 .private_value
= ICE1712_EWX2496_AIN_SEL
,
624 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
625 .name
= "Output Sensitivity Switch",
626 .info
= snd_ice1712_ewx_io_sense_info
,
627 .get
= snd_ice1712_ewx_io_sense_get
,
628 .put
= snd_ice1712_ewx_io_sense_put
,
629 .private_value
= ICE1712_EWX2496_AOUT_SEL
,
635 * EWS88MT specific controls
637 /* analog output sensitivity;; address 0x48 bit 6 */
638 static int snd_ice1712_ews88mt_output_sense_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
640 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
641 struct ews_spec
*spec
= ice
->spec
;
644 snd_i2c_lock(ice
->i2c
);
645 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_PCF2
], &data
, 1) != 1) {
646 snd_i2c_unlock(ice
->i2c
);
649 snd_i2c_unlock(ice
->i2c
);
650 ucontrol
->value
.enumerated
.item
[0] = data
& ICE1712_EWS88MT_OUTPUT_SENSE
? 1 : 0; /* high = -10dBV, low = +4dBu */
654 /* analog output sensitivity;; address 0x48 bit 6 */
655 static int snd_ice1712_ews88mt_output_sense_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
657 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
658 struct ews_spec
*spec
= ice
->spec
;
659 unsigned char data
, ndata
;
661 snd_i2c_lock(ice
->i2c
);
662 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_PCF2
], &data
, 1) != 1) {
663 snd_i2c_unlock(ice
->i2c
);
666 ndata
= (data
& ~ICE1712_EWS88MT_OUTPUT_SENSE
) | (ucontrol
->value
.enumerated
.item
[0] ? ICE1712_EWS88MT_OUTPUT_SENSE
: 0);
667 if (ndata
!= data
&& snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_PCF2
],
669 snd_i2c_unlock(ice
->i2c
);
672 snd_i2c_unlock(ice
->i2c
);
673 return ndata
!= data
;
676 /* analog input sensitivity; address 0x46 */
677 static int snd_ice1712_ews88mt_input_sense_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
679 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
680 struct ews_spec
*spec
= ice
->spec
;
681 int channel
= snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
);
684 if (snd_BUG_ON(channel
< 0 || channel
> 7))
686 snd_i2c_lock(ice
->i2c
);
687 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_PCF1
], &data
, 1) != 1) {
688 snd_i2c_unlock(ice
->i2c
);
691 /* reversed; high = +4dBu, low = -10dBV */
692 ucontrol
->value
.enumerated
.item
[0] = data
& (1 << channel
) ? 0 : 1;
693 snd_i2c_unlock(ice
->i2c
);
697 /* analog output sensitivity; address 0x46 */
698 static int snd_ice1712_ews88mt_input_sense_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
700 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
701 struct ews_spec
*spec
= ice
->spec
;
702 int channel
= snd_ctl_get_ioffidx(kcontrol
, &ucontrol
->id
);
703 unsigned char data
, ndata
;
705 if (snd_BUG_ON(channel
< 0 || channel
> 7))
707 snd_i2c_lock(ice
->i2c
);
708 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_PCF1
], &data
, 1) != 1) {
709 snd_i2c_unlock(ice
->i2c
);
712 ndata
= (data
& ~(1 << channel
)) | (ucontrol
->value
.enumerated
.item
[0] ? 0 : (1 << channel
));
713 if (ndata
!= data
&& snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_PCF1
],
715 snd_i2c_unlock(ice
->i2c
);
718 snd_i2c_unlock(ice
->i2c
);
719 return ndata
!= data
;
722 static const struct snd_kcontrol_new snd_ice1712_ews88mt_input_sense
= {
723 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
724 .name
= "Input Sensitivity Switch",
725 .info
= snd_ice1712_ewx_io_sense_info
,
726 .get
= snd_ice1712_ews88mt_input_sense_get
,
727 .put
= snd_ice1712_ews88mt_input_sense_put
,
731 static const struct snd_kcontrol_new snd_ice1712_ews88mt_output_sense
= {
732 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
733 .name
= "Output Sensitivity Switch",
734 .info
= snd_ice1712_ewx_io_sense_info
,
735 .get
= snd_ice1712_ews88mt_output_sense_get
,
736 .put
= snd_ice1712_ews88mt_output_sense_put
,
741 * EWS88D specific controls
744 #define snd_ice1712_ews88d_control_info snd_ctl_boolean_mono_info
746 static int snd_ice1712_ews88d_control_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
748 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
749 struct ews_spec
*spec
= ice
->spec
;
750 int shift
= kcontrol
->private_value
& 0xff;
751 int invert
= (kcontrol
->private_value
>> 8) & 1;
752 unsigned char data
[2];
754 snd_i2c_lock(ice
->i2c
);
755 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_88D
], data
, 2) != 2) {
756 snd_i2c_unlock(ice
->i2c
);
759 snd_i2c_unlock(ice
->i2c
);
760 data
[0] = (data
[shift
>> 3] >> (shift
& 7)) & 0x01;
763 ucontrol
->value
.integer
.value
[0] = data
[0];
767 static int snd_ice1712_ews88d_control_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
769 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
770 struct ews_spec
*spec
= ice
->spec
;
771 int shift
= kcontrol
->private_value
& 0xff;
772 int invert
= (kcontrol
->private_value
>> 8) & 1;
773 unsigned char data
[2], ndata
[2];
776 snd_i2c_lock(ice
->i2c
);
777 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_88D
], data
, 2) != 2) {
778 snd_i2c_unlock(ice
->i2c
);
781 ndata
[shift
>> 3] = data
[shift
>> 3] & ~(1 << (shift
& 7));
783 if (! ucontrol
->value
.integer
.value
[0])
784 ndata
[shift
>> 3] |= (1 << (shift
& 7));
786 if (ucontrol
->value
.integer
.value
[0])
787 ndata
[shift
>> 3] |= (1 << (shift
& 7));
789 change
= (data
[shift
>> 3] != ndata
[shift
>> 3]);
791 snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_88D
], data
, 2) != 2) {
792 snd_i2c_unlock(ice
->i2c
);
795 snd_i2c_unlock(ice
->i2c
);
799 #define EWS88D_CONTROL(xiface, xname, xshift, xinvert, xaccess) \
803 .info = snd_ice1712_ews88d_control_info,\
804 .get = snd_ice1712_ews88d_control_get,\
805 .put = snd_ice1712_ews88d_control_put,\
806 .private_value = xshift | (xinvert << 8),\
809 static struct snd_kcontrol_new snd_ice1712_ews88d_controls
[] = {
810 EWS88D_CONTROL(SNDRV_CTL_ELEM_IFACE_MIXER
, "IEC958 Input Optical", 0, 1, 0), /* inverted */
811 EWS88D_CONTROL(SNDRV_CTL_ELEM_IFACE_MIXER
, "ADAT Output Optical", 1, 0, 0),
812 EWS88D_CONTROL(SNDRV_CTL_ELEM_IFACE_MIXER
, "ADAT External Master Clock", 2, 0, 0),
813 EWS88D_CONTROL(SNDRV_CTL_ELEM_IFACE_MIXER
, "Enable ADAT", 3, 0, 0),
814 EWS88D_CONTROL(SNDRV_CTL_ELEM_IFACE_MIXER
, "ADAT Through", 4, 1, 0),
819 * DMX 6Fire specific controls
822 static int snd_ice1712_6fire_read_pca(struct snd_ice1712
*ice
, unsigned char reg
)
825 struct ews_spec
*spec
= ice
->spec
;
827 snd_i2c_lock(ice
->i2c
);
829 snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_6FIRE
], &byte
, 1);
831 if (snd_i2c_readbytes(spec
->i2cdevs
[EWS_I2C_6FIRE
], &byte
, 1) != 1) {
832 snd_i2c_unlock(ice
->i2c
);
833 dev_err(ice
->card
->dev
, "cannot read pca\n");
836 snd_i2c_unlock(ice
->i2c
);
840 static int snd_ice1712_6fire_write_pca(struct snd_ice1712
*ice
, unsigned char reg
, unsigned char data
)
842 unsigned char bytes
[2];
843 struct ews_spec
*spec
= ice
->spec
;
845 snd_i2c_lock(ice
->i2c
);
848 if (snd_i2c_sendbytes(spec
->i2cdevs
[EWS_I2C_6FIRE
], bytes
, 2) != 2) {
849 snd_i2c_unlock(ice
->i2c
);
852 snd_i2c_unlock(ice
->i2c
);
856 #define snd_ice1712_6fire_control_info snd_ctl_boolean_mono_info
858 static int snd_ice1712_6fire_control_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
860 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
861 int shift
= kcontrol
->private_value
& 0xff;
862 int invert
= (kcontrol
->private_value
>> 8) & 1;
865 if ((data
= snd_ice1712_6fire_read_pca(ice
, PCF9554_REG_OUTPUT
)) < 0)
867 data
= (data
>> shift
) & 1;
870 ucontrol
->value
.integer
.value
[0] = data
;
874 static int snd_ice1712_6fire_control_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
876 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
877 int shift
= kcontrol
->private_value
& 0xff;
878 int invert
= (kcontrol
->private_value
>> 8) & 1;
881 if ((data
= snd_ice1712_6fire_read_pca(ice
, PCF9554_REG_OUTPUT
)) < 0)
883 ndata
= data
& ~(1 << shift
);
884 if (ucontrol
->value
.integer
.value
[0])
885 ndata
|= (1 << shift
);
887 ndata
^= (1 << shift
);
889 snd_ice1712_6fire_write_pca(ice
, PCF9554_REG_OUTPUT
, (unsigned char)ndata
);
895 static int snd_ice1712_6fire_select_input_info(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_info
*uinfo
)
897 static const char * const texts
[4] = {
898 "Internal", "Front Input", "Rear Input", "Wave Table"
900 return snd_ctl_enum_info(uinfo
, 1, 4, texts
);
903 static int snd_ice1712_6fire_select_input_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
905 struct snd_ice1712
*ice
= snd_kcontrol_chip(kcontrol
);
908 if ((data
= snd_ice1712_6fire_read_pca(ice
, PCF9554_REG_OUTPUT
)) < 0)
910 ucontrol
->value
.integer
.value
[0] = data
& 3;
914 static int snd_ice1712_6fire_select_input_put(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)
922 ndata
|= (ucontrol
->value
.integer
.value
[0] & 3);
924 snd_ice1712_6fire_write_pca(ice
, PCF9554_REG_OUTPUT
, (unsigned char)ndata
);
931 #define DMX6FIRE_CONTROL(xname, xshift, xinvert) \
932 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,\
934 .info = snd_ice1712_6fire_control_info,\
935 .get = snd_ice1712_6fire_control_get,\
936 .put = snd_ice1712_6fire_control_put,\
937 .private_value = xshift | (xinvert << 8),\
940 static struct snd_kcontrol_new snd_ice1712_6fire_controls
[] = {
942 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
943 .name
= "Analog Input Select",
944 .info
= snd_ice1712_6fire_select_input_info
,
945 .get
= snd_ice1712_6fire_select_input_get
,
946 .put
= snd_ice1712_6fire_select_input_put
,
948 DMX6FIRE_CONTROL("Front Digital Input Switch", 2, 1),
949 // DMX6FIRE_CONTROL("Master Clock Select", 3, 0),
950 DMX6FIRE_CONTROL("Optical Digital Input Switch", 4, 0),
951 DMX6FIRE_CONTROL("Phono Analog Input Switch", 5, 0),
952 DMX6FIRE_CONTROL("Breakbox LED", 6, 0),
956 static int snd_ice1712_ews_add_controls(struct snd_ice1712
*ice
)
961 /* all terratec cards have spdif, but cs8427 module builds it's own controls */
962 if (ice
->cs8427
== NULL
) {
963 err
= snd_ice1712_spdif_build_controls(ice
);
968 /* ak4524 controls */
969 switch (ice
->eeprom
.subvendor
) {
970 case ICE1712_SUBDEVICE_EWX2496
:
971 case ICE1712_SUBDEVICE_EWS88MT
:
972 case ICE1712_SUBDEVICE_EWS88MT_NEW
:
973 case ICE1712_SUBDEVICE_PHASE88
:
974 case ICE1712_SUBDEVICE_TS88
:
975 case ICE1712_SUBDEVICE_DMX6FIRE
:
976 err
= snd_ice1712_akm4xxx_build_controls(ice
);
982 /* card specific controls */
983 switch (ice
->eeprom
.subvendor
) {
984 case ICE1712_SUBDEVICE_EWX2496
:
985 for (idx
= 0; idx
< ARRAY_SIZE(snd_ice1712_ewx2496_controls
); idx
++) {
986 err
= snd_ctl_add(ice
->card
, snd_ctl_new1(&snd_ice1712_ewx2496_controls
[idx
], ice
));
991 case ICE1712_SUBDEVICE_EWS88MT
:
992 case ICE1712_SUBDEVICE_EWS88MT_NEW
:
993 case ICE1712_SUBDEVICE_PHASE88
:
994 case ICE1712_SUBDEVICE_TS88
:
995 err
= snd_ctl_add(ice
->card
, snd_ctl_new1(&snd_ice1712_ews88mt_input_sense
, ice
));
998 err
= snd_ctl_add(ice
->card
, snd_ctl_new1(&snd_ice1712_ews88mt_output_sense
, ice
));
1002 case ICE1712_SUBDEVICE_EWS88D
:
1003 for (idx
= 0; idx
< ARRAY_SIZE(snd_ice1712_ews88d_controls
); idx
++) {
1004 err
= snd_ctl_add(ice
->card
, snd_ctl_new1(&snd_ice1712_ews88d_controls
[idx
], ice
));
1009 case ICE1712_SUBDEVICE_DMX6FIRE
:
1010 for (idx
= 0; idx
< ARRAY_SIZE(snd_ice1712_6fire_controls
); idx
++) {
1011 err
= snd_ctl_add(ice
->card
, snd_ctl_new1(&snd_ice1712_6fire_controls
[idx
], ice
));
1022 struct snd_ice1712_card_info snd_ice1712_ews_cards
[] = {
1024 .subvendor
= ICE1712_SUBDEVICE_EWX2496
,
1025 .name
= "TerraTec EWX24/96",
1027 .chip_init
= snd_ice1712_ews_init
,
1028 .build_controls
= snd_ice1712_ews_add_controls
,
1031 .subvendor
= ICE1712_SUBDEVICE_EWS88MT
,
1032 .name
= "TerraTec EWS88MT",
1034 .chip_init
= snd_ice1712_ews_init
,
1035 .build_controls
= snd_ice1712_ews_add_controls
,
1038 .subvendor
= ICE1712_SUBDEVICE_EWS88MT_NEW
,
1039 .name
= "TerraTec EWS88MT",
1040 .model
= "ews88mt_new",
1041 .chip_init
= snd_ice1712_ews_init
,
1042 .build_controls
= snd_ice1712_ews_add_controls
,
1045 .subvendor
= ICE1712_SUBDEVICE_PHASE88
,
1046 .name
= "TerraTec Phase88",
1048 .chip_init
= snd_ice1712_ews_init
,
1049 .build_controls
= snd_ice1712_ews_add_controls
,
1052 .subvendor
= ICE1712_SUBDEVICE_TS88
,
1053 .name
= "terrasoniq TS88",
1055 .chip_init
= snd_ice1712_ews_init
,
1056 .build_controls
= snd_ice1712_ews_add_controls
,
1059 .subvendor
= ICE1712_SUBDEVICE_EWS88D
,
1060 .name
= "TerraTec EWS88D",
1062 .chip_init
= snd_ice1712_ews_init
,
1063 .build_controls
= snd_ice1712_ews_add_controls
,
1066 .subvendor
= ICE1712_SUBDEVICE_DMX6FIRE
,
1067 .name
= "TerraTec DMX6Fire",
1068 .model
= "dmx6fire",
1069 .chip_init
= snd_ice1712_ews_init
,
1070 .build_controls
= snd_ice1712_ews_add_controls
,
1071 .mpu401_1_name
= "MIDI-Front DMX6fire",
1072 .mpu401_2_name
= "Wavetable DMX6fire",
1073 .mpu401_2_info_flags
= MPU401_INFO_OUTPUT
,
1075 { } /* terminator */