From 0693b9b268bed14d4878c57d04d4e6d7c5b00330 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Povi=C5=A1er?= <povik+lin@cutebit.org>
Date: Mon, 21 Feb 2022 10:39:23 +0100
Subject: [PATCH] ASoC: apple-mca: Fix playback/capture duplex
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Disable the data feedback path that would corrupt the capture stream.

Signed-off-by: Martin PoviĊĦer <povik+lin@cutebit.org>
---
 sound/soc/apple/mca.c | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/sound/soc/apple/mca.c b/sound/soc/apple/mca.c
index 20599bf0577f..65efb194722d 100644
--- a/sound/soc/apple/mca.c
+++ b/sound/soc/apple/mca.c
@@ -75,11 +75,12 @@
 #define SERDES_CONF_UNK1	BIT(12)
 #define SERDES_CONF_UNK2	BIT(13)
 #define SERDES_CONF_UNK3	BIT(14)
+#define SERDES_CONF_NO_DATA_FEEDBACK	BIT(15)
 #define SERDES_CONF_SYNC_SEL	GENMASK(18, 16)
 #define REG_TX_SERDES_BITSTART	0x08
 #define REG_RX_SERDES_BITSTART	0x0c
 #define REG_TX_SERDES_CHANMASK	0x10
-#define REG_RX_SERDES_CHANMASK	0x14
+#define REG_RX_SERDES_CHANMASK	0x10
 #define REG_RX_SERDES_PORT	0x04
 
 /* relative to switch base */
@@ -313,17 +314,25 @@ static int mca_configure_serdes(struct mca_data *mca, int cluster, int serdes_un
 	mca_modify(mca, cluster,
 		serdes_unit + (is_tx ? REG_TX_SERDES_CONF : REG_RX_SERDES_CONF),
 		SERDES_CONF_WIDTH_MASK | SERDES_CONF_NCHANS, serdes_conf);
-	mca_poke(mca, cluster,
-		serdes_unit + (is_tx ? REG_TX_SERDES_CHANMASK : REG_RX_SERDES_CHANMASK),
-		~((u32) mask));
-	mca_poke(mca, cluster,
-		serdes_unit + (is_tx ? REG_TX_SERDES_CHANMASK : REG_RX_SERDES_CHANMASK) + 0x4,
-		~((u32) mask));
-
-	if (!is_tx)
+
+	if (is_tx) {
+		mca_poke(mca, cluster,
+			serdes_unit + REG_TX_SERDES_CHANMASK,
+			~((u32) mask));
+		mca_poke(mca, cluster,
+			serdes_unit + REG_TX_SERDES_CHANMASK + 0x4,
+			~((u32) mask));
+	} else {
+		mca_poke(mca, cluster,
+			serdes_unit + REG_RX_SERDES_CHANMASK,
+			0xffffffff);
+		mca_poke(mca, cluster,
+			serdes_unit + REG_RX_SERDES_CHANMASK + 0x4,
+			~((u32) mask));
 		mca_poke(mca, cluster,
 			serdes_unit + REG_RX_SERDES_PORT,
 			1 << port);
+	}
 
 	return 0;
 
@@ -468,8 +477,10 @@ static int mca_dai_startup(struct snd_pcm_substream *substream,
 
 	case SNDRV_PCM_STREAM_CAPTURE:
 		mca_modify(mca, route->serdes, CLUSTER_RX_OFF + REG_RX_SERDES_CONF,
-				SERDES_CONF_UNK1 | SERDES_CONF_UNK2,
-				SERDES_CONF_UNK1 | SERDES_CONF_UNK2);
+				SERDES_CONF_UNK1 | SERDES_CONF_UNK2 | SERDES_CONF_UNK3
+				| SERDES_CONF_NO_DATA_FEEDBACK,
+				SERDES_CONF_UNK1 | SERDES_CONF_UNK2
+				| SERDES_CONF_NO_DATA_FEEDBACK);
 		mca_modify(mca, route->serdes, CLUSTER_RX_OFF + REG_RX_SERDES_CONF,
 			SERDES_CONF_SYNC_SEL, FIELD_PREP(SERDES_CONF_SYNC_SEL,
 						route->syncgen + 1));
-- 
2.32.0 (Apple Git-132)