aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1105-ASoC-AMD-add-ACP3x-i2s-ops.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1105-ASoC-AMD-add-ACP3x-i2s-ops.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1105-ASoC-AMD-add-ACP3x-i2s-ops.patch114
1 files changed, 114 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1105-ASoC-AMD-add-ACP3x-i2s-ops.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1105-ASoC-AMD-add-ACP3x-i2s-ops.patch
new file mode 100644
index 00000000..983855fa
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1105-ASoC-AMD-add-ACP3x-i2s-ops.patch
@@ -0,0 +1,114 @@
+From 913e9b53a6d75fcb5e65ed5e5a219bc852c1a09c Mon Sep 17 00:00:00 2001
+From: Maruthi Srinivas Bayyavarapu <Maruthi.Bayyavarapu@amd.com>
+Date: Wed, 29 Mar 2017 19:12:20 +0530
+Subject: [PATCH 1105/4131] ASoC: AMD: add ACP3x i2s ops
+
+ACP3x has a i2s controller block for playback and capture. This patch
+adds ACP3x i2s operations.
+
+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 | 85 +++++++++++++++++++++++++++++++++++--
+ 1 file changed, 82 insertions(+), 3 deletions(-)
+
+diff --git a/sound/soc/amd/raven/acp3x-pcm-dma.c b/sound/soc/amd/raven/acp3x-pcm-dma.c
+index 346ebcb..5e589dc 100644
+--- a/sound/soc/amd/raven/acp3x-pcm-dma.c
++++ b/sound/soc/amd/raven/acp3x-pcm-dma.c
+@@ -436,10 +436,89 @@ static struct snd_soc_platform_driver acp3x_asoc_platform = {
+ .pcm_new = acp3x_dma_new,
+ };
+
++static int acp3x_dai_i2s_hwparams(struct snd_pcm_substream *substream,
++ struct snd_pcm_hw_params *params,
++ struct snd_soc_dai *dai)
++{
++ struct i2s_stream_instance *rtd = substream->runtime->private_data;
++
++ switch (params_format(params)) {
++ case SNDRV_PCM_FORMAT_U8:
++ case SNDRV_PCM_FORMAT_S8:
++ rtd->xfer_resolution = 0x0;
++ break;
++ case SNDRV_PCM_FORMAT_S16_LE:
++ rtd->xfer_resolution = 0x02;
++ break;
++
++ case SNDRV_PCM_FORMAT_S24_LE:
++ rtd->xfer_resolution = 0x04;
++ break;
++ case SNDRV_PCM_FORMAT_S32_LE:
++ rtd->xfer_resolution = 0x05;
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
++ rv_writel((rtd->xfer_resolution << 3),
++ rtd->acp3x_base + mmACP_BTTDM_ITER);
++ else
++ rv_writel((rtd->xfer_resolution << 3),
++ rtd->acp3x_base + mmACP_BTTDM_IRER);
++
++ return 0;
++}
++
++static int acp3x_dai_i2s_trigger(struct snd_pcm_substream *substream,
++ int cmd, struct snd_soc_dai *dai)
++{
++ int ret = 0;
++ struct i2s_stream_instance *rtd = substream->runtime->private_data;
++ u32 val;
++
++ switch (cmd) {
++ case SNDRV_PCM_TRIGGER_START:
++ case SNDRV_PCM_TRIGGER_RESUME:
++ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
++ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
++ val = rv_readl(rtd->acp3x_base + mmACP_BTTDM_ITER);
++ val = val | BIT(0);
++ rv_writel(val, rtd->acp3x_base + mmACP_BTTDM_ITER);
++ } else {
++ val = rv_readl(rtd->acp3x_base + mmACP_BTTDM_IRER);
++ val = val | BIT(0);
++ rv_writel(val, rtd->acp3x_base + mmACP_BTTDM_IRER);
++ }
++ rv_writel(1, rtd->acp3x_base + mmACP_BTTDM_IER);
++ break;
++
++ case SNDRV_PCM_TRIGGER_STOP:
++ case SNDRV_PCM_TRIGGER_SUSPEND:
++ case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
++ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
++ val = rv_readl(rtd->acp3x_base + mmACP_BTTDM_ITER);
++ val = val & ~BIT(0);
++ rv_writel(val, rtd->acp3x_base + mmACP_BTTDM_ITER);
++ } else {
++ val = rv_readl(rtd->acp3x_base + mmACP_BTTDM_IRER);
++ val = val & ~BIT(0);
++ rv_writel(val, rtd->acp3x_base + mmACP_BTTDM_IRER);
++ }
++ rv_writel(0, rtd->acp3x_base + mmACP_BTTDM_IER);
++ break;
++ default:
++ ret = -EINVAL;
++ break;
++ }
++
++ return ret;
++}
++
+ struct snd_soc_dai_ops acp3x_dai_i2s_ops = {
+- .hw_params = NULL,
+- .trigger = NULL,
+- .set_fmt = NULL,
++ .hw_params = acp3x_dai_i2s_hwparams,
++ .trigger = acp3x_dai_i2s_trigger,
+ };
+
+ static struct snd_soc_dai_driver acp3x_i2s_dai_driver = {
+--
+2.7.4
+