ssi.c 17.6 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
#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 */

#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 */
#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 */

55 56 57 58 59
/*
 * SSIWSR
 */
#define CONT		(1 << 8)	/* WS Continue Function */

60 61
#define SSI_NAME "ssi"

62 63 64 65 66 67 68
struct rsnd_ssi {
	struct rsnd_ssi_platform_info *info; /* rcar_snd.h */
	struct rsnd_ssi *parent;
	struct rsnd_mod mod;

	u32 cr_own;
	u32 cr_clk;
69
	int chan;
70 71 72 73 74 75 76
	int err;
	unsigned int usrcnt;
};

#define for_each_rsnd_ssi(pos, priv, i)					\
	for (i = 0;							\
	     (i < rsnd_ssi_nr(priv)) &&					\
77
		((pos) = ((struct rsnd_ssi *)(priv)->ssi + i));		\
78 79
	     i++)

80
#define rsnd_ssi_nr(priv) ((priv)->ssi_nr)
81
#define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
82
#define rsnd_ssi_pio_available(ssi) ((ssi)->info->irq > 0)
83
#define rsnd_ssi_parent(ssi) ((ssi)->parent)
84
#define rsnd_ssi_mode_flags(p) ((p)->info->flags)
85
#define rsnd_ssi_dai_id(ssi) ((ssi)->info->dai_id)
86 87
#define rsnd_ssi_of_node(priv) \
	of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,ssi")
88

89
int rsnd_ssi_use_busif(struct rsnd_dai_stream *io)
90
{
91
	struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io);
92 93 94
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	int use_busif = 0;

95 96 97
	if (!rsnd_ssi_is_dma_mode(mod))
		return 0;

98 99 100 101 102 103 104 105
	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;
}

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
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++) {
		status = rsnd_mod_read(mod, SSISR);
		if (status & bit)
			return;

		udelay(50);
	}

	dev_warn(dev, "status check failed\n");
}

static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
126
				     struct rsnd_dai_stream *io)
127
{
128
	struct rsnd_priv *priv = rsnd_io_to_priv(io);
129
	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
130
	struct device *dev = rsnd_priv_to_dev(priv);
131
	struct rsnd_mod *mod = rsnd_mod_get(ssi);
132
	int j, ret;
133 134 135 136
	int ssi_clk_mul_table[] = {
		1, 2, 4, 8, 16, 6, 12,
	};
	unsigned int main_rate;
137
	unsigned int rate = rsnd_src_get_ssi_rate(priv, io, runtime);
138 139 140 141

	/*
	 * Find best clock, and try to start ADG
	 */
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
	for (j = 0; j < ARRAY_SIZE(ssi_clk_mul_table); j++) {

		/*
		 * this driver is assuming that
		 * system word is 64fs (= 2 x 32bit)
		 * see rsnd_ssi_init()
		 */
		main_rate = rate * 32 * 2 * ssi_clk_mul_table[j];

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

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

			return 0;
161 162 163 164 165 166 167 168 169
		}
	}

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

static void rsnd_ssi_master_clk_stop(struct rsnd_ssi *ssi)
{
170 171
	struct rsnd_mod *mod = rsnd_mod_get(ssi);

172
	ssi->cr_clk = 0;
173
	rsnd_adg_ssi_clk_stop(mod);
174 175 176 177 178
}

static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
			      struct rsnd_dai_stream *io)
{
179
	struct rsnd_priv *priv = rsnd_io_to_priv(io);
180
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
181
	struct device *dev = rsnd_priv_to_dev(priv);
182
	struct rsnd_mod *mod = rsnd_mod_get(ssi);
183
	u32 cr_mode;
184 185 186
	u32 cr;

	if (0 == ssi->usrcnt) {
187
		rsnd_mod_power_on(mod);
188

189
		if (rsnd_rdai_is_clk_master(rdai)) {
190 191 192 193
			struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi);

			if (ssi_parent)
				rsnd_ssi_hw_start(ssi_parent, io);
194
			else
195
				rsnd_ssi_master_clk_start(ssi, io);
196 197 198
		}
	}

199
	if (rsnd_ssi_is_dma_mode(mod)) {
200 201 202 203 204
		cr_mode = UIEN | OIEN |	/* over/under run */
			  DMEN;		/* DMA : enable DMA */
	} else {
		cr_mode = DIEN;		/* PIO : enable Data interrupt */
	}
205

206 207
	cr  =	ssi->cr_own	|
		ssi->cr_clk	|
208
		cr_mode		|
209
		EN;
210

211
	rsnd_mod_write(mod, SSICR, cr);
212

213
	/* enable WS continue */
214
	if (rsnd_rdai_is_clk_master(rdai))
215
		rsnd_mod_write(mod, SSIWSR, CONT);
216

217
	/* clear error status */
218
	rsnd_mod_write(mod, SSISR, 0);
219

220 221
	ssi->usrcnt++;

222
	dev_dbg(dev, "%s[%d] hw started\n",
223
		rsnd_mod_name(mod), rsnd_mod_id(mod));
224 225
}

226
static void rsnd_ssi_hw_stop(struct rsnd_dai_stream *io, struct rsnd_ssi *ssi)
227
{
228 229
	struct rsnd_mod *mod = rsnd_mod_get(ssi);
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
230
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
231 232 233
	struct device *dev = rsnd_priv_to_dev(priv);
	u32 cr;

234 235
	if (0 == ssi->usrcnt) {
		dev_err(dev, "%s called without starting\n", __func__);
236
		return;
237
	}
238 239 240 241 242 243 244 245 246 247 248

	ssi->usrcnt--;

	if (0 == ssi->usrcnt) {
		/*
		 * disable all IRQ,
		 * and, wait all data was sent
		 */
		cr  =	ssi->cr_own	|
			ssi->cr_clk;

249 250
		rsnd_mod_write(mod, SSICR, cr | EN);
		rsnd_ssi_status_check(mod, DIRQ);
251 252 253 254 255

		/*
		 * disable SSI,
		 * and, wait idle state
		 */
256 257
		rsnd_mod_write(mod, SSICR, cr);	/* disabled all */
		rsnd_ssi_status_check(mod, IIRQ);
258

259
		if (rsnd_rdai_is_clk_master(rdai)) {
260 261 262
			struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi);

			if (ssi_parent)
263
				rsnd_ssi_hw_stop(io, ssi_parent);
264 265 266 267
			else
				rsnd_ssi_master_clk_stop(ssi);
		}

268
		rsnd_mod_power_off(mod);
269 270

		ssi->chan = 0;
271 272
	}

273
	dev_dbg(dev, "%s[%d] hw stopped\n",
274
		rsnd_mod_name(mod), rsnd_mod_id(mod));
275 276 277 278 279 280
}

/*
 *	SSI mod common functions
 */
static int rsnd_ssi_init(struct rsnd_mod *mod,
281
			 struct rsnd_dai_stream *io,
282
			 struct rsnd_priv *priv)
283 284
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
285
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
	u32 cr;

	cr = FORCE;

	/*
	 * always use 32bit system word for easy clock calculation.
	 * see also rsnd_ssi_master_clk_enable()
	 */
	cr |= SWL_32;

	/*
	 * init clock settings for SSICR
	 */
	switch (runtime->sample_bits) {
	case 16:
		cr |= DWL_16;
		break;
	case 32:
		cr |= DWL_24;
		break;
	default:
		return -EIO;
	}

	if (rdai->bit_clk_inv)
		cr |= SCKP;
	if (rdai->frm_clk_inv)
		cr |= SWSP;
	if (rdai->data_alignment)
		cr |= SDTA;
	if (rdai->sys_delay)
		cr |= DEL;
319
	if (rsnd_io_is_play(io))
320 321 322 323 324 325 326 327 328 329 330 331
		cr |= TRMD;

	/*
	 * set ssi parameter
	 */
	ssi->cr_own	= cr;
	ssi->err	= -1; /* ignore 1st error */

	return 0;
}

static int rsnd_ssi_quit(struct rsnd_mod *mod,
332
			 struct rsnd_dai_stream *io,
333
			 struct rsnd_priv *priv)
334 335 336 337 338
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	struct device *dev = rsnd_priv_to_dev(priv);

	if (ssi->err > 0)
339 340
		dev_warn(dev, "%s[%d] under/over flow err = %d\n",
			 rsnd_mod_name(mod), rsnd_mod_id(mod), ssi->err);
341 342 343 344 345 346 347

	ssi->cr_own	= 0;
	ssi->err	= 0;

	return 0;
}

348
static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
349
			      struct rsnd_dai_stream *io,
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372
			      struct snd_pcm_substream *substream,
			      struct snd_pcm_hw_params *params)
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi);
	int chan = params_channels(params);

	/*
	 * Already working.
	 * It will happen if SSI has parent/child connection.
	 */
	if (ssi->usrcnt) {
		/*
		 * it is error if child <-> parent SSI uses
		 * different channels.
		 */
		if (ssi->chan != chan)
			return -EIO;
	}

	/* It will be removed on rsnd_ssi_hw_stop */
	ssi->chan = chan;
	if (ssi_parent)
373
		return rsnd_ssi_hw_params(rsnd_mod_get(ssi_parent), io,
374
					  substream, params);
375 376 377 378

	return 0;
}

379 380
static void rsnd_ssi_record_error(struct rsnd_ssi *ssi, u32 status)
{
381 382
	struct rsnd_mod *mod = rsnd_mod_get(ssi);

383 384 385 386 387
	/* under/over flow error */
	if (status & (UIRQ | OIRQ)) {
		ssi->err++;

		/* clear error status */
388
		rsnd_mod_write(mod, SSISR, 0);
389 390 391
	}
}

392
static int rsnd_ssi_start(struct rsnd_mod *mod,
393
			  struct rsnd_dai_stream *io,
394
			  struct rsnd_priv *priv)
395 396 397
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);

398
	rsnd_src_ssiu_start(mod, io, rsnd_ssi_use_busif(io));
399

400
	rsnd_ssi_hw_start(ssi, io);
401

402
	rsnd_src_ssi_irq_enable(mod);
403 404 405 406 407

	return 0;
}

static int rsnd_ssi_stop(struct rsnd_mod *mod,
408
			 struct rsnd_dai_stream *io,
409
			 struct rsnd_priv *priv)
410 411 412
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);

413
	rsnd_src_ssi_irq_disable(mod);
414 415 416

	rsnd_ssi_record_error(ssi, rsnd_mod_read(mod, SSISR));

417
	rsnd_ssi_hw_stop(io, ssi);
418

419
	rsnd_src_ssiu_stop(mod, io);
420 421 422 423

	return 0;
}

424 425
static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
				 struct rsnd_dai_stream *io)
426
{
427
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
428
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
429
	int is_dma = rsnd_ssi_is_dma_mode(mod);
430
	u32 status;
431
	bool elapsed = false;
432 433

	spin_lock(&priv->lock);
434

435
	/* ignore all cases if not working */
436
	if (!rsnd_io_is_working(io))
437 438 439
		goto rsnd_ssi_interrupt_out;

	status = rsnd_mod_read(mod, SSISR);
440 441

	/* PIO only */
442
	if (!is_dma && (status & DIRQ)) {
443 444 445 446 447 448 449 450 451
		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()
		 */
452
		if (rsnd_io_is_play(io))
453
			rsnd_mod_write(mod, SSITDR, *buf);
454
		else
455
			*buf = rsnd_mod_read(mod, SSIRDR);
456

457
		elapsed = rsnd_dai_pointer_update(io, sizeof(*buf));
458
	}
459

460 461
	/* DMA only */
	if (is_dma && (status & (UIRQ | OIRQ))) {
462 463 464 465 466 467 468
		struct device *dev = rsnd_priv_to_dev(priv);

		/*
		 * restart SSI
		 */
		dev_dbg(dev, "%s[%d] restart\n",
			rsnd_mod_name(mod), rsnd_mod_id(mod));
469

470
		rsnd_ssi_stop(mod, io, priv);
471
		if (ssi->err < 1024)
472
			rsnd_ssi_start(mod, io, priv);
473 474
		else
			dev_warn(dev, "no more SSI restart\n");
475 476
	}

477 478
	rsnd_ssi_record_error(ssi, status);

479 480 481
rsnd_ssi_interrupt_out:
	spin_unlock(&priv->lock);

482 483
	if (elapsed)
		rsnd_dai_period_elapsed(io);
484 485 486 487 488 489 490
}

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

	rsnd_mod_interrupt(mod, __rsnd_ssi_interrupt);
491

492
	return IRQ_HANDLED;
493 494
}

495 496 497
/*
 *		SSI PIO
 */
498
static int rsnd_ssi_pio_probe(struct rsnd_mod *mod,
499
			      struct rsnd_dai_stream *io,
500
			      struct rsnd_priv *priv)
501 502 503 504 505
{
	struct device *dev = rsnd_priv_to_dev(priv);
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	int ret;

506 507
	ret = devm_request_irq(dev, ssi->info->irq,
			       rsnd_ssi_interrupt,
508
			       IRQF_SHARED,
509
			       dev_name(dev), mod);
510

511 512 513
	return ret;
}

514
static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
515
	.name	= SSI_NAME,
516
	.probe	= rsnd_ssi_pio_probe,
517 518
	.init	= rsnd_ssi_init,
	.quit	= rsnd_ssi_quit,
519 520
	.start	= rsnd_ssi_start,
	.stop	= rsnd_ssi_stop,
521
	.hw_params = rsnd_ssi_hw_params,
522 523
};

524
static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
525
			      struct rsnd_dai_stream *io,
526
			      struct rsnd_priv *priv)
527 528 529 530 531 532
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	struct device *dev = rsnd_priv_to_dev(priv);
	int dma_id = ssi->info->dma_id;
	int ret;

533 534
	ret = devm_request_irq(dev, ssi->info->irq,
			       rsnd_ssi_interrupt,
535
			       IRQF_SHARED,
536
			       dev_name(dev), mod);
537
	if (ret)
538
		return ret;
539

540
	ret = rsnd_dma_init(
541
		io, rsnd_mod_to_dma(mod),
542
		dma_id);
543

544 545 546 547
	return ret;
}

static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
548
			       struct rsnd_dai_stream *io,
549
			       struct rsnd_priv *priv)
550
{
551 552
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	struct device *dev = rsnd_priv_to_dev(priv);
553
	int irq = ssi->info->irq;
554

555
	rsnd_dma_quit(io, rsnd_mod_to_dma(mod));
556

557
	/* PIO will request IRQ again */
558
	devm_free_irq(dev, irq, mod);
559

560 561 562 563
	return 0;
}

static int rsnd_ssi_fallback(struct rsnd_mod *mod,
564
			     struct rsnd_dai_stream *io,
565
			     struct rsnd_priv *priv)
566
{
567 568 569 570 571 572 573 574 575 576 577 578 579 580
	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));

581 582 583
	return 0;
}

584
static int rsnd_ssi_dma_start(struct rsnd_mod *mod,
585
			      struct rsnd_dai_stream *io,
586
			      struct rsnd_priv *priv)
587
{
588
	struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
589

590
	rsnd_dma_start(io, dma);
591

592
	rsnd_ssi_start(mod, io, priv);
593

594 595 596 597
	return 0;
}

static int rsnd_ssi_dma_stop(struct rsnd_mod *mod,
598
			     struct rsnd_dai_stream *io,
599
			     struct rsnd_priv *priv)
600
{
601
	struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
602

603
	rsnd_ssi_stop(mod, io, priv);
604

605
	rsnd_dma_stop(io, dma);
606

607 608 609
	return 0;
}

610 611
static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_dai_stream *io,
					 struct rsnd_mod *mod)
612
{
613 614 615 616
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
	int is_play = rsnd_io_is_play(io);
	char *name;

617
	if (rsnd_ssi_use_busif(io))
618 619 620 621 622 623
		name = is_play ? "rxu" : "txu";
	else
		name = is_play ? "rx" : "tx";

	return rsnd_dma_request_channel(rsnd_ssi_of_node(priv),
					mod, name);
624 625
}

626
static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
627
	.name	= SSI_NAME,
628
	.dma_req = rsnd_ssi_dma_req,
629 630
	.probe	= rsnd_ssi_dma_probe,
	.remove	= rsnd_ssi_dma_remove,
631 632 633 634
	.init	= rsnd_ssi_init,
	.quit	= rsnd_ssi_quit,
	.start	= rsnd_ssi_dma_start,
	.stop	= rsnd_ssi_dma_stop,
635
	.fallback = rsnd_ssi_fallback,
636
	.hw_params = rsnd_ssi_hw_params,
637 638
};

639 640 641 642 643 644
int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod)
{
	return mod->ops == &rsnd_ssi_dma_ops;
}


645 646 647 648
/*
 *		Non SSI
 */
static struct rsnd_mod_ops rsnd_ssi_non_ops = {
649
	.name	= SSI_NAME,
650 651 652 653 654 655 656
};

/*
 *		ssi mod function
 */
struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id)
{
657 658
	if (WARN_ON(id < 0 || id >= rsnd_ssi_nr(priv)))
		id = 0;
659

660
	return rsnd_mod_get((struct rsnd_ssi *)(priv->ssi) + id);
661 662
}

663
int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
664 665 666 667 668 669
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);

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

670
static void rsnd_ssi_parent_setup(struct rsnd_priv *priv, struct rsnd_ssi *ssi)
671
{
672 673
	struct rsnd_mod *mod = rsnd_mod_get(ssi);

674
	if (!__rsnd_ssi_is_pin_sharing(mod))
675 676
		return;

677
	switch (rsnd_mod_id(mod)) {
678 679 680 681 682 683 684 685 686 687 688 689 690
	case 1:
	case 2:
		ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 0));
		break;
	case 4:
		ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 3));
		break;
	case 8:
		ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 7));
		break;
	}
}

691 692 693 694 695 696 697 698 699 700 701 702

static void rsnd_of_parse_ssi(struct platform_device *pdev,
			      const struct rsnd_of_data *of_data,
			      struct rsnd_priv *priv)
{
	struct device_node *node;
	struct device_node *np;
	struct rsnd_ssi_platform_info *ssi_info;
	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
	struct device *dev = &pdev->dev;
	int nr, i;

703
	node = rsnd_ssi_of_node(priv);
704 705 706 707 708
	if (!node)
		return;

	nr = of_get_child_count(node);
	if (!nr)
709
		goto rsnd_of_parse_ssi_end;
710 711 712 713 714 715

	ssi_info = devm_kzalloc(dev,
				sizeof(struct rsnd_ssi_platform_info) * nr,
				GFP_KERNEL);
	if (!ssi_info) {
		dev_err(dev, "ssi info allocation error\n");
716
		goto rsnd_of_parse_ssi_end;
717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736
	}

	info->ssi_info		= ssi_info;
	info->ssi_info_nr	= nr;

	i = -1;
	for_each_child_of_node(node, np) {
		i++;

		ssi_info = info->ssi_info + i;

		/*
		 * pin settings
		 */
		if (of_get_property(np, "shared-pin", NULL))
			ssi_info->flags |= RSND_SSI_CLK_PIN_SHARE;

		/*
		 * irq
		 */
737
		ssi_info->irq = irq_of_parse_and_map(np, 0);
738 739 740 741 742 743

		/*
		 * DMA
		 */
		ssi_info->dma_id = of_get_property(np, "pio-transfer", NULL) ?
			0 : 1;
744 745 746

		if (of_get_property(np, "no-busif", NULL))
			ssi_info->flags |= RSND_SSI_NO_BUSIF;
747
	}
748 749 750

rsnd_of_parse_ssi_end:
	of_node_put(node);
751 752
}

753
int rsnd_ssi_probe(struct platform_device *pdev,
754
		   const struct rsnd_of_data *of_data,
755 756
		   struct rsnd_priv *priv)
{
757
	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
758 759 760 761 762 763
	struct rsnd_ssi_platform_info *pinfo;
	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];
764
	int i, nr, ret;
765

766 767
	rsnd_of_parse_ssi(pdev, of_data, priv);

768 769 770 771
	/*
	 *	init SSI
	 */
	nr	= info->ssi_info_nr;
772
	ssi	= devm_kzalloc(dev, sizeof(*ssi) * nr, GFP_KERNEL);
773
	if (!ssi)
774 775
		return -ENOMEM;

776 777
	priv->ssi	= ssi;
	priv->ssi_nr	= nr;
778 779 780 781

	for_each_rsnd_ssi(ssi, priv, i) {
		pinfo = &info->ssi_info[i];

782 783
		snprintf(name, RSND_SSI_NAME_SIZE, "%s.%d",
			 SSI_NAME, i);
784

785
		clk = devm_clk_get(dev, name);
786 787 788 789 790 791
		if (IS_ERR(clk))
			return PTR_ERR(clk);

		ssi->info	= pinfo;

		ops = &rsnd_ssi_non_ops;
792 793 794 795
		if (pinfo->dma_id > 0)
			ops = &rsnd_ssi_dma_ops;
		else if (rsnd_ssi_pio_available(ssi))
			ops = &rsnd_ssi_pio_ops;
796

797 798
		ret = rsnd_mod_init(priv, rsnd_mod_get(ssi), ops, clk,
				    RSND_MOD_SSI, i);
799 800
		if (ret)
			return ret;
801

802
		rsnd_ssi_parent_setup(priv, ssi);
803 804 805 806
	}

	return 0;
}
807 808 809 810 811 812 813 814

void rsnd_ssi_remove(struct platform_device *pdev,
		     struct rsnd_priv *priv)
{
	struct rsnd_ssi *ssi;
	int i;

	for_each_rsnd_ssi(ssi, priv, i) {
815
		rsnd_mod_quit(rsnd_mod_get(ssi));
816 817
	}
}