From 730ca484ba8af5d0ceae87ead700722fd17677b5 Mon Sep 17 00:00:00 2001 From: Sugar Zhang Date: Thu, 4 Jul 2024 15:43:14 +0800 Subject: [PATCH] ASoC: rockchip: i2s_tdm: Fix params check for TDM mode especially fixed for always-on TDM situation. Change-Id: I2d544320028daa8ca7031f786beb8ba8880d06bb Signed-off-by: Sugar Zhang --- sound/soc/rockchip/rockchip_i2s_tdm.c | 20 ++++++++++++++++++-- sound/soc/rockchip/rockchip_i2s_tdm.h | 2 ++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c index 5c30ab2971ff..5d98ccf363b5 100644 --- a/sound/soc/rockchip/rockchip_i2s_tdm.c +++ b/sound/soc/rockchip/rockchip_i2s_tdm.c @@ -1370,6 +1370,7 @@ static int rockchip_i2s_tdm_set_fmt(struct snd_soc_dai *cpu_dai, } val = ret; + ret = 0; regmap_update_bits(i2s_tdm->regmap, I2S_TXCR, mask, val); regmap_update_bits(i2s_tdm->regmap, I2S_RXCR, mask, val); } @@ -1679,8 +1680,20 @@ static bool is_params_dirty(struct snd_pcm_substream *substream, if (last_div_bclk != div_bclk) return true; - regmap_read(i2s_tdm->regmap, I2S_CKR, &val); - last_div_lrck = ((val & I2S_CKR_TSD_MASK) >> I2S_CKR_TSD_SHIFT) + 1; + if (i2s_tdm->tdm_mode) { + regmap_read(i2s_tdm->regmap, + substream->stream ? I2S_TDM_RXCR : I2S_TDM_TXCR, &val); + last_div_lrck = TDM_FRAME_WIDTH_V(val); + + regmap_read(i2s_tdm->regmap, + substream->stream ? I2S_RXCR : I2S_TXCR, &val); + val &= I2S_TXCR_TFS_MASK; + if (val == I2S_TXCR_TFS_TDM_I2S && !i2s_tdm->tdm_fsync_half_frame) + last_div_lrck <<= 1; + } else { + regmap_read(i2s_tdm->regmap, I2S_CKR, &val); + last_div_lrck = I2S_CKR_TSD_V(val); + } if (last_div_lrck != div_lrck) return true; @@ -2825,6 +2838,9 @@ static int rockchip_i2s_tdm_keep_clk_always_on(struct rk_i2s_tdm_dev *i2s_tdm) unsigned int div_bclk; int ret; + if (mclk_rate < bclk_rate) + mclk_rate = bclk_rate; + div_bclk = DIV_ROUND_CLOSEST(mclk_rate, bclk_rate); /* assign generic freq */ diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.h b/sound/soc/rockchip/rockchip_i2s_tdm.h index c1c20c716270..0f9ee806b4b9 100644 --- a/sound/soc/rockchip/rockchip_i2s_tdm.h +++ b/sound/soc/rockchip/rockchip_i2s_tdm.h @@ -118,6 +118,7 @@ #define I2S_CKR_RSD_MASK (0xff << I2S_CKR_RSD_SHIFT) #define I2S_CKR_TSD_SHIFT 0 #define I2S_CKR_TSD(x) (((x) - 1) << I2S_CKR_TSD_SHIFT) +#define I2S_CKR_TSD_V(x) ((((x) & I2S_CKR_TSD_MASK) >> I2S_CKR_TSD_SHIFT) + 1) #define I2S_CKR_TSD_MASK (0xff << I2S_CKR_TSD_SHIFT) /* @@ -269,6 +270,7 @@ #define TDM_SLOT_BIT_WIDTH(x) (((x) - 1) << 9) #define TDM_FRAME_WIDTH_MSK GENMASK(8, 0) #define TDM_FRAME_WIDTH(x) (((x) - 1) << 0) +#define TDM_FRAME_WIDTH_V(v) ((((v) & TDM_FRAME_WIDTH_MSK) >> 0) + 1) /* * CLKDIV