[PATCH 1/4] ASoC: mxs-saif: fix clock prepare and enable unbalance issue

Måns Rullgård mans at mansr.com
Sat Jan 16 08:24:35 PST 2016


Dong Aisheng <b29396 at freescale.com> writes:

> From: Dong Aisheng <dong.aisheng at linaro.org>
>
> Currently we directly call a clock_enable in trigger function without
> a clk_prepare as pair first.
> This will cause system hang immediately when run capture because
> the clock was not prepared(playback does not hang because the clock was
> prepared already by get_mclk before), a warning message in clock framework
> may cause a deadlock to reclaim clock lock (see: pl011_console_write).
>
> Here we prepare clock first in hw_param, then enable it in trigger
> function to guarantee the balance.
>
> Cc: Mark Brown <broonie at opensource.wolfsonmicro.com>
> Cc: Liam Girdwood <lrg at ti.com>
> Cc: Wolfram Sang <w.sang at pengutronix.de>
> Cc: Shawn Guo <shawn.guo at linaro.org>
> Signed-off-by: Dong Aisheng <dong.aisheng at linaro.org>
> ---
>  sound/soc/mxs/mxs-saif.c |   10 ++++++++++
>  1 files changed, 10 insertions(+), 0 deletions(-)
>
> diff --git a/sound/soc/mxs/mxs-saif.c b/sound/soc/mxs/mxs-saif.c
> index aba71bf..fdbb36a 100644
> --- a/sound/soc/mxs/mxs-saif.c
> +++ b/sound/soc/mxs/mxs-saif.c
> @@ -394,9 +394,14 @@ static int mxs_saif_hw_params(struct snd_pcm_substream *substream,
>  			     struct snd_soc_dai *cpu_dai)
>  {
>  	struct mxs_saif *saif = snd_soc_dai_get_drvdata(cpu_dai);
> +	struct mxs_saif *master_saif;
>  	u32 scr, stat;
>  	int ret;
>
> +	master_saif = mxs_saif_get_master(saif);
> +	if (!master_saif)
> +		return -EINVAL;
> +
>  	/* mclk should already be set */
>  	if (!saif->mclk && saif->mclk_in_use) {
>  		dev_err(cpu_dai->dev, "set mclk first\n");
> @@ -420,6 +425,11 @@ static int mxs_saif_hw_params(struct snd_pcm_substream *substream,
>  		return ret;
>  	}
>
> +	/* prepare clk in hw_param, enable in trigger */
> +	clk_prepare(saif->clk);
> +	if (saif != master_saif)
> +		clk_prepare(master_saif->clk);
> +
>  	scr = __raw_readl(saif->base + SAIF_CTRL);
>
>  	scr &= ~BM_SAIF_CTRL_WORD_LENGTH;
> -- 

This is missing a matching clk_unprepare() call.

-- 
Måns Rullgård



More information about the linux-arm-kernel mailing list