mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
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:
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user