| From 5d79669d4c8fa2f6ee90a4c55e1d970a674e3ba2 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 23 Jun 2021 16:59:33 +0900 |
| Subject: ALSA: firewire-motu: fix detection for S/PDIF source on optical |
| interface in v2 protocol |
| |
| From: Takashi Sakamoto <o-takashi@sakamocchi.jp> |
| |
| [ Upstream commit fa4db23233eb912234bdfb0b26a38be079c6b5ea ] |
| |
| The devices in protocol version 2 has a register with flag for IEC 60958 |
| signal detection as source of sampling clock without discrimination |
| between coaxial and optical interfaces. On the other hand, current |
| implementation of driver manage to interpret type of signal on optical |
| interface instead. |
| |
| This commit fixes the detection of optical/coaxial interface for S/PDIF |
| signal. |
| |
| Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> |
| Link: https://lore.kernel.org/r/20210623075941.72562-2-o-takashi@sakamocchi.jp |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| sound/firewire/motu/motu-protocol-v2.c | 13 ++++++------- |
| 1 file changed, 6 insertions(+), 7 deletions(-) |
| |
| diff --git a/sound/firewire/motu/motu-protocol-v2.c b/sound/firewire/motu/motu-protocol-v2.c |
| index 784073aa1026..f0a0ecad4d74 100644 |
| --- a/sound/firewire/motu/motu-protocol-v2.c |
| +++ b/sound/firewire/motu/motu-protocol-v2.c |
| @@ -86,24 +86,23 @@ static int detect_clock_source_optical_model(struct snd_motu *motu, u32 data, |
| *src = SND_MOTU_CLOCK_SOURCE_INTERNAL; |
| break; |
| case 1: |
| + *src = SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT; |
| + break; |
| + case 2: |
| { |
| __be32 reg; |
| |
| // To check the configuration of optical interface. |
| - int err = snd_motu_transaction_read(motu, V2_IN_OUT_CONF_OFFSET, |
| - ®, sizeof(reg)); |
| + int err = snd_motu_transaction_read(motu, V2_IN_OUT_CONF_OFFSET, ®, sizeof(reg)); |
| if (err < 0) |
| return err; |
| |
| - if (be32_to_cpu(reg) & 0x00000200) |
| + if (((data & V2_OPT_IN_IFACE_MASK) >> V2_OPT_IN_IFACE_SHIFT) == V2_OPT_IFACE_MODE_SPDIF) |
| *src = SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT; |
| else |
| - *src = SND_MOTU_CLOCK_SOURCE_ADAT_ON_OPT; |
| + *src = SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX; |
| break; |
| } |
| - case 2: |
| - *src = SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX; |
| - break; |
| case 3: |
| *src = SND_MOTU_CLOCK_SOURCE_SPH; |
| break; |
| -- |
| 2.30.2 |
| |