fsi.c 31.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * Fifo-attached Serial Interface (FSI) support for SH7724
 *
 * Copyright (C) 2009 Renesas Solutions Corp.
 * Kuninori Morimoto <morimoto.kuninori@renesas.com>
 *
 * Based on ssi.c
 * Copyright (c) 2007 Manuel Lauss <mano@roarinelk.homelinux.net>
 *
 * 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>
16
#include <linux/pm_runtime.h>
17
#include <linux/io.h>
18
#include <linux/slab.h>
19
#include <linux/module.h>
20 21 22
#include <sound/soc.h>
#include <sound/sh_fsi.h>

23 24 25 26 27 28 29 30 31 32 33 34 35
/* PortA/PortB register */
#define REG_DO_FMT	0x0000
#define REG_DOFF_CTL	0x0004
#define REG_DOFF_ST	0x0008
#define REG_DI_FMT	0x000C
#define REG_DIFF_CTL	0x0010
#define REG_DIFF_ST	0x0014
#define REG_CKG1	0x0018
#define REG_CKG2	0x001C
#define REG_DIDT	0x0020
#define REG_DODT	0x0024
#define REG_MUTE_ST	0x0028
#define REG_OUT_SEL	0x0030
36

37 38 39 40 41 42
/* master register */
#define MST_CLK_RST	0x0210
#define MST_SOFT_RST	0x0214
#define MST_FIFO_SZ	0x0218

/* core register (depend on FSI version) */
43 44
#define A_MST_CTLR	0x0180
#define B_MST_CTLR	0x01A0
45 46 47
#define CPU_INT_ST	0x01F4
#define CPU_IEMSK	0x01F8
#define CPU_IMSK	0x01FC
48 49 50 51 52 53
#define INT_ST		0x0200
#define IEMSK		0x0204
#define IMSK		0x0208

/* DO_FMT */
/* DI_FMT */
54 55 56 57 58 59 60 61
#define CR_BWS_24	(0x0 << 20) /* FSI2 */
#define CR_BWS_16	(0x1 << 20) /* FSI2 */
#define CR_BWS_20	(0x2 << 20) /* FSI2 */

#define CR_DTMD_PCM		(0x0 << 8) /* FSI2 */
#define CR_DTMD_SPDIF_PCM	(0x1 << 8) /* FSI2 */
#define CR_DTMD_SPDIF_STREAM	(0x2 << 8) /* FSI2 */

62 63 64 65 66 67
#define CR_MONO		(0x0 << 4)
#define CR_MONO_D	(0x1 << 4)
#define CR_PCM		(0x2 << 4)
#define CR_I2S		(0x3 << 4)
#define CR_TDM		(0x4 << 4)
#define CR_TDM_D	(0x5 << 4)
68 69 70 71 72 73 74 75 76

/* DOFF_CTL */
/* DIFF_CTL */
#define IRQ_HALF	0x00100000
#define FIFO_CLR	0x00000001

/* DOFF_ST */
#define ERR_OVER	0x00000010
#define ERR_UNDER	0x00000001
77
#define ST_ERR		(ERR_OVER | ERR_UNDER)
78

79 80 81
/* CKG1 */
#define ACKMD_MASK	0x00007000
#define BPFMD_MASK	0x00000700
82 83
#define DIMD		(1 << 4)
#define DOMD		(1 << 0)
84

85 86 87 88
/* A/B MST_CTLR */
#define BP	(1 << 4)	/* Fix the signal of Biphase output */
#define SE	(1 << 0)	/* Fix the master clock */

89
/* CLK_RST */
90 91
#define CRB	(1 << 4)
#define CRA	(1 << 0)
92

93 94 95 96 97 98
/* IO SHIFT / MACRO */
#define BI_SHIFT	12
#define BO_SHIFT	8
#define AI_SHIFT	4
#define AO_SHIFT	0
#define AB_IO(param, shift)	(param << shift)
99

100 101 102 103 104 105
/* SOFT_RST */
#define PBSR		(1 << 12) /* Port B Software Reset */
#define PASR		(1 <<  8) /* Port A Software Reset */
#define IR		(1 <<  4) /* Interrupt Reset */
#define FSISR		(1 <<  0) /* Software Reset */

106 107 108 109
/* OUT_SEL (FSI2) */
#define DMMD		(1 << 4) /* SPDIF output timing 0: Biphase only */
				 /*			1: Biphase and serial */

110
/* FIFO_SZ */
111
#define FIFO_SZ_MASK	0x7
112

113 114 115 116
#define FSI_RATES SNDRV_PCM_RATE_8000_96000

#define FSI_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)

117 118
typedef int (*set_rate_func)(struct device *dev, int is_porta, int rate, int enable);

119 120 121 122
/*
 * FSI driver use below type name for variable
 *
 * xxx_num	: number of data
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
 * xxx_pos	: position of data
 * xxx_capa	: capacity of data
 */

/*
 *	period/frame/sample image
 *
 * ex) PCM (2ch)
 *
 * period pos					   period pos
 *   [n]					     [n + 1]
 *   |<-------------------- period--------------------->|
 * ==|============================================ ... =|==
 *   |							|
 *   ||<-----  frame ----->|<------ frame ----->|  ...	|
 *   |+--------------------+--------------------+- ...	|
 *   ||[ sample ][ sample ]|[ sample ][ sample ]|  ...	|
 *   |+--------------------+--------------------+- ...	|
 * ==|============================================ ... =|==
 */

/*
 *	FSI FIFO image
 *
 *	|	     |
 *	|	     |
 *	| [ sample ] |
 *	| [ sample ] |
 *	| [ sample ] |
 *	| [ sample ] |
 *		--> go to codecs
154 155
 */

156 157 158
/*
 *		struct
 */
159

160
struct fsi_stream {
161 162
	struct snd_pcm_substream *substream;

163 164 165 166 167
	int fifo_sample_capa;	/* sample capacity of FSI FIFO */
	int buff_sample_capa;	/* sample capacity of ALSA buffer */
	int buff_sample_pos;	/* sample position of ALSA buffer */
	int period_samples;	/* sample number / 1 period */
	int period_pos;		/* current period position */
168 169 170

	int uerr_num;
	int oerr_num;
171 172 173 174 175 176 177 178
};

struct fsi_priv {
	void __iomem *base;
	struct fsi_master *master;

	struct fsi_stream playback;
	struct fsi_stream capture;
179

180 181 182
	u32 do_fmt;
	u32 di_fmt;

183 184
	int chan_num:16;
	int clk_master:1;
185
	int spdif:1;
186

187
	long rate;
188 189
};

190 191 192
struct fsi_core {
	int ver;

193 194 195
	u32 int_st;
	u32 iemsk;
	u32 imsk;
196 197
	u32 a_mclk;
	u32 b_mclk;
198 199
};

200 201 202 203 204
struct fsi_master {
	void __iomem *base;
	int irq;
	struct fsi_priv fsia;
	struct fsi_priv fsib;
205
	struct fsi_core *core;
206
	struct sh_fsi_platform_info *info;
207
	spinlock_t lock;
208 209
};

210 211 212
/*
 *		basic read write function
 */
213

214
static void __fsi_reg_write(u32 __iomem *reg, u32 data)
215 216 217 218
{
	/* valid data area is 24bit */
	data &= 0x00ffffff;

219
	__raw_writel(data, reg);
220 221
}

222
static u32 __fsi_reg_read(u32 __iomem *reg)
223
{
224
	return __raw_readl(reg);
225 226
}

227
static void __fsi_reg_mask_set(u32 __iomem *reg, u32 mask, u32 data)
228 229 230 231 232 233
{
	u32 val = __fsi_reg_read(reg);

	val &= ~mask;
	val |= data & mask;

234
	__fsi_reg_write(reg, val);
235 236
}

237
#define fsi_reg_write(p, r, d)\
238
	__fsi_reg_write((p->base + REG_##r), d)
239

240
#define fsi_reg_read(p, r)\
241
	__fsi_reg_read((p->base + REG_##r))
242

243
#define fsi_reg_mask_set(p, r, m, d)\
244
	__fsi_reg_mask_set((p->base + REG_##r), m, d)
245

246 247 248
#define fsi_master_read(p, r) _fsi_master_read(p, MST_##r)
#define fsi_core_read(p, r)   _fsi_master_read(p, p->core->r)
static u32 _fsi_master_read(struct fsi_master *master, u32 reg)
249
{
250 251 252 253
	u32 ret;
	unsigned long flags;

	spin_lock_irqsave(&master->lock, flags);
254
	ret = __fsi_reg_read(master->base + reg);
255 256 257
	spin_unlock_irqrestore(&master->lock, flags);

	return ret;
258 259
}

260 261 262
#define fsi_master_mask_set(p, r, m, d) _fsi_master_mask_set(p, MST_##r, m, d)
#define fsi_core_mask_set(p, r, m, d)  _fsi_master_mask_set(p, p->core->r, m, d)
static void _fsi_master_mask_set(struct fsi_master *master,
263
			       u32 reg, u32 mask, u32 data)
264
{
265 266 267
	unsigned long flags;

	spin_lock_irqsave(&master->lock, flags);
268
	__fsi_reg_mask_set(master->base + reg, mask, data);
269
	spin_unlock_irqrestore(&master->lock, flags);
270 271
}

272 273 274
/*
 *		basic function
 */
275

276
static struct fsi_master *fsi_get_master(struct fsi_priv *fsi)
277
{
278
	return fsi->master;
279 280
}

281 282 283 284 285
static int fsi_is_clk_master(struct fsi_priv *fsi)
{
	return fsi->clk_master;
}

286 287
static int fsi_is_port_a(struct fsi_priv *fsi)
{
288 289
	return fsi->master->base == fsi->base;
}
290

291 292 293 294 295
static int fsi_is_spdif(struct fsi_priv *fsi)
{
	return fsi->spdif;
}

296
static struct snd_soc_dai *fsi_get_dai(struct snd_pcm_substream *substream)
297 298
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
299

300
	return  rtd->cpu_dai;
301 302
}

303
static struct fsi_priv *fsi_get_priv_frm_dai(struct snd_soc_dai *dai)
304
{
305
	struct fsi_master *master = snd_soc_dai_get_drvdata(dai);
306

307 308 309 310
	if (dai->id == 0)
		return &master->fsia;
	else
		return &master->fsib;
311 312
}

313 314 315 316 317
static struct fsi_priv *fsi_get_priv(struct snd_pcm_substream *substream)
{
	return fsi_get_priv_frm_dai(fsi_get_dai(substream));
}

318 319 320 321 322 323 324 325
static set_rate_func fsi_get_info_set_rate(struct fsi_master *master)
{
	if (!master->info)
		return NULL;

	return master->info->set_rate;
}

326 327 328
static u32 fsi_get_info_flags(struct fsi_priv *fsi)
{
	int is_porta = fsi_is_port_a(fsi);
329
	struct fsi_master *master = fsi_get_master(fsi);
330

331 332 333
	if (!master->info)
		return 0;

334 335 336 337
	return is_porta ? master->info->porta_flags :
		master->info->portb_flags;
}

338 339 340 341 342
static inline int fsi_stream_is_play(int stream)
{
	return stream == SNDRV_PCM_STREAM_PLAYBACK;
}

K
Kuninori Morimoto 已提交
343 344
static inline int fsi_is_play(struct snd_pcm_substream *substream)
{
345 346 347 348 349 350 351
	return fsi_stream_is_play(substream->stream);
}

static inline struct fsi_stream *fsi_get_stream(struct fsi_priv *fsi,
						int is_play)
{
	return is_play ? &fsi->playback : &fsi->capture;
K
Kuninori Morimoto 已提交
352 353
}

354
static u32 fsi_get_port_shift(struct fsi_priv *fsi, int is_play)
355 356
{
	int is_porta = fsi_is_port_a(fsi);
357
	u32 shift;
358 359

	if (is_porta)
360
		shift = is_play ? AO_SHIFT : AI_SHIFT;
361
	else
362
		shift = is_play ? BO_SHIFT : BI_SHIFT;
363

364
	return shift;
365 366
}

367 368 369 370 371 372 373 374 375 376
static int fsi_frame2sample(struct fsi_priv *fsi, int frames)
{
	return frames * fsi->chan_num;
}

static int fsi_sample2frame(struct fsi_priv *fsi, int samples)
{
	return samples / fsi->chan_num;
}

377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
static int fsi_stream_is_working(struct fsi_priv *fsi,
				  int is_play)
{
	struct fsi_stream *io = fsi_get_stream(fsi, is_play);
	struct fsi_master *master = fsi_get_master(fsi);
	unsigned long flags;
	int ret;

	spin_lock_irqsave(&master->lock, flags);
	ret = !!io->substream;
	spin_unlock_irqrestore(&master->lock, flags);

	return ret;
}

392
static void fsi_stream_push(struct fsi_priv *fsi,
393
			    int is_play,
394
			    struct snd_pcm_substream *substream)
395
{
396
	struct fsi_stream *io = fsi_get_stream(fsi, is_play);
397
	struct snd_pcm_runtime *runtime = substream->runtime;
398 399
	struct fsi_master *master = fsi_get_master(fsi);
	unsigned long flags;
400

401
	spin_lock_irqsave(&master->lock, flags);
402
	io->substream	= substream;
403 404 405 406
	io->buff_sample_capa	= fsi_frame2sample(fsi, runtime->buffer_size);
	io->buff_sample_pos	= 0;
	io->period_samples	= fsi_frame2sample(fsi, runtime->period_size);
	io->period_pos		= 0;
407 408
	io->oerr_num	= -1; /* ignore 1st err */
	io->uerr_num	= -1; /* ignore 1st err */
409
	spin_unlock_irqrestore(&master->lock, flags);
410 411
}

412
static void fsi_stream_pop(struct fsi_priv *fsi, int is_play)
413
{
414
	struct fsi_stream *io = fsi_get_stream(fsi, is_play);
415
	struct snd_soc_dai *dai = fsi_get_dai(io->substream);
416 417
	struct fsi_master *master = fsi_get_master(fsi);
	unsigned long flags;
418

419
	spin_lock_irqsave(&master->lock, flags);
420 421 422 423 424 425

	if (io->oerr_num > 0)
		dev_err(dai->dev, "over_run = %d\n", io->oerr_num);

	if (io->uerr_num > 0)
		dev_err(dai->dev, "under_run = %d\n", io->uerr_num);
426 427

	io->substream	= NULL;
428 429 430 431
	io->buff_sample_capa	= 0;
	io->buff_sample_pos	= 0;
	io->period_samples	= 0;
	io->period_pos		= 0;
432 433
	io->oerr_num	= 0;
	io->uerr_num	= 0;
434
	spin_unlock_irqrestore(&master->lock, flags);
435 436
}

437
static int fsi_get_current_fifo_samples(struct fsi_priv *fsi, int is_play)
438 439
{
	u32 status;
440
	int frames;
441

442 443 444 445
	status = is_play ?
		fsi_reg_read(fsi, DOFF_ST) :
		fsi_reg_read(fsi, DIFF_ST);

446
	frames = 0x1ff & (status >> 8);
447

448
	return fsi_frame2sample(fsi, frames);
449 450
}

451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471
static void fsi_count_fifo_err(struct fsi_priv *fsi)
{
	u32 ostatus = fsi_reg_read(fsi, DOFF_ST);
	u32 istatus = fsi_reg_read(fsi, DIFF_ST);

	if (ostatus & ERR_OVER)
		fsi->playback.oerr_num++;

	if (ostatus & ERR_UNDER)
		fsi->playback.uerr_num++;

	if (istatus & ERR_OVER)
		fsi->capture.oerr_num++;

	if (istatus & ERR_UNDER)
		fsi->capture.uerr_num++;

	fsi_reg_write(fsi, DOFF_ST, 0);
	fsi_reg_write(fsi, DIFF_ST, 0);
}

472 473 474 475
/*
 *		dma function
 */

476
static u8 *fsi_dma_get_area(struct fsi_priv *fsi, int stream)
477
{
478 479
	int is_play = fsi_stream_is_play(stream);
	struct fsi_stream *io = fsi_get_stream(fsi, is_play);
480
	struct snd_pcm_runtime *runtime = io->substream->runtime;
481

482 483
	return runtime->dma_area +
		samples_to_bytes(runtime, io->buff_sample_pos);
484 485
}

486
static void fsi_dma_soft_push16(struct fsi_priv *fsi, int num)
487 488 489 490
{
	u16 *start;
	int i;

491
	start  = (u16 *)fsi_dma_get_area(fsi, SNDRV_PCM_STREAM_PLAYBACK);
492

493
	for (i = 0; i < num; i++)
494 495 496
		fsi_reg_write(fsi, DODT, ((u32)*(start + i) << 8));
}

497
static void fsi_dma_soft_pop16(struct fsi_priv *fsi, int num)
498 499 500 501
{
	u16 *start;
	int i;

502 503
	start  = (u16 *)fsi_dma_get_area(fsi, SNDRV_PCM_STREAM_CAPTURE);

504

505
	for (i = 0; i < num; i++)
506 507 508
		*(start + i) = (u16)(fsi_reg_read(fsi, DIDT) >> 8);
}

509
static void fsi_dma_soft_push32(struct fsi_priv *fsi, int num)
510 511 512 513
{
	u32 *start;
	int i;

514 515
	start  = (u32 *)fsi_dma_get_area(fsi, SNDRV_PCM_STREAM_PLAYBACK);

516

517
	for (i = 0; i < num; i++)
518 519 520
		fsi_reg_write(fsi, DODT, *(start + i));
}

521
static void fsi_dma_soft_pop32(struct fsi_priv *fsi, int num)
522 523 524 525
{
	u32 *start;
	int i;

526
	start  = (u32 *)fsi_dma_get_area(fsi, SNDRV_PCM_STREAM_CAPTURE);
527

528
	for (i = 0; i < num; i++)
529 530 531
		*(start + i) = fsi_reg_read(fsi, DIDT);
}

532 533 534
/*
 *		irq function
 */
535 536 537

static void fsi_irq_enable(struct fsi_priv *fsi, int is_play)
{
538
	u32 data = AB_IO(1, fsi_get_port_shift(fsi, is_play));
539
	struct fsi_master *master = fsi_get_master(fsi);
540

541 542
	fsi_core_mask_set(master, imsk,  data, data);
	fsi_core_mask_set(master, iemsk, data, data);
543 544 545 546
}

static void fsi_irq_disable(struct fsi_priv *fsi, int is_play)
{
547
	u32 data = AB_IO(1, fsi_get_port_shift(fsi, is_play));
548
	struct fsi_master *master = fsi_get_master(fsi);
549

550 551
	fsi_core_mask_set(master, imsk,  data, 0);
	fsi_core_mask_set(master, iemsk, data, 0);
552 553
}

554 555
static u32 fsi_irq_get_status(struct fsi_master *master)
{
556
	return fsi_core_read(master, int_st);
557 558 559 560 561 562 563
}

static void fsi_irq_clear_status(struct fsi_priv *fsi)
{
	u32 data = 0;
	struct fsi_master *master = fsi_get_master(fsi);

564 565
	data |= AB_IO(1, fsi_get_port_shift(fsi, 0));
	data |= AB_IO(1, fsi_get_port_shift(fsi, 1));
566 567

	/* clear interrupt factor */
568
	fsi_core_mask_set(master, int_st, data, 0);
569 570
}

571 572 573 574 575
/*
 *		SPDIF master clock function
 *
 * These functions are used later FSI2
 */
576 577 578
static void fsi_spdif_clk_ctrl(struct fsi_priv *fsi, int enable)
{
	struct fsi_master *master = fsi_get_master(fsi);
579
	u32 mask, val;
580 581 582 583 584 585

	if (master->core->ver < 2) {
		pr_err("fsi: register access err (%s)\n", __func__);
		return;
	}

586 587 588 589
	mask = BP | SE;
	val = enable ? mask : 0;

	fsi_is_port_a(fsi) ?
590 591
		fsi_core_mask_set(master, a_mclk, mask, val) :
		fsi_core_mask_set(master, b_mclk, mask, val);
592 593
}

594
/*
595
 *		clock function
596
 */
597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 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 668 669 670 671
static int fsi_set_master_clk(struct device *dev, struct fsi_priv *fsi,
			      long rate, int enable)
{
	struct fsi_master *master = fsi_get_master(fsi);
	set_rate_func set_rate = fsi_get_info_set_rate(master);
	int fsi_ver = master->core->ver;
	int ret;

	ret = set_rate(dev, fsi_is_port_a(fsi), rate, enable);
	if (ret < 0) /* error */
		return ret;

	if (!enable)
		return 0;

	if (ret > 0) {
		u32 data = 0;

		switch (ret & SH_FSI_ACKMD_MASK) {
		default:
			/* FALL THROUGH */
		case SH_FSI_ACKMD_512:
			data |= (0x0 << 12);
			break;
		case SH_FSI_ACKMD_256:
			data |= (0x1 << 12);
			break;
		case SH_FSI_ACKMD_128:
			data |= (0x2 << 12);
			break;
		case SH_FSI_ACKMD_64:
			data |= (0x3 << 12);
			break;
		case SH_FSI_ACKMD_32:
			if (fsi_ver < 2)
				dev_err(dev, "unsupported ACKMD\n");
			else
				data |= (0x4 << 12);
			break;
		}

		switch (ret & SH_FSI_BPFMD_MASK) {
		default:
			/* FALL THROUGH */
		case SH_FSI_BPFMD_32:
			data |= (0x0 << 8);
			break;
		case SH_FSI_BPFMD_64:
			data |= (0x1 << 8);
			break;
		case SH_FSI_BPFMD_128:
			data |= (0x2 << 8);
			break;
		case SH_FSI_BPFMD_256:
			data |= (0x3 << 8);
			break;
		case SH_FSI_BPFMD_512:
			data |= (0x4 << 8);
			break;
		case SH_FSI_BPFMD_16:
			if (fsi_ver < 2)
				dev_err(dev, "unsupported ACKMD\n");
			else
				data |= (0x7 << 8);
			break;
		}

		fsi_reg_mask_set(fsi, CKG1, (ACKMD_MASK | BPFMD_MASK) , data);
		udelay(10);
		ret = 0;
	}

	return ret;
}

672 673 674
#define fsi_port_start(f, i)	__fsi_port_clk_ctrl(f, i, 1)
#define fsi_port_stop(f, i)	__fsi_port_clk_ctrl(f, i, 0)
static void __fsi_port_clk_ctrl(struct fsi_priv *fsi, int is_play, int enable)
675
{
676
	struct fsi_master *master = fsi_get_master(fsi);
677
	u32 clk  = fsi_is_port_a(fsi) ? CRA  : CRB;
678

679 680 681 682 683
	if (enable)
		fsi_irq_enable(fsi, is_play);
	else
		fsi_irq_disable(fsi, is_play);

684
	if (fsi_is_clk_master(fsi))
685
		fsi_master_mask_set(master, CLK_RST, clk, (enable) ? clk : 0);
686 687
}

688 689 690
/*
 *		ctrl function
 */
691 692
static void fsi_fifo_init(struct fsi_priv *fsi,
			  int is_play,
693
			  struct device *dev)
694
{
695
	struct fsi_master *master = fsi_get_master(fsi);
696
	struct fsi_stream *io = fsi_get_stream(fsi, is_play);
697
	u32 shift, i;
698
	int frame_capa;
699

700 701
	/* get on-chip RAM capacity */
	shift = fsi_master_read(master, FIFO_SZ);
702 703
	shift >>= fsi_get_port_shift(fsi, is_play);
	shift &= FIFO_SZ_MASK;
704
	frame_capa = 256 << shift;
705
	dev_dbg(dev, "fifo = %d words\n", frame_capa);
706

707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
	/*
	 * The maximum number of sample data varies depending
	 * on the number of channels selected for the format.
	 *
	 * FIFOs are used in 4-channel units in 3-channel mode
	 * and in 8-channel units in 5- to 7-channel mode
	 * meaning that more FIFOs than the required size of DPRAM
	 * are used.
	 *
	 * ex) if 256 words of DP-RAM is connected
	 * 1 channel:  256 (256 x 1 = 256)
	 * 2 channels: 128 (128 x 2 = 256)
	 * 3 channels:  64 ( 64 x 3 = 192)
	 * 4 channels:  64 ( 64 x 4 = 256)
	 * 5 channels:  32 ( 32 x 5 = 160)
	 * 6 channels:  32 ( 32 x 6 = 192)
	 * 7 channels:  32 ( 32 x 7 = 224)
	 * 8 channels:  32 ( 32 x 8 = 256)
	 */
726
	for (i = 1; i < fsi->chan_num; i <<= 1)
727
		frame_capa >>= 1;
728
	dev_dbg(dev, "%d channel %d store\n",
729 730 731
		fsi->chan_num, frame_capa);

	io->fifo_sample_capa = fsi_frame2sample(fsi, frame_capa);
732

733 734 735 736 737 738 739 740 741 742 743
	/*
	 * set interrupt generation factor
	 * clear FIFO
	 */
	if (is_play) {
		fsi_reg_write(fsi,	DOFF_CTL, IRQ_HALF);
		fsi_reg_mask_set(fsi,	DOFF_CTL, FIFO_CLR, FIFO_CLR);
	} else {
		fsi_reg_write(fsi,	DIFF_CTL, IRQ_HALF);
		fsi_reg_mask_set(fsi,	DIFF_CTL, FIFO_CLR, FIFO_CLR);
	}
744 745
}

746
static int fsi_fifo_data_ctrl(struct fsi_priv *fsi, int stream)
747 748 749
{
	struct snd_pcm_runtime *runtime;
	struct snd_pcm_substream *substream = NULL;
750 751
	int is_play = fsi_stream_is_play(stream);
	struct fsi_stream *io = fsi_get_stream(fsi, is_play);
752 753 754 755
	int sample_residues;
	int sample_width;
	int samples;
	int samples_max;
756
	int over_period;
757
	void (*fn)(struct fsi_priv *fsi, int size);
758 759

	if (!fsi			||
760 761
	    !io->substream		||
	    !io->substream->runtime)
762 763
		return -EINVAL;

764
	over_period	= 0;
765
	substream	= io->substream;
766
	runtime		= substream->runtime;
767 768 769 770

	/* FSI FIFO has limit.
	 * So, this driver can not send periods data at a time
	 */
771 772
	if (io->buff_sample_pos >=
	    io->period_samples * (io->period_pos + 1)) {
773

774
		over_period = 1;
775
		io->period_pos = (io->period_pos + 1) % runtime->periods;
776

777 778
		if (0 == io->period_pos)
			io->buff_sample_pos = 0;
779 780
	}

781 782
	/* get 1 sample data width */
	sample_width = samples_to_bytes(runtime, 1);
783

784 785
	/* get number of residue samples */
	sample_residues = io->buff_sample_capa - io->buff_sample_pos;
786 787 788 789 790

	if (is_play) {
		/*
		 * for play-back
		 *
791 792
		 * samples_max	: number of FSI fifo free samples space
		 * samples	: number of ALSA residue samples
793
		 */
794 795
		samples_max  = io->fifo_sample_capa;
		samples_max -= fsi_get_current_fifo_samples(fsi, is_play);
796

797
		samples = sample_residues;
798

799
		switch (sample_width) {
800 801 802 803 804 805 806 807 808 809 810 811 812
		case 2:
			fn = fsi_dma_soft_push16;
			break;
		case 4:
			fn = fsi_dma_soft_push32;
			break;
		default:
			return -EINVAL;
		}
	} else {
		/*
		 * for capture
		 *
813 814
		 * samples_max	: number of ALSA free samples space
		 * samples	: number of samples in FSI fifo
815
		 */
816 817
		samples_max = sample_residues;
		samples     = fsi_get_current_fifo_samples(fsi, is_play);
818

819
		switch (sample_width) {
820 821 822 823 824 825 826 827 828 829
		case 2:
			fn = fsi_dma_soft_pop16;
			break;
		case 4:
			fn = fsi_dma_soft_pop32;
			break;
		default:
			return -EINVAL;
		}
	}
830

831
	samples = min(samples, samples_max);
832

833
	fn(fsi, samples);
834

835 836
	/* update buff_sample_pos */
	io->buff_sample_pos += samples;
837

838
	if (over_period)
839 840
		snd_pcm_period_elapsed(substream);

841
	return 0;
842 843
}

844
static int fsi_data_pop(struct fsi_priv *fsi)
845
{
846
	return fsi_fifo_data_ctrl(fsi, SNDRV_PCM_STREAM_CAPTURE);
847
}
848

849
static int fsi_data_push(struct fsi_priv *fsi)
850
{
851
	return fsi_fifo_data_ctrl(fsi, SNDRV_PCM_STREAM_PLAYBACK);
852 853
}

854 855
static irqreturn_t fsi_interrupt(int irq, void *data)
{
856
	struct fsi_master *master = data;
857
	u32 int_st = fsi_irq_get_status(master);
858 859

	/* clear irq status */
860 861
	fsi_master_mask_set(master, SOFT_RST, IR, 0);
	fsi_master_mask_set(master, SOFT_RST, IR, IR);
862

863
	if (int_st & AB_IO(1, AO_SHIFT))
864
		fsi_data_push(&master->fsia);
865
	if (int_st & AB_IO(1, BO_SHIFT))
866
		fsi_data_push(&master->fsib);
867
	if (int_st & AB_IO(1, AI_SHIFT))
868
		fsi_data_pop(&master->fsia);
869
	if (int_st & AB_IO(1, BI_SHIFT))
870 871 872 873
		fsi_data_pop(&master->fsib);

	fsi_count_fifo_err(&master->fsia);
	fsi_count_fifo_err(&master->fsib);
874

875 876
	fsi_irq_clear_status(&master->fsia);
	fsi_irq_clear_status(&master->fsib);
877 878 879 880

	return IRQ_HANDLED;
}

881 882 883
/*
 *		dai ops
 */
884

885 886 887
static int fsi_hw_startup(struct fsi_priv *fsi,
			  int is_play,
			  struct device *dev)
888
{
889
	u32 flags = fsi_get_info_flags(fsi);
890
	u32 data = 0;
891

892
	pm_runtime_get_sync(dev);
893

894 895 896 897 898
	/* clock setting */
	if (fsi_is_clk_master(fsi))
		data = DIMD | DOMD;

	fsi_reg_mask_set(fsi, CKG1, (DIMD | DOMD), data);
899 900 901

	/* clock inversion (CKG2) */
	data = 0;
902 903 904 905 906 907 908 909 910
	if (SH_FSI_LRM_INV & flags)
		data |= 1 << 12;
	if (SH_FSI_BRM_INV & flags)
		data |= 1 << 8;
	if (SH_FSI_LRS_INV & flags)
		data |= 1 << 4;
	if (SH_FSI_BRS_INV & flags)
		data |= 1 << 0;

911 912
	fsi_reg_write(fsi, CKG2, data);

913 914 915 916 917 918 919 920 921 922
	/* set format */
	fsi_reg_write(fsi, DO_FMT, fsi->do_fmt);
	fsi_reg_write(fsi, DI_FMT, fsi->di_fmt);

	/* spdif ? */
	if (fsi_is_spdif(fsi)) {
		fsi_spdif_clk_ctrl(fsi, 1);
		fsi_reg_mask_set(fsi, OUT_SEL, DMMD, DMMD);
	}

923 924 925 926 927
	/* irq clear */
	fsi_irq_disable(fsi, is_play);
	fsi_irq_clear_status(fsi);

	/* fifo init */
928
	fsi_fifo_init(fsi, is_play, dev);
929

930
	return 0;
931 932
}

933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951
static void fsi_hw_shutdown(struct fsi_priv *fsi,
			    int is_play,
			    struct device *dev)
{
	if (fsi_is_clk_master(fsi))
		fsi_set_master_clk(dev, fsi, fsi->rate, 0);

	pm_runtime_put_sync(dev);
}

static int fsi_dai_startup(struct snd_pcm_substream *substream,
			   struct snd_soc_dai *dai)
{
	struct fsi_priv *fsi = fsi_get_priv(substream);
	int is_play = fsi_is_play(substream);

	return fsi_hw_startup(fsi, is_play, dai->dev);
}

952 953 954
static void fsi_dai_shutdown(struct snd_pcm_substream *substream,
			     struct snd_soc_dai *dai)
{
955
	struct fsi_priv *fsi = fsi_get_priv(substream);
956
	int is_play = fsi_is_play(substream);
957

958
	fsi_hw_shutdown(fsi, is_play, dai->dev);
959
	fsi->rate = 0;
960 961 962 963 964
}

static int fsi_dai_trigger(struct snd_pcm_substream *substream, int cmd,
			   struct snd_soc_dai *dai)
{
965
	struct fsi_priv *fsi = fsi_get_priv(substream);
K
Kuninori Morimoto 已提交
966
	int is_play = fsi_is_play(substream);
967 968 969 970
	int ret = 0;

	switch (cmd) {
	case SNDRV_PCM_TRIGGER_START:
971
		fsi_stream_push(fsi, is_play, substream);
972
		ret = is_play ? fsi_data_push(fsi) : fsi_data_pop(fsi);
973
		fsi_port_start(fsi, is_play);
974 975
		break;
	case SNDRV_PCM_TRIGGER_STOP:
976
		fsi_port_stop(fsi, is_play);
977
		fsi_stream_pop(fsi, is_play);
978 979 980 981 982 983
		break;
	}

	return ret;
}

984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000
static int fsi_set_fmt_dai(struct fsi_priv *fsi, unsigned int fmt)
{
	u32 data = 0;

	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
	case SND_SOC_DAIFMT_I2S:
		data = CR_I2S;
		fsi->chan_num = 2;
		break;
	case SND_SOC_DAIFMT_LEFT_J:
		data = CR_PCM;
		fsi->chan_num = 2;
		break;
	default:
		return -EINVAL;
	}

1001 1002
	fsi->do_fmt = data;
	fsi->di_fmt = data;
1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016

	return 0;
}

static int fsi_set_fmt_spdif(struct fsi_priv *fsi)
{
	struct fsi_master *master = fsi_get_master(fsi);
	u32 data = 0;

	if (master->core->ver < 2)
		return -EINVAL;

	data = CR_BWS_16 | CR_DTMD_SPDIF_PCM | CR_PCM;
	fsi->chan_num = 2;
1017
	fsi->spdif = 1;
1018

1019 1020
	fsi->do_fmt = data;
	fsi->di_fmt = data;
1021 1022 1023 1024

	return 0;
}

1025 1026 1027
static int fsi_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
{
	struct fsi_priv *fsi = fsi_get_priv_frm_dai(dai);
1028 1029
	struct fsi_master *master = fsi_get_master(fsi);
	set_rate_func set_rate = fsi_get_info_set_rate(master);
1030
	u32 flags = fsi_get_info_flags(fsi);
1031 1032 1033 1034 1035
	int ret;

	/* set master/slave audio interface */
	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
	case SND_SOC_DAIFMT_CBM_CFM:
1036
		fsi->clk_master = 1;
1037 1038 1039 1040
		break;
	case SND_SOC_DAIFMT_CBS_CFS:
		break;
	default:
1041
		return -EINVAL;
1042
	}
1043 1044 1045

	if (fsi_is_clk_master(fsi) && !set_rate) {
		dev_err(dai->dev, "platform doesn't have set_rate\n");
1046
		return -EINVAL;
1047 1048
	}

1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059
	/* set format */
	switch (flags & SH_FSI_FMT_MASK) {
	case SH_FSI_FMT_DAI:
		ret = fsi_set_fmt_dai(fsi, fmt & SND_SOC_DAIFMT_FORMAT_MASK);
		break;
	case SH_FSI_FMT_SPDIF:
		ret = fsi_set_fmt_spdif(fsi);
		break;
	default:
		ret = -EINVAL;
	}
1060 1061 1062 1063

	return ret;
}

1064 1065 1066 1067 1068
static int fsi_dai_hw_params(struct snd_pcm_substream *substream,
			     struct snd_pcm_hw_params *params,
			     struct snd_soc_dai *dai)
{
	struct fsi_priv *fsi = fsi_get_priv(substream);
1069
	long rate = params_rate(params);
1070 1071
	int ret;

1072
	if (!fsi_is_clk_master(fsi))
1073 1074
		return 0;

1075 1076
	ret = fsi_set_master_clk(dai->dev, fsi, rate, 1);
	if (ret < 0)
1077
		return ret;
1078

1079
	fsi->rate = rate;
1080 1081 1082 1083

	return ret;
}

1084 1085 1086 1087
static struct snd_soc_dai_ops fsi_dai_ops = {
	.startup	= fsi_dai_startup,
	.shutdown	= fsi_dai_shutdown,
	.trigger	= fsi_dai_trigger,
1088
	.set_fmt	= fsi_dai_set_fmt,
1089
	.hw_params	= fsi_dai_hw_params,
1090 1091
};

1092 1093 1094
/*
 *		pcm ops
 */
1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141

static struct snd_pcm_hardware fsi_pcm_hardware = {
	.info =		SNDRV_PCM_INFO_INTERLEAVED	|
			SNDRV_PCM_INFO_MMAP		|
			SNDRV_PCM_INFO_MMAP_VALID	|
			SNDRV_PCM_INFO_PAUSE,
	.formats		= FSI_FMTS,
	.rates			= FSI_RATES,
	.rate_min		= 8000,
	.rate_max		= 192000,
	.channels_min		= 1,
	.channels_max		= 2,
	.buffer_bytes_max	= 64 * 1024,
	.period_bytes_min	= 32,
	.period_bytes_max	= 8192,
	.periods_min		= 1,
	.periods_max		= 32,
	.fifo_size		= 256,
};

static int fsi_pcm_open(struct snd_pcm_substream *substream)
{
	struct snd_pcm_runtime *runtime = substream->runtime;
	int ret = 0;

	snd_soc_set_runtime_hwparams(substream, &fsi_pcm_hardware);

	ret = snd_pcm_hw_constraint_integer(runtime,
					    SNDRV_PCM_HW_PARAM_PERIODS);

	return ret;
}

static int fsi_hw_params(struct snd_pcm_substream *substream,
			 struct snd_pcm_hw_params *hw_params)
{
	return snd_pcm_lib_malloc_pages(substream,
					params_buffer_bytes(hw_params));
}

static int fsi_hw_free(struct snd_pcm_substream *substream)
{
	return snd_pcm_lib_free_pages(substream);
}

static snd_pcm_uframes_t fsi_pointer(struct snd_pcm_substream *substream)
{
1142
	struct fsi_priv *fsi = fsi_get_priv(substream);
1143
	struct fsi_stream *io = fsi_get_stream(fsi, fsi_is_play(substream));
1144
	int samples_pos = io->buff_sample_pos - 1;
1145

1146 1147
	if (samples_pos < 0)
		samples_pos = 0;
1148

1149
	return fsi_sample2frame(fsi, samples_pos);
1150 1151 1152 1153 1154 1155 1156 1157 1158 1159
}

static struct snd_pcm_ops fsi_pcm_ops = {
	.open		= fsi_pcm_open,
	.ioctl		= snd_pcm_lib_ioctl,
	.hw_params	= fsi_hw_params,
	.hw_free	= fsi_hw_free,
	.pointer	= fsi_pointer,
};

1160 1161 1162
/*
 *		snd_soc_platform
 */
1163 1164 1165 1166 1167 1168 1169 1170 1171

#define PREALLOC_BUFFER		(32 * 1024)
#define PREALLOC_BUFFER_MAX	(32 * 1024)

static void fsi_pcm_free(struct snd_pcm *pcm)
{
	snd_pcm_lib_preallocate_free_for_all(pcm);
}

1172
static int fsi_pcm_new(struct snd_soc_pcm_runtime *rtd)
1173
{
1174 1175
	struct snd_pcm *pcm = rtd->pcm;

1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186
	/*
	 * dont use SNDRV_DMA_TYPE_DEV, since it will oops the SH kernel
	 * in MMAP mode (i.e. aplay -M)
	 */
	return snd_pcm_lib_preallocate_pages_for_all(
		pcm,
		SNDRV_DMA_TYPE_CONTINUOUS,
		snd_dma_continuous_data(GFP_KERNEL),
		PREALLOC_BUFFER, PREALLOC_BUFFER_MAX);
}

1187 1188 1189
/*
 *		alsa struct
 */
1190

1191
static struct snd_soc_dai_driver fsi_soc_dai[] = {
1192
	{
1193
		.name			= "fsia-dai",
1194 1195 1196 1197 1198 1199
		.playback = {
			.rates		= FSI_RATES,
			.formats	= FSI_FMTS,
			.channels_min	= 1,
			.channels_max	= 8,
		},
1200 1201 1202 1203 1204 1205
		.capture = {
			.rates		= FSI_RATES,
			.formats	= FSI_FMTS,
			.channels_min	= 1,
			.channels_max	= 8,
		},
1206 1207 1208
		.ops = &fsi_dai_ops,
	},
	{
1209
		.name			= "fsib-dai",
1210 1211 1212 1213 1214 1215
		.playback = {
			.rates		= FSI_RATES,
			.formats	= FSI_FMTS,
			.channels_min	= 1,
			.channels_max	= 8,
		},
1216 1217 1218 1219 1220 1221
		.capture = {
			.rates		= FSI_RATES,
			.formats	= FSI_FMTS,
			.channels_min	= 1,
			.channels_max	= 8,
		},
1222 1223 1224 1225
		.ops = &fsi_dai_ops,
	},
};

1226 1227
static struct snd_soc_platform_driver fsi_soc_platform = {
	.ops		= &fsi_pcm_ops,
1228 1229 1230 1231
	.pcm_new	= fsi_pcm_new,
	.pcm_free	= fsi_pcm_free,
};

1232 1233 1234
/*
 *		platform function
 */
1235 1236 1237

static int fsi_probe(struct platform_device *pdev)
{
1238
	struct fsi_master *master;
1239
	const struct platform_device_id	*id_entry;
1240 1241 1242 1243
	struct resource *res;
	unsigned int irq;
	int ret;

1244 1245 1246 1247 1248 1249
	id_entry = pdev->id_entry;
	if (!id_entry) {
		dev_err(&pdev->dev, "unknown fsi device\n");
		return -ENODEV;
	}

1250 1251
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	irq = platform_get_irq(pdev, 0);
1252
	if (!res || (int)irq <= 0) {
1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271
		dev_err(&pdev->dev, "Not enough FSI platform resources.\n");
		ret = -ENODEV;
		goto exit;
	}

	master = kzalloc(sizeof(*master), GFP_KERNEL);
	if (!master) {
		dev_err(&pdev->dev, "Could not allocate master\n");
		ret = -ENOMEM;
		goto exit;
	}

	master->base = ioremap_nocache(res->start, resource_size(res));
	if (!master->base) {
		ret = -ENXIO;
		dev_err(&pdev->dev, "Unable to ioremap FSI registers.\n");
		goto exit_kfree;
	}

1272
	/* master setting */
1273 1274
	master->irq		= irq;
	master->info		= pdev->dev.platform_data;
1275 1276 1277 1278
	master->core		= (struct fsi_core *)id_entry->driver_data;
	spin_lock_init(&master->lock);

	/* FSI A setting */
1279
	master->fsia.base	= master->base;
1280
	master->fsia.master	= master;
1281 1282

	/* FSI B setting */
1283
	master->fsib.base	= master->base + 0x40;
1284
	master->fsib.master	= master;
1285

1286
	pm_runtime_enable(&pdev->dev);
1287
	dev_set_drvdata(&pdev->dev, master);
1288

Y
Yong Zhang 已提交
1289
	ret = request_irq(irq, &fsi_interrupt, 0,
1290
			  id_entry->name, master);
1291 1292
	if (ret) {
		dev_err(&pdev->dev, "irq request err\n");
1293
		goto exit_iounmap;
1294 1295
	}

1296
	ret = snd_soc_register_platform(&pdev->dev, &fsi_soc_platform);
1297 1298 1299 1300 1301
	if (ret < 0) {
		dev_err(&pdev->dev, "cannot snd soc register\n");
		goto exit_free_irq;
	}

1302 1303 1304 1305 1306 1307
	ret = snd_soc_register_dais(&pdev->dev, fsi_soc_dai,
				    ARRAY_SIZE(fsi_soc_dai));
	if (ret < 0) {
		dev_err(&pdev->dev, "cannot snd dai register\n");
		goto exit_snd_soc;
	}
1308

1309 1310 1311 1312
	return ret;

exit_snd_soc:
	snd_soc_unregister_platform(&pdev->dev);
1313 1314 1315 1316
exit_free_irq:
	free_irq(irq, master);
exit_iounmap:
	iounmap(master->base);
1317
	pm_runtime_disable(&pdev->dev);
1318 1319 1320 1321 1322 1323 1324 1325 1326
exit_kfree:
	kfree(master);
	master = NULL;
exit:
	return ret;
}

static int fsi_remove(struct platform_device *pdev)
{
1327 1328
	struct fsi_master *master;

1329
	master = dev_get_drvdata(&pdev->dev);
1330

1331
	free_irq(master->irq, master);
1332
	pm_runtime_disable(&pdev->dev);
1333

1334 1335
	snd_soc_unregister_dais(&pdev->dev, ARRAY_SIZE(fsi_soc_dai));
	snd_soc_unregister_platform(&pdev->dev);
1336 1337 1338

	iounmap(master->base);
	kfree(master);
1339

1340 1341 1342
	return 0;
}

1343
static void __fsi_suspend(struct fsi_priv *fsi,
1344
			  int is_play,
1345
			  struct device *dev)
1346
{
1347 1348
	if (!fsi_stream_is_working(fsi, is_play))
		return;
1349

1350 1351
	fsi_port_stop(fsi, is_play);
	fsi_hw_shutdown(fsi, is_play, dev);
1352 1353 1354
}

static void __fsi_resume(struct fsi_priv *fsi,
1355
			 int is_play,
1356
			 struct device *dev)
1357
{
1358 1359
	if (!fsi_stream_is_working(fsi, is_play))
		return;
1360

1361 1362 1363
	fsi_hw_startup(fsi, is_play, dev);

	if (fsi_is_clk_master(fsi) && fsi->rate)
1364
		fsi_set_master_clk(dev, fsi, fsi->rate, 1);
1365 1366 1367

	fsi_port_start(fsi, is_play);

1368 1369 1370 1371 1372
}

static int fsi_suspend(struct device *dev)
{
	struct fsi_master *master = dev_get_drvdata(dev);
1373 1374
	struct fsi_priv *fsia = &master->fsia;
	struct fsi_priv *fsib = &master->fsib;
1375

1376 1377
	__fsi_suspend(fsia, 1, dev);
	__fsi_suspend(fsia, 0, dev);
1378

1379 1380
	__fsi_suspend(fsib, 1, dev);
	__fsi_suspend(fsib, 0, dev);
1381 1382 1383 1384 1385 1386 1387

	return 0;
}

static int fsi_resume(struct device *dev)
{
	struct fsi_master *master = dev_get_drvdata(dev);
1388 1389
	struct fsi_priv *fsia = &master->fsia;
	struct fsi_priv *fsib = &master->fsib;
1390

1391 1392
	__fsi_resume(fsia, 1, dev);
	__fsi_resume(fsia, 0, dev);
1393

1394 1395
	__fsi_resume(fsib, 1, dev);
	__fsi_resume(fsib, 0, dev);
1396 1397 1398 1399

	return 0;
}

1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412
static int fsi_runtime_nop(struct device *dev)
{
	/* Runtime PM callback shared between ->runtime_suspend()
	 * and ->runtime_resume(). Simply returns success.
	 *
	 * This driver re-initializes all registers after
	 * pm_runtime_get_sync() anyway so there is no need
	 * to save and restore registers here.
	 */
	return 0;
}

static struct dev_pm_ops fsi_pm_ops = {
1413 1414
	.suspend		= fsi_suspend,
	.resume			= fsi_resume,
1415 1416 1417 1418
	.runtime_suspend	= fsi_runtime_nop,
	.runtime_resume		= fsi_runtime_nop,
};

1419 1420 1421 1422
static struct fsi_core fsi1_core = {
	.ver	= 1,

	/* Interrupt */
1423 1424 1425 1426 1427
	.int_st	= INT_ST,
	.iemsk	= IEMSK,
	.imsk	= IMSK,
};

1428 1429 1430 1431
static struct fsi_core fsi2_core = {
	.ver	= 2,

	/* Interrupt */
1432 1433 1434
	.int_st	= CPU_INT_ST,
	.iemsk	= CPU_IEMSK,
	.imsk	= CPU_IMSK,
1435 1436
	.a_mclk	= A_MST_CTLR,
	.b_mclk	= B_MST_CTLR,
1437 1438 1439
};

static struct platform_device_id fsi_id_table[] = {
1440 1441
	{ "sh_fsi",	(kernel_ulong_t)&fsi1_core },
	{ "sh_fsi2",	(kernel_ulong_t)&fsi2_core },
1442
	{},
1443
};
1444
MODULE_DEVICE_TABLE(platform, fsi_id_table);
1445

1446 1447
static struct platform_driver fsi_driver = {
	.driver 	= {
1448
		.name	= "fsi-pcm-audio",
1449
		.pm	= &fsi_pm_ops,
1450 1451 1452
	},
	.probe		= fsi_probe,
	.remove		= fsi_remove,
1453
	.id_table	= fsi_id_table,
1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464
};

static int __init fsi_mobile_init(void)
{
	return platform_driver_register(&fsi_driver);
}

static void __exit fsi_mobile_exit(void)
{
	platform_driver_unregister(&fsi_driver);
}
1465

1466 1467 1468 1469 1470 1471
module_init(fsi_mobile_init);
module_exit(fsi_mobile_exit);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("SuperH onchip FSI audio driver");
MODULE_AUTHOR("Kuninori Morimoto <morimoto.kuninori@renesas.com>");
1472
MODULE_ALIAS("platform:fsi-pcm-audio");