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