From 0693b9b268bed14d4878c57d04d4e6d7c5b00330 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Povi=C5=A1er?= 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 --- 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)