dma.c 19.5 KB
Newer Older
1 2 3 4 5 6 7
// SPDX-License-Identifier: GPL-2.0
//
// Renesas R-Car Audio DMAC support
//
// Copyright (C) 2015 Renesas Electronics Corp.
// Copyright (c) 2015 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

8
#include <linux/delay.h>
9
#include <linux/of_dma.h>
10 11
#include "rsnd.h"

12 13 14 15 16 17 18 19 20 21
/*
 * Audio DMAC peri peri register
 */
#define PDMASAR		0x00
#define PDMADAR		0x04
#define PDMACHCR	0x0c

/* PDMACHCR */
#define PDMACHCR_DE		(1 << 0)

22 23 24

struct rsnd_dmaen {
	struct dma_chan		*chan;
25
	dma_cookie_t		cookie;
26
	unsigned int		dma_len;
27 28 29 30 31 32 33 34
};

struct rsnd_dmapp {
	int			dmapp_id;
	u32			chcr;
};

struct rsnd_dma {
35
	struct rsnd_mod		mod;
36 37
	struct rsnd_mod		*mod_from;
	struct rsnd_mod		*mod_to;
38 39 40 41 42 43 44 45
	dma_addr_t		src_addr;
	dma_addr_t		dst_addr;
	union {
		struct rsnd_dmaen en;
		struct rsnd_dmapp pp;
	} dma;
};

46 47
struct rsnd_dma_ctrl {
	void __iomem *base;
48
	int dmaen_num;
49 50 51 52
	int dmapp_num;
};

#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 55
#define rsnd_dma_to_dmaen(dma)	(&(dma)->dma.en)
#define rsnd_dma_to_dmapp(dma)	(&(dma)->dma.pp)
56

57 58 59 60 61 62 63 64
/* for DEBUG */
static struct rsnd_mod_ops mem_ops = {
	.name = "mem",
};

static struct rsnd_mod mem = {
};

65 66 67
/*
 *		Audio DMAC
 */
68 69
static void __rsnd_dmaen_complete(struct rsnd_mod *mod,
				  struct rsnd_dai_stream *io)
70
{
71
	if (rsnd_io_is_working(io))
72
		rsnd_dai_period_elapsed(io);
73 74
}

75 76 77 78 79 80 81
static void rsnd_dmaen_complete(void *data)
{
	struct rsnd_mod *mod = data;

	rsnd_mod_interrupt(mod, __rsnd_dmaen_complete);
}

82 83 84 85 86 87 88 89 90 91 92 93 94 95
static struct dma_chan *rsnd_dmaen_request_channel(struct rsnd_dai_stream *io,
						   struct rsnd_mod *mod_from,
						   struct rsnd_mod *mod_to)
{
	if ((!mod_from && !mod_to) ||
	    (mod_from && mod_to))
		return NULL;

	if (mod_from)
		return rsnd_mod_dma_req(io, mod_from);
	else
		return rsnd_mod_dma_req(io, mod_to);
}

96 97 98
static int rsnd_dmaen_stop(struct rsnd_mod *mod,
			   struct rsnd_dai_stream *io,
			   struct rsnd_priv *priv)
99
{
100
	struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
101 102
	struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);

103
	if (dmaen->chan)
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
		dmaengine_terminate_all(dmaen->chan);

	return 0;
}

static int rsnd_dmaen_nolock_stop(struct rsnd_mod *mod,
				   struct rsnd_dai_stream *io,
				   struct rsnd_priv *priv)
{
	struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
	struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);

	/*
	 * DMAEngine release uses mutex lock.
	 * Thus, it shouldn't be called under spinlock.
	 * Let's call it under nolock_start
	 */
	if (dmaen->chan)
		dma_release_channel(dmaen->chan);

	dmaen->chan = NULL;

	return 0;
}

static int rsnd_dmaen_nolock_start(struct rsnd_mod *mod,
			    struct rsnd_dai_stream *io,
			    struct rsnd_priv *priv)
{
	struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
	struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
	struct device *dev = rsnd_priv_to_dev(priv);

	if (dmaen->chan) {
		dev_err(dev, "it already has dma channel\n");
		return -EIO;
	}

	/*
	 * DMAEngine request uses mutex lock.
	 * Thus, it shouldn't be called under spinlock.
	 * Let's call it under nolock_start
	 */
	dmaen->chan = rsnd_dmaen_request_channel(io,
						 dma->mod_from,
						 dma->mod_to);
	if (IS_ERR_OR_NULL(dmaen->chan)) {
		dmaen->chan = NULL;
		dev_err(dev, "can't get dma channel\n");
153
		return -EIO;
154
	}
155 156

	return 0;
157 158
}

159 160 161
static int rsnd_dmaen_start(struct rsnd_mod *mod,
			    struct rsnd_dai_stream *io,
			    struct rsnd_priv *priv)
162
{
163
	struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
164
	struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
165 166 167
	struct snd_pcm_substream *substream = io->substream;
	struct device *dev = rsnd_priv_to_dev(priv);
	struct dma_async_tx_descriptor *desc;
168
	struct dma_slave_config cfg = {};
169
	int is_play = rsnd_io_is_play(io);
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
	int ret;

	cfg.direction	= is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
	cfg.src_addr	= dma->src_addr;
	cfg.dst_addr	= dma->dst_addr;
	cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
	cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;

	dev_dbg(dev, "%s[%d] %pad -> %pad\n",
		rsnd_mod_name(mod), rsnd_mod_id(mod),
		&cfg.src_addr, &cfg.dst_addr);

	ret = dmaengine_slave_config(dmaen->chan, &cfg);
	if (ret < 0)
		return ret;
185

186
	desc = dmaengine_prep_dma_cyclic(dmaen->chan,
187 188 189
					 substream->runtime->dma_addr,
					 snd_pcm_lib_buffer_bytes(substream),
					 snd_pcm_lib_period_bytes(substream),
190
					 is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM,
191 192 193 194
					 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);

	if (!desc) {
		dev_err(dev, "dmaengine_prep_slave_sg() fail\n");
195
		return -EIO;
196 197
	}

198
	desc->callback		= rsnd_dmaen_complete;
199
	desc->callback_param	= rsnd_mod_get(dma);
200

201
	dmaen->dma_len		= snd_pcm_lib_buffer_bytes(substream);
202

203 204
	dmaen->cookie = dmaengine_submit(desc);
	if (dmaen->cookie < 0) {
205
		dev_err(dev, "dmaengine_submit() fail\n");
206
		return -EIO;
207 208
	}

209
	dma_async_issue_pending(dmaen->chan);
210 211

	return 0;
212 213
}

214 215 216
struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node,
					  struct rsnd_mod *mod, char *name)
{
217
	struct dma_chan *chan = NULL;
218 219 220 221
	struct device_node *np;
	int i = 0;

	for_each_child_of_node(of_node, np) {
222 223
		if (i == rsnd_mod_id(mod) && (!chan))
			chan = of_dma_request_slave_channel(np, name);
224 225 226
		i++;
	}

227
	/* It should call of_node_put(), since, it is rsnd_xxx_of_node() */
228 229 230 231 232
	of_node_put(of_node);

	return chan;
}

233
static int rsnd_dmaen_attach(struct rsnd_dai_stream *io,
234
			   struct rsnd_dma *dma,
235
			   struct rsnd_mod *mod_from, struct rsnd_mod *mod_to)
236
{
237
	struct rsnd_priv *priv = rsnd_io_to_priv(io);
238
	struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
239 240 241 242 243
	struct dma_chan *chan;

	/* try to get DMAEngine channel */
	chan = rsnd_dmaen_request_channel(io, mod_from, mod_to);
	if (IS_ERR_OR_NULL(chan)) {
244 245 246 247
		/* Let's follow when -EPROBE_DEFER case */
		if (PTR_ERR(chan) == -EPROBE_DEFER)
			return PTR_ERR(chan);

248 249 250 251 252 253 254
		/*
		 * DMA failed. try to PIO mode
		 * see
		 *	rsnd_ssi_fallback()
		 *	rsnd_rdai_continuance_probe()
		 */
		return -EAGAIN;
255
	}
256

K
Kuninori Morimoto 已提交
257 258 259 260 261 262 263
	/*
	 * use it for IPMMU if needed
	 * see
	 *	rsnd_preallocate_pages()
	 */
	io->dmac_dev = chan->device->dev;

264
	dma_release_channel(chan);
265

266 267
	dmac->dmaen_num++;

268 269 270
	return 0;
}

271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
static int rsnd_dmaen_pointer(struct rsnd_mod *mod,
			      struct rsnd_dai_stream *io,
			      snd_pcm_uframes_t *pointer)
{
	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
	struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
	struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
	struct dma_tx_state state;
	enum dma_status status;
	unsigned int pos = 0;

	status = dmaengine_tx_status(dmaen->chan, dmaen->cookie, &state);
	if (status == DMA_IN_PROGRESS || status == DMA_PAUSED) {
		if (state.residue > 0 && state.residue <= dmaen->dma_len)
			pos = dmaen->dma_len - state.residue;
	}
	*pointer = bytes_to_frames(runtime, pos);

	return 0;
}

292
static struct rsnd_mod_ops rsnd_dmaen_ops = {
293
	.name	= "audmac",
294 295
	.nolock_start = rsnd_dmaen_nolock_start,
	.nolock_stop  = rsnd_dmaen_nolock_stop,
296 297
	.start	= rsnd_dmaen_start,
	.stop	= rsnd_dmaen_stop,
298
	.pointer= rsnd_dmaen_pointer,
299 300
};

301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
/*
 *		Audio DMAC peri peri
 */
static const u8 gen2_id_table_ssiu[] = {
	0x00, /* SSI00 */
	0x04, /* SSI10 */
	0x08, /* SSI20 */
	0x0c, /* SSI3  */
	0x0d, /* SSI4  */
	0x0e, /* SSI5  */
	0x0f, /* SSI6  */
	0x10, /* SSI7  */
	0x11, /* SSI8  */
	0x12, /* SSI90 */
};
static const u8 gen2_id_table_scu[] = {
	0x2d, /* SCU_SRCI0 */
	0x2e, /* SCU_SRCI1 */
	0x2f, /* SCU_SRCI2 */
	0x30, /* SCU_SRCI3 */
	0x31, /* SCU_SRCI4 */
	0x32, /* SCU_SRCI5 */
	0x33, /* SCU_SRCI6 */
	0x34, /* SCU_SRCI7 */
	0x35, /* SCU_SRCI8 */
	0x36, /* SCU_SRCI9 */
};
static const u8 gen2_id_table_cmd[] = {
	0x37, /* SCU_CMD0 */
	0x38, /* SCU_CMD1 */
};

333 334
static u32 rsnd_dmapp_get_id(struct rsnd_dai_stream *io,
			     struct rsnd_mod *mod)
335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
{
	struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io);
	struct rsnd_mod *src = rsnd_io_to_mod_src(io);
	struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io);
	const u8 *entry = NULL;
	int id = rsnd_mod_id(mod);
	int size = 0;

	if (mod == ssi) {
		entry = gen2_id_table_ssiu;
		size = ARRAY_SIZE(gen2_id_table_ssiu);
	} else if (mod == src) {
		entry = gen2_id_table_scu;
		size = ARRAY_SIZE(gen2_id_table_scu);
	} else if (mod == dvc) {
		entry = gen2_id_table_cmd;
		size = ARRAY_SIZE(gen2_id_table_cmd);
	}

354 355
	if ((!entry) || (size <= id)) {
		struct device *dev = rsnd_priv_to_dev(rsnd_io_to_priv(io));
356

357 358 359 360 361 362
		dev_err(dev, "unknown connection (%s[%d])\n",
			rsnd_mod_name(mod), rsnd_mod_id(mod));

		/* use non-prohibited SRS number as error */
		return 0x00; /* SSI00 */
	}
363 364 365 366

	return entry[id];
}

367 368
static u32 rsnd_dmapp_get_chcr(struct rsnd_dai_stream *io,
			       struct rsnd_mod *mod_from,
369 370
			       struct rsnd_mod *mod_to)
{
371 372
	return	(rsnd_dmapp_get_id(io, mod_from) << 24) +
		(rsnd_dmapp_get_id(io, mod_to) << 16);
373 374 375
}

#define rsnd_dmapp_addr(dmac, dma, reg) \
376 377
	(dmac->base + 0x20 + reg + \
	 (0x10 * rsnd_dma_to_dmapp(dma)->dmapp_id))
378 379
static void rsnd_dmapp_write(struct rsnd_dma *dma, u32 data, u32 reg)
{
380
	struct rsnd_mod *mod = rsnd_mod_get(dma);
381 382 383 384 385 386 387 388 389 390 391
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
	struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
	struct device *dev = rsnd_priv_to_dev(priv);

	dev_dbg(dev, "w %p : %08x\n", rsnd_dmapp_addr(dmac, dma, reg), data);

	iowrite32(data, rsnd_dmapp_addr(dmac, dma, reg));
}

static u32 rsnd_dmapp_read(struct rsnd_dma *dma, u32 reg)
{
392
	struct rsnd_mod *mod = rsnd_mod_get(dma);
393 394 395 396 397 398
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
	struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);

	return ioread32(rsnd_dmapp_addr(dmac, dma, reg));
}

399 400 401 402 403
static void rsnd_dmapp_bset(struct rsnd_dma *dma, u32 data, u32 mask, u32 reg)
{
	struct rsnd_mod *mod = rsnd_mod_get(dma);
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
	struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
404
	void __iomem *addr = rsnd_dmapp_addr(dmac, dma, reg);
405 406 407 408 409 410 411 412
	u32 val = ioread32(addr);

	val &= ~mask;
	val |= (data & mask);

	iowrite32(val, addr);
}

413 414 415
static int rsnd_dmapp_stop(struct rsnd_mod *mod,
			   struct rsnd_dai_stream *io,
			   struct rsnd_priv *priv)
416
{
417
	struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
418 419
	int i;

420
	rsnd_dmapp_bset(dma, 0,  PDMACHCR_DE, PDMACHCR);
421 422

	for (i = 0; i < 1024; i++) {
423
		if (0 == (rsnd_dmapp_read(dma, PDMACHCR) & PDMACHCR_DE))
424
			return 0;
425 426
		udelay(1);
	}
427

428
	return -EIO;
429 430
}

431 432 433
static int rsnd_dmapp_start(struct rsnd_mod *mod,
			    struct rsnd_dai_stream *io,
			    struct rsnd_priv *priv)
434
{
435
	struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
436 437
	struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma);

438 439
	rsnd_dmapp_write(dma, dma->src_addr,	PDMASAR);
	rsnd_dmapp_write(dma, dma->dst_addr,	PDMADAR);
440
	rsnd_dmapp_write(dma, dmapp->chcr,	PDMACHCR);
441 442

	return 0;
443 444
}

445
static int rsnd_dmapp_attach(struct rsnd_dai_stream *io,
446
			     struct rsnd_dma *dma,
447
			     struct rsnd_mod *mod_from, struct rsnd_mod *mod_to)
448
{
449
	struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma);
450
	struct rsnd_priv *priv = rsnd_io_to_priv(io);
451 452 453
	struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
	struct device *dev = rsnd_priv_to_dev(priv);

454
	dmapp->dmapp_id = dmac->dmapp_num;
455
	dmapp->chcr = rsnd_dmapp_get_chcr(io, mod_from, mod_to) | PDMACHCR_DE;
456 457 458

	dmac->dmapp_num++;

459 460
	dev_dbg(dev, "id/src/dst/chcr = %d/%pad/%pad/%08x\n",
		dmapp->dmapp_id, &dma->src_addr, &dma->dst_addr, dmapp->chcr);
461 462 463 464

	return 0;
}

465
static struct rsnd_mod_ops rsnd_dmapp_ops = {
466
	.name	= "audmac-pp",
467 468 469 470 471 472 473 474 475
	.start	= rsnd_dmapp_start,
	.stop	= rsnd_dmapp_stop,
	.quit	= rsnd_dmapp_stop,
};

/*
 *		Common DMAC Interface
 */

476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509
/*
 *	DMA read/write register offset
 *
 *	RSND_xxx_I_N	for Audio DMAC input
 *	RSND_xxx_O_N	for Audio DMAC output
 *	RSND_xxx_I_P	for Audio DMAC peri peri input
 *	RSND_xxx_O_P	for Audio DMAC peri peri output
 *
 *	ex) R-Car H2 case
 *	      mod        / DMAC in    / DMAC out   / DMAC PP in / DMAC pp out
 *	SSI : 0xec541000 / 0xec241008 / 0xec24100c
 *	SSIU: 0xec541000 / 0xec100000 / 0xec100000 / 0xec400000 / 0xec400000
 *	SCU : 0xec500000 / 0xec000000 / 0xec004000 / 0xec300000 / 0xec304000
 *	CMD : 0xec500000 /            / 0xec008000                0xec308000
 */
#define RDMA_SSI_I_N(addr, i)	(addr ##_reg - 0x00300000 + (0x40 * i) + 0x8)
#define RDMA_SSI_O_N(addr, i)	(addr ##_reg - 0x00300000 + (0x40 * i) + 0xc)

#define RDMA_SSIU_I_N(addr, i)	(addr ##_reg - 0x00441000 + (0x1000 * i))
#define RDMA_SSIU_O_N(addr, i)	(addr ##_reg - 0x00441000 + (0x1000 * i))

#define RDMA_SSIU_I_P(addr, i)	(addr ##_reg - 0x00141000 + (0x1000 * i))
#define RDMA_SSIU_O_P(addr, i)	(addr ##_reg - 0x00141000 + (0x1000 * i))

#define RDMA_SRC_I_N(addr, i)	(addr ##_reg - 0x00500000 + (0x400 * i))
#define RDMA_SRC_O_N(addr, i)	(addr ##_reg - 0x004fc000 + (0x400 * i))

#define RDMA_SRC_I_P(addr, i)	(addr ##_reg - 0x00200000 + (0x400 * i))
#define RDMA_SRC_O_P(addr, i)	(addr ##_reg - 0x001fc000 + (0x400 * i))

#define RDMA_CMD_O_N(addr, i)	(addr ##_reg - 0x004f8000 + (0x400 * i))
#define RDMA_CMD_O_P(addr, i)	(addr ##_reg - 0x001f8000 + (0x400 * i))

static dma_addr_t
510
rsnd_gen2_dma_addr(struct rsnd_dai_stream *io,
511 512 513
		   struct rsnd_mod *mod,
		   int is_play, int is_from)
{
514
	struct rsnd_priv *priv = rsnd_io_to_priv(io);
515 516 517 518 519
	struct device *dev = rsnd_priv_to_dev(priv);
	phys_addr_t ssi_reg = rsnd_gen_get_phy_addr(priv, RSND_GEN2_SSI);
	phys_addr_t src_reg = rsnd_gen_get_phy_addr(priv, RSND_GEN2_SCU);
	int is_ssi = !!(rsnd_io_to_mod_ssi(io) == mod);
	int use_src = !!rsnd_io_to_mod_src(io);
520
	int use_cmd = !!rsnd_io_to_mod_dvc(io) ||
521
		      !!rsnd_io_to_mod_mix(io) ||
522
		      !!rsnd_io_to_mod_ctu(io);
523 524 525 526 527 528
	int id = rsnd_mod_id(mod);
	struct dma_addr {
		dma_addr_t out_addr;
		dma_addr_t in_addr;
	} dma_addrs[3][2][3] = {
		/* SRC */
529
		/* Capture */
530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559
		{{{ 0,				0 },
		  { RDMA_SRC_O_N(src, id),	RDMA_SRC_I_P(src, id) },
		  { RDMA_CMD_O_N(src, id),	RDMA_SRC_I_P(src, id) } },
		 /* Playback */
		 {{ 0,				0, },
		  { RDMA_SRC_O_P(src, id),	RDMA_SRC_I_N(src, id) },
		  { RDMA_CMD_O_P(src, id),	RDMA_SRC_I_N(src, id) } }
		},
		/* SSI */
		/* Capture */
		{{{ RDMA_SSI_O_N(ssi, id),	0 },
		  { RDMA_SSIU_O_P(ssi, id),	0 },
		  { RDMA_SSIU_O_P(ssi, id),	0 } },
		 /* Playback */
		 {{ 0,				RDMA_SSI_I_N(ssi, id) },
		  { 0,				RDMA_SSIU_I_P(ssi, id) },
		  { 0,				RDMA_SSIU_I_P(ssi, id) } }
		},
		/* SSIU */
		/* Capture */
		{{{ RDMA_SSIU_O_N(ssi, id),	0 },
		  { RDMA_SSIU_O_P(ssi, id),	0 },
		  { RDMA_SSIU_O_P(ssi, id),	0 } },
		 /* Playback */
		 {{ 0,				RDMA_SSIU_I_N(ssi, id) },
		  { 0,				RDMA_SSIU_I_P(ssi, id) },
		  { 0,				RDMA_SSIU_I_P(ssi, id) } } },
	};

	/* it shouldn't happen */
560
	if (use_cmd && !use_src)
561 562 563
		dev_err(dev, "DVC is selected without SRC\n");

	/* use SSIU or SSI ? */
564
	if (is_ssi && rsnd_ssi_use_busif(io))
565 566 567
		is_ssi++;

	return (is_from) ?
568 569
		dma_addrs[is_ssi][is_play][use_src + use_cmd].out_addr :
		dma_addrs[is_ssi][is_play][use_src + use_cmd].in_addr;
570 571
}

572
static dma_addr_t rsnd_dma_addr(struct rsnd_dai_stream *io,
573 574 575
				struct rsnd_mod *mod,
				int is_play, int is_from)
{
576 577
	struct rsnd_priv *priv = rsnd_io_to_priv(io);

578 579 580 581 582 583 584 585 586
	/*
	 * gen1 uses default DMA addr
	 */
	if (rsnd_is_gen1(priv))
		return 0;

	if (!mod)
		return 0;

587
	return rsnd_gen2_dma_addr(io, mod, is_play, is_from);
588 589
}

590
#define MOD_MAX (RSND_MOD_MAX + 1) /* +Memory */
591
static void rsnd_dma_of_path(struct rsnd_mod *this,
592
			     struct rsnd_dai_stream *io,
593 594 595 596 597 598
			     int is_play,
			     struct rsnd_mod **mod_from,
			     struct rsnd_mod **mod_to)
{
	struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io);
	struct rsnd_mod *src = rsnd_io_to_mod_src(io);
599
	struct rsnd_mod *ctu = rsnd_io_to_mod_ctu(io);
600
	struct rsnd_mod *mix = rsnd_io_to_mod_mix(io);
601 602
	struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io);
	struct rsnd_mod *mod[MOD_MAX];
603 604 605
	struct rsnd_mod *mod_start, *mod_end;
	struct rsnd_priv *priv = rsnd_mod_to_priv(this);
	struct device *dev = rsnd_priv_to_dev(priv);
606
	int nr, i, idx;
607

608 609
	if (!ssi)
		return;
610

611 612
	nr = 0;
	for (i = 0; i < MOD_MAX; i++) {
613
		mod[i] = NULL;
614 615
		nr += !!rsnd_io_to_mod(io, i);
	}
616 617

	/*
618 619 620 621 622 623 624
	 * [S] -*-> [E]
	 * [S] -*-> SRC -o-> [E]
	 * [S] -*-> SRC -> DVC -o-> [E]
	 * [S] -*-> SRC -> CTU -> MIX -> DVC -o-> [E]
	 *
	 * playback	[S] = mem
	 *		[E] = SSI
625
	 *
626 627
	 * capture	[S] = SSI
	 *		[E] = mem
628
	 *
629 630
	 * -*->		Audio DMAC
	 * -o->		Audio DMAC peri peri
631
	 */
632 633
	mod_start	= (is_play) ? NULL : ssi;
	mod_end		= (is_play) ? ssi  : NULL;
634

635 636
	idx = 0;
	mod[idx++] = mod_start;
637 638
	for (i = 1; i < nr; i++) {
		if (src) {
639
			mod[idx++] = src;
640
			src = NULL;
641
		} else if (ctu) {
642
			mod[idx++] = ctu;
643
			ctu = NULL;
644
		} else if (mix) {
645
			mod[idx++] = mix;
646
			mix = NULL;
647
		} else if (dvc) {
648
			mod[idx++] = dvc;
649 650 651
			dvc = NULL;
		}
	}
652
	mod[idx] = mod_end;
653

654 655 656 657 658 659 660
	/*
	 *		| SSI | SRC |
	 * -------------+-----+-----+
	 *  is_play	|  o  |  *  |
	 * !is_play	|  *  |  o  |
	 */
	if ((this == ssi) == (is_play)) {
661 662
		*mod_from	= mod[idx - 1];
		*mod_to		= mod[idx];
663
	} else {
664 665 666 667 668 669
		*mod_from	= mod[0];
		*mod_to		= mod[1];
	}

	dev_dbg(dev, "module connection (this is %s[%d])\n",
		rsnd_mod_name(this), rsnd_mod_id(this));
670
	for (i = 0; i <= idx; i++) {
671
		dev_dbg(dev, "  %s[%d]%s\n",
672 673 674 675
			rsnd_mod_name(mod[i] ? mod[i] : &mem),
			rsnd_mod_id  (mod[i] ? mod[i] : &mem),
			(mod[i] == *mod_from) ? " from" :
			(mod[i] == *mod_to)   ? " to" : "");
676 677 678
	}
}

679 680
static int rsnd_dma_alloc(struct rsnd_dai_stream *io, struct rsnd_mod *mod,
			  struct rsnd_mod **dma_mod)
681
{
682 683
	struct rsnd_mod *mod_from = NULL;
	struct rsnd_mod *mod_to = NULL;
684
	struct rsnd_priv *priv = rsnd_io_to_priv(io);
685
	struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
686
	struct device *dev = rsnd_priv_to_dev(priv);
687
	struct rsnd_dma *dma;
688 689
	struct rsnd_mod_ops *ops;
	enum rsnd_mod_type type;
690
	int (*attach)(struct rsnd_dai_stream *io, struct rsnd_dma *dma,
691
		      struct rsnd_mod *mod_from, struct rsnd_mod *mod_to);
692
	int is_play = rsnd_io_is_play(io);
693
	int ret, dma_id;
694

695 696 697 698 699 700 701
	/*
	 * DMA failed. try to PIO mode
	 * see
	 *	rsnd_ssi_fallback()
	 *	rsnd_rdai_continuance_probe()
	 */
	if (!dmac)
702
		return -EAGAIN;
703

704
	rsnd_dma_of_path(mod, io, is_play, &mod_from, &mod_to);
705

706
	/* for Gen2 or later */
707
	if (mod_from && mod_to) {
708
		ops	= &rsnd_dmapp_ops;
709
		attach	= rsnd_dmapp_attach;
710
		dma_id	= dmac->dmapp_num;
711
		type	= RSND_MOD_AUDMAPP;
712
	} else {
713
		ops	= &rsnd_dmaen_ops;
714
		attach	= rsnd_dmaen_attach;
715
		dma_id	= dmac->dmaen_num;
716
		type	= RSND_MOD_AUDMA;
717
	}
718 719

	/* for Gen1, overwrite */
720
	if (rsnd_is_gen1(priv)) {
721
		ops	= &rsnd_dmaen_ops;
722
		attach	= rsnd_dmaen_attach;
723
		dma_id	= dmac->dmaen_num;
724
		type	= RSND_MOD_AUDMA;
725
	}
726

727 728 729
	dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL);
	if (!dma)
		return -ENOMEM;
730

731
	*dma_mod = rsnd_mod_get(dma);
732

733 734 735 736
	ret = rsnd_mod_init(priv, *dma_mod, ops, NULL,
			    rsnd_mod_get_status, type, dma_id);
	if (ret < 0)
		return ret;
737

738 739
	dev_dbg(dev, "%s[%d] %s[%d] -> %s[%d]\n",
		rsnd_mod_name(*dma_mod), rsnd_mod_id(*dma_mod),
740 741 742 743
		rsnd_mod_name(mod_from ? mod_from : &mem),
		rsnd_mod_id  (mod_from ? mod_from : &mem),
		rsnd_mod_name(mod_to   ? mod_to   : &mem),
		rsnd_mod_id  (mod_to   ? mod_to   : &mem));
744 745 746 747

	ret = attach(io, dma, mod_from, mod_to);
	if (ret < 0)
		return ret;
748

749 750 751 752 753 754 755 756 757 758 759 760 761
	dma->src_addr = rsnd_dma_addr(io, mod_from, is_play, 1);
	dma->dst_addr = rsnd_dma_addr(io, mod_to,   is_play, 0);
	dma->mod_from = mod_from;
	dma->mod_to   = mod_to;

	return 0;
}

int rsnd_dma_attach(struct rsnd_dai_stream *io, struct rsnd_mod *mod,
		    struct rsnd_mod **dma_mod)
{
	if (!(*dma_mod)) {
		int ret = rsnd_dma_alloc(io, mod, dma_mod);
762 763 764 765 766

		if (ret < 0)
			return ret;
	}

767
	return rsnd_dai_connect(*dma_mod, io, (*dma_mod)->type);
768
}
769

770
int rsnd_dma_probe(struct rsnd_priv *priv)
771
{
772
	struct platform_device *pdev = rsnd_priv_to_pdev(priv);
773 774 775 776 777 778 779 780 781 782 783
	struct device *dev = rsnd_priv_to_dev(priv);
	struct rsnd_dma_ctrl *dmac;
	struct resource *res;

	/*
	 * for Gen1
	 */
	if (rsnd_is_gen1(priv))
		return 0;

	/*
784
	 * for Gen2 or later
785 786 787 788 789
	 */
	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "audmapp");
	dmac = devm_kzalloc(dev, sizeof(*dmac), GFP_KERNEL);
	if (!dmac || !res) {
		dev_err(dev, "dma allocate failed\n");
790
		return 0; /* it will be PIO mode */
791 792 793 794 795 796 797 798 799
	}

	dmac->dmapp_num = 0;
	dmac->base = devm_ioremap_resource(dev, res);
	if (IS_ERR(dmac->base))
		return PTR_ERR(dmac->base);

	priv->dma = dmac;

800 801
	/* dummy mem mod for debug */
	return rsnd_mod_init(NULL, &mem, &mem_ops, NULL, NULL, 0, 0);
802
}