ssi.c 19.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
 * Renesas R-Car SSIU/SSI support
 *
 * Copyright (C) 2013 Renesas Solutions Corp.
 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
 *
 * Based on fsi.c
 * Kuninori Morimoto <morimoto.kuninori@renesas.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#include <linux/delay.h>
#include "rsnd.h"
#define RSND_SSI_NAME_SIZE 16

/*
 * SSICR
 */
#define	FORCE		(1 << 31)	/* Fixed */
22
#define	DMEN		(1 << 28)	/* DMA Enable */
23 24 25 26
#define	UIEN		(1 << 27)	/* Underflow Interrupt Enable */
#define	OIEN		(1 << 26)	/* Overflow Interrupt Enable */
#define	IIEN		(1 << 25)	/* Idle Mode Interrupt Enable */
#define	DIEN		(1 << 24)	/* Data Interrupt Enable */
27 28 29
#define	CHNL_4		(1 << 22)	/* Channels */
#define	CHNL_6		(2 << 22)	/* Channels */
#define	CHNL_8		(3 << 22)	/* Channels */
30 31 32 33 34 35 36 37 38 39 40 41 42 43
#define	DWL_8		(0 << 19)	/* Data Word Length */
#define	DWL_16		(1 << 19)	/* Data Word Length */
#define	DWL_18		(2 << 19)	/* Data Word Length */
#define	DWL_20		(3 << 19)	/* Data Word Length */
#define	DWL_22		(4 << 19)	/* Data Word Length */
#define	DWL_24		(5 << 19)	/* Data Word Length */
#define	DWL_32		(6 << 19)	/* Data Word Length */

#define	SWL_32		(3 << 16)	/* R/W System Word Length */
#define	SCKD		(1 << 15)	/* Serial Bit Clock Direction */
#define	SWSD		(1 << 14)	/* Serial WS Direction */
#define	SCKP		(1 << 13)	/* Serial Bit Clock Polarity */
#define	SWSP		(1 << 12)	/* Serial WS Polarity */
#define	SDTA		(1 << 10)	/* Serial Data Alignment */
44
#define	PDTA		(1 <<  9)	/* Parallel Data Alignment */
45 46 47 48 49 50 51 52 53 54 55 56 57
#define	DEL		(1 <<  8)	/* Serial Data Delay */
#define	CKDV(v)		(v <<  4)	/* Serial Clock Division Ratio */
#define	TRMD		(1 <<  1)	/* Transmit/Receive Mode Select */
#define	EN		(1 <<  0)	/* SSI Module Enable */

/*
 * SSISR
 */
#define	UIRQ		(1 << 27)	/* Underflow Error Interrupt Status */
#define	OIRQ		(1 << 26)	/* Overflow Error Interrupt Status */
#define	IIRQ		(1 << 25)	/* Idle Mode Interrupt Status */
#define	DIRQ		(1 << 24)	/* Data Interrupt Status Flag */

58 59 60 61
/*
 * SSIWSR
 */
#define CONT		(1 << 8)	/* WS Continue Function */
62
#define WS_MODE		(1 << 0)	/* WS Mode */
63

64 65
#define SSI_NAME "ssi"

66 67
struct rsnd_ssi {
	struct rsnd_mod mod;
68
	struct rsnd_mod *dma;
69

70
	u32 flags;
71 72
	u32 cr_own;
	u32 cr_clk;
73
	u32 cr_mode;
74
	u32 wsr;
75
	int chan;
76
	int rate;
77
	int irq;
78 79 80
	unsigned int usrcnt;
};

81 82 83 84
/* flags */
#define RSND_SSI_CLK_PIN_SHARE		(1 << 0)
#define RSND_SSI_NO_BUSIF		(1 << 1) /* SSI+DMA without BUSIF */

85 86 87
#define for_each_rsnd_ssi(pos, priv, i)					\
	for (i = 0;							\
	     (i < rsnd_ssi_nr(priv)) &&					\
88
		((pos) = ((struct rsnd_ssi *)(priv)->ssi + i));		\
89 90
	     i++)

91
#define rsnd_ssi_get(priv, id) ((struct rsnd_ssi *)(priv->ssi) + id)
92
#define rsnd_ssi_to_dma(mod) ((ssi)->dma)
93
#define rsnd_ssi_nr(priv) ((priv)->ssi_nr)
94
#define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
95
#define rsnd_ssi_mode_flags(p) ((p)->flags)
96
#define rsnd_ssi_is_parent(ssi, io) ((ssi) == rsnd_io_to_mod_ssip(io))
97 98
#define rsnd_ssi_is_multi_slave(mod, io) \
	(rsnd_ssi_multi_slaves(io) & (1 << rsnd_mod_id(mod)))
99

100
int rsnd_ssi_use_busif(struct rsnd_dai_stream *io)
101
{
102
	struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io);
103 104 105
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	int use_busif = 0;

106 107 108
	if (!rsnd_ssi_is_dma_mode(mod))
		return 0;

109 110 111 112 113 114 115 116
	if (!(rsnd_ssi_mode_flags(ssi) & RSND_SSI_NO_BUSIF))
		use_busif = 1;
	if (rsnd_io_to_mod_src(io))
		use_busif = 1;

	return use_busif;
}

117 118 119 120 121 122 123 124 125 126
static void rsnd_ssi_status_clear(struct rsnd_mod *mod)
{
	rsnd_mod_write(mod, SSISR, 0);
}

static u32 rsnd_ssi_status_get(struct rsnd_mod *mod)
{
	return rsnd_mod_read(mod, SSISR);
}

127 128 129 130 131 132 133 134 135
static void rsnd_ssi_status_check(struct rsnd_mod *mod,
				  u32 bit)
{
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
	struct device *dev = rsnd_priv_to_dev(priv);
	u32 status;
	int i;

	for (i = 0; i < 1024; i++) {
136
		status = rsnd_ssi_status_get(mod);
137 138 139 140 141 142
		if (status & bit)
			return;

		udelay(50);
	}

143 144
	dev_warn(dev, "%s[%d] status check failed\n",
		 rsnd_mod_name(mod), rsnd_mod_id(mod));
145 146
}

147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
u32 rsnd_ssi_multi_slaves(struct rsnd_dai_stream *io)
{
	struct rsnd_mod *mod;
	enum rsnd_mod_type types[] = {
		RSND_MOD_SSIM1,
		RSND_MOD_SSIM2,
		RSND_MOD_SSIM3,
	};
	int i, mask;

	mask = 0;
	for (i = 0; i < ARRAY_SIZE(types); i++) {
		mod = rsnd_io_to_mod(io, types[i]);
		if (!mod)
			continue;

		mask |= 1 << rsnd_mod_id(mod);
	}

	return mask;
}

169
static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
170
				     struct rsnd_dai_stream *io)
171
{
172
	struct rsnd_priv *priv = rsnd_io_to_priv(io);
173
	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
174
	struct device *dev = rsnd_priv_to_dev(priv);
175
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
176
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
177
	struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
178
	int slots = rsnd_get_slot_width(io);
179
	int j, ret;
180 181 182 183
	int ssi_clk_mul_table[] = {
		1, 2, 4, 8, 16, 6, 12,
	};
	unsigned int main_rate;
184
	unsigned int rate = rsnd_src_get_ssi_rate(priv, io, runtime);
185

186 187 188 189 190 191
	if (!rsnd_rdai_is_clk_master(rdai))
		return 0;

	if (ssi_parent_mod && !rsnd_ssi_is_parent(mod, io))
		return 0;

192 193 194
	if (rsnd_ssi_is_multi_slave(mod, io))
		return 0;

195 196 197 198 199 200 201 202 203
	if (ssi->usrcnt > 1) {
		if (ssi->rate != rate) {
			dev_err(dev, "SSI parent/child should use same rate\n");
			return -EINVAL;
		}

		return 0;
	}

204 205 206
	/*
	 * Find best clock, and try to start ADG
	 */
207 208 209 210
	for (j = 0; j < ARRAY_SIZE(ssi_clk_mul_table); j++) {

		/*
		 * this driver is assuming that
211
		 * system word is 32bit x slots
212 213
		 * see rsnd_ssi_init()
		 */
214
		main_rate = rate * 32 * slots * ssi_clk_mul_table[j];
215 216 217 218 219

		ret = rsnd_adg_ssi_clk_try_start(mod, main_rate);
		if (0 == ret) {
			ssi->cr_clk	= FORCE | SWL_32 |
				SCKD | SWSD | CKDV(j);
220
			ssi->wsr = CONT;
221

222 223
			ssi->rate = rate;

224 225 226 227 228
			dev_dbg(dev, "%s[%d] outputs %u Hz\n",
				rsnd_mod_name(mod),
				rsnd_mod_id(mod), rate);

			return 0;
229 230 231 232 233 234 235
		}
	}

	dev_err(dev, "unsupported clock rate\n");
	return -EIO;
}

236
static void rsnd_ssi_master_clk_stop(struct rsnd_mod *mod,
237
				     struct rsnd_dai_stream *io)
238
{
239
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
240
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
241
	struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
242

243
	if (!rsnd_rdai_is_clk_master(rdai))
244 245
		return;

246 247
	if (ssi_parent_mod && !rsnd_ssi_is_parent(mod, io))
		return;
248

249 250
	if (ssi->usrcnt > 1)
		return;
251

252 253
	ssi->cr_clk	= 0;
	ssi->rate	= 0;
254

255
	rsnd_adg_ssi_clk_stop(mod);
256 257
}

258
static void rsnd_ssi_config_init(struct rsnd_mod *mod,
259 260 261 262
				struct rsnd_dai_stream *io)
{
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
263
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
264 265
	u32 cr_own;
	u32 cr_mode;
266
	u32 wsr;
267 268
	int is_tdm;

269
	is_tdm = (rsnd_get_slot_width(io) >= 6) ? 1 : 0;
270 271 272 273 274 275 276 277 278

	/*
	 * always use 32bit system word.
	 * see also rsnd_ssi_master_clk_enable()
	 */
	cr_own = FORCE | SWL_32 | PDTA;

	if (rdai->bit_clk_inv)
		cr_own |= SCKP;
279
	if (rdai->frm_clk_inv ^ is_tdm)
280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
		cr_own |= SWSP;
	if (rdai->data_alignment)
		cr_own |= SDTA;
	if (rdai->sys_delay)
		cr_own |= DEL;
	if (rsnd_io_is_play(io))
		cr_own |= TRMD;

	switch (runtime->sample_bits) {
	case 16:
		cr_own |= DWL_16;
		break;
	case 32:
		cr_own |= DWL_24;
		break;
	}

297
	if (rsnd_ssi_is_dma_mode(mod)) {
298 299 300 301 302 303
		cr_mode = UIEN | OIEN |	/* over/under run */
			  DMEN;		/* DMA : enable DMA */
	} else {
		cr_mode = DIEN;		/* PIO : enable Data interrupt */
	}

304 305 306 307 308 309
	/*
	 * TDM Extend Mode
	 * see
	 *	rsnd_ssiu_init_gen2()
	 */
	wsr = ssi->wsr;
310
	if (is_tdm) {
311 312 313 314
		wsr	|= WS_MODE;
		cr_own	|= CHNL_8;
	}

315 316
	ssi->cr_own	= cr_own;
	ssi->cr_mode	= cr_mode;
317
	ssi->wsr	= wsr;
318
}
319

320 321 322 323 324 325 326 327
static void rsnd_ssi_register_setup(struct rsnd_mod *mod)
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);

	rsnd_mod_write(mod, SSIWSR,	ssi->wsr);
	rsnd_mod_write(mod, SSICR,	ssi->cr_own	|
					ssi->cr_clk	|
					ssi->cr_mode); /* without EN */
328 329
}

330 331 332 333
/*
 *	SSI mod common functions
 */
static int rsnd_ssi_init(struct rsnd_mod *mod,
334
			 struct rsnd_dai_stream *io,
335
			 struct rsnd_priv *priv)
336 337
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
338 339 340 341 342 343
	int ret;

	ssi->usrcnt++;

	rsnd_mod_power_on(mod);

344
	ret = rsnd_ssi_master_clk_start(mod, io);
345 346 347
	if (ret < 0)
		return ret;

348 349
	if (!rsnd_ssi_is_parent(mod, io))
		rsnd_ssi_config_init(mod, io);
350

351
	rsnd_ssi_register_setup(mod);
352 353 354 355

	/* clear error status */
	rsnd_ssi_status_clear(mod);

356 357 358 359
	return 0;
}

static int rsnd_ssi_quit(struct rsnd_mod *mod,
360
			 struct rsnd_dai_stream *io,
361
			 struct rsnd_priv *priv)
362 363 364 365
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	struct device *dev = rsnd_priv_to_dev(priv);

366 367 368 369 370
	if (!ssi->usrcnt) {
		dev_err(dev, "%s[%d] usrcnt error\n",
			rsnd_mod_name(mod), rsnd_mod_id(mod));
		return -EIO;
	}
371

372
	if (!rsnd_ssi_is_parent(mod, io))
373
		ssi->cr_own	= 0;
374

375
	rsnd_ssi_master_clk_stop(mod, io);
376 377 378 379 380

	rsnd_mod_power_off(mod);

	ssi->usrcnt--;

381 382 383
	return 0;
}

384
static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
385
			      struct rsnd_dai_stream *io,
386 387 388 389 390 391 392 393 394 395
			      struct snd_pcm_substream *substream,
			      struct snd_pcm_hw_params *params)
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	int chan = params_channels(params);

	/*
	 * Already working.
	 * It will happen if SSI has parent/child connection.
	 */
396
	if (ssi->usrcnt > 1) {
397 398 399 400 401 402 403 404 405 406 407 408 409
		/*
		 * it is error if child <-> parent SSI uses
		 * different channels.
		 */
		if (ssi->chan != chan)
			return -EIO;
	}

	ssi->chan = chan;

	return 0;
}

410 411 412
static int rsnd_ssi_start(struct rsnd_mod *mod,
			  struct rsnd_dai_stream *io,
			  struct rsnd_priv *priv)
413
{
414 415 416 417
	/*
	 * EN will be set via SSIU :: SSI_CONTROL
	 * if Multi channel mode
	 */
418 419
	if (rsnd_ssi_multi_slaves(io))
		return 0;
420

421
	rsnd_mod_bset(mod, SSICR, EN, EN);
422 423 424 425

	return 0;
}

426 427 428
static int rsnd_ssi_stop(struct rsnd_mod *mod,
			 struct rsnd_dai_stream *io,
			 struct rsnd_priv *priv)
429
{
430 431 432
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	u32 cr;

433
	/*
434
	 * don't stop if not last user
435
	 * see also
436
	 *	rsnd_ssi_start
437 438
	 *	rsnd_ssi_interrupt
	 */
439 440
	if (ssi->usrcnt > 1)
		return 0;
441 442 443 444 445 446 447

	/*
	 * disable all IRQ,
	 * and, wait all data was sent
	 */
	cr  =	ssi->cr_own	|
		ssi->cr_clk;
448

449 450
	rsnd_mod_write(mod, SSICR, cr | EN);
	rsnd_ssi_status_check(mod, DIRQ);
451

452 453 454 455 456 457
	/*
	 * disable SSI,
	 * and, wait idle state
	 */
	rsnd_mod_write(mod, SSICR, cr);	/* disabled all */
	rsnd_ssi_status_check(mod, IIRQ);
458 459 460 461

	return 0;
}

462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482
static int rsnd_ssi_irq(struct rsnd_mod *mod,
			struct rsnd_dai_stream *io,
			struct rsnd_priv *priv,
			int enable)
{
	u32 val = 0;

	if (rsnd_is_gen1(priv))
		return 0;

	if (rsnd_ssi_is_parent(mod, io))
		return 0;

	if (enable)
		val = rsnd_ssi_is_dma_mode(mod) ? 0x0e000000 : 0x0f000000;

	rsnd_mod_write(mod, SSI_INT_ENABLE, val);

	return 0;
}

483 484
static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
				 struct rsnd_dai_stream *io)
485
{
486
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
487
	int is_dma = rsnd_ssi_is_dma_mode(mod);
488
	u32 status;
489
	bool elapsed = false;
490
	bool stop = false;
491 492

	spin_lock(&priv->lock);
493

494
	/* ignore all cases if not working */
495
	if (!rsnd_io_is_working(io))
496 497
		goto rsnd_ssi_interrupt_out;

498
	status = rsnd_ssi_status_get(mod);
499 500

	/* PIO only */
501
	if (!is_dma && (status & DIRQ)) {
502 503 504 505 506 507 508 509 510
		struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
		u32 *buf = (u32 *)(runtime->dma_area +
				   rsnd_dai_pointer_offset(io, 0));

		/*
		 * 8/16/32 data can be assesse to TDR/RDR register
		 * directly as 32bit data
		 * see rsnd_ssi_init()
		 */
511
		if (rsnd_io_is_play(io))
512
			rsnd_mod_write(mod, SSITDR, *buf);
513
		else
514
			*buf = rsnd_mod_read(mod, SSIRDR);
515

516
		elapsed = rsnd_dai_pointer_update(io, sizeof(*buf));
517
	}
518

519
	/* DMA only */
520 521
	if (is_dma && (status & (UIRQ | OIRQ)))
		stop = true;
522

523
	rsnd_ssi_status_clear(mod);
524 525 526
rsnd_ssi_interrupt_out:
	spin_unlock(&priv->lock);

527 528
	if (elapsed)
		rsnd_dai_period_elapsed(io);
529 530 531 532

	if (stop)
		snd_pcm_stop_xrun(io->substream);

533 534 535 536 537 538 539
}

static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
{
	struct rsnd_mod *mod = data;

	rsnd_mod_interrupt(mod, __rsnd_ssi_interrupt);
540

541
	return IRQ_HANDLED;
542 543
}

544 545 546
/*
 *		SSI PIO
 */
547
static void rsnd_ssi_parent_attach(struct rsnd_mod *mod,
548
				   struct rsnd_dai_stream *io)
549
{
550 551 552
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);

553 554 555
	if (!__rsnd_ssi_is_pin_sharing(mod))
		return;

556 557 558
	if (!rsnd_rdai_is_clk_master(rdai))
		return;

559 560 561 562 563 564 565 566 567 568 569 570 571 572
	switch (rsnd_mod_id(mod)) {
	case 1:
	case 2:
		rsnd_dai_connect(rsnd_ssi_mod_get(priv, 0), io, RSND_MOD_SSIP);
		break;
	case 4:
		rsnd_dai_connect(rsnd_ssi_mod_get(priv, 3), io, RSND_MOD_SSIP);
		break;
	case 8:
		rsnd_dai_connect(rsnd_ssi_mod_get(priv, 7), io, RSND_MOD_SSIP);
		break;
	}
}

573 574 575 576 577 578 579 580 581 582 583 584 585 586
static int rsnd_ssi_pcm_new(struct rsnd_mod *mod,
			    struct rsnd_dai_stream *io,
			    struct snd_soc_pcm_runtime *rtd)
{
	/*
	 * rsnd_rdai_is_clk_master() will be enabled after set_fmt,
	 * and, pcm_new will be called after it.
	 * This function reuse pcm_new at this point.
	 */
	rsnd_ssi_parent_attach(mod, io);

	return 0;
}

587 588 589
static int rsnd_ssi_common_probe(struct rsnd_mod *mod,
				 struct rsnd_dai_stream *io,
				 struct rsnd_priv *priv)
590 591 592 593 594
{
	struct device *dev = rsnd_priv_to_dev(priv);
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	int ret;

595 596 597 598 599 600 601
	/*
	 * SSIP/SSIU/IRQ are not needed on
	 * SSI Multi slaves
	 */
	if (rsnd_ssi_is_multi_slave(mod, io))
		return 0;

602 603 604 605
	/*
	 * It can't judge ssi parent at this point
	 * see rsnd_ssi_pcm_new()
	 */
606

607 608 609 610
	ret = rsnd_ssiu_attach(io, mod);
	if (ret < 0)
		return ret;

611
	ret = devm_request_irq(dev, ssi->irq,
612
			       rsnd_ssi_interrupt,
613
			       IRQF_SHARED,
614
			       dev_name(dev), mod);
615

616 617 618
	return ret;
}

619
static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
620
	.name	= SSI_NAME,
621
	.probe	= rsnd_ssi_common_probe,
622 623
	.init	= rsnd_ssi_init,
	.quit	= rsnd_ssi_quit,
624 625
	.start	= rsnd_ssi_start,
	.stop	= rsnd_ssi_stop,
626
	.irq	= rsnd_ssi_irq,
627
	.pcm_new = rsnd_ssi_pcm_new,
628
	.hw_params = rsnd_ssi_hw_params,
629 630
};

631
static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
632
			      struct rsnd_dai_stream *io,
633
			      struct rsnd_priv *priv)
634 635
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
636
	int dma_id = 0; /* not needed */
637 638
	int ret;

639 640 641 642 643 644 645
	/*
	 * SSIP/SSIU/IRQ/DMA are not needed on
	 * SSI Multi slaves
	 */
	if (rsnd_ssi_is_multi_slave(mod, io))
		return 0;

646
	ret = rsnd_ssi_common_probe(mod, io, priv);
647
	if (ret)
648
		return ret;
649

650 651
	/* SSI probe might be called many times in MUX multi path */
	ret = rsnd_dma_attach(io, mod, &ssi->dma, dma_id);
652

653 654 655 656
	return ret;
}

static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
657
			       struct rsnd_dai_stream *io,
658
			       struct rsnd_priv *priv)
659
{
660 661
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	struct device *dev = rsnd_priv_to_dev(priv);
662
	int irq = ssi->irq;
663 664

	/* PIO will request IRQ again */
665
	devm_free_irq(dev, irq, mod);
666

667 668 669 670
	return 0;
}

static int rsnd_ssi_fallback(struct rsnd_mod *mod,
671
			     struct rsnd_dai_stream *io,
672
			     struct rsnd_priv *priv)
673
{
674 675 676 677 678 679 680 681 682 683 684 685 686 687
	struct device *dev = rsnd_priv_to_dev(priv);

	/*
	 * fallback to PIO
	 *
	 * SSI .probe might be called again.
	 * see
	 *	rsnd_rdai_continuance_probe()
	 */
	mod->ops = &rsnd_ssi_pio_ops;

	dev_info(dev, "%s[%d] fallback to PIO mode\n",
		 rsnd_mod_name(mod), rsnd_mod_id(mod));

688 689 690
	return 0;
}

691 692
static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_dai_stream *io,
					 struct rsnd_mod *mod)
693
{
694 695 696 697
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
	int is_play = rsnd_io_is_play(io);
	char *name;

698
	if (rsnd_ssi_use_busif(io))
699 700 701 702 703 704
		name = is_play ? "rxu" : "txu";
	else
		name = is_play ? "rx" : "tx";

	return rsnd_dma_request_channel(rsnd_ssi_of_node(priv),
					mod, name);
705 706
}

707
static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
708
	.name	= SSI_NAME,
709
	.dma_req = rsnd_ssi_dma_req,
710 711
	.probe	= rsnd_ssi_dma_probe,
	.remove	= rsnd_ssi_dma_remove,
712 713
	.init	= rsnd_ssi_init,
	.quit	= rsnd_ssi_quit,
714 715
	.start	= rsnd_ssi_start,
	.stop	= rsnd_ssi_stop,
716
	.irq	= rsnd_ssi_irq,
717
	.pcm_new = rsnd_ssi_pcm_new,
718
	.fallback = rsnd_ssi_fallback,
719
	.hw_params = rsnd_ssi_hw_params,
720 721
};

722 723 724 725 726 727
int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod)
{
	return mod->ops == &rsnd_ssi_dma_ops;
}


728 729 730 731
/*
 *		Non SSI
 */
static struct rsnd_mod_ops rsnd_ssi_non_ops = {
732
	.name	= SSI_NAME,
733 734 735 736 737
};

/*
 *		ssi mod function
 */
738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788
static void rsnd_ssi_connect(struct rsnd_mod *mod,
			     struct rsnd_dai_stream *io)
{
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
	enum rsnd_mod_type types[] = {
		RSND_MOD_SSI,
		RSND_MOD_SSIM1,
		RSND_MOD_SSIM2,
		RSND_MOD_SSIM3,
	};
	enum rsnd_mod_type type;
	int i;

	/* try SSI -> SSIM1 -> SSIM2 -> SSIM3 */
	for (i = 0; i < ARRAY_SIZE(types); i++) {
		type = types[i];
		if (!rsnd_io_to_mod(io, type)) {
			rsnd_dai_connect(mod, io, type);
			rsnd_set_slot(rdai, 2 * (i + 1), (i + 1));
			return;
		}
	}
}

void rsnd_parse_connect_ssi(struct rsnd_dai *rdai,
			    struct device_node *playback,
			    struct device_node *capture)
{
	struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
	struct device_node *node;
	struct device_node *np;
	struct rsnd_mod *mod;
	int i;

	node = rsnd_ssi_of_node(priv);
	if (!node)
		return;

	i = 0;
	for_each_child_of_node(node, np) {
		mod = rsnd_ssi_mod_get(priv, i);
		if (np == playback)
			rsnd_ssi_connect(mod, &rdai->playback);
		if (np == capture)
			rsnd_ssi_connect(mod, &rdai->capture);
		i++;
	}

	of_node_put(node);
}

789 790
struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id)
{
791 792
	if (WARN_ON(id < 0 || id >= rsnd_ssi_nr(priv)))
		id = 0;
793

794
	return rsnd_mod_get(rsnd_ssi_get(priv, id));
795 796
}

797
int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
798 799 800 801 802 803
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);

	return !!(rsnd_ssi_mode_flags(ssi) & RSND_SSI_CLK_PIN_SHARE);
}

804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838
static u32 *rsnd_ssi_get_status(struct rsnd_dai_stream *io,
				struct rsnd_mod *mod,
				enum rsnd_mod_type type)
{
	/*
	 * SSIP (= SSI parent) needs to be special, otherwise,
	 * 2nd SSI might doesn't start. see also rsnd_mod_call()
	 *
	 * We can't include parent SSI status on SSI, because we don't know
	 * how many SSI requests parent SSI. Thus, it is localed on "io" now.
	 * ex) trouble case
	 *	Playback: SSI0
	 *	Capture : SSI1 (needs SSI0)
	 *
	 * 1) start Capture  ->	SSI0/SSI1 are started.
	 * 2) start Playback ->	SSI0 doesn't work, because it is already
	 *			marked as "started" on 1)
	 *
	 * OTOH, using each mod's status is good for MUX case.
	 * It doesn't need to start in 2nd start
	 * ex)
	 *	IO-0: SRC0 -> CTU1 -+-> MUX -> DVC -> SSIU -> SSI0
	 *			    |
	 *	IO-1: SRC1 -> CTU2 -+
	 *
	 * 1) start IO-0 ->	start SSI0
	 * 2) start IO-1 ->	SSI0 doesn't need to start, because it is
	 *			already started on 1)
	 */
	if (type == RSND_MOD_SSIP)
		return &io->parent_ssi_status;

	return rsnd_mod_get_status(io, mod, type);
}

839
int rsnd_ssi_probe(struct rsnd_priv *priv)
840
{
841 842
	struct device_node *node;
	struct device_node *np;
843 844 845 846 847
	struct device *dev = rsnd_priv_to_dev(priv);
	struct rsnd_mod_ops *ops;
	struct clk *clk;
	struct rsnd_ssi *ssi;
	char name[RSND_SSI_NAME_SIZE];
848
	int i, nr, ret;
849

850 851 852 853 854 855 856 857 858
	node = rsnd_ssi_of_node(priv);
	if (!node)
		return -EINVAL;

	nr = of_get_child_count(node);
	if (!nr) {
		ret = -EINVAL;
		goto rsnd_ssi_probe_done;
	}
859

860
	ssi	= devm_kzalloc(dev, sizeof(*ssi) * nr, GFP_KERNEL);
861 862 863 864
	if (!ssi) {
		ret = -ENOMEM;
		goto rsnd_ssi_probe_done;
	}
865

866 867
	priv->ssi	= ssi;
	priv->ssi_nr	= nr;
868

869 870 871
	i = 0;
	for_each_child_of_node(node, np) {
		ssi = rsnd_ssi_get(priv, i);
872

873 874
		snprintf(name, RSND_SSI_NAME_SIZE, "%s.%d",
			 SSI_NAME, i);
875

876
		clk = devm_clk_get(dev, name);
877 878 879 880
		if (IS_ERR(clk)) {
			ret = PTR_ERR(clk);
			goto rsnd_ssi_probe_done;
		}
881

882 883 884 885 886 887 888 889 890 891 892
		if (of_get_property(np, "shared-pin", NULL))
			ssi->flags |= RSND_SSI_CLK_PIN_SHARE;

		if (of_get_property(np, "no-busif", NULL))
			ssi->flags |= RSND_SSI_NO_BUSIF;

		ssi->irq = irq_of_parse_and_map(np, 0);
		if (!ssi->irq) {
			ret = -EINVAL;
			goto rsnd_ssi_probe_done;
		}
893 894

		ops = &rsnd_ssi_non_ops;
895
		if (of_get_property(np, "pio-transfer", NULL))
896
			ops = &rsnd_ssi_pio_ops;
897 898
		else
			ops = &rsnd_ssi_dma_ops;
899

900
		ret = rsnd_mod_init(priv, rsnd_mod_get(ssi), ops, clk,
901
				    rsnd_ssi_get_status, RSND_MOD_SSI, i);
902
		if (ret)
903 904 905
			goto rsnd_ssi_probe_done;

		i++;
906 907
	}

908 909 910 911 912 913
	ret = 0;

rsnd_ssi_probe_done:
	of_node_put(node);

	return ret;
914
}
915

916
void rsnd_ssi_remove(struct rsnd_priv *priv)
917 918 919 920 921
{
	struct rsnd_ssi *ssi;
	int i;

	for_each_rsnd_ssi(ssi, priv, i) {
922
		rsnd_mod_quit(rsnd_mod_get(ssi));
923 924
	}
}