aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/1108-ASoC-AMD-Add-ACP3x-system-resume-pm-op.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/1108-ASoC-AMD-Add-ACP3x-system-resume-pm-op.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/1108-ASoC-AMD-Add-ACP3x-system-resume-pm-op.patch83
1 files changed, 83 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/1108-ASoC-AMD-Add-ACP3x-system-resume-pm-op.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/1108-ASoC-AMD-Add-ACP3x-system-resume-pm-op.patch
new file mode 100644
index 00000000..1f24dc53
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/1108-ASoC-AMD-Add-ACP3x-system-resume-pm-op.patch
@@ -0,0 +1,83 @@
+From bcec114624961692bfa27db57442c1c5d6e7e7ba Mon Sep 17 00:00:00 2001
+From: Maruthi Srinivas Bayyavarapu <Maruthi.Bayyavarapu@amd.com>
+Date: Thu, 30 Mar 2017 15:47:49 +0530
+Subject: [PATCH 1108/4131] ASoC: AMD: Add ACP3x system resume pm op
+
+When audio usecase in progress and system wide suspend happens, ACP will
+be powered off and when system resumes, for audio usecase to continue,
+all the runtime configuration data needs to be programmed again. Added
+'resume'pm call back to ACP pm ops.
+
+Signed-off-by: Maruthi Bayyavarapu <maruthi.bayyavarapu@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ sound/soc/amd/raven/acp3x-pcm-dma.c | 46 +++++++++++++++++++++++++++++++++++++
+ 1 file changed, 46 insertions(+)
+
+diff --git a/sound/soc/amd/raven/acp3x-pcm-dma.c b/sound/soc/amd/raven/acp3x-pcm-dma.c
+index a5d3807..5246d28 100644
+--- a/sound/soc/amd/raven/acp3x-pcm-dma.c
++++ b/sound/soc/amd/raven/acp3x-pcm-dma.c
+@@ -709,6 +709,51 @@ static int acp3x_audio_remove(struct platform_device *pdev)
+ return 0;
+ }
+
++static int acp3x_resume(struct device *dev)
++{
++ int status;
++ u32 val;
++ struct i2s_dev_data *adata = dev_get_drvdata(dev);
++
++ status = acp3x_init(adata->acp3x_base);
++ if (status)
++ return -ENODEV;
++
++ if (adata->play_stream && adata->play_stream->runtime) {
++ struct i2s_stream_instance *rtd =
++ adata->play_stream->runtime->private_data;
++ config_acp3x_dma(rtd, SNDRV_PCM_STREAM_PLAYBACK);
++ rv_writel((rtd->xfer_resolution << 3),
++ rtd->acp3x_base + mmACP_BTTDM_ITER);
++ if (adata->tdm_mode == true) {
++ rv_writel(adata->tdm_fmt, adata->acp3x_base +
++ mmACP_BTTDM_TXFRMT);
++ val = rv_readl(adata->acp3x_base + mmACP_BTTDM_ITER);
++ rv_writel((val | 0x2), adata->acp3x_base +
++ mmACP_BTTDM_ITER);
++ }
++ }
++
++ if (adata->capture_stream && adata->capture_stream->runtime) {
++ struct i2s_stream_instance *rtd =
++ adata->capture_stream->runtime->private_data;
++ config_acp3x_dma(rtd, SNDRV_PCM_STREAM_CAPTURE);
++ rv_writel((rtd->xfer_resolution << 3),
++ rtd->acp3x_base + mmACP_BTTDM_IRER);
++ if (adata->tdm_mode == true) {
++ rv_writel(adata->tdm_fmt, adata->acp3x_base +
++ mmACP_BTTDM_RXFRMT);
++ val = rv_readl(adata->acp3x_base + mmACP_BTTDM_IRER);
++ rv_writel((val | 0x2), adata->acp3x_base +
++ mmACP_BTTDM_IRER);
++ }
++ }
++
++ rv_writel(1, adata->acp3x_base + mmACP_EXTERNAL_INTR_ENB);
++ return 0;
++}
++
++
+ static int acp3x_pcm_runtime_suspend(struct device *dev)
+ {
+ int status;
+@@ -740,6 +785,7 @@ static int acp3x_pcm_runtime_resume(struct device *dev)
+ static const struct dev_pm_ops acp3x_pm_ops = {
+ .runtime_suspend = acp3x_pcm_runtime_suspend,
+ .runtime_resume = acp3x_pcm_runtime_resume,
++ .resume = acp3x_resume,
+ };
+
+ static struct platform_driver acp3x_dma_driver = {
+--
+2.7.4
+