src.c 13.2 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
#define SRC_NAME "src"

15 16 17 18 19 20 21
/* SRCx_STATUS */
#define OUF_SRCO	((1 << 12) | (1 << 13))
#define OUF_SRCI	((1 <<  9) | (1 <<  8))

/* SCU_SYSTEM_STATUS0/1 */
#define OUF_SRC(id)	((1 << (id + 16)) | (1 << id))

22
struct rsnd_src {
23
	struct rsnd_mod mod;
24
	struct rsnd_mod *dma;
25 26
	struct rsnd_kctrl_cfg_s sen;  /* sync convert enable */
	struct rsnd_kctrl_cfg_s sync; /* sync convert */
27
	u32 convert_rate; /* sampling rate convert */
28
	int err;
29
	int irq;
30 31
};

32
#define RSND_SRC_NAME_SIZE 16
33

34
#define rsnd_src_get(priv, id) ((struct rsnd_src *)(priv->src) + id)
35
#define rsnd_src_to_dma(src) ((src)->dma)
36
#define rsnd_src_nr(priv) ((priv)->src_nr)
37
#define rsnd_enable_sync_convert(src) ((src)->sen.val)
38

39 40
#define rsnd_mod_to_src(_mod)				\
	container_of((_mod), struct rsnd_src, mod)
41

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


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

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

73 74 75 76 77 78
static void rsnd_src_soft_reset(struct rsnd_mod *mod)
{
	rsnd_mod_write(mod, SRC_SWRSR, 0);
	rsnd_mod_write(mod, SRC_SWRSR, 1);
}

79 80
static struct dma_chan *rsnd_src_dma_req(struct rsnd_dai_stream *io,
					 struct rsnd_mod *mod)
81 82 83 84 85 86 87 88 89
{
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
	int is_play = rsnd_io_is_play(io);

	return rsnd_dma_request_channel(rsnd_src_of_node(priv),
					mod,
					is_play ? "rx" : "tx");
}

90 91
static u32 rsnd_src_convert_rate(struct rsnd_dai_stream *io,
				 struct rsnd_src *src)
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
{
	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
	u32 convert_rate;

	if (!runtime)
		return 0;

	if (!rsnd_enable_sync_convert(src))
		return src->convert_rate;

	convert_rate = src->sync.val;

	if (!convert_rate)
		convert_rate = src->convert_rate;

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

	return convert_rate;
}

113
unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
114
				   struct rsnd_dai_stream *io,
115 116
				   struct snd_pcm_runtime *runtime)
{
117
	struct rsnd_mod *src_mod = rsnd_io_to_mod_src(io);
118
	struct rsnd_src *src;
119
	unsigned int rate = 0;
120

121 122 123 124 125 126 127
	if (src_mod) {
		src = rsnd_mod_to_src(src_mod);

		/*
		 * return convert rate if SRC is used,
		 * otherwise, return runtime->rate as usual
		 */
128
		rate = rsnd_src_convert_rate(io, src);
129
	}
130 131 132 133 134 135 136

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

	return rate;
}

137
static int rsnd_src_hw_params(struct rsnd_mod *mod,
138
			      struct rsnd_dai_stream *io,
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 165 166 167 168 169
			      struct snd_pcm_substream *substream,
			      struct snd_pcm_hw_params *fe_params)
{
	struct rsnd_src *src = rsnd_mod_to_src(mod);
	struct snd_soc_pcm_runtime *fe = substream->private_data;

	/*
	 * SRC assumes that it is used under DPCM if user want to use
	 * sampling rate convert. Then, SRC should be FE.
	 * And then, this function will be called *after* BE settings.
	 * this means, each BE already has fixuped hw_params.
	 * see
	 *	dpcm_fe_dai_hw_params()
	 *	dpcm_be_dai_hw_params()
	 */
	if (fe->dai_link->dynamic) {
		int stream = substream->stream;
		struct snd_soc_dpcm *dpcm;
		struct snd_pcm_hw_params *be_params;

		list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
			be_params = &dpcm->hw_params;

			if (params_rate(fe_params) != params_rate(be_params))
				src->convert_rate = params_rate(be_params);
		}
	}

	return 0;
}

170 171
static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
				      struct rsnd_mod *mod)
172
{
173 174 175
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
	struct device *dev = rsnd_priv_to_dev(priv);
	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
176
	struct rsnd_src *src = rsnd_mod_to_src(mod);
177 178 179 180 181
	u32 convert_rate = rsnd_src_convert_rate(io, src);
	u32 ifscr, fsrate, adinr;
	u32 cr, route;
	u32 bsdsr, bsisr;
	uint ratio;
182

183 184
	if (!runtime)
		return;
185

186 187 188 189 190 191 192
	/* 6 - 1/6 are very enough ratio for SRC_BSDSR */
	if (!convert_rate)
		ratio = 0;
	else if (convert_rate > runtime->rate)
		ratio = 100 * convert_rate / runtime->rate;
	else
		ratio = 100 * runtime->rate / convert_rate;
193

194 195 196 197
	if (ratio > 600) {
		dev_err(dev, "FSO/FSI ratio error\n");
		return;
	}
198

199 200 201 202
	/*
	 *	SRC_ADINR
	 */
	adinr = rsnd_get_adinr_bit(mod, io);
203

204 205 206 207 208 209 210 211 212
	/*
	 *	SRC_IFSCR / SRC_IFSVR
	 */
	ifscr = 0;
	fsrate = 0;
	if (convert_rate) {
		ifscr = 1;
		fsrate = 0x0400000 / convert_rate * runtime->rate;
	}
213

214 215 216 217 218 219 220
	/*
	 *	SRC_SRCCR / SRC_ROUTE_MODE0
	 */
	cr	= 0x00011110;
	route	= 0x0;
	if (convert_rate) {
		route	= 0x1;
221

222 223 224 225 226 227
		if (rsnd_enable_sync_convert(src)) {
			cr |= 0x1;
			route |= rsnd_io_is_play(io) ?
				(0x1 << 24) : (0x1 << 25);
		}
	}
228

229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
	/*
	 * SRC_BSDSR / SRC_BSISR
	 */
	switch (rsnd_mod_id(mod)) {
	case 5:
	case 6:
	case 7:
	case 8:
		bsdsr = 0x02400000; /* 6 - 1/6 */
		bsisr = 0x00100060; /* 6 - 1/6 */
		break;
	default:
		bsdsr = 0x01800000; /* 6 - 1/6 */
		bsisr = 0x00100060 ;/* 6 - 1/6 */
		break;
	}
245

246 247 248 249 250 251 252 253
	rsnd_mod_write(mod, SRC_SRCIR, 1);	/* initialize */
	rsnd_mod_write(mod, SRC_ADINR, adinr);
	rsnd_mod_write(mod, SRC_IFSCR, ifscr);
	rsnd_mod_write(mod, SRC_IFSVR, fsrate);
	rsnd_mod_write(mod, SRC_SRCCR, cr);
	rsnd_mod_write(mod, SRC_BSDSR, bsdsr);
	rsnd_mod_write(mod, SRC_BSISR, bsisr);
	rsnd_mod_write(mod, SRC_SRCIR, 0);	/* cancel initialize */
254

255 256 257
	rsnd_mod_write(mod, SRC_ROUTE_MODE0, route);
	rsnd_mod_write(mod, SRC_BUSIF_MODE, 1);
	rsnd_mod_write(mod, SRC_BUSIF_DALIGN, rsnd_get_dalign(mod, io));
258

259 260 261 262 263 264
	if (convert_rate)
		rsnd_adg_set_convert_clk_gen2(mod, io,
					      runtime->rate,
					      convert_rate);
	else
		rsnd_adg_set_convert_timing_gen2(mod, io);
265 266
}

267 268 269
#define rsnd_src_irq_enable(mod)  rsnd_src_irq_ctrol(mod, 1)
#define rsnd_src_irq_disable(mod) rsnd_src_irq_ctrol(mod, 0)
static void rsnd_src_irq_ctrol(struct rsnd_mod *mod, int enable)
270 271 272
{
	struct rsnd_src *src = rsnd_mod_to_src(mod);
	u32 sys_int_val, int_val, sys_int_mask;
273
	int irq = src->irq;
274 275 276 277 278 279 280 281 282
	int id = rsnd_mod_id(mod);

	sys_int_val =
	sys_int_mask = OUF_SRC(id);
	int_val = 0x3300;

	/*
	 * IRQ is not supported on non-DT
	 * see
283
	 *	rsnd_src_probe_()
284 285 286 287 288 289
	 */
	if ((irq <= 0) || !enable) {
		sys_int_val = 0;
		int_val = 0;
	}

290 291 292 293 294 295 296 297
	/*
	 * WORKAROUND
	 *
	 * ignore over flow error when rsnd_enable_sync_convert()
	 */
	if (rsnd_enable_sync_convert(src))
		sys_int_val = sys_int_val & 0xffff;

298 299 300 301 302
	rsnd_mod_write(mod, SRC_INT_ENABLE0, int_val);
	rsnd_mod_bset(mod, SCU_SYS_INT_EN0, sys_int_mask, sys_int_val);
	rsnd_mod_bset(mod, SCU_SYS_INT_EN1, sys_int_mask, sys_int_val);
}

303
static void rsnd_src_status_clear(struct rsnd_mod *mod)
304 305 306 307 308 309 310
{
	u32 val = OUF_SRC(rsnd_mod_id(mod));

	rsnd_mod_bset(mod, SCU_SYS_STATUS0, val, val);
	rsnd_mod_bset(mod, SCU_SYS_STATUS1, val, val);
}

311
static bool rsnd_src_record_error(struct rsnd_mod *mod)
312
{
313 314
	struct rsnd_src *src = rsnd_mod_to_src(mod);
	u32 val0, val1;
315 316
	bool ret = false;

317 318 319 320 321 322 323 324 325 326 327 328
	val0 = val1 = OUF_SRC(rsnd_mod_id(mod));

	/*
	 * WORKAROUND
	 *
	 * ignore over flow error when rsnd_enable_sync_convert()
	 */
	if (rsnd_enable_sync_convert(src))
		val0 = val0 & 0xffff;

	if ((rsnd_mod_read(mod, SCU_SYS_STATUS0) & val0) ||
	    (rsnd_mod_read(mod, SCU_SYS_STATUS1) & val1)) {
329 330 331 332 333 334 335 336 337
		struct rsnd_src *src = rsnd_mod_to_src(mod);

		src->err++;
		ret = true;
	}

	return ret;
}

338 339 340
static int rsnd_src_start(struct rsnd_mod *mod,
			  struct rsnd_dai_stream *io,
			  struct rsnd_priv *priv)
341
{
342 343 344 345 346 347 348 349 350 351
	struct rsnd_src *src = rsnd_mod_to_src(mod);
	u32 val;

	/*
	 * WORKAROUND
	 *
	 * Enable SRC output if you want to use sync convert together with DVC
	 */
	val = (rsnd_io_to_mod_dvc(io) && !rsnd_enable_sync_convert(src)) ?
		0x01 : 0x11;
352 353 354 355 356 357

	rsnd_mod_write(mod, SRC_CTRL, val);

	return 0;
}

358 359 360
static int rsnd_src_stop(struct rsnd_mod *mod,
			 struct rsnd_dai_stream *io,
			 struct rsnd_priv *priv)
361
{
362 363
	/*
	 * stop SRC output only
364
	 * see rsnd_src_quit
365 366
	 */
	rsnd_mod_write(mod, SRC_CTRL, 0x01);
367

368 369 370 371 372 373 374 375
	return 0;
}

static int rsnd_src_init(struct rsnd_mod *mod,
			 struct rsnd_dai_stream *io,
			 struct rsnd_priv *priv)
{
	struct rsnd_src *src = rsnd_mod_to_src(mod);
376

377 378 379 380 381 382
	rsnd_mod_power_on(mod);

	rsnd_src_soft_reset(mod);

	rsnd_src_set_convert_rate(io, mod);

383
	rsnd_src_status_clear(mod);
384 385 386 387 388 389 390 391 392

	rsnd_src_irq_enable(mod);

	src->err = 0;

	/* reset sync convert_rate */
	src->sync.val = 0;

	return 0;
393 394
}

395 396 397
static int rsnd_src_quit(struct rsnd_mod *mod,
			 struct rsnd_dai_stream *io,
			 struct rsnd_priv *priv)
398
{
399 400 401 402 403
	struct rsnd_src *src = rsnd_mod_to_src(mod);
	struct device *dev = rsnd_priv_to_dev(priv);

	rsnd_src_irq_disable(mod);

404 405 406
	/* stop both out/in */
	rsnd_mod_write(mod, SRC_CTRL, 0);

407 408 409 410 411 412 413 414 415 416 417 418
	rsnd_mod_power_off(mod);

	if (src->err)
		dev_warn(dev, "%s[%d] under/over flow err = %d\n",
			 rsnd_mod_name(mod), rsnd_mod_id(mod), src->err);

	src->convert_rate = 0;

	/* reset sync convert_rate */
	src->sync.val = 0;

	return 0;
419 420
}

421 422
static void __rsnd_src_interrupt(struct rsnd_mod *mod,
				 struct rsnd_dai_stream *io)
423
{
424
	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
425 426
	struct rsnd_src *src = rsnd_mod_to_src(mod);
	struct device *dev = rsnd_priv_to_dev(priv);
427 428

	spin_lock(&priv->lock);
429

430
	/* ignore all cases if not working */
431
	if (!rsnd_io_is_working(io))
432
		goto rsnd_src_interrupt_out;
433

434
	if (rsnd_src_record_error(mod)) {
435 436 437

		dev_dbg(dev, "%s[%d] restart\n",
			rsnd_mod_name(mod), rsnd_mod_id(mod));
438

439 440
		rsnd_src_stop(mod, io, priv);
		rsnd_src_start(mod, io, priv);
441 442 443
	}

	if (src->err > 1024) {
444
		rsnd_src_irq_disable(mod);
445 446 447

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

450
	rsnd_src_status_clear(mod);
451
rsnd_src_interrupt_out:
452

453
	spin_unlock(&priv->lock);
454 455
}

456
static irqreturn_t rsnd_src_interrupt(int irq, void *data)
457 458 459
{
	struct rsnd_mod *mod = data;

460
	rsnd_mod_interrupt(mod, __rsnd_src_interrupt);
461 462 463 464

	return IRQ_HANDLED;
}

465 466 467
static int rsnd_src_probe_(struct rsnd_mod *mod,
			   struct rsnd_dai_stream *io,
			   struct rsnd_priv *priv)
468
{
469
	struct rsnd_src *src = rsnd_mod_to_src(mod);
470
	struct device *dev = rsnd_priv_to_dev(priv);
471
	int irq = src->irq;
472 473
	int ret;

474 475 476 477
	if (irq > 0) {
		/*
		 * IRQ is not supported on non-DT
		 * see
478
		 *	rsnd_src_irq_enable()
479 480
		 */
		ret = devm_request_irq(dev, irq,
481
				       rsnd_src_interrupt,
482 483 484
				       IRQF_SHARED,
				       dev_name(dev), mod);
		if (ret)
485
			return ret;
486 487
	}

488
	src->dma = rsnd_dma_attach(io, mod, 0);
489 490
	if (IS_ERR(src->dma))
		return PTR_ERR(src->dma);
491

492 493 494
	return ret;
}

495
static int rsnd_src_pcm_new(struct rsnd_mod *mod,
496
			    struct rsnd_dai_stream *io,
497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
			    struct snd_soc_pcm_runtime *rtd)
{
	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
	struct rsnd_src *src = rsnd_mod_to_src(mod);
	int ret;

	/*
	 * enable SRC sync convert if possible
	 */

	/*
	 * SRC sync convert needs clock master
	 */
	if (!rsnd_rdai_is_clk_master(rdai))
		return 0;

	/*
	 * enable sync convert
	 */
516
	ret = rsnd_kctrl_new_s(mod, io, rtd,
517 518 519
			       rsnd_io_is_play(io) ?
			       "SRC Out Rate Switch" :
			       "SRC In Rate Switch",
520
			       rsnd_src_set_convert_rate,
521 522 523 524
			       &src->sen, 1);
	if (ret < 0)
		return ret;

525
	ret = rsnd_kctrl_new_s(mod, io, rtd,
526 527 528
			       rsnd_io_is_play(io) ?
			       "SRC Out Rate" :
			       "SRC In Rate",
529
			       rsnd_src_set_convert_rate,
530 531 532 533 534
			       &src->sync, 192000);

	return ret;
}

535
static struct rsnd_mod_ops rsnd_src_ops = {
536
	.name	= SRC_NAME,
537
	.dma_req = rsnd_src_dma_req,
538 539 540 541 542
	.probe	= rsnd_src_probe_,
	.init	= rsnd_src_init,
	.quit	= rsnd_src_quit,
	.start	= rsnd_src_start,
	.stop	= rsnd_src_stop,
543
	.hw_params = rsnd_src_hw_params,
544
	.pcm_new = rsnd_src_pcm_new,
545 546
};

547
struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id)
548
{
549
	if (WARN_ON(id < 0 || id >= rsnd_src_nr(priv)))
550
		id = 0;
551

552
	return rsnd_mod_get(rsnd_src_get(priv, id));
553 554
}

555
int rsnd_src_probe(struct rsnd_priv *priv)
556
{
557 558
	struct device_node *node;
	struct device_node *np;
559
	struct device *dev = rsnd_priv_to_dev(priv);
560
	struct rsnd_src *src;
561
	struct clk *clk;
562
	char name[RSND_SRC_NAME_SIZE];
563
	int i, nr, ret;
564

565 566 567
	/* This driver doesn't support Gen1 at this point */
	if (rsnd_is_gen1(priv))
		return 0;
568

569 570 571
	node = rsnd_src_of_node(priv);
	if (!node)
		return 0; /* not used is not error */
572

573 574 575 576 577
	nr = of_get_child_count(node);
	if (!nr) {
		ret = -EINVAL;
		goto rsnd_src_probe_done;
	}
578

579
	src	= devm_kzalloc(dev, sizeof(*src) * nr, GFP_KERNEL);
580 581 582 583
	if (!src) {
		ret = -ENOMEM;
		goto rsnd_src_probe_done;
	}
584

585 586
	priv->src_nr	= nr;
	priv->src	= src;
587

588 589 590 591
	i = 0;
	for_each_child_of_node(node, np) {
		src = rsnd_src_get(priv, i);

592 593
		snprintf(name, RSND_SRC_NAME_SIZE, "%s.%d",
			 SRC_NAME, i);
594

595 596 597 598 599
		src->irq = irq_of_parse_and_map(np, 0);
		if (!src->irq) {
			ret = -EINVAL;
			goto rsnd_src_probe_done;
		}
600

601 602 603 604 605
		clk = devm_clk_get(dev, name);
		if (IS_ERR(clk)) {
			ret = PTR_ERR(clk);
			goto rsnd_src_probe_done;
		}
606

607
		ret = rsnd_mod_init(priv, rsnd_mod_get(src),
608
				    &rsnd_src_ops, clk, RSND_MOD_SRC, i);
609
		if (ret)
610 611 612
			goto rsnd_src_probe_done;

		i++;
613
	}
614

615 616 617 618 619 620
	ret = 0;

rsnd_src_probe_done:
	of_node_put(node);

	return ret;
621
}
622

623
void rsnd_src_remove(struct rsnd_priv *priv)
624 625 626 627 628
{
	struct rsnd_src *src;
	int i;

	for_each_rsnd_src(src, priv, i) {
629
		rsnd_mod_quit(rsnd_mod_get(src));
630 631
	}
}