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