summaryrefslogtreecommitdiff
path: root/sound/soc/fsl/imx-wm8962.c
diff options
context:
space:
mode:
authorNicolin Chen <b42378@freescale.com>2013-08-30 16:02:35 +0800
committerDong Aisheng <aisheng.dong@nxp.com>2019-11-25 15:49:55 +0800
commit02bac8135e7427fbac22de1fc88107fecc82e0b8 (patch)
tree7ee935956e94efc27ca98fab1a86defc5284d6c4 /sound/soc/fsl/imx-wm8962.c
parent2b55dd085e0b6aa8c4e4bd6fcbae868b6d9ce2fa (diff)
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)
Diffstat (limited to 'sound/soc/fsl/imx-wm8962.c')
-rw-r--r--sound/soc/fsl/imx-wm8962.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/sound/soc/fsl/imx-wm8962.c b/sound/soc/fsl/imx-wm8962.c
index aad4974fcaaf..5cbd961f6785 100644
--- a/sound/soc/fsl/imx-wm8962.c
+++ b/sound/soc/fsl/imx-wm8962.c
@@ -125,6 +125,13 @@ static int imx_hifi_hw_free(struct snd_pcm_substream *substream)
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);