ALSA: fireface: add support for second optical interface for ADAT stream
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Tue, 11 Dec 2018 10:17:31 +0000 (19:17 +0900)
committerTakashi Iwai <tiwai@suse.de>
Tue, 11 Dec 2018 13:56:38 +0000 (14:56 +0100)
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>
sound/firewire/fireface/ff-proc.c
sound/firewire/fireface/ff-transaction.c
sound/firewire/fireface/ff.h

index f5f3a1997a9e378e981611fd0dc0f30415b34ac9..a0c550dabe9ace95a4186f71cbad32eaf5e84c57 100644 (file)
@@ -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:
index 1dad51da13e00ee705305271491286d84e7399d3..751662b62389d129a3b83bcf2bc2f1933262d5db 100644 (file)
@@ -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;
                }
        }
 
index cdb1326f65b7efa5ea1e0a100cff0b2e564d3f3d..95cf90b4b5335699cb96177c9db389f5efa1acca 100644 (file)
@@ -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 {