ssi.c 17.8 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
struct rsnd_ssi {
	struct rsnd_ssi_platform_info *info; /* rcar_snd.h */
	struct rsnd_ssi *parent;
	struct rsnd_mod mod;
66
	struct rsnd_mod *dma;
67 68 69

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

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

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

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

97 98 99
	if (!rsnd_ssi_is_dma_mode(mod))
		return 0;

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

108 109 110 111 112 113 114 115 116 117
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);
}

118 119 120 121 122 123 124 125 126
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++) {
127
		status = rsnd_ssi_status_get(mod);
128 129 130 131 132 133 134 135 136
		if (status & bit)
			return;

		udelay(50);
	}

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

137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
static int rsnd_ssi_irq_enable(struct rsnd_mod *ssi_mod)
{
	struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);

	if (rsnd_is_gen1(priv))
		return 0;

	/* enable SSI interrupt if Gen2 */
	rsnd_mod_write(ssi_mod, SSI_INT_ENABLE,
		       rsnd_ssi_is_dma_mode(ssi_mod) ?
		       0x0e000000 : 0x0f000000);

	return 0;
}

static int rsnd_ssi_irq_disable(struct rsnd_mod *ssi_mod)
{
	struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);

	if (rsnd_is_gen1(priv))
		return 0;

	/* disable SSI interrupt if Gen2 */
	rsnd_mod_write(ssi_mod, SSI_INT_ENABLE, 0x00000000);

	return 0;
}

165
static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
166
				     struct rsnd_dai_stream *io)
167
{
168
	struct rsnd_priv *priv = rsnd_io_to_priv(io);
169
	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
170
	struct device *dev = rsnd_priv_to_dev(priv);
171
	struct rsnd_mod *mod = rsnd_mod_get(ssi);
172
	int j, ret;
173 174 175 176
	int ssi_clk_mul_table[] = {
		1, 2, 4, 8, 16, 6, 12,
	};
	unsigned int main_rate;
177
	unsigned int rate = rsnd_src_get_ssi_rate(priv, io, runtime);
178 179 180 181

	/*
	 * Find best clock, and try to start ADG
	 */
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
	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;
201 202 203 204 205 206 207 208 209
		}
	}

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

static void rsnd_ssi_master_clk_stop(struct rsnd_ssi *ssi)
{
210 211
	struct rsnd_mod *mod = rsnd_mod_get(ssi);

212
	ssi->cr_clk = 0;
213
	rsnd_adg_ssi_clk_stop(mod);
214 215 216 217 218
}

static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
			      struct rsnd_dai_stream *io)
{
219
	struct rsnd_priv *priv = rsnd_io_to_priv(io);
220
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
221
	struct device *dev = rsnd_priv_to_dev(priv);
222
	struct rsnd_mod *mod = rsnd_mod_get(ssi);
223
	u32 cr_mode;
224 225 226
	u32 cr;

	if (0 == ssi->usrcnt) {
227
		rsnd_mod_power_on(mod);
228

229
		if (rsnd_rdai_is_clk_master(rdai)) {
230 231 232 233
			struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi);

			if (ssi_parent)
				rsnd_ssi_hw_start(ssi_parent, io);
234
			else
235
				rsnd_ssi_master_clk_start(ssi, io);
236 237 238
		}
	}

239
	if (rsnd_ssi_is_dma_mode(mod)) {
240 241 242 243 244
		cr_mode = UIEN | OIEN |	/* over/under run */
			  DMEN;		/* DMA : enable DMA */
	} else {
		cr_mode = DIEN;		/* PIO : enable Data interrupt */
	}
245

246 247
	cr  =	ssi->cr_own	|
		ssi->cr_clk	|
248
		cr_mode		|
249
		EN;
250

251
	rsnd_mod_write(mod, SSICR, cr);
252

253
	/* enable WS continue */
254
	if (rsnd_rdai_is_clk_master(rdai))
255
		rsnd_mod_write(mod, SSIWSR, CONT);
256

257
	/* clear error status */
258
	rsnd_ssi_status_clear(mod);
259

260 261
	ssi->usrcnt++;

262
	dev_dbg(dev, "%s[%d] hw started\n",
263
		rsnd_mod_name(mod), rsnd_mod_id(mod));
264 265
}

266
static void rsnd_ssi_hw_stop(struct rsnd_dai_stream *io, struct rsnd_ssi *ssi)
267
{
268 269
	struct rsnd_mod *mod = rsnd_mod_get(ssi);
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
270
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
271 272 273
	struct device *dev = rsnd_priv_to_dev(priv);
	u32 cr;

274 275
	if (0 == ssi->usrcnt) {
		dev_err(dev, "%s called without starting\n", __func__);
276
		return;
277
	}
278 279 280 281 282 283 284 285 286 287 288

	ssi->usrcnt--;

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

289 290
		rsnd_mod_write(mod, SSICR, cr | EN);
		rsnd_ssi_status_check(mod, DIRQ);
291 292 293 294 295

		/*
		 * disable SSI,
		 * and, wait idle state
		 */
296 297
		rsnd_mod_write(mod, SSICR, cr);	/* disabled all */
		rsnd_ssi_status_check(mod, IIRQ);
298

299
		if (rsnd_rdai_is_clk_master(rdai)) {
300 301 302
			struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi);

			if (ssi_parent)
303
				rsnd_ssi_hw_stop(io, ssi_parent);
304 305 306 307
			else
				rsnd_ssi_master_clk_stop(ssi);
		}

308
		rsnd_mod_power_off(mod);
309 310

		ssi->chan = 0;
311 312
	}

313
	dev_dbg(dev, "%s[%d] hw stopped\n",
314
		rsnd_mod_name(mod), rsnd_mod_id(mod));
315 316 317 318 319 320
}

/*
 *	SSI mod common functions
 */
static int rsnd_ssi_init(struct rsnd_mod *mod,
321
			 struct rsnd_dai_stream *io,
322
			 struct rsnd_priv *priv)
323 324
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
325
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
	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;
359
	if (rsnd_io_is_play(io))
360 361 362 363 364 365 366 367 368 369 370 371
		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,
372
			 struct rsnd_dai_stream *io,
373
			 struct rsnd_priv *priv)
374 375 376 377 378
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	struct device *dev = rsnd_priv_to_dev(priv);

	if (ssi->err > 0)
379 380
		dev_warn(dev, "%s[%d] under/over flow err = %d\n",
			 rsnd_mod_name(mod), rsnd_mod_id(mod), ssi->err);
381 382 383 384 385 386 387

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

	return 0;
}

388
static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
389
			      struct rsnd_dai_stream *io,
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
			      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)
413
		return rsnd_ssi_hw_params(rsnd_mod_get(ssi_parent), io,
414
					  substream, params);
415 416 417 418

	return 0;
}

419
static u32 rsnd_ssi_record_error(struct rsnd_ssi *ssi)
420
{
421
	struct rsnd_mod *mod = rsnd_mod_get(ssi);
422
	u32 status = rsnd_ssi_status_get(mod);
423

424 425 426 427 428
	/* under/over flow error */
	if (status & (UIRQ | OIRQ)) {
		ssi->err++;

		/* clear error status */
429
		rsnd_ssi_status_clear(mod);
430
	}
431 432

	return status;
433 434
}

435
static int rsnd_ssi_start(struct rsnd_mod *mod,
436
			  struct rsnd_dai_stream *io,
437
			  struct rsnd_priv *priv)
438 439 440
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);

441
	rsnd_ssi_hw_start(ssi, io);
442

443
	rsnd_ssi_irq_enable(mod);
444 445 446 447 448

	return 0;
}

static int rsnd_ssi_stop(struct rsnd_mod *mod,
449
			 struct rsnd_dai_stream *io,
450
			 struct rsnd_priv *priv)
451 452 453
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);

454
	rsnd_ssi_irq_disable(mod);
455

456
	rsnd_ssi_record_error(ssi);
457

458
	rsnd_ssi_hw_stop(io, ssi);
459 460 461 462

	return 0;
}

463 464
static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
				 struct rsnd_dai_stream *io)
465
{
466
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
467
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
468
	struct device *dev = rsnd_priv_to_dev(priv);
469
	int is_dma = rsnd_ssi_is_dma_mode(mod);
470
	u32 status;
471
	bool elapsed = false;
472 473

	spin_lock(&priv->lock);
474

475
	/* ignore all cases if not working */
476
	if (!rsnd_io_is_working(io))
477 478
		goto rsnd_ssi_interrupt_out;

479
	status = rsnd_ssi_record_error(ssi);
480 481

	/* PIO only */
482
	if (!is_dma && (status & DIRQ)) {
483 484 485 486 487 488 489 490 491
		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()
		 */
492
		if (rsnd_io_is_play(io))
493
			rsnd_mod_write(mod, SSITDR, *buf);
494
		else
495
			*buf = rsnd_mod_read(mod, SSIRDR);
496

497
		elapsed = rsnd_dai_pointer_update(io, sizeof(*buf));
498
	}
499

500 501
	/* DMA only */
	if (is_dma && (status & (UIRQ | OIRQ))) {
502 503 504 505 506
		/*
		 * restart SSI
		 */
		dev_dbg(dev, "%s[%d] restart\n",
			rsnd_mod_name(mod), rsnd_mod_id(mod));
507

508
		rsnd_ssi_stop(mod, io, priv);
509
		rsnd_ssi_start(mod, io, priv);
510 511
	}

512 513 514 515 516 517 518
	if (ssi->err > 1024) {
		rsnd_ssi_irq_disable(mod);

		dev_warn(dev, "no more %s[%d] restart\n",
			 rsnd_mod_name(mod), rsnd_mod_id(mod));
	}

519 520 521
rsnd_ssi_interrupt_out:
	spin_unlock(&priv->lock);

522 523
	if (elapsed)
		rsnd_dai_period_elapsed(io);
524 525 526 527 528 529 530
}

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

	rsnd_mod_interrupt(mod, __rsnd_ssi_interrupt);
531

532
	return IRQ_HANDLED;
533 534
}

535 536 537
/*
 *		SSI PIO
 */
538 539 540
static int rsnd_ssi_common_probe(struct rsnd_mod *mod,
				 struct rsnd_dai_stream *io,
				 struct rsnd_priv *priv)
541 542 543 544 545
{
	struct device *dev = rsnd_priv_to_dev(priv);
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	int ret;

546 547 548 549
	ret = rsnd_ssiu_attach(io, mod);
	if (ret < 0)
		return ret;

550 551
	ret = devm_request_irq(dev, ssi->info->irq,
			       rsnd_ssi_interrupt,
552
			       IRQF_SHARED,
553
			       dev_name(dev), mod);
554

555 556 557
	return ret;
}

558
static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
559
	.name	= SSI_NAME,
560
	.probe	= rsnd_ssi_common_probe,
561 562
	.init	= rsnd_ssi_init,
	.quit	= rsnd_ssi_quit,
563 564
	.start	= rsnd_ssi_start,
	.stop	= rsnd_ssi_stop,
565
	.hw_params = rsnd_ssi_hw_params,
566 567
};

568
static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
569
			      struct rsnd_dai_stream *io,
570
			      struct rsnd_priv *priv)
571 572 573 574 575
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	int dma_id = ssi->info->dma_id;
	int ret;

576
	ret = rsnd_ssi_common_probe(mod, io, priv);
577
	if (ret)
578
		return ret;
579

580
	ssi->dma = rsnd_dma_attach(io, mod, dma_id);
581 582
	if (IS_ERR(ssi->dma))
		return PTR_ERR(ssi->dma);
583

584 585 586 587
	return ret;
}

static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
588
			       struct rsnd_dai_stream *io,
589
			       struct rsnd_priv *priv)
590
{
591 592
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	struct device *dev = rsnd_priv_to_dev(priv);
593
	int irq = ssi->info->irq;
594 595

	/* PIO will request IRQ again */
596
	devm_free_irq(dev, irq, mod);
597

598 599 600 601
	return 0;
}

static int rsnd_ssi_fallback(struct rsnd_mod *mod,
602
			     struct rsnd_dai_stream *io,
603
			     struct rsnd_priv *priv)
604
{
605 606 607 608 609 610 611 612 613 614 615 616 617 618
	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));

619 620 621
	return 0;
}

622 623
static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_dai_stream *io,
					 struct rsnd_mod *mod)
624
{
625 626 627 628
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
	int is_play = rsnd_io_is_play(io);
	char *name;

629
	if (rsnd_ssi_use_busif(io))
630 631 632 633 634 635
		name = is_play ? "rxu" : "txu";
	else
		name = is_play ? "rx" : "tx";

	return rsnd_dma_request_channel(rsnd_ssi_of_node(priv),
					mod, name);
636 637
}

638
static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
639
	.name	= SSI_NAME,
640
	.dma_req = rsnd_ssi_dma_req,
641 642
	.probe	= rsnd_ssi_dma_probe,
	.remove	= rsnd_ssi_dma_remove,
643 644
	.init	= rsnd_ssi_init,
	.quit	= rsnd_ssi_quit,
645 646
	.start	= rsnd_ssi_start,
	.stop	= rsnd_ssi_stop,
647
	.fallback = rsnd_ssi_fallback,
648
	.hw_params = rsnd_ssi_hw_params,
649 650
};

651 652 653 654 655 656
int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod)
{
	return mod->ops == &rsnd_ssi_dma_ops;
}


657 658 659 660
/*
 *		Non SSI
 */
static struct rsnd_mod_ops rsnd_ssi_non_ops = {
661
	.name	= SSI_NAME,
662 663 664 665 666 667 668
};

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

672
	return rsnd_mod_get((struct rsnd_ssi *)(priv->ssi) + id);
673 674
}

675
int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
676 677 678 679 680 681
{
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);

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

682
static void rsnd_ssi_parent_setup(struct rsnd_priv *priv, struct rsnd_ssi *ssi)
683
{
684 685
	struct rsnd_mod *mod = rsnd_mod_get(ssi);

686
	if (!__rsnd_ssi_is_pin_sharing(mod))
687 688
		return;

689
	switch (rsnd_mod_id(mod)) {
690 691 692 693 694 695 696 697 698 699 700 701 702
	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;
	}
}

703 704 705 706 707 708 709 710 711 712 713 714

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;

715
	node = rsnd_ssi_of_node(priv);
716 717 718 719 720
	if (!node)
		return;

	nr = of_get_child_count(node);
	if (!nr)
721
		goto rsnd_of_parse_ssi_end;
722 723 724 725 726 727

	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");
728
		goto rsnd_of_parse_ssi_end;
729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748
	}

	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
		 */
749
		ssi_info->irq = irq_of_parse_and_map(np, 0);
750 751 752 753 754 755

		/*
		 * DMA
		 */
		ssi_info->dma_id = of_get_property(np, "pio-transfer", NULL) ?
			0 : 1;
756 757 758

		if (of_get_property(np, "no-busif", NULL))
			ssi_info->flags |= RSND_SSI_NO_BUSIF;
759
	}
760 761 762

rsnd_of_parse_ssi_end:
	of_node_put(node);
763 764
}

765
int rsnd_ssi_probe(struct platform_device *pdev,
766
		   const struct rsnd_of_data *of_data,
767 768
		   struct rsnd_priv *priv)
{
769
	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
770 771 772 773 774 775
	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];
776
	int i, nr, ret;
777

778 779
	rsnd_of_parse_ssi(pdev, of_data, priv);

780 781 782 783
	/*
	 *	init SSI
	 */
	nr	= info->ssi_info_nr;
784
	ssi	= devm_kzalloc(dev, sizeof(*ssi) * nr, GFP_KERNEL);
785
	if (!ssi)
786 787
		return -ENOMEM;

788 789
	priv->ssi	= ssi;
	priv->ssi_nr	= nr;
790 791 792 793

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

794 795
		snprintf(name, RSND_SSI_NAME_SIZE, "%s.%d",
			 SSI_NAME, i);
796

797
		clk = devm_clk_get(dev, name);
798 799 800 801 802 803
		if (IS_ERR(clk))
			return PTR_ERR(clk);

		ssi->info	= pinfo;

		ops = &rsnd_ssi_non_ops;
804 805 806 807
		if (pinfo->dma_id > 0)
			ops = &rsnd_ssi_dma_ops;
		else if (rsnd_ssi_pio_available(ssi))
			ops = &rsnd_ssi_pio_ops;
808

809 810
		ret = rsnd_mod_init(priv, rsnd_mod_get(ssi), ops, clk,
				    RSND_MOD_SSI, i);
811 812
		if (ret)
			return ret;
813

814
		rsnd_ssi_parent_setup(priv, ssi);
815 816 817 818
	}

	return 0;
}
819 820 821 822 823 824 825 826

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) {
827
		rsnd_mod_quit(rsnd_mod_get(ssi));
828 829
	}
}