diff options
author | Dong Aisheng <dong.aisheng@linaro.org> | 2012-07-20 05:20:24 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-07-24 15:17:58 -0400 |
commit | c2e1d9073fc98f471067c0257a31b4818306ebe1 (patch) | |
tree | 2f7a0a5020881a9e4bc4413f60849bed279c9d08 /sound | |
parent | b8edf3e5522735c8ce78b81845f7a1a2d4a08626 (diff) |
ASoC: mxs-saif: fix clock prepare and enable unbalance issue
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.
Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
Acked-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound')
-rw-r--r-- | 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 aba71bfa33b1..fdbb36aa9cf5 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, | |||
394 | struct snd_soc_dai *cpu_dai) | 394 | struct snd_soc_dai *cpu_dai) |
395 | { | 395 | { |
396 | struct mxs_saif *saif = snd_soc_dai_get_drvdata(cpu_dai); | 396 | struct mxs_saif *saif = snd_soc_dai_get_drvdata(cpu_dai); |
397 | struct mxs_saif *master_saif; | ||
397 | u32 scr, stat; | 398 | u32 scr, stat; |
398 | int ret; | 399 | int ret; |
399 | 400 | ||
401 | master_saif = mxs_saif_get_master(saif); | ||
402 | if (!master_saif) | ||
403 | return -EINVAL; | ||
404 | |||
400 | /* mclk should already be set */ | 405 | /* mclk should already be set */ |
401 | if (!saif->mclk && saif->mclk_in_use) { | 406 | if (!saif->mclk && saif->mclk_in_use) { |
402 | dev_err(cpu_dai->dev, "set mclk first\n"); | 407 | dev_err(cpu_dai->dev, "set mclk first\n"); |
@@ -420,6 +425,11 @@ static int mxs_saif_hw_params(struct snd_pcm_substream *substream, | |||
420 | return ret; | 425 | return ret; |
421 | } | 426 | } |
422 | 427 | ||
428 | /* prepare clk in hw_param, enable in trigger */ | ||
429 | clk_prepare(saif->clk); | ||
430 | if (saif != master_saif) | ||
431 | clk_prepare(master_saif->clk); | ||
432 | |||
423 | scr = __raw_readl(saif->base + SAIF_CTRL); | 433 | scr = __raw_readl(saif->base + SAIF_CTRL); |
424 | 434 | ||
425 | scr &= ~BM_SAIF_CTRL_WORD_LENGTH; | 435 | scr &= ~BM_SAIF_CTRL_WORD_LENGTH; |