ssi.c 25.7 KB
Newer Older
1 2 3 4 5 6 7 8 9
// SPDX-License-Identifier: GPL-2.0
//
// 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>
10 11 12 13 14 15 16 17 18

/*
 * you can enable below define if you don't need
 * SSI interrupt status debug message when debugging
 * see rsnd_dbg_irq_status()
 *
 * #define RSND_DEBUG_NO_IRQ_STATUS 1
 */

19
#include <sound/simple_card_utils.h>
20 21 22 23 24 25 26 27
#include <linux/delay.h>
#include "rsnd.h"
#define RSND_SSI_NAME_SIZE 16

/*
 * SSICR
 */
#define	FORCE		(1 << 31)	/* Fixed */
28
#define	DMEN		(1 << 28)	/* DMA Enable */
29 30 31 32
#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 */
33 34 35
#define	CHNL_4		(1 << 22)	/* Channels */
#define	CHNL_6		(2 << 22)	/* Channels */
#define	CHNL_8		(3 << 22)	/* Channels */
36
#define DWL_MASK	(7 << 19)	/* Data Word Length mask */
37 38 39 40 41 42 43 44
#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 */

45 46 47 48 49
/*
 * System word length
 */
#define	SWL_16		(1 << 16)	/* R/W System Word Length */
#define	SWL_24		(2 << 16)	/* R/W System Word Length */
50
#define	SWL_32		(3 << 16)	/* R/W System Word Length */
51

52 53 54 55 56
#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 */
57
#define	PDTA		(1 <<  9)	/* Parallel Data Alignment */
58 59 60 61 62 63 64 65 66 67 68 69 70
#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 */

71 72 73 74
/*
 * SSIWSR
 */
#define CONT		(1 << 8)	/* WS Continue Function */
75
#define WS_MODE		(1 << 0)	/* WS Mode */
76

77 78
#define SSI_NAME "ssi"

79 80 81
struct rsnd_ssi {
	struct rsnd_mod mod;

82
	u32 flags;
83 84
	u32 cr_own;
	u32 cr_clk;
85
	u32 cr_mode;
86
	u32 cr_en;
87
	u32 wsr;
88
	int chan;
89
	int rate;
90
	int irq;
91
	unsigned int usrcnt;
92

93
	/* for PIO */
94 95 96
	int byte_pos;
	int byte_per_period;
	int next_period_byte;
97 98
};

99 100 101
/* flags */
#define RSND_SSI_CLK_PIN_SHARE		(1 << 0)
#define RSND_SSI_NO_BUSIF		(1 << 1) /* SSI+DMA without BUSIF */
102
#define RSND_SSI_PROBED			(1 << 2)
103

104 105 106
#define for_each_rsnd_ssi(pos, priv, i)					\
	for (i = 0;							\
	     (i < rsnd_ssi_nr(priv)) &&					\
107
		((pos) = ((struct rsnd_ssi *)(priv)->ssi + i));		\
108 109
	     i++)

110
#define rsnd_ssi_get(priv, id) ((struct rsnd_ssi *)(priv->ssi) + id)
111
#define rsnd_ssi_nr(priv) ((priv)->ssi_nr)
112
#define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
113
#define rsnd_ssi_is_parent(ssi, io) ((ssi) == rsnd_io_to_mod_ssip(io))
114 115
#define rsnd_ssi_is_multi_slave(mod, io) \
	(rsnd_ssi_multi_slaves(io) & (1 << rsnd_mod_id(mod)))
116 117
#define rsnd_ssi_is_run_mods(mod, io) \
	(rsnd_ssi_run_mods(io) & (1 << rsnd_mod_id(mod)))
118
#define rsnd_ssi_can_output_clk(mod) (!__rsnd_ssi_is_pin_sharing(mod))
119

120 121
static int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod);

122
int rsnd_ssi_use_busif(struct rsnd_dai_stream *io)
123
{
124
	struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io);
125 126 127
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	int use_busif = 0;

128 129 130
	if (!rsnd_ssi_is_dma_mode(mod))
		return 0;

131
	if (!(rsnd_flags_has(ssi, RSND_SSI_NO_BUSIF)))
132 133 134 135 136 137 138
		use_busif = 1;
	if (rsnd_io_to_mod_src(io))
		use_busif = 1;

	return use_busif;
}

139 140 141 142 143 144 145 146 147 148
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);
}

149 150 151 152 153 154 155 156 157
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++) {
158
		status = rsnd_ssi_status_get(mod);
159 160 161
		if (status & bit)
			return;

162
		udelay(5);
163 164
	}

165
	dev_warn(dev, "%s status check failed\n", rsnd_mod_name(mod));
166 167
}

168
static u32 rsnd_ssi_multi_slaves(struct rsnd_dai_stream *io)
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
{
	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;
}

190 191 192 193
static u32 rsnd_ssi_run_mods(struct rsnd_dai_stream *io)
{
	struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io);
	struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
194
	u32 mods;
195

196 197 198 199 200 201 202
	mods = rsnd_ssi_multi_slaves_runtime(io) |
		1 << rsnd_mod_id(ssi_mod);

	if (ssi_parent_mod)
		mods |= 1 << rsnd_mod_id(ssi_parent_mod);

	return mods;
203 204
}

205 206
u32 rsnd_ssi_multi_slaves_runtime(struct rsnd_dai_stream *io)
{
207
	if (rsnd_runtime_is_multi_ssi(io))
208
		return rsnd_ssi_multi_slaves(io);
209 210 211 212

	return 0;
}

213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
static u32 rsnd_rdai_width_to_swl(struct rsnd_dai *rdai)
{
	struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
	struct device *dev = rsnd_priv_to_dev(priv);
	int width = rsnd_rdai_width_get(rdai);

	switch (width) {
	case 32: return SWL_32;
	case 24: return SWL_24;
	case 16: return SWL_16;
	}

	dev_err(dev, "unsupported slot width value: %d\n", width);
	return 0;
}

unsigned int rsnd_ssi_clk_query(struct rsnd_dai *rdai,
230 231
		       int param1, int param2, int *idx)
{
232
	struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
233 234 235 236
	int ssi_clk_mul_table[] = {
		1, 2, 4, 8, 16, 6, 12,
	};
	int j, ret;
237
	unsigned int main_rate;
238
	int width = rsnd_rdai_width_get(rdai);
239 240 241 242 243 244 245 246 247 248 249 250

	for (j = 0; j < ARRAY_SIZE(ssi_clk_mul_table); j++) {

		/*
		 * It will set SSIWSR.CONT here, but SSICR.CKDV = 000
		 * with it is not allowed. (SSIWSR.WS_MODE with
		 * SSICR.CKDV = 000 is not allowed either).
		 * Skip it. See SSICR.CKDV
		 */
		if (j == 0)
			continue;

251
		main_rate = width * param1 * param2 * ssi_clk_mul_table[j];
252 253 254 255 256 257 258 259 260 261 262

		ret = rsnd_adg_clk_query(priv, main_rate);
		if (ret < 0)
			continue;

		if (idx)
			*idx = j;

		return main_rate;
	}

263
	return 0;
264 265
}

266
static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
267
				     struct rsnd_dai_stream *io)
268
{
269
	struct rsnd_priv *priv = rsnd_io_to_priv(io);
270
	struct device *dev = rsnd_priv_to_dev(priv);
271
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
272
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
273
	int chan = rsnd_runtime_channel_for_ssi(io);
274
	int idx, ret;
275
	unsigned int main_rate;
276 277 278
	unsigned int rate = rsnd_io_is_play(io) ?
		rsnd_src_get_out_rate(priv, io) :
		rsnd_src_get_in_rate(priv, io);
279

280 281 282
	if (!rsnd_rdai_is_clk_master(rdai))
		return 0;

283
	if (!rsnd_ssi_can_output_clk(mod))
284 285
		return 0;

286 287 288
	if (rsnd_ssi_is_multi_slave(mod, io))
		return 0;

289
	if (ssi->usrcnt > 1) {
290 291 292 293 294
		if (ssi->rate != rate) {
			dev_err(dev, "SSI parent/child should use same rate\n");
			return -EINVAL;
		}

295 296 297 298 299
		if (ssi->chan != chan) {
			dev_err(dev, "SSI parent/child should use same chan\n");
			return -EINVAL;
		}

300 301 302
		return 0;
	}

303 304 305
	if (rsnd_runtime_is_tdm_split(io))
		chan = rsnd_io_converted_chan(io);

306
	main_rate = rsnd_ssi_clk_query(rdai, rate, chan, &idx);
307
	if (!main_rate) {
308 309 310
		dev_err(dev, "unsupported clock rate\n");
		return -EIO;
	}
311

312 313 314
	ret = rsnd_adg_ssi_clk_try_start(mod, main_rate);
	if (ret < 0)
		return ret;
315

316 317 318 319 320 321 322 323 324 325
	/*
	 * SSI clock will be output contiguously
	 * by below settings.
	 * This means, rsnd_ssi_master_clk_start()
	 * and rsnd_ssi_register_setup() are necessary
	 * for SSI parent
	 *
	 * SSICR  : FORCE, SCKD, SWSD
	 * SSIWSR : CONT
	 */
326 327
	ssi->cr_clk = FORCE | rsnd_rdai_width_to_swl(rdai) |
			SCKD | SWSD | CKDV(idx);
328 329
	ssi->wsr = CONT;
	ssi->rate = rate;
330
	ssi->chan = chan;
331

332 333
	dev_dbg(dev, "%s outputs %d chan %u Hz\n",
		rsnd_mod_name(mod), chan, rate);
334

335
	return 0;
336 337
}

338
static void rsnd_ssi_master_clk_stop(struct rsnd_mod *mod,
339
				     struct rsnd_dai_stream *io)
340
{
341
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
342
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
343

344
	if (!rsnd_rdai_is_clk_master(rdai))
345 346
		return;

347
	if (!rsnd_ssi_can_output_clk(mod))
348
		return;
349

350 351
	if (ssi->usrcnt > 1)
		return;
352

353 354
	ssi->cr_clk	= 0;
	ssi->rate	= 0;
355
	ssi->chan	= 0;
356

357
	rsnd_adg_ssi_clk_stop(mod);
358 359
}

360
static void rsnd_ssi_config_init(struct rsnd_mod *mod,
361 362 363
				struct rsnd_dai_stream *io)
{
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
364 365
	struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
	struct device *dev = rsnd_priv_to_dev(priv);
366
	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
367
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
368 369 370
	u32 cr_own	= ssi->cr_own;
	u32 cr_mode	= ssi->cr_mode;
	u32 wsr		= ssi->wsr;
371 372
	int width;
	int is_tdm, is_tdm_split;
373

374 375
	is_tdm		= rsnd_runtime_is_tdm(io);
	is_tdm_split	= rsnd_runtime_is_tdm_split(io);
376

377 378 379 380 381
	if (is_tdm)
		dev_dbg(dev, "TDM mode\n");
	if (is_tdm_split)
		dev_dbg(dev, "TDM Split mode\n");

382
	cr_own |= FORCE | rsnd_rdai_width_to_swl(rdai);
383 384 385

	if (rdai->bit_clk_inv)
		cr_own |= SCKP;
386
	if (rdai->frm_clk_inv && !is_tdm)
387 388 389 390 391
		cr_own |= SWSP;
	if (rdai->data_alignment)
		cr_own |= SDTA;
	if (rdai->sys_delay)
		cr_own |= DEL;
392

393 394 395 396 397 398
	/*
	 * TDM Mode
	 * see
	 *	rsnd_ssiu_init_gen2()
	 */
	wsr = ssi->wsr;
399
	if (is_tdm || is_tdm_split) {
400 401 402 403
		wsr	|= WS_MODE;
		cr_own	|= CHNL_8;
	}

404 405 406 407 408 409 410
	/*
	 * We shouldn't exchange SWSP after running.
	 * This means, parent needs to care it.
	 */
	if (rsnd_ssi_is_parent(mod, io))
		goto init_end;

411 412 413
	if (rsnd_io_is_play(io))
		cr_own |= TRMD;

414
	cr_own &= ~DWL_MASK;
415 416 417 418 419 420 421 422 423 424 425 426
	width = snd_pcm_format_width(runtime->format);
	if (is_tdm_split) {
		/*
		 * The SWL and DWL bits in SSICR should be fixed at 32-bit
		 * setting when TDM split mode.
		 * see datasheet
		 *	Operation :: TDM Format Split Function (TDM Split Mode)
		 */
		width = 32;
	}

	switch (width) {
427 428 429
	case 8:
		cr_own |= DWL_8;
		break;
430 431 432
	case 16:
		cr_own |= DWL_16;
		break;
433
	case 24:
434 435
		cr_own |= DWL_24;
		break;
436 437 438
	case 32:
		cr_own |= DWL_32;
		break;
439 440
	}

441
	if (rsnd_ssi_is_dma_mode(mod)) {
442 443 444 445 446 447
		cr_mode = UIEN | OIEN |	/* over/under run */
			  DMEN;		/* DMA : enable DMA */
	} else {
		cr_mode = DIEN;		/* PIO : enable Data interrupt */
	}

448
init_end:
449 450
	ssi->cr_own	= cr_own;
	ssi->cr_mode	= cr_mode;
451
	ssi->wsr	= wsr;
452
}
453

454 455 456 457 458 459 460
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	|
461 462
					ssi->cr_mode	|
					ssi->cr_en);
463 464
}

465 466 467 468
/*
 *	SSI mod common functions
 */
static int rsnd_ssi_init(struct rsnd_mod *mod,
469
			 struct rsnd_dai_stream *io,
470
			 struct rsnd_priv *priv)
471 472
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
473

474 475 476
	if (!rsnd_ssi_is_run_mods(mod, io))
		return 0;

477 478 479 480
	ssi->usrcnt++;

	rsnd_mod_power_on(mod);

481
	rsnd_ssi_config_init(mod, io);
482

483
	rsnd_ssi_register_setup(mod);
484 485 486 487

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

488 489 490 491
	return 0;
}

static int rsnd_ssi_quit(struct rsnd_mod *mod,
492
			 struct rsnd_dai_stream *io,
493
			 struct rsnd_priv *priv)
494 495 496 497
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	struct device *dev = rsnd_priv_to_dev(priv);

498 499 500
	if (!rsnd_ssi_is_run_mods(mod, io))
		return 0;

501
	if (!ssi->usrcnt) {
502
		dev_err(dev, "%s usrcnt error\n", rsnd_mod_name(mod));
503 504
		return -EIO;
	}
505

506
	rsnd_ssi_master_clk_stop(mod, io);
507 508 509 510 511

	rsnd_mod_power_off(mod);

	ssi->usrcnt--;

512 513 514 515 516 517
	if (!ssi->usrcnt) {
		ssi->cr_own	= 0;
		ssi->cr_mode	= 0;
		ssi->wsr	= 0;
	}

518 519 520
	return 0;
}

521
static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
522
			      struct rsnd_dai_stream *io,
523 524 525
			      struct snd_pcm_substream *substream,
			      struct snd_pcm_hw_params *params)
{
526 527 528 529 530 531 532 533 534 535
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
	unsigned int fmt_width = snd_pcm_format_width(params_format(params));

	if (fmt_width > rdai->chan_width) {
		struct rsnd_priv *priv = rsnd_io_to_priv(io);
		struct device *dev = rsnd_priv_to_dev(priv);

		dev_err(dev, "invalid combination of slot-width and format-data-width\n");
		return -EINVAL;
	}
536 537 538 539

	return 0;
}

540 541 542
static int rsnd_ssi_start(struct rsnd_mod *mod,
			  struct rsnd_dai_stream *io,
			  struct rsnd_priv *priv)
543
{
544 545
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);

546 547 548
	if (!rsnd_ssi_is_run_mods(mod, io))
		return 0;

549 550 551 552
	/*
	 * EN will be set via SSIU :: SSI_CONTROL
	 * if Multi channel mode
	 */
553
	if (rsnd_ssi_multi_slaves_runtime(io))
554
		return 0;
555

556 557 558 559 560 561 562 563 564 565 566 567 568
	/*
	 * EN is for data output.
	 * SSI parent EN is not needed.
	 */
	if (rsnd_ssi_is_parent(mod, io))
		return 0;

	ssi->cr_en = EN;

	rsnd_mod_write(mod, SSICR,	ssi->cr_own	|
					ssi->cr_clk	|
					ssi->cr_mode	|
					ssi->cr_en);
569 570 571 572

	return 0;
}

573 574 575
static int rsnd_ssi_stop(struct rsnd_mod *mod,
			 struct rsnd_dai_stream *io,
			 struct rsnd_priv *priv)
576
{
577 578 579
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	u32 cr;

580 581 582
	if (!rsnd_ssi_is_run_mods(mod, io))
		return 0;

583
	if (rsnd_ssi_is_parent(mod, io))
584
		return 0;
585 586 587

	cr  =	ssi->cr_own	|
		ssi->cr_clk;
588

589 590 591 592 593 594 595 596 597
	/*
	 * disable all IRQ,
	 * Playback: Wait all data was sent
	 * Capture:  It might not receave data. Do nothing
	 */
	if (rsnd_io_is_play(io)) {
		rsnd_mod_write(mod, SSICR, cr | EN);
		rsnd_ssi_status_check(mod, DIRQ);
	}
598

599 600 601 602 603 604
	/*
	 * disable SSI,
	 * and, wait idle state
	 */
	rsnd_mod_write(mod, SSICR, cr);	/* disabled all */
	rsnd_ssi_status_check(mod, IIRQ);
605

606 607
	ssi->cr_en = 0;

608 609 610
	return 0;
}

611 612 613 614 615 616 617 618 619 620 621 622 623
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;

624 625 626
	if (!rsnd_ssi_is_run_mods(mod, io))
		return 0;

627 628 629 630 631 632 633 634
	if (enable)
		val = rsnd_ssi_is_dma_mode(mod) ? 0x0e000000 : 0x0f000000;

	rsnd_mod_write(mod, SSI_INT_ENABLE, val);

	return 0;
}

635 636
static bool rsnd_ssi_pio_interrupt(struct rsnd_mod *mod,
				   struct rsnd_dai_stream *io);
637 638
static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
				 struct rsnd_dai_stream *io)
639
{
640
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
641
	struct device *dev = rsnd_priv_to_dev(priv);
642
	int is_dma = rsnd_ssi_is_dma_mode(mod);
643
	u32 status;
644
	bool elapsed = false;
645
	bool stop = false;
646 647

	spin_lock(&priv->lock);
648

649
	/* ignore all cases if not working */
650
	if (!rsnd_io_is_working(io))
651 652
		goto rsnd_ssi_interrupt_out;

653
	status = rsnd_ssi_status_get(mod);
654 655

	/* PIO only */
656 657
	if (!is_dma && (status & DIRQ))
		elapsed = rsnd_ssi_pio_interrupt(mod, io);
658

659
	/* DMA only */
660
	if (is_dma && (status & (UIRQ | OIRQ))) {
661 662
		rsnd_dbg_irq_status(dev, "%s err status : 0x%08x\n",
			rsnd_mod_name(mod), status);
663

664
		stop = true;
665
	}
666

667
	rsnd_ssi_status_clear(mod);
668 669 670
rsnd_ssi_interrupt_out:
	spin_unlock(&priv->lock);

671 672
	if (elapsed)
		rsnd_dai_period_elapsed(io);
673 674 675 676

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

677 678 679 680 681 682 683
}

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

	rsnd_mod_interrupt(mod, __rsnd_ssi_interrupt);
684

685
	return IRQ_HANDLED;
686 687
}

688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722
static u32 *rsnd_ssi_get_status(struct rsnd_mod *mod,
				struct rsnd_dai_stream *io,
				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(mod, io, type);
}

723 724 725
/*
 *		SSI PIO
 */
726
static void rsnd_ssi_parent_attach(struct rsnd_mod *mod,
727
				   struct rsnd_dai_stream *io)
728
{
729 730 731
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);

732 733 734
	if (!__rsnd_ssi_is_pin_sharing(mod))
		return;

735 736 737
	if (!rsnd_rdai_is_clk_master(rdai))
		return;

738 739 740 741 742 743 744 745 746 747 748 749 750 751
	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;
	}
}

752 753 754 755 756 757 758 759 760 761 762 763 764 765
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;
}

766 767 768
static int rsnd_ssi_common_probe(struct rsnd_mod *mod,
				 struct rsnd_dai_stream *io,
				 struct rsnd_priv *priv)
769 770 771
{
	struct device *dev = rsnd_priv_to_dev(priv);
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
772
	int ret = 0;
773

774 775 776 777 778 779 780
	/*
	 * SSIP/SSIU/IRQ are not needed on
	 * SSI Multi slaves
	 */
	if (rsnd_ssi_is_multi_slave(mod, io))
		return 0;

781 782 783 784
	/*
	 * It can't judge ssi parent at this point
	 * see rsnd_ssi_pcm_new()
	 */
785

786 787 788
	/*
	 * SSI might be called again as PIO fallback
	 * It is easy to manual handling for IRQ request/free
789 790 791 792 793 794 795
	 *
	 * OTOH, this function might be called many times if platform is
	 * using MIX. It needs xxx_attach() many times on xxx_probe().
	 * Because of it, we can't control .probe/.remove calling count by
	 * mod->status.
	 * But it don't need to call request_irq() many times.
	 * Let's control it by RSND_SSI_PROBED flag.
796
	 */
797
	if (!rsnd_flags_has(ssi, RSND_SSI_PROBED)) {
798 799 800 801 802
		ret = request_irq(ssi->irq,
				  rsnd_ssi_interrupt,
				  IRQF_SHARED,
				  dev_name(dev), mod);

803
		rsnd_flags_set(ssi, RSND_SSI_PROBED);
804
	}
805

806 807 808
	return ret;
}

809 810 811 812 813 814 815 816 817 818 819 820
static int rsnd_ssi_common_remove(struct rsnd_mod *mod,
				  struct rsnd_dai_stream *io,
				  struct rsnd_priv *priv)
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	struct rsnd_mod *pure_ssi_mod = rsnd_io_to_mod_ssi(io);

	/* Do nothing if non SSI (= SSI parent, multi SSI) mod */
	if (pure_ssi_mod != mod)
		return 0;

	/* PIO will request IRQ again */
821
	if (rsnd_flags_has(ssi, RSND_SSI_PROBED)) {
822 823
		free_irq(ssi->irq, mod);

824
		rsnd_flags_del(ssi, RSND_SSI_PROBED);
825
	}
826 827 828 829

	return 0;
}

830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894
/*
 *	SSI PIO functions
 */
static bool rsnd_ssi_pio_interrupt(struct rsnd_mod *mod,
				   struct rsnd_dai_stream *io)
{
	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	u32 *buf = (u32 *)(runtime->dma_area + ssi->byte_pos);
	int shift = 0;
	int byte_pos;
	bool elapsed = false;

	if (snd_pcm_format_width(runtime->format) == 24)
		shift = 8;

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

	byte_pos = ssi->byte_pos + sizeof(*buf);

	if (byte_pos >= ssi->next_period_byte) {
		int period_pos = byte_pos / ssi->byte_per_period;

		if (period_pos >= runtime->periods) {
			byte_pos = 0;
			period_pos = 0;
		}

		ssi->next_period_byte = (period_pos + 1) * ssi->byte_per_period;

		elapsed = true;
	}

	WRITE_ONCE(ssi->byte_pos, byte_pos);

	return elapsed;
}

static int rsnd_ssi_pio_init(struct rsnd_mod *mod,
			     struct rsnd_dai_stream *io,
			     struct rsnd_priv *priv)
{
	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);

	if (!rsnd_ssi_is_parent(mod, io)) {
		ssi->byte_pos		= 0;
		ssi->byte_per_period	= runtime->period_size *
					  runtime->channels *
					  samples_to_bytes(runtime, 1);
		ssi->next_period_byte	= ssi->byte_per_period;
	}

	return rsnd_ssi_init(mod, io, priv);
}

static int rsnd_ssi_pio_pointer(struct rsnd_mod *mod,
895 896 897
			    struct rsnd_dai_stream *io,
			    snd_pcm_uframes_t *pointer)
{
898
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
899 900
	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);

901
	*pointer = bytes_to_frames(runtime, READ_ONCE(ssi->byte_pos));
902 903 904 905

	return 0;
}

906 907 908 909 910 911 912
static int rsnd_ssi_prepare(struct rsnd_mod *mod,
			    struct rsnd_dai_stream *io,
			    struct rsnd_priv *priv)
{
	return rsnd_ssi_master_clk_start(mod, io);
}

913
static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
914 915 916 917 918 919 920 921 922 923 924 925 926
	.name		= SSI_NAME,
	.probe		= rsnd_ssi_common_probe,
	.remove		= rsnd_ssi_common_remove,
	.init		= rsnd_ssi_pio_init,
	.quit		= rsnd_ssi_quit,
	.start		= rsnd_ssi_start,
	.stop		= rsnd_ssi_stop,
	.irq		= rsnd_ssi_irq,
	.pointer	= rsnd_ssi_pio_pointer,
	.pcm_new	= rsnd_ssi_pcm_new,
	.hw_params	= rsnd_ssi_hw_params,
	.prepare	= rsnd_ssi_prepare,
	.get_status	= rsnd_ssi_get_status,
927 928
};

929
static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
930
			      struct rsnd_dai_stream *io,
931
			      struct rsnd_priv *priv)
932 933 934
{
	int ret;

935 936 937 938 939 940 941
	/*
	 * SSIP/SSIU/IRQ/DMA are not needed on
	 * SSI Multi slaves
	 */
	if (rsnd_ssi_is_multi_slave(mod, io))
		return 0;

942
	ret = rsnd_ssi_common_probe(mod, io, priv);
943
	if (ret)
944
		return ret;
945

946
	/* SSI probe might be called many times in MUX multi path */
947
	ret = rsnd_dma_attach(io, mod, &io->dma);
948

949 950 951
	return ret;
}

952
static int rsnd_ssi_fallback(struct rsnd_mod *mod,
953
			     struct rsnd_dai_stream *io,
954
			     struct rsnd_priv *priv)
955
{
956 957 958 959 960 961 962 963 964 965 966
	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;

967
	dev_info(dev, "%s fallback to PIO mode\n", rsnd_mod_name(mod));
968

969 970 971
	return 0;
}

972 973
static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_dai_stream *io,
					 struct rsnd_mod *mod)
974
{
975 976 977 978
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
	int is_play = rsnd_io_is_play(io);
	char *name;

979 980 981 982 983 984 985 986 987 988 989
	/*
	 * It should use "rcar_sound,ssiu" on DT.
	 * But, we need to keep compatibility for old version.
	 *
	 * If it has "rcar_sound.ssiu", it will be used.
	 * If not, "rcar_sound.ssi" will be used.
	 * see
	 *	rsnd_ssiu_dma_req()
	 *	rsnd_dma_of_path()
	 */

990
	if (rsnd_ssi_use_busif(io))
991 992 993 994 995 996
		name = is_play ? "rxu" : "txu";
	else
		name = is_play ? "rx" : "tx";

	return rsnd_dma_request_channel(rsnd_ssi_of_node(priv),
					mod, name);
997 998
}

999
static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013
	.name		= SSI_NAME,
	.dma_req	= rsnd_ssi_dma_req,
	.probe		= rsnd_ssi_dma_probe,
	.remove		= rsnd_ssi_common_remove,
	.init		= rsnd_ssi_init,
	.quit		= rsnd_ssi_quit,
	.start		= rsnd_ssi_start,
	.stop		= rsnd_ssi_stop,
	.irq		= rsnd_ssi_irq,
	.pcm_new	= rsnd_ssi_pcm_new,
	.fallback	= rsnd_ssi_fallback,
	.hw_params	= rsnd_ssi_hw_params,
	.prepare	= rsnd_ssi_prepare,
	.get_status	= rsnd_ssi_get_status,
1014 1015
};

1016
static int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod)
1017 1018 1019 1020
{
	return mod->ops == &rsnd_ssi_dma_ops;
}

1021 1022 1023
/*
 *		ssi mod function
 */
1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041
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);
1042 1043
			rsnd_rdai_channels_set(rdai, (i + 1) * 2);
			rsnd_rdai_ssi_lane_set(rdai, (i + 1));
1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075
			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);
}

1076 1077
struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id)
{
1078 1079
	if (WARN_ON(id < 0 || id >= rsnd_ssi_nr(priv)))
		id = 0;
1080

1081
	return rsnd_mod_get(rsnd_ssi_get(priv, id));
1082 1083
}

1084
int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
1085
{
1086 1087
	if (!mod)
		return 0;
1088

1089
	return !!(rsnd_flags_has(rsnd_mod_to_ssi(mod), RSND_SSI_CLK_PIN_SHARE));
1090 1091
}

1092
int rsnd_ssi_probe(struct rsnd_priv *priv)
1093
{
1094 1095
	struct device_node *node;
	struct device_node *np;
1096 1097 1098 1099 1100
	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];
1101
	int i, nr, ret;
1102

1103 1104 1105 1106 1107 1108 1109 1110 1111
	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;
	}
1112

1113
	ssi	= devm_kcalloc(dev, nr, sizeof(*ssi), GFP_KERNEL);
1114 1115 1116 1117
	if (!ssi) {
		ret = -ENOMEM;
		goto rsnd_ssi_probe_done;
	}
1118

1119 1120
	priv->ssi	= ssi;
	priv->ssi_nr	= nr;
1121

1122 1123
	i = 0;
	for_each_child_of_node(node, np) {
1124 1125 1126
		if (!of_device_is_available(np))
			goto skip;

1127
		ssi = rsnd_ssi_get(priv, i);
1128

1129 1130
		snprintf(name, RSND_SSI_NAME_SIZE, "%s.%d",
			 SSI_NAME, i);
1131

1132
		clk = devm_clk_get(dev, name);
1133 1134
		if (IS_ERR(clk)) {
			ret = PTR_ERR(clk);
1135
			of_node_put(np);
1136 1137
			goto rsnd_ssi_probe_done;
		}
1138

1139
		if (of_get_property(np, "shared-pin", NULL))
1140
			rsnd_flags_set(ssi, RSND_SSI_CLK_PIN_SHARE);
1141 1142

		if (of_get_property(np, "no-busif", NULL))
1143
			rsnd_flags_set(ssi, RSND_SSI_NO_BUSIF);
1144 1145 1146 1147

		ssi->irq = irq_of_parse_and_map(np, 0);
		if (!ssi->irq) {
			ret = -EINVAL;
1148
			of_node_put(np);
1149 1150
			goto rsnd_ssi_probe_done;
		}
1151

J
Julia Lawall 已提交
1152
		if (of_property_read_bool(np, "pio-transfer"))
1153
			ops = &rsnd_ssi_pio_ops;
1154 1155
		else
			ops = &rsnd_ssi_dma_ops;
1156

1157
		ret = rsnd_mod_init(priv, rsnd_mod_get(ssi), ops, clk,
1158
				    RSND_MOD_SSI, i);
1159 1160
		if (ret) {
			of_node_put(np);
1161
			goto rsnd_ssi_probe_done;
1162
		}
1163
skip:
1164
		i++;
1165 1166
	}

1167 1168 1169 1170 1171 1172
	ret = 0;

rsnd_ssi_probe_done:
	of_node_put(node);

	return ret;
1173
}
1174

1175
void rsnd_ssi_remove(struct rsnd_priv *priv)
1176 1177 1178 1179 1180
{
	struct rsnd_ssi *ssi;
	int i;

	for_each_rsnd_ssi(ssi, priv, i) {
1181
		rsnd_mod_quit(rsnd_mod_get(ssi));
1182 1183
	}
}