summaryrefslogtreecommitdiff
path: root/sound/soc/fsl/fsl_sai.c
diff options
context:
space:
mode:
authorViorel Suman <viorel.suman@nxp.com>2018-01-29 16:04:44 +0200
committerDong Aisheng <aisheng.dong@nxp.com>2019-11-25 15:53:52 +0800
commit086dcbc6a9db16bc6378ce09c0f172522f1eaf1d (patch)
tree1634088c128ef1b4efd203c437ae0964bb695972 /sound/soc/fsl/fsl_sai.c
parent27fdb7856d88976f348247a4b97fe22f99494566 (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/fsl_sai.c')
-rw-r--r--sound/soc/fsl/fsl_sai.c18
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,
};