diff options
author | Brian Bloniarz <brian.bloniarz@gmail.com> | 2010-12-08 15:45:20 -0500 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2010-12-09 02:40:01 -0500 |
commit | 93430096f9d757104080f40f51afb2dada8877b5 (patch) | |
tree | 607d5abeb7a64e397ae77f965a0e7804aee95f35 /sound/pci/ice1712 | |
parent | d0359c6fac18588da04fbefdad096453442653ee (diff) |
ALSA: ice1712 - working M-Audio Delta 66E support
Rev. E of the M-Audio Delta 66 is partially supported (commit
ef2cd2ccad66b4aba518eca7514eface267ee0f3), but the layout of the GPIO
pins was still unclear. This patch adds the GPIO definitions so that
communication to the CS8247 & 2x AK4524 works correctly.
ALSA bug#3327 has more details; users cap & jhunt report there that the
GPIO wiring is similar to the Digigram VX442 (chip select: pin 4 =
CS8427, pin 5 = AK4524 #0, pin 6 = AK4524 #1). There has been a lot of
conflicting information in the bug, but given these definitions, my
Delta 66E works; I tested analog in&out at 44.1kHz & 96kHz, analog gain
settings, S/PDIF clock sync, and S/PDIF in&out at 44.1kHz.
Signed-off-by: Brian Bloniarz <brian.bloniarz@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/ice1712')
-rw-r--r-- | sound/pci/ice1712/delta.c | 49 | ||||
-rw-r--r-- | sound/pci/ice1712/delta.h | 11 |
2 files changed, 59 insertions, 1 deletions
diff --git a/sound/pci/ice1712/delta.c b/sound/pci/ice1712/delta.c index 712c1710f9a2..7b62de089fee 100644 --- a/sound/pci/ice1712/delta.c +++ b/sound/pci/ice1712/delta.c | |||
@@ -96,6 +96,11 @@ static unsigned char ap_cs8427_codec_select(struct snd_ice1712 *ice) | |||
96 | tmp |= ICE1712_DELTA_AP_CCLK | ICE1712_DELTA_AP_CS_CODEC; | 96 | tmp |= ICE1712_DELTA_AP_CCLK | ICE1712_DELTA_AP_CS_CODEC; |
97 | tmp &= ~ICE1712_DELTA_AP_CS_DIGITAL; | 97 | tmp &= ~ICE1712_DELTA_AP_CS_DIGITAL; |
98 | break; | 98 | break; |
99 | case ICE1712_SUBDEVICE_DELTA66E: | ||
100 | tmp |= ICE1712_DELTA_66E_CCLK | ICE1712_DELTA_66E_CS_CHIP_A | | ||
101 | ICE1712_DELTA_66E_CS_CHIP_B; | ||
102 | tmp &= ~ICE1712_DELTA_66E_CS_CS8427; | ||
103 | break; | ||
99 | case ICE1712_SUBDEVICE_VX442: | 104 | case ICE1712_SUBDEVICE_VX442: |
100 | tmp |= ICE1712_VX442_CCLK | ICE1712_VX442_CODEC_CHIP_A | ICE1712_VX442_CODEC_CHIP_B; | 105 | tmp |= ICE1712_VX442_CCLK | ICE1712_VX442_CODEC_CHIP_A | ICE1712_VX442_CODEC_CHIP_B; |
101 | tmp &= ~ICE1712_VX442_CS_DIGITAL; | 106 | tmp &= ~ICE1712_VX442_CS_DIGITAL; |
@@ -119,6 +124,9 @@ static void ap_cs8427_codec_deassert(struct snd_ice1712 *ice, unsigned char tmp) | |||
119 | case ICE1712_SUBDEVICE_DELTA410: | 124 | case ICE1712_SUBDEVICE_DELTA410: |
120 | tmp |= ICE1712_DELTA_AP_CS_DIGITAL; | 125 | tmp |= ICE1712_DELTA_AP_CS_DIGITAL; |
121 | break; | 126 | break; |
127 | case ICE1712_SUBDEVICE_DELTA66E: | ||
128 | tmp |= ICE1712_DELTA_66E_CS_CS8427; | ||
129 | break; | ||
122 | case ICE1712_SUBDEVICE_VX442: | 130 | case ICE1712_SUBDEVICE_VX442: |
123 | tmp |= ICE1712_VX442_CS_DIGITAL; | 131 | tmp |= ICE1712_VX442_CS_DIGITAL; |
124 | break; | 132 | break; |
@@ -276,6 +284,20 @@ static void delta1010lt_ak4524_lock(struct snd_akm4xxx *ak, int chip) | |||
276 | } | 284 | } |
277 | 285 | ||
278 | /* | 286 | /* |
287 | * AK4524 on Delta66 rev E to choose the chip address | ||
288 | */ | ||
289 | static void delta66e_ak4524_lock(struct snd_akm4xxx *ak, int chip) | ||
290 | { | ||
291 | struct snd_ak4xxx_private *priv = (void *)ak->private_value[0]; | ||
292 | struct snd_ice1712 *ice = ak->private_data[0]; | ||
293 | |||
294 | snd_ice1712_save_gpio_status(ice); | ||
295 | priv->cs_mask = | ||
296 | priv->cs_addr = chip == 0 ? ICE1712_DELTA_66E_CS_CHIP_A : | ||
297 | ICE1712_DELTA_66E_CS_CHIP_B; | ||
298 | } | ||
299 | |||
300 | /* | ||
279 | * AK4528 on VX442 to choose the chip mask | 301 | * AK4528 on VX442 to choose the chip mask |
280 | */ | 302 | */ |
281 | static void vx442_ak4524_lock(struct snd_akm4xxx *ak, int chip) | 303 | static void vx442_ak4524_lock(struct snd_akm4xxx *ak, int chip) |
@@ -487,6 +509,29 @@ static struct snd_ak4xxx_private akm_delta1010lt_priv __devinitdata = { | |||
487 | .mask_flags = 0, | 509 | .mask_flags = 0, |
488 | }; | 510 | }; |
489 | 511 | ||
512 | static struct snd_akm4xxx akm_delta66e __devinitdata = { | ||
513 | .type = SND_AK4524, | ||
514 | .num_adcs = 4, | ||
515 | .num_dacs = 4, | ||
516 | .ops = { | ||
517 | .lock = delta66e_ak4524_lock, | ||
518 | .set_rate_val = delta_ak4524_set_rate_val | ||
519 | } | ||
520 | }; | ||
521 | |||
522 | static struct snd_ak4xxx_private akm_delta66e_priv __devinitdata = { | ||
523 | .caddr = 2, | ||
524 | .cif = 0, /* the default level of the CIF pin from AK4524 */ | ||
525 | .data_mask = ICE1712_DELTA_66E_DOUT, | ||
526 | .clk_mask = ICE1712_DELTA_66E_CCLK, | ||
527 | .cs_mask = 0, | ||
528 | .cs_addr = 0, /* set later */ | ||
529 | .cs_none = 0, | ||
530 | .add_flags = 0, | ||
531 | .mask_flags = 0, | ||
532 | }; | ||
533 | |||
534 | |||
490 | static struct snd_akm4xxx akm_delta44 __devinitdata = { | 535 | static struct snd_akm4xxx akm_delta44 __devinitdata = { |
491 | .type = SND_AK4524, | 536 | .type = SND_AK4524, |
492 | .num_adcs = 4, | 537 | .num_adcs = 4, |
@@ -644,9 +689,11 @@ static int __devinit snd_ice1712_delta_init(struct snd_ice1712 *ice) | |||
644 | err = snd_ice1712_akm4xxx_init(ak, &akm_delta44, &akm_delta44_priv, ice); | 689 | err = snd_ice1712_akm4xxx_init(ak, &akm_delta44, &akm_delta44_priv, ice); |
645 | break; | 690 | break; |
646 | case ICE1712_SUBDEVICE_VX442: | 691 | case ICE1712_SUBDEVICE_VX442: |
647 | case ICE1712_SUBDEVICE_DELTA66E: | ||
648 | err = snd_ice1712_akm4xxx_init(ak, &akm_vx442, &akm_vx442_priv, ice); | 692 | err = snd_ice1712_akm4xxx_init(ak, &akm_vx442, &akm_vx442_priv, ice); |
649 | break; | 693 | break; |
694 | case ICE1712_SUBDEVICE_DELTA66E: | ||
695 | err = snd_ice1712_akm4xxx_init(ak, &akm_delta66e, &akm_delta66e_priv, ice); | ||
696 | break; | ||
650 | default: | 697 | default: |
651 | snd_BUG(); | 698 | snd_BUG(); |
652 | return -EINVAL; | 699 | return -EINVAL; |
diff --git a/sound/pci/ice1712/delta.h b/sound/pci/ice1712/delta.h index 1a0ac6cd6501..11a9c3a76507 100644 --- a/sound/pci/ice1712/delta.h +++ b/sound/pci/ice1712/delta.h | |||
@@ -144,6 +144,17 @@ extern struct snd_ice1712_card_info snd_ice1712_delta_cards[]; | |||
144 | #define ICE1712_DELTA_1010LT_CS_NONE 0x50 /* nothing */ | 144 | #define ICE1712_DELTA_1010LT_CS_NONE 0x50 /* nothing */ |
145 | #define ICE1712_DELTA_1010LT_WORDCLOCK 0x80 /* sample clock source: 0 = Word Clock Input, 1 = S/PDIF Input ??? */ | 145 | #define ICE1712_DELTA_1010LT_WORDCLOCK 0x80 /* sample clock source: 0 = Word Clock Input, 1 = S/PDIF Input ??? */ |
146 | 146 | ||
147 | /* M-Audio Delta 66 rev. E definitions. | ||
148 | * Newer revisions of Delta 66 have CS8427 over SPI for | ||
149 | * S/PDIF transceiver instead of CS8404/CS8414. */ | ||
150 | /* 0x01 = DFS */ | ||
151 | #define ICE1712_DELTA_66E_CCLK 0x02 /* SPI clock */ | ||
152 | #define ICE1712_DELTA_66E_DIN 0x04 /* data input */ | ||
153 | #define ICE1712_DELTA_66E_DOUT 0x08 /* data output */ | ||
154 | #define ICE1712_DELTA_66E_CS_CS8427 0x10 /* chip select, low = CS8427 */ | ||
155 | #define ICE1712_DELTA_66E_CS_CHIP_A 0x20 /* AK4524 #0 */ | ||
156 | #define ICE1712_DELTA_66E_CS_CHIP_B 0x40 /* AK4524 #1 */ | ||
157 | |||
147 | /* Digigram VX442 definitions */ | 158 | /* Digigram VX442 definitions */ |
148 | #define ICE1712_VX442_CCLK 0x02 /* SPI clock */ | 159 | #define ICE1712_VX442_CCLK 0x02 /* SPI clock */ |
149 | #define ICE1712_VX442_DIN 0x04 /* data input */ | 160 | #define ICE1712_VX442_DIN 0x04 /* data input */ |