ASoC: Merge dropped fixes from v5.18
[sfrench/cifs-2.6.git] / sound / soc / fsl / fsl_micfil.c
1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright 2018 NXP
3
4 #include <linux/bitfield.h>
5 #include <linux/clk.h>
6 #include <linux/device.h>
7 #include <linux/interrupt.h>
8 #include <linux/kobject.h>
9 #include <linux/kernel.h>
10 #include <linux/module.h>
11 #include <linux/of.h>
12 #include <linux/of_address.h>
13 #include <linux/of_irq.h>
14 #include <linux/of_platform.h>
15 #include <linux/pm_runtime.h>
16 #include <linux/regmap.h>
17 #include <linux/sysfs.h>
18 #include <linux/types.h>
19 #include <linux/dma/imx-dma.h>
20 #include <sound/dmaengine_pcm.h>
21 #include <sound/pcm.h>
22 #include <sound/soc.h>
23 #include <sound/tlv.h>
24 #include <sound/core.h>
25
26 #include "fsl_micfil.h"
27 #include "fsl_utils.h"
28
29 #define MICFIL_OSR_DEFAULT      16
30
31 enum quality {
32         QUALITY_HIGH,
33         QUALITY_MEDIUM,
34         QUALITY_LOW,
35         QUALITY_VLOW0,
36         QUALITY_VLOW1,
37         QUALITY_VLOW2,
38 };
39
40 struct fsl_micfil {
41         struct platform_device *pdev;
42         struct regmap *regmap;
43         const struct fsl_micfil_soc_data *soc;
44         struct clk *busclk;
45         struct clk *mclk;
46         struct clk *pll8k_clk;
47         struct clk *pll11k_clk;
48         struct snd_dmaengine_dai_dma_data dma_params_rx;
49         struct sdma_peripheral_config sdmacfg;
50         unsigned int dataline;
51         char name[32];
52         int irq[MICFIL_IRQ_LINES];
53         enum quality quality;
54         int dc_remover;
55 };
56
57 struct fsl_micfil_soc_data {
58         unsigned int fifos;
59         unsigned int fifo_depth;
60         unsigned int dataline;
61         bool imx;
62         u64  formats;
63 };
64
65 static struct fsl_micfil_soc_data fsl_micfil_imx8mm = {
66         .imx = true,
67         .fifos = 8,
68         .fifo_depth = 8,
69         .dataline =  0xf,
70         .formats = SNDRV_PCM_FMTBIT_S16_LE,
71 };
72
73 static struct fsl_micfil_soc_data fsl_micfil_imx8mp = {
74         .imx = true,
75         .fifos = 8,
76         .fifo_depth = 32,
77         .dataline =  0xf,
78         .formats = SNDRV_PCM_FMTBIT_S32_LE,
79 };
80
81 static const struct of_device_id fsl_micfil_dt_ids[] = {
82         { .compatible = "fsl,imx8mm-micfil", .data = &fsl_micfil_imx8mm },
83         { .compatible = "fsl,imx8mp-micfil", .data = &fsl_micfil_imx8mp },
84         {}
85 };
86 MODULE_DEVICE_TABLE(of, fsl_micfil_dt_ids);
87
88 static const char * const micfil_quality_select_texts[] = {
89         [QUALITY_HIGH] = "High",
90         [QUALITY_MEDIUM] = "Medium",
91         [QUALITY_LOW] = "Low",
92         [QUALITY_VLOW0] = "VLow0",
93         [QUALITY_VLOW1] = "Vlow1",
94         [QUALITY_VLOW2] = "Vlow2",
95 };
96
97 static const struct soc_enum fsl_micfil_quality_enum =
98         SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(micfil_quality_select_texts),
99                             micfil_quality_select_texts);
100
101 static DECLARE_TLV_DB_SCALE(gain_tlv, 0, 100, 0);
102
103 static int micfil_set_quality(struct fsl_micfil *micfil)
104 {
105         u32 qsel;
106
107         switch (micfil->quality) {
108         case QUALITY_HIGH:
109                 qsel = MICFIL_QSEL_HIGH_QUALITY;
110                 break;
111         case QUALITY_MEDIUM:
112                 qsel = MICFIL_QSEL_MEDIUM_QUALITY;
113                 break;
114         case QUALITY_LOW:
115                 qsel = MICFIL_QSEL_LOW_QUALITY;
116                 break;
117         case QUALITY_VLOW0:
118                 qsel = MICFIL_QSEL_VLOW0_QUALITY;
119                 break;
120         case QUALITY_VLOW1:
121                 qsel = MICFIL_QSEL_VLOW1_QUALITY;
122                 break;
123         case QUALITY_VLOW2:
124                 qsel = MICFIL_QSEL_VLOW2_QUALITY;
125                 break;
126         }
127
128         return regmap_update_bits(micfil->regmap, REG_MICFIL_CTRL2,
129                                   MICFIL_CTRL2_QSEL,
130                                   FIELD_PREP(MICFIL_CTRL2_QSEL, qsel));
131 }
132
133 static int micfil_quality_get(struct snd_kcontrol *kcontrol,
134                               struct snd_ctl_elem_value *ucontrol)
135 {
136         struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
137         struct fsl_micfil *micfil = snd_soc_component_get_drvdata(cmpnt);
138
139         ucontrol->value.integer.value[0] = micfil->quality;
140
141         return 0;
142 }
143
144 static int micfil_quality_set(struct snd_kcontrol *kcontrol,
145                               struct snd_ctl_elem_value *ucontrol)
146 {
147         struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
148         struct fsl_micfil *micfil = snd_soc_component_get_drvdata(cmpnt);
149
150         micfil->quality = ucontrol->value.integer.value[0];
151
152         return micfil_set_quality(micfil);
153 }
154
155 static const struct snd_kcontrol_new fsl_micfil_snd_controls[] = {
156         SOC_SINGLE_SX_TLV("CH0 Volume", REG_MICFIL_OUT_CTRL,
157                           MICFIL_OUTGAIN_CHX_SHIFT(0), 0xF, 0x7, gain_tlv),
158         SOC_SINGLE_SX_TLV("CH1 Volume", REG_MICFIL_OUT_CTRL,
159                           MICFIL_OUTGAIN_CHX_SHIFT(1), 0xF, 0x7, gain_tlv),
160         SOC_SINGLE_SX_TLV("CH2 Volume", REG_MICFIL_OUT_CTRL,
161                           MICFIL_OUTGAIN_CHX_SHIFT(2), 0xF, 0x7, gain_tlv),
162         SOC_SINGLE_SX_TLV("CH3 Volume", REG_MICFIL_OUT_CTRL,
163                           MICFIL_OUTGAIN_CHX_SHIFT(3), 0xF, 0x7, gain_tlv),
164         SOC_SINGLE_SX_TLV("CH4 Volume", REG_MICFIL_OUT_CTRL,
165                           MICFIL_OUTGAIN_CHX_SHIFT(4), 0xF, 0x7, gain_tlv),
166         SOC_SINGLE_SX_TLV("CH5 Volume", REG_MICFIL_OUT_CTRL,
167                           MICFIL_OUTGAIN_CHX_SHIFT(5), 0xF, 0x7, gain_tlv),
168         SOC_SINGLE_SX_TLV("CH6 Volume", REG_MICFIL_OUT_CTRL,
169                           MICFIL_OUTGAIN_CHX_SHIFT(6), 0xF, 0x7, gain_tlv),
170         SOC_SINGLE_SX_TLV("CH7 Volume", REG_MICFIL_OUT_CTRL,
171                           MICFIL_OUTGAIN_CHX_SHIFT(7), 0xF, 0x7, gain_tlv),
172         SOC_ENUM_EXT("MICFIL Quality Select",
173                      fsl_micfil_quality_enum,
174                      micfil_quality_get, micfil_quality_set),
175 };
176
177 /* The SRES is a self-negated bit which provides the CPU with the
178  * capability to initialize the PDM Interface module through the
179  * slave-bus interface. This bit always reads as zero, and this
180  * bit is only effective when MDIS is cleared
181  */
182 static int fsl_micfil_reset(struct device *dev)
183 {
184         struct fsl_micfil *micfil = dev_get_drvdata(dev);
185         int ret;
186
187         ret = regmap_clear_bits(micfil->regmap, REG_MICFIL_CTRL1,
188                                 MICFIL_CTRL1_MDIS);
189         if (ret)
190                 return ret;
191
192         ret = regmap_set_bits(micfil->regmap, REG_MICFIL_CTRL1,
193                               MICFIL_CTRL1_SRES);
194         if (ret)
195                 return ret;
196
197         /*
198          * SRES is self-cleared bit, but REG_MICFIL_CTRL1 is defined
199          * as non-volatile register, so SRES still remain in regmap
200          * cache after set, that every update of REG_MICFIL_CTRL1,
201          * software reset happens. so clear it explicitly.
202          */
203         ret = regmap_clear_bits(micfil->regmap, REG_MICFIL_CTRL1,
204                                 MICFIL_CTRL1_SRES);
205         if (ret)
206                 return ret;
207
208         /*
209          * Set SRES should clear CHnF flags, But even add delay here
210          * the CHnF may not be cleared sometimes, so clear CHnF explicitly.
211          */
212         ret = regmap_write_bits(micfil->regmap, REG_MICFIL_STAT, 0xFF, 0xFF);
213         if (ret)
214                 return ret;
215
216         return 0;
217 }
218
219 static int fsl_micfil_startup(struct snd_pcm_substream *substream,
220                               struct snd_soc_dai *dai)
221 {
222         struct fsl_micfil *micfil = snd_soc_dai_get_drvdata(dai);
223
224         if (!micfil) {
225                 dev_err(dai->dev, "micfil dai priv_data not set\n");
226                 return -EINVAL;
227         }
228
229         return 0;
230 }
231
232 static int fsl_micfil_trigger(struct snd_pcm_substream *substream, int cmd,
233                               struct snd_soc_dai *dai)
234 {
235         struct fsl_micfil *micfil = snd_soc_dai_get_drvdata(dai);
236         struct device *dev = &micfil->pdev->dev;
237         int ret;
238
239         switch (cmd) {
240         case SNDRV_PCM_TRIGGER_START:
241         case SNDRV_PCM_TRIGGER_RESUME:
242         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
243                 ret = fsl_micfil_reset(dev);
244                 if (ret) {
245                         dev_err(dev, "failed to soft reset\n");
246                         return ret;
247                 }
248
249                 /* DMA Interrupt Selection - DISEL bits
250                  * 00 - DMA and IRQ disabled
251                  * 01 - DMA req enabled
252                  * 10 - IRQ enabled
253                  * 11 - reserved
254                  */
255                 ret = regmap_update_bits(micfil->regmap, REG_MICFIL_CTRL1,
256                                 MICFIL_CTRL1_DISEL,
257                                 FIELD_PREP(MICFIL_CTRL1_DISEL, MICFIL_CTRL1_DISEL_DMA));
258                 if (ret)
259                         return ret;
260
261                 /* Enable the module */
262                 ret = regmap_set_bits(micfil->regmap, REG_MICFIL_CTRL1,
263                                       MICFIL_CTRL1_PDMIEN);
264                 if (ret)
265                         return ret;
266
267                 break;
268         case SNDRV_PCM_TRIGGER_STOP:
269         case SNDRV_PCM_TRIGGER_SUSPEND:
270         case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
271                 /* Disable the module */
272                 ret = regmap_clear_bits(micfil->regmap, REG_MICFIL_CTRL1,
273                                         MICFIL_CTRL1_PDMIEN);
274                 if (ret)
275                         return ret;
276
277                 ret = regmap_update_bits(micfil->regmap, REG_MICFIL_CTRL1,
278                                 MICFIL_CTRL1_DISEL,
279                                 FIELD_PREP(MICFIL_CTRL1_DISEL, MICFIL_CTRL1_DISEL_DISABLE));
280                 if (ret)
281                         return ret;
282                 break;
283         default:
284                 return -EINVAL;
285         }
286         return 0;
287 }
288
289 static int fsl_micfil_reparent_rootclk(struct fsl_micfil *micfil, unsigned int sample_rate)
290 {
291         struct device *dev = &micfil->pdev->dev;
292         u64 ratio = sample_rate;
293         struct clk *clk;
294         int ret;
295
296         /* Get root clock */
297         clk = micfil->mclk;
298
299         /* Disable clock first, for it was enabled by pm_runtime */
300         clk_disable_unprepare(clk);
301         fsl_asoc_reparent_pll_clocks(dev, clk, micfil->pll8k_clk,
302                                      micfil->pll11k_clk, ratio);
303         ret = clk_prepare_enable(clk);
304         if (ret)
305                 return ret;
306
307         return 0;
308 }
309
310 static int fsl_micfil_hw_params(struct snd_pcm_substream *substream,
311                                 struct snd_pcm_hw_params *params,
312                                 struct snd_soc_dai *dai)
313 {
314         struct fsl_micfil *micfil = snd_soc_dai_get_drvdata(dai);
315         unsigned int channels = params_channels(params);
316         unsigned int rate = params_rate(params);
317         int clk_div = 8;
318         int osr = MICFIL_OSR_DEFAULT;
319         int ret;
320
321         /* 1. Disable the module */
322         ret = regmap_clear_bits(micfil->regmap, REG_MICFIL_CTRL1,
323                                 MICFIL_CTRL1_PDMIEN);
324         if (ret)
325                 return ret;
326
327         /* enable channels */
328         ret = regmap_update_bits(micfil->regmap, REG_MICFIL_CTRL1,
329                                  0xFF, ((1 << channels) - 1));
330         if (ret)
331                 return ret;
332
333         ret = fsl_micfil_reparent_rootclk(micfil, rate);
334         if (ret)
335                 return ret;
336
337         ret = clk_set_rate(micfil->mclk, rate * clk_div * osr * 8);
338         if (ret)
339                 return ret;
340
341         ret = micfil_set_quality(micfil);
342         if (ret)
343                 return ret;
344
345         ret = regmap_update_bits(micfil->regmap, REG_MICFIL_CTRL2,
346                                  MICFIL_CTRL2_CLKDIV | MICFIL_CTRL2_CICOSR,
347                                  FIELD_PREP(MICFIL_CTRL2_CLKDIV, clk_div) |
348                                  FIELD_PREP(MICFIL_CTRL2_CICOSR, 16 - osr));
349
350         micfil->dma_params_rx.peripheral_config = &micfil->sdmacfg;
351         micfil->dma_params_rx.peripheral_size = sizeof(micfil->sdmacfg);
352         micfil->sdmacfg.n_fifos_src = channels;
353         micfil->sdmacfg.sw_done = true;
354         micfil->dma_params_rx.maxburst = channels * MICFIL_DMA_MAXBURST_RX;
355
356         return 0;
357 }
358
359 static const struct snd_soc_dai_ops fsl_micfil_dai_ops = {
360         .startup = fsl_micfil_startup,
361         .trigger = fsl_micfil_trigger,
362         .hw_params = fsl_micfil_hw_params,
363 };
364
365 static int fsl_micfil_dai_probe(struct snd_soc_dai *cpu_dai)
366 {
367         struct fsl_micfil *micfil = dev_get_drvdata(cpu_dai->dev);
368         struct device *dev = cpu_dai->dev;
369         unsigned int val = 0;
370         int ret, i;
371
372         micfil->quality = QUALITY_VLOW0;
373
374         /* set default gain to 2 */
375         regmap_write(micfil->regmap, REG_MICFIL_OUT_CTRL, 0x22222222);
376
377         /* set DC Remover in bypass mode*/
378         for (i = 0; i < MICFIL_OUTPUT_CHANNELS; i++)
379                 val |= MICFIL_DC_BYPASS << MICFIL_DC_CHX_SHIFT(i);
380         ret = regmap_update_bits(micfil->regmap, REG_MICFIL_DC_CTRL,
381                                  MICFIL_DC_CTRL_CONFIG, val);
382         if (ret) {
383                 dev_err(dev, "failed to set DC Remover mode bits\n");
384                 return ret;
385         }
386         micfil->dc_remover = MICFIL_DC_BYPASS;
387
388         snd_soc_dai_init_dma_data(cpu_dai, NULL,
389                                   &micfil->dma_params_rx);
390
391         /* FIFO Watermark Control - FIFOWMK*/
392         ret = regmap_update_bits(micfil->regmap, REG_MICFIL_FIFO_CTRL,
393                         MICFIL_FIFO_CTRL_FIFOWMK,
394                         FIELD_PREP(MICFIL_FIFO_CTRL_FIFOWMK, micfil->soc->fifo_depth - 1));
395         if (ret)
396                 return ret;
397
398         return 0;
399 }
400
401 static struct snd_soc_dai_driver fsl_micfil_dai = {
402         .probe = fsl_micfil_dai_probe,
403         .capture = {
404                 .stream_name = "CPU-Capture",
405                 .channels_min = 1,
406                 .channels_max = 8,
407                 .rates = SNDRV_PCM_RATE_8000_48000,
408                 .formats = SNDRV_PCM_FMTBIT_S16_LE,
409         },
410         .ops = &fsl_micfil_dai_ops,
411 };
412
413 static const struct snd_soc_component_driver fsl_micfil_component = {
414         .name           = "fsl-micfil-dai",
415         .controls       = fsl_micfil_snd_controls,
416         .num_controls   = ARRAY_SIZE(fsl_micfil_snd_controls),
417         .legacy_dai_naming      = 1,
418 };
419
420 /* REGMAP */
421 static const struct reg_default fsl_micfil_reg_defaults[] = {
422         {REG_MICFIL_CTRL1,              0x00000000},
423         {REG_MICFIL_CTRL2,              0x00000000},
424         {REG_MICFIL_STAT,               0x00000000},
425         {REG_MICFIL_FIFO_CTRL,          0x00000007},
426         {REG_MICFIL_FIFO_STAT,          0x00000000},
427         {REG_MICFIL_DATACH0,            0x00000000},
428         {REG_MICFIL_DATACH1,            0x00000000},
429         {REG_MICFIL_DATACH2,            0x00000000},
430         {REG_MICFIL_DATACH3,            0x00000000},
431         {REG_MICFIL_DATACH4,            0x00000000},
432         {REG_MICFIL_DATACH5,            0x00000000},
433         {REG_MICFIL_DATACH6,            0x00000000},
434         {REG_MICFIL_DATACH7,            0x00000000},
435         {REG_MICFIL_DC_CTRL,            0x00000000},
436         {REG_MICFIL_OUT_CTRL,           0x00000000},
437         {REG_MICFIL_OUT_STAT,           0x00000000},
438         {REG_MICFIL_VAD0_CTRL1,         0x00000000},
439         {REG_MICFIL_VAD0_CTRL2,         0x000A0000},
440         {REG_MICFIL_VAD0_STAT,          0x00000000},
441         {REG_MICFIL_VAD0_SCONFIG,       0x00000000},
442         {REG_MICFIL_VAD0_NCONFIG,       0x80000000},
443         {REG_MICFIL_VAD0_NDATA,         0x00000000},
444         {REG_MICFIL_VAD0_ZCD,           0x00000004},
445 };
446
447 static bool fsl_micfil_readable_reg(struct device *dev, unsigned int reg)
448 {
449         switch (reg) {
450         case REG_MICFIL_CTRL1:
451         case REG_MICFIL_CTRL2:
452         case REG_MICFIL_STAT:
453         case REG_MICFIL_FIFO_CTRL:
454         case REG_MICFIL_FIFO_STAT:
455         case REG_MICFIL_DATACH0:
456         case REG_MICFIL_DATACH1:
457         case REG_MICFIL_DATACH2:
458         case REG_MICFIL_DATACH3:
459         case REG_MICFIL_DATACH4:
460         case REG_MICFIL_DATACH5:
461         case REG_MICFIL_DATACH6:
462         case REG_MICFIL_DATACH7:
463         case REG_MICFIL_DC_CTRL:
464         case REG_MICFIL_OUT_CTRL:
465         case REG_MICFIL_OUT_STAT:
466         case REG_MICFIL_VAD0_CTRL1:
467         case REG_MICFIL_VAD0_CTRL2:
468         case REG_MICFIL_VAD0_STAT:
469         case REG_MICFIL_VAD0_SCONFIG:
470         case REG_MICFIL_VAD0_NCONFIG:
471         case REG_MICFIL_VAD0_NDATA:
472         case REG_MICFIL_VAD0_ZCD:
473                 return true;
474         default:
475                 return false;
476         }
477 }
478
479 static bool fsl_micfil_writeable_reg(struct device *dev, unsigned int reg)
480 {
481         switch (reg) {
482         case REG_MICFIL_CTRL1:
483         case REG_MICFIL_CTRL2:
484         case REG_MICFIL_STAT:           /* Write 1 to Clear */
485         case REG_MICFIL_FIFO_CTRL:
486         case REG_MICFIL_FIFO_STAT:      /* Write 1 to Clear */
487         case REG_MICFIL_DC_CTRL:
488         case REG_MICFIL_OUT_CTRL:
489         case REG_MICFIL_OUT_STAT:       /* Write 1 to Clear */
490         case REG_MICFIL_VAD0_CTRL1:
491         case REG_MICFIL_VAD0_CTRL2:
492         case REG_MICFIL_VAD0_STAT:      /* Write 1 to Clear */
493         case REG_MICFIL_VAD0_SCONFIG:
494         case REG_MICFIL_VAD0_NCONFIG:
495         case REG_MICFIL_VAD0_ZCD:
496                 return true;
497         default:
498                 return false;
499         }
500 }
501
502 static bool fsl_micfil_volatile_reg(struct device *dev, unsigned int reg)
503 {
504         switch (reg) {
505         case REG_MICFIL_STAT:
506         case REG_MICFIL_DATACH0:
507         case REG_MICFIL_DATACH1:
508         case REG_MICFIL_DATACH2:
509         case REG_MICFIL_DATACH3:
510         case REG_MICFIL_DATACH4:
511         case REG_MICFIL_DATACH5:
512         case REG_MICFIL_DATACH6:
513         case REG_MICFIL_DATACH7:
514         case REG_MICFIL_VAD0_STAT:
515         case REG_MICFIL_VAD0_NDATA:
516                 return true;
517         default:
518                 return false;
519         }
520 }
521
522 static const struct regmap_config fsl_micfil_regmap_config = {
523         .reg_bits = 32,
524         .reg_stride = 4,
525         .val_bits = 32,
526
527         .max_register = REG_MICFIL_VAD0_ZCD,
528         .reg_defaults = fsl_micfil_reg_defaults,
529         .num_reg_defaults = ARRAY_SIZE(fsl_micfil_reg_defaults),
530         .readable_reg = fsl_micfil_readable_reg,
531         .volatile_reg = fsl_micfil_volatile_reg,
532         .writeable_reg = fsl_micfil_writeable_reg,
533         .cache_type = REGCACHE_RBTREE,
534 };
535
536 /* END OF REGMAP */
537
538 static irqreturn_t micfil_isr(int irq, void *devid)
539 {
540         struct fsl_micfil *micfil = (struct fsl_micfil *)devid;
541         struct platform_device *pdev = micfil->pdev;
542         u32 stat_reg;
543         u32 fifo_stat_reg;
544         u32 ctrl1_reg;
545         bool dma_enabled;
546         int i;
547
548         regmap_read(micfil->regmap, REG_MICFIL_STAT, &stat_reg);
549         regmap_read(micfil->regmap, REG_MICFIL_CTRL1, &ctrl1_reg);
550         regmap_read(micfil->regmap, REG_MICFIL_FIFO_STAT, &fifo_stat_reg);
551
552         dma_enabled = FIELD_GET(MICFIL_CTRL1_DISEL, ctrl1_reg) == MICFIL_CTRL1_DISEL_DMA;
553
554         /* Channel 0-7 Output Data Flags */
555         for (i = 0; i < MICFIL_OUTPUT_CHANNELS; i++) {
556                 if (stat_reg & MICFIL_STAT_CHXF(i))
557                         dev_dbg(&pdev->dev,
558                                 "Data available in Data Channel %d\n", i);
559                 /* if DMA is not enabled, field must be written with 1
560                  * to clear
561                  */
562                 if (!dma_enabled)
563                         regmap_write_bits(micfil->regmap,
564                                           REG_MICFIL_STAT,
565                                           MICFIL_STAT_CHXF(i),
566                                           1);
567         }
568
569         for (i = 0; i < MICFIL_FIFO_NUM; i++) {
570                 if (fifo_stat_reg & MICFIL_FIFO_STAT_FIFOX_OVER(i))
571                         dev_dbg(&pdev->dev,
572                                 "FIFO Overflow Exception flag for channel %d\n",
573                                 i);
574
575                 if (fifo_stat_reg & MICFIL_FIFO_STAT_FIFOX_UNDER(i))
576                         dev_dbg(&pdev->dev,
577                                 "FIFO Underflow Exception flag for channel %d\n",
578                                 i);
579         }
580
581         return IRQ_HANDLED;
582 }
583
584 static irqreturn_t micfil_err_isr(int irq, void *devid)
585 {
586         struct fsl_micfil *micfil = (struct fsl_micfil *)devid;
587         struct platform_device *pdev = micfil->pdev;
588         u32 stat_reg;
589
590         regmap_read(micfil->regmap, REG_MICFIL_STAT, &stat_reg);
591
592         if (stat_reg & MICFIL_STAT_BSY_FIL)
593                 dev_dbg(&pdev->dev, "isr: Decimation Filter is running\n");
594
595         if (stat_reg & MICFIL_STAT_FIR_RDY)
596                 dev_dbg(&pdev->dev, "isr: FIR Filter Data ready\n");
597
598         if (stat_reg & MICFIL_STAT_LOWFREQF) {
599                 dev_dbg(&pdev->dev, "isr: ipg_clk_app is too low\n");
600                 regmap_write_bits(micfil->regmap, REG_MICFIL_STAT,
601                                   MICFIL_STAT_LOWFREQF, 1);
602         }
603
604         return IRQ_HANDLED;
605 }
606
607 static int fsl_micfil_probe(struct platform_device *pdev)
608 {
609         struct device_node *np = pdev->dev.of_node;
610         struct fsl_micfil *micfil;
611         struct resource *res;
612         void __iomem *regs;
613         int ret, i;
614
615         micfil = devm_kzalloc(&pdev->dev, sizeof(*micfil), GFP_KERNEL);
616         if (!micfil)
617                 return -ENOMEM;
618
619         micfil->pdev = pdev;
620         strncpy(micfil->name, np->name, sizeof(micfil->name) - 1);
621
622         micfil->soc = of_device_get_match_data(&pdev->dev);
623
624         /* ipg_clk is used to control the registers
625          * ipg_clk_app is used to operate the filter
626          */
627         micfil->mclk = devm_clk_get(&pdev->dev, "ipg_clk_app");
628         if (IS_ERR(micfil->mclk)) {
629                 dev_err(&pdev->dev, "failed to get core clock: %ld\n",
630                         PTR_ERR(micfil->mclk));
631                 return PTR_ERR(micfil->mclk);
632         }
633
634         micfil->busclk = devm_clk_get(&pdev->dev, "ipg_clk");
635         if (IS_ERR(micfil->busclk)) {
636                 dev_err(&pdev->dev, "failed to get ipg clock: %ld\n",
637                         PTR_ERR(micfil->busclk));
638                 return PTR_ERR(micfil->busclk);
639         }
640
641         fsl_asoc_get_pll_clocks(&pdev->dev, &micfil->pll8k_clk,
642                                 &micfil->pll11k_clk);
643
644         /* init regmap */
645         regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
646         if (IS_ERR(regs))
647                 return PTR_ERR(regs);
648
649         micfil->regmap = devm_regmap_init_mmio(&pdev->dev,
650                                                regs,
651                                                &fsl_micfil_regmap_config);
652         if (IS_ERR(micfil->regmap)) {
653                 dev_err(&pdev->dev, "failed to init MICFIL regmap: %ld\n",
654                         PTR_ERR(micfil->regmap));
655                 return PTR_ERR(micfil->regmap);
656         }
657
658         /* dataline mask for RX */
659         ret = of_property_read_u32_index(np,
660                                          "fsl,dataline",
661                                          0,
662                                          &micfil->dataline);
663         if (ret)
664                 micfil->dataline = 1;
665
666         if (micfil->dataline & ~micfil->soc->dataline) {
667                 dev_err(&pdev->dev, "dataline setting error, Mask is 0x%X\n",
668                         micfil->soc->dataline);
669                 return -EINVAL;
670         }
671
672         /* get IRQs */
673         for (i = 0; i < MICFIL_IRQ_LINES; i++) {
674                 micfil->irq[i] = platform_get_irq(pdev, i);
675                 if (micfil->irq[i] < 0)
676                         return micfil->irq[i];
677         }
678
679         /* Digital Microphone interface interrupt */
680         ret = devm_request_irq(&pdev->dev, micfil->irq[0],
681                                micfil_isr, IRQF_SHARED,
682                                micfil->name, micfil);
683         if (ret) {
684                 dev_err(&pdev->dev, "failed to claim mic interface irq %u\n",
685                         micfil->irq[0]);
686                 return ret;
687         }
688
689         /* Digital Microphone interface error interrupt */
690         ret = devm_request_irq(&pdev->dev, micfil->irq[1],
691                                micfil_err_isr, IRQF_SHARED,
692                                micfil->name, micfil);
693         if (ret) {
694                 dev_err(&pdev->dev, "failed to claim mic interface error irq %u\n",
695                         micfil->irq[1]);
696                 return ret;
697         }
698
699         micfil->dma_params_rx.chan_name = "rx";
700         micfil->dma_params_rx.addr = res->start + REG_MICFIL_DATACH0;
701         micfil->dma_params_rx.maxburst = MICFIL_DMA_MAXBURST_RX;
702
703         platform_set_drvdata(pdev, micfil);
704
705         pm_runtime_enable(&pdev->dev);
706         regcache_cache_only(micfil->regmap, true);
707
708         /*
709          * Register platform component before registering cpu dai for there
710          * is not defer probe for platform component in snd_soc_add_pcm_runtime().
711          */
712         ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
713         if (ret) {
714                 dev_err(&pdev->dev, "failed to pcm register\n");
715                 return ret;
716         }
717
718         fsl_micfil_dai.capture.formats = micfil->soc->formats;
719
720         ret = devm_snd_soc_register_component(&pdev->dev, &fsl_micfil_component,
721                                               &fsl_micfil_dai, 1);
722         if (ret) {
723                 dev_err(&pdev->dev, "failed to register component %s\n",
724                         fsl_micfil_component.name);
725         }
726
727         return ret;
728 }
729
730 static int __maybe_unused fsl_micfil_runtime_suspend(struct device *dev)
731 {
732         struct fsl_micfil *micfil = dev_get_drvdata(dev);
733
734         regcache_cache_only(micfil->regmap, true);
735
736         clk_disable_unprepare(micfil->mclk);
737         clk_disable_unprepare(micfil->busclk);
738
739         return 0;
740 }
741
742 static int __maybe_unused fsl_micfil_runtime_resume(struct device *dev)
743 {
744         struct fsl_micfil *micfil = dev_get_drvdata(dev);
745         int ret;
746
747         ret = clk_prepare_enable(micfil->busclk);
748         if (ret < 0)
749                 return ret;
750
751         ret = clk_prepare_enable(micfil->mclk);
752         if (ret < 0) {
753                 clk_disable_unprepare(micfil->busclk);
754                 return ret;
755         }
756
757         regcache_cache_only(micfil->regmap, false);
758         regcache_mark_dirty(micfil->regmap);
759         regcache_sync(micfil->regmap);
760
761         return 0;
762 }
763
764 static int __maybe_unused fsl_micfil_suspend(struct device *dev)
765 {
766         pm_runtime_force_suspend(dev);
767
768         return 0;
769 }
770
771 static int __maybe_unused fsl_micfil_resume(struct device *dev)
772 {
773         pm_runtime_force_resume(dev);
774
775         return 0;
776 }
777
778 static const struct dev_pm_ops fsl_micfil_pm_ops = {
779         SET_RUNTIME_PM_OPS(fsl_micfil_runtime_suspend,
780                            fsl_micfil_runtime_resume,
781                            NULL)
782         SET_SYSTEM_SLEEP_PM_OPS(fsl_micfil_suspend,
783                                 fsl_micfil_resume)
784 };
785
786 static struct platform_driver fsl_micfil_driver = {
787         .probe = fsl_micfil_probe,
788         .driver = {
789                 .name = "fsl-micfil-dai",
790                 .pm = &fsl_micfil_pm_ops,
791                 .of_match_table = fsl_micfil_dt_ids,
792         },
793 };
794 module_platform_driver(fsl_micfil_driver);
795
796 MODULE_AUTHOR("Cosmin-Gabriel Samoila <cosmin.samoila@nxp.com>");
797 MODULE_DESCRIPTION("NXP PDM Microphone Interface (MICFIL) driver");
798 MODULE_LICENSE("GPL v2");