1 // SPDX-License-Identifier: GPL-2.0
3 // Renesas R-Car Audio DMAC support
5 // Copyright (C) 2015 Renesas Electronics Corp.
6 // Copyright (c) 2015 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
8 #include <linux/delay.h>
9 #include <linux/of_dma.h>
13 * Audio DMAC peri peri register
20 #define PDMACHCR_DE (1 << 0)
24 struct dma_chan
*chan
;
36 struct rsnd_mod
*mod_from
;
37 struct rsnd_mod
*mod_to
;
46 struct rsnd_dma_ctrl
{
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)
58 static struct rsnd_mod_ops mem_ops
= {
62 static struct rsnd_mod mem
= {
68 static void __rsnd_dmaen_complete(struct rsnd_mod
*mod
,
69 struct rsnd_dai_stream
*io
)
71 if (rsnd_io_is_working(io
))
72 rsnd_dai_period_elapsed(io
);
75 static void rsnd_dmaen_complete(void *data
)
77 struct rsnd_mod
*mod
= data
;
79 rsnd_mod_interrupt(mod
, __rsnd_dmaen_complete
);
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
)
86 if ((!mod_from
&& !mod_to
) ||
91 return rsnd_mod_dma_req(io
, mod_from
);
93 return rsnd_mod_dma_req(io
, mod_to
);
96 static int rsnd_dmaen_stop(struct rsnd_mod
*mod
,
97 struct rsnd_dai_stream
*io
,
98 struct rsnd_priv
*priv
)
100 struct rsnd_dma
*dma
= rsnd_mod_to_dma(mod
);
101 struct rsnd_dmaen
*dmaen
= rsnd_dma_to_dmaen(dma
);
104 dmaengine_terminate_all(dmaen
->chan
);
109 static int rsnd_dmaen_cleanup(struct rsnd_mod
*mod
,
110 struct rsnd_dai_stream
*io
,
111 struct rsnd_priv
*priv
)
113 struct rsnd_dma
*dma
= rsnd_mod_to_dma(mod
);
114 struct rsnd_dmaen
*dmaen
= rsnd_dma_to_dmaen(dma
);
117 * DMAEngine release uses mutex lock.
118 * Thus, it shouldn't be called under spinlock.
119 * Let's call it under prepare
122 dma_release_channel(dmaen
->chan
);
129 static int rsnd_dmaen_prepare(struct rsnd_mod
*mod
,
130 struct rsnd_dai_stream
*io
,
131 struct rsnd_priv
*priv
)
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
);
137 /* maybe suspended */
142 * DMAEngine request uses mutex lock.
143 * Thus, it shouldn't be called under spinlock.
144 * Let's call it under prepare
146 dmaen
->chan
= rsnd_dmaen_request_channel(io
,
149 if (IS_ERR_OR_NULL(dmaen
->chan
)) {
151 dev_err(dev
, "can't get dma channel\n");
158 static int rsnd_dmaen_start(struct rsnd_mod
*mod
,
159 struct rsnd_dai_stream
*io
,
160 struct rsnd_priv
*priv
)
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 enum dma_slave_buswidth buswidth
= DMA_SLAVE_BUSWIDTH_4_BYTES
;
169 int is_play
= rsnd_io_is_play(io
);
173 * in case of monaural data writing or reading through Audio-DMAC
174 * data is always in Left Justified format, so both src and dst
175 * DMA Bus width need to be set equal to physical data width.
177 if (rsnd_runtime_channel_original(io
) == 1) {
178 struct snd_pcm_runtime
*runtime
= rsnd_io_to_runtime(io
);
179 int bits
= snd_pcm_format_physical_width(runtime
->format
);
183 buswidth
= DMA_SLAVE_BUSWIDTH_1_BYTE
;
186 buswidth
= DMA_SLAVE_BUSWIDTH_2_BYTES
;
189 buswidth
= DMA_SLAVE_BUSWIDTH_4_BYTES
;
192 dev_err(dev
, "invalid format width %d\n", bits
);
197 cfg
.direction
= is_play
? DMA_MEM_TO_DEV
: DMA_DEV_TO_MEM
;
198 cfg
.src_addr
= dma
->src_addr
;
199 cfg
.dst_addr
= dma
->dst_addr
;
200 cfg
.src_addr_width
= buswidth
;
201 cfg
.dst_addr_width
= buswidth
;
203 dev_dbg(dev
, "%s %pad -> %pad\n",
205 &cfg
.src_addr
, &cfg
.dst_addr
);
207 ret
= dmaengine_slave_config(dmaen
->chan
, &cfg
);
211 desc
= dmaengine_prep_dma_cyclic(dmaen
->chan
,
212 substream
->runtime
->dma_addr
,
213 snd_pcm_lib_buffer_bytes(substream
),
214 snd_pcm_lib_period_bytes(substream
),
215 is_play
? DMA_MEM_TO_DEV
: DMA_DEV_TO_MEM
,
216 DMA_PREP_INTERRUPT
| DMA_CTRL_ACK
);
219 dev_err(dev
, "dmaengine_prep_slave_sg() fail\n");
223 desc
->callback
= rsnd_dmaen_complete
;
224 desc
->callback_param
= rsnd_mod_get(dma
);
226 dmaen
->dma_len
= snd_pcm_lib_buffer_bytes(substream
);
228 dmaen
->cookie
= dmaengine_submit(desc
);
229 if (dmaen
->cookie
< 0) {
230 dev_err(dev
, "dmaengine_submit() fail\n");
234 dma_async_issue_pending(dmaen
->chan
);
239 struct dma_chan
*rsnd_dma_request_channel(struct device_node
*of_node
,
240 struct rsnd_mod
*mod
, char *name
)
242 struct dma_chan
*chan
= NULL
;
243 struct device_node
*np
;
246 for_each_child_of_node(of_node
, np
) {
247 if (i
== rsnd_mod_id_raw(mod
) && (!chan
))
248 chan
= of_dma_request_slave_channel(np
, name
);
252 /* It should call of_node_put(), since, it is rsnd_xxx_of_node() */
253 of_node_put(of_node
);
258 static int rsnd_dmaen_attach(struct rsnd_dai_stream
*io
,
259 struct rsnd_dma
*dma
,
260 struct rsnd_mod
*mod_from
, struct rsnd_mod
*mod_to
)
262 struct rsnd_priv
*priv
= rsnd_io_to_priv(io
);
263 struct rsnd_dma_ctrl
*dmac
= rsnd_priv_to_dmac(priv
);
264 struct dma_chan
*chan
;
266 /* try to get DMAEngine channel */
267 chan
= rsnd_dmaen_request_channel(io
, mod_from
, mod_to
);
268 if (IS_ERR_OR_NULL(chan
)) {
269 /* Let's follow when -EPROBE_DEFER case */
270 if (PTR_ERR(chan
) == -EPROBE_DEFER
)
271 return PTR_ERR(chan
);
274 * DMA failed. try to PIO mode
276 * rsnd_ssi_fallback()
277 * rsnd_rdai_continuance_probe()
283 * use it for IPMMU if needed
285 * rsnd_preallocate_pages()
287 io
->dmac_dev
= chan
->device
->dev
;
289 dma_release_channel(chan
);
296 static int rsnd_dmaen_pointer(struct rsnd_mod
*mod
,
297 struct rsnd_dai_stream
*io
,
298 snd_pcm_uframes_t
*pointer
)
300 struct snd_pcm_runtime
*runtime
= rsnd_io_to_runtime(io
);
301 struct rsnd_dma
*dma
= rsnd_mod_to_dma(mod
);
302 struct rsnd_dmaen
*dmaen
= rsnd_dma_to_dmaen(dma
);
303 struct dma_tx_state state
;
304 enum dma_status status
;
305 unsigned int pos
= 0;
307 status
= dmaengine_tx_status(dmaen
->chan
, dmaen
->cookie
, &state
);
308 if (status
== DMA_IN_PROGRESS
|| status
== DMA_PAUSED
) {
309 if (state
.residue
> 0 && state
.residue
<= dmaen
->dma_len
)
310 pos
= dmaen
->dma_len
- state
.residue
;
312 *pointer
= bytes_to_frames(runtime
, pos
);
317 static struct rsnd_mod_ops rsnd_dmaen_ops
= {
319 .prepare
= rsnd_dmaen_prepare
,
320 .cleanup
= rsnd_dmaen_cleanup
,
321 .start
= rsnd_dmaen_start
,
322 .stop
= rsnd_dmaen_stop
,
323 .pointer
= rsnd_dmaen_pointer
,
324 .get_status
= rsnd_mod_get_status
,
328 * Audio DMAC peri peri
330 static const u8 gen2_id_table_ssiu
[] = {
332 0x00, 0x01, 0x02, 0x03, 0x39, 0x3a, 0x3b, 0x3c,
334 0x04, 0x05, 0x06, 0x07, 0x3d, 0x3e, 0x3f, 0x40,
336 0x08, 0x09, 0x0a, 0x0b, 0x41, 0x42, 0x43, 0x44,
338 0x0c, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b,
340 0x0d, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52,
342 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x12, 0x13, 0x14, 0x15, 0x53, 0x54, 0x55, 0x56,
352 static const u8 gen2_id_table_scu
[] = {
353 0x2d, /* SCU_SRCI0 */
354 0x2e, /* SCU_SRCI1 */
355 0x2f, /* SCU_SRCI2 */
356 0x30, /* SCU_SRCI3 */
357 0x31, /* SCU_SRCI4 */
358 0x32, /* SCU_SRCI5 */
359 0x33, /* SCU_SRCI6 */
360 0x34, /* SCU_SRCI7 */
361 0x35, /* SCU_SRCI8 */
362 0x36, /* SCU_SRCI9 */
364 static const u8 gen2_id_table_cmd
[] = {
369 static u32
rsnd_dmapp_get_id(struct rsnd_dai_stream
*io
,
370 struct rsnd_mod
*mod
)
372 struct rsnd_mod
*ssi
= rsnd_io_to_mod_ssi(io
);
373 struct rsnd_mod
*ssiu
= rsnd_io_to_mod_ssiu(io
);
374 struct rsnd_mod
*src
= rsnd_io_to_mod_src(io
);
375 struct rsnd_mod
*dvc
= rsnd_io_to_mod_dvc(io
);
376 const u8
*entry
= NULL
;
382 int busif
= rsnd_mod_id_sub(ssiu
);
384 entry
= gen2_id_table_ssiu
;
385 size
= ARRAY_SIZE(gen2_id_table_ssiu
);
386 id
= (rsnd_mod_id(mod
) * 8) + busif
;
387 } else if (mod
== src
) {
388 entry
= gen2_id_table_scu
;
389 size
= ARRAY_SIZE(gen2_id_table_scu
);
390 id
= rsnd_mod_id(mod
);
391 } else if (mod
== dvc
) {
392 entry
= gen2_id_table_cmd
;
393 size
= ARRAY_SIZE(gen2_id_table_cmd
);
394 id
= rsnd_mod_id(mod
);
397 if ((!entry
) || (size
<= id
)) {
398 struct device
*dev
= rsnd_priv_to_dev(rsnd_io_to_priv(io
));
400 dev_err(dev
, "unknown connection (%s)\n", rsnd_mod_name(mod
));
402 /* use non-prohibited SRS number as error */
403 return 0x00; /* SSI00 */
409 static u32
rsnd_dmapp_get_chcr(struct rsnd_dai_stream
*io
,
410 struct rsnd_mod
*mod_from
,
411 struct rsnd_mod
*mod_to
)
413 return (rsnd_dmapp_get_id(io
, mod_from
) << 24) +
414 (rsnd_dmapp_get_id(io
, mod_to
) << 16);
417 #define rsnd_dmapp_addr(dmac, dma, reg) \
418 (dmac->base + 0x20 + reg + \
419 (0x10 * rsnd_dma_to_dmapp(dma)->dmapp_id))
420 static void rsnd_dmapp_write(struct rsnd_dma
*dma
, u32 data
, u32 reg
)
422 struct rsnd_mod
*mod
= rsnd_mod_get(dma
);
423 struct rsnd_priv
*priv
= rsnd_mod_to_priv(mod
);
424 struct rsnd_dma_ctrl
*dmac
= rsnd_priv_to_dmac(priv
);
425 struct device
*dev
= rsnd_priv_to_dev(priv
);
427 dev_dbg(dev
, "w 0x%px : %08x\n", rsnd_dmapp_addr(dmac
, dma
, reg
), data
);
429 iowrite32(data
, rsnd_dmapp_addr(dmac
, dma
, reg
));
432 static u32
rsnd_dmapp_read(struct rsnd_dma
*dma
, u32 reg
)
434 struct rsnd_mod
*mod
= rsnd_mod_get(dma
);
435 struct rsnd_priv
*priv
= rsnd_mod_to_priv(mod
);
436 struct rsnd_dma_ctrl
*dmac
= rsnd_priv_to_dmac(priv
);
438 return ioread32(rsnd_dmapp_addr(dmac
, dma
, reg
));
441 static void rsnd_dmapp_bset(struct rsnd_dma
*dma
, u32 data
, u32 mask
, u32 reg
)
443 struct rsnd_mod
*mod
= rsnd_mod_get(dma
);
444 struct rsnd_priv
*priv
= rsnd_mod_to_priv(mod
);
445 struct rsnd_dma_ctrl
*dmac
= rsnd_priv_to_dmac(priv
);
446 void __iomem
*addr
= rsnd_dmapp_addr(dmac
, dma
, reg
);
447 u32 val
= ioread32(addr
);
450 val
|= (data
& mask
);
452 iowrite32(val
, addr
);
455 static int rsnd_dmapp_stop(struct rsnd_mod
*mod
,
456 struct rsnd_dai_stream
*io
,
457 struct rsnd_priv
*priv
)
459 struct rsnd_dma
*dma
= rsnd_mod_to_dma(mod
);
462 rsnd_dmapp_bset(dma
, 0, PDMACHCR_DE
, PDMACHCR
);
464 for (i
= 0; i
< 1024; i
++) {
465 if (0 == (rsnd_dmapp_read(dma
, PDMACHCR
) & PDMACHCR_DE
))
473 static int rsnd_dmapp_start(struct rsnd_mod
*mod
,
474 struct rsnd_dai_stream
*io
,
475 struct rsnd_priv
*priv
)
477 struct rsnd_dma
*dma
= rsnd_mod_to_dma(mod
);
478 struct rsnd_dmapp
*dmapp
= rsnd_dma_to_dmapp(dma
);
480 rsnd_dmapp_write(dma
, dma
->src_addr
, PDMASAR
);
481 rsnd_dmapp_write(dma
, dma
->dst_addr
, PDMADAR
);
482 rsnd_dmapp_write(dma
, dmapp
->chcr
, PDMACHCR
);
487 static int rsnd_dmapp_attach(struct rsnd_dai_stream
*io
,
488 struct rsnd_dma
*dma
,
489 struct rsnd_mod
*mod_from
, struct rsnd_mod
*mod_to
)
491 struct rsnd_dmapp
*dmapp
= rsnd_dma_to_dmapp(dma
);
492 struct rsnd_priv
*priv
= rsnd_io_to_priv(io
);
493 struct rsnd_dma_ctrl
*dmac
= rsnd_priv_to_dmac(priv
);
494 struct device
*dev
= rsnd_priv_to_dev(priv
);
496 dmapp
->dmapp_id
= dmac
->dmapp_num
;
497 dmapp
->chcr
= rsnd_dmapp_get_chcr(io
, mod_from
, mod_to
) | PDMACHCR_DE
;
501 dev_dbg(dev
, "id/src/dst/chcr = %d/%pad/%pad/%08x\n",
502 dmapp
->dmapp_id
, &dma
->src_addr
, &dma
->dst_addr
, dmapp
->chcr
);
507 static struct rsnd_mod_ops rsnd_dmapp_ops
= {
509 .start
= rsnd_dmapp_start
,
510 .stop
= rsnd_dmapp_stop
,
511 .quit
= rsnd_dmapp_stop
,
512 .get_status
= rsnd_mod_get_status
,
516 * Common DMAC Interface
520 * DMA read/write register offset
522 * RSND_xxx_I_N for Audio DMAC input
523 * RSND_xxx_O_N for Audio DMAC output
524 * RSND_xxx_I_P for Audio DMAC peri peri input
525 * RSND_xxx_O_P for Audio DMAC peri peri output
528 * mod / DMAC in / DMAC out / DMAC PP in / DMAC pp out
529 * SSI : 0xec541000 / 0xec241008 / 0xec24100c
530 * SSIU: 0xec541000 / 0xec100000 / 0xec100000 / 0xec400000 / 0xec400000
531 * SCU : 0xec500000 / 0xec000000 / 0xec004000 / 0xec300000 / 0xec304000
532 * CMD : 0xec500000 / / 0xec008000 0xec308000
534 #define RDMA_SSI_I_N(addr, i) (addr ##_reg - 0x00300000 + (0x40 * i) + 0x8)
535 #define RDMA_SSI_O_N(addr, i) (addr ##_reg - 0x00300000 + (0x40 * i) + 0xc)
537 #define RDMA_SSIU_I_N(addr, i, j) (addr ##_reg - 0x00441000 + (0x1000 * (i)) + (((j) / 4) * 0xA000) + (((j) % 4) * 0x400) - (0x4000 * ((i) / 9) * ((j) / 4)))
538 #define RDMA_SSIU_O_N(addr, i, j) RDMA_SSIU_I_N(addr, i, j)
540 #define RDMA_SSIU_I_P(addr, i, j) (addr ##_reg - 0x00141000 + (0x1000 * (i)) + (((j) / 4) * 0xA000) + (((j) % 4) * 0x400) - (0x4000 * ((i) / 9) * ((j) / 4)))
541 #define RDMA_SSIU_O_P(addr, i, j) RDMA_SSIU_I_P(addr, i, j)
543 #define RDMA_SRC_I_N(addr, i) (addr ##_reg - 0x00500000 + (0x400 * i))
544 #define RDMA_SRC_O_N(addr, i) (addr ##_reg - 0x004fc000 + (0x400 * i))
546 #define RDMA_SRC_I_P(addr, i) (addr ##_reg - 0x00200000 + (0x400 * i))
547 #define RDMA_SRC_O_P(addr, i) (addr ##_reg - 0x001fc000 + (0x400 * i))
549 #define RDMA_CMD_O_N(addr, i) (addr ##_reg - 0x004f8000 + (0x400 * i))
550 #define RDMA_CMD_O_P(addr, i) (addr ##_reg - 0x001f8000 + (0x400 * i))
553 rsnd_gen2_dma_addr(struct rsnd_dai_stream
*io
,
554 struct rsnd_mod
*mod
,
555 int is_play
, int is_from
)
557 struct rsnd_priv
*priv
= rsnd_io_to_priv(io
);
558 struct device
*dev
= rsnd_priv_to_dev(priv
);
559 phys_addr_t ssi_reg
= rsnd_gen_get_phy_addr(priv
, RSND_GEN2_SSI
);
560 phys_addr_t src_reg
= rsnd_gen_get_phy_addr(priv
, RSND_GEN2_SCU
);
561 int is_ssi
= !!(rsnd_io_to_mod_ssi(io
) == mod
) ||
562 !!(rsnd_io_to_mod_ssiu(io
) == mod
);
563 int use_src
= !!rsnd_io_to_mod_src(io
);
564 int use_cmd
= !!rsnd_io_to_mod_dvc(io
) ||
565 !!rsnd_io_to_mod_mix(io
) ||
566 !!rsnd_io_to_mod_ctu(io
);
567 int id
= rsnd_mod_id(mod
);
568 int busif
= rsnd_mod_id_sub(rsnd_io_to_mod_ssiu(io
));
572 } dma_addrs
[3][2][3] = {
576 { RDMA_SRC_O_N(src
, id
), RDMA_SRC_I_P(src
, id
) },
577 { RDMA_CMD_O_N(src
, id
), RDMA_SRC_I_P(src
, id
) } },
580 { RDMA_SRC_O_P(src
, id
), RDMA_SRC_I_N(src
, id
) },
581 { RDMA_CMD_O_P(src
, id
), RDMA_SRC_I_N(src
, id
) } }
585 {{{ RDMA_SSI_O_N(ssi
, id
), 0 },
586 { RDMA_SSIU_O_P(ssi
, id
, busif
), 0 },
587 { RDMA_SSIU_O_P(ssi
, id
, busif
), 0 } },
589 {{ 0, RDMA_SSI_I_N(ssi
, id
) },
590 { 0, RDMA_SSIU_I_P(ssi
, id
, busif
) },
591 { 0, RDMA_SSIU_I_P(ssi
, id
, busif
) } }
595 {{{ RDMA_SSIU_O_N(ssi
, id
, busif
), 0 },
596 { RDMA_SSIU_O_P(ssi
, id
, busif
), 0 },
597 { RDMA_SSIU_O_P(ssi
, id
, busif
), 0 } },
599 {{ 0, RDMA_SSIU_I_N(ssi
, id
, busif
) },
600 { 0, RDMA_SSIU_I_P(ssi
, id
, busif
) },
601 { 0, RDMA_SSIU_I_P(ssi
, id
, busif
) } } },
607 * We can't support SSI9-4/5/6/7, because its address is
608 * out of calculation rule
610 if ((id
== 9) && (busif
>= 4))
611 dev_err(dev
, "This driver doesn't support SSI%d-%d, so far",
614 /* it shouldn't happen */
615 if (use_cmd
&& !use_src
)
616 dev_err(dev
, "DVC is selected without SRC\n");
618 /* use SSIU or SSI ? */
619 if (is_ssi
&& rsnd_ssi_use_busif(io
))
623 dma_addrs
[is_ssi
][is_play
][use_src
+ use_cmd
].out_addr
:
624 dma_addrs
[is_ssi
][is_play
][use_src
+ use_cmd
].in_addr
;
627 static dma_addr_t
rsnd_dma_addr(struct rsnd_dai_stream
*io
,
628 struct rsnd_mod
*mod
,
629 int is_play
, int is_from
)
631 struct rsnd_priv
*priv
= rsnd_io_to_priv(io
);
634 * gen1 uses default DMA addr
636 if (rsnd_is_gen1(priv
))
642 return rsnd_gen2_dma_addr(io
, mod
, is_play
, is_from
);
645 #define MOD_MAX (RSND_MOD_MAX + 1) /* +Memory */
646 static void rsnd_dma_of_path(struct rsnd_mod
*this,
647 struct rsnd_dai_stream
*io
,
649 struct rsnd_mod
**mod_from
,
650 struct rsnd_mod
**mod_to
)
652 struct rsnd_mod
*ssi
;
653 struct rsnd_mod
*src
= rsnd_io_to_mod_src(io
);
654 struct rsnd_mod
*ctu
= rsnd_io_to_mod_ctu(io
);
655 struct rsnd_mod
*mix
= rsnd_io_to_mod_mix(io
);
656 struct rsnd_mod
*dvc
= rsnd_io_to_mod_dvc(io
);
657 struct rsnd_mod
*mod
[MOD_MAX
];
658 struct rsnd_mod
*mod_start
, *mod_end
;
659 struct rsnd_priv
*priv
= rsnd_mod_to_priv(this);
660 struct device
*dev
= rsnd_priv_to_dev(priv
);
664 * It should use "rcar_sound,ssiu" on DT.
665 * But, we need to keep compatibility for old version.
667 * If it has "rcar_sound.ssiu", it will be used.
668 * If not, "rcar_sound.ssi" will be used.
670 * rsnd_ssiu_dma_req()
673 if (rsnd_ssiu_of_node(priv
)) {
674 struct rsnd_mod
*ssiu
= rsnd_io_to_mod_ssiu(io
);
678 if (this == rsnd_io_to_mod_ssi(io
))
681 /* keep compatible, use SSI */
682 ssi
= rsnd_io_to_mod_ssi(io
);
689 for (i
= 0; i
< MOD_MAX
; i
++) {
691 nr
+= !!rsnd_io_to_mod(io
, i
);
696 * [S] -*-> SRC -o-> [E]
697 * [S] -*-> SRC -> DVC -o-> [E]
698 * [S] -*-> SRC -> CTU -> MIX -> DVC -o-> [E]
707 * -o-> Audio DMAC peri peri
709 mod_start
= (is_play
) ? NULL
: ssi
;
710 mod_end
= (is_play
) ? ssi
: NULL
;
713 mod
[idx
++] = mod_start
;
714 for (i
= 1; i
< nr
; i
++) {
733 * -------------+-----+-----+
737 if ((this == ssi
) == (is_play
)) {
738 *mod_from
= mod
[idx
- 1];
745 dev_dbg(dev
, "module connection (this is %s)\n", rsnd_mod_name(this));
746 for (i
= 0; i
<= idx
; i
++) {
747 dev_dbg(dev
, " %s%s\n",
748 rsnd_mod_name(mod
[i
] ? mod
[i
] : &mem
),
749 (mod
[i
] == *mod_from
) ? " from" :
750 (mod
[i
] == *mod_to
) ? " to" : "");
754 static int rsnd_dma_alloc(struct rsnd_dai_stream
*io
, struct rsnd_mod
*mod
,
755 struct rsnd_mod
**dma_mod
)
757 struct rsnd_mod
*mod_from
= NULL
;
758 struct rsnd_mod
*mod_to
= NULL
;
759 struct rsnd_priv
*priv
= rsnd_io_to_priv(io
);
760 struct rsnd_dma_ctrl
*dmac
= rsnd_priv_to_dmac(priv
);
761 struct device
*dev
= rsnd_priv_to_dev(priv
);
762 struct rsnd_dma
*dma
;
763 struct rsnd_mod_ops
*ops
;
764 enum rsnd_mod_type type
;
765 int (*attach
)(struct rsnd_dai_stream
*io
, struct rsnd_dma
*dma
,
766 struct rsnd_mod
*mod_from
, struct rsnd_mod
*mod_to
);
767 int is_play
= rsnd_io_is_play(io
);
771 * DMA failed. try to PIO mode
773 * rsnd_ssi_fallback()
774 * rsnd_rdai_continuance_probe()
779 rsnd_dma_of_path(mod
, io
, is_play
, &mod_from
, &mod_to
);
781 /* for Gen2 or later */
782 if (mod_from
&& mod_to
) {
783 ops
= &rsnd_dmapp_ops
;
784 attach
= rsnd_dmapp_attach
;
785 dma_id
= dmac
->dmapp_num
;
786 type
= RSND_MOD_AUDMAPP
;
788 ops
= &rsnd_dmaen_ops
;
789 attach
= rsnd_dmaen_attach
;
790 dma_id
= dmac
->dmaen_num
;
791 type
= RSND_MOD_AUDMA
;
794 /* for Gen1, overwrite */
795 if (rsnd_is_gen1(priv
)) {
796 ops
= &rsnd_dmaen_ops
;
797 attach
= rsnd_dmaen_attach
;
798 dma_id
= dmac
->dmaen_num
;
799 type
= RSND_MOD_AUDMA
;
802 dma
= devm_kzalloc(dev
, sizeof(*dma
), GFP_KERNEL
);
806 *dma_mod
= rsnd_mod_get(dma
);
808 ret
= rsnd_mod_init(priv
, *dma_mod
, ops
, NULL
,
813 dev_dbg(dev
, "%s %s -> %s\n",
814 rsnd_mod_name(*dma_mod
),
815 rsnd_mod_name(mod_from
? mod_from
: &mem
),
816 rsnd_mod_name(mod_to
? mod_to
: &mem
));
818 ret
= attach(io
, dma
, mod_from
, mod_to
);
822 dma
->src_addr
= rsnd_dma_addr(io
, mod_from
, is_play
, 1);
823 dma
->dst_addr
= rsnd_dma_addr(io
, mod_to
, is_play
, 0);
824 dma
->mod_from
= mod_from
;
825 dma
->mod_to
= mod_to
;
830 int rsnd_dma_attach(struct rsnd_dai_stream
*io
, struct rsnd_mod
*mod
,
831 struct rsnd_mod
**dma_mod
)
834 int ret
= rsnd_dma_alloc(io
, mod
, dma_mod
);
840 return rsnd_dai_connect(*dma_mod
, io
, (*dma_mod
)->type
);
843 int rsnd_dma_probe(struct rsnd_priv
*priv
)
845 struct platform_device
*pdev
= rsnd_priv_to_pdev(priv
);
846 struct device
*dev
= rsnd_priv_to_dev(priv
);
847 struct rsnd_dma_ctrl
*dmac
;
848 struct resource
*res
;
853 if (rsnd_is_gen1(priv
))
859 res
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
, "audmapp");
860 dmac
= devm_kzalloc(dev
, sizeof(*dmac
), GFP_KERNEL
);
862 dev_err(dev
, "dma allocate failed\n");
863 return 0; /* it will be PIO mode */
867 dmac
->base
= devm_ioremap_resource(dev
, res
);
868 if (IS_ERR(dmac
->base
))
869 return PTR_ERR(dmac
->base
);
873 /* dummy mem mod for debug */
874 return rsnd_mod_init(NULL
, &mem
, &mem_ops
, NULL
, 0, 0);