[alsa-devel] [PATCH 4/8] ALSA: fireface: add support for second optical interface for ADAT stream

Takashi Sakamoto o-takashi at sakamocchi.jp
Tue Dec 11 11:17:31 CET 2018


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 at sakamocchi.jp>
---
 sound/firewire/fireface/ff-proc.c        | 23 +++++++++++++++++++----
 sound/firewire/fireface/ff-transaction.c | 12 ++++++++----
 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 {
-- 
2.19.1



More information about the Alsa-devel mailing list