diff options
author | Viorel Suman <viorel.suman@nxp.com> | 2018-01-29 16:04:44 +0200 |
---|---|---|
committer | Dong Aisheng <aisheng.dong@nxp.com> | 2019-11-25 15:53:52 +0800 |
commit | 086dcbc6a9db16bc6378ce09c0f172522f1eaf1d (patch) | |
tree | 1634088c128ef1b4efd203c437ae0964bb695972 /sound/soc/fsl | |
parent | 27fdb7856d88976f348247a4b97fe22f99494566 (diff) |
MLK-16224-6: ASoC: fsl_sai: fix DSD suspend/resume
With the existing implementation the SAI pinctrl state is restored to
default after resume - this breaks DSD playback after resume.
Restore DSD pinctrl state in snd_soc_dai_driver resume callback.
Signed-off-by: Viorel Suman <viorel.suman@nxp.com>
Reviewed-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Diffstat (limited to 'sound/soc/fsl')
-rw-r--r-- | sound/soc/fsl/fsl_sai.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c index 0d25ebdfdeee..a7133452720c 100644 --- a/sound/soc/fsl/fsl_sai.c +++ b/sound/soc/fsl/fsl_sai.c @@ -893,6 +893,23 @@ static int fsl_sai_dai_probe(struct snd_soc_dai *cpu_dai) return 0; } +static int fsl_sai_dai_resume(struct snd_soc_dai *cpu_dai) +{ + struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); + int ret; + + if (sai->is_dsd && !IS_ERR_OR_NULL(sai->pins_dsd)) { + ret = pinctrl_select_state(sai->pinctrl, sai->pins_dsd); + if (ret) { + dev_err(cpu_dai->dev, + "failed to set proper pins state: %d\n", ret); + return ret; + } + } + + return 0; +} + static struct snd_soc_dai_driver fsl_sai_dai = { .probe = fsl_sai_dai_probe, .playback = { @@ -913,6 +930,7 @@ static struct snd_soc_dai_driver fsl_sai_dai = { .rates = SNDRV_PCM_RATE_KNOT, .formats = FSL_SAI_FORMATS, }, + .resume = fsl_sai_dai_resume, .ops = &fsl_sai_pcm_dai_ops, }; |