diff options
author | Takashi Sakamoto <o-takashi@sakamocchi.jp> | 2018-12-11 19:17:31 +0900 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2018-12-11 14:56:38 +0100 |
commit | 5bfb841e2f5952f5a6d8540dfda196769b358f8c (patch) | |
tree | ec67794c9bc82cff2067b5f856df2277a2e44dc8 /sound | |
parent | 3c3b892b3735edcc9e0be0aa129c72613e3f156e (diff) |
ALSA: fireface: add support for second optical interface for ADAT stream
Unlike Fireface 400, Fireface 800 have two pair of optical interface
for ADAT signal and S/PDIF signal. ADAT signals for the interface
are handled for sampling clock source separately.
This commit modifies a parser for clock configuration to distinguish
these two ADAT signals.
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/firewire/fireface/ff-proc.c | 23 | ||||
-rw-r--r-- | sound/firewire/fireface/ff-transaction.c | 12 | ||||
-rw-r--r-- | sound/firewire/fireface/ff.h | 5 |
3 files changed, 30 insertions, 10 deletions
diff --git a/sound/firewire/fireface/ff-proc.c b/sound/firewire/fireface/ff-proc.c index f5f3a1997a9e..a0c550dabe9a 100644 --- a/sound/firewire/fireface/ff-proc.c +++ b/sound/firewire/fireface/ff-proc.c @@ -65,7 +65,10 @@ static void proc_dump_clock_config(struct snd_info_entry *entry, } else { switch ((data >> 10) & 0x07) { case 0x00: - src = "ADAT"; + src = "ADAT1"; + break; + case 0x01: + src = "ADAT2"; break; case 0x03: src = "S/PDIF"; @@ -121,7 +124,7 @@ static void proc_dump_sync_status(struct snd_info_entry *entry, snd_iprintf(buffer, "none\n"); } - snd_iprintf(buffer, "ADAT:"); + snd_iprintf(buffer, "ADAT1:"); if ((data >> 8) & 0x04) { if ((data >> 8) & 0x10) snd_iprintf(buffer, "sync\n"); @@ -131,6 +134,16 @@ static void proc_dump_sync_status(struct snd_info_entry *entry, snd_iprintf(buffer, "none\n"); } + snd_iprintf(buffer, "ADAT2:"); + if ((data >> 8) & 0x08) { + if ((data >> 8) & 0x20) + snd_iprintf(buffer, "sync\n"); + else + snd_iprintf(buffer, "lock\n"); + } else { + snd_iprintf(buffer, "none\n"); + } + snd_iprintf(buffer, "\nUsed external source:\n"); if (((data >> 22) & 0x07) == 0x07) { @@ -138,7 +151,10 @@ static void proc_dump_sync_status(struct snd_info_entry *entry, } else { switch ((data >> 22) & 0x07) { case 0x00: - snd_iprintf(buffer, "ADAT:"); + snd_iprintf(buffer, "ADAT1:"); + break; + case 0x01: + snd_iprintf(buffer, "ADAT2:"); break; case 0x03: snd_iprintf(buffer, "S/PDIF:"); @@ -149,7 +165,6 @@ static void proc_dump_sync_status(struct snd_info_entry *entry, case 0x07: snd_iprintf(buffer, "Nothing:"); break; - case 0x01: case 0x02: case 0x05: case 0x06: diff --git a/sound/firewire/fireface/ff-transaction.c b/sound/firewire/fireface/ff-transaction.c index 1dad51da13e0..751662b62389 100644 --- a/sound/firewire/fireface/ff-transaction.c +++ b/sound/firewire/fireface/ff-transaction.c @@ -46,8 +46,14 @@ int snd_ff_transaction_get_clock(struct snd_ff *ff, unsigned int *rate, if (data & 0x01) { *src = SND_FF_CLOCK_SRC_INTERNAL; } else { - /* TODO: 0x00, 0x01, 0x02, 0x06, 0x07? */ + /* TODO: 0x02, 0x06, 0x07? */ switch ((data >> 10) & 0x07) { + case 0x00: + *src = SND_FF_CLOCK_SRC_ADAT1; + break; + case 0x01: + *src = SND_FF_CLOCK_SRC_ADAT2; + break; case 0x03: *src = SND_FF_CLOCK_SRC_SPDIF; break; @@ -57,10 +63,8 @@ int snd_ff_transaction_get_clock(struct snd_ff *ff, unsigned int *rate, case 0x05: *src = SND_FF_CLOCK_SRC_LTC; break; - case 0x00: default: - *src = SND_FF_CLOCK_SRC_ADAT; - break; + return -EIO; } } diff --git a/sound/firewire/fireface/ff.h b/sound/firewire/fireface/ff.h index cdb1326f65b7..95cf90b4b533 100644 --- a/sound/firewire/fireface/ff.h +++ b/sound/firewire/fireface/ff.h @@ -94,10 +94,11 @@ struct snd_ff { enum snd_ff_clock_src { SND_FF_CLOCK_SRC_INTERNAL, SND_FF_CLOCK_SRC_SPDIF, - SND_FF_CLOCK_SRC_ADAT, + SND_FF_CLOCK_SRC_ADAT1, + SND_FF_CLOCK_SRC_ADAT2, SND_FF_CLOCK_SRC_WORD, SND_FF_CLOCK_SRC_LTC, - /* TODO: perhaps ADAT2 and TCO exists. */ + /* TODO: perhaps TCO exists. */ }; struct snd_ff_protocol { |