Commit 5bfb841e authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai

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: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 3c3b892b
...@@ -65,7 +65,10 @@ static void proc_dump_clock_config(struct snd_info_entry *entry, ...@@ -65,7 +65,10 @@ static void proc_dump_clock_config(struct snd_info_entry *entry,
} else { } else {
switch ((data >> 10) & 0x07) { switch ((data >> 10) & 0x07) {
case 0x00: case 0x00:
src = "ADAT"; src = "ADAT1";
break;
case 0x01:
src = "ADAT2";
break; break;
case 0x03: case 0x03:
src = "S/PDIF"; src = "S/PDIF";
...@@ -121,7 +124,7 @@ static void proc_dump_sync_status(struct snd_info_entry *entry, ...@@ -121,7 +124,7 @@ static void proc_dump_sync_status(struct snd_info_entry *entry,
snd_iprintf(buffer, "none\n"); snd_iprintf(buffer, "none\n");
} }
snd_iprintf(buffer, "ADAT:"); snd_iprintf(buffer, "ADAT1:");
if ((data >> 8) & 0x04) { if ((data >> 8) & 0x04) {
if ((data >> 8) & 0x10) if ((data >> 8) & 0x10)
snd_iprintf(buffer, "sync\n"); snd_iprintf(buffer, "sync\n");
...@@ -131,6 +134,16 @@ static void proc_dump_sync_status(struct snd_info_entry *entry, ...@@ -131,6 +134,16 @@ static void proc_dump_sync_status(struct snd_info_entry *entry,
snd_iprintf(buffer, "none\n"); 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"); snd_iprintf(buffer, "\nUsed external source:\n");
if (((data >> 22) & 0x07) == 0x07) { if (((data >> 22) & 0x07) == 0x07) {
...@@ -138,7 +151,10 @@ static void proc_dump_sync_status(struct snd_info_entry *entry, ...@@ -138,7 +151,10 @@ static void proc_dump_sync_status(struct snd_info_entry *entry,
} else { } else {
switch ((data >> 22) & 0x07) { switch ((data >> 22) & 0x07) {
case 0x00: case 0x00:
snd_iprintf(buffer, "ADAT:"); snd_iprintf(buffer, "ADAT1:");
break;
case 0x01:
snd_iprintf(buffer, "ADAT2:");
break; break;
case 0x03: case 0x03:
snd_iprintf(buffer, "S/PDIF:"); snd_iprintf(buffer, "S/PDIF:");
...@@ -149,7 +165,6 @@ static void proc_dump_sync_status(struct snd_info_entry *entry, ...@@ -149,7 +165,6 @@ static void proc_dump_sync_status(struct snd_info_entry *entry,
case 0x07: case 0x07:
snd_iprintf(buffer, "Nothing:"); snd_iprintf(buffer, "Nothing:");
break; break;
case 0x01:
case 0x02: case 0x02:
case 0x05: case 0x05:
case 0x06: case 0x06:
......
...@@ -46,8 +46,14 @@ int snd_ff_transaction_get_clock(struct snd_ff *ff, unsigned int *rate, ...@@ -46,8 +46,14 @@ int snd_ff_transaction_get_clock(struct snd_ff *ff, unsigned int *rate,
if (data & 0x01) { if (data & 0x01) {
*src = SND_FF_CLOCK_SRC_INTERNAL; *src = SND_FF_CLOCK_SRC_INTERNAL;
} else { } else {
/* TODO: 0x00, 0x01, 0x02, 0x06, 0x07? */ /* TODO: 0x02, 0x06, 0x07? */
switch ((data >> 10) & 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: case 0x03:
*src = SND_FF_CLOCK_SRC_SPDIF; *src = SND_FF_CLOCK_SRC_SPDIF;
break; break;
...@@ -57,10 +63,8 @@ int snd_ff_transaction_get_clock(struct snd_ff *ff, unsigned int *rate, ...@@ -57,10 +63,8 @@ int snd_ff_transaction_get_clock(struct snd_ff *ff, unsigned int *rate,
case 0x05: case 0x05:
*src = SND_FF_CLOCK_SRC_LTC; *src = SND_FF_CLOCK_SRC_LTC;
break; break;
case 0x00:
default: default:
*src = SND_FF_CLOCK_SRC_ADAT; return -EIO;
break;
} }
} }
......
...@@ -94,10 +94,11 @@ struct snd_ff { ...@@ -94,10 +94,11 @@ struct snd_ff {
enum snd_ff_clock_src { enum snd_ff_clock_src {
SND_FF_CLOCK_SRC_INTERNAL, SND_FF_CLOCK_SRC_INTERNAL,
SND_FF_CLOCK_SRC_SPDIF, 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_WORD,
SND_FF_CLOCK_SRC_LTC, SND_FF_CLOCK_SRC_LTC,
/* TODO: perhaps ADAT2 and TCO exists. */ /* TODO: perhaps TCO exists. */
}; };
struct snd_ff_protocol { struct snd_ff_protocol {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment