diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c index 927b636db3ca6c593874db1bfe94ef23b4816f75..5fac4f4d5e9f61141b03a64d5c412809f9e74b5c 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,