1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Rockchip VAD driver
4 *
5 * Copyright (C) 2018 Fuzhou Rockchip Electronics Co., Ltd
6 *
7 */
8
9 #include <linux/module.h>
10 #include <linux/uaccess.h>
11 #include <linux/clk.h>
12 #include <linux/interrupt.h>
13 #include <linux/io.h>
14 #include <linux/of_device.h>
15 #include <linux/of_address.h>
16 #include <linux/pm_runtime.h>
17 #include <linux/regmap.h>
18 #include <sound/pcm.h>
19 #include <sound/pcm_params.h>
20 #include <sound/soc.h>
21
22 #include "rockchip_vad.h"
23 #include "rockchip_multi_dais.h"
24 #include "vad_preprocess.h"
25
26 #define DRV_NAME "rockchip-vad"
27
28 #define VAD_RATES SNDRV_PCM_RATE_8000_192000
29 #define VAD_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
30 SNDRV_PCM_FMTBIT_S20_3LE | \
31 SNDRV_PCM_FMTBIT_S24_LE | \
32 SNDRV_PCM_FMTBIT_S32_LE)
33 #define ACODEC_REG_NUM 28
34 #define CHUNK_SIZE 64 /* bytes */
35
36 static struct snd_pcm_substream *vad_substream;
37 static unsigned int voice_inactive_frames;
38 module_param(voice_inactive_frames, uint, 0644);
39 MODULE_PARM_DESC(voice_inactive_frames, "voice inactive frame count");
40
41 enum rk_vad_version {
42 VAD_RK1808ES = 1,
43 VAD_RK1808,
44 VAD_RK3308,
45 };
46
47 struct vad_buf {
48 void __iomem *begin;
49 void __iomem *end;
50 void __iomem *cur;
51 void __iomem *pos;
52 int size;
53 int loop_cnt;
54 bool loop;
55 bool sorted;
56 };
57
58 struct audio_src_addr_map {
59 u32 id;
60 u32 addr;
61 };
62
63 struct vad_soc_data {
64 enum rk_vad_version version;
65 const struct audio_src_addr_map *map;
66 };
67
68 struct rockchip_vad {
69 struct device *dev;
70 struct device_node *audio_node;
71 struct clk *hclk;
72 struct regmap *regmap;
73 unsigned int memphy;
74 unsigned int memphy_end;
75 void __iomem *membase;
76 struct vad_buf vbuf;
77 struct vad_params params;
78 struct vad_uparams uparams;
79 struct snd_soc_dai *cpu_dai;
80 struct snd_pcm_substream *substream;
81 struct vad_soc_data *soc_data;
82 int mode;
83 u32 audio_src;
84 u32 audio_src_addr;
85 u32 audio_chnl;
86 u32 channels;
87 u32 sample_bytes;
88 u32 buffer_time; /* msec */
89 struct dentry *debugfs_dir;
90 void *buf;
91 bool acodec_cfg;
92 bool vswitch;
93 bool h_16bit;
94 enum rk_vad_version version;
95 };
96
vframe_size(struct rockchip_vad * vad,int bytes)97 static inline int vframe_size(struct rockchip_vad *vad, int bytes)
98 {
99 return bytes / vad->channels / vad->sample_bytes;
100 }
101
chunk_sort(void __iomem * pos,void __iomem * end,int loop_cnt)102 static int chunk_sort(void __iomem *pos, void __iomem *end, int loop_cnt)
103 {
104 char tbuf[CHUNK_SIZE];
105 int size1, size2;
106
107 size1 = loop_cnt * 4;
108 size2 = CHUNK_SIZE - size1;
109
110 while (pos < end) {
111 memcpy_fromio(&tbuf[0], pos + size1, size2);
112 memcpy_fromio(&tbuf[size2], pos, size1);
113 memcpy_toio(pos, &tbuf[0], CHUNK_SIZE);
114 pos += CHUNK_SIZE;
115 }
116
117 return 0;
118 }
119
vad_buffer_sort(struct rockchip_vad * vad)120 static int vad_buffer_sort(struct rockchip_vad *vad)
121 {
122 struct vad_buf *vbuf = &vad->vbuf;
123 int loop_cnt = vbuf->loop_cnt;
124
125 if (vad->version != VAD_RK1808ES)
126 return 0;
127
128 if (vbuf->sorted || !vbuf->loop)
129 return 0;
130
131 /* 16 words align */
132 if ((vbuf->pos - vbuf->begin) % CHUNK_SIZE ||
133 (vbuf->end - vbuf->pos) % CHUNK_SIZE)
134 return -EINVAL;
135
136 switch (loop_cnt) {
137 case 0:
138 loop_cnt = 16;
139 chunk_sort(vbuf->pos, vbuf->end, loop_cnt - 1);
140 vbuf->sorted = true;
141 break;
142 case 1:
143 chunk_sort(vbuf->begin, vbuf->pos, loop_cnt);
144 vbuf->sorted = true;
145 break;
146 case 2 ... 15:
147 chunk_sort(vbuf->pos, vbuf->end, loop_cnt - 1);
148 chunk_sort(vbuf->begin, vbuf->pos, loop_cnt);
149 vbuf->sorted = true;
150 break;
151 default:
152 return -EINVAL;
153 }
154
155 return 0;
156 }
157
rockchip_vad_stop(struct rockchip_vad * vad)158 static int rockchip_vad_stop(struct rockchip_vad *vad)
159 {
160 unsigned int val, frames;
161 struct vad_buf *vbuf = &vad->vbuf;
162 struct vad_params *params = &vad->params;
163
164 regmap_read(vad->regmap, VAD_CTRL, &val);
165 if ((val & VAD_EN_MASK) == VAD_DISABLE)
166 return 0;
167
168 /* sample cnt will be clear after vad disabled */
169 if (vad->version == VAD_RK1808ES)
170 regmap_read(vad->regmap, VAD_SAMPLE_CNT, &frames);
171 regmap_update_bits(vad->regmap, VAD_CTRL, VAD_EN_MASK, VAD_DISABLE);
172 regmap_read(vad->regmap, VAD_CTRL, &val);
173 vad->h_16bit = (val & AUDIO_24BIT_SAT_MASK) == AUDIO_H16B;
174 regmap_read(vad->regmap, VAD_RAM_END_ADDR, &val);
175 vbuf->end = vbuf->begin + (val - vad->memphy) + 0x8;
176 regmap_read(vad->regmap, VAD_INT, &val);
177 val &= BIT(8);
178 vbuf->loop = val;
179 regmap_read(vad->regmap, VAD_RAM_CUR_ADDR, &val);
180 if (!val) {
181 vbuf->size = 0;
182 vbuf->cur = vbuf->begin;
183 return 0;
184 }
185 vbuf->cur = vbuf->begin + (val - vad->memphy);
186
187 if (vbuf->loop) {
188 vbuf->size = vbuf->end - vbuf->begin;
189 vbuf->pos = vbuf->cur;
190 } else {
191 vbuf->size = vbuf->cur - vbuf->begin;
192 vbuf->end = vbuf->cur;
193 vbuf->pos = vbuf->begin;
194 }
195
196 if (vad->version == VAD_RK1808ES) {
197 vbuf->loop_cnt = (frames / vframe_size(vad, vbuf->size)) % 16;
198 /* due to get loop_cnt before vad disable, we should take
199 * the boundary issue into account, and judge whether the
200 * loop_cnt change to loop_cnt + 1 or not when vad disable.
201 */
202 if (vbuf->loop) {
203 frames = frames % vframe_size(vad, vbuf->size);
204 val = vframe_size(vad, vbuf->pos - vbuf->begin);
205 if (frames > val)
206 vbuf->loop_cnt = (vbuf->loop_cnt + 1) % 16;
207 }
208 vbuf->sorted = false;
209 }
210 regmap_read(vad->regmap, VAD_DET_CON0, &val);
211 params->noise_level = (val & NOISE_LEVEL_MASK) >> NOISE_LEVEL_SHIFT;
212 params->vad_con_thd = (val & VAD_CON_THD_MASK) >> VAD_CON_THD_SHIFT;
213 params->voice_gain = (val & GAIN_MASK) >> GAIN_SHIFT;
214 regmap_read(vad->regmap, VAD_DET_CON1, &val);
215 params->sound_thd = val & SOUND_THD_MASK;
216 regmap_read(vad->regmap, VAD_DET_CON5, &val);
217 params->noise_abs = val & NOISE_ABS_MASK;
218
219 vad_preprocess_init(params);
220 voice_inactive_frames = 0;
221
222 dev_info(vad->dev, "bufsize: %d, hw_abs: 0x%x\n",
223 vbuf->size, params->noise_abs);
224
225 return 0;
226 }
227
rockchip_vad_setup(struct rockchip_vad * vad)228 static int rockchip_vad_setup(struct rockchip_vad *vad)
229 {
230 struct regmap *regmap = vad->regmap;
231 u32 val, mask;
232
233 dev_info(vad->dev, "sw_abs: 0x%x\n",
234 vad->uparams.noise_abs);
235 regmap_update_bits(regmap, VAD_DET_CON5,
236 NOISE_ABS_MASK, vad->uparams.noise_abs);
237 regmap_update_bits(regmap, VAD_CTRL, VAD_EN_MASK, VAD_EN);
238
239 val = ERR_INT_EN | VAD_DET_INT_EN;
240 mask = ERR_INT_EN_MASK | VAD_DET_INT_EN_MASK;
241
242 regmap_update_bits(regmap, VAD_INT, mask, val);
243
244 vad_preprocess_destroy();
245
246 return 0;
247 }
248
substream_get_drvdata(struct snd_pcm_substream * substream)249 static struct rockchip_vad *substream_get_drvdata(struct snd_pcm_substream *substream)
250 {
251 struct snd_soc_pcm_runtime *rtd = substream->private_data;
252 struct rockchip_vad *vad = NULL;
253 unsigned int i;
254
255 if (!rtd)
256 return NULL;
257
258 for (i = 0; i < rtd->num_codecs; i++) {
259 struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, i);
260
261 if (strstr(codec_dai->name, "vad"))
262 vad = snd_soc_component_get_drvdata(codec_dai->component);
263 }
264
265 return vad;
266 }
267
268 /**
269 * snd_pcm_vad_avail - Get the available (readable) space for vad
270 * @runtime: PCM substream instance
271 *
272 * Result is between 0 ... (boundary - 1)
273 */
snd_pcm_vad_avail(struct snd_pcm_substream * substream)274 snd_pcm_uframes_t snd_pcm_vad_avail(struct snd_pcm_substream *substream)
275 {
276 struct snd_pcm_runtime *runtime = substream->runtime;
277 struct rockchip_vad *vad = NULL;
278 struct vad_buf *vbuf;
279 snd_pcm_uframes_t vframes;
280
281 vad = substream_get_drvdata(substream);
282
283 if (!vad)
284 return 0;
285
286 vbuf = &vad->vbuf;
287
288 if (vbuf->size <= 0)
289 return 0;
290
291 vframes = samples_to_bytes(runtime, vad->channels);
292 if (vframes)
293 vframes = vbuf->size / vframes;
294 if (!vframes)
295 dev_err(vad->dev, "residue bytes: %d\n", vbuf->size);
296
297 return vframes;
298 }
299 EXPORT_SYMBOL(snd_pcm_vad_avail);
300
snd_pcm_vad_read(struct snd_pcm_substream * substream,void __user * buf,snd_pcm_uframes_t frames)301 snd_pcm_sframes_t snd_pcm_vad_read(struct snd_pcm_substream *substream,
302 void __user *buf, snd_pcm_uframes_t frames)
303 {
304 struct snd_pcm_runtime *runtime = substream->runtime;
305 struct rockchip_vad *vad = NULL;
306 struct vad_buf *vbuf;
307 snd_pcm_uframes_t avail;
308 int bytes, vbytes, frame_sz, vframe_sz, padding_sz;
309 unsigned int i;
310 void *pbuf, *sbuf;
311
312 vad = substream_get_drvdata(substream);
313
314 if (!vad)
315 return -EFAULT;
316
317 vbuf = &vad->vbuf;
318
319 avail = snd_pcm_vad_avail(substream);
320 avail = avail > frames ? frames : avail;
321 bytes = frames_to_bytes(runtime, avail);
322 if (bytes <= 0)
323 return -EFAULT;
324
325 if (vad_buffer_sort(vad) < 0) {
326 dev_err(vad->dev, "buffer sort failed\n");
327 return -EFAULT;
328 }
329
330 if (!vad->buf) {
331 vad->buf = kzalloc(bytes, GFP_KERNEL);
332 if (!vad->buf)
333 return -ENOMEM;
334 }
335
336 frame_sz = frames_to_bytes(runtime, 1);
337 vframe_sz = samples_to_bytes(runtime, vad->channels);
338 padding_sz = frame_sz - vframe_sz;
339 vbytes = vframe_sz * avail;
340 sbuf = vad->buf;
341 pbuf = vad->buf + bytes - vbytes;
342 if (!vbuf->loop) {
343 memcpy_fromio(pbuf, vbuf->pos, vbytes);
344 vbuf->pos += vbytes;
345 } else {
346 if ((vbuf->pos + vbytes) <= vbuf->end) {
347 memcpy_fromio(pbuf, vbuf->pos, vbytes);
348 vbuf->pos += vbytes;
349 } else {
350 int part1 = vbuf->end - vbuf->pos;
351 int part2 = vbytes - part1;
352
353 memcpy_fromio(pbuf, vbuf->pos, part1);
354 memcpy_fromio(pbuf + part1, vbuf->begin, part2);
355 vbuf->pos = vbuf->begin + part2;
356 }
357 }
358
359 if (padding_sz) {
360 for (i = 0; i < avail; i++) {
361 memmove(sbuf, pbuf, vframe_sz);
362 sbuf += vframe_sz;
363 pbuf += vframe_sz;
364 memset(sbuf, 0x0, padding_sz);
365 sbuf += padding_sz;
366 }
367 }
368
369 if (copy_to_user(buf, vad->buf, bytes))
370 return -EFAULT;
371
372 vbuf->size -= vbytes;
373 if (vbuf->size <= 0) {
374 kfree(vad->buf);
375 vad->buf = NULL;
376 }
377
378 return avail;
379 }
380 EXPORT_SYMBOL(snd_pcm_vad_read);
381
snd_pcm_vad_preprocess(struct snd_pcm_substream * substream,void * buf,snd_pcm_uframes_t size)382 int snd_pcm_vad_preprocess(struct snd_pcm_substream *substream,
383 void *buf, snd_pcm_uframes_t size)
384 {
385 struct snd_pcm_runtime *runtime = substream->runtime;
386 struct rockchip_vad *vad = NULL;
387 unsigned int i;
388 s16 *data;
389
390 vad = substream_get_drvdata(substream);
391
392 if (!vad)
393 return 0;
394
395 buf += samples_to_bytes(runtime, vad->audio_chnl);
396 /* retrieve the high 16bit data */
397 if (runtime->sample_bits == 32 && vad->h_16bit)
398 buf += 2;
399 for (i = 0; i < size; i++) {
400 data = buf;
401 if (vad_preprocess(*data))
402 voice_inactive_frames = 0;
403 else
404 voice_inactive_frames++;
405 buf += frames_to_bytes(runtime, 1);
406 }
407
408 vad_preprocess_update_params(&vad->uparams);
409 return 0;
410 }
411 EXPORT_SYMBOL(snd_pcm_vad_preprocess);
412
413 /**
414 * snd_pcm_vad_attached - Check whether vad is attached to substream or not
415 * @substream: PCM substream instance
416 *
417 * Result is true for attached or false for detached
418 */
snd_pcm_vad_attached(struct snd_pcm_substream * substream)419 bool snd_pcm_vad_attached(struct snd_pcm_substream *substream)
420 {
421 struct rockchip_vad *vad = NULL;
422
423 if (vad_substream == substream)
424 vad = substream_get_drvdata(substream);
425
426 if (vad && vad->vswitch)
427 return true;
428 else
429 return false;
430 }
431 EXPORT_SYMBOL(snd_pcm_vad_attached);
432
vad_memcpy_fromio(void * to,void __iomem * from,int size,int frame_sz,int padding_sz)433 static int vad_memcpy_fromio(void *to, void __iomem *from,
434 int size, int frame_sz, int padding_sz)
435 {
436 int i, step_src, step_dst, fcount;
437
438 step_src = frame_sz;
439 step_dst = frame_sz + padding_sz;
440
441 if (size % frame_sz) {
442 pr_err("%s: invalid size: %d\n", __func__, size);
443 return -EINVAL;
444 }
445
446 fcount = size / frame_sz;
447 if (padding_sz) {
448 for (i = 0; i < fcount; i++) {
449 memcpy_fromio(to, from, frame_sz);
450 to += step_dst;
451 from += step_src;
452 }
453 } else {
454 memcpy_fromio(to, from, size);
455 }
456
457 return 0;
458 }
459
460 /**
461 * snd_pcm_vad_memcpy - Copy vad data to dst
462 * @substream: PCM substream instance
463 * @buf: dst buf
464 * @frames: size in frame
465 *
466 * Result is copied frames for success or errno for fail
467 */
snd_pcm_vad_memcpy(struct snd_pcm_substream * substream,void * buf,snd_pcm_uframes_t frames)468 snd_pcm_sframes_t snd_pcm_vad_memcpy(struct snd_pcm_substream *substream,
469 void *buf, snd_pcm_uframes_t frames)
470 {
471 struct snd_pcm_runtime *runtime = substream->runtime;
472 struct rockchip_vad *vad = NULL;
473 struct vad_buf *vbuf;
474 snd_pcm_uframes_t avail;
475 int bytes, vbytes, frame_sz, vframe_sz, padding_sz;
476
477 vad = substream_get_drvdata(substream);
478
479 if (!vad)
480 return -EFAULT;
481
482 vbuf = &vad->vbuf;
483
484 avail = snd_pcm_vad_avail(substream);
485 avail = avail > frames ? frames : avail;
486 bytes = frames_to_bytes(runtime, avail);
487
488 if (bytes <= 0)
489 return -EFAULT;
490
491 if (vad_buffer_sort(vad) < 0) {
492 dev_err(vad->dev, "buffer sort failed\n");
493 return -EFAULT;
494 }
495
496 frame_sz = frames_to_bytes(runtime, 1);
497 vframe_sz = samples_to_bytes(runtime, vad->channels);
498 padding_sz = frame_sz - vframe_sz;
499 vbytes = vframe_sz * avail;
500
501 memset(buf, 0x0, bytes);
502 if (!vbuf->loop) {
503 vad_memcpy_fromio(buf, vbuf->pos, vbytes,
504 vframe_sz, padding_sz);
505 vbuf->pos += vbytes;
506 } else {
507 if ((vbuf->pos + vbytes) <= vbuf->end) {
508 vad_memcpy_fromio(buf, vbuf->pos, vbytes,
509 vframe_sz, padding_sz);
510 vbuf->pos += vbytes;
511 } else {
512 int part1 = vbuf->end - vbuf->pos;
513 int part2 = vbytes - part1;
514 int offset = part1;
515
516 if (padding_sz)
517 offset = part1 / vframe_sz * frame_sz;
518 vad_memcpy_fromio(buf, vbuf->pos, part1,
519 vframe_sz, padding_sz);
520 vad_memcpy_fromio(buf + offset, vbuf->begin, part2,
521 vframe_sz, padding_sz);
522 vbuf->pos = vbuf->begin + part2;
523 }
524 }
525
526 vbuf->size -= vbytes;
527
528 return avail;
529 }
530 EXPORT_SYMBOL(snd_pcm_vad_memcpy);
531
rockchip_vad_writeable_reg(struct device * dev,unsigned int reg)532 static bool rockchip_vad_writeable_reg(struct device *dev, unsigned int reg)
533 {
534 return true;
535 }
536
rockchip_vad_readable_reg(struct device * dev,unsigned int reg)537 static bool rockchip_vad_readable_reg(struct device *dev, unsigned int reg)
538 {
539 return true;
540 }
541
rockchip_vad_volatile_reg(struct device * dev,unsigned int reg)542 static bool rockchip_vad_volatile_reg(struct device *dev, unsigned int reg)
543 {
544 switch (reg) {
545 case VAD_INT:
546 case VAD_RAM_CUR_ADDR:
547 case VAD_DET_CON5:
548 case VAD_SAMPLE_CNT:
549 return true;
550 default:
551 return false;
552 }
553 }
554
555 static const struct reg_default rk1808_vad_reg_defaults[] = {
556 {VAD_CTRL, 0x03000000},
557 {VAD_DET_CON0, 0x01024008},
558 {VAD_DET_CON1, 0x04ff0064},
559 {VAD_DET_CON2, 0x3bf5e663},
560 {VAD_DET_CON3, 0x3bf58817},
561 {VAD_DET_CON4, 0x382b8858},
562 };
563
564 static const struct reg_default rk3308_vad_reg_defaults[] = {
565 {VAD_CTRL, 0x03000000},
566 {VAD_DET_CON0, 0x00024020},
567 {VAD_DET_CON1, 0x00ff0064},
568 {VAD_DET_CON2, 0x3bf5e663},
569 {VAD_DET_CON3, 0x3bf58817},
570 {VAD_DET_CON4, 0x382b8858},
571 {VAD_RAM_BEGIN_ADDR, 0xfff88000},
572 {VAD_RAM_END_ADDR, 0xfffbfff8},
573 };
574
575 static const struct regmap_config rk1808_vad_regmap_config = {
576 .reg_bits = 32,
577 .reg_stride = 4,
578 .val_bits = 32,
579 .max_register = VAD_NOISE_DATA,
580 .reg_defaults = rk1808_vad_reg_defaults,
581 .num_reg_defaults = ARRAY_SIZE(rk1808_vad_reg_defaults),
582 .writeable_reg = rockchip_vad_writeable_reg,
583 .readable_reg = rockchip_vad_readable_reg,
584 .volatile_reg = rockchip_vad_volatile_reg,
585 .cache_type = REGCACHE_FLAT,
586 };
587
588 static const struct regmap_config rk3308_vad_regmap_config = {
589 .reg_bits = 32,
590 .reg_stride = 4,
591 .val_bits = 32,
592 .max_register = VAD_INT,
593 .reg_defaults = rk3308_vad_reg_defaults,
594 .num_reg_defaults = ARRAY_SIZE(rk3308_vad_reg_defaults),
595 .writeable_reg = rockchip_vad_writeable_reg,
596 .readable_reg = rockchip_vad_readable_reg,
597 .volatile_reg = rockchip_vad_volatile_reg,
598 .cache_type = REGCACHE_FLAT,
599 };
600
601 static const struct audio_src_addr_map rk1808_addr_map[] = {
602 { 1, RK1808_I2S0 },
603 { 3, RK1808_I2S1 },
604 { 4, RK1808_PDM },
605 { /* sentinel */ },
606 };
607
608 static const struct audio_src_addr_map rk3308_addr_map[] = {
609 { 0, RK3308_I2S_8CH_0 },
610 { 1, RK3308_I2S_8CH_1 },
611 { 2, RK3308_I2S_8CH_2 },
612 { 3, RK3308_I2S_8CH_3 },
613 { 4, RK3308_PDM_8CH },
614 { /* sentinel */ },
615 };
616
617 static const struct audio_src_addr_map rk3568_addr_map[] = {
618 { 0, RK3568_I2S_8CH_1 },
619 { 1, RK3568_I2S_2CH_2 },
620 { 2, RK3568_I2S_2CH_3 },
621 { 3, RK3568_PDM },
622 { /* sentinel */ },
623 };
624
625 static const struct audio_src_addr_map rk3588_addr_map[] = {
626 { 0, RK3588_PDM0 },
627 { 1, RK3588_I2S1_8CH },
628 { /* sentinel */ },
629 };
630
631 static const struct vad_soc_data rk1808es_soc_data = {
632 .version = VAD_RK1808ES,
633 .map = rk1808_addr_map,
634 };
635
636 static const struct vad_soc_data rk1808_soc_data = {
637 .version = VAD_RK1808,
638 .map = rk1808_addr_map,
639 };
640
641 static const struct vad_soc_data rk3308_soc_data = {
642 .version = VAD_RK3308,
643 .map = rk3308_addr_map,
644 };
645
646 static const struct vad_soc_data rk3568_soc_data = {
647 .version = VAD_RK1808,
648 .map = rk3568_addr_map,
649 };
650
651 static const struct vad_soc_data rk3588_soc_data = {
652 .version = VAD_RK1808,
653 .map = rk3588_addr_map,
654 };
655
rockchip_vad_get_audio_src_address(struct rockchip_vad * vad,u32 addr)656 static int rockchip_vad_get_audio_src_address(struct rockchip_vad *vad,
657 u32 addr)
658 {
659 const struct audio_src_addr_map *map = vad->soc_data->map;
660
661 for (; map->addr; map++) {
662 if ((map->addr & 0xffff0000) == addr) {
663 vad->audio_src = map->id;
664 vad->audio_src_addr = map->addr;
665 return 0;
666 }
667 }
668
669 return -ENODEV;
670 }
671
rockchip_vad_irq(int irqno,void * dev_id)672 static irqreturn_t rockchip_vad_irq(int irqno, void *dev_id)
673 {
674 struct rockchip_vad *vad = dev_id;
675 unsigned int val;
676
677 regmap_read(vad->regmap, VAD_INT, &val);
678 regmap_write(vad->regmap, VAD_INT, val);
679
680 dev_dbg(vad->dev, "irq 0x%08x\n", val);
681
682 return IRQ_HANDLED;
683 }
684
685 static const struct reg_sequence rockchip_vad_acodec_adc_enable[] = {
686 { VAD_OD_ADDR0, 0x36261606 },
687 { VAD_D_DATA0, 0x51515151 },
688 { VAD_OD_ADDR1, 0x30201000 },
689 { VAD_D_DATA1, 0xbbbbbbbb },
690 { VAD_OD_ADDR2, 0x32221202 },
691 { VAD_D_DATA2, 0x11111111 },
692 { VAD_OD_ADDR3, 0x35251505 },
693 { VAD_D_DATA3, 0x77777777 },
694 { VAD_OD_ADDR4, 0x32221202 },
695 { VAD_D_DATA4, 0x33333333 },
696 { VAD_OD_ADDR5, 0x30201000 },
697 { VAD_D_DATA5, 0xffffffff },
698 { VAD_OD_ADDR6, 0x32221202 },
699 { VAD_D_DATA6, 0x77777777 },
700 };
701
rockchip_vad_config_acodec(struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)702 static int rockchip_vad_config_acodec(struct snd_pcm_hw_params *params,
703 struct snd_soc_dai *dai)
704 {
705 struct snd_soc_component *component = dai->component;
706 struct rockchip_vad *vad = snd_soc_component_get_drvdata(component);
707 unsigned int val = 0;
708
709 if (!vad->acodec_cfg)
710 return 0;
711
712 val = ACODEC_BASE + ACODEC_ADC_ANA_CON0;
713 regmap_write(vad->regmap, VAD_ID_ADDR, val);
714
715 regmap_multi_reg_write(vad->regmap, rockchip_vad_acodec_adc_enable,
716 ARRAY_SIZE(rockchip_vad_acodec_adc_enable));
717
718 regmap_update_bits(vad->regmap, VAD_CTRL, ACODE_CFG_REG_NUM_MASK,
719 ACODE_CFG_REG_NUM(ACODEC_REG_NUM));
720 regmap_update_bits(vad->regmap, VAD_CTRL, CFG_ACODE_AFTER_DET_EN_MASK,
721 CFG_ACODE_AFTER_DET_EN);
722
723 return 0;
724 }
725
rockchip_vad_find_dai(struct device_node * np)726 static struct snd_soc_dai *rockchip_vad_find_dai(struct device_node *np)
727 {
728 struct snd_soc_dai_link_component dai_component = { 0 };
729
730 dai_component.of_node = np;
731
732 return snd_soc_find_dai_with_mutex(&dai_component);
733 }
734
hw_refine_channels(struct snd_pcm_hw_params * params,unsigned int channel)735 static void hw_refine_channels(struct snd_pcm_hw_params *params,
736 unsigned int channel)
737 {
738 struct snd_interval *c =
739 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
740
741 c->min = channel;
742 c->max = channel;
743 }
744
rockchip_vad_params_fixup(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)745 static void rockchip_vad_params_fixup(struct snd_pcm_substream *substream,
746 struct snd_pcm_hw_params *params,
747 struct snd_soc_dai *dai)
748 {
749 struct rockchip_vad *vad = snd_soc_component_get_drvdata(dai->component);
750 struct snd_soc_pcm_runtime *rtd = substream->private_data;
751 struct snd_soc_dai *cpu_dai, *audio_src_dai;
752 struct device_node *np;
753 struct rk_mdais_dev *mdais;
754 unsigned int *channel_maps;
755 int i;
756
757 cpu_dai = asoc_rtd_to_cpu(rtd, 0);
758 vad->cpu_dai = cpu_dai;
759 vad->substream = substream;
760 np = cpu_dai->dev->of_node;
761 if (of_device_is_compatible(np, "rockchip,multi-dais")) {
762 audio_src_dai = rockchip_vad_find_dai(vad->audio_node);
763 mdais = snd_soc_dai_get_drvdata(cpu_dai);
764 channel_maps = mdais->capture_channel_maps;
765 for (i = 0; i < mdais->num_dais; i++) {
766 if (audio_src_dai == mdais->dais[i].dai &&
767 channel_maps[i])
768 hw_refine_channels(params, channel_maps[i]);
769 }
770 }
771 }
772
rockchip_vad_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)773 static int rockchip_vad_hw_params(struct snd_pcm_substream *substream,
774 struct snd_pcm_hw_params *params,
775 struct snd_soc_dai *dai)
776 {
777 struct snd_soc_component *component = dai->component;
778 struct rockchip_vad *vad = snd_soc_component_get_drvdata(component);
779 unsigned int val = 0, mask = 0, frame_bytes, buf_time;
780
781 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
782 return 0;
783
784 rockchip_vad_params_fixup(substream, params, dai);
785 vad->channels = params_channels(params);
786 switch (params_format(params)) {
787 case SNDRV_PCM_FORMAT_S16_LE:
788 val = AUDIO_CHNL_16B;
789 vad->sample_bytes = 2;
790 break;
791 case SNDRV_PCM_FORMAT_S24_LE:
792 case SNDRV_PCM_FORMAT_S32_LE:
793 val = AUDIO_CHNL_24B;
794 vad->sample_bytes = 4;
795 break;
796 default:
797 return -EINVAL;
798 }
799
800 regmap_update_bits(vad->regmap, VAD_CTRL, AUDIO_CHNL_BW_MASK, val);
801 regmap_update_bits(vad->regmap, VAD_CTRL, AUDIO_CHNL_NUM_MASK,
802 AUDIO_CHNL_NUM(params_channels(params)));
803
804 val = SRC_ADDR_MODE_INC | SRC_BURST_INCR;
805 mask = SRC_ADDR_MODE_MASK | SRC_BURST_MASK | INCR_BURST_LEN_MASK;
806 switch (params_channels(params)) {
807 case 8:
808 /* fallthrough */
809 case 6:
810 /* fallthrough */
811 case 4:
812 /* fallthrough */
813 case 2:
814 val |= INCR_BURST_LEN(params_channels(params));
815 break;
816 default:
817 return -EINVAL;
818 }
819
820 if (vad->version == VAD_RK1808ES) {
821 val = SRC_ADDR_MODE_INC | SRC_BURST_INCR16;
822 mask = SRC_ADDR_MODE_MASK | SRC_BURST_MASK | SRC_BURST_NUM_MASK;
823 if (params_channels(params) == 6)
824 val |= SRC_BURST_NUM(3);
825 }
826 regmap_update_bits(vad->regmap, VAD_CTRL, mask, val);
827
828 /* calculate buffer space according buffer time */
829 if (vad->buffer_time) {
830 frame_bytes = snd_pcm_format_size(params_format(params),
831 params_channels(params));
832
833 buf_time = vad->memphy_end - vad->memphy + 0x8;
834 buf_time *= 1000;
835 buf_time /= (frame_bytes * params_rate(params));
836 if (buf_time < vad->buffer_time)
837 dev_info(vad->dev, "max buffer time: %u ms.\n", buf_time);
838 buf_time = min(buf_time, vad->buffer_time);
839
840 val = params_rate(params) * buf_time / 1000;
841 if (vad->version == VAD_RK1808ES)
842 val &= ~0xf; /* 16 align */
843 val *= frame_bytes;
844 val += vad->memphy;
845 val -= 0x8;
846 if (val < vad->memphy || val > vad->memphy_end)
847 return -EINVAL;
848 regmap_write(vad->regmap, VAD_RAM_END_ADDR, val);
849 }
850
851 /*
852 * config acodec
853 * audio_src 2/3 is connected to acodec
854 */
855 val = vad->audio_src >> AUDIO_SRC_SEL_SHIFT;
856 if (val == 2 || val == 3)
857 rockchip_vad_config_acodec(params, dai);
858
859 return 0;
860 }
861
rockchip_vad_enable_cpudai(struct rockchip_vad * vad)862 static int rockchip_vad_enable_cpudai(struct rockchip_vad *vad)
863 {
864 struct snd_soc_dai *cpu_dai;
865 struct snd_pcm_substream *substream;
866 int ret = 0;
867
868 cpu_dai = vad->cpu_dai;
869 substream = vad->substream;
870
871 if (!cpu_dai || !substream)
872 return 0;
873
874 pm_runtime_get_sync(cpu_dai->dev);
875 if (cpu_dai->driver->ops) {
876 if (cpu_dai->driver->ops->startup)
877 ret = cpu_dai->driver->ops->startup(substream,
878 cpu_dai);
879
880 if (cpu_dai->driver->ops->prepare)
881 ret |= cpu_dai->driver->ops->prepare(substream,
882 cpu_dai);
883
884 if (cpu_dai->driver->ops->trigger)
885 ret |= cpu_dai->driver->ops->trigger(substream,
886 SNDRV_PCM_TRIGGER_START,
887 cpu_dai);
888 }
889
890 return ret;
891 }
892
rockchip_vad_disable_cpudai(struct rockchip_vad * vad)893 static int rockchip_vad_disable_cpudai(struct rockchip_vad *vad)
894 {
895 struct snd_soc_dai *cpu_dai;
896 struct snd_pcm_substream *substream;
897 int ret = 0;
898
899 cpu_dai = vad->cpu_dai;
900 substream = vad->substream;
901
902 if (!cpu_dai || !substream)
903 return 0;
904
905 pm_runtime_get_sync(cpu_dai->dev);
906
907 if (cpu_dai->driver->ops && cpu_dai->driver->ops->trigger)
908 ret = cpu_dai->driver->ops->trigger(substream,
909 SNDRV_PCM_TRIGGER_STOP,
910 cpu_dai);
911
912 pm_runtime_put(cpu_dai->dev);
913 return ret;
914 }
915
rockchip_vad_pcm_startup(struct snd_pcm_substream * substream,struct snd_soc_dai * dai)916 static int rockchip_vad_pcm_startup(struct snd_pcm_substream *substream,
917 struct snd_soc_dai *dai)
918 {
919 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
920 return 0;
921
922 vad_substream = substream;
923
924 return 0;
925 }
926
rockchip_vad_pcm_shutdown(struct snd_pcm_substream * substream,struct snd_soc_dai * dai)927 static void rockchip_vad_pcm_shutdown(struct snd_pcm_substream *substream,
928 struct snd_soc_dai *dai)
929 {
930 struct snd_soc_component *component = dai->component;
931 struct rockchip_vad *vad = snd_soc_component_get_drvdata(component);
932
933 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
934 return;
935
936 if (vad->vswitch) {
937 rockchip_vad_enable_cpudai(vad);
938 rockchip_vad_setup(vad);
939 }
940
941 vad_substream = NULL;
942 }
943
rockchip_vad_trigger(struct snd_pcm_substream * substream,int cmd,struct snd_soc_dai * dai)944 static int rockchip_vad_trigger(struct snd_pcm_substream *substream, int cmd,
945 struct snd_soc_dai *dai)
946 {
947 struct snd_soc_component *component = dai->component;
948 struct rockchip_vad *vad = snd_soc_component_get_drvdata(component);
949
950 switch (cmd) {
951 case SNDRV_PCM_TRIGGER_START:
952 case SNDRV_PCM_TRIGGER_RESUME:
953 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
954 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
955 return 0;
956 rockchip_vad_stop(vad);
957 break;
958 case SNDRV_PCM_TRIGGER_STOP:
959 case SNDRV_PCM_TRIGGER_SUSPEND:
960 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
961 break;
962 default:
963 break;
964 }
965
966 return 0;
967 }
968
969 static struct snd_soc_dai_ops rockchip_vad_dai_ops = {
970 .hw_params = rockchip_vad_hw_params,
971 .shutdown = rockchip_vad_pcm_shutdown,
972 .startup = rockchip_vad_pcm_startup,
973 .trigger = rockchip_vad_trigger,
974 };
975
976 static struct snd_soc_dai_driver vad_dai = {
977 .name = "vad",
978 .playback = {
979 .stream_name = "Playback",
980 .channels_min = 1,
981 .channels_max = 8,
982 .rates = VAD_RATES,
983 .formats = VAD_FORMATS,
984 },
985 .capture = {
986 .stream_name = "Capture",
987 .channels_min = 1,
988 .channels_max = 8,
989 .rates = VAD_RATES,
990 .formats = VAD_FORMATS,
991 },
992 .ops = &rockchip_vad_dai_ops,
993 };
994
rockchip_vad_switch_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)995 static int rockchip_vad_switch_info(struct snd_kcontrol *kcontrol,
996 struct snd_ctl_elem_info *uinfo)
997 {
998 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
999 uinfo->count = 1;
1000 uinfo->value.integer.min = 0;
1001 uinfo->value.integer.max = 1;
1002
1003 return 0;
1004 }
1005
rockchip_vad_switch_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1006 static int rockchip_vad_switch_get(struct snd_kcontrol *kcontrol,
1007 struct snd_ctl_elem_value *ucontrol)
1008 {
1009 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
1010 struct rockchip_vad *vad = snd_soc_component_get_drvdata(component);
1011
1012 ucontrol->value.integer.value[0] = vad->vswitch;
1013
1014 return 0;
1015 }
1016
rockchip_vad_switch_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1017 static int rockchip_vad_switch_put(struct snd_kcontrol *kcontrol,
1018 struct snd_ctl_elem_value *ucontrol)
1019 {
1020 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
1021 struct rockchip_vad *vad = snd_soc_component_get_drvdata(component);
1022 int val;
1023
1024 val = ucontrol->value.integer.value[0];
1025 if (val && !vad->vswitch) {
1026 vad->vswitch = true;
1027 } else if (!val && vad->vswitch) {
1028 vad->vswitch = false;
1029
1030 regmap_read(vad->regmap, VAD_CTRL, &val);
1031 if ((val & VAD_EN_MASK) == VAD_DISABLE)
1032 return 0;
1033 rockchip_vad_stop(vad);
1034 rockchip_vad_disable_cpudai(vad);
1035 /* this case we don't need vad data */
1036 vad->vbuf.size = 0;
1037 }
1038
1039 return 0;
1040 }
1041
1042 #define SOC_ROCKCHIP_VAD_SWITCH_DECL(xname) \
1043 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
1044 .info = rockchip_vad_switch_info, .get = rockchip_vad_switch_get, \
1045 .put = rockchip_vad_switch_put, }
1046
1047 static const struct snd_kcontrol_new rockchip_vad_dapm_controls[] = {
1048 SOC_ROCKCHIP_VAD_SWITCH_DECL("vad switch"),
1049 };
1050
1051 static const struct snd_soc_component_driver soc_vad_codec = {
1052 .controls = rockchip_vad_dapm_controls,
1053 .num_controls = ARRAY_SIZE(rockchip_vad_dapm_controls),
1054 };
1055
1056 #if defined(CONFIG_DEBUG_FS)
1057 #include <linux/fs.h>
1058 #include <linux/debugfs.h>
1059 #include <linux/seq_file.h>
1060
rockchip_vad_debugfs_reg_show(struct seq_file * s,void * v)1061 static int rockchip_vad_debugfs_reg_show(struct seq_file *s, void *v)
1062 {
1063 struct rockchip_vad *vad = s->private;
1064 unsigned int i;
1065 unsigned int val;
1066 unsigned int max_register;
1067
1068 if (vad->version == VAD_RK1808 ||
1069 vad->version == VAD_RK1808ES)
1070 max_register = VAD_NOISE_DATA;
1071 else
1072 max_register = VAD_INT;
1073 for (i = VAD_CTRL; i <= max_register; i += 4) {
1074 regmap_read(vad->regmap, i, &val);
1075 if (!(i % 16))
1076 seq_printf(s, "\n%08x: ", i);
1077 seq_printf(s, "%08x ", val);
1078 }
1079
1080 return 0;
1081 }
1082
rockchip_vad_debugfs_reg_write(struct file * file,const char __user * buf,size_t count,loff_t * ppos)1083 static ssize_t rockchip_vad_debugfs_reg_write(struct file *file,
1084 const char __user *buf,
1085 size_t count, loff_t *ppos)
1086 {
1087 struct rockchip_vad *vad = ((struct seq_file *)file->private_data)->private;
1088 unsigned int reg, val;
1089 char kbuf[24];
1090
1091 if (count >= sizeof(kbuf))
1092 return -EINVAL;
1093
1094 if (copy_from_user(kbuf, buf, count))
1095 return -EFAULT;
1096 kbuf[count] = '\0';
1097 if (sscanf(kbuf, "%x %x", ®, &val) != 2)
1098 return -EFAULT;
1099
1100 regmap_write(vad->regmap, reg, val);
1101
1102 return count;
1103 }
1104
rockchip_vad_debugfs_open(struct inode * inode,struct file * file)1105 static int rockchip_vad_debugfs_open(struct inode *inode, struct file *file)
1106 {
1107 return single_open(file, rockchip_vad_debugfs_reg_show, inode->i_private);
1108 }
1109
1110 static const struct file_operations rockchip_vad_reg_debugfs_fops = {
1111 .owner = THIS_MODULE,
1112 .open = rockchip_vad_debugfs_open,
1113 .read = seq_read,
1114 .write = rockchip_vad_debugfs_reg_write,
1115 .llseek = seq_lseek,
1116 .release = single_release,
1117 };
1118 #endif
1119
rockchip_vad_init(struct rockchip_vad * vad)1120 static void rockchip_vad_init(struct rockchip_vad *vad)
1121 {
1122 unsigned int val, mask;
1123
1124 regmap_write(vad->regmap, VAD_RAM_BEGIN_ADDR, vad->memphy);
1125 regmap_write(vad->regmap, VAD_RAM_END_ADDR, vad->memphy_end);
1126 vad->vbuf.begin = vad->membase;
1127 regmap_write(vad->regmap, VAD_IS_ADDR, vad->audio_src_addr);
1128
1129 val = VAD_DET_CHNL(vad->audio_chnl);
1130 val |= vad->audio_src;
1131 val |= vad->mode << VAD_MODE_SHIFT;
1132 mask = VAD_DET_CHNL_MASK | AUDIO_SRC_SEL_MASK |
1133 VAD_MODE_MASK;
1134
1135 regmap_update_bits(vad->regmap, VAD_CTRL, mask, val);
1136 if (vad->version == VAD_RK1808 ||
1137 vad->version == VAD_RK1808ES) {
1138 regmap_update_bits(vad->regmap, VAD_AUX_CONTROL,
1139 RAM_ITF_EN_MASK | BUS_WRITE_EN_MASK,
1140 RAM_ITF_DIS | BUS_WRITE_EN);
1141 regmap_update_bits(vad->regmap, VAD_AUX_CONTROL,
1142 SAMPLE_CNT_EN_MASK, SAMPLE_CNT_EN);
1143 }
1144 }
1145
1146 static const struct of_device_id rockchip_vad_match[] = {
1147 { .compatible = "rockchip,rk1808es-vad", .data = &rk1808es_soc_data },
1148 { .compatible = "rockchip,rk1808-vad", .data = &rk1808_soc_data },
1149 { .compatible = "rockchip,rk3308-vad", .data = &rk3308_soc_data },
1150 { .compatible = "rockchip,rk3568-vad", .data = &rk3568_soc_data },
1151 { .compatible = "rockchip,rk3588-vad", .data = &rk3588_soc_data },
1152 {},
1153 };
1154
rockchip_vad_probe(struct platform_device * pdev)1155 static int rockchip_vad_probe(struct platform_device *pdev)
1156 {
1157 struct device_node *np = pdev->dev.of_node;
1158 struct device_node *asrc_np = NULL;
1159 struct device_node *sram_np = NULL;
1160 const struct of_device_id *match;
1161 const struct regmap_config *regmap_config;
1162 struct rockchip_vad *vad;
1163 struct resource *res;
1164 struct resource audio_res;
1165 struct resource sram_res;
1166 void __iomem *regbase;
1167 int irq;
1168 int ret;
1169
1170 vad = devm_kzalloc(&pdev->dev, sizeof(*vad), GFP_KERNEL);
1171 if (!vad)
1172 return -ENOMEM;
1173
1174 vad->dev = &pdev->dev;
1175
1176 match = of_match_device(rockchip_vad_match, &pdev->dev);
1177 if (!match || !match->data)
1178 return -EINVAL;
1179
1180 vad->soc_data = (struct vad_soc_data *)match->data;
1181 vad->version = vad->soc_data->version;
1182
1183 switch (vad->version) {
1184 case VAD_RK1808:
1185 case VAD_RK1808ES:
1186 regmap_config = &rk1808_vad_regmap_config;
1187 break;
1188 case VAD_RK3308:
1189 regmap_config = &rk3308_vad_regmap_config;
1190 break;
1191 default:
1192 return -EINVAL;
1193 }
1194
1195 vad->acodec_cfg = of_property_read_bool(np, "rockchip,acodec-cfg");
1196 of_property_read_u32(np, "rockchip,mode", &vad->mode);
1197 of_property_read_u32(np, "rockchip,det-channel", &vad->audio_chnl);
1198 of_property_read_u32(np, "rockchip,buffer-time-ms", &vad->buffer_time);
1199
1200 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vad");
1201 regbase = devm_ioremap_resource(&pdev->dev, res);
1202 if (IS_ERR(regbase))
1203 return PTR_ERR(regbase);
1204
1205 sram_np = of_parse_phandle(np, "rockchip,audio-sram", 0);
1206 if (!sram_np) {
1207 dev_err(&pdev->dev, "could not find sram dt node\n");
1208 return -ENODEV;
1209 }
1210
1211 asrc_np = of_parse_phandle(np, "rockchip,audio-src", 0);
1212 if (!asrc_np) {
1213 ret = -ENODEV;
1214 goto err_phandle;
1215 }
1216
1217 ret = of_address_to_resource(asrc_np, 0, &audio_res);
1218 if (ret)
1219 goto err_phandle;
1220 ret = rockchip_vad_get_audio_src_address(vad, audio_res.start);
1221 if (ret)
1222 goto err_phandle;
1223 vad->audio_node = asrc_np;
1224 vad->audio_src <<= AUDIO_SRC_SEL_SHIFT;
1225
1226 ret = of_address_to_resource(sram_np, 0, &sram_res);
1227 if (ret)
1228 goto err_phandle;
1229 vad->memphy = sram_res.start;
1230 vad->memphy_end = sram_res.start + resource_size(&sram_res) - 0x8;
1231 vad->membase = devm_ioremap(&pdev->dev, sram_res.start,
1232 resource_size(&sram_res));
1233 if (!vad->membase) {
1234 ret = -ENOMEM;
1235 goto err_phandle;
1236 }
1237
1238 if (IS_ERR(vad->membase)) {
1239 ret = PTR_ERR(vad->membase);
1240 goto err_phandle;
1241 }
1242
1243 vad->hclk = devm_clk_get(&pdev->dev, "hclk");
1244 if (IS_ERR(vad->hclk)) {
1245 ret = PTR_ERR(vad->hclk);
1246 goto err_phandle;
1247 }
1248
1249 ret = clk_prepare_enable(vad->hclk);
1250 if (ret)
1251 goto err_phandle;
1252
1253 vad->regmap = devm_regmap_init_mmio(&pdev->dev, regbase,
1254 regmap_config);
1255 if (IS_ERR(vad->regmap)) {
1256 ret = PTR_ERR(vad->regmap);
1257 goto err;
1258 }
1259
1260 rockchip_vad_init(vad);
1261
1262 irq = platform_get_irq(pdev, 0);
1263 if (irq < 0) {
1264 ret = irq;
1265 goto err;
1266 }
1267
1268 ret = devm_request_irq(&pdev->dev, irq, rockchip_vad_irq,
1269 0, dev_name(&pdev->dev), vad);
1270 if (ret < 0)
1271 goto err;
1272
1273 #if defined(CONFIG_DEBUG_FS)
1274 vad->debugfs_dir = debugfs_create_dir("vad", NULL);
1275 if (IS_ERR(vad->debugfs_dir))
1276 dev_err(&pdev->dev, "failed to create debugfs dir for vad!\n");
1277 else
1278 debugfs_create_file("reg", 0644, vad->debugfs_dir, vad,
1279 &rockchip_vad_reg_debugfs_fops);
1280 #endif
1281
1282 platform_set_drvdata(pdev, vad);
1283 ret = snd_soc_register_component(&pdev->dev, &soc_vad_codec,
1284 &vad_dai, 1);
1285 if (ret)
1286 goto err;
1287
1288 of_node_put(sram_np);
1289
1290 return 0;
1291 err:
1292 clk_disable_unprepare(vad->hclk);
1293 err_phandle:
1294 of_node_put(sram_np);
1295 of_node_put(asrc_np);
1296 return ret;
1297 }
1298
rockchip_vad_remove(struct platform_device * pdev)1299 static int rockchip_vad_remove(struct platform_device *pdev)
1300 {
1301 struct rockchip_vad *vad = dev_get_drvdata(&pdev->dev);
1302
1303 if (!IS_ERR(vad->hclk))
1304 clk_disable_unprepare(vad->hclk);
1305 of_node_put(vad->audio_node);
1306 snd_soc_unregister_component(&pdev->dev);
1307 return 0;
1308 }
1309
1310 static struct platform_driver rockchip_vad_driver = {
1311 .probe = rockchip_vad_probe,
1312 .remove = rockchip_vad_remove,
1313 .driver = {
1314 .name = DRV_NAME,
1315 .of_match_table = of_match_ptr(rockchip_vad_match),
1316 },
1317 };
1318 module_platform_driver(rockchip_vad_driver);
1319
1320 MODULE_DESCRIPTION("Rockchip VAD Controller");
1321 MODULE_AUTHOR("Andy Yan <andy.yan@rock-chips.com>");
1322 MODULE_AUTHOR("Sugar Zhang <sugar.zhang@rock-chips.com>");
1323 MODULE_LICENSE("GPL v2");
1324 MODULE_ALIAS("platform:" DRV_NAME);
1325 MODULE_DEVICE_TABLE(of, rockchip_vad_match);
1326