The driver performs SAI reset in three places, factor the reset handling into single function to avoid duplication. No functional change. Signed-off-by: Marek Vasut <marex@xxxxxxx> --- Cc: Fabio Estevam <festevam@xxxxxxxxx> Cc: Jaroslav Kysela <perex@xxxxxxxx> Cc: Liam Girdwood <lgirdwood@xxxxxxxxx> Cc: Mark Brown <broonie@xxxxxxxxxx> Cc: Nicolin Chen <nicoleotsuka@xxxxxxxxx> Cc: Shengjiu Wang <shengjiu.wang@xxxxxxxxx> Cc: Takashi Iwai <tiwai@xxxxxxxx> Cc: Xiubo Li <Xiubo.Lee@xxxxxxxxx> To: alsa-devel@xxxxxxxxxxxxxxxx --- sound/soc/fsl/fsl_sai.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c index 1c9be8a5dcb13..ade5a6b44b66a 100644 --- a/sound/soc/fsl/fsl_sai.c +++ b/sound/soc/fsl/fsl_sai.c @@ -704,6 +704,21 @@ static int fsl_sai_hw_free(struct snd_pcm_substream *substream, return 0; } +static void fsl_sai_reset(struct fsl_sai *sai, bool rx, bool tx) +{ + unsigned int ofs = sai->soc_data->reg_offset; + + if (tx) + regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), FSL_SAI_CSR_SR); + if (rx) + regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), FSL_SAI_CSR_SR); + usleep_range(1000, 2000); + if (tx) + regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), 0); + if (rx) + regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), 0); +} + static void fsl_sai_config_disable(struct fsl_sai *sai, int dir) { unsigned int ofs = sai->soc_data->reg_offset; @@ -729,12 +744,8 @@ static void fsl_sai_config_disable(struct fsl_sai *sai, int dir) * This is a hardware bug, and will be fix in the * next sai version. */ - if (!sai->is_consumer_mode) { - /* Software Reset */ - regmap_write(sai->regmap, FSL_SAI_xCSR(tx, ofs), FSL_SAI_CSR_SR); - /* Clear SR bit to finish the reset */ - regmap_write(sai->regmap, FSL_SAI_xCSR(tx, ofs), 0); - } + if (!sai->is_consumer_mode) + fsl_sai_reset(sai, dir == RX, dir == TX); } static int fsl_sai_trigger(struct snd_pcm_substream *substream, int cmd, @@ -863,12 +874,7 @@ static int fsl_sai_dai_probe(struct snd_soc_dai *cpu_dai) struct fsl_sai *sai = dev_get_drvdata(cpu_dai->dev); unsigned int ofs = sai->soc_data->reg_offset; - /* Software Reset for both Tx and Rx */ - regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), FSL_SAI_CSR_SR); - regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), FSL_SAI_CSR_SR); - /* Clear SR bit to finish the reset */ - regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), 0); - regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), 0); + fsl_sai_reset(sai, true, true); regmap_update_bits(sai->regmap, FSL_SAI_TCR1(ofs), FSL_SAI_CR1_RFW_MASK(sai->soc_data->fifo_depth), @@ -1632,7 +1638,6 @@ static int fsl_sai_runtime_suspend(struct device *dev) static int fsl_sai_runtime_resume(struct device *dev) { struct fsl_sai *sai = dev_get_drvdata(dev); - unsigned int ofs = sai->soc_data->reg_offset; int ret; ret = clk_prepare_enable(sai->bus_clk); @@ -1658,11 +1663,8 @@ static int fsl_sai_runtime_resume(struct device *dev) regcache_cache_only(sai->regmap, false); regcache_mark_dirty(sai->regmap); - regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), FSL_SAI_CSR_SR); - regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), FSL_SAI_CSR_SR); - usleep_range(1000, 2000); - regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), 0); - regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), 0); + + fsl_sai_reset(sai, true, true); ret = regcache_sync(sai->regmap); if (ret) -- 2.35.1