From 2cb4eb41cbe1dbc95b7e7f6a37391f0af0a53e6a Mon Sep 17 00:00:00 2001
From: Detlev Casanova <detlev.casanova@collabora.com>
Date: Fri, 6 Dec 2024 16:43:32 -0500
Subject: [PATCH] wip: Set the correct mclk clock rate

For some reason, rockchip_i2s_tdm_hw_params is called with 44100 when the userspace specifies 22050 Hz.
On some devices, it works, on others, it doesn't.

Luckily, before 9e2ab4b18ebd46813fc3459207335af4d368e323,
rockchip_i2s_tdm_set_sysclk was used to configure the actual clock rate to be used.
This commit reuses that as it is called with the actual 22050 Hz rate.

[to be improved and better understood]
---
 sound/soc/rockchip/rockchip_i2s_tdm.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c
index 927b636db3ca6..5fac4f4d5e9f6 100644
--- a/sound/soc/rockchip/rockchip_i2s_tdm.c
+++ b/sound/soc/rockchip/rockchip_i2s_tdm.c
@@ -51,6 +51,8 @@ struct rk_i2s_tdm_dev {
 	struct clk *hclk;
 	struct clk *mclk_tx;
 	struct clk *mclk_rx;
+	unsigned int mclk_rx_freq;
+	unsigned int mclk_tx_freq;
 	struct regmap *regmap;
 	struct regmap *grf;
 	struct snd_dmaengine_dai_dma_data capture_dma_data;
@@ -656,18 +658,23 @@ static int rockchip_i2s_tdm_hw_params(struct snd_pcm_substream *substream,
 
 	if (i2s_tdm->is_master_mode) {
 		struct clk *mclk;
+		unsigned int freq;
 
 		if (i2s_tdm->clk_trcm == TRCM_TX) {
 			mclk = i2s_tdm->mclk_tx;
+			freq = i2s_tdm->mclk_tx_freq ? i2s_tdm->mclk_tx_freq : DEFAULT_MCLK_FS * params_rate(params);
 		} else if (i2s_tdm->clk_trcm == TRCM_RX) {
 			mclk = i2s_tdm->mclk_rx;
+			freq = i2s_tdm->mclk_rx_freq ? i2s_tdm->mclk_rx_freq : DEFAULT_MCLK_FS * params_rate(params);
 		} else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 			mclk = i2s_tdm->mclk_tx;
+			freq = i2s_tdm->mclk_tx_freq ? i2s_tdm->mclk_tx_freq : DEFAULT_MCLK_FS * params_rate(params);
 		} else {
 			mclk = i2s_tdm->mclk_rx;
+			freq = i2s_tdm->mclk_rx_freq ? i2s_tdm->mclk_rx_freq : DEFAULT_MCLK_FS * params_rate(params);
 		}
-
-		err = clk_set_rate(mclk, DEFAULT_MCLK_FS * params_rate(params));
+		
+		err = clk_set_rate(mclk, freq);
 		if (err)
 			return err;
 
@@ -777,7 +784,6 @@ static int rockchip_i2s_tdm_trigger(struct snd_pcm_substream *substream,
 	return 0;
 }
 
-#if 0 // Added in merge conflic, check if needed
 static int rockchip_i2s_tdm_set_sysclk(struct snd_soc_dai *cpu_dai, int stream,
 				       unsigned int freq, int dir)
 {
@@ -794,12 +800,13 @@ static int rockchip_i2s_tdm_set_sysclk(struct snd_soc_dai *cpu_dai, int stream,
 			i2s_tdm->mclk_rx_freq = freq;
 	}
 
-	dev_dbg(i2s_tdm->dev, "The target mclk_%s freq is: %d\n",
+	dev_warn(i2s_tdm->dev, "The target mclk_%s freq is: %d\n",
 		stream ? "rx" : "tx", freq);
 
 	return 0;
 }
 
+#if 0
 static int rockchip_i2s_tdm_clk_compensation_info(struct snd_kcontrol *kcontrol,
 						  struct snd_ctl_elem_info *uinfo)
 {
@@ -1032,6 +1039,7 @@ static const struct snd_soc_dai_ops rockchip_i2s_tdm_dai_ops = {
 	.probe = rockchip_i2s_tdm_dai_probe,
 	.hw_params = rockchip_i2s_tdm_hw_params,
 	.set_bclk_ratio	= rockchip_i2s_tdm_set_bclk_ratio,
+	.set_sysclk = rockchip_i2s_tdm_set_sysclk,
 	.set_fmt = rockchip_i2s_tdm_set_fmt,
 	.set_tdm_slot = rockchip_dai_tdm_slot,
 	.trigger = rockchip_i2s_tdm_trigger,
-- 
GitLab