1/*
2 * Renesas R-Car Audio DMAC support
3 *
4 * Copyright (C) 2015 Renesas Electronics Corp.
5 * Copyright (c) 2015 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11#include <linux/delay.h>
12#include <linux/of_dma.h>
13#include "rsnd.h"
14
15/*
16 * Audio DMAC peri peri register
17 */
18#define PDMASAR		0x00
19#define PDMADAR		0x04
20#define PDMACHCR	0x0c
21
22/* PDMACHCR */
23#define PDMACHCR_DE		(1 << 0)
24
25struct rsnd_dma_ctrl {
26	void __iomem *base;
27	int dmapp_num;
28};
29
30struct rsnd_dma_ops {
31	char *name;
32	void (*start)(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
33	void (*stop)(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
34	int (*init)(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id,
35		    struct rsnd_mod *mod_from, struct rsnd_mod *mod_to);
36	void (*quit)(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
37};
38
39#define rsnd_priv_to_dmac(p)	((struct rsnd_dma_ctrl *)(p)->dma)
40
41/*
42 *		Audio DMAC
43 */
44static void __rsnd_dmaen_complete(struct rsnd_mod *mod,
45				  struct rsnd_dai_stream *io)
46{
47	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
48	bool elapsed = false;
49	unsigned long flags;
50
51	/*
52	 * Renesas sound Gen1 needs 1 DMAC,
53	 * Gen2 needs 2 DMAC.
54	 * In Gen2 case, it are Audio-DMAC, and Audio-DMAC-peri-peri.
55	 * But, Audio-DMAC-peri-peri doesn't have interrupt,
56	 * and this driver is assuming that here.
57	 *
58	 * If Audio-DMAC-peri-peri has interrpt,
59	 * rsnd_dai_pointer_update() will be called twice,
60	 * ant it will breaks io->byte_pos
61	 */
62	spin_lock_irqsave(&priv->lock, flags);
63
64	if (rsnd_io_is_working(io))
65		elapsed = rsnd_dai_pointer_update(io, io->byte_per_period);
66
67	spin_unlock_irqrestore(&priv->lock, flags);
68
69	if (elapsed)
70		rsnd_dai_period_elapsed(io);
71}
72
73static void rsnd_dmaen_complete(void *data)
74{
75	struct rsnd_mod *mod = data;
76
77	rsnd_mod_interrupt(mod, __rsnd_dmaen_complete);
78}
79
80static void rsnd_dmaen_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
81{
82	struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
83
84	dmaengine_terminate_all(dmaen->chan);
85}
86
87static void rsnd_dmaen_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
88{
89	struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
90	struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
91	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
92	struct snd_pcm_substream *substream = io->substream;
93	struct device *dev = rsnd_priv_to_dev(priv);
94	struct dma_async_tx_descriptor *desc;
95	int is_play = rsnd_io_is_play(io);
96
97	desc = dmaengine_prep_dma_cyclic(dmaen->chan,
98					 substream->runtime->dma_addr,
99					 snd_pcm_lib_buffer_bytes(substream),
100					 snd_pcm_lib_period_bytes(substream),
101					 is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM,
102					 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
103
104	if (!desc) {
105		dev_err(dev, "dmaengine_prep_slave_sg() fail\n");
106		return;
107	}
108
109	desc->callback		= rsnd_dmaen_complete;
110	desc->callback_param	= mod;
111
112	if (dmaengine_submit(desc) < 0) {
113		dev_err(dev, "dmaengine_submit() fail\n");
114		return;
115	}
116
117	dma_async_issue_pending(dmaen->chan);
118}
119
120struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node,
121					  struct rsnd_mod *mod, char *name)
122{
123	struct dma_chan *chan;
124	struct device_node *np;
125	int i = 0;
126
127	for_each_child_of_node(of_node, np) {
128		if (i == rsnd_mod_id(mod))
129			break;
130		i++;
131	}
132
133	chan = of_dma_request_slave_channel(np, name);
134
135	of_node_put(np);
136	of_node_put(of_node);
137
138	return chan;
139}
140
141static struct dma_chan *rsnd_dmaen_request_channel(struct rsnd_dai_stream *io,
142						   struct rsnd_mod *mod_from,
143						   struct rsnd_mod *mod_to)
144{
145	if ((!mod_from && !mod_to) ||
146	    (mod_from && mod_to))
147		return NULL;
148
149	if (mod_from)
150		return rsnd_mod_dma_req(io, mod_from);
151	else
152		return rsnd_mod_dma_req(io, mod_to);
153}
154
155static int rsnd_dmaen_init(struct rsnd_dai_stream *io,
156			   struct rsnd_dma *dma, int id,
157			   struct rsnd_mod *mod_from, struct rsnd_mod *mod_to)
158{
159	struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
160	struct rsnd_priv *priv = rsnd_io_to_priv(io);
161	struct device *dev = rsnd_priv_to_dev(priv);
162	struct dma_slave_config cfg = {};
163	int is_play = rsnd_io_is_play(io);
164	int ret;
165
166	if (dmaen->chan) {
167		dev_err(dev, "it already has dma channel\n");
168		return -EIO;
169	}
170
171	if (dev->of_node) {
172		dmaen->chan = rsnd_dmaen_request_channel(io, mod_from, mod_to);
173	} else {
174		dma_cap_mask_t mask;
175
176		dma_cap_zero(mask);
177		dma_cap_set(DMA_SLAVE, mask);
178
179		dmaen->chan = dma_request_channel(mask, shdma_chan_filter,
180						  (void *)(uintptr_t)id);
181	}
182	if (IS_ERR_OR_NULL(dmaen->chan)) {
183		dmaen->chan = NULL;
184		dev_err(dev, "can't get dma channel\n");
185		goto rsnd_dma_channel_err;
186	}
187
188	cfg.direction	= is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
189	cfg.src_addr	= dma->src_addr;
190	cfg.dst_addr	= dma->dst_addr;
191	cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
192	cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
193
194	dev_dbg(dev, "%s %pad -> %pad\n",
195		dma->ops->name,
196		&cfg.src_addr, &cfg.dst_addr);
197
198	ret = dmaengine_slave_config(dmaen->chan, &cfg);
199	if (ret < 0)
200		goto rsnd_dma_init_err;
201
202	return 0;
203
204rsnd_dma_init_err:
205	rsnd_dma_quit(io, dma);
206rsnd_dma_channel_err:
207
208	/*
209	 * DMA failed. try to PIO mode
210	 * see
211	 *	rsnd_ssi_fallback()
212	 *	rsnd_rdai_continuance_probe()
213	 */
214	return -EAGAIN;
215}
216
217static void rsnd_dmaen_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
218{
219	struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
220
221	if (dmaen->chan)
222		dma_release_channel(dmaen->chan);
223
224	dmaen->chan = NULL;
225}
226
227static struct rsnd_dma_ops rsnd_dmaen_ops = {
228	.name	= "audmac",
229	.start	= rsnd_dmaen_start,
230	.stop	= rsnd_dmaen_stop,
231	.init	= rsnd_dmaen_init,
232	.quit	= rsnd_dmaen_quit,
233};
234
235/*
236 *		Audio DMAC peri peri
237 */
238static const u8 gen2_id_table_ssiu[] = {
239	0x00, /* SSI00 */
240	0x04, /* SSI10 */
241	0x08, /* SSI20 */
242	0x0c, /* SSI3  */
243	0x0d, /* SSI4  */
244	0x0e, /* SSI5  */
245	0x0f, /* SSI6  */
246	0x10, /* SSI7  */
247	0x11, /* SSI8  */
248	0x12, /* SSI90 */
249};
250static const u8 gen2_id_table_scu[] = {
251	0x2d, /* SCU_SRCI0 */
252	0x2e, /* SCU_SRCI1 */
253	0x2f, /* SCU_SRCI2 */
254	0x30, /* SCU_SRCI3 */
255	0x31, /* SCU_SRCI4 */
256	0x32, /* SCU_SRCI5 */
257	0x33, /* SCU_SRCI6 */
258	0x34, /* SCU_SRCI7 */
259	0x35, /* SCU_SRCI8 */
260	0x36, /* SCU_SRCI9 */
261};
262static const u8 gen2_id_table_cmd[] = {
263	0x37, /* SCU_CMD0 */
264	0x38, /* SCU_CMD1 */
265};
266
267static u32 rsnd_dmapp_get_id(struct rsnd_dai_stream *io,
268			     struct rsnd_mod *mod)
269{
270	struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io);
271	struct rsnd_mod *src = rsnd_io_to_mod_src(io);
272	struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io);
273	const u8 *entry = NULL;
274	int id = rsnd_mod_id(mod);
275	int size = 0;
276
277	if (mod == ssi) {
278		entry = gen2_id_table_ssiu;
279		size = ARRAY_SIZE(gen2_id_table_ssiu);
280	} else if (mod == src) {
281		entry = gen2_id_table_scu;
282		size = ARRAY_SIZE(gen2_id_table_scu);
283	} else if (mod == dvc) {
284		entry = gen2_id_table_cmd;
285		size = ARRAY_SIZE(gen2_id_table_cmd);
286	}
287
288	if (!entry)
289		return 0xFF;
290
291	if (size <= id)
292		return 0xFF;
293
294	return entry[id];
295}
296
297static u32 rsnd_dmapp_get_chcr(struct rsnd_dai_stream *io,
298			       struct rsnd_mod *mod_from,
299			       struct rsnd_mod *mod_to)
300{
301	return	(rsnd_dmapp_get_id(io, mod_from) << 24) +
302		(rsnd_dmapp_get_id(io, mod_to) << 16);
303}
304
305#define rsnd_dmapp_addr(dmac, dma, reg) \
306	(dmac->base + 0x20 + reg + \
307	 (0x10 * rsnd_dma_to_dmapp(dma)->dmapp_id))
308static void rsnd_dmapp_write(struct rsnd_dma *dma, u32 data, u32 reg)
309{
310	struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
311	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
312	struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
313	struct device *dev = rsnd_priv_to_dev(priv);
314
315	dev_dbg(dev, "w %p : %08x\n", rsnd_dmapp_addr(dmac, dma, reg), data);
316
317	iowrite32(data, rsnd_dmapp_addr(dmac, dma, reg));
318}
319
320static u32 rsnd_dmapp_read(struct rsnd_dma *dma, u32 reg)
321{
322	struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
323	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
324	struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
325
326	return ioread32(rsnd_dmapp_addr(dmac, dma, reg));
327}
328
329static void rsnd_dmapp_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
330{
331	int i;
332
333	rsnd_dmapp_write(dma, 0, PDMACHCR);
334
335	for (i = 0; i < 1024; i++) {
336		if (0 == rsnd_dmapp_read(dma, PDMACHCR))
337			return;
338		udelay(1);
339	}
340}
341
342static void rsnd_dmapp_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
343{
344	struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma);
345
346	rsnd_dmapp_write(dma, dma->src_addr,	PDMASAR);
347	rsnd_dmapp_write(dma, dma->dst_addr,	PDMADAR);
348	rsnd_dmapp_write(dma, dmapp->chcr,	PDMACHCR);
349}
350
351static int rsnd_dmapp_init(struct rsnd_dai_stream *io,
352			   struct rsnd_dma *dma, int id,
353			   struct rsnd_mod *mod_from, struct rsnd_mod *mod_to)
354{
355	struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma);
356	struct rsnd_priv *priv = rsnd_io_to_priv(io);
357	struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
358	struct device *dev = rsnd_priv_to_dev(priv);
359
360	dmapp->dmapp_id = dmac->dmapp_num;
361	dmapp->chcr = rsnd_dmapp_get_chcr(io, mod_from, mod_to) | PDMACHCR_DE;
362
363	dmac->dmapp_num++;
364
365	rsnd_dmapp_stop(io, dma);
366
367	dev_dbg(dev, "id/src/dst/chcr = %d/%pad/%pad/%08x\n",
368		dmapp->dmapp_id, &dma->src_addr, &dma->dst_addr, dmapp->chcr);
369
370	return 0;
371}
372
373static struct rsnd_dma_ops rsnd_dmapp_ops = {
374	.name	= "audmac-pp",
375	.start	= rsnd_dmapp_start,
376	.stop	= rsnd_dmapp_stop,
377	.init	= rsnd_dmapp_init,
378	.quit	= rsnd_dmapp_stop,
379};
380
381/*
382 *		Common DMAC Interface
383 */
384
385/*
386 *	DMA read/write register offset
387 *
388 *	RSND_xxx_I_N	for Audio DMAC input
389 *	RSND_xxx_O_N	for Audio DMAC output
390 *	RSND_xxx_I_P	for Audio DMAC peri peri input
391 *	RSND_xxx_O_P	for Audio DMAC peri peri output
392 *
393 *	ex) R-Car H2 case
394 *	      mod        / DMAC in    / DMAC out   / DMAC PP in / DMAC pp out
395 *	SSI : 0xec541000 / 0xec241008 / 0xec24100c
396 *	SSIU: 0xec541000 / 0xec100000 / 0xec100000 / 0xec400000 / 0xec400000
397 *	SCU : 0xec500000 / 0xec000000 / 0xec004000 / 0xec300000 / 0xec304000
398 *	CMD : 0xec500000 /            / 0xec008000                0xec308000
399 */
400#define RDMA_SSI_I_N(addr, i)	(addr ##_reg - 0x00300000 + (0x40 * i) + 0x8)
401#define RDMA_SSI_O_N(addr, i)	(addr ##_reg - 0x00300000 + (0x40 * i) + 0xc)
402
403#define RDMA_SSIU_I_N(addr, i)	(addr ##_reg - 0x00441000 + (0x1000 * i))
404#define RDMA_SSIU_O_N(addr, i)	(addr ##_reg - 0x00441000 + (0x1000 * i))
405
406#define RDMA_SSIU_I_P(addr, i)	(addr ##_reg - 0x00141000 + (0x1000 * i))
407#define RDMA_SSIU_O_P(addr, i)	(addr ##_reg - 0x00141000 + (0x1000 * i))
408
409#define RDMA_SRC_I_N(addr, i)	(addr ##_reg - 0x00500000 + (0x400 * i))
410#define RDMA_SRC_O_N(addr, i)	(addr ##_reg - 0x004fc000 + (0x400 * i))
411
412#define RDMA_SRC_I_P(addr, i)	(addr ##_reg - 0x00200000 + (0x400 * i))
413#define RDMA_SRC_O_P(addr, i)	(addr ##_reg - 0x001fc000 + (0x400 * i))
414
415#define RDMA_CMD_O_N(addr, i)	(addr ##_reg - 0x004f8000 + (0x400 * i))
416#define RDMA_CMD_O_P(addr, i)	(addr ##_reg - 0x001f8000 + (0x400 * i))
417
418static dma_addr_t
419rsnd_gen2_dma_addr(struct rsnd_dai_stream *io,
420		   struct rsnd_mod *mod,
421		   int is_play, int is_from)
422{
423	struct rsnd_priv *priv = rsnd_io_to_priv(io);
424	struct device *dev = rsnd_priv_to_dev(priv);
425	phys_addr_t ssi_reg = rsnd_gen_get_phy_addr(priv, RSND_GEN2_SSI);
426	phys_addr_t src_reg = rsnd_gen_get_phy_addr(priv, RSND_GEN2_SCU);
427	int is_ssi = !!(rsnd_io_to_mod_ssi(io) == mod);
428	int use_src = !!rsnd_io_to_mod_src(io);
429	int use_cmd = !!rsnd_io_to_mod_dvc(io) ||
430		      !!rsnd_io_to_mod_mix(io) ||
431		      !!rsnd_io_to_mod_ctu(io);
432	int id = rsnd_mod_id(mod);
433	struct dma_addr {
434		dma_addr_t out_addr;
435		dma_addr_t in_addr;
436	} dma_addrs[3][2][3] = {
437		/* SRC */
438		{{{ 0,				0 },
439		  /* Capture */
440		  { RDMA_SRC_O_N(src, id),	RDMA_SRC_I_P(src, id) },
441		  { RDMA_CMD_O_N(src, id),	RDMA_SRC_I_P(src, id) } },
442		 /* Playback */
443		 {{ 0,				0, },
444		  { RDMA_SRC_O_P(src, id),	RDMA_SRC_I_N(src, id) },
445		  { RDMA_CMD_O_P(src, id),	RDMA_SRC_I_N(src, id) } }
446		},
447		/* SSI */
448		/* Capture */
449		{{{ RDMA_SSI_O_N(ssi, id),	0 },
450		  { RDMA_SSIU_O_P(ssi, id),	0 },
451		  { RDMA_SSIU_O_P(ssi, id),	0 } },
452		 /* Playback */
453		 {{ 0,				RDMA_SSI_I_N(ssi, id) },
454		  { 0,				RDMA_SSIU_I_P(ssi, id) },
455		  { 0,				RDMA_SSIU_I_P(ssi, id) } }
456		},
457		/* SSIU */
458		/* Capture */
459		{{{ RDMA_SSIU_O_N(ssi, id),	0 },
460		  { RDMA_SSIU_O_P(ssi, id),	0 },
461		  { RDMA_SSIU_O_P(ssi, id),	0 } },
462		 /* Playback */
463		 {{ 0,				RDMA_SSIU_I_N(ssi, id) },
464		  { 0,				RDMA_SSIU_I_P(ssi, id) },
465		  { 0,				RDMA_SSIU_I_P(ssi, id) } } },
466	};
467
468	/* it shouldn't happen */
469	if (use_cmd && !use_src)
470		dev_err(dev, "DVC is selected without SRC\n");
471
472	/* use SSIU or SSI ? */
473	if (is_ssi && rsnd_ssi_use_busif(io))
474		is_ssi++;
475
476	return (is_from) ?
477		dma_addrs[is_ssi][is_play][use_src + use_cmd].out_addr :
478		dma_addrs[is_ssi][is_play][use_src + use_cmd].in_addr;
479}
480
481static dma_addr_t rsnd_dma_addr(struct rsnd_dai_stream *io,
482				struct rsnd_mod *mod,
483				int is_play, int is_from)
484{
485	struct rsnd_priv *priv = rsnd_io_to_priv(io);
486
487	/*
488	 * gen1 uses default DMA addr
489	 */
490	if (rsnd_is_gen1(priv))
491		return 0;
492
493	if (!mod)
494		return 0;
495
496	return rsnd_gen2_dma_addr(io, mod, is_play, is_from);
497}
498
499#define MOD_MAX (RSND_MOD_MAX + 1) /* +Memory */
500static void rsnd_dma_of_path(struct rsnd_dma *dma,
501			     struct rsnd_dai_stream *io,
502			     int is_play,
503			     struct rsnd_mod **mod_from,
504			     struct rsnd_mod **mod_to)
505{
506	struct rsnd_mod *this = rsnd_dma_to_mod(dma);
507	struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io);
508	struct rsnd_mod *src = rsnd_io_to_mod_src(io);
509	struct rsnd_mod *ctu = rsnd_io_to_mod_ctu(io);
510	struct rsnd_mod *mix = rsnd_io_to_mod_mix(io);
511	struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io);
512	struct rsnd_mod *mod[MOD_MAX];
513	struct rsnd_mod *mod_start, *mod_end;
514	struct rsnd_priv *priv = rsnd_mod_to_priv(this);
515	struct device *dev = rsnd_priv_to_dev(priv);
516	int nr, i;
517
518	if (!ssi)
519		return;
520
521	nr = 0;
522	for (i = 0; i < MOD_MAX; i++) {
523		mod[i] = NULL;
524		nr += !!rsnd_io_to_mod(io, i);
525	}
526
527	/*
528	 * [S] -*-> [E]
529	 * [S] -*-> SRC -o-> [E]
530	 * [S] -*-> SRC -> DVC -o-> [E]
531	 * [S] -*-> SRC -> CTU -> MIX -> DVC -o-> [E]
532	 *
533	 * playback	[S] = mem
534	 *		[E] = SSI
535	 *
536	 * capture	[S] = SSI
537	 *		[E] = mem
538	 *
539	 * -*->		Audio DMAC
540	 * -o->		Audio DMAC peri peri
541	 */
542	mod_start	= (is_play) ? NULL : ssi;
543	mod_end		= (is_play) ? ssi  : NULL;
544
545	mod[0] = mod_start;
546	for (i = 1; i < nr; i++) {
547		if (src) {
548			mod[i] = src;
549			src = NULL;
550		} else if (ctu) {
551			mod[i] = ctu;
552			ctu = NULL;
553		} else if (mix) {
554			mod[i] = mix;
555			mix = NULL;
556		} else if (dvc) {
557			mod[i] = dvc;
558			dvc = NULL;
559		}
560	}
561	mod[i] = mod_end;
562
563	/*
564	 *		| SSI | SRC |
565	 * -------------+-----+-----+
566	 *  is_play	|  o  |  *  |
567	 * !is_play	|  *  |  o  |
568	 */
569	if ((this == ssi) == (is_play)) {
570		*mod_from	= mod[nr - 1];
571		*mod_to		= mod[nr];
572	} else {
573		*mod_from	= mod[0];
574		*mod_to		= mod[1];
575	}
576
577	dev_dbg(dev, "module connection (this is %s[%d])\n",
578		rsnd_mod_name(this), rsnd_mod_id(this));
579	for (i = 0; i <= nr; i++) {
580		dev_dbg(dev, "  %s[%d]%s\n",
581		       rsnd_mod_name(mod[i]), rsnd_mod_id(mod[i]),
582		       (mod[i] == *mod_from) ? " from" :
583		       (mod[i] == *mod_to)   ? " to" : "");
584	}
585}
586
587void rsnd_dma_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
588{
589	dma->ops->stop(io, dma);
590}
591
592void rsnd_dma_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
593{
594	dma->ops->start(io, dma);
595}
596
597void rsnd_dma_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
598{
599	struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
600	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
601	struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
602
603	if (!dmac)
604		return;
605
606	dma->ops->quit(io, dma);
607}
608
609int rsnd_dma_init(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id)
610{
611	struct rsnd_mod *mod_from = NULL;
612	struct rsnd_mod *mod_to = NULL;
613	struct rsnd_priv *priv = rsnd_io_to_priv(io);
614	struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
615	struct device *dev = rsnd_priv_to_dev(priv);
616	int is_play = rsnd_io_is_play(io);
617
618	/*
619	 * DMA failed. try to PIO mode
620	 * see
621	 *	rsnd_ssi_fallback()
622	 *	rsnd_rdai_continuance_probe()
623	 */
624	if (!dmac)
625		return -EAGAIN;
626
627	rsnd_dma_of_path(dma, io, is_play, &mod_from, &mod_to);
628
629	dma->src_addr = rsnd_dma_addr(io, mod_from, is_play, 1);
630	dma->dst_addr = rsnd_dma_addr(io, mod_to,   is_play, 0);
631
632	/* for Gen2 */
633	if (mod_from && mod_to)
634		dma->ops = &rsnd_dmapp_ops;
635	else
636		dma->ops = &rsnd_dmaen_ops;
637
638	/* for Gen1, overwrite */
639	if (rsnd_is_gen1(priv))
640		dma->ops = &rsnd_dmaen_ops;
641
642	dev_dbg(dev, "%s %s[%d] -> %s[%d]\n",
643		dma->ops->name,
644		rsnd_mod_name(mod_from), rsnd_mod_id(mod_from),
645		rsnd_mod_name(mod_to),   rsnd_mod_id(mod_to));
646
647	return dma->ops->init(io, dma, id, mod_from, mod_to);
648}
649
650int rsnd_dma_probe(struct platform_device *pdev,
651		   const struct rsnd_of_data *of_data,
652		   struct rsnd_priv *priv)
653{
654	struct device *dev = rsnd_priv_to_dev(priv);
655	struct rsnd_dma_ctrl *dmac;
656	struct resource *res;
657
658	/*
659	 * for Gen1
660	 */
661	if (rsnd_is_gen1(priv))
662		return 0;
663
664	/*
665	 * for Gen2
666	 */
667	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "audmapp");
668	dmac = devm_kzalloc(dev, sizeof(*dmac), GFP_KERNEL);
669	if (!dmac || !res) {
670		dev_err(dev, "dma allocate failed\n");
671		return 0; /* it will be PIO mode */
672	}
673
674	dmac->dmapp_num = 0;
675	dmac->base = devm_ioremap_resource(dev, res);
676	if (IS_ERR(dmac->base))
677		return PTR_ERR(dmac->base);
678
679	priv->dma = dmac;
680
681	return 0;
682}
683