1
0
Fork 0

MLK-11479-05 ASoC: fsl: Fix set-mute-failed issue after WM8962 capture

cherry-pick below patch from v3.14.y:
ENGR00277471 ASoC: fsl: Fix set-mute-failed issue after WM8962 capture

We only need to mute WM8962 after playback, so add direction check
before doing mute.

And a mute failure would cause hw_free() abruptly return after it,
which might drop the essential procedure code for FLL controlling.
Thus put mute before FLL controlling code and drop its return check.

Acked-by: Wang Shengjiu <b02247@freescale.com>
Signed-off-by: Nicolin Chen <b42378@freescale.com>
(cherry picked from commit 3133b6cfb31b202805d31d449bfa70383e5e1c75)
5.4-rM2-2.2.x-imx-squashed
Nicolin Chen 2013-08-30 16:02:35 +08:00 committed by Dong Aisheng
parent 2b55dd085e
commit 02bac8135e
1 changed files with 7 additions and 10 deletions

View File

@ -124,6 +124,13 @@ static int imx_hifi_hw_free(struct snd_pcm_substream *substream)
priv->second_stream = NULL;
if (!priv->first_stream) {
/*
* Continuously setting FLL would cause playback distortion.
* We can fix it just by mute codec after playback.
*/
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
snd_soc_dai_digital_mute(codec_dai, 1, substream->stream);
/*
* WM8962 doesn't allow us to continuously setting FLL,
* So we set MCLK as sysclk once, which'd remove the limitation.
@ -135,16 +142,6 @@ static int imx_hifi_hw_free(struct snd_pcm_substream *substream)
return ret;
}
/*
* Continuously setting FLL would cause playback distortion.
* We can fix it just by mute codec after playback.
*/
ret = snd_soc_dai_digital_mute(codec_dai, 1, substream->stream);
if (ret < 0) {
dev_err(dev, "failed to set MUTE: %d\n", ret);
return ret;
}
/* Disable FLL and let codec do pm_runtime_put() */
ret = snd_soc_dai_set_pll(codec_dai, WM8962_FLL,
WM8962_FLL_MCLK, 0, 0);