Commit 9355a7b1 authored by Shengjiu Wang's avatar Shengjiu Wang Committed by Mark Brown

ASoC: fsl_sai: Replace synchronous check with fsl_sai_dir_is_synced

As new function fsl_sai_dir_is_synced is included for checking if
stream is synced by the opposite stream, then replace the existing
synchronous checking with this new function.
Signed-off-by: default avatarShengjiu Wang <shengjiu.wang@nxp.com>
Acked-by: default avatarNicolin Chen <nicoleotsuka@gmail.com>
Link: https://lore.kernel.org/r/20200805063413.4610-4-shengjiu.wang@nxp.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 7b3bee09
...@@ -350,6 +350,8 @@ static int fsl_sai_set_bclk(struct snd_soc_dai *dai, bool tx, u32 freq) ...@@ -350,6 +350,8 @@ static int fsl_sai_set_bclk(struct snd_soc_dai *dai, bool tx, u32 freq)
unsigned int ofs = sai->soc_data->reg_offset; unsigned int ofs = sai->soc_data->reg_offset;
unsigned long clk_rate; unsigned long clk_rate;
u32 savediv = 0, ratio, savesub = freq; u32 savediv = 0, ratio, savesub = freq;
int adir = tx ? RX : TX;
int dir = tx ? TX : RX;
u32 id; u32 id;
int ret = 0; int ret = 0;
...@@ -408,19 +410,17 @@ static int fsl_sai_set_bclk(struct snd_soc_dai *dai, bool tx, u32 freq) ...@@ -408,19 +410,17 @@ static int fsl_sai_set_bclk(struct snd_soc_dai *dai, bool tx, u32 freq)
* 4) For Tx and Rx are both Synchronous with another SAI, we just * 4) For Tx and Rx are both Synchronous with another SAI, we just
* ignore it. * ignore it.
*/ */
if ((sai->synchronous[TX] && !sai->synchronous[RX]) || if (fsl_sai_dir_is_synced(sai, adir)) {
(!tx && !sai->synchronous[RX])) { regmap_update_bits(sai->regmap, FSL_SAI_xCR2(!tx, ofs),
regmap_update_bits(sai->regmap, FSL_SAI_RCR2(ofs),
FSL_SAI_CR2_MSEL_MASK, FSL_SAI_CR2_MSEL_MASK,
FSL_SAI_CR2_MSEL(sai->mclk_id[tx])); FSL_SAI_CR2_MSEL(sai->mclk_id[tx]));
regmap_update_bits(sai->regmap, FSL_SAI_RCR2(ofs), regmap_update_bits(sai->regmap, FSL_SAI_xCR2(!tx, ofs),
FSL_SAI_CR2_DIV_MASK, savediv - 1); FSL_SAI_CR2_DIV_MASK, savediv - 1);
} else if ((sai->synchronous[RX] && !sai->synchronous[TX]) || } else if (!sai->synchronous[dir]) {
(tx && !sai->synchronous[TX])) { regmap_update_bits(sai->regmap, FSL_SAI_xCR2(tx, ofs),
regmap_update_bits(sai->regmap, FSL_SAI_TCR2(ofs),
FSL_SAI_CR2_MSEL_MASK, FSL_SAI_CR2_MSEL_MASK,
FSL_SAI_CR2_MSEL(sai->mclk_id[tx])); FSL_SAI_CR2_MSEL(sai->mclk_id[tx]));
regmap_update_bits(sai->regmap, FSL_SAI_TCR2(ofs), regmap_update_bits(sai->regmap, FSL_SAI_xCR2(tx, ofs),
FSL_SAI_CR2_DIV_MASK, savediv - 1); FSL_SAI_CR2_DIV_MASK, savediv - 1);
} }
...@@ -442,6 +442,7 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream, ...@@ -442,6 +442,7 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,
u32 val_cr4 = 0, val_cr5 = 0; u32 val_cr4 = 0, val_cr5 = 0;
u32 slots = (channels == 1) ? 2 : channels; u32 slots = (channels == 1) ? 2 : channels;
u32 slot_width = word_width; u32 slot_width = word_width;
int adir = tx ? RX : TX;
int ret; int ret;
if (sai->slots) if (sai->slots)
...@@ -491,22 +492,13 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream, ...@@ -491,22 +492,13 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,
* RCR5(TCR5) for playback(capture), or there will be sync error. * RCR5(TCR5) for playback(capture), or there will be sync error.
*/ */
if (!sai->is_slave_mode) { if (!sai->is_slave_mode && fsl_sai_dir_is_synced(sai, adir)) {
if (!sai->synchronous[TX] && sai->synchronous[RX] && !tx) { regmap_update_bits(sai->regmap, FSL_SAI_xCR4(!tx, ofs),
regmap_update_bits(sai->regmap, FSL_SAI_TCR4(ofs),
FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK, FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK,
val_cr4); val_cr4);
regmap_update_bits(sai->regmap, FSL_SAI_TCR5(ofs), regmap_update_bits(sai->regmap, FSL_SAI_xCR5(!tx, ofs),
FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK | FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK |
FSL_SAI_CR5_FBT_MASK, val_cr5); FSL_SAI_CR5_FBT_MASK, val_cr5);
} else if (!sai->synchronous[RX] && sai->synchronous[TX] && tx) {
regmap_update_bits(sai->regmap, FSL_SAI_RCR4(ofs),
FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK,
val_cr4);
regmap_update_bits(sai->regmap, FSL_SAI_RCR5(ofs),
FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK |
FSL_SAI_CR5_FBT_MASK, val_cr5);
}
} }
regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx, ofs), regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx, ofs),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment