arm64: dts: qcom: sm8550: add TRNG node
[linux-modified.git] / sound / soc / qcom / lpass-cpu.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2010-2011,2013-2015 The Linux Foundation. All rights reserved.
4  *
5  * lpass-cpu.c -- ALSA SoC CPU DAI driver for QTi LPASS
6  */
7
8 #include <dt-bindings/sound/qcom,lpass.h>
9 #include <linux/clk.h>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/of.h>
13 #include <linux/platform_device.h>
14 #include <sound/pcm.h>
15 #include <sound/pcm_params.h>
16 #include <linux/regmap.h>
17 #include <sound/soc.h>
18 #include <sound/soc-dai.h>
19 #include "lpass-lpaif-reg.h"
20 #include "lpass.h"
21
22 #define LPASS_CPU_MAX_MI2S_LINES        4
23 #define LPASS_CPU_I2S_SD0_MASK          BIT(0)
24 #define LPASS_CPU_I2S_SD1_MASK          BIT(1)
25 #define LPASS_CPU_I2S_SD2_MASK          BIT(2)
26 #define LPASS_CPU_I2S_SD3_MASK          BIT(3)
27 #define LPASS_CPU_I2S_SD0_1_MASK        GENMASK(1, 0)
28 #define LPASS_CPU_I2S_SD2_3_MASK        GENMASK(3, 2)
29 #define LPASS_CPU_I2S_SD0_1_2_MASK      GENMASK(2, 0)
30 #define LPASS_CPU_I2S_SD0_1_2_3_MASK    GENMASK(3, 0)
31 #define LPASS_REG_READ 1
32 #define LPASS_REG_WRITE 0
33
34 /*
35  * Channel maps for Quad channel playbacks on MI2S Secondary
36  */
37 static struct snd_pcm_chmap_elem lpass_quad_chmaps[] = {
38                 { .channels = 4,
39                   .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_RL,
40                                 SNDRV_CHMAP_FR, SNDRV_CHMAP_RR } },
41                 { }
42 };
43 static int lpass_cpu_init_i2sctl_bitfields(struct device *dev,
44                         struct lpaif_i2sctl *i2sctl, struct regmap *map)
45 {
46         struct lpass_data *drvdata = dev_get_drvdata(dev);
47         const struct lpass_variant *v = drvdata->variant;
48
49         i2sctl->loopback = devm_regmap_field_alloc(dev, map, v->loopback);
50         i2sctl->spken = devm_regmap_field_alloc(dev, map, v->spken);
51         i2sctl->spkmode = devm_regmap_field_alloc(dev, map, v->spkmode);
52         i2sctl->spkmono = devm_regmap_field_alloc(dev, map, v->spkmono);
53         i2sctl->micen = devm_regmap_field_alloc(dev, map, v->micen);
54         i2sctl->micmode = devm_regmap_field_alloc(dev, map, v->micmode);
55         i2sctl->micmono = devm_regmap_field_alloc(dev, map, v->micmono);
56         i2sctl->wssrc = devm_regmap_field_alloc(dev, map, v->wssrc);
57         i2sctl->bitwidth = devm_regmap_field_alloc(dev, map, v->bitwidth);
58
59         if (IS_ERR(i2sctl->loopback) || IS_ERR(i2sctl->spken) ||
60             IS_ERR(i2sctl->spkmode) || IS_ERR(i2sctl->spkmono) ||
61             IS_ERR(i2sctl->micen) || IS_ERR(i2sctl->micmode) ||
62             IS_ERR(i2sctl->micmono) || IS_ERR(i2sctl->wssrc) ||
63             IS_ERR(i2sctl->bitwidth))
64                 return -EINVAL;
65
66         return 0;
67 }
68
69 static int lpass_cpu_daiops_set_sysclk(struct snd_soc_dai *dai, int clk_id,
70                 unsigned int freq, int dir)
71 {
72         struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
73         int ret;
74
75         ret = clk_set_rate(drvdata->mi2s_osr_clk[dai->driver->id], freq);
76         if (ret)
77                 dev_err(dai->dev, "error setting mi2s osrclk to %u: %d\n",
78                         freq, ret);
79
80         return ret;
81 }
82
83 static int lpass_cpu_daiops_startup(struct snd_pcm_substream *substream,
84                 struct snd_soc_dai *dai)
85 {
86         struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
87         int ret;
88
89         ret = clk_prepare_enable(drvdata->mi2s_osr_clk[dai->driver->id]);
90         if (ret) {
91                 dev_err(dai->dev, "error in enabling mi2s osr clk: %d\n", ret);
92                 return ret;
93         }
94         ret = clk_prepare(drvdata->mi2s_bit_clk[dai->driver->id]);
95         if (ret) {
96                 dev_err(dai->dev, "error in enabling mi2s bit clk: %d\n", ret);
97                 clk_disable_unprepare(drvdata->mi2s_osr_clk[dai->driver->id]);
98                 return ret;
99         }
100         return 0;
101 }
102
103 static void lpass_cpu_daiops_shutdown(struct snd_pcm_substream *substream,
104                 struct snd_soc_dai *dai)
105 {
106         struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
107         struct lpaif_i2sctl *i2sctl = drvdata->i2sctl;
108         unsigned int id = dai->driver->id;
109
110         clk_disable_unprepare(drvdata->mi2s_osr_clk[dai->driver->id]);
111         /*
112          * Ensure LRCLK is disabled even in device node validation.
113          * Will not impact if disabled in lpass_cpu_daiops_trigger()
114          * suspend.
115          */
116         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
117                 regmap_fields_write(i2sctl->spken, id, LPAIF_I2SCTL_SPKEN_DISABLE);
118         else
119                 regmap_fields_write(i2sctl->micen, id, LPAIF_I2SCTL_MICEN_DISABLE);
120
121         /*
122          * BCLK may not be enabled if lpass_cpu_daiops_prepare is called before
123          * lpass_cpu_daiops_shutdown. It's paired with the clk_enable in
124          * lpass_cpu_daiops_prepare.
125          */
126         if (drvdata->mi2s_was_prepared[dai->driver->id]) {
127                 drvdata->mi2s_was_prepared[dai->driver->id] = false;
128                 clk_disable(drvdata->mi2s_bit_clk[dai->driver->id]);
129         }
130
131         clk_unprepare(drvdata->mi2s_bit_clk[dai->driver->id]);
132 }
133
134 static int lpass_cpu_daiops_hw_params(struct snd_pcm_substream *substream,
135                 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
136 {
137         struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
138         struct lpaif_i2sctl *i2sctl = drvdata->i2sctl;
139         unsigned int id = dai->driver->id;
140         snd_pcm_format_t format = params_format(params);
141         unsigned int channels = params_channels(params);
142         unsigned int rate = params_rate(params);
143         unsigned int mode;
144         unsigned int regval;
145         int bitwidth, ret;
146
147         bitwidth = snd_pcm_format_width(format);
148         if (bitwidth < 0) {
149                 dev_err(dai->dev, "invalid bit width given: %d\n", bitwidth);
150                 return bitwidth;
151         }
152
153         ret = regmap_fields_write(i2sctl->loopback, id,
154                                  LPAIF_I2SCTL_LOOPBACK_DISABLE);
155         if (ret) {
156                 dev_err(dai->dev, "error updating loopback field: %d\n", ret);
157                 return ret;
158         }
159
160         ret = regmap_fields_write(i2sctl->wssrc, id,
161                                  LPAIF_I2SCTL_WSSRC_INTERNAL);
162         if (ret) {
163                 dev_err(dai->dev, "error updating wssrc field: %d\n", ret);
164                 return ret;
165         }
166
167         switch (bitwidth) {
168         case 16:
169                 regval = LPAIF_I2SCTL_BITWIDTH_16;
170                 break;
171         case 24:
172                 regval = LPAIF_I2SCTL_BITWIDTH_24;
173                 break;
174         case 32:
175                 regval = LPAIF_I2SCTL_BITWIDTH_32;
176                 break;
177         default:
178                 dev_err(dai->dev, "invalid bitwidth given: %d\n", bitwidth);
179                 return -EINVAL;
180         }
181
182         ret = regmap_fields_write(i2sctl->bitwidth, id, regval);
183         if (ret) {
184                 dev_err(dai->dev, "error updating bitwidth field: %d\n", ret);
185                 return ret;
186         }
187
188         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
189                 mode = drvdata->mi2s_playback_sd_mode[id];
190         else
191                 mode = drvdata->mi2s_capture_sd_mode[id];
192
193         if (!mode) {
194                 dev_err(dai->dev, "no line is assigned\n");
195                 return -EINVAL;
196         }
197
198         switch (channels) {
199         case 1:
200         case 2:
201                 switch (mode) {
202                 case LPAIF_I2SCTL_MODE_QUAD01:
203                 case LPAIF_I2SCTL_MODE_6CH:
204                 case LPAIF_I2SCTL_MODE_8CH:
205                         mode = LPAIF_I2SCTL_MODE_SD0;
206                         break;
207                 case LPAIF_I2SCTL_MODE_QUAD23:
208                         mode = LPAIF_I2SCTL_MODE_SD2;
209                         break;
210                 }
211
212                 break;
213         case 4:
214                 if (mode < LPAIF_I2SCTL_MODE_QUAD01) {
215                         dev_err(dai->dev, "cannot configure 4 channels with mode %d\n",
216                                 mode);
217                         return -EINVAL;
218                 }
219
220                 switch (mode) {
221                 case LPAIF_I2SCTL_MODE_6CH:
222                 case LPAIF_I2SCTL_MODE_8CH:
223                         mode = LPAIF_I2SCTL_MODE_QUAD01;
224                         break;
225                 }
226                 break;
227         case 6:
228                 if (mode < LPAIF_I2SCTL_MODE_6CH) {
229                         dev_err(dai->dev, "cannot configure 6 channels with mode %d\n",
230                                 mode);
231                         return -EINVAL;
232                 }
233
234                 switch (mode) {
235                 case LPAIF_I2SCTL_MODE_8CH:
236                         mode = LPAIF_I2SCTL_MODE_6CH;
237                         break;
238                 }
239                 break;
240         case 8:
241                 if (mode < LPAIF_I2SCTL_MODE_8CH) {
242                         dev_err(dai->dev, "cannot configure 8 channels with mode %d\n",
243                                 mode);
244                         return -EINVAL;
245                 }
246                 break;
247         default:
248                 dev_err(dai->dev, "invalid channels given: %u\n", channels);
249                 return -EINVAL;
250         }
251
252         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
253                 ret = regmap_fields_write(i2sctl->spkmode, id,
254                                          LPAIF_I2SCTL_SPKMODE(mode));
255                 if (ret) {
256                         dev_err(dai->dev, "error writing to i2sctl spkr mode: %d\n",
257                                 ret);
258                         return ret;
259                 }
260                 if (channels >= 2)
261                         ret = regmap_fields_write(i2sctl->spkmono, id,
262                                                  LPAIF_I2SCTL_SPKMONO_STEREO);
263                 else
264                         ret = regmap_fields_write(i2sctl->spkmono, id,
265                                                  LPAIF_I2SCTL_SPKMONO_MONO);
266         } else {
267                 ret = regmap_fields_write(i2sctl->micmode, id,
268                                          LPAIF_I2SCTL_MICMODE(mode));
269                 if (ret) {
270                         dev_err(dai->dev, "error writing to i2sctl mic mode: %d\n",
271                                 ret);
272                         return ret;
273                 }
274                 if (channels >= 2)
275                         ret = regmap_fields_write(i2sctl->micmono, id,
276                                                  LPAIF_I2SCTL_MICMONO_STEREO);
277                 else
278                         ret = regmap_fields_write(i2sctl->micmono, id,
279                                                  LPAIF_I2SCTL_MICMONO_MONO);
280         }
281
282         if (ret) {
283                 dev_err(dai->dev, "error writing to i2sctl channels mode: %d\n",
284                         ret);
285                 return ret;
286         }
287
288         ret = clk_set_rate(drvdata->mi2s_bit_clk[id],
289                            rate * bitwidth * 2);
290         if (ret) {
291                 dev_err(dai->dev, "error setting mi2s bitclk to %u: %d\n",
292                         rate * bitwidth * 2, ret);
293                 return ret;
294         }
295
296         return 0;
297 }
298
299 static int lpass_cpu_daiops_trigger(struct snd_pcm_substream *substream,
300                 int cmd, struct snd_soc_dai *dai)
301 {
302         struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
303         struct lpaif_i2sctl *i2sctl = drvdata->i2sctl;
304         unsigned int id = dai->driver->id;
305         int ret = -EINVAL;
306
307         switch (cmd) {
308         case SNDRV_PCM_TRIGGER_START:
309         case SNDRV_PCM_TRIGGER_RESUME:
310         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
311                 /*
312                  * Ensure lpass BCLK/LRCLK is enabled during
313                  * device resume as lpass_cpu_daiops_prepare() is not called
314                  * after the device resumes. We don't check mi2s_was_prepared before
315                  * enable/disable BCLK in trigger events because:
316                  *  1. These trigger events are paired, so the BCLK
317                  *     enable_count is balanced.
318                  *  2. the BCLK can be shared (ex: headset and headset mic),
319                  *     we need to increase the enable_count so that we don't
320                  *     turn off the shared BCLK while other devices are using
321                  *     it.
322                  */
323                 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
324                         ret = regmap_fields_write(i2sctl->spken, id,
325                                                  LPAIF_I2SCTL_SPKEN_ENABLE);
326                 } else  {
327                         ret = regmap_fields_write(i2sctl->micen, id,
328                                                  LPAIF_I2SCTL_MICEN_ENABLE);
329                 }
330                 if (ret)
331                         dev_err(dai->dev, "error writing to i2sctl reg: %d\n",
332                                 ret);
333
334                 ret = clk_enable(drvdata->mi2s_bit_clk[id]);
335                 if (ret) {
336                         dev_err(dai->dev, "error in enabling mi2s bit clk: %d\n", ret);
337                         clk_disable(drvdata->mi2s_osr_clk[id]);
338                         return ret;
339                 }
340                 break;
341         case SNDRV_PCM_TRIGGER_STOP:
342         case SNDRV_PCM_TRIGGER_SUSPEND:
343         case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
344                 /*
345                  * To ensure lpass BCLK/LRCLK is disabled during
346                  * device suspend.
347                  */
348                 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
349                         ret = regmap_fields_write(i2sctl->spken, id,
350                                                  LPAIF_I2SCTL_SPKEN_DISABLE);
351                 } else  {
352                         ret = regmap_fields_write(i2sctl->micen, id,
353                                                  LPAIF_I2SCTL_MICEN_DISABLE);
354                 }
355                 if (ret)
356                         dev_err(dai->dev, "error writing to i2sctl reg: %d\n",
357                                 ret);
358
359                 clk_disable(drvdata->mi2s_bit_clk[dai->driver->id]);
360
361                 break;
362         }
363
364         return ret;
365 }
366
367 static int lpass_cpu_daiops_prepare(struct snd_pcm_substream *substream,
368                 struct snd_soc_dai *dai)
369 {
370         struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
371         struct lpaif_i2sctl *i2sctl = drvdata->i2sctl;
372         unsigned int id = dai->driver->id;
373         int ret;
374
375         /*
376          * Ensure lpass BCLK/LRCLK is enabled bit before playback/capture
377          * data flow starts. This allows other codec to have some delay before
378          * the data flow.
379          * (ex: to drop start up pop noise before capture starts).
380          */
381         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
382                 ret = regmap_fields_write(i2sctl->spken, id, LPAIF_I2SCTL_SPKEN_ENABLE);
383         else
384                 ret = regmap_fields_write(i2sctl->micen, id, LPAIF_I2SCTL_MICEN_ENABLE);
385
386         if (ret) {
387                 dev_err(dai->dev, "error writing to i2sctl reg: %d\n", ret);
388                 return ret;
389         }
390
391         /*
392          * Check mi2s_was_prepared before enabling BCLK as lpass_cpu_daiops_prepare can
393          * be called multiple times. It's paired with the clk_disable in
394          * lpass_cpu_daiops_shutdown.
395          */
396         if (!drvdata->mi2s_was_prepared[dai->driver->id]) {
397                 ret = clk_enable(drvdata->mi2s_bit_clk[id]);
398                 if (ret) {
399                         dev_err(dai->dev, "error in enabling mi2s bit clk: %d\n", ret);
400                         return ret;
401                 }
402                 drvdata->mi2s_was_prepared[dai->driver->id] = true;
403         }
404         return 0;
405 }
406
407 static int lpass_cpu_daiops_pcm_new(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai)
408 {
409         int ret;
410         struct snd_soc_dai_driver *drv = dai->driver;
411         struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
412
413         if (drvdata->mi2s_playback_sd_mode[dai->id] == LPAIF_I2SCTL_MODE_QUAD01) {
414                 ret =  snd_pcm_add_chmap_ctls(rtd->pcm, SNDRV_PCM_STREAM_PLAYBACK,
415                                 lpass_quad_chmaps, drv->playback.channels_max, 0,
416                                 NULL);
417                 if (ret < 0)
418                         return ret;
419         }
420
421         return 0;
422 }
423
424 static int lpass_cpu_daiops_probe(struct snd_soc_dai *dai)
425 {
426         struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
427         int ret;
428
429         /* ensure audio hardware is disabled */
430         ret = regmap_write(drvdata->lpaif_map,
431                         LPAIF_I2SCTL_REG(drvdata->variant, dai->driver->id), 0);
432         if (ret)
433                 dev_err(dai->dev, "error writing to i2sctl reg: %d\n", ret);
434
435         return ret;
436 }
437
438 const struct snd_soc_dai_ops asoc_qcom_lpass_cpu_dai_ops = {
439         .probe          = lpass_cpu_daiops_probe,
440         .set_sysclk     = lpass_cpu_daiops_set_sysclk,
441         .startup        = lpass_cpu_daiops_startup,
442         .shutdown       = lpass_cpu_daiops_shutdown,
443         .hw_params      = lpass_cpu_daiops_hw_params,
444         .trigger        = lpass_cpu_daiops_trigger,
445         .prepare        = lpass_cpu_daiops_prepare,
446 };
447 EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cpu_dai_ops);
448
449 const struct snd_soc_dai_ops asoc_qcom_lpass_cpu_dai_ops2 = {
450         .pcm_new        = lpass_cpu_daiops_pcm_new,
451         .probe          = lpass_cpu_daiops_probe,
452         .set_sysclk     = lpass_cpu_daiops_set_sysclk,
453         .startup        = lpass_cpu_daiops_startup,
454         .shutdown       = lpass_cpu_daiops_shutdown,
455         .hw_params      = lpass_cpu_daiops_hw_params,
456         .trigger        = lpass_cpu_daiops_trigger,
457         .prepare        = lpass_cpu_daiops_prepare,
458 };
459 EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cpu_dai_ops2);
460
461 static int asoc_qcom_of_xlate_dai_name(struct snd_soc_component *component,
462                                    const struct of_phandle_args *args,
463                                    const char **dai_name)
464 {
465         struct lpass_data *drvdata = snd_soc_component_get_drvdata(component);
466         const struct lpass_variant *variant = drvdata->variant;
467         int id = args->args[0];
468         int ret = -EINVAL;
469         int i;
470
471         for (i = 0; i  < variant->num_dai; i++) {
472                 if (variant->dai_driver[i].id == id) {
473                         *dai_name = variant->dai_driver[i].name;
474                         ret = 0;
475                         break;
476                 }
477         }
478
479         return ret;
480 }
481
482 static const struct snd_soc_component_driver lpass_cpu_comp_driver = {
483         .name = "lpass-cpu",
484         .of_xlate_dai_name = asoc_qcom_of_xlate_dai_name,
485         .legacy_dai_naming = 1,
486 };
487
488 static bool lpass_cpu_regmap_writeable(struct device *dev, unsigned int reg)
489 {
490         struct lpass_data *drvdata = dev_get_drvdata(dev);
491         const struct lpass_variant *v = drvdata->variant;
492         int i;
493
494         for (i = 0; i < v->i2s_ports; ++i)
495                 if (reg == LPAIF_I2SCTL_REG(v, i))
496                         return true;
497
498         for (i = 0; i < v->irq_ports; ++i) {
499                 if (reg == LPAIF_IRQEN_REG(v, i))
500                         return true;
501                 if (reg == LPAIF_IRQCLEAR_REG(v, i))
502                         return true;
503         }
504
505         for (i = 0; i < v->rdma_channels; ++i) {
506                 if (reg == LPAIF_RDMACTL_REG(v, i))
507                         return true;
508                 if (reg == LPAIF_RDMABASE_REG(v, i))
509                         return true;
510                 if (reg == LPAIF_RDMABUFF_REG(v, i))
511                         return true;
512                 if (reg == LPAIF_RDMAPER_REG(v, i))
513                         return true;
514         }
515
516         for (i = 0; i < v->wrdma_channels; ++i) {
517                 if (reg == LPAIF_WRDMACTL_REG(v, i + v->wrdma_channel_start))
518                         return true;
519                 if (reg == LPAIF_WRDMABASE_REG(v, i + v->wrdma_channel_start))
520                         return true;
521                 if (reg == LPAIF_WRDMABUFF_REG(v, i + v->wrdma_channel_start))
522                         return true;
523                 if (reg == LPAIF_WRDMAPER_REG(v, i + v->wrdma_channel_start))
524                         return true;
525         }
526
527         return false;
528 }
529
530 static bool lpass_cpu_regmap_readable(struct device *dev, unsigned int reg)
531 {
532         struct lpass_data *drvdata = dev_get_drvdata(dev);
533         const struct lpass_variant *v = drvdata->variant;
534         int i;
535
536         for (i = 0; i < v->i2s_ports; ++i)
537                 if (reg == LPAIF_I2SCTL_REG(v, i))
538                         return true;
539
540         for (i = 0; i < v->irq_ports; ++i) {
541                 if (reg == LPAIF_IRQCLEAR_REG(v, i))
542                         return true;
543                 if (reg == LPAIF_IRQEN_REG(v, i))
544                         return true;
545                 if (reg == LPAIF_IRQSTAT_REG(v, i))
546                         return true;
547         }
548
549         for (i = 0; i < v->rdma_channels; ++i) {
550                 if (reg == LPAIF_RDMACTL_REG(v, i))
551                         return true;
552                 if (reg == LPAIF_RDMABASE_REG(v, i))
553                         return true;
554                 if (reg == LPAIF_RDMABUFF_REG(v, i))
555                         return true;
556                 if (reg == LPAIF_RDMACURR_REG(v, i))
557                         return true;
558                 if (reg == LPAIF_RDMAPER_REG(v, i))
559                         return true;
560         }
561
562         for (i = 0; i < v->wrdma_channels; ++i) {
563                 if (reg == LPAIF_WRDMACTL_REG(v, i + v->wrdma_channel_start))
564                         return true;
565                 if (reg == LPAIF_WRDMABASE_REG(v, i + v->wrdma_channel_start))
566                         return true;
567                 if (reg == LPAIF_WRDMABUFF_REG(v, i + v->wrdma_channel_start))
568                         return true;
569                 if (reg == LPAIF_WRDMACURR_REG(v, i + v->wrdma_channel_start))
570                         return true;
571                 if (reg == LPAIF_WRDMAPER_REG(v, i + v->wrdma_channel_start))
572                         return true;
573         }
574
575         return false;
576 }
577
578 static bool lpass_cpu_regmap_volatile(struct device *dev, unsigned int reg)
579 {
580         struct lpass_data *drvdata = dev_get_drvdata(dev);
581         const struct lpass_variant *v = drvdata->variant;
582         int i;
583
584         for (i = 0; i < v->irq_ports; ++i) {
585                 if (reg == LPAIF_IRQCLEAR_REG(v, i))
586                         return true;
587                 if (reg == LPAIF_IRQSTAT_REG(v, i))
588                         return true;
589         }
590
591         for (i = 0; i < v->rdma_channels; ++i)
592                 if (reg == LPAIF_RDMACURR_REG(v, i))
593                         return true;
594
595         for (i = 0; i < v->wrdma_channels; ++i)
596                 if (reg == LPAIF_WRDMACURR_REG(v, i + v->wrdma_channel_start))
597                         return true;
598
599         return false;
600 }
601
602 static struct regmap_config lpass_cpu_regmap_config = {
603         .name = "lpass_cpu",
604         .reg_bits = 32,
605         .reg_stride = 4,
606         .val_bits = 32,
607         .writeable_reg = lpass_cpu_regmap_writeable,
608         .readable_reg = lpass_cpu_regmap_readable,
609         .volatile_reg = lpass_cpu_regmap_volatile,
610         .cache_type = REGCACHE_FLAT,
611 };
612
613 static int lpass_hdmi_init_bitfields(struct device *dev, struct regmap *map)
614 {
615         struct lpass_data *drvdata = dev_get_drvdata(dev);
616         const struct lpass_variant *v = drvdata->variant;
617         unsigned int i;
618         struct lpass_hdmi_tx_ctl *tx_ctl;
619         struct regmap_field *legacy_en;
620         struct lpass_vbit_ctrl *vbit_ctl;
621         struct regmap_field *tx_parity;
622         struct lpass_dp_metadata_ctl *meta_ctl;
623         struct lpass_sstream_ctl *sstream_ctl;
624         struct regmap_field *ch_msb;
625         struct regmap_field *ch_lsb;
626         struct lpass_hdmitx_dmactl *tx_dmactl;
627         int rval;
628
629         tx_ctl = devm_kzalloc(dev, sizeof(*tx_ctl), GFP_KERNEL);
630         if (!tx_ctl)
631                 return -ENOMEM;
632
633         QCOM_REGMAP_FIELD_ALLOC(dev, map, v->soft_reset, tx_ctl->soft_reset);
634         QCOM_REGMAP_FIELD_ALLOC(dev, map, v->force_reset, tx_ctl->force_reset);
635         drvdata->tx_ctl = tx_ctl;
636
637         QCOM_REGMAP_FIELD_ALLOC(dev, map, v->legacy_en, legacy_en);
638         drvdata->hdmitx_legacy_en = legacy_en;
639
640         vbit_ctl = devm_kzalloc(dev, sizeof(*vbit_ctl), GFP_KERNEL);
641         if (!vbit_ctl)
642                 return -ENOMEM;
643
644         QCOM_REGMAP_FIELD_ALLOC(dev, map, v->replace_vbit, vbit_ctl->replace_vbit);
645         QCOM_REGMAP_FIELD_ALLOC(dev, map, v->vbit_stream, vbit_ctl->vbit_stream);
646         drvdata->vbit_ctl = vbit_ctl;
647
648
649         QCOM_REGMAP_FIELD_ALLOC(dev, map, v->calc_en, tx_parity);
650         drvdata->hdmitx_parity_calc_en = tx_parity;
651
652         meta_ctl = devm_kzalloc(dev, sizeof(*meta_ctl), GFP_KERNEL);
653         if (!meta_ctl)
654                 return -ENOMEM;
655
656         rval = devm_regmap_field_bulk_alloc(dev, map, &meta_ctl->mute, &v->mute, 7);
657         if (rval)
658                 return rval;
659         drvdata->meta_ctl = meta_ctl;
660
661         sstream_ctl = devm_kzalloc(dev, sizeof(*sstream_ctl), GFP_KERNEL);
662         if (!sstream_ctl)
663                 return -ENOMEM;
664
665         rval = devm_regmap_field_bulk_alloc(dev, map, &sstream_ctl->sstream_en, &v->sstream_en, 9);
666         if (rval)
667                 return rval;
668
669         drvdata->sstream_ctl = sstream_ctl;
670
671         for (i = 0; i < LPASS_MAX_HDMI_DMA_CHANNELS; i++) {
672                 QCOM_REGMAP_FIELD_ALLOC(dev, map, v->msb_bits, ch_msb);
673                 drvdata->hdmitx_ch_msb[i] = ch_msb;
674
675                 QCOM_REGMAP_FIELD_ALLOC(dev, map, v->lsb_bits, ch_lsb);
676                 drvdata->hdmitx_ch_lsb[i] = ch_lsb;
677
678                 tx_dmactl = devm_kzalloc(dev, sizeof(*tx_dmactl), GFP_KERNEL);
679                 if (!tx_dmactl)
680                         return -ENOMEM;
681
682                 QCOM_REGMAP_FIELD_ALLOC(dev, map, v->use_hw_chs, tx_dmactl->use_hw_chs);
683                 QCOM_REGMAP_FIELD_ALLOC(dev, map, v->use_hw_usr, tx_dmactl->use_hw_usr);
684                 QCOM_REGMAP_FIELD_ALLOC(dev, map, v->hw_chs_sel, tx_dmactl->hw_chs_sel);
685                 QCOM_REGMAP_FIELD_ALLOC(dev, map, v->hw_usr_sel, tx_dmactl->hw_usr_sel);
686                 drvdata->hdmi_tx_dmactl[i] = tx_dmactl;
687         }
688         return 0;
689 }
690
691 static bool lpass_hdmi_regmap_writeable(struct device *dev, unsigned int reg)
692 {
693         struct lpass_data *drvdata = dev_get_drvdata(dev);
694         const struct lpass_variant *v = drvdata->variant;
695         int i;
696
697         if (reg == LPASS_HDMI_TX_CTL_ADDR(v))
698                 return true;
699         if (reg == LPASS_HDMI_TX_LEGACY_ADDR(v))
700                 return true;
701         if (reg == LPASS_HDMI_TX_VBIT_CTL_ADDR(v))
702                 return true;
703         if (reg == LPASS_HDMI_TX_PARITY_ADDR(v))
704                 return true;
705         if (reg == LPASS_HDMI_TX_DP_ADDR(v))
706                 return true;
707         if (reg == LPASS_HDMI_TX_SSTREAM_ADDR(v))
708                 return true;
709         if (reg == LPASS_HDMITX_APP_IRQEN_REG(v))
710                 return true;
711         if (reg == LPASS_HDMITX_APP_IRQCLEAR_REG(v))
712                 return true;
713
714         for (i = 0; i < v->hdmi_rdma_channels; i++) {
715                 if (reg == LPASS_HDMI_TX_CH_LSB_ADDR(v, i))
716                         return true;
717                 if (reg == LPASS_HDMI_TX_CH_MSB_ADDR(v, i))
718                         return true;
719                 if (reg == LPASS_HDMI_TX_DMA_ADDR(v, i))
720                         return true;
721         }
722
723         for (i = 0; i < v->hdmi_rdma_channels; ++i) {
724                 if (reg == LPAIF_HDMI_RDMACTL_REG(v, i))
725                         return true;
726                 if (reg == LPAIF_HDMI_RDMABASE_REG(v, i))
727                         return true;
728                 if (reg == LPAIF_HDMI_RDMABUFF_REG(v, i))
729                         return true;
730                 if (reg == LPAIF_HDMI_RDMAPER_REG(v, i))
731                         return true;
732         }
733         return false;
734 }
735
736 static bool lpass_hdmi_regmap_readable(struct device *dev, unsigned int reg)
737 {
738         struct lpass_data *drvdata = dev_get_drvdata(dev);
739         const struct lpass_variant *v = drvdata->variant;
740         int i;
741
742         if (reg == LPASS_HDMI_TX_CTL_ADDR(v))
743                 return true;
744         if (reg == LPASS_HDMI_TX_LEGACY_ADDR(v))
745                 return true;
746         if (reg == LPASS_HDMI_TX_VBIT_CTL_ADDR(v))
747                 return true;
748
749         for (i = 0; i < v->hdmi_rdma_channels; i++) {
750                 if (reg == LPASS_HDMI_TX_CH_LSB_ADDR(v, i))
751                         return true;
752                 if (reg == LPASS_HDMI_TX_CH_MSB_ADDR(v, i))
753                         return true;
754                 if (reg == LPASS_HDMI_TX_DMA_ADDR(v, i))
755                         return true;
756         }
757
758         if (reg == LPASS_HDMI_TX_PARITY_ADDR(v))
759                 return true;
760         if (reg == LPASS_HDMI_TX_DP_ADDR(v))
761                 return true;
762         if (reg == LPASS_HDMI_TX_SSTREAM_ADDR(v))
763                 return true;
764         if (reg == LPASS_HDMITX_APP_IRQEN_REG(v))
765                 return true;
766         if (reg == LPASS_HDMITX_APP_IRQSTAT_REG(v))
767                 return true;
768
769         for (i = 0; i < v->hdmi_rdma_channels; ++i) {
770                 if (reg == LPAIF_HDMI_RDMACTL_REG(v, i))
771                         return true;
772                 if (reg == LPAIF_HDMI_RDMABASE_REG(v, i))
773                         return true;
774                 if (reg == LPAIF_HDMI_RDMABUFF_REG(v, i))
775                         return true;
776                 if (reg == LPAIF_HDMI_RDMAPER_REG(v, i))
777                         return true;
778                 if (reg == LPAIF_HDMI_RDMACURR_REG(v, i))
779                         return true;
780         }
781
782         return false;
783 }
784
785 static bool lpass_hdmi_regmap_volatile(struct device *dev, unsigned int reg)
786 {
787         struct lpass_data *drvdata = dev_get_drvdata(dev);
788         const struct lpass_variant *v = drvdata->variant;
789         int i;
790
791         if (reg == LPASS_HDMITX_APP_IRQSTAT_REG(v))
792                 return true;
793         if (reg == LPASS_HDMI_TX_LEGACY_ADDR(v))
794                 return true;
795         if (reg == LPASS_HDMI_TX_VBIT_CTL_ADDR(v))
796                 return true;
797         if (reg == LPASS_HDMI_TX_PARITY_ADDR(v))
798                 return true;
799
800         for (i = 0; i < v->hdmi_rdma_channels; ++i) {
801                 if (reg == LPAIF_HDMI_RDMACURR_REG(v, i))
802                         return true;
803                 if (reg == LPASS_HDMI_TX_DMA_ADDR(v, i))
804                         return true;
805                 if (reg == LPASS_HDMI_TX_CH_LSB_ADDR(v, i))
806                         return true;
807                 if (reg == LPASS_HDMI_TX_CH_MSB_ADDR(v, i))
808                         return true;
809         }
810         return false;
811 }
812
813 static struct regmap_config lpass_hdmi_regmap_config = {
814         .name = "lpass_hdmi",
815         .reg_bits = 32,
816         .reg_stride = 4,
817         .val_bits = 32,
818         .writeable_reg = lpass_hdmi_regmap_writeable,
819         .readable_reg = lpass_hdmi_regmap_readable,
820         .volatile_reg = lpass_hdmi_regmap_volatile,
821         .cache_type = REGCACHE_FLAT,
822 };
823
824 static bool __lpass_rxtx_regmap_accessible(struct device *dev, unsigned int reg, bool rw)
825 {
826         struct lpass_data *drvdata = dev_get_drvdata(dev);
827         const struct lpass_variant *v = drvdata->variant;
828         int i;
829
830         for (i = 0; i < v->rxtx_irq_ports; ++i) {
831                 if (reg == LPAIF_RXTX_IRQCLEAR_REG(v, i))
832                         return true;
833                 if (reg == LPAIF_RXTX_IRQEN_REG(v, i))
834                         return true;
835                 if (reg == LPAIF_RXTX_IRQSTAT_REG(v, i))
836                         return true;
837         }
838
839         for (i = 0; i < v->rxtx_rdma_channels; ++i) {
840                 if (reg == LPAIF_CDC_RXTX_RDMACTL_REG(v, i, LPASS_CDC_DMA_RX0))
841                         return true;
842                 if (reg == LPAIF_CDC_RXTX_RDMABASE_REG(v, i, LPASS_CDC_DMA_RX0))
843                         return true;
844                 if (reg == LPAIF_CDC_RXTX_RDMABUFF_REG(v, i, LPASS_CDC_DMA_RX0))
845                         return true;
846                 if (rw == LPASS_REG_READ) {
847                         if (reg == LPAIF_CDC_RXTX_RDMACURR_REG(v, i, LPASS_CDC_DMA_RX0))
848                                 return true;
849                 }
850                 if (reg == LPAIF_CDC_RXTX_RDMAPER_REG(v, i, LPASS_CDC_DMA_RX0))
851                         return true;
852                 if (reg == LPAIF_CDC_RXTX_RDMA_INTF_REG(v, i, LPASS_CDC_DMA_RX0))
853                         return true;
854         }
855
856         for (i = 0; i < v->rxtx_wrdma_channels; ++i) {
857                 if (reg == LPAIF_CDC_RXTX_WRDMACTL_REG(v, i + v->rxtx_wrdma_channel_start,
858                                                         LPASS_CDC_DMA_TX3))
859                         return true;
860                 if (reg == LPAIF_CDC_RXTX_WRDMABASE_REG(v, i + v->rxtx_wrdma_channel_start,
861                                                         LPASS_CDC_DMA_TX3))
862                         return true;
863                 if (reg == LPAIF_CDC_RXTX_WRDMABUFF_REG(v, i + v->rxtx_wrdma_channel_start,
864                                                         LPASS_CDC_DMA_TX3))
865                         return true;
866                 if (rw == LPASS_REG_READ) {
867                         if (reg == LPAIF_CDC_RXTX_WRDMACURR_REG(v, i, LPASS_CDC_DMA_RX0))
868                                 return true;
869                 }
870                 if (reg == LPAIF_CDC_RXTX_WRDMAPER_REG(v, i + v->rxtx_wrdma_channel_start,
871                                                         LPASS_CDC_DMA_TX3))
872                         return true;
873                 if (reg == LPAIF_CDC_RXTX_WRDMA_INTF_REG(v, i + v->rxtx_wrdma_channel_start,
874                                                         LPASS_CDC_DMA_TX3))
875                         return true;
876         }
877         return false;
878 }
879
880 static bool lpass_rxtx_regmap_writeable(struct device *dev, unsigned int reg)
881 {
882         return __lpass_rxtx_regmap_accessible(dev, reg, LPASS_REG_WRITE);
883 }
884
885 static bool lpass_rxtx_regmap_readable(struct device *dev, unsigned int reg)
886 {
887         return __lpass_rxtx_regmap_accessible(dev, reg, LPASS_REG_READ);
888 }
889
890 static bool lpass_rxtx_regmap_volatile(struct device *dev, unsigned int reg)
891 {
892         struct lpass_data *drvdata = dev_get_drvdata(dev);
893         const struct lpass_variant *v = drvdata->variant;
894         int i;
895
896         for (i = 0; i < v->rxtx_irq_ports; ++i) {
897                 if (reg == LPAIF_RXTX_IRQCLEAR_REG(v, i))
898                         return true;
899                 if (reg == LPAIF_RXTX_IRQSTAT_REG(v, i))
900                         return true;
901         }
902
903         for (i = 0; i < v->rxtx_rdma_channels; ++i)
904                 if (reg == LPAIF_CDC_RXTX_RDMACURR_REG(v, i, LPASS_CDC_DMA_RX0))
905                         return true;
906
907         for (i = 0; i < v->rxtx_wrdma_channels; ++i)
908                 if (reg == LPAIF_CDC_RXTX_WRDMACURR_REG(v, i + v->rxtx_wrdma_channel_start,
909                                                         LPASS_CDC_DMA_TX3))
910                         return true;
911
912         return false;
913 }
914
915 static bool __lpass_va_regmap_accessible(struct device *dev, unsigned int reg, bool rw)
916 {
917         struct lpass_data *drvdata = dev_get_drvdata(dev);
918         const struct lpass_variant *v = drvdata->variant;
919         int i;
920
921         for (i = 0; i < v->va_irq_ports; ++i) {
922                 if (reg == LPAIF_VA_IRQCLEAR_REG(v, i))
923                         return true;
924                 if (reg == LPAIF_VA_IRQEN_REG(v, i))
925                         return true;
926                 if (reg == LPAIF_VA_IRQSTAT_REG(v, i))
927                         return true;
928         }
929
930         for (i = 0; i < v->va_wrdma_channels; ++i) {
931                 if (reg == LPAIF_CDC_VA_WRDMACTL_REG(v, i + v->va_wrdma_channel_start,
932                                                         LPASS_CDC_DMA_VA_TX0))
933                         return true;
934                 if (reg == LPAIF_CDC_VA_WRDMABASE_REG(v, i + v->va_wrdma_channel_start,
935                                                         LPASS_CDC_DMA_VA_TX0))
936                         return true;
937                 if (reg == LPAIF_CDC_VA_WRDMABUFF_REG(v, i + v->va_wrdma_channel_start,
938                                                         LPASS_CDC_DMA_VA_TX0))
939                         return true;
940                 if (rw == LPASS_REG_READ) {
941                         if (reg == LPAIF_CDC_VA_WRDMACURR_REG(v, i + v->va_wrdma_channel_start,
942                                                         LPASS_CDC_DMA_VA_TX0))
943                                 return true;
944                 }
945                 if (reg == LPAIF_CDC_VA_WRDMAPER_REG(v, i + v->va_wrdma_channel_start,
946                                                         LPASS_CDC_DMA_VA_TX0))
947                         return true;
948                 if (reg == LPAIF_CDC_VA_WRDMA_INTF_REG(v, i + v->va_wrdma_channel_start,
949                                                         LPASS_CDC_DMA_VA_TX0))
950                         return true;
951         }
952         return false;
953 }
954
955 static bool lpass_va_regmap_writeable(struct device *dev, unsigned int reg)
956 {
957         return __lpass_va_regmap_accessible(dev, reg, LPASS_REG_WRITE);
958 }
959
960 static bool lpass_va_regmap_readable(struct device *dev, unsigned int reg)
961 {
962         return __lpass_va_regmap_accessible(dev, reg, LPASS_REG_READ);
963 }
964
965 static bool lpass_va_regmap_volatile(struct device *dev, unsigned int reg)
966 {
967         struct lpass_data *drvdata = dev_get_drvdata(dev);
968         const struct lpass_variant *v = drvdata->variant;
969         int i;
970
971         for (i = 0; i < v->va_irq_ports; ++i) {
972                 if (reg == LPAIF_VA_IRQCLEAR_REG(v, i))
973                         return true;
974                 if (reg == LPAIF_VA_IRQSTAT_REG(v, i))
975                         return true;
976         }
977
978         for (i = 0; i < v->va_wrdma_channels; ++i) {
979                 if (reg == LPAIF_CDC_VA_WRDMACURR_REG(v, i + v->va_wrdma_channel_start,
980                                                         LPASS_CDC_DMA_VA_TX0))
981                         return true;
982         }
983
984         return false;
985 }
986
987 static struct regmap_config lpass_rxtx_regmap_config = {
988         .reg_bits = 32,
989         .reg_stride = 4,
990         .val_bits = 32,
991         .writeable_reg = lpass_rxtx_regmap_writeable,
992         .readable_reg = lpass_rxtx_regmap_readable,
993         .volatile_reg = lpass_rxtx_regmap_volatile,
994         .cache_type = REGCACHE_FLAT,
995 };
996
997 static struct regmap_config lpass_va_regmap_config = {
998         .reg_bits = 32,
999         .reg_stride = 4,
1000         .val_bits = 32,
1001         .writeable_reg = lpass_va_regmap_writeable,
1002         .readable_reg = lpass_va_regmap_readable,
1003         .volatile_reg = lpass_va_regmap_volatile,
1004         .cache_type = REGCACHE_FLAT,
1005 };
1006
1007 static unsigned int of_lpass_cpu_parse_sd_lines(struct device *dev,
1008                                                 struct device_node *node,
1009                                                 const char *name)
1010 {
1011         unsigned int lines[LPASS_CPU_MAX_MI2S_LINES];
1012         unsigned int sd_line_mask = 0;
1013         int num_lines, i;
1014
1015         num_lines = of_property_read_variable_u32_array(node, name, lines, 0,
1016                                                         LPASS_CPU_MAX_MI2S_LINES);
1017         if (num_lines < 0)
1018                 return LPAIF_I2SCTL_MODE_NONE;
1019
1020         for (i = 0; i < num_lines; i++)
1021                 sd_line_mask |= BIT(lines[i]);
1022
1023         switch (sd_line_mask) {
1024         case LPASS_CPU_I2S_SD0_MASK:
1025                 return LPAIF_I2SCTL_MODE_SD0;
1026         case LPASS_CPU_I2S_SD1_MASK:
1027                 return LPAIF_I2SCTL_MODE_SD1;
1028         case LPASS_CPU_I2S_SD2_MASK:
1029                 return LPAIF_I2SCTL_MODE_SD2;
1030         case LPASS_CPU_I2S_SD3_MASK:
1031                 return LPAIF_I2SCTL_MODE_SD3;
1032         case LPASS_CPU_I2S_SD0_1_MASK:
1033                 return LPAIF_I2SCTL_MODE_QUAD01;
1034         case LPASS_CPU_I2S_SD2_3_MASK:
1035                 return LPAIF_I2SCTL_MODE_QUAD23;
1036         case LPASS_CPU_I2S_SD0_1_2_MASK:
1037                 return LPAIF_I2SCTL_MODE_6CH;
1038         case LPASS_CPU_I2S_SD0_1_2_3_MASK:
1039                 return LPAIF_I2SCTL_MODE_8CH;
1040         default:
1041                 dev_err(dev, "Unsupported SD line mask: %#x\n", sd_line_mask);
1042                 return LPAIF_I2SCTL_MODE_NONE;
1043         }
1044 }
1045
1046 static void of_lpass_cpu_parse_dai_data(struct device *dev,
1047                                         struct lpass_data *data)
1048 {
1049         struct device_node *node;
1050         int ret, i, id;
1051
1052         /* Allow all channels by default for backwards compatibility */
1053         for (i = 0; i < data->variant->num_dai; i++) {
1054                 id = data->variant->dai_driver[i].id;
1055                 data->mi2s_playback_sd_mode[id] = LPAIF_I2SCTL_MODE_8CH;
1056                 data->mi2s_capture_sd_mode[id] = LPAIF_I2SCTL_MODE_8CH;
1057         }
1058
1059         for_each_child_of_node(dev->of_node, node) {
1060                 ret = of_property_read_u32(node, "reg", &id);
1061                 if (ret || id < 0) {
1062                         dev_err(dev, "valid dai id not found: %d\n", ret);
1063                         continue;
1064                 }
1065                 if (id == LPASS_DP_RX) {
1066                         data->hdmi_port_enable = 1;
1067                 } else if (is_cdc_dma_port(id)) {
1068                         data->codec_dma_enable = 1;
1069                 } else {
1070                         data->mi2s_playback_sd_mode[id] =
1071                                 of_lpass_cpu_parse_sd_lines(dev, node,
1072                                                             "qcom,playback-sd-lines");
1073                         data->mi2s_capture_sd_mode[id] =
1074                                 of_lpass_cpu_parse_sd_lines(dev, node,
1075                                                     "qcom,capture-sd-lines");
1076                 }
1077         }
1078 }
1079
1080 static int of_lpass_cdc_dma_clks_parse(struct device *dev,
1081                                         struct lpass_data *data)
1082 {
1083         data->codec_mem0 = devm_clk_get(dev, "audio_cc_codec_mem0");
1084         if (IS_ERR(data->codec_mem0))
1085                 return PTR_ERR(data->codec_mem0);
1086
1087         data->codec_mem1 = devm_clk_get(dev, "audio_cc_codec_mem1");
1088         if (IS_ERR(data->codec_mem1))
1089                 return PTR_ERR(data->codec_mem1);
1090
1091         data->codec_mem2 = devm_clk_get(dev, "audio_cc_codec_mem2");
1092         if (IS_ERR(data->codec_mem2))
1093                 return PTR_ERR(data->codec_mem2);
1094
1095         data->va_mem0 = devm_clk_get(dev, "aon_cc_va_mem0");
1096         if (IS_ERR(data->va_mem0))
1097                 return PTR_ERR(data->va_mem0);
1098
1099         return 0;
1100 }
1101
1102 int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev)
1103 {
1104         struct lpass_data *drvdata;
1105         struct device_node *dsp_of_node;
1106         struct resource *res;
1107         const struct lpass_variant *variant;
1108         struct device *dev = &pdev->dev;
1109         int ret, i, dai_id;
1110
1111         dsp_of_node = of_parse_phandle(pdev->dev.of_node, "qcom,adsp", 0);
1112         if (dsp_of_node) {
1113                 dev_err(dev, "DSP exists and holds audio resources\n");
1114                 of_node_put(dsp_of_node);
1115                 return -EBUSY;
1116         }
1117
1118         drvdata = devm_kzalloc(dev, sizeof(struct lpass_data), GFP_KERNEL);
1119         if (!drvdata)
1120                 return -ENOMEM;
1121         platform_set_drvdata(pdev, drvdata);
1122
1123         variant = device_get_match_data(dev);
1124         if (!variant)
1125                 return -EINVAL;
1126
1127         if (of_device_is_compatible(dev->of_node, "qcom,lpass-cpu-apq8016"))
1128                 dev_warn(dev, "qcom,lpass-cpu-apq8016 compatible is deprecated\n");
1129
1130         drvdata->variant = variant;
1131
1132         of_lpass_cpu_parse_dai_data(dev, drvdata);
1133
1134         if (drvdata->codec_dma_enable) {
1135                 drvdata->rxtx_lpaif =
1136                                 devm_platform_ioremap_resource_byname(pdev, "lpass-rxtx-lpaif");
1137                 if (IS_ERR(drvdata->rxtx_lpaif))
1138                         return PTR_ERR(drvdata->rxtx_lpaif);
1139
1140                 drvdata->va_lpaif = devm_platform_ioremap_resource_byname(pdev, "lpass-va-lpaif");
1141                 if (IS_ERR(drvdata->va_lpaif))
1142                         return PTR_ERR(drvdata->va_lpaif);
1143
1144                 lpass_rxtx_regmap_config.max_register = LPAIF_CDC_RXTX_WRDMAPER_REG(variant,
1145                                         variant->rxtx_wrdma_channels +
1146                                         variant->rxtx_wrdma_channel_start, LPASS_CDC_DMA_TX3);
1147
1148                 drvdata->rxtx_lpaif_map = devm_regmap_init_mmio(dev, drvdata->rxtx_lpaif,
1149                                         &lpass_rxtx_regmap_config);
1150                 if (IS_ERR(drvdata->rxtx_lpaif_map))
1151                         return PTR_ERR(drvdata->rxtx_lpaif_map);
1152
1153                 lpass_va_regmap_config.max_register = LPAIF_CDC_VA_WRDMAPER_REG(variant,
1154                                         variant->va_wrdma_channels +
1155                                         variant->va_wrdma_channel_start, LPASS_CDC_DMA_VA_TX0);
1156
1157                 drvdata->va_lpaif_map = devm_regmap_init_mmio(dev, drvdata->va_lpaif,
1158                                         &lpass_va_regmap_config);
1159                 if (IS_ERR(drvdata->va_lpaif_map))
1160                         return PTR_ERR(drvdata->va_lpaif_map);
1161
1162                 ret = of_lpass_cdc_dma_clks_parse(dev, drvdata);
1163                 if (ret) {
1164                         dev_err(dev, "failed to get cdc dma clocks %d\n", ret);
1165                         return ret;
1166                 }
1167
1168                 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lpass-rxtx-cdc-dma-lpm");
1169                 drvdata->rxtx_cdc_dma_lpm_buf = res->start;
1170
1171                 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lpass-va-cdc-dma-lpm");
1172                 drvdata->va_cdc_dma_lpm_buf = res->start;
1173         }
1174
1175         drvdata->lpaif = devm_platform_ioremap_resource_byname(pdev, "lpass-lpaif");
1176         if (IS_ERR(drvdata->lpaif))
1177                 return PTR_ERR(drvdata->lpaif);
1178
1179         lpass_cpu_regmap_config.max_register = LPAIF_WRDMAPER_REG(variant,
1180                                                 variant->wrdma_channels +
1181                                                 variant->wrdma_channel_start);
1182
1183         drvdata->lpaif_map = devm_regmap_init_mmio(dev, drvdata->lpaif,
1184                         &lpass_cpu_regmap_config);
1185         if (IS_ERR(drvdata->lpaif_map)) {
1186                 dev_err(dev, "error initializing regmap: %ld\n",
1187                         PTR_ERR(drvdata->lpaif_map));
1188                 return PTR_ERR(drvdata->lpaif_map);
1189         }
1190
1191         if (drvdata->hdmi_port_enable) {
1192                 drvdata->hdmiif = devm_platform_ioremap_resource_byname(pdev, "lpass-hdmiif");
1193                 if (IS_ERR(drvdata->hdmiif))
1194                         return PTR_ERR(drvdata->hdmiif);
1195
1196                 lpass_hdmi_regmap_config.max_register = LPAIF_HDMI_RDMAPER_REG(variant,
1197                                         variant->hdmi_rdma_channels - 1);
1198                 drvdata->hdmiif_map = devm_regmap_init_mmio(dev, drvdata->hdmiif,
1199                                         &lpass_hdmi_regmap_config);
1200                 if (IS_ERR(drvdata->hdmiif_map)) {
1201                         dev_err(dev, "error initializing regmap: %ld\n",
1202                         PTR_ERR(drvdata->hdmiif_map));
1203                         return PTR_ERR(drvdata->hdmiif_map);
1204                 }
1205         }
1206
1207         if (variant->init) {
1208                 ret = variant->init(pdev);
1209                 if (ret) {
1210                         dev_err(dev, "error initializing variant: %d\n", ret);
1211                         return ret;
1212                 }
1213         }
1214
1215         for (i = 0; i < variant->num_dai; i++) {
1216                 dai_id = variant->dai_driver[i].id;
1217                 if (dai_id == LPASS_DP_RX || is_cdc_dma_port(dai_id))
1218                         continue;
1219
1220                 drvdata->mi2s_osr_clk[dai_id] = devm_clk_get_optional(dev,
1221                                              variant->dai_osr_clk_names[i]);
1222                 drvdata->mi2s_bit_clk[dai_id] = devm_clk_get(dev,
1223                                                 variant->dai_bit_clk_names[i]);
1224                 if (IS_ERR(drvdata->mi2s_bit_clk[dai_id])) {
1225                         dev_err(dev,
1226                                 "error getting %s: %ld\n",
1227                                 variant->dai_bit_clk_names[i],
1228                                 PTR_ERR(drvdata->mi2s_bit_clk[dai_id]));
1229                         return PTR_ERR(drvdata->mi2s_bit_clk[dai_id]);
1230                 }
1231                 if (drvdata->mi2s_playback_sd_mode[dai_id] ==
1232                         LPAIF_I2SCTL_MODE_QUAD01) {
1233                         variant->dai_driver[dai_id].playback.channels_min = 4;
1234                         variant->dai_driver[dai_id].playback.channels_max = 4;
1235                 }
1236         }
1237
1238         /* Allocation for i2sctl regmap fields */
1239         drvdata->i2sctl = devm_kzalloc(&pdev->dev, sizeof(struct lpaif_i2sctl),
1240                                         GFP_KERNEL);
1241
1242         /* Initialize bitfields for dai I2SCTL register */
1243         ret = lpass_cpu_init_i2sctl_bitfields(dev, drvdata->i2sctl,
1244                                                 drvdata->lpaif_map);
1245         if (ret) {
1246                 dev_err(dev, "error init i2sctl field: %d\n", ret);
1247                 return ret;
1248         }
1249
1250         if (drvdata->hdmi_port_enable) {
1251                 ret = lpass_hdmi_init_bitfields(dev, drvdata->hdmiif_map);
1252                 if (ret) {
1253                         dev_err(dev, "%s error  hdmi init failed\n", __func__);
1254                         return ret;
1255                 }
1256         }
1257         ret = devm_snd_soc_register_component(dev,
1258                                               &lpass_cpu_comp_driver,
1259                                               variant->dai_driver,
1260                                               variant->num_dai);
1261         if (ret) {
1262                 dev_err(dev, "error registering cpu driver: %d\n", ret);
1263                 goto err;
1264         }
1265
1266         ret = asoc_qcom_lpass_platform_register(pdev);
1267         if (ret) {
1268                 dev_err(dev, "error registering platform driver: %d\n", ret);
1269                 goto err;
1270         }
1271
1272 err:
1273         return ret;
1274 }
1275 EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cpu_platform_probe);
1276
1277 void asoc_qcom_lpass_cpu_platform_remove(struct platform_device *pdev)
1278 {
1279         struct lpass_data *drvdata = platform_get_drvdata(pdev);
1280
1281         if (drvdata->variant->exit)
1282                 drvdata->variant->exit(pdev);
1283 }
1284 EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cpu_platform_remove);
1285
1286 void asoc_qcom_lpass_cpu_platform_shutdown(struct platform_device *pdev)
1287 {
1288         struct lpass_data *drvdata = platform_get_drvdata(pdev);
1289
1290         if (drvdata->variant->exit)
1291                 drvdata->variant->exit(pdev);
1292
1293 }
1294 EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cpu_platform_shutdown);
1295
1296 MODULE_DESCRIPTION("QTi LPASS CPU Driver");
1297 MODULE_LICENSE("GPL v2");