This source file includes following definitions.
- __rsnd_dmaen_complete
- rsnd_dmaen_complete
- rsnd_dmaen_request_channel
- rsnd_dmaen_stop
- rsnd_dmaen_cleanup
- rsnd_dmaen_prepare
- rsnd_dmaen_start
- rsnd_dma_request_channel
- rsnd_dmaen_attach
- rsnd_dmaen_pointer
- rsnd_dmapp_get_id
- rsnd_dmapp_get_chcr
- rsnd_dmapp_write
- rsnd_dmapp_read
- rsnd_dmapp_bset
- rsnd_dmapp_stop
- rsnd_dmapp_start
- rsnd_dmapp_attach
- rsnd_gen2_dma_addr
- rsnd_dma_addr
- rsnd_dma_of_path
- rsnd_dma_alloc
- rsnd_dma_attach
- rsnd_dma_probe
1
2
3
4
5
6
7
8 #include <linux/delay.h>
9 #include <linux/of_dma.h>
10 #include "rsnd.h"
11
12
13
14
15 #define PDMASAR 0x00
16 #define PDMADAR 0x04
17 #define PDMACHCR 0x0c
18
19
20 #define PDMACHCR_DE (1 << 0)
21
22
23 struct rsnd_dmaen {
24 struct dma_chan *chan;
25 dma_cookie_t cookie;
26 unsigned int dma_len;
27 };
28
29 struct rsnd_dmapp {
30 int dmapp_id;
31 u32 chcr;
32 };
33
34 struct rsnd_dma {
35 struct rsnd_mod mod;
36 struct rsnd_mod *mod_from;
37 struct rsnd_mod *mod_to;
38 dma_addr_t src_addr;
39 dma_addr_t dst_addr;
40 union {
41 struct rsnd_dmaen en;
42 struct rsnd_dmapp pp;
43 } dma;
44 };
45
46 struct rsnd_dma_ctrl {
47 void __iomem *base;
48 int dmaen_num;
49 int dmapp_num;
50 };
51
52 #define rsnd_priv_to_dmac(p) ((struct rsnd_dma_ctrl *)(p)->dma)
53 #define rsnd_mod_to_dma(_mod) container_of((_mod), struct rsnd_dma, mod)
54 #define rsnd_dma_to_dmaen(dma) (&(dma)->dma.en)
55 #define rsnd_dma_to_dmapp(dma) (&(dma)->dma.pp)
56
57
58 static struct rsnd_mod_ops mem_ops = {
59 .name = "mem",
60 };
61
62 static struct rsnd_mod mem = {
63 };
64
65
66
67
68 static void __rsnd_dmaen_complete(struct rsnd_mod *mod,
69 struct rsnd_dai_stream *io)
70 {
71 if (rsnd_io_is_working(io))
72 rsnd_dai_period_elapsed(io);
73 }
74
75 static void rsnd_dmaen_complete(void *data)
76 {
77 struct rsnd_mod *mod = data;
78
79 rsnd_mod_interrupt(mod, __rsnd_dmaen_complete);
80 }
81
82 static struct dma_chan *rsnd_dmaen_request_channel(struct rsnd_dai_stream *io,
83 struct rsnd_mod *mod_from,
84 struct rsnd_mod *mod_to)
85 {
86 if ((!mod_from && !mod_to) ||
87 (mod_from && mod_to))
88 return NULL;
89
90 if (mod_from)
91 return rsnd_mod_dma_req(io, mod_from);
92 else
93 return rsnd_mod_dma_req(io, mod_to);
94 }
95
96 static int rsnd_dmaen_stop(struct rsnd_mod *mod,
97 struct rsnd_dai_stream *io,
98 struct rsnd_priv *priv)
99 {
100 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
101 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
102
103 if (dmaen->chan)
104 dmaengine_terminate_all(dmaen->chan);
105
106 return 0;
107 }
108
109 static int rsnd_dmaen_cleanup(struct rsnd_mod *mod,
110 struct rsnd_dai_stream *io,
111 struct rsnd_priv *priv)
112 {
113 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
114 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
115
116
117
118
119
120
121 if (dmaen->chan)
122 dma_release_channel(dmaen->chan);
123
124 dmaen->chan = NULL;
125
126 return 0;
127 }
128
129 static int rsnd_dmaen_prepare(struct rsnd_mod *mod,
130 struct rsnd_dai_stream *io,
131 struct rsnd_priv *priv)
132 {
133 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
134 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
135 struct device *dev = rsnd_priv_to_dev(priv);
136
137
138 if (dmaen->chan)
139 return 0;
140
141
142
143
144
145
146 dmaen->chan = rsnd_dmaen_request_channel(io,
147 dma->mod_from,
148 dma->mod_to);
149 if (IS_ERR_OR_NULL(dmaen->chan)) {
150 dmaen->chan = NULL;
151 dev_err(dev, "can't get dma channel\n");
152 return -EIO;
153 }
154
155 return 0;
156 }
157
158 static int rsnd_dmaen_start(struct rsnd_mod *mod,
159 struct rsnd_dai_stream *io,
160 struct rsnd_priv *priv)
161 {
162 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
163 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
164 struct snd_pcm_substream *substream = io->substream;
165 struct device *dev = rsnd_priv_to_dev(priv);
166 struct dma_async_tx_descriptor *desc;
167 struct dma_slave_config cfg = {};
168 int is_play = rsnd_io_is_play(io);
169 int ret;
170
171 cfg.direction = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
172 cfg.src_addr = dma->src_addr;
173 cfg.dst_addr = dma->dst_addr;
174 cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
175 cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
176
177 dev_dbg(dev, "%s %pad -> %pad\n",
178 rsnd_mod_name(mod),
179 &cfg.src_addr, &cfg.dst_addr);
180
181 ret = dmaengine_slave_config(dmaen->chan, &cfg);
182 if (ret < 0)
183 return ret;
184
185 desc = dmaengine_prep_dma_cyclic(dmaen->chan,
186 substream->runtime->dma_addr,
187 snd_pcm_lib_buffer_bytes(substream),
188 snd_pcm_lib_period_bytes(substream),
189 is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM,
190 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
191
192 if (!desc) {
193 dev_err(dev, "dmaengine_prep_slave_sg() fail\n");
194 return -EIO;
195 }
196
197 desc->callback = rsnd_dmaen_complete;
198 desc->callback_param = rsnd_mod_get(dma);
199
200 dmaen->dma_len = snd_pcm_lib_buffer_bytes(substream);
201
202 dmaen->cookie = dmaengine_submit(desc);
203 if (dmaen->cookie < 0) {
204 dev_err(dev, "dmaengine_submit() fail\n");
205 return -EIO;
206 }
207
208 dma_async_issue_pending(dmaen->chan);
209
210 return 0;
211 }
212
213 struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node,
214 struct rsnd_mod *mod, char *name)
215 {
216 struct dma_chan *chan = NULL;
217 struct device_node *np;
218 int i = 0;
219
220 for_each_child_of_node(of_node, np) {
221 if (i == rsnd_mod_id_raw(mod) && (!chan))
222 chan = of_dma_request_slave_channel(np, name);
223 i++;
224 }
225
226
227 of_node_put(of_node);
228
229 return chan;
230 }
231
232 static int rsnd_dmaen_attach(struct rsnd_dai_stream *io,
233 struct rsnd_dma *dma,
234 struct rsnd_mod *mod_from, struct rsnd_mod *mod_to)
235 {
236 struct rsnd_priv *priv = rsnd_io_to_priv(io);
237 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
238 struct dma_chan *chan;
239
240
241 chan = rsnd_dmaen_request_channel(io, mod_from, mod_to);
242 if (IS_ERR_OR_NULL(chan)) {
243
244 if (PTR_ERR(chan) == -EPROBE_DEFER)
245 return PTR_ERR(chan);
246
247
248
249
250
251
252
253 return -EAGAIN;
254 }
255
256
257
258
259
260
261 io->dmac_dev = chan->device->dev;
262
263 dma_release_channel(chan);
264
265 dmac->dmaen_num++;
266
267 return 0;
268 }
269
270 static int rsnd_dmaen_pointer(struct rsnd_mod *mod,
271 struct rsnd_dai_stream *io,
272 snd_pcm_uframes_t *pointer)
273 {
274 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
275 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
276 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
277 struct dma_tx_state state;
278 enum dma_status status;
279 unsigned int pos = 0;
280
281 status = dmaengine_tx_status(dmaen->chan, dmaen->cookie, &state);
282 if (status == DMA_IN_PROGRESS || status == DMA_PAUSED) {
283 if (state.residue > 0 && state.residue <= dmaen->dma_len)
284 pos = dmaen->dma_len - state.residue;
285 }
286 *pointer = bytes_to_frames(runtime, pos);
287
288 return 0;
289 }
290
291 static struct rsnd_mod_ops rsnd_dmaen_ops = {
292 .name = "audmac",
293 .prepare = rsnd_dmaen_prepare,
294 .cleanup = rsnd_dmaen_cleanup,
295 .start = rsnd_dmaen_start,
296 .stop = rsnd_dmaen_stop,
297 .pointer = rsnd_dmaen_pointer,
298 .get_status = rsnd_mod_get_status,
299 };
300
301
302
303
304 static const u8 gen2_id_table_ssiu[] = {
305
306 0x00, 0x01, 0x02, 0x03, 0x39, 0x3a, 0x3b, 0x3c,
307
308 0x04, 0x05, 0x06, 0x07, 0x3d, 0x3e, 0x3f, 0x40,
309
310 0x08, 0x09, 0x0a, 0x0b, 0x41, 0x42, 0x43, 0x44,
311
312 0x0c, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b,
313
314 0x0d, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52,
315
316 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317
318 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319
320 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321
322 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323
324 0x12, 0x13, 0x14, 0x15, 0x53, 0x54, 0x55, 0x56,
325 };
326 static const u8 gen2_id_table_scu[] = {
327 0x2d,
328 0x2e,
329 0x2f,
330 0x30,
331 0x31,
332 0x32,
333 0x33,
334 0x34,
335 0x35,
336 0x36,
337 };
338 static const u8 gen2_id_table_cmd[] = {
339 0x37,
340 0x38,
341 };
342
343 static u32 rsnd_dmapp_get_id(struct rsnd_dai_stream *io,
344 struct rsnd_mod *mod)
345 {
346 struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io);
347 struct rsnd_mod *ssiu = rsnd_io_to_mod_ssiu(io);
348 struct rsnd_mod *src = rsnd_io_to_mod_src(io);
349 struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io);
350 const u8 *entry = NULL;
351 int id = 255;
352 int size = 0;
353
354 if ((mod == ssi) ||
355 (mod == ssiu)) {
356 int busif = rsnd_mod_id_sub(ssiu);
357
358 entry = gen2_id_table_ssiu;
359 size = ARRAY_SIZE(gen2_id_table_ssiu);
360 id = (rsnd_mod_id(mod) * 8) + busif;
361 } else if (mod == src) {
362 entry = gen2_id_table_scu;
363 size = ARRAY_SIZE(gen2_id_table_scu);
364 id = rsnd_mod_id(mod);
365 } else if (mod == dvc) {
366 entry = gen2_id_table_cmd;
367 size = ARRAY_SIZE(gen2_id_table_cmd);
368 id = rsnd_mod_id(mod);
369 }
370
371 if ((!entry) || (size <= id)) {
372 struct device *dev = rsnd_priv_to_dev(rsnd_io_to_priv(io));
373
374 dev_err(dev, "unknown connection (%s)\n", rsnd_mod_name(mod));
375
376
377 return 0x00;
378 }
379
380 return entry[id];
381 }
382
383 static u32 rsnd_dmapp_get_chcr(struct rsnd_dai_stream *io,
384 struct rsnd_mod *mod_from,
385 struct rsnd_mod *mod_to)
386 {
387 return (rsnd_dmapp_get_id(io, mod_from) << 24) +
388 (rsnd_dmapp_get_id(io, mod_to) << 16);
389 }
390
391 #define rsnd_dmapp_addr(dmac, dma, reg) \
392 (dmac->base + 0x20 + reg + \
393 (0x10 * rsnd_dma_to_dmapp(dma)->dmapp_id))
394 static void rsnd_dmapp_write(struct rsnd_dma *dma, u32 data, u32 reg)
395 {
396 struct rsnd_mod *mod = rsnd_mod_get(dma);
397 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
398 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
399 struct device *dev = rsnd_priv_to_dev(priv);
400
401 dev_dbg(dev, "w 0x%px : %08x\n", rsnd_dmapp_addr(dmac, dma, reg), data);
402
403 iowrite32(data, rsnd_dmapp_addr(dmac, dma, reg));
404 }
405
406 static u32 rsnd_dmapp_read(struct rsnd_dma *dma, u32 reg)
407 {
408 struct rsnd_mod *mod = rsnd_mod_get(dma);
409 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
410 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
411
412 return ioread32(rsnd_dmapp_addr(dmac, dma, reg));
413 }
414
415 static void rsnd_dmapp_bset(struct rsnd_dma *dma, u32 data, u32 mask, u32 reg)
416 {
417 struct rsnd_mod *mod = rsnd_mod_get(dma);
418 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
419 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
420 void __iomem *addr = rsnd_dmapp_addr(dmac, dma, reg);
421 u32 val = ioread32(addr);
422
423 val &= ~mask;
424 val |= (data & mask);
425
426 iowrite32(val, addr);
427 }
428
429 static int rsnd_dmapp_stop(struct rsnd_mod *mod,
430 struct rsnd_dai_stream *io,
431 struct rsnd_priv *priv)
432 {
433 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
434 int i;
435
436 rsnd_dmapp_bset(dma, 0, PDMACHCR_DE, PDMACHCR);
437
438 for (i = 0; i < 1024; i++) {
439 if (0 == (rsnd_dmapp_read(dma, PDMACHCR) & PDMACHCR_DE))
440 return 0;
441 udelay(1);
442 }
443
444 return -EIO;
445 }
446
447 static int rsnd_dmapp_start(struct rsnd_mod *mod,
448 struct rsnd_dai_stream *io,
449 struct rsnd_priv *priv)
450 {
451 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
452 struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma);
453
454 rsnd_dmapp_write(dma, dma->src_addr, PDMASAR);
455 rsnd_dmapp_write(dma, dma->dst_addr, PDMADAR);
456 rsnd_dmapp_write(dma, dmapp->chcr, PDMACHCR);
457
458 return 0;
459 }
460
461 static int rsnd_dmapp_attach(struct rsnd_dai_stream *io,
462 struct rsnd_dma *dma,
463 struct rsnd_mod *mod_from, struct rsnd_mod *mod_to)
464 {
465 struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma);
466 struct rsnd_priv *priv = rsnd_io_to_priv(io);
467 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
468 struct device *dev = rsnd_priv_to_dev(priv);
469
470 dmapp->dmapp_id = dmac->dmapp_num;
471 dmapp->chcr = rsnd_dmapp_get_chcr(io, mod_from, mod_to) | PDMACHCR_DE;
472
473 dmac->dmapp_num++;
474
475 dev_dbg(dev, "id/src/dst/chcr = %d/%pad/%pad/%08x\n",
476 dmapp->dmapp_id, &dma->src_addr, &dma->dst_addr, dmapp->chcr);
477
478 return 0;
479 }
480
481 static struct rsnd_mod_ops rsnd_dmapp_ops = {
482 .name = "audmac-pp",
483 .start = rsnd_dmapp_start,
484 .stop = rsnd_dmapp_stop,
485 .quit = rsnd_dmapp_stop,
486 .get_status = rsnd_mod_get_status,
487 };
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508 #define RDMA_SSI_I_N(addr, i) (addr ##_reg - 0x00300000 + (0x40 * i) + 0x8)
509 #define RDMA_SSI_O_N(addr, i) (addr ##_reg - 0x00300000 + (0x40 * i) + 0xc)
510
511 #define RDMA_SSIU_I_N(addr, i, j) (addr ##_reg - 0x00441000 + (0x1000 * (i)) + (((j) / 4) * 0xA000) + (((j) % 4) * 0x400) - (0x4000 * ((i) / 9) * ((j) / 4)))
512 #define RDMA_SSIU_O_N(addr, i, j) RDMA_SSIU_I_N(addr, i, j)
513
514 #define RDMA_SSIU_I_P(addr, i, j) (addr ##_reg - 0x00141000 + (0x1000 * (i)) + (((j) / 4) * 0xA000) + (((j) % 4) * 0x400) - (0x4000 * ((i) / 9) * ((j) / 4)))
515 #define RDMA_SSIU_O_P(addr, i, j) RDMA_SSIU_I_P(addr, i, j)
516
517 #define RDMA_SRC_I_N(addr, i) (addr ##_reg - 0x00500000 + (0x400 * i))
518 #define RDMA_SRC_O_N(addr, i) (addr ##_reg - 0x004fc000 + (0x400 * i))
519
520 #define RDMA_SRC_I_P(addr, i) (addr ##_reg - 0x00200000 + (0x400 * i))
521 #define RDMA_SRC_O_P(addr, i) (addr ##_reg - 0x001fc000 + (0x400 * i))
522
523 #define RDMA_CMD_O_N(addr, i) (addr ##_reg - 0x004f8000 + (0x400 * i))
524 #define RDMA_CMD_O_P(addr, i) (addr ##_reg - 0x001f8000 + (0x400 * i))
525
526 static dma_addr_t
527 rsnd_gen2_dma_addr(struct rsnd_dai_stream *io,
528 struct rsnd_mod *mod,
529 int is_play, int is_from)
530 {
531 struct rsnd_priv *priv = rsnd_io_to_priv(io);
532 struct device *dev = rsnd_priv_to_dev(priv);
533 phys_addr_t ssi_reg = rsnd_gen_get_phy_addr(priv, RSND_GEN2_SSI);
534 phys_addr_t src_reg = rsnd_gen_get_phy_addr(priv, RSND_GEN2_SCU);
535 int is_ssi = !!(rsnd_io_to_mod_ssi(io) == mod) ||
536 !!(rsnd_io_to_mod_ssiu(io) == mod);
537 int use_src = !!rsnd_io_to_mod_src(io);
538 int use_cmd = !!rsnd_io_to_mod_dvc(io) ||
539 !!rsnd_io_to_mod_mix(io) ||
540 !!rsnd_io_to_mod_ctu(io);
541 int id = rsnd_mod_id(mod);
542 int busif = rsnd_mod_id_sub(rsnd_io_to_mod_ssiu(io));
543 struct dma_addr {
544 dma_addr_t out_addr;
545 dma_addr_t in_addr;
546 } dma_addrs[3][2][3] = {
547
548
549 {{{ 0, 0 },
550 { RDMA_SRC_O_N(src, id), RDMA_SRC_I_P(src, id) },
551 { RDMA_CMD_O_N(src, id), RDMA_SRC_I_P(src, id) } },
552
553 {{ 0, 0, },
554 { RDMA_SRC_O_P(src, id), RDMA_SRC_I_N(src, id) },
555 { RDMA_CMD_O_P(src, id), RDMA_SRC_I_N(src, id) } }
556 },
557
558
559 {{{ RDMA_SSI_O_N(ssi, id), 0 },
560 { RDMA_SSIU_O_P(ssi, id, busif), 0 },
561 { RDMA_SSIU_O_P(ssi, id, busif), 0 } },
562
563 {{ 0, RDMA_SSI_I_N(ssi, id) },
564 { 0, RDMA_SSIU_I_P(ssi, id, busif) },
565 { 0, RDMA_SSIU_I_P(ssi, id, busif) } }
566 },
567
568
569 {{{ RDMA_SSIU_O_N(ssi, id, busif), 0 },
570 { RDMA_SSIU_O_P(ssi, id, busif), 0 },
571 { RDMA_SSIU_O_P(ssi, id, busif), 0 } },
572
573 {{ 0, RDMA_SSIU_I_N(ssi, id, busif) },
574 { 0, RDMA_SSIU_I_P(ssi, id, busif) },
575 { 0, RDMA_SSIU_I_P(ssi, id, busif) } } },
576 };
577
578
579
580
581
582
583
584 if ((id == 9) && (busif >= 4))
585 dev_err(dev, "This driver doesn't support SSI%d-%d, so far",
586 id, busif);
587
588
589 if (use_cmd && !use_src)
590 dev_err(dev, "DVC is selected without SRC\n");
591
592
593 if (is_ssi && rsnd_ssi_use_busif(io))
594 is_ssi++;
595
596 return (is_from) ?
597 dma_addrs[is_ssi][is_play][use_src + use_cmd].out_addr :
598 dma_addrs[is_ssi][is_play][use_src + use_cmd].in_addr;
599 }
600
601 static dma_addr_t rsnd_dma_addr(struct rsnd_dai_stream *io,
602 struct rsnd_mod *mod,
603 int is_play, int is_from)
604 {
605 struct rsnd_priv *priv = rsnd_io_to_priv(io);
606
607
608
609
610 if (rsnd_is_gen1(priv))
611 return 0;
612
613 if (!mod)
614 return 0;
615
616 return rsnd_gen2_dma_addr(io, mod, is_play, is_from);
617 }
618
619 #define MOD_MAX (RSND_MOD_MAX + 1)
620 static void rsnd_dma_of_path(struct rsnd_mod *this,
621 struct rsnd_dai_stream *io,
622 int is_play,
623 struct rsnd_mod **mod_from,
624 struct rsnd_mod **mod_to)
625 {
626 struct rsnd_mod *ssi;
627 struct rsnd_mod *src = rsnd_io_to_mod_src(io);
628 struct rsnd_mod *ctu = rsnd_io_to_mod_ctu(io);
629 struct rsnd_mod *mix = rsnd_io_to_mod_mix(io);
630 struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io);
631 struct rsnd_mod *mod[MOD_MAX];
632 struct rsnd_mod *mod_start, *mod_end;
633 struct rsnd_priv *priv = rsnd_mod_to_priv(this);
634 struct device *dev = rsnd_priv_to_dev(priv);
635 int nr, i, idx;
636
637
638
639
640
641
642
643
644
645
646
647 if (rsnd_ssiu_of_node(priv)) {
648 struct rsnd_mod *ssiu = rsnd_io_to_mod_ssiu(io);
649
650
651 ssi = ssiu;
652 if (this == rsnd_io_to_mod_ssi(io))
653 this = ssiu;
654 } else {
655
656 ssi = rsnd_io_to_mod_ssi(io);
657 }
658
659 if (!ssi)
660 return;
661
662 nr = 0;
663 for (i = 0; i < MOD_MAX; i++) {
664 mod[i] = NULL;
665 nr += !!rsnd_io_to_mod(io, i);
666 }
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683 mod_start = (is_play) ? NULL : ssi;
684 mod_end = (is_play) ? ssi : NULL;
685
686 idx = 0;
687 mod[idx++] = mod_start;
688 for (i = 1; i < nr; i++) {
689 if (src) {
690 mod[idx++] = src;
691 src = NULL;
692 } else if (ctu) {
693 mod[idx++] = ctu;
694 ctu = NULL;
695 } else if (mix) {
696 mod[idx++] = mix;
697 mix = NULL;
698 } else if (dvc) {
699 mod[idx++] = dvc;
700 dvc = NULL;
701 }
702 }
703 mod[idx] = mod_end;
704
705
706
707
708
709
710
711 if ((this == ssi) == (is_play)) {
712 *mod_from = mod[idx - 1];
713 *mod_to = mod[idx];
714 } else {
715 *mod_from = mod[0];
716 *mod_to = mod[1];
717 }
718
719 dev_dbg(dev, "module connection (this is %s)\n", rsnd_mod_name(this));
720 for (i = 0; i <= idx; i++) {
721 dev_dbg(dev, " %s%s\n",
722 rsnd_mod_name(mod[i] ? mod[i] : &mem),
723 (mod[i] == *mod_from) ? " from" :
724 (mod[i] == *mod_to) ? " to" : "");
725 }
726 }
727
728 static int rsnd_dma_alloc(struct rsnd_dai_stream *io, struct rsnd_mod *mod,
729 struct rsnd_mod **dma_mod)
730 {
731 struct rsnd_mod *mod_from = NULL;
732 struct rsnd_mod *mod_to = NULL;
733 struct rsnd_priv *priv = rsnd_io_to_priv(io);
734 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
735 struct device *dev = rsnd_priv_to_dev(priv);
736 struct rsnd_dma *dma;
737 struct rsnd_mod_ops *ops;
738 enum rsnd_mod_type type;
739 int (*attach)(struct rsnd_dai_stream *io, struct rsnd_dma *dma,
740 struct rsnd_mod *mod_from, struct rsnd_mod *mod_to);
741 int is_play = rsnd_io_is_play(io);
742 int ret, dma_id;
743
744
745
746
747
748
749
750 if (!dmac)
751 return -EAGAIN;
752
753 rsnd_dma_of_path(mod, io, is_play, &mod_from, &mod_to);
754
755
756 if (mod_from && mod_to) {
757 ops = &rsnd_dmapp_ops;
758 attach = rsnd_dmapp_attach;
759 dma_id = dmac->dmapp_num;
760 type = RSND_MOD_AUDMAPP;
761 } else {
762 ops = &rsnd_dmaen_ops;
763 attach = rsnd_dmaen_attach;
764 dma_id = dmac->dmaen_num;
765 type = RSND_MOD_AUDMA;
766 }
767
768
769 if (rsnd_is_gen1(priv)) {
770 ops = &rsnd_dmaen_ops;
771 attach = rsnd_dmaen_attach;
772 dma_id = dmac->dmaen_num;
773 type = RSND_MOD_AUDMA;
774 }
775
776 dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL);
777 if (!dma)
778 return -ENOMEM;
779
780 *dma_mod = rsnd_mod_get(dma);
781
782 ret = rsnd_mod_init(priv, *dma_mod, ops, NULL,
783 type, dma_id);
784 if (ret < 0)
785 return ret;
786
787 dev_dbg(dev, "%s %s -> %s\n",
788 rsnd_mod_name(*dma_mod),
789 rsnd_mod_name(mod_from ? mod_from : &mem),
790 rsnd_mod_name(mod_to ? mod_to : &mem));
791
792 ret = attach(io, dma, mod_from, mod_to);
793 if (ret < 0)
794 return ret;
795
796 dma->src_addr = rsnd_dma_addr(io, mod_from, is_play, 1);
797 dma->dst_addr = rsnd_dma_addr(io, mod_to, is_play, 0);
798 dma->mod_from = mod_from;
799 dma->mod_to = mod_to;
800
801 return 0;
802 }
803
804 int rsnd_dma_attach(struct rsnd_dai_stream *io, struct rsnd_mod *mod,
805 struct rsnd_mod **dma_mod)
806 {
807 if (!(*dma_mod)) {
808 int ret = rsnd_dma_alloc(io, mod, dma_mod);
809
810 if (ret < 0)
811 return ret;
812 }
813
814 return rsnd_dai_connect(*dma_mod, io, (*dma_mod)->type);
815 }
816
817 int rsnd_dma_probe(struct rsnd_priv *priv)
818 {
819 struct platform_device *pdev = rsnd_priv_to_pdev(priv);
820 struct device *dev = rsnd_priv_to_dev(priv);
821 struct rsnd_dma_ctrl *dmac;
822 struct resource *res;
823
824
825
826
827 if (rsnd_is_gen1(priv))
828 return 0;
829
830
831
832
833 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "audmapp");
834 dmac = devm_kzalloc(dev, sizeof(*dmac), GFP_KERNEL);
835 if (!dmac || !res) {
836 dev_err(dev, "dma allocate failed\n");
837 return 0;
838 }
839
840 dmac->dmapp_num = 0;
841 dmac->base = devm_ioremap_resource(dev, res);
842 if (IS_ERR(dmac->base))
843 return PTR_ERR(dmac->base);
844
845 priv->dma = dmac;
846
847
848 return rsnd_mod_init(NULL, &mem, &mem_ops, NULL, 0, 0);
849 }