diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1108-ASoC-AMD-Add-ACP3x-system-resume-pm-op.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1108-ASoC-AMD-Add-ACP3x-system-resume-pm-op.patch | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1108-ASoC-AMD-Add-ACP3x-system-resume-pm-op.patch b/meta-amd-bsp/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/meta-amd-bsp/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 + |