diff options
Diffstat (limited to 'sound/firewire/motu/motu-protocol-v2.c')
-rw-r--r-- | sound/firewire/motu/motu-protocol-v2.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/sound/firewire/motu/motu-protocol-v2.c b/sound/firewire/motu/motu-protocol-v2.c index 93d5df1ae550..2bd4485e4bc7 100644 --- a/sound/firewire/motu/motu-protocol-v2.c +++ b/sound/firewire/motu/motu-protocol-v2.c @@ -12,11 +12,11 @@ #define V2_CLOCK_RATE_SHIFT 3 #define V2_CLOCK_SRC_MASK 0x00000007 #define V2_CLOCK_SRC_SHIFT 0 -#define V2_CLOCK_SRC_AESEBU_ON_XLR 0x07 +#define V2_CLOCK_SRC_AESEBU_ON_XLR 0x07 // In Traveler. #define V2_CLOCK_SRC_ADAT_ON_DSUB 0x05 #define V2_CLOCK_SRC_WORD_ON_BNC 0x04 #define V2_CLOCK_SRC_SPH 0x03 -#define V2_CLOCK_SRC_SPDIF 0x02 // on either coaxial or optical +#define V2_CLOCK_SRC_SPDIF 0x02 // on either coaxial or optical. AES/EBU in 896HD. #define V2_CLOCK_SRC_ADAT_ON_OPT 0x01 #define V2_CLOCK_SRC_INTERNAL 0x00 #define V2_CLOCK_FETCH_ENABLE 0x02000000 @@ -100,7 +100,9 @@ static int get_clock_source(struct snd_motu *motu, u32 data, bool support_iec60958_on_opt = (motu->spec == &snd_motu_spec_828mk2 || motu->spec == &snd_motu_spec_traveler); - if (!support_iec60958_on_opt) { + if (motu->spec == &snd_motu_spec_896hd) { + *src = SND_MOTU_CLOCK_SOURCE_AESEBU_ON_XLR; + } else if (!support_iec60958_on_opt) { *src = SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX; } else { __be32 reg; @@ -129,6 +131,7 @@ static int get_clock_source(struct snd_motu *motu, u32 data, *src = SND_MOTU_CLOCK_SOURCE_ADAT_ON_DSUB; break; case V2_CLOCK_SRC_AESEBU_ON_XLR: + // For Traveler. *src = SND_MOTU_CLOCK_SOURCE_AESEBU_ON_XLR; break; default: @@ -153,7 +156,7 @@ int snd_motu_protocol_v2_get_clock_source(struct snd_motu *motu, return get_clock_source(motu, be32_to_cpu(reg), src); } -// Expected for Traveler and 896HD, which implements Altera Cyclone EP1C3. +// Expected for Traveler, which implements Altera Cyclone EP1C3. static int switch_fetching_mode_cyclone(struct snd_motu *motu, u32 *data, bool enable) { @@ -190,6 +193,9 @@ int snd_motu_protocol_v2_switch_fetching_mode(struct snd_motu *motu, if (motu->spec == &snd_motu_spec_828mk2) { // 828mkII implements Altera ACEX 1K EP1K30. Nothing to do. return 0; + } else if (motu->spec == &snd_motu_spec_896hd) { + // 896HD implements Altera Cyclone EP1C3 but nothing to do. + return 0; } else { __be32 reg; u32 data; @@ -274,6 +280,14 @@ const struct snd_motu_spec snd_motu_spec_828mk2 = { .rx_fixed_pcm_chunks = {14, 14, 0}, }; +const struct snd_motu_spec snd_motu_spec_896hd = { + .name = "896HD", + .protocol_version = SND_MOTU_PROTOCOL_V2, + // No support for MIDI. + .tx_fixed_pcm_chunks = {14, 14, 8}, + .rx_fixed_pcm_chunks = {14, 14, 8}, +}; + const struct snd_motu_spec snd_motu_spec_traveler = { .name = "Traveler", .protocol_version = SND_MOTU_PROTOCOL_V2, |