1b81af585SSrinivasa Rao Mandadapu // SPDX-License-Identifier: GPL-2.0-only
2b81af585SSrinivasa Rao Mandadapu /*
3b81af585SSrinivasa Rao Mandadapu * Copyright (c) 2021 The Linux Foundation. All rights reserved.
4b81af585SSrinivasa Rao Mandadapu *
5b81af585SSrinivasa Rao Mandadapu * lpass-cdc-dma.c -- ALSA SoC CDC DMA CPU DAI driver for QTi LPASS
6b81af585SSrinivasa Rao Mandadapu */
7b81af585SSrinivasa Rao Mandadapu
8b81af585SSrinivasa Rao Mandadapu #include <linux/clk.h>
9b81af585SSrinivasa Rao Mandadapu #include <linux/module.h>
10b81af585SSrinivasa Rao Mandadapu #include <linux/export.h>
11b81af585SSrinivasa Rao Mandadapu #include <sound/soc.h>
12b81af585SSrinivasa Rao Mandadapu #include <sound/soc-dai.h>
13b81af585SSrinivasa Rao Mandadapu
14b81af585SSrinivasa Rao Mandadapu #include "lpass-lpaif-reg.h"
15b81af585SSrinivasa Rao Mandadapu #include "lpass.h"
16b81af585SSrinivasa Rao Mandadapu
17b81af585SSrinivasa Rao Mandadapu #define CODEC_MEM_HZ_NORMAL 153600000
18b81af585SSrinivasa Rao Mandadapu
19b81af585SSrinivasa Rao Mandadapu enum codec_dma_interfaces {
20b81af585SSrinivasa Rao Mandadapu LPASS_CDC_DMA_INTERFACE1 = 1,
21b81af585SSrinivasa Rao Mandadapu LPASS_CDC_DMA_INTERFACE2,
22b81af585SSrinivasa Rao Mandadapu LPASS_CDC_DMA_INTERFACE3,
23b81af585SSrinivasa Rao Mandadapu LPASS_CDC_DMA_INTERFACE4,
24b81af585SSrinivasa Rao Mandadapu LPASS_CDC_DMA_INTERFACE5,
25b81af585SSrinivasa Rao Mandadapu LPASS_CDC_DMA_INTERFACE6,
26b81af585SSrinivasa Rao Mandadapu LPASS_CDC_DMA_INTERFACE7,
27b81af585SSrinivasa Rao Mandadapu LPASS_CDC_DMA_INTERFACE8,
28b81af585SSrinivasa Rao Mandadapu LPASS_CDC_DMA_INTERFACE9,
29b81af585SSrinivasa Rao Mandadapu LPASS_CDC_DMA_INTERFACE10,
30b81af585SSrinivasa Rao Mandadapu };
31b81af585SSrinivasa Rao Mandadapu
__lpass_get_dmactl_handle(struct snd_pcm_substream * substream,struct snd_soc_dai * dai,struct lpaif_dmactl ** dmactl,int * id)32b81af585SSrinivasa Rao Mandadapu static void __lpass_get_dmactl_handle(struct snd_pcm_substream *substream, struct snd_soc_dai *dai,
33b81af585SSrinivasa Rao Mandadapu struct lpaif_dmactl **dmactl, int *id)
34b81af585SSrinivasa Rao Mandadapu {
35841361d8SKuninori Morimoto struct snd_soc_pcm_runtime *soc_runtime = snd_soc_substream_to_rtd(substream);
36841361d8SKuninori Morimoto struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(soc_runtime, 0);
37b81af585SSrinivasa Rao Mandadapu struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
38b81af585SSrinivasa Rao Mandadapu struct snd_pcm_runtime *rt = substream->runtime;
39b81af585SSrinivasa Rao Mandadapu struct lpass_pcm_data *pcm_data = rt->private_data;
40b81af585SSrinivasa Rao Mandadapu struct lpass_variant *v = drvdata->variant;
41b81af585SSrinivasa Rao Mandadapu unsigned int dai_id = cpu_dai->driver->id;
42b81af585SSrinivasa Rao Mandadapu
43b81af585SSrinivasa Rao Mandadapu switch (dai_id) {
44b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_RX0 ... LPASS_CDC_DMA_RX9:
45b81af585SSrinivasa Rao Mandadapu *dmactl = drvdata->rxtx_rd_dmactl;
46b81af585SSrinivasa Rao Mandadapu *id = pcm_data->dma_ch;
47b81af585SSrinivasa Rao Mandadapu break;
48b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_TX0 ... LPASS_CDC_DMA_TX8:
49b81af585SSrinivasa Rao Mandadapu *dmactl = drvdata->rxtx_wr_dmactl;
50b81af585SSrinivasa Rao Mandadapu *id = pcm_data->dma_ch - v->rxtx_wrdma_channel_start;
51b81af585SSrinivasa Rao Mandadapu break;
52b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_VA_TX0 ... LPASS_CDC_DMA_VA_TX8:
53b81af585SSrinivasa Rao Mandadapu *dmactl = drvdata->va_wr_dmactl;
54b81af585SSrinivasa Rao Mandadapu *id = pcm_data->dma_ch - v->va_wrdma_channel_start;
55b81af585SSrinivasa Rao Mandadapu break;
56b81af585SSrinivasa Rao Mandadapu default:
57b81af585SSrinivasa Rao Mandadapu dev_err(soc_runtime->dev, "invalid dai id for dma ctl: %d\n", dai_id);
58b81af585SSrinivasa Rao Mandadapu break;
59b81af585SSrinivasa Rao Mandadapu }
60b81af585SSrinivasa Rao Mandadapu }
61b81af585SSrinivasa Rao Mandadapu
__lpass_get_codec_dma_intf_type(int dai_id)62b81af585SSrinivasa Rao Mandadapu static int __lpass_get_codec_dma_intf_type(int dai_id)
63b81af585SSrinivasa Rao Mandadapu {
64b81af585SSrinivasa Rao Mandadapu int ret;
65b81af585SSrinivasa Rao Mandadapu
66b81af585SSrinivasa Rao Mandadapu switch (dai_id) {
67b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_RX0:
68b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_TX0:
69b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_VA_TX0:
70b81af585SSrinivasa Rao Mandadapu ret = LPASS_CDC_DMA_INTERFACE1;
71b81af585SSrinivasa Rao Mandadapu break;
72b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_RX1:
73b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_TX1:
74b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_VA_TX1:
75b81af585SSrinivasa Rao Mandadapu ret = LPASS_CDC_DMA_INTERFACE2;
76b81af585SSrinivasa Rao Mandadapu break;
77b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_RX2:
78b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_TX2:
79b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_VA_TX2:
80b81af585SSrinivasa Rao Mandadapu ret = LPASS_CDC_DMA_INTERFACE3;
81b81af585SSrinivasa Rao Mandadapu break;
82b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_RX3:
83b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_TX3:
84b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_VA_TX3:
85b81af585SSrinivasa Rao Mandadapu ret = LPASS_CDC_DMA_INTERFACE4;
86b81af585SSrinivasa Rao Mandadapu break;
87b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_RX4:
88b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_TX4:
89b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_VA_TX4:
90b81af585SSrinivasa Rao Mandadapu ret = LPASS_CDC_DMA_INTERFACE5;
91b81af585SSrinivasa Rao Mandadapu break;
92b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_RX5:
93b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_TX5:
94b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_VA_TX5:
95b81af585SSrinivasa Rao Mandadapu ret = LPASS_CDC_DMA_INTERFACE6;
96b81af585SSrinivasa Rao Mandadapu break;
97b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_RX6:
98b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_TX6:
99b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_VA_TX6:
100b81af585SSrinivasa Rao Mandadapu ret = LPASS_CDC_DMA_INTERFACE7;
101b81af585SSrinivasa Rao Mandadapu break;
102b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_RX7:
103b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_TX7:
104b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_VA_TX7:
105b81af585SSrinivasa Rao Mandadapu ret = LPASS_CDC_DMA_INTERFACE8;
106b81af585SSrinivasa Rao Mandadapu break;
107b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_RX8:
108b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_TX8:
109b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_VA_TX8:
110b81af585SSrinivasa Rao Mandadapu ret = LPASS_CDC_DMA_INTERFACE9;
111b81af585SSrinivasa Rao Mandadapu break;
112b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_RX9:
113b81af585SSrinivasa Rao Mandadapu ret = LPASS_CDC_DMA_INTERFACE10;
114b81af585SSrinivasa Rao Mandadapu break;
115b81af585SSrinivasa Rao Mandadapu default:
116b81af585SSrinivasa Rao Mandadapu ret = -EINVAL;
117b81af585SSrinivasa Rao Mandadapu break;
118b81af585SSrinivasa Rao Mandadapu }
119b81af585SSrinivasa Rao Mandadapu return ret;
120b81af585SSrinivasa Rao Mandadapu }
121b81af585SSrinivasa Rao Mandadapu
__lpass_platform_codec_intf_init(struct snd_soc_dai * dai,struct snd_pcm_substream * substream)122b81af585SSrinivasa Rao Mandadapu static int __lpass_platform_codec_intf_init(struct snd_soc_dai *dai,
123b81af585SSrinivasa Rao Mandadapu struct snd_pcm_substream *substream)
124b81af585SSrinivasa Rao Mandadapu {
125841361d8SKuninori Morimoto struct snd_soc_pcm_runtime *soc_runtime = snd_soc_substream_to_rtd(substream);
126841361d8SKuninori Morimoto struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(soc_runtime, 0);
127b81af585SSrinivasa Rao Mandadapu struct lpaif_dmactl *dmactl = NULL;
128b81af585SSrinivasa Rao Mandadapu struct device *dev = soc_runtime->dev;
129b81af585SSrinivasa Rao Mandadapu int ret, id, codec_intf;
130b81af585SSrinivasa Rao Mandadapu unsigned int dai_id = cpu_dai->driver->id;
131b81af585SSrinivasa Rao Mandadapu
132b81af585SSrinivasa Rao Mandadapu codec_intf = __lpass_get_codec_dma_intf_type(dai_id);
133b81af585SSrinivasa Rao Mandadapu if (codec_intf < 0) {
134b81af585SSrinivasa Rao Mandadapu dev_err(dev, "failed to get codec_intf: %d\n", codec_intf);
135b81af585SSrinivasa Rao Mandadapu return codec_intf;
136b81af585SSrinivasa Rao Mandadapu }
137b81af585SSrinivasa Rao Mandadapu
138b81af585SSrinivasa Rao Mandadapu __lpass_get_dmactl_handle(substream, dai, &dmactl, &id);
139b81af585SSrinivasa Rao Mandadapu if (!dmactl)
140b81af585SSrinivasa Rao Mandadapu return -EINVAL;
141b81af585SSrinivasa Rao Mandadapu
142b81af585SSrinivasa Rao Mandadapu ret = regmap_fields_write(dmactl->codec_intf, id, codec_intf);
143b81af585SSrinivasa Rao Mandadapu if (ret) {
144b81af585SSrinivasa Rao Mandadapu dev_err(dev, "error writing to dmactl codec_intf reg field: %d\n", ret);
145b81af585SSrinivasa Rao Mandadapu return ret;
146b81af585SSrinivasa Rao Mandadapu }
147b81af585SSrinivasa Rao Mandadapu ret = regmap_fields_write(dmactl->codec_fs_sel, id, 0x0);
148b81af585SSrinivasa Rao Mandadapu if (ret) {
149b81af585SSrinivasa Rao Mandadapu dev_err(dev, "error writing to dmactl codec_fs_sel reg field: %d\n", ret);
150b81af585SSrinivasa Rao Mandadapu return ret;
151b81af585SSrinivasa Rao Mandadapu }
152b81af585SSrinivasa Rao Mandadapu ret = regmap_fields_write(dmactl->codec_fs_delay, id, 0x0);
153b81af585SSrinivasa Rao Mandadapu if (ret) {
154b81af585SSrinivasa Rao Mandadapu dev_err(dev, "error writing to dmactl codec_fs_delay reg field: %d\n", ret);
155b81af585SSrinivasa Rao Mandadapu return ret;
156b81af585SSrinivasa Rao Mandadapu }
157b81af585SSrinivasa Rao Mandadapu ret = regmap_fields_write(dmactl->codec_pack, id, 0x1);
158b81af585SSrinivasa Rao Mandadapu if (ret) {
159b81af585SSrinivasa Rao Mandadapu dev_err(dev, "error writing to dmactl codec_pack reg field: %d\n", ret);
160b81af585SSrinivasa Rao Mandadapu return ret;
161b81af585SSrinivasa Rao Mandadapu }
162b81af585SSrinivasa Rao Mandadapu ret = regmap_fields_write(dmactl->codec_enable, id, LPAIF_DMACTL_ENABLE_ON);
163b81af585SSrinivasa Rao Mandadapu if (ret) {
164b81af585SSrinivasa Rao Mandadapu dev_err(dev, "error writing to dmactl codec_enable reg field: %d\n", ret);
165b81af585SSrinivasa Rao Mandadapu return ret;
166b81af585SSrinivasa Rao Mandadapu }
167b81af585SSrinivasa Rao Mandadapu return 0;
168b81af585SSrinivasa Rao Mandadapu }
169b81af585SSrinivasa Rao Mandadapu
lpass_cdc_dma_daiops_startup(struct snd_pcm_substream * substream,struct snd_soc_dai * dai)170b81af585SSrinivasa Rao Mandadapu static int lpass_cdc_dma_daiops_startup(struct snd_pcm_substream *substream,
171b81af585SSrinivasa Rao Mandadapu struct snd_soc_dai *dai)
172b81af585SSrinivasa Rao Mandadapu {
173b81af585SSrinivasa Rao Mandadapu struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
174841361d8SKuninori Morimoto struct snd_soc_pcm_runtime *soc_runtime = snd_soc_substream_to_rtd(substream);
175b81af585SSrinivasa Rao Mandadapu
176b81af585SSrinivasa Rao Mandadapu switch (dai->id) {
177b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_RX0 ... LPASS_CDC_DMA_RX9:
178b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_TX0 ... LPASS_CDC_DMA_TX8:
179b81af585SSrinivasa Rao Mandadapu clk_set_rate(drvdata->codec_mem0, CODEC_MEM_HZ_NORMAL);
180b81af585SSrinivasa Rao Mandadapu clk_prepare_enable(drvdata->codec_mem0);
181b81af585SSrinivasa Rao Mandadapu break;
182b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_VA_TX0 ... LPASS_CDC_DMA_VA_TX0:
183b81af585SSrinivasa Rao Mandadapu clk_set_rate(drvdata->va_mem0, CODEC_MEM_HZ_NORMAL);
184b81af585SSrinivasa Rao Mandadapu clk_prepare_enable(drvdata->va_mem0);
185b81af585SSrinivasa Rao Mandadapu break;
186b81af585SSrinivasa Rao Mandadapu default:
187b81af585SSrinivasa Rao Mandadapu dev_err(soc_runtime->dev, "%s: invalid interface: %d\n", __func__, dai->id);
188b81af585SSrinivasa Rao Mandadapu break;
189b81af585SSrinivasa Rao Mandadapu }
190b81af585SSrinivasa Rao Mandadapu return 0;
191b81af585SSrinivasa Rao Mandadapu }
192b81af585SSrinivasa Rao Mandadapu
lpass_cdc_dma_daiops_shutdown(struct snd_pcm_substream * substream,struct snd_soc_dai * dai)193b81af585SSrinivasa Rao Mandadapu static void lpass_cdc_dma_daiops_shutdown(struct snd_pcm_substream *substream,
194b81af585SSrinivasa Rao Mandadapu struct snd_soc_dai *dai)
195b81af585SSrinivasa Rao Mandadapu {
196b81af585SSrinivasa Rao Mandadapu struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
197841361d8SKuninori Morimoto struct snd_soc_pcm_runtime *soc_runtime = snd_soc_substream_to_rtd(substream);
198b81af585SSrinivasa Rao Mandadapu
199b81af585SSrinivasa Rao Mandadapu switch (dai->id) {
200b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_RX0 ... LPASS_CDC_DMA_RX9:
201b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_TX0 ... LPASS_CDC_DMA_TX8:
202b81af585SSrinivasa Rao Mandadapu clk_disable_unprepare(drvdata->codec_mem0);
203b81af585SSrinivasa Rao Mandadapu break;
204b81af585SSrinivasa Rao Mandadapu case LPASS_CDC_DMA_VA_TX0 ... LPASS_CDC_DMA_VA_TX0:
205b81af585SSrinivasa Rao Mandadapu clk_disable_unprepare(drvdata->va_mem0);
206b81af585SSrinivasa Rao Mandadapu break;
207b81af585SSrinivasa Rao Mandadapu default:
208b81af585SSrinivasa Rao Mandadapu dev_err(soc_runtime->dev, "%s: invalid interface: %d\n", __func__, dai->id);
209b81af585SSrinivasa Rao Mandadapu break;
210b81af585SSrinivasa Rao Mandadapu }
211b81af585SSrinivasa Rao Mandadapu }
212b81af585SSrinivasa Rao Mandadapu
lpass_cdc_dma_daiops_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)213b81af585SSrinivasa Rao Mandadapu static int lpass_cdc_dma_daiops_hw_params(struct snd_pcm_substream *substream,
214b81af585SSrinivasa Rao Mandadapu struct snd_pcm_hw_params *params,
215b81af585SSrinivasa Rao Mandadapu struct snd_soc_dai *dai)
216b81af585SSrinivasa Rao Mandadapu {
217841361d8SKuninori Morimoto struct snd_soc_pcm_runtime *soc_runtime = snd_soc_substream_to_rtd(substream);
218b81af585SSrinivasa Rao Mandadapu struct lpaif_dmactl *dmactl = NULL;
219b81af585SSrinivasa Rao Mandadapu unsigned int ret, regval;
220b81af585SSrinivasa Rao Mandadapu unsigned int channels = params_channels(params);
221b81af585SSrinivasa Rao Mandadapu int id;
222b81af585SSrinivasa Rao Mandadapu
223b81af585SSrinivasa Rao Mandadapu switch (channels) {
224b81af585SSrinivasa Rao Mandadapu case 1:
225b81af585SSrinivasa Rao Mandadapu regval = LPASS_CDC_DMA_INTF_ONE_CHANNEL;
226b81af585SSrinivasa Rao Mandadapu break;
227b81af585SSrinivasa Rao Mandadapu case 2:
228b81af585SSrinivasa Rao Mandadapu regval = LPASS_CDC_DMA_INTF_TWO_CHANNEL;
229b81af585SSrinivasa Rao Mandadapu break;
230b81af585SSrinivasa Rao Mandadapu case 4:
231b81af585SSrinivasa Rao Mandadapu regval = LPASS_CDC_DMA_INTF_FOUR_CHANNEL;
232b81af585SSrinivasa Rao Mandadapu break;
233b81af585SSrinivasa Rao Mandadapu case 6:
234b81af585SSrinivasa Rao Mandadapu regval = LPASS_CDC_DMA_INTF_SIX_CHANNEL;
235b81af585SSrinivasa Rao Mandadapu break;
236b81af585SSrinivasa Rao Mandadapu case 8:
237b81af585SSrinivasa Rao Mandadapu regval = LPASS_CDC_DMA_INTF_EIGHT_CHANNEL;
238b81af585SSrinivasa Rao Mandadapu break;
239b81af585SSrinivasa Rao Mandadapu default:
240b81af585SSrinivasa Rao Mandadapu dev_err(soc_runtime->dev, "invalid PCM config\n");
241b81af585SSrinivasa Rao Mandadapu return -EINVAL;
242b81af585SSrinivasa Rao Mandadapu }
243b81af585SSrinivasa Rao Mandadapu
244b81af585SSrinivasa Rao Mandadapu __lpass_get_dmactl_handle(substream, dai, &dmactl, &id);
245b81af585SSrinivasa Rao Mandadapu if (!dmactl)
246b81af585SSrinivasa Rao Mandadapu return -EINVAL;
247b81af585SSrinivasa Rao Mandadapu
248b81af585SSrinivasa Rao Mandadapu ret = regmap_fields_write(dmactl->codec_channel, id, regval);
249b81af585SSrinivasa Rao Mandadapu if (ret) {
250b81af585SSrinivasa Rao Mandadapu dev_err(soc_runtime->dev,
251b81af585SSrinivasa Rao Mandadapu "error writing to dmactl codec_channel reg field: %d\n", ret);
252b81af585SSrinivasa Rao Mandadapu return ret;
253b81af585SSrinivasa Rao Mandadapu }
254b81af585SSrinivasa Rao Mandadapu return 0;
255b81af585SSrinivasa Rao Mandadapu }
256b81af585SSrinivasa Rao Mandadapu
lpass_cdc_dma_daiops_trigger(struct snd_pcm_substream * substream,int cmd,struct snd_soc_dai * dai)257b81af585SSrinivasa Rao Mandadapu static int lpass_cdc_dma_daiops_trigger(struct snd_pcm_substream *substream,
258b81af585SSrinivasa Rao Mandadapu int cmd, struct snd_soc_dai *dai)
259b81af585SSrinivasa Rao Mandadapu {
260841361d8SKuninori Morimoto struct snd_soc_pcm_runtime *soc_runtime = snd_soc_substream_to_rtd(substream);
261*99adc8b4SColin Ian King struct lpaif_dmactl *dmactl = NULL;
262b81af585SSrinivasa Rao Mandadapu int ret = 0, id;
263b81af585SSrinivasa Rao Mandadapu
264b81af585SSrinivasa Rao Mandadapu switch (cmd) {
265b81af585SSrinivasa Rao Mandadapu case SNDRV_PCM_TRIGGER_START:
266b81af585SSrinivasa Rao Mandadapu case SNDRV_PCM_TRIGGER_RESUME:
267b81af585SSrinivasa Rao Mandadapu case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
268b81af585SSrinivasa Rao Mandadapu __lpass_platform_codec_intf_init(dai, substream);
269b81af585SSrinivasa Rao Mandadapu break;
270b81af585SSrinivasa Rao Mandadapu case SNDRV_PCM_TRIGGER_STOP:
271b81af585SSrinivasa Rao Mandadapu case SNDRV_PCM_TRIGGER_SUSPEND:
272b81af585SSrinivasa Rao Mandadapu case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
273b81af585SSrinivasa Rao Mandadapu __lpass_get_dmactl_handle(substream, dai, &dmactl, &id);
274b81af585SSrinivasa Rao Mandadapu if (!dmactl)
275b81af585SSrinivasa Rao Mandadapu return -EINVAL;
276b81af585SSrinivasa Rao Mandadapu
277b81af585SSrinivasa Rao Mandadapu ret = regmap_fields_write(dmactl->codec_enable, id, LPAIF_DMACTL_ENABLE_OFF);
278b81af585SSrinivasa Rao Mandadapu if (ret) {
279b81af585SSrinivasa Rao Mandadapu dev_err(soc_runtime->dev,
280b81af585SSrinivasa Rao Mandadapu "error writing to dmactl codec_enable reg: %d\n", ret);
281b81af585SSrinivasa Rao Mandadapu return ret;
282b81af585SSrinivasa Rao Mandadapu }
283b81af585SSrinivasa Rao Mandadapu break;
284b81af585SSrinivasa Rao Mandadapu default:
285b81af585SSrinivasa Rao Mandadapu ret = -EINVAL;
286b81af585SSrinivasa Rao Mandadapu dev_err(soc_runtime->dev, "%s: invalid %d interface\n", __func__, cmd);
287b81af585SSrinivasa Rao Mandadapu break;
288b81af585SSrinivasa Rao Mandadapu }
289b81af585SSrinivasa Rao Mandadapu return ret;
290b81af585SSrinivasa Rao Mandadapu }
291b81af585SSrinivasa Rao Mandadapu
292b81af585SSrinivasa Rao Mandadapu const struct snd_soc_dai_ops asoc_qcom_lpass_cdc_dma_dai_ops = {
293b81af585SSrinivasa Rao Mandadapu .startup = lpass_cdc_dma_daiops_startup,
294b81af585SSrinivasa Rao Mandadapu .shutdown = lpass_cdc_dma_daiops_shutdown,
295b81af585SSrinivasa Rao Mandadapu .hw_params = lpass_cdc_dma_daiops_hw_params,
296b81af585SSrinivasa Rao Mandadapu .trigger = lpass_cdc_dma_daiops_trigger,
297b81af585SSrinivasa Rao Mandadapu };
298b81af585SSrinivasa Rao Mandadapu EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cdc_dma_dai_ops);
299b81af585SSrinivasa Rao Mandadapu
300b81af585SSrinivasa Rao Mandadapu MODULE_DESCRIPTION("QTi LPASS CDC DMA Driver");
301b81af585SSrinivasa Rao Mandadapu MODULE_LICENSE("GPL");
302