diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c index aed50dd9751a..3ee692c9853c 100644 --- a/sound/soc/rockchip/rockchip_i2s_tdm.c +++ b/sound/soc/rockchip/rockchip_i2s_tdm.c @@ -2229,10 +2229,35 @@ static int rockchip_dai_tdm_slot(struct snd_soc_dai *dai, if (ret < 0 && ret != -EACCES) return ret; - regmap_update_bits(i2s_tdm->regmap, I2S_TDM_TXCR, - mask, val); - regmap_update_bits(i2s_tdm->regmap, I2S_TDM_RXCR, - mask, val); + regmap_update_bits(i2s_tdm->regmap, I2S_TDM_TXCR, mask, val); + regmap_update_bits(i2s_tdm->regmap, I2S_TDM_RXCR, mask, val); + + mask = I2S_TXCR_VDW_MASK | I2S_TXCR_CSR_MASK; + val = I2S_TXCR_VDW(slot_width); + + if (!i2s_tdm->tdm_fsync_half_frame) { + switch (slots) { + case 16: + val |= I2S_CHN_8; + break; + case 12: + val |= I2S_CHN_6; + break; + case 8: + val |= I2S_CHN_4; + break; + case 4: + val |= I2S_CHN_2; + break; + default: + val |= I2S_CHN_2; + break; + } + } + + regmap_update_bits(i2s_tdm->regmap, I2S_TXCR, mask, val); + regmap_update_bits(i2s_tdm->regmap, I2S_RXCR, mask, val); + pm_runtime_put(dai->dev); return 0;