src.c 15.4 KB
Newer Older
1
/*
2
 * Renesas R-Car SRC support
3 4 5 6 7 8 9 10 11 12
 *
 * Copyright (C) 2013 Renesas Solutions Corp.
 * Kuninori Morimoto <kuninori.morimoto.gx@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 "rsnd.h"

13 14
struct rsnd_src {
	struct rsnd_src_platform_info *info; /* rcar_snd.h */
15
	struct rsnd_mod mod;
16
	struct clk *clk;
17 18
};

19
#define RSND_SRC_NAME_SIZE 16
20 21 22 23 24 25 26 27 28 29

/*
 * ADINR
 */
#define OTBL_24		(0 << 16)
#define OTBL_22		(2 << 16)
#define OTBL_20		(4 << 16)
#define OTBL_18		(6 << 16)
#define OTBL_16		(8 << 16)

30 31 32 33 34 35 36 37
#define rsnd_src_mode_flags(p) ((p)->info->flags)
#define rsnd_src_convert_rate(p) ((p)->info->convert_rate)
#define rsnd_mod_to_src(_mod)				\
	container_of((_mod), struct rsnd_src, mod)
#define rsnd_src_hpbif_is_enable(src)	\
	(rsnd_src_mode_flags(src) & RSND_SCU_USE_HPBIF)
#define rsnd_src_dma_available(src) \
	rsnd_dma_available(rsnd_mod_to_dma(&(src)->mod))
38

39
#define for_each_rsnd_src(pos, priv, i)				\
40
	for ((i) = 0;						\
41 42
	     ((i) < rsnd_src_nr(priv)) &&			\
	     ((pos) = (struct rsnd_src *)(priv)->src + i);	\
43 44 45
	     i++)


46 47 48 49 50 51 52 53 54
/*
 *		image of SRC (Sampling Rate Converter)
 *
 * 96kHz   <-> +-----+	48kHz	+-----+	 48kHz	+-------+
 * 48kHz   <-> | SRC | <------>	| SSI |	<----->	| codec |
 * 44.1kHz <-> +-----+		+-----+		+-------+
 * ...
 *
 */
55

56
/*
57
 * src.c is caring...
58 59 60 61 62 63 64 65
 *
 * Gen1
 *
 * [mem] -> [SRU] -> [SSI]
 *        |--------|
 *
 * Gen2
 *
66
 * [mem] -> [SRC] -> [SSIU] -> [SSI]
67 68 69
 *        |-----------------|
 */

70 71 72 73 74 75 76 77 78 79 80 81
/*
 *	How to use SRC bypass mode for debugging
 *
 * SRC has bypass mode, and it is useful for debugging.
 * In Gen2 case,
 * SRCm_MODE controls whether SRC is used or not
 * SSI_MODE0 controls whether SSIU which receives SRC data
 * is used or not.
 * Both SRCm_MODE/SSI_MODE0 settings are needed if you use SRC,
 * but SRC bypass mode needs SSI_MODE0 only.
 *
 * This driver request
82
 * struct rsnd_src_platform_info {
83 84 85 86
 *	u32 flags;
 *	u32 convert_rate;
 * }
 *
87 88
 * rsnd_src_hpbif_is_enable() will be true
 * if flags had RSND_SRC_USE_HPBIF,
89 90
 * and it controls whether SSIU is used or not.
 *
91
 * rsnd_src_convert_rate() indicates
92 93 94 95
 * above convert_rate, and it controls
 * whether SRC is used or not.
 *
 * ex) doesn't use SRC
96
 * struct rsnd_src_platform_info info = {
97 98 99 100 101
 *	.flags = 0,
 *	.convert_rate = 0,
 * };
 *
 * ex) uses SRC
102 103
 * struct rsnd_src_platform_info info = {
 *	.flags = RSND_SRC_USE_HPBIF,
104 105 106 107
 *	.convert_rate = 48000,
 * };
 *
 * ex) uses SRC bypass mode
108 109
 * struct rsnd_src_platform_info info = {
 *	.flags = RSND_SRC_USE_HPBIF,
110 111 112 113 114
 *	.convert_rate = 0,
 * };
 *
 */

115 116 117
/*
 *		Gen1/Gen2 common functions
 */
118
int rsnd_src_ssi_mode_init(struct rsnd_mod *ssi_mod,
119 120
			   struct rsnd_dai *rdai,
			   struct rsnd_dai_stream *io)
121
{
122
	struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
123
	struct rsnd_mod *src_mod = rsnd_io_to_mod_src(io);
124
	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
125
	int ssi_id = rsnd_mod_id(ssi_mod);
126
	int has_src = 0;
127 128 129 130

	/*
	 * SSI_MODE0
	 */
131
	if (info->dai_info) {
132
		has_src = !!src_mod;
133
	} else {
134 135
		struct rsnd_src *src = rsnd_mod_to_src(src_mod);
		has_src = rsnd_src_hpbif_is_enable(src);
136 137 138
	}

	rsnd_mod_bset(ssi_mod, SSI_MODE0, (1 << ssi_id),
139
		      has_src ? 0 : (1 << ssi_id));
140 141 142 143

	/*
	 * SSI_MODE1
	 */
144
	if (rsnd_ssi_is_pin_sharing(ssi_mod)) {
145
		int shift = -1;
146
		switch (ssi_id) {
147 148 149 150 151 152 153 154 155 156 157 158
		case 1:
			shift = 0;
			break;
		case 2:
			shift = 2;
			break;
		case 4:
			shift = 16;
			break;
		}

		if (shift >= 0)
159
			rsnd_mod_bset(ssi_mod, SSI_MODE1,
160 161 162 163 164 165 166 167
				      0x3 << shift,
				      rsnd_dai_is_clk_master(rdai) ?
				      0x2 << shift : 0x1 << shift);
	}

	return 0;
}

168
int rsnd_src_enable_ssi_irq(struct rsnd_mod *ssi_mod,
169 170 171 172 173 174 175 176 177 178 179 180
			    struct rsnd_dai *rdai,
			    struct rsnd_dai_stream *io)
{
	struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);

	/* enable PIO interrupt if Gen2 */
	if (rsnd_is_gen2(priv))
		rsnd_mod_write(ssi_mod, INT_ENABLE, 0x0f000000);

	return 0;
}

181
unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
182
				   struct rsnd_dai_stream *io,
183 184
				   struct snd_pcm_runtime *runtime)
{
185
	struct rsnd_mod *src_mod = rsnd_io_to_mod_src(io);
186
	struct rsnd_src *src;
187
	unsigned int rate = 0;
188

189 190 191 192 193 194 195 196 197
	if (src_mod) {
		src = rsnd_mod_to_src(src_mod);

		/*
		 * return convert rate if SRC is used,
		 * otherwise, return runtime->rate as usual
		 */
		rate = rsnd_src_convert_rate(src);
	}
198 199 200 201 202 203 204

	if (!rate)
		rate = runtime->rate;

	return rate;
}

205
static int rsnd_src_set_convert_rate(struct rsnd_mod *mod,
206 207 208 209
				     struct rsnd_dai *rdai,
				     struct rsnd_dai_stream *io)
{
	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
210 211
	struct rsnd_src *src = rsnd_mod_to_src(mod);
	u32 convert_rate = rsnd_src_convert_rate(src);
212 213 214 215 216 217 218 219 220 221 222 223
	u32 adinr = runtime->channels;
	u32 fsrate = 0;

	if (convert_rate)
		fsrate = 0x0400000 / convert_rate * runtime->rate;

	/* set/clear soft reset */
	rsnd_mod_write(mod, SRC_SWRSR, 0);
	rsnd_mod_write(mod, SRC_SWRSR, 1);

	/*
	 * Initialize the operation of the SRC internal circuits
224
	 * see rsnd_src_start()
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
	 */
	rsnd_mod_write(mod, SRC_SRCIR, 1);

	/* Set channel number and output bit length */
	switch (runtime->sample_bits) {
	case 16:
		adinr |= OTBL_16;
		break;
	case 32:
		adinr |= OTBL_24;
		break;
	default:
		return -EIO;
	}
	rsnd_mod_write(mod, SRC_ADINR, adinr);

	/* Enable the initial value of IFS */
	if (fsrate) {
		rsnd_mod_write(mod, SRC_IFSCR, 1);

		/* Set initial value of IFS */
		rsnd_mod_write(mod, SRC_IFSVR, fsrate);
	}

	/* use DMA transfer */
	rsnd_mod_write(mod, SRC_BUSIF_MODE, 1);

	return 0;
}

255
static int rsnd_src_init(struct rsnd_mod *mod,
256 257 258
			 struct rsnd_dai *rdai,
			 struct rsnd_dai_stream *io)
{
259
	struct rsnd_src *src = rsnd_mod_to_src(mod);
260

261
	clk_enable(src->clk);
262 263 264 265

	return 0;
}

266
static int rsnd_src_quit(struct rsnd_mod *mod,
267 268 269
			 struct rsnd_dai *rdai,
			 struct rsnd_dai_stream *io)
{
270
	struct rsnd_src *src = rsnd_mod_to_src(mod);
271

272
	clk_disable(src->clk);
273 274 275 276

	return 0;
}

277
static int rsnd_src_start(struct rsnd_mod *mod,
278 279 280
			  struct rsnd_dai *rdai,
			  struct rsnd_dai_stream *io)
{
281
	struct rsnd_src *src = rsnd_mod_to_src(mod);
282 283 284

	/*
	 * Cancel the initialization and operate the SRC function
285
	 * see rsnd_src_set_convert_rate()
286 287 288
	 */
	rsnd_mod_write(mod, SRC_SRCIR, 0);

289
	if (rsnd_src_convert_rate(src))
290 291 292 293 294 295
		rsnd_mod_write(mod, SRC_ROUTE_MODE0, 1);

	return 0;
}


296
static int rsnd_src_stop(struct rsnd_mod *mod,
297 298 299
			 struct rsnd_dai *rdai,
			 struct rsnd_dai_stream *io)
{
300
	struct rsnd_src *src = rsnd_mod_to_src(mod);
301

302
	if (rsnd_src_convert_rate(src))
303 304 305 306 307
		rsnd_mod_write(mod, SRC_ROUTE_MODE0, 0);

	return 0;
}

308 309
static struct rsnd_mod_ops rsnd_src_non_ops = {
	.name	= "src (non)",
310 311 312 313 314 315 316 317
};

/*
 *		Gen1 functions
 */
static int rsnd_src_set_route_gen1(struct rsnd_mod *mod,
				   struct rsnd_dai *rdai,
				   struct rsnd_dai_stream *io)
318
{
319
	struct src_route_config {
320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
		u32 mask;
		int shift;
	} routes[] = {
		{ 0xF,  0, }, /* 0 */
		{ 0xF,  4, }, /* 1 */
		{ 0xF,  8, }, /* 2 */
		{ 0x7, 12, }, /* 3 */
		{ 0x7, 16, }, /* 4 */
		{ 0x7, 20, }, /* 5 */
		{ 0x7, 24, }, /* 6 */
		{ 0x3, 28, }, /* 7 */
		{ 0x3, 30, }, /* 8 */
	};
	u32 mask;
	u32 val;
	int id;

	id = rsnd_mod_id(mod);
338
	if (id < 0 || id >= ARRAY_SIZE(routes))
339 340 341 342 343 344 345 346 347 348 349
		return -EIO;

	/*
	 * SRC_ROUTE_SELECT
	 */
	val = rsnd_dai_is_play(rdai, io) ? 0x1 : 0x2;
	val = val		<< routes[id].shift;
	mask = routes[id].mask	<< routes[id].shift;

	rsnd_mod_bset(mod, SRC_ROUTE_SEL, mask, val);

350 351 352
	return 0;
}

353
static int rsnd_src_set_convert_timing_gen1(struct rsnd_mod *mod,
354 355 356 357
					    struct rsnd_dai *rdai,
					    struct rsnd_dai_stream *io)
{
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
358
	struct rsnd_src *src = rsnd_mod_to_src(mod);
359
	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
360
	u32 convert_rate = rsnd_src_convert_rate(src);
361 362 363 364 365 366
	u32 mask;
	u32 val;
	int shift;
	int id = rsnd_mod_id(mod);
	int ret;

367 368 369 370 371
	/*
	 * SRC_TIMING_SELECT
	 */
	shift	= (id % 4) * 8;
	mask	= 0x1F << shift;
372 373 374 375 376 377 378

	/*
	 * ADG is used as source clock if SRC was used,
	 * then, SSI WS is used as destination clock.
	 * SSI WS is used as source clock if SRC is not used
	 * (when playback, source/destination become reverse when capture)
	 */
379 380 381
	ret = 0;
	if (convert_rate) {
		/* use ADG */
382
		val = 0;
383 384 385 386 387
		ret = rsnd_adg_set_convert_clk_gen1(priv, mod,
						    runtime->rate,
						    convert_rate);
	} else if (8 == id) {
		/* use SSI WS, but SRU8 is special */
388
		val = id << shift;
389 390
	} else {
		/* use SSI WS */
391
		val = (id + 1) << shift;
392 393 394 395
	}

	if (ret < 0)
		return ret;
396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411

	switch (id / 4) {
	case 0:
		rsnd_mod_bset(mod, SRC_TMG_SEL0, mask, val);
		break;
	case 1:
		rsnd_mod_bset(mod, SRC_TMG_SEL1, mask, val);
		break;
	case 2:
		rsnd_mod_bset(mod, SRC_TMG_SEL2, mask, val);
		break;
	}

	return 0;
}

412
static int rsnd_src_set_convert_rate_gen1(struct rsnd_mod *mod,
413 414
					  struct rsnd_dai *rdai,
					  struct rsnd_dai_stream *io)
415
{
416
	int ret;
417

418
	ret = rsnd_src_set_convert_rate(mod, rdai, io);
419 420
	if (ret < 0)
		return ret;
421

422 423
	/* Select SRC mode (fixed value) */
	rsnd_mod_write(mod, SRC_SRCCR, 0x00010110);
424

425 426 427
	/* Set the restriction value of the FS ratio (98%) */
	rsnd_mod_write(mod, SRC_MNFSR,
		       rsnd_mod_read(mod, SRC_IFSVR) / 100 * 98);
428

429
	/* no SRC_BFSSR settings, since SRC_SRCCR::BUFMD is 0 */
430

431 432 433
	return 0;
}

434
static int rsnd_src_init_gen1(struct rsnd_mod *mod,
435 436
			      struct rsnd_dai *rdai,
			      struct rsnd_dai_stream *io)
437
{
438 439
	int ret;

440
	ret = rsnd_src_init(mod, rdai, io);
441 442 443
	if (ret < 0)
		return ret;

444
	ret = rsnd_src_set_route_gen1(mod, rdai, io);
445 446 447
	if (ret < 0)
		return ret;

448
	ret = rsnd_src_set_convert_rate_gen1(mod, rdai, io);
449 450
	if (ret < 0)
		return ret;
451

452
	ret = rsnd_src_set_convert_timing_gen1(mod, rdai, io);
453 454 455
	if (ret < 0)
		return ret;

456 457 458
	return 0;
}

459
static int rsnd_src_start_gen1(struct rsnd_mod *mod,
460 461
			       struct rsnd_dai *rdai,
			       struct rsnd_dai_stream *io)
462
{
463
	int id = rsnd_mod_id(mod);
464

465
	rsnd_mod_bset(mod, SRC_ROUTE_CTRL, (1 << id), (1 << id));
466

467
	return rsnd_src_start(mod, rdai, io);
468 469
}

470
static int rsnd_src_stop_gen1(struct rsnd_mod *mod,
471 472
			      struct rsnd_dai *rdai,
			      struct rsnd_dai_stream *io)
473
{
474
	int id = rsnd_mod_id(mod);
475

476
	rsnd_mod_bset(mod, SRC_ROUTE_CTRL, (1 << id), 0);
477

478
	return rsnd_src_stop(mod, rdai, io);
479 480
}

481
static struct rsnd_mod_ops rsnd_src_gen1_ops = {
482
	.name	= "sru (gen1)",
483 484 485 486
	.init	= rsnd_src_init_gen1,
	.quit	= rsnd_src_quit,
	.start	= rsnd_src_start_gen1,
	.stop	= rsnd_src_stop_gen1,
487
};
488

489 490 491
/*
 *		Gen2 functions
 */
492
static int rsnd_src_set_convert_rate_gen2(struct rsnd_mod *mod,
493 494 495 496 497
					  struct rsnd_dai *rdai,
					  struct rsnd_dai_stream *io)
{
	int ret;

498
	ret = rsnd_src_set_convert_rate(mod, rdai, io);
499 500 501 502 503 504 505 506 507 508 509 510 511 512
	if (ret < 0)
		return ret;

	rsnd_mod_write(mod, SSI_BUSIF_ADINR, rsnd_mod_read(mod, SRC_ADINR));
	rsnd_mod_write(mod, SSI_BUSIF_MODE,  rsnd_mod_read(mod, SRC_BUSIF_MODE));

	rsnd_mod_write(mod, SRC_SRCCR, 0x00011110);

	rsnd_mod_write(mod, SRC_BSDSR, 0x01800000);
	rsnd_mod_write(mod, SRC_BSISR, 0x00100060);

	return 0;
}

513
static int rsnd_src_set_convert_timing_gen2(struct rsnd_mod *mod,
514 515 516 517
					    struct rsnd_dai *rdai,
					    struct rsnd_dai_stream *io)
{
	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
518 519
	struct rsnd_src *src = rsnd_mod_to_src(mod);
	u32 convert_rate = rsnd_src_convert_rate(src);
520 521 522 523 524 525 526 527 528 529 530 531
	int ret;

	if (convert_rate)
		ret = rsnd_adg_set_convert_clk_gen2(mod, rdai, io,
						    runtime->rate,
						    convert_rate);
	else
		ret = rsnd_adg_set_convert_timing_gen2(mod, rdai, io);

	return ret;
}

532
static int rsnd_src_probe_gen2(struct rsnd_mod *mod,
533 534 535 536 537
			       struct rsnd_dai *rdai,
			       struct rsnd_dai_stream *io)
{
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
538
	struct rsnd_src *src = rsnd_mod_to_src(mod);
539 540 541 542 543 544
	struct rsnd_mod *ssi = rsnd_ssi_mod_get(priv, rsnd_mod_id(mod));
	struct device *dev = rsnd_priv_to_dev(priv);
	int ret;
	int is_play;

	if (info->dai_info)
545
		is_play = rsnd_info_is_playback(priv, src);
546 547 548 549 550 551
	else
		is_play = rsnd_ssi_is_play(ssi);

	ret = rsnd_dma_init(priv,
			    rsnd_mod_to_dma(mod),
			    is_play,
552
			    src->info->dma_id);
553
	if (ret < 0)
554
		dev_err(dev, "SRC DMA failed\n");
555 556 557 558

	return ret;
}

559
static int rsnd_src_remove_gen2(struct rsnd_mod *mod,
560 561 562 563 564 565 566 567
				struct rsnd_dai *rdai,
				struct rsnd_dai_stream *io)
{
	rsnd_dma_quit(rsnd_mod_to_priv(mod), rsnd_mod_to_dma(mod));

	return 0;
}

568
static int rsnd_src_init_gen2(struct rsnd_mod *mod,
569 570 571 572 573
			      struct rsnd_dai *rdai,
			      struct rsnd_dai_stream *io)
{
	int ret;

574
	ret = rsnd_src_init(mod, rdai, io);
575 576 577
	if (ret < 0)
		return ret;

578
	ret = rsnd_src_set_convert_rate_gen2(mod, rdai, io);
579 580 581
	if (ret < 0)
		return ret;

582
	ret = rsnd_src_set_convert_timing_gen2(mod, rdai, io);
583 584 585 586 587 588
	if (ret < 0)
		return ret;

	return 0;
}

589
static int rsnd_src_start_gen2(struct rsnd_mod *mod,
590 591 592
			       struct rsnd_dai *rdai,
			       struct rsnd_dai_stream *io)
{
593
	struct rsnd_src *src = rsnd_mod_to_src(mod);
594

595
	rsnd_dma_start(rsnd_mod_to_dma(&src->mod));
596 597 598 599

	rsnd_mod_write(mod, SSI_CTRL, 0x1);
	rsnd_mod_write(mod, SRC_CTRL, 0x11);

600
	return rsnd_src_start(mod, rdai, io);
601 602
}

603
static int rsnd_src_stop_gen2(struct rsnd_mod *mod,
604 605 606
			      struct rsnd_dai *rdai,
			      struct rsnd_dai_stream *io)
{
607
	struct rsnd_src *src = rsnd_mod_to_src(mod);
608 609 610 611

	rsnd_mod_write(mod, SSI_CTRL, 0);
	rsnd_mod_write(mod, SRC_CTRL, 0);

612
	rsnd_dma_stop(rsnd_mod_to_dma(&src->mod));
613

614
	return rsnd_src_stop(mod, rdai, io);
615 616
}

617 618 619 620 621 622 623 624
static struct rsnd_mod_ops rsnd_src_gen2_ops = {
	.name	= "src (gen2)",
	.probe	= rsnd_src_probe_gen2,
	.remove	= rsnd_src_remove_gen2,
	.init	= rsnd_src_init_gen2,
	.quit	= rsnd_src_quit,
	.start	= rsnd_src_start_gen2,
	.stop	= rsnd_src_stop_gen2,
625 626
};

627
struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id)
628
{
629
	if (WARN_ON(id < 0 || id >= rsnd_src_nr(priv)))
630
		id = 0;
631

632
	return &((struct rsnd_src *)(priv->src) + id)->mod;
633 634
}

635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667
static void rsnd_of_parse_src(struct platform_device *pdev,
			      const struct rsnd_of_data *of_data,
			      struct rsnd_priv *priv)
{
	struct device_node *src_node;
	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
	struct rsnd_src_platform_info *src_info;
	struct device *dev = &pdev->dev;
	int nr;

	if (!of_data)
		return;

	src_node = of_get_child_by_name(dev->of_node, "rcar_sound,src");
	if (!src_node)
		return;

	nr = of_get_child_count(src_node);
	if (!nr)
		return;

	src_info = devm_kzalloc(dev,
				sizeof(struct rsnd_src_platform_info) * nr,
				GFP_KERNEL);
	if (!src_info) {
		dev_err(dev, "src info allocation error\n");
		return;
	}

	info->src_info		= src_info;
	info->src_info_nr	= nr;
}

668
int rsnd_src_probe(struct platform_device *pdev,
669
		   const struct rsnd_of_data *of_data,
670 671
		   struct rsnd_priv *priv)
{
672
	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
673
	struct device *dev = rsnd_priv_to_dev(priv);
674
	struct rsnd_src *src;
675
	struct rsnd_mod_ops *ops;
676
	struct clk *clk;
677
	char name[RSND_SRC_NAME_SIZE];
678 679
	int i, nr;

680 681
	rsnd_of_parse_src(pdev, of_data, priv);

682
	/*
683
	 * init SRC
684
	 */
685
	nr	= info->src_info_nr;
686 687 688
	if (!nr)
		return 0;

689 690 691
	src	= devm_kzalloc(dev, sizeof(*src) * nr, GFP_KERNEL);
	if (!src) {
		dev_err(dev, "SRC allocate failed\n");
692 693 694
		return -ENOMEM;
	}

695 696
	priv->src_nr	= nr;
	priv->src	= src;
697

698 699
	for_each_rsnd_src(src, priv, i) {
		snprintf(name, RSND_SRC_NAME_SIZE, "src.%d", i);
700 701

		clk = devm_clk_get(dev, name);
702 703 704 705 706
		if (IS_ERR(clk)) {
			snprintf(name, RSND_SRC_NAME_SIZE, "scu.%d", i);
			clk = devm_clk_get(dev, name);
		}

707 708 709
		if (IS_ERR(clk))
			return PTR_ERR(clk);

710 711
		src->info = &info->src_info[i];
		src->clk = clk;
712

713 714
		ops = &rsnd_src_non_ops;
		if (rsnd_src_hpbif_is_enable(src)) {
715
			if (rsnd_is_gen1(priv))
716
				ops = &rsnd_src_gen1_ops;
717
			if (rsnd_is_gen2(priv))
718
				ops = &rsnd_src_gen2_ops;
719
		}
720

721
		rsnd_mod_init(priv, &src->mod, ops, RSND_MOD_SRC, i);
722

723
		dev_dbg(dev, "SRC%d probed\n", i);
724
	}
725 726 727

	return 0;
}