Merge tag 'spi-fix-v5.11-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/brooni...
[linux-2.6-microblaze.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 <linux/clk.h>
9 #include <linux/kernel.h>
10 #include <linux/module.h>
11 #include <linux/of.h>
12 #include <linux/of_device.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
32 static int lpass_cpu_init_i2sctl_bitfields(struct device *dev,
33                         struct lpaif_i2sctl *i2sctl, struct regmap *map)
34 {
35         struct lpass_data *drvdata = dev_get_drvdata(dev);
36         struct lpass_variant *v = drvdata->variant;
37
38         i2sctl->loopback = devm_regmap_field_alloc(dev, map, v->loopback);
39         i2sctl->spken = devm_regmap_field_alloc(dev, map, v->spken);
40         i2sctl->spkmode = devm_regmap_field_alloc(dev, map, v->spkmode);
41         i2sctl->spkmono = devm_regmap_field_alloc(dev, map, v->spkmono);
42         i2sctl->micen = devm_regmap_field_alloc(dev, map, v->micen);
43         i2sctl->micmode = devm_regmap_field_alloc(dev, map, v->micmode);
44         i2sctl->micmono = devm_regmap_field_alloc(dev, map, v->micmono);
45         i2sctl->wssrc = devm_regmap_field_alloc(dev, map, v->wssrc);
46         i2sctl->bitwidth = devm_regmap_field_alloc(dev, map, v->bitwidth);
47
48         if (IS_ERR(i2sctl->loopback) || IS_ERR(i2sctl->spken) ||
49             IS_ERR(i2sctl->spkmode) || IS_ERR(i2sctl->spkmono) ||
50             IS_ERR(i2sctl->micen) || IS_ERR(i2sctl->micmode) ||
51             IS_ERR(i2sctl->micmono) || IS_ERR(i2sctl->wssrc) ||
52             IS_ERR(i2sctl->bitwidth))
53                 return -EINVAL;
54
55         return 0;
56 }
57
58 static int lpass_cpu_daiops_set_sysclk(struct snd_soc_dai *dai, int clk_id,
59                 unsigned int freq, int dir)
60 {
61         struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
62         int ret;
63
64         ret = clk_set_rate(drvdata->mi2s_osr_clk[dai->driver->id], freq);
65         if (ret)
66                 dev_err(dai->dev, "error setting mi2s osrclk to %u: %d\n",
67                         freq, ret);
68
69         return ret;
70 }
71
72 static int lpass_cpu_daiops_startup(struct snd_pcm_substream *substream,
73                 struct snd_soc_dai *dai)
74 {
75         struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
76         int ret;
77
78         ret = clk_prepare_enable(drvdata->mi2s_osr_clk[dai->driver->id]);
79         if (ret) {
80                 dev_err(dai->dev, "error in enabling mi2s osr clk: %d\n", ret);
81                 return ret;
82         }
83         ret = clk_prepare(drvdata->mi2s_bit_clk[dai->driver->id]);
84         if (ret) {
85                 dev_err(dai->dev, "error in enabling mi2s bit clk: %d\n", ret);
86                 clk_disable_unprepare(drvdata->mi2s_osr_clk[dai->driver->id]);
87                 return ret;
88         }
89         return 0;
90 }
91
92 static void lpass_cpu_daiops_shutdown(struct snd_pcm_substream *substream,
93                 struct snd_soc_dai *dai)
94 {
95         struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
96
97         clk_disable_unprepare(drvdata->mi2s_osr_clk[dai->driver->id]);
98         clk_unprepare(drvdata->mi2s_bit_clk[dai->driver->id]);
99 }
100
101 static int lpass_cpu_daiops_hw_params(struct snd_pcm_substream *substream,
102                 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
103 {
104         struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
105         struct lpaif_i2sctl *i2sctl = drvdata->i2sctl;
106         unsigned int id = dai->driver->id;
107         snd_pcm_format_t format = params_format(params);
108         unsigned int channels = params_channels(params);
109         unsigned int rate = params_rate(params);
110         unsigned int mode;
111         unsigned int regval;
112         int bitwidth, ret;
113
114         bitwidth = snd_pcm_format_width(format);
115         if (bitwidth < 0) {
116                 dev_err(dai->dev, "invalid bit width given: %d\n", bitwidth);
117                 return bitwidth;
118         }
119
120         ret = regmap_fields_write(i2sctl->loopback, id,
121                                  LPAIF_I2SCTL_LOOPBACK_DISABLE);
122         if (ret) {
123                 dev_err(dai->dev, "error updating loopback field: %d\n", ret);
124                 return ret;
125         }
126
127         ret = regmap_fields_write(i2sctl->wssrc, id,
128                                  LPAIF_I2SCTL_WSSRC_INTERNAL);
129         if (ret) {
130                 dev_err(dai->dev, "error updating wssrc field: %d\n", ret);
131                 return ret;
132         }
133
134         switch (bitwidth) {
135         case 16:
136                 regval = LPAIF_I2SCTL_BITWIDTH_16;
137                 break;
138         case 24:
139                 regval = LPAIF_I2SCTL_BITWIDTH_24;
140                 break;
141         case 32:
142                 regval = LPAIF_I2SCTL_BITWIDTH_32;
143                 break;
144         default:
145                 dev_err(dai->dev, "invalid bitwidth given: %d\n", bitwidth);
146                 return -EINVAL;
147         }
148
149         ret = regmap_fields_write(i2sctl->bitwidth, id, regval);
150         if (ret) {
151                 dev_err(dai->dev, "error updating bitwidth field: %d\n", ret);
152                 return ret;
153         }
154
155         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
156                 mode = drvdata->mi2s_playback_sd_mode[id];
157         else
158                 mode = drvdata->mi2s_capture_sd_mode[id];
159
160         if (!mode) {
161                 dev_err(dai->dev, "no line is assigned\n");
162                 return -EINVAL;
163         }
164
165         switch (channels) {
166         case 1:
167         case 2:
168                 switch (mode) {
169                 case LPAIF_I2SCTL_MODE_QUAD01:
170                 case LPAIF_I2SCTL_MODE_6CH:
171                 case LPAIF_I2SCTL_MODE_8CH:
172                         mode = LPAIF_I2SCTL_MODE_SD0;
173                         break;
174                 case LPAIF_I2SCTL_MODE_QUAD23:
175                         mode = LPAIF_I2SCTL_MODE_SD2;
176                         break;
177                 }
178
179                 break;
180         case 4:
181                 if (mode < LPAIF_I2SCTL_MODE_QUAD01) {
182                         dev_err(dai->dev, "cannot configure 4 channels with mode %d\n",
183                                 mode);
184                         return -EINVAL;
185                 }
186
187                 switch (mode) {
188                 case LPAIF_I2SCTL_MODE_6CH:
189                 case LPAIF_I2SCTL_MODE_8CH:
190                         mode = LPAIF_I2SCTL_MODE_QUAD01;
191                         break;
192                 }
193                 break;
194         case 6:
195                 if (mode < LPAIF_I2SCTL_MODE_6CH) {
196                         dev_err(dai->dev, "cannot configure 6 channels with mode %d\n",
197                                 mode);
198                         return -EINVAL;
199                 }
200
201                 switch (mode) {
202                 case LPAIF_I2SCTL_MODE_8CH:
203                         mode = LPAIF_I2SCTL_MODE_6CH;
204                         break;
205                 }
206                 break;
207         case 8:
208                 if (mode < LPAIF_I2SCTL_MODE_8CH) {
209                         dev_err(dai->dev, "cannot configure 8 channels with mode %d\n",
210                                 mode);
211                         return -EINVAL;
212                 }
213                 break;
214         default:
215                 dev_err(dai->dev, "invalid channels given: %u\n", channels);
216                 return -EINVAL;
217         }
218
219         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
220                 ret = regmap_fields_write(i2sctl->spkmode, id,
221                                          LPAIF_I2SCTL_SPKMODE(mode));
222                 if (ret) {
223                         dev_err(dai->dev, "error writing to i2sctl spkr mode: %d\n",
224                                 ret);
225                         return ret;
226                 }
227                 if (channels >= 2)
228                         ret = regmap_fields_write(i2sctl->spkmono, id,
229                                                  LPAIF_I2SCTL_SPKMONO_STEREO);
230                 else
231                         ret = regmap_fields_write(i2sctl->spkmono, id,
232                                                  LPAIF_I2SCTL_SPKMONO_MONO);
233         } else {
234                 ret = regmap_fields_write(i2sctl->micmode, id,
235                                          LPAIF_I2SCTL_MICMODE(mode));
236                 if (ret) {
237                         dev_err(dai->dev, "error writing to i2sctl mic mode: %d\n",
238                                 ret);
239                         return ret;
240                 }
241                 if (channels >= 2)
242                         ret = regmap_fields_write(i2sctl->micmono, id,
243                                                  LPAIF_I2SCTL_MICMONO_STEREO);
244                 else
245                         ret = regmap_fields_write(i2sctl->micmono, id,
246                                                  LPAIF_I2SCTL_MICMONO_MONO);
247         }
248
249         if (ret) {
250                 dev_err(dai->dev, "error writing to i2sctl channels mode: %d\n",
251                         ret);
252                 return ret;
253         }
254
255         ret = clk_set_rate(drvdata->mi2s_bit_clk[id],
256                            rate * bitwidth * 2);
257         if (ret) {
258                 dev_err(dai->dev, "error setting mi2s bitclk to %u: %d\n",
259                         rate * bitwidth * 2, ret);
260                 return ret;
261         }
262
263         return 0;
264 }
265
266 static int lpass_cpu_daiops_trigger(struct snd_pcm_substream *substream,
267                 int cmd, struct snd_soc_dai *dai)
268 {
269         struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
270         struct lpaif_i2sctl *i2sctl = drvdata->i2sctl;
271         unsigned int id = dai->driver->id;
272         int ret = -EINVAL;
273
274         switch (cmd) {
275         case SNDRV_PCM_TRIGGER_START:
276         case SNDRV_PCM_TRIGGER_RESUME:
277         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
278                 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
279                         ret = regmap_fields_write(i2sctl->spken, id,
280                                                  LPAIF_I2SCTL_SPKEN_ENABLE);
281                 } else  {
282                         ret = regmap_fields_write(i2sctl->micen, id,
283                                                  LPAIF_I2SCTL_MICEN_ENABLE);
284                 }
285                 if (ret)
286                         dev_err(dai->dev, "error writing to i2sctl reg: %d\n",
287                                 ret);
288
289                 if (drvdata->bit_clk_state[id] == LPAIF_BIT_CLK_DISABLE) {
290                         ret = clk_enable(drvdata->mi2s_bit_clk[id]);
291                         if (ret) {
292                                 dev_err(dai->dev, "error in enabling mi2s bit clk: %d\n", ret);
293                                 clk_disable(drvdata->mi2s_osr_clk[id]);
294                                 return ret;
295                         }
296                         drvdata->bit_clk_state[id] = LPAIF_BIT_CLK_ENABLE;
297                 }
298
299                 break;
300         case SNDRV_PCM_TRIGGER_STOP:
301         case SNDRV_PCM_TRIGGER_SUSPEND:
302         case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
303                 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
304                         ret = regmap_fields_write(i2sctl->spken, id,
305                                                  LPAIF_I2SCTL_SPKEN_DISABLE);
306                 } else  {
307                         ret = regmap_fields_write(i2sctl->micen, id,
308                                                  LPAIF_I2SCTL_MICEN_DISABLE);
309                 }
310                 if (ret)
311                         dev_err(dai->dev, "error writing to i2sctl reg: %d\n",
312                                 ret);
313                 if (drvdata->bit_clk_state[id] == LPAIF_BIT_CLK_ENABLE) {
314                         clk_disable(drvdata->mi2s_bit_clk[dai->driver->id]);
315                         drvdata->bit_clk_state[id] = LPAIF_BIT_CLK_DISABLE;
316                 }
317                 break;
318         }
319
320         return ret;
321 }
322
323 const struct snd_soc_dai_ops asoc_qcom_lpass_cpu_dai_ops = {
324         .set_sysclk     = lpass_cpu_daiops_set_sysclk,
325         .startup        = lpass_cpu_daiops_startup,
326         .shutdown       = lpass_cpu_daiops_shutdown,
327         .hw_params      = lpass_cpu_daiops_hw_params,
328         .trigger        = lpass_cpu_daiops_trigger,
329 };
330 EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cpu_dai_ops);
331
332 int asoc_qcom_lpass_cpu_dai_probe(struct snd_soc_dai *dai)
333 {
334         struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
335         int ret;
336
337         /* ensure audio hardware is disabled */
338         ret = regmap_write(drvdata->lpaif_map,
339                         LPAIF_I2SCTL_REG(drvdata->variant, dai->driver->id), 0);
340         if (ret)
341                 dev_err(dai->dev, "error writing to i2sctl reg: %d\n", ret);
342
343         return ret;
344 }
345 EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cpu_dai_probe);
346
347 static const struct snd_soc_component_driver lpass_cpu_comp_driver = {
348         .name = "lpass-cpu",
349 };
350
351 static bool lpass_cpu_regmap_writeable(struct device *dev, unsigned int reg)
352 {
353         struct lpass_data *drvdata = dev_get_drvdata(dev);
354         struct lpass_variant *v = drvdata->variant;
355         int i;
356
357         for (i = 0; i < v->i2s_ports; ++i)
358                 if (reg == LPAIF_I2SCTL_REG(v, i))
359                         return true;
360
361         for (i = 0; i < v->irq_ports; ++i) {
362                 if (reg == LPAIF_IRQEN_REG(v, i))
363                         return true;
364                 if (reg == LPAIF_IRQCLEAR_REG(v, i))
365                         return true;
366         }
367
368         for (i = 0; i < v->rdma_channels; ++i) {
369                 if (reg == LPAIF_RDMACTL_REG(v, i))
370                         return true;
371                 if (reg == LPAIF_RDMABASE_REG(v, i))
372                         return true;
373                 if (reg == LPAIF_RDMABUFF_REG(v, i))
374                         return true;
375                 if (reg == LPAIF_RDMAPER_REG(v, i))
376                         return true;
377         }
378
379         for (i = 0; i < v->wrdma_channels; ++i) {
380                 if (reg == LPAIF_WRDMACTL_REG(v, i + v->wrdma_channel_start))
381                         return true;
382                 if (reg == LPAIF_WRDMABASE_REG(v, i + v->wrdma_channel_start))
383                         return true;
384                 if (reg == LPAIF_WRDMABUFF_REG(v, i + v->wrdma_channel_start))
385                         return true;
386                 if (reg == LPAIF_WRDMAPER_REG(v, i + v->wrdma_channel_start))
387                         return true;
388         }
389
390         return false;
391 }
392
393 static bool lpass_cpu_regmap_readable(struct device *dev, unsigned int reg)
394 {
395         struct lpass_data *drvdata = dev_get_drvdata(dev);
396         struct lpass_variant *v = drvdata->variant;
397         int i;
398
399         for (i = 0; i < v->i2s_ports; ++i)
400                 if (reg == LPAIF_I2SCTL_REG(v, i))
401                         return true;
402
403         for (i = 0; i < v->irq_ports; ++i) {
404                 if (reg == LPAIF_IRQEN_REG(v, i))
405                         return true;
406                 if (reg == LPAIF_IRQSTAT_REG(v, i))
407                         return true;
408         }
409
410         for (i = 0; i < v->rdma_channels; ++i) {
411                 if (reg == LPAIF_RDMACTL_REG(v, i))
412                         return true;
413                 if (reg == LPAIF_RDMABASE_REG(v, i))
414                         return true;
415                 if (reg == LPAIF_RDMABUFF_REG(v, i))
416                         return true;
417                 if (reg == LPAIF_RDMACURR_REG(v, i))
418                         return true;
419                 if (reg == LPAIF_RDMAPER_REG(v, i))
420                         return true;
421         }
422
423         for (i = 0; i < v->wrdma_channels; ++i) {
424                 if (reg == LPAIF_WRDMACTL_REG(v, i + v->wrdma_channel_start))
425                         return true;
426                 if (reg == LPAIF_WRDMABASE_REG(v, i + v->wrdma_channel_start))
427                         return true;
428                 if (reg == LPAIF_WRDMABUFF_REG(v, i + v->wrdma_channel_start))
429                         return true;
430                 if (reg == LPAIF_WRDMACURR_REG(v, i + v->wrdma_channel_start))
431                         return true;
432                 if (reg == LPAIF_WRDMAPER_REG(v, i + v->wrdma_channel_start))
433                         return true;
434         }
435
436         return false;
437 }
438
439 static bool lpass_cpu_regmap_volatile(struct device *dev, unsigned int reg)
440 {
441         struct lpass_data *drvdata = dev_get_drvdata(dev);
442         struct lpass_variant *v = drvdata->variant;
443         int i;
444
445         for (i = 0; i < v->irq_ports; ++i)
446                 if (reg == LPAIF_IRQSTAT_REG(v, i))
447                         return true;
448
449         for (i = 0; i < v->rdma_channels; ++i)
450                 if (reg == LPAIF_RDMACURR_REG(v, i))
451                         return true;
452
453         for (i = 0; i < v->wrdma_channels; ++i)
454                 if (reg == LPAIF_WRDMACURR_REG(v, i + v->wrdma_channel_start))
455                         return true;
456
457         return false;
458 }
459
460 static struct regmap_config lpass_cpu_regmap_config = {
461         .reg_bits = 32,
462         .reg_stride = 4,
463         .val_bits = 32,
464         .writeable_reg = lpass_cpu_regmap_writeable,
465         .readable_reg = lpass_cpu_regmap_readable,
466         .volatile_reg = lpass_cpu_regmap_volatile,
467         .cache_type = REGCACHE_FLAT,
468 };
469
470 static int lpass_hdmi_init_bitfields(struct device *dev, struct regmap *map)
471 {
472         struct lpass_data *drvdata = dev_get_drvdata(dev);
473         struct lpass_variant *v = drvdata->variant;
474         unsigned int i;
475         struct lpass_hdmi_tx_ctl *tx_ctl;
476         struct regmap_field *legacy_en;
477         struct lpass_vbit_ctrl *vbit_ctl;
478         struct regmap_field *tx_parity;
479         struct lpass_dp_metadata_ctl *meta_ctl;
480         struct lpass_sstream_ctl *sstream_ctl;
481         struct regmap_field *ch_msb;
482         struct regmap_field *ch_lsb;
483         struct lpass_hdmitx_dmactl *tx_dmactl;
484         int rval;
485
486         tx_ctl = devm_kzalloc(dev, sizeof(*tx_ctl), GFP_KERNEL);
487         if (!tx_ctl)
488                 return -ENOMEM;
489
490         QCOM_REGMAP_FIELD_ALLOC(dev, map, v->soft_reset, tx_ctl->soft_reset);
491         QCOM_REGMAP_FIELD_ALLOC(dev, map, v->force_reset, tx_ctl->force_reset);
492         drvdata->tx_ctl = tx_ctl;
493
494         QCOM_REGMAP_FIELD_ALLOC(dev, map, v->legacy_en, legacy_en);
495         drvdata->hdmitx_legacy_en = legacy_en;
496
497         vbit_ctl = devm_kzalloc(dev, sizeof(*vbit_ctl), GFP_KERNEL);
498         if (!vbit_ctl)
499                 return -ENOMEM;
500
501         QCOM_REGMAP_FIELD_ALLOC(dev, map, v->replace_vbit, vbit_ctl->replace_vbit);
502         QCOM_REGMAP_FIELD_ALLOC(dev, map, v->vbit_stream, vbit_ctl->vbit_stream);
503         drvdata->vbit_ctl = vbit_ctl;
504
505
506         QCOM_REGMAP_FIELD_ALLOC(dev, map, v->calc_en, tx_parity);
507         drvdata->hdmitx_parity_calc_en = tx_parity;
508
509         meta_ctl = devm_kzalloc(dev, sizeof(*meta_ctl), GFP_KERNEL);
510         if (!meta_ctl)
511                 return -ENOMEM;
512
513         rval = devm_regmap_field_bulk_alloc(dev, map, &meta_ctl->mute, &v->mute, 7);
514         if (rval)
515                 return rval;
516         drvdata->meta_ctl = meta_ctl;
517
518         sstream_ctl = devm_kzalloc(dev, sizeof(*sstream_ctl), GFP_KERNEL);
519         if (!sstream_ctl)
520                 return -ENOMEM;
521
522         rval = devm_regmap_field_bulk_alloc(dev, map, &sstream_ctl->sstream_en, &v->sstream_en, 9);
523         if (rval)
524                 return rval;
525
526         drvdata->sstream_ctl = sstream_ctl;
527
528         for (i = 0; i < LPASS_MAX_HDMI_DMA_CHANNELS; i++) {
529                 QCOM_REGMAP_FIELD_ALLOC(dev, map, v->msb_bits, ch_msb);
530                 drvdata->hdmitx_ch_msb[i] = ch_msb;
531
532                 QCOM_REGMAP_FIELD_ALLOC(dev, map, v->lsb_bits, ch_lsb);
533                 drvdata->hdmitx_ch_lsb[i] = ch_lsb;
534
535                 tx_dmactl = devm_kzalloc(dev, sizeof(*tx_dmactl), GFP_KERNEL);
536                 if (!tx_dmactl)
537                         return -ENOMEM;
538
539                 QCOM_REGMAP_FIELD_ALLOC(dev, map, v->use_hw_chs, tx_dmactl->use_hw_chs);
540                 QCOM_REGMAP_FIELD_ALLOC(dev, map, v->use_hw_usr, tx_dmactl->use_hw_usr);
541                 QCOM_REGMAP_FIELD_ALLOC(dev, map, v->hw_chs_sel, tx_dmactl->hw_chs_sel);
542                 QCOM_REGMAP_FIELD_ALLOC(dev, map, v->hw_usr_sel, tx_dmactl->hw_usr_sel);
543                 drvdata->hdmi_tx_dmactl[i] = tx_dmactl;
544         }
545         return 0;
546 }
547
548 static bool lpass_hdmi_regmap_writeable(struct device *dev, unsigned int reg)
549 {
550         struct lpass_data *drvdata = dev_get_drvdata(dev);
551         struct lpass_variant *v = drvdata->variant;
552         int i;
553
554         if (reg == LPASS_HDMI_TX_CTL_ADDR(v))
555                 return true;
556         if (reg == LPASS_HDMI_TX_LEGACY_ADDR(v))
557                 return true;
558         if (reg == LPASS_HDMI_TX_VBIT_CTL_ADDR(v))
559                 return true;
560         if (reg == LPASS_HDMI_TX_PARITY_ADDR(v))
561                 return true;
562         if (reg == LPASS_HDMI_TX_DP_ADDR(v))
563                 return true;
564         if (reg == LPASS_HDMI_TX_SSTREAM_ADDR(v))
565                 return true;
566         if (reg == LPASS_HDMITX_APP_IRQEN_REG(v))
567                 return true;
568         if (reg == LPASS_HDMITX_APP_IRQCLEAR_REG(v))
569                 return true;
570
571         for (i = 0; i < v->hdmi_rdma_channels; i++) {
572                 if (reg == LPASS_HDMI_TX_CH_LSB_ADDR(v, i))
573                         return true;
574                 if (reg == LPASS_HDMI_TX_CH_MSB_ADDR(v, i))
575                         return true;
576                 if (reg == LPASS_HDMI_TX_DMA_ADDR(v, i))
577                         return true;
578         }
579
580         for (i = 0; i < v->rdma_channels; ++i) {
581                 if (reg == LPAIF_HDMI_RDMACTL_REG(v, i))
582                         return true;
583                 if (reg == LPAIF_HDMI_RDMABASE_REG(v, i))
584                         return true;
585                 if (reg == LPAIF_HDMI_RDMABUFF_REG(v, i))
586                         return true;
587                 if (reg == LPAIF_HDMI_RDMAPER_REG(v, i))
588                         return true;
589         }
590         return false;
591 }
592
593 static bool lpass_hdmi_regmap_readable(struct device *dev, unsigned int reg)
594 {
595         struct lpass_data *drvdata = dev_get_drvdata(dev);
596         struct lpass_variant *v = drvdata->variant;
597         int i;
598
599         if (reg == LPASS_HDMI_TX_CTL_ADDR(v))
600                 return true;
601         if (reg == LPASS_HDMI_TX_LEGACY_ADDR(v))
602                 return true;
603         if (reg == LPASS_HDMI_TX_VBIT_CTL_ADDR(v))
604                 return true;
605
606         for (i = 0; i < v->hdmi_rdma_channels; i++) {
607                 if (reg == LPASS_HDMI_TX_CH_LSB_ADDR(v, i))
608                         return true;
609                 if (reg == LPASS_HDMI_TX_CH_MSB_ADDR(v, i))
610                         return true;
611                 if (reg == LPASS_HDMI_TX_DMA_ADDR(v, i))
612                         return true;
613         }
614
615         if (reg == LPASS_HDMI_TX_PARITY_ADDR(v))
616                 return true;
617         if (reg == LPASS_HDMI_TX_DP_ADDR(v))
618                 return true;
619         if (reg == LPASS_HDMI_TX_SSTREAM_ADDR(v))
620                 return true;
621         if (reg == LPASS_HDMITX_APP_IRQEN_REG(v))
622                 return true;
623         if (reg == LPASS_HDMITX_APP_IRQSTAT_REG(v))
624                 return true;
625
626         for (i = 0; i < v->rdma_channels; ++i) {
627                 if (reg == LPAIF_HDMI_RDMACTL_REG(v, i))
628                         return true;
629                 if (reg == LPAIF_HDMI_RDMABASE_REG(v, i))
630                         return true;
631                 if (reg == LPAIF_HDMI_RDMABUFF_REG(v, i))
632                         return true;
633                 if (reg == LPAIF_HDMI_RDMAPER_REG(v, i))
634                         return true;
635                 if (reg == LPAIF_HDMI_RDMACURR_REG(v, i))
636                         return true;
637         }
638
639         return false;
640 }
641
642 static bool lpass_hdmi_regmap_volatile(struct device *dev, unsigned int reg)
643 {
644         struct lpass_data *drvdata = dev_get_drvdata(dev);
645         struct lpass_variant *v = drvdata->variant;
646         int i;
647
648         if (reg == LPASS_HDMITX_APP_IRQSTAT_REG(v))
649                 return true;
650         if (reg == LPASS_HDMI_TX_LEGACY_ADDR(v))
651                 return true;
652
653         for (i = 0; i < v->rdma_channels; ++i) {
654                 if (reg == LPAIF_HDMI_RDMACURR_REG(v, i))
655                         return true;
656         }
657         return false;
658 }
659
660 static struct regmap_config lpass_hdmi_regmap_config = {
661         .reg_bits = 32,
662         .reg_stride = 4,
663         .val_bits = 32,
664         .writeable_reg = lpass_hdmi_regmap_writeable,
665         .readable_reg = lpass_hdmi_regmap_readable,
666         .volatile_reg = lpass_hdmi_regmap_volatile,
667         .cache_type = REGCACHE_FLAT,
668 };
669
670 static unsigned int of_lpass_cpu_parse_sd_lines(struct device *dev,
671                                                 struct device_node *node,
672                                                 const char *name)
673 {
674         unsigned int lines[LPASS_CPU_MAX_MI2S_LINES];
675         unsigned int sd_line_mask = 0;
676         int num_lines, i;
677
678         num_lines = of_property_read_variable_u32_array(node, name, lines, 0,
679                                                         LPASS_CPU_MAX_MI2S_LINES);
680         if (num_lines < 0)
681                 return LPAIF_I2SCTL_MODE_NONE;
682
683         for (i = 0; i < num_lines; i++)
684                 sd_line_mask |= BIT(lines[i]);
685
686         switch (sd_line_mask) {
687         case LPASS_CPU_I2S_SD0_MASK:
688                 return LPAIF_I2SCTL_MODE_SD0;
689         case LPASS_CPU_I2S_SD1_MASK:
690                 return LPAIF_I2SCTL_MODE_SD1;
691         case LPASS_CPU_I2S_SD2_MASK:
692                 return LPAIF_I2SCTL_MODE_SD2;
693         case LPASS_CPU_I2S_SD3_MASK:
694                 return LPAIF_I2SCTL_MODE_SD3;
695         case LPASS_CPU_I2S_SD0_1_MASK:
696                 return LPAIF_I2SCTL_MODE_QUAD01;
697         case LPASS_CPU_I2S_SD2_3_MASK:
698                 return LPAIF_I2SCTL_MODE_QUAD23;
699         case LPASS_CPU_I2S_SD0_1_2_MASK:
700                 return LPAIF_I2SCTL_MODE_6CH;
701         case LPASS_CPU_I2S_SD0_1_2_3_MASK:
702                 return LPAIF_I2SCTL_MODE_8CH;
703         default:
704                 dev_err(dev, "Unsupported SD line mask: %#x\n", sd_line_mask);
705                 return LPAIF_I2SCTL_MODE_NONE;
706         }
707 }
708
709 static void of_lpass_cpu_parse_dai_data(struct device *dev,
710                                         struct lpass_data *data)
711 {
712         struct device_node *node;
713         int ret, id;
714
715         /* Allow all channels by default for backwards compatibility */
716         for (id = 0; id < data->variant->num_dai; id++) {
717                 data->mi2s_playback_sd_mode[id] = LPAIF_I2SCTL_MODE_8CH;
718                 data->mi2s_capture_sd_mode[id] = LPAIF_I2SCTL_MODE_8CH;
719         }
720
721         for_each_child_of_node(dev->of_node, node) {
722                 ret = of_property_read_u32(node, "reg", &id);
723                 if (ret || id < 0 || id >= data->variant->num_dai) {
724                         dev_err(dev, "valid dai id not found: %d\n", ret);
725                         continue;
726                 }
727                 if (id == LPASS_DP_RX) {
728                         data->hdmi_port_enable = 1;
729                         dev_err(dev, "HDMI Port is enabled: %d\n", id);
730                 } else {
731                         data->mi2s_playback_sd_mode[id] =
732                                 of_lpass_cpu_parse_sd_lines(dev, node,
733                                                             "qcom,playback-sd-lines");
734                         data->mi2s_capture_sd_mode[id] =
735                                 of_lpass_cpu_parse_sd_lines(dev, node,
736                                                     "qcom,capture-sd-lines");
737                 }
738         }
739 }
740
741 int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev)
742 {
743         struct lpass_data *drvdata;
744         struct device_node *dsp_of_node;
745         struct resource *res;
746         struct lpass_variant *variant;
747         struct device *dev = &pdev->dev;
748         const struct of_device_id *match;
749         int ret, i, dai_id;
750
751         dsp_of_node = of_parse_phandle(pdev->dev.of_node, "qcom,adsp", 0);
752         if (dsp_of_node) {
753                 dev_err(dev, "DSP exists and holds audio resources\n");
754                 return -EBUSY;
755         }
756
757         drvdata = devm_kzalloc(dev, sizeof(struct lpass_data), GFP_KERNEL);
758         if (!drvdata)
759                 return -ENOMEM;
760         platform_set_drvdata(pdev, drvdata);
761
762         match = of_match_device(dev->driver->of_match_table, dev);
763         if (!match || !match->data)
764                 return -EINVAL;
765
766         drvdata->variant = (struct lpass_variant *)match->data;
767         variant = drvdata->variant;
768
769         of_lpass_cpu_parse_dai_data(dev, drvdata);
770
771         res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lpass-lpaif");
772
773         drvdata->lpaif = devm_ioremap_resource(dev, res);
774         if (IS_ERR((void const __force *)drvdata->lpaif)) {
775                 dev_err(dev, "error mapping reg resource: %ld\n",
776                                 PTR_ERR((void const __force *)drvdata->lpaif));
777                 return PTR_ERR((void const __force *)drvdata->lpaif);
778         }
779
780         lpass_cpu_regmap_config.max_register = LPAIF_WRDMAPER_REG(variant,
781                                                 variant->wrdma_channels +
782                                                 variant->wrdma_channel_start);
783
784         drvdata->lpaif_map = devm_regmap_init_mmio(dev, drvdata->lpaif,
785                         &lpass_cpu_regmap_config);
786         if (IS_ERR(drvdata->lpaif_map)) {
787                 dev_err(dev, "error initializing regmap: %ld\n",
788                         PTR_ERR(drvdata->lpaif_map));
789                 return PTR_ERR(drvdata->lpaif_map);
790         }
791
792         if (drvdata->hdmi_port_enable) {
793                 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lpass-hdmiif");
794
795                 drvdata->hdmiif = devm_ioremap_resource(dev, res);
796                 if (IS_ERR((void const __force *)drvdata->hdmiif)) {
797                         dev_err(dev, "error mapping reg resource: %ld\n",
798                                         PTR_ERR((void const __force *)drvdata->hdmiif));
799                         return PTR_ERR((void const __force *)drvdata->hdmiif);
800                 }
801
802                 lpass_hdmi_regmap_config.max_register = LPAIF_HDMI_RDMAPER_REG(variant,
803                                         variant->hdmi_rdma_channels);
804                 drvdata->hdmiif_map = devm_regmap_init_mmio(dev, drvdata->hdmiif,
805                                         &lpass_hdmi_regmap_config);
806                 if (IS_ERR(drvdata->hdmiif_map)) {
807                         dev_err(dev, "error initializing regmap: %ld\n",
808                         PTR_ERR(drvdata->hdmiif_map));
809                         return PTR_ERR(drvdata->hdmiif_map);
810                 }
811         }
812
813         if (variant->init) {
814                 ret = variant->init(pdev);
815                 if (ret) {
816                         dev_err(dev, "error initializing variant: %d\n", ret);
817                         return ret;
818                 }
819         }
820
821         for (i = 0; i < variant->num_dai; i++) {
822                 dai_id = variant->dai_driver[i].id;
823                 if (dai_id == LPASS_DP_RX)
824                         continue;
825
826                 drvdata->mi2s_osr_clk[dai_id] = devm_clk_get(dev,
827                                              variant->dai_osr_clk_names[i]);
828                 if (IS_ERR(drvdata->mi2s_osr_clk[dai_id])) {
829                         dev_warn(dev,
830                                 "%s() error getting optional %s: %ld\n",
831                                 __func__,
832                                 variant->dai_osr_clk_names[i],
833                                 PTR_ERR(drvdata->mi2s_osr_clk[dai_id]));
834
835                         drvdata->mi2s_osr_clk[dai_id] = NULL;
836                 }
837
838                 drvdata->mi2s_bit_clk[dai_id] = devm_clk_get(dev,
839                                                 variant->dai_bit_clk_names[i]);
840                 if (IS_ERR(drvdata->mi2s_bit_clk[dai_id])) {
841                         dev_err(dev,
842                                 "error getting %s: %ld\n",
843                                 variant->dai_bit_clk_names[i],
844                                 PTR_ERR(drvdata->mi2s_bit_clk[dai_id]));
845                         return PTR_ERR(drvdata->mi2s_bit_clk[dai_id]);
846                 }
847                 drvdata->bit_clk_state[dai_id] = LPAIF_BIT_CLK_DISABLE;
848         }
849
850         /* Allocation for i2sctl regmap fields */
851         drvdata->i2sctl = devm_kzalloc(&pdev->dev, sizeof(struct lpaif_i2sctl),
852                                         GFP_KERNEL);
853
854         /* Initialize bitfields for dai I2SCTL register */
855         ret = lpass_cpu_init_i2sctl_bitfields(dev, drvdata->i2sctl,
856                                                 drvdata->lpaif_map);
857         if (ret) {
858                 dev_err(dev, "error init i2sctl field: %d\n", ret);
859                 return ret;
860         }
861
862         if (drvdata->hdmi_port_enable) {
863                 ret = lpass_hdmi_init_bitfields(dev, drvdata->hdmiif_map);
864                 if (ret) {
865                         dev_err(dev, "%s error  hdmi init failed\n", __func__);
866                         return ret;
867                 }
868         }
869         ret = devm_snd_soc_register_component(dev,
870                                               &lpass_cpu_comp_driver,
871                                               variant->dai_driver,
872                                               variant->num_dai);
873         if (ret) {
874                 dev_err(dev, "error registering cpu driver: %d\n", ret);
875                 goto err;
876         }
877
878         ret = asoc_qcom_lpass_platform_register(pdev);
879         if (ret) {
880                 dev_err(dev, "error registering platform driver: %d\n", ret);
881                 goto err;
882         }
883
884 err:
885         return ret;
886 }
887 EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cpu_platform_probe);
888
889 int asoc_qcom_lpass_cpu_platform_remove(struct platform_device *pdev)
890 {
891         struct lpass_data *drvdata = platform_get_drvdata(pdev);
892
893         if (drvdata->variant->exit)
894                 drvdata->variant->exit(pdev);
895
896
897         return 0;
898 }
899 EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cpu_platform_remove);
900
901 void asoc_qcom_lpass_cpu_platform_shutdown(struct platform_device *pdev)
902 {
903         struct lpass_data *drvdata = platform_get_drvdata(pdev);
904
905         if (drvdata->variant->exit)
906                 drvdata->variant->exit(pdev);
907
908 }
909 EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cpu_platform_shutdown);
910
911 MODULE_DESCRIPTION("QTi LPASS CPU Driver");
912 MODULE_LICENSE("GPL v2");