Lines Matching +full:dma +full:- +full:mem
1 // SPDX-License-Identifier: GPL-2.0
3 // Renesas R-Car Audio DMAC support
42 } dma; member
52 #define rsnd_priv_to_dmac(p) ((struct rsnd_dma_ctrl *)(p)->dma)
54 #define rsnd_dma_to_dmaen(dma) (&(dma)->dma.en) argument
55 #define rsnd_dma_to_dmapp(dma) (&(dma)->dma.pp) argument
59 .name = "mem",
62 static struct rsnd_mod mem = { variable
86 return snd_dmaengine_pcm_trigger(io->substream, SNDRV_PCM_TRIGGER_STOP); in rsnd_dmaen_stop()
93 struct rsnd_dma *dma = rsnd_mod_to_dma(mod); in rsnd_dmaen_cleanup() local
94 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma); in rsnd_dmaen_cleanup()
101 if (dmaen->chan) in rsnd_dmaen_cleanup()
102 snd_dmaengine_pcm_close_release_chan(io->substream); in rsnd_dmaen_cleanup()
104 dmaen->chan = NULL; in rsnd_dmaen_cleanup()
113 struct rsnd_dma *dma = rsnd_mod_to_dma(mod); in rsnd_dmaen_prepare() local
114 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma); in rsnd_dmaen_prepare()
118 if (dmaen->chan) in rsnd_dmaen_prepare()
126 dmaen->chan = rsnd_dmaen_request_channel(io, in rsnd_dmaen_prepare()
127 dma->mod_from, in rsnd_dmaen_prepare()
128 dma->mod_to); in rsnd_dmaen_prepare()
129 if (IS_ERR_OR_NULL(dmaen->chan)) { in rsnd_dmaen_prepare()
130 dmaen->chan = NULL; in rsnd_dmaen_prepare()
131 dev_err(dev, "can't get dma channel\n"); in rsnd_dmaen_prepare()
132 return -EIO; in rsnd_dmaen_prepare()
135 return snd_dmaengine_pcm_open(io->substream, dmaen->chan); in rsnd_dmaen_prepare()
142 struct rsnd_dma *dma = rsnd_mod_to_dma(mod); in rsnd_dmaen_start() local
143 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma); in rsnd_dmaen_start()
150 * in case of monaural data writing or reading through Audio-DMAC in rsnd_dmaen_start()
152 * DMA Bus width need to be set equal to physical data width. in rsnd_dmaen_start()
156 int bits = snd_pcm_format_physical_width(runtime->format); in rsnd_dmaen_start()
170 return -EINVAL; in rsnd_dmaen_start()
174 cfg.direction = snd_pcm_substream_to_dma_direction(io->substream); in rsnd_dmaen_start()
175 cfg.src_addr = dma->src_addr; in rsnd_dmaen_start()
176 cfg.dst_addr = dma->dst_addr; in rsnd_dmaen_start()
180 dev_dbg(dev, "%s %pad -> %pad\n", in rsnd_dmaen_start()
184 ret = dmaengine_slave_config(dmaen->chan, &cfg); in rsnd_dmaen_start()
188 return snd_dmaengine_pcm_trigger(io->substream, SNDRV_PCM_TRIGGER_START); in rsnd_dmaen_start()
218 struct rsnd_dma *dma, in rsnd_dmaen_attach() argument
228 /* Let's follow when -EPROBE_DEFER case */ in rsnd_dmaen_attach()
229 if (PTR_ERR(chan) == -EPROBE_DEFER) in rsnd_dmaen_attach()
233 * DMA failed. try to PIO mode in rsnd_dmaen_attach()
238 return -EAGAIN; in rsnd_dmaen_attach()
246 io->dmac_dev = chan->device->dev; in rsnd_dmaen_attach()
250 dmac->dmaen_num++; in rsnd_dmaen_attach()
259 *pointer = snd_dmaengine_pcm_pointer(io->substream); in rsnd_dmaen_pointer()
349 /* use non-prohibited SRS number as error */ in rsnd_dmapp_get_id()
364 #define rsnd_dmapp_addr(dmac, dma, reg) \ argument
365 (dmac->ppbase + 0x20 + reg + \
366 (0x10 * rsnd_dma_to_dmapp(dma)->dmapp_id))
367 static void rsnd_dmapp_write(struct rsnd_dma *dma, u32 data, u32 reg) in rsnd_dmapp_write() argument
369 struct rsnd_mod *mod = rsnd_mod_get(dma); in rsnd_dmapp_write()
374 dev_dbg(dev, "w 0x%px : %08x\n", rsnd_dmapp_addr(dmac, dma, reg), data); in rsnd_dmapp_write()
376 iowrite32(data, rsnd_dmapp_addr(dmac, dma, reg)); in rsnd_dmapp_write()
379 static u32 rsnd_dmapp_read(struct rsnd_dma *dma, u32 reg) in rsnd_dmapp_read() argument
381 struct rsnd_mod *mod = rsnd_mod_get(dma); in rsnd_dmapp_read()
385 return ioread32(rsnd_dmapp_addr(dmac, dma, reg)); in rsnd_dmapp_read()
388 static void rsnd_dmapp_bset(struct rsnd_dma *dma, u32 data, u32 mask, u32 reg) in rsnd_dmapp_bset() argument
390 struct rsnd_mod *mod = rsnd_mod_get(dma); in rsnd_dmapp_bset()
393 void __iomem *addr = rsnd_dmapp_addr(dmac, dma, reg); in rsnd_dmapp_bset()
406 struct rsnd_dma *dma = rsnd_mod_to_dma(mod); in rsnd_dmapp_stop() local
409 rsnd_dmapp_bset(dma, 0, PDMACHCR_DE, PDMACHCR); in rsnd_dmapp_stop()
412 if (0 == (rsnd_dmapp_read(dma, PDMACHCR) & PDMACHCR_DE)) in rsnd_dmapp_stop()
417 return -EIO; in rsnd_dmapp_stop()
424 struct rsnd_dma *dma = rsnd_mod_to_dma(mod); in rsnd_dmapp_start() local
425 struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma); in rsnd_dmapp_start()
427 rsnd_dmapp_write(dma, dma->src_addr, PDMASAR); in rsnd_dmapp_start()
428 rsnd_dmapp_write(dma, dma->dst_addr, PDMADAR); in rsnd_dmapp_start()
429 rsnd_dmapp_write(dma, dmapp->chcr, PDMACHCR); in rsnd_dmapp_start()
435 struct rsnd_dma *dma, in rsnd_dmapp_attach() argument
438 struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma); in rsnd_dmapp_attach()
443 dmapp->dmapp_id = dmac->dmapp_num; in rsnd_dmapp_attach()
444 dmapp->chcr = rsnd_dmapp_get_chcr(io, mod_from, mod_to) | PDMACHCR_DE; in rsnd_dmapp_attach()
446 dmac->dmapp_num++; in rsnd_dmapp_attach()
449 dmapp->dmapp_id, &dma->src_addr, &dma->dst_addr, dmapp->chcr); in rsnd_dmapp_attach()
461 struct rsnd_dma *dma = rsnd_mod_to_dma(mod); in rsnd_dmapp_debug_info() local
462 struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma); in rsnd_dmapp_debug_info()
464 rsnd_debugfs_reg_show(m, dmac->ppres, dmac->ppbase, in rsnd_dmapp_debug_info()
465 0x20 + 0x10 * dmapp->dmapp_id, 0x10); in rsnd_dmapp_debug_info()
473 .name = "audmac-pp",
486 * DMA read/write register offset
493 * ex) R-Car H2 case
500 #define RDMA_SSI_I_N(addr, i) (addr ##_reg - 0x00300000 + (0x40 * i) + 0x8)
501 #define RDMA_SSI_O_N(addr, i) (addr ##_reg - 0x00300000 + (0x40 * i) + 0xc)
503 …DMA_SSIU_I_N(addr, i, j) (addr ##_reg - 0x00441000 + (0x1000 * (i)) + (((j) / 4) * 0xA000) + (((j)…
506 …DMA_SSIU_I_P(addr, i, j) (addr ##_reg - 0x00141000 + (0x1000 * (i)) + (((j) / 4) * 0xA000) + (((j)…
509 #define RDMA_SRC_I_N(addr, i) (addr ##_reg - 0x00500000 + (0x400 * i))
510 #define RDMA_SRC_O_N(addr, i) (addr ##_reg - 0x004fc000 + (0x400 * i))
512 #define RDMA_SRC_I_P(addr, i) (addr ##_reg - 0x00200000 + (0x400 * i))
513 #define RDMA_SRC_O_P(addr, i) (addr ##_reg - 0x001fc000 + (0x400 * i))
515 #define RDMA_CMD_O_N(addr, i) (addr ##_reg - 0x004f8000 + (0x400 * i))
516 #define RDMA_CMD_O_P(addr, i) (addr ##_reg - 0x001f8000 + (0x400 * i))
573 * We can't support SSI9-4/5/6/7, because its address is in rsnd_gen2_dma_addr()
577 dev_err(dev, "This driver doesn't support SSI%d-%d, so far", in rsnd_gen2_dma_addr()
594 * Gen4 DMA read/write register offset
596 * ex) R-Car V4H case
597 * mod / SYS-DMAC in / SYS-DMAC out
617 return -EINVAL; in rsnd_gen4_dma_addr()
633 * gen1 uses default DMA addr in rsnd_dma_addr()
693 * [S] -*-> [E] in rsnd_dma_of_path()
694 * [S] -*-> SRC -o-> [E] in rsnd_dma_of_path()
695 * [S] -*-> SRC -> DVC -o-> [E] in rsnd_dma_of_path()
696 * [S] -*-> SRC -> CTU -> MIX -> DVC -o-> [E] in rsnd_dma_of_path()
698 * playback [S] = mem in rsnd_dma_of_path()
702 * [E] = mem in rsnd_dma_of_path()
704 * -*-> Audio DMAC in rsnd_dma_of_path()
705 * -o-> Audio DMAC peri peri in rsnd_dma_of_path()
731 * -------------+-----+-----+ in rsnd_dma_of_path()
736 *mod_from = mod[idx - 1]; in rsnd_dma_of_path()
746 rsnd_mod_name(mod[i] ? mod[i] : &mem), in rsnd_dma_of_path()
760 struct rsnd_dma *dma; in rsnd_dma_alloc() local
763 int (*attach)(struct rsnd_dai_stream *io, struct rsnd_dma *dma, in rsnd_dma_alloc()
769 * DMA failed. try to PIO mode in rsnd_dma_alloc()
775 return -EAGAIN; in rsnd_dma_alloc()
783 dma_id = dmac->dmapp_num; in rsnd_dma_alloc()
788 dma_id = dmac->dmaen_num; in rsnd_dma_alloc()
796 dma_id = dmac->dmaen_num; in rsnd_dma_alloc()
800 dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL); in rsnd_dma_alloc()
801 if (!dma) in rsnd_dma_alloc()
802 return -ENOMEM; in rsnd_dma_alloc()
804 *dma_mod = rsnd_mod_get(dma); in rsnd_dma_alloc()
811 dev_dbg(dev, "%s %s -> %s\n", in rsnd_dma_alloc()
813 rsnd_mod_name(mod_from ? mod_from : &mem), in rsnd_dma_alloc()
814 rsnd_mod_name(mod_to ? mod_to : &mem)); in rsnd_dma_alloc()
816 ret = attach(io, dma, mod_from, mod_to); in rsnd_dma_alloc()
820 dma->src_addr = rsnd_dma_addr(io, mod_from, is_play, 1); in rsnd_dma_alloc()
821 dma->dst_addr = rsnd_dma_addr(io, mod_to, is_play, 0); in rsnd_dma_alloc()
822 dma->mod_from = mod_from; in rsnd_dma_alloc()
823 dma->mod_to = mod_to; in rsnd_dma_alloc()
838 return rsnd_dai_connect(*dma_mod, io, (*dma_mod)->type); in rsnd_dma_attach()
859 dev_err(dev, "dma allocate failed\n"); in rsnd_dma_probe()
863 /* for Gen4 doesn't have DMA-pp */ in rsnd_dma_probe()
873 dmac->dmapp_num = 0; in rsnd_dma_probe()
874 dmac->ppres = res->start; in rsnd_dma_probe()
875 dmac->ppbase = devm_ioremap_resource(dev, res); in rsnd_dma_probe()
876 if (IS_ERR(dmac->ppbase)) in rsnd_dma_probe()
877 return PTR_ERR(dmac->ppbase); in rsnd_dma_probe()
879 priv->dma = dmac; in rsnd_dma_probe()
881 /* dummy mem mod for debug */ in rsnd_dma_probe()
882 return rsnd_mod_init(NULL, &mem, &mem_ops, NULL, 0, 0); in rsnd_dma_probe()