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 <sugar.zhang@rock-chips.com>
This commit is contained in:
Sugar Zhang
2024-07-04 15:43:14 +08:00
committed by Tao Huang
parent 7997753375
commit 730ca484ba
2 changed files with 20 additions and 2 deletions

View File

@@ -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 */

View File

@@ -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