fsi.c 26.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 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#include <sound/soc.h>
#include <sound/sh_fsi.h>

#define DO_FMT		0x0000
#define DOFF_CTL	0x0004
#define DOFF_ST		0x0008
#define DI_FMT		0x000C
#define DIFF_CTL	0x0010
#define DIFF_ST		0x0014
#define CKG1		0x0018
#define CKG2		0x001C
#define DIDT		0x0020
#define DODT		0x0024
#define MUTE_ST		0x0028
#define REG_END		MUTE_ST

35 36 37 38

#define CPU_INT_ST	0x01F4
#define CPU_IEMSK	0x01F8
#define CPU_IMSK	0x01FC
39 40 41 42 43 44
#define INT_ST		0x0200
#define IEMSK		0x0204
#define IMSK		0x0208
#define MUTE		0x020C
#define CLK_RST		0x0210
#define SOFT_RST	0x0214
45
#define FIFO_SZ		0x0218
46
#define MREG_START	CPU_INT_ST
47
#define MREG_END	FIFO_SZ
48 49 50

/* DO_FMT */
/* DI_FMT */
51 52 53 54 55 56
#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)
57 58 59 60 61 62 63 64 65

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

/* DOFF_ST */
#define ERR_OVER	0x00000010
#define ERR_UNDER	0x00000001
66
#define ST_ERR		(ERR_OVER | ERR_UNDER)
67

68 69 70 71
/* CKG1 */
#define ACKMD_MASK	0x00007000
#define BPFMD_MASK	0x00000700

72 73 74 75 76 77 78 79 80 81
/* CLK_RST */
#define B_CLK		0x00000010
#define A_CLK		0x00000001

/* INT_ST */
#define INT_B_IN	(1 << 12)
#define INT_B_OUT	(1 << 8)
#define INT_A_IN	(1 << 4)
#define INT_A_OUT	(1 << 0)

82 83 84 85 86 87
/* 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 */

88 89 90 91 92
/* FIFO_SZ */
#define OUT_SZ_MASK	0x7
#define BO_SZ_SHIFT	8
#define AO_SZ_SHIFT	0

93 94 95 96 97 98 99 100 101 102 103 104 105 106
#define FSI_RATES SNDRV_PCM_RATE_8000_96000

#define FSI_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)

/************************************************************************


		struct


************************************************************************/
struct fsi_priv {
	void __iomem *base;
	struct snd_pcm_substream *substream;
107
	struct fsi_master *master;
108 109 110 111 112 113 114 115 116 117

	int fifo_max;
	int chan;

	int byte_offset;
	int period_len;
	int buffer_len;
	int periods;
};

118 119 120
struct fsi_core {
	int ver;

121 122 123 124 125
	u32 int_st;
	u32 iemsk;
	u32 imsk;
};

126 127 128 129 130
struct fsi_master {
	void __iomem *base;
	int irq;
	struct fsi_priv fsia;
	struct fsi_priv fsib;
131
	struct fsi_core *core;
132
	struct sh_fsi_platform_info *info;
133
	spinlock_t lock;
134 135 136 137 138 139 140 141 142
};

/************************************************************************


		basic read write function


************************************************************************/
143
static void __fsi_reg_write(u32 reg, u32 data)
144 145 146 147
{
	/* valid data area is 24bit */
	data &= 0x00ffffff;

148
	__raw_writel(data, reg);
149 150 151 152
}

static u32 __fsi_reg_read(u32 reg)
{
153
	return __raw_readl(reg);
154 155
}

156
static void __fsi_reg_mask_set(u32 reg, u32 mask, u32 data)
157 158 159 160 161 162
{
	u32 val = __fsi_reg_read(reg);

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

163
	__fsi_reg_write(reg, val);
164 165
}

166
static void fsi_reg_write(struct fsi_priv *fsi, u32 reg, u32 data)
167
{
168 169
	if (reg > REG_END) {
		pr_err("fsi: register access err (%s)\n", __func__);
170
		return;
171
	}
172

173
	__fsi_reg_write((u32)(fsi->base + reg), data);
174 175 176 177
}

static u32 fsi_reg_read(struct fsi_priv *fsi, u32 reg)
{
178 179
	if (reg > REG_END) {
		pr_err("fsi: register access err (%s)\n", __func__);
180
		return 0;
181
	}
182 183 184 185

	return __fsi_reg_read((u32)(fsi->base + reg));
}

186
static void fsi_reg_mask_set(struct fsi_priv *fsi, u32 reg, u32 mask, u32 data)
187
{
188 189
	if (reg > REG_END) {
		pr_err("fsi: register access err (%s)\n", __func__);
190
		return;
191
	}
192

193
	__fsi_reg_mask_set((u32)(fsi->base + reg), mask, data);
194 195
}

196
static void fsi_master_write(struct fsi_master *master, u32 reg, u32 data)
197
{
198 199
	unsigned long flags;

200
	if ((reg < MREG_START) ||
201 202
	    (reg > MREG_END)) {
		pr_err("fsi: register access err (%s)\n", __func__);
203
		return;
204
	}
205

206
	spin_lock_irqsave(&master->lock, flags);
207
	__fsi_reg_write((u32)(master->base + reg), data);
208
	spin_unlock_irqrestore(&master->lock, flags);
209 210
}

211
static u32 fsi_master_read(struct fsi_master *master, u32 reg)
212
{
213 214 215
	u32 ret;
	unsigned long flags;

216
	if ((reg < MREG_START) ||
217 218
	    (reg > MREG_END)) {
		pr_err("fsi: register access err (%s)\n", __func__);
219
		return 0;
220
	}
221

222 223 224 225 226
	spin_lock_irqsave(&master->lock, flags);
	ret = __fsi_reg_read((u32)(master->base + reg));
	spin_unlock_irqrestore(&master->lock, flags);

	return ret;
227 228
}

229
static void fsi_master_mask_set(struct fsi_master *master,
230
			       u32 reg, u32 mask, u32 data)
231
{
232 233
	unsigned long flags;

234
	if ((reg < MREG_START) ||
235 236
	    (reg > MREG_END)) {
		pr_err("fsi: register access err (%s)\n", __func__);
237
		return;
238
	}
239

240
	spin_lock_irqsave(&master->lock, flags);
241
	__fsi_reg_mask_set((u32)(master->base + reg), mask, data);
242
	spin_unlock_irqrestore(&master->lock, flags);
243 244 245 246 247 248 249 250 251
}

/************************************************************************


		basic function


************************************************************************/
252
static struct fsi_master *fsi_get_master(struct fsi_priv *fsi)
253
{
254
	return fsi->master;
255 256 257 258
}

static int fsi_is_port_a(struct fsi_priv *fsi)
{
259 260
	return fsi->master->base == fsi->base;
}
261

262
static struct snd_soc_dai *fsi_get_dai(struct snd_pcm_substream *substream)
263 264 265
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_soc_dai_link *machine = rtd->dai;
266 267 268 269 270 271 272

	return  machine->cpu_dai;
}

static struct fsi_priv *fsi_get_priv(struct snd_pcm_substream *substream)
{
	struct snd_soc_dai *dai = fsi_get_dai(substream);
273

274
	return dai->private_data;
275 276 277 278 279
}

static u32 fsi_get_info_flags(struct fsi_priv *fsi)
{
	int is_porta = fsi_is_port_a(fsi);
280
	struct fsi_master *master = fsi_get_master(fsi);
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 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

	return is_porta ? master->info->porta_flags :
		master->info->portb_flags;
}

static int fsi_is_master_mode(struct fsi_priv *fsi, int is_play)
{
	u32 mode;
	u32 flags = fsi_get_info_flags(fsi);

	mode = is_play ? SH_FSI_OUT_SLAVE_MODE : SH_FSI_IN_SLAVE_MODE;

	/* return
	 * 1 : master mode
	 * 0 : slave mode
	 */

	return (mode & flags) != mode;
}

static u32 fsi_port_ab_io_bit(struct fsi_priv *fsi, int is_play)
{
	int is_porta = fsi_is_port_a(fsi);
	u32 data;

	if (is_porta)
		data = is_play ? (1 << 0) : (1 << 4);
	else
		data = is_play ? (1 << 8) : (1 << 12);

	return data;
}

static void fsi_stream_push(struct fsi_priv *fsi,
			    struct snd_pcm_substream *substream,
			    u32 buffer_len,
			    u32 period_len)
{
	fsi->substream		= substream;
	fsi->buffer_len		= buffer_len;
	fsi->period_len		= period_len;
	fsi->byte_offset	= 0;
	fsi->periods		= 0;
}

static void fsi_stream_pop(struct fsi_priv *fsi)
{
	fsi->substream		= NULL;
	fsi->buffer_len		= 0;
	fsi->period_len		= 0;
	fsi->byte_offset	= 0;
	fsi->periods		= 0;
}

static int fsi_get_fifo_residue(struct fsi_priv *fsi, int is_play)
{
	u32 status;
	u32 reg = is_play ? DOFF_ST : DIFF_ST;
	int residue;

	status = fsi_reg_read(fsi, reg);
	residue = 0x1ff & (status >> 8);
	residue *= fsi->chan;

	return residue;
}

/************************************************************************


351
		irq function
352 353 354 355 356 357


************************************************************************/
static void fsi_irq_enable(struct fsi_priv *fsi, int is_play)
{
	u32 data = fsi_port_ab_io_bit(fsi, is_play);
358
	struct fsi_master *master = fsi_get_master(fsi);
359

360 361
	fsi_master_mask_set(master, master->core->imsk,  data, data);
	fsi_master_mask_set(master, master->core->iemsk, data, data);
362 363 364 365 366
}

static void fsi_irq_disable(struct fsi_priv *fsi, int is_play)
{
	u32 data = fsi_port_ab_io_bit(fsi, is_play);
367
	struct fsi_master *master = fsi_get_master(fsi);
368

369 370
	fsi_master_mask_set(master, master->core->imsk,  data, 0);
	fsi_master_mask_set(master, master->core->iemsk, data, 0);
371 372
}

373 374
static u32 fsi_irq_get_status(struct fsi_master *master)
{
375
	return fsi_master_read(master, master->core->int_st);
376 377 378 379
}

static void fsi_irq_clear_all_status(struct fsi_master *master)
{
380
	fsi_master_write(master, master->core->int_st, 0);
381 382
}

383 384 385 386 387 388 389 390 391
static void fsi_irq_clear_status(struct fsi_priv *fsi)
{
	u32 data = 0;
	struct fsi_master *master = fsi_get_master(fsi);

	data |= fsi_port_ab_io_bit(fsi, 0);
	data |= fsi_port_ab_io_bit(fsi, 1);

	/* clear interrupt factor */
392
	fsi_master_mask_set(master, master->core->int_st, data, 0);
393 394 395 396 397 398 399 400 401
}

/************************************************************************


		ctrl function


************************************************************************/
402 403 404
static void fsi_clk_ctrl(struct fsi_priv *fsi, int enable)
{
	u32 val = fsi_is_port_a(fsi) ? (1 << 0) : (1 << 4);
405
	struct fsi_master *master = fsi_get_master(fsi);
406 407

	if (enable)
408
		fsi_master_mask_set(master, CLK_RST, val, val);
409
	else
410
		fsi_master_mask_set(master, CLK_RST, val, 0);
411 412
}

413 414 415
static void fsi_fifo_init(struct fsi_priv *fsi,
			  int is_play,
			  struct snd_soc_dai *dai)
416
{
417 418
	struct fsi_master *master = fsi_get_master(fsi);
	u32 ctrl, shift, i;
419

420 421 422 423 424 425
	/* get on-chip RAM capacity */
	shift = fsi_master_read(master, FIFO_SZ);
	shift >>= fsi_is_port_a(fsi) ? AO_SZ_SHIFT : BO_SZ_SHIFT;
	shift &= OUT_SZ_MASK;
	fsi->fifo_max = 256 << shift;
	dev_dbg(dai->dev, "fifo = %d words\n", fsi->fifo_max);
426

427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448
	/*
	 * 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)
	 */
	for (i = 1; i < fsi->chan; i <<= 1)
		fsi->fifo_max >>= 1;
	dev_dbg(dai->dev, "%d channel %d store\n", fsi->chan, fsi->fifo_max);
449 450 451 452 453 454 455 456 457 458

	ctrl = is_play ? DOFF_CTL : DIFF_CTL;

	/* set interrupt generation factor */
	fsi_reg_write(fsi, ctrl, IRQ_HALF);

	/* clear FIFO */
	fsi_reg_mask_set(fsi, ctrl, FIFO_CLR, FIFO_CLR);
}

459
static void fsi_soft_all_reset(struct fsi_master *master)
460 461
{
	/* port AB reset */
462
	fsi_master_mask_set(master, SOFT_RST, PASR | PBSR, 0);
463 464 465
	mdelay(10);

	/* soft reset */
466 467
	fsi_master_mask_set(master, SOFT_RST, FSISR, 0);
	fsi_master_mask_set(master, SOFT_RST, FSISR, FSISR);
468 469 470 471
	mdelay(10);
}

/* playback interrupt */
472
static int fsi_data_push(struct fsi_priv *fsi, int startup)
473 474 475
{
	struct snd_pcm_runtime *runtime;
	struct snd_pcm_substream *substream = NULL;
476
	u32 status;
477 478 479
	int send;
	int fifo_free;
	int width;
480
	u8 *start;
481
	int i, over_period;
482 483 484 485 486 487

	if (!fsi			||
	    !fsi->substream		||
	    !fsi->substream->runtime)
		return -EINVAL;

488 489 490
	over_period	= 0;
	substream	= fsi->substream;
	runtime		= substream->runtime;
491 492 493 494 495 496 497

	/* FSI FIFO has limit.
	 * So, this driver can not send periods data at a time
	 */
	if (fsi->byte_offset >=
	    fsi->period_len * (fsi->periods + 1)) {

498
		over_period = 1;
499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517
		fsi->periods = (fsi->periods + 1) % runtime->periods;

		if (0 == fsi->periods)
			fsi->byte_offset = 0;
	}

	/* get 1 channel data width */
	width = frames_to_bytes(runtime, 1) / fsi->chan;

	/* get send size for alsa */
	send = (fsi->buffer_len - fsi->byte_offset) / width;

	/*  get FIFO free size */
	fifo_free = (fsi->fifo_max * fsi->chan) - fsi_get_fifo_residue(fsi, 1);

	/* size check */
	if (fifo_free < send)
		send = fifo_free;

518 519 520 521 522 523 524 525 526 527 528 529 530 531
	start = runtime->dma_area;
	start += fsi->byte_offset;

	switch (width) {
	case 2:
		for (i = 0; i < send; i++)
			fsi_reg_write(fsi, DODT,
				      ((u32)*((u16 *)start + i) << 8));
		break;
	case 4:
		for (i = 0; i < send; i++)
			fsi_reg_write(fsi, DODT, *((u32 *)start + i));
		break;
	default:
532
		return -EINVAL;
533
	}
534 535 536

	fsi->byte_offset += send * width;

537
	status = fsi_reg_read(fsi, DOFF_ST);
538
	if (!startup) {
539
		struct snd_soc_dai *dai = fsi_get_dai(substream);
540 541 542 543 544

		if (status & ERR_OVER)
			dev_err(dai->dev, "over run\n");
		if (status & ERR_UNDER)
			dev_err(dai->dev, "under run\n");
545
	}
546
	fsi_reg_write(fsi, DOFF_ST, 0);
547

548 549
	fsi_irq_enable(fsi, 1);

550
	if (over_period)
551 552
		snd_pcm_period_elapsed(substream);

553
	return 0;
554 555
}

556
static int fsi_data_pop(struct fsi_priv *fsi, int startup)
557 558 559
{
	struct snd_pcm_runtime *runtime;
	struct snd_pcm_substream *substream = NULL;
560
	u32 status;
561 562 563 564
	int free;
	int fifo_fill;
	int width;
	u8 *start;
565
	int i, over_period;
566 567 568 569 570 571

	if (!fsi			||
	    !fsi->substream		||
	    !fsi->substream->runtime)
		return -EINVAL;

572 573 574
	over_period	= 0;
	substream	= fsi->substream;
	runtime		= substream->runtime;
575 576 577 578 579 580 581

	/* FSI FIFO has limit.
	 * So, this driver can not send periods data at a time
	 */
	if (fsi->byte_offset >=
	    fsi->period_len * (fsi->periods + 1)) {

582
		over_period = 1;
583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619
		fsi->periods = (fsi->periods + 1) % runtime->periods;

		if (0 == fsi->periods)
			fsi->byte_offset = 0;
	}

	/* get 1 channel data width */
	width = frames_to_bytes(runtime, 1) / fsi->chan;

	/* get free space for alsa */
	free = (fsi->buffer_len - fsi->byte_offset) / width;

	/* get recv size */
	fifo_fill = fsi_get_fifo_residue(fsi, 0);

	if (free < fifo_fill)
		fifo_fill = free;

	start = runtime->dma_area;
	start += fsi->byte_offset;

	switch (width) {
	case 2:
		for (i = 0; i < fifo_fill; i++)
			*((u16 *)start + i) =
				(u16)(fsi_reg_read(fsi, DIDT) >> 8);
		break;
	case 4:
		for (i = 0; i < fifo_fill; i++)
			*((u32 *)start + i) = fsi_reg_read(fsi, DIDT);
		break;
	default:
		return -EINVAL;
	}

	fsi->byte_offset += fifo_fill * width;

620
	status = fsi_reg_read(fsi, DIFF_ST);
621
	if (!startup) {
622
		struct snd_soc_dai *dai = fsi_get_dai(substream);
623 624 625 626 627

		if (status & ERR_OVER)
			dev_err(dai->dev, "over run\n");
		if (status & ERR_UNDER)
			dev_err(dai->dev, "under run\n");
628
	}
629
	fsi_reg_write(fsi, DIFF_ST, 0);
630

631 632
	fsi_irq_enable(fsi, 0);

633
	if (over_period)
634 635
		snd_pcm_period_elapsed(substream);

636
	return 0;
637 638
}

639 640
static irqreturn_t fsi_interrupt(int irq, void *data)
{
641
	struct fsi_master *master = data;
642
	u32 int_st = fsi_irq_get_status(master);
643 644

	/* clear irq status */
645 646
	fsi_master_mask_set(master, SOFT_RST, IR, 0);
	fsi_master_mask_set(master, SOFT_RST, IR, IR);
647 648

	if (int_st & INT_A_OUT)
649
		fsi_data_push(&master->fsia, 0);
650
	if (int_st & INT_B_OUT)
651
		fsi_data_push(&master->fsib, 0);
652
	if (int_st & INT_A_IN)
653
		fsi_data_pop(&master->fsia, 0);
654
	if (int_st & INT_B_IN)
655
		fsi_data_pop(&master->fsib, 0);
656

657
	fsi_irq_clear_all_status(master);
658 659 660 661 662 663 664 665 666 667 668 669 670 671

	return IRQ_HANDLED;
}

/************************************************************************


		dai ops


************************************************************************/
static int fsi_dai_startup(struct snd_pcm_substream *substream,
			   struct snd_soc_dai *dai)
{
672
	struct fsi_priv *fsi = fsi_get_priv(substream);
673 674 675 676 677 678 679 680
	u32 flags = fsi_get_info_flags(fsi);
	u32 fmt;
	u32 reg;
	u32 data;
	int is_play = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
	int is_master;
	int ret = 0;

681
	pm_runtime_get_sync(dai->dev);
682 683 684 685 686 687 688 689 690 691 692

	/* CKG1 */
	data = is_play ? (1 << 0) : (1 << 4);
	is_master = fsi_is_master_mode(fsi, is_play);
	if (is_master)
		fsi_reg_mask_set(fsi, CKG1, data, data);
	else
		fsi_reg_mask_set(fsi, CKG1, data, 0);

	/* clock inversion (CKG2) */
	data = 0;
693 694 695 696 697 698 699 700 701
	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;

702 703 704 705 706 707 708 709
	fsi_reg_write(fsi, CKG2, data);

	/* do fmt, di fmt */
	data = 0;
	reg = is_play ? DO_FMT : DI_FMT;
	fmt = is_play ? SH_FSI_GET_OFMT(flags) : SH_FSI_GET_IFMT(flags);
	switch (fmt) {
	case SH_FSI_FMT_MONO:
710
		data = CR_MONO;
711 712 713
		fsi->chan = 1;
		break;
	case SH_FSI_FMT_MONO_DELAY:
714
		data = CR_MONO_D;
715 716 717
		fsi->chan = 1;
		break;
	case SH_FSI_FMT_PCM:
718
		data = CR_PCM;
719 720 721
		fsi->chan = 2;
		break;
	case SH_FSI_FMT_I2S:
722
		data = CR_I2S;
723 724 725 726 727
		fsi->chan = 2;
		break;
	case SH_FSI_FMT_TDM:
		fsi->chan = is_play ?
			SH_FSI_GET_CH_O(flags) : SH_FSI_GET_CH_I(flags);
728
		data = CR_TDM | (fsi->chan - 1);
729 730 731 732
		break;
	case SH_FSI_FMT_TDM_DELAY:
		fsi->chan = is_play ?
			SH_FSI_GET_CH_O(flags) : SH_FSI_GET_CH_I(flags);
733
		data = CR_TDM_D | (fsi->chan - 1);
734 735 736 737 738 739 740
		break;
	default:
		dev_err(dai->dev, "unknown format.\n");
		return -EINVAL;
	}
	fsi_reg_write(fsi, reg, data);

741 742 743 744 745
	/* irq clear */
	fsi_irq_disable(fsi, is_play);
	fsi_irq_clear_status(fsi);

	/* fifo init */
746
	fsi_fifo_init(fsi, is_play, dai);
747 748 749 750 751 752 753

	return ret;
}

static void fsi_dai_shutdown(struct snd_pcm_substream *substream,
			     struct snd_soc_dai *dai)
{
754
	struct fsi_priv *fsi = fsi_get_priv(substream);
755 756 757 758 759
	int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;

	fsi_irq_disable(fsi, is_play);
	fsi_clk_ctrl(fsi, 0);

760
	pm_runtime_put_sync(dai->dev);
761 762 763 764 765
}

static int fsi_dai_trigger(struct snd_pcm_substream *substream, int cmd,
			   struct snd_soc_dai *dai)
{
766
	struct fsi_priv *fsi = fsi_get_priv(substream);
767 768 769 770 771 772 773 774 775
	struct snd_pcm_runtime *runtime = substream->runtime;
	int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
	int ret = 0;

	switch (cmd) {
	case SNDRV_PCM_TRIGGER_START:
		fsi_stream_push(fsi, substream,
				frames_to_bytes(runtime, runtime->buffer_size),
				frames_to_bytes(runtime, runtime->period_size));
776
		ret = is_play ? fsi_data_push(fsi, 1) : fsi_data_pop(fsi, 1);
777 778 779 780 781 782 783 784 785 786
		break;
	case SNDRV_PCM_TRIGGER_STOP:
		fsi_irq_disable(fsi, is_play);
		fsi_stream_pop(fsi);
		break;
	}

	return ret;
}

787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868
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);
	struct fsi_master *master = fsi_get_master(fsi);
	int (*set_rate)(int is_porta, int rate) = master->info->set_rate;
	int fsi_ver = master->core->ver;
	int is_play = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
	int ret;

	/* if slave mode, set_rate is not needed */
	if (!fsi_is_master_mode(fsi, is_play))
		return 0;

	/* it is error if no set_rate */
	if (!set_rate)
		return -EIO;

	ret = set_rate(fsi_is_port_a(fsi), params_rate(params));
	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(dai->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(dai->dev, "unsupported ACKMD\n");
			else
				data |= (0x7 << 8);
			break;
		}

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

	return ret;

}

869 870 871 872
static struct snd_soc_dai_ops fsi_dai_ops = {
	.startup	= fsi_dai_startup,
	.shutdown	= fsi_dai_shutdown,
	.trigger	= fsi_dai_trigger,
873
	.hw_params	= fsi_dai_hw_params,
874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929
};

/************************************************************************


		pcm ops


************************************************************************/
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)
{
	struct snd_pcm_runtime *runtime = substream->runtime;
930
	struct fsi_priv *fsi = fsi_get_priv(substream);
931 932
	long location;

933
	location = (fsi->byte_offset - 1);
934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994
	if (location < 0)
		location = 0;

	return bytes_to_frames(runtime, location);
}

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,
};

/************************************************************************


		snd_soc_platform


************************************************************************/
#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);
}

static int fsi_pcm_new(struct snd_card *card,
		       struct snd_soc_dai *dai,
		       struct snd_pcm *pcm)
{
	/*
	 * 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);
}

/************************************************************************


		alsa struct


************************************************************************/
struct snd_soc_dai fsi_soc_dai[] = {
	{
		.name			= "FSIA",
		.id			= 0,
		.playback = {
			.rates		= FSI_RATES,
			.formats	= FSI_FMTS,
			.channels_min	= 1,
			.channels_max	= 8,
		},
995 996 997 998 999 1000
		.capture = {
			.rates		= FSI_RATES,
			.formats	= FSI_FMTS,
			.channels_min	= 1,
			.channels_max	= 8,
		},
1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011
		.ops = &fsi_dai_ops,
	},
	{
		.name			= "FSIB",
		.id			= 1,
		.playback = {
			.rates		= FSI_RATES,
			.formats	= FSI_FMTS,
			.channels_min	= 1,
			.channels_max	= 8,
		},
1012 1013 1014 1015 1016 1017
		.capture = {
			.rates		= FSI_RATES,
			.formats	= FSI_FMTS,
			.channels_min	= 1,
			.channels_max	= 8,
		},
1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039
		.ops = &fsi_dai_ops,
	},
};
EXPORT_SYMBOL_GPL(fsi_soc_dai);

struct snd_soc_platform fsi_soc_platform = {
	.name		= "fsi-pcm",
	.pcm_ops 	= &fsi_pcm_ops,
	.pcm_new	= fsi_pcm_new,
	.pcm_free	= fsi_pcm_free,
};
EXPORT_SYMBOL_GPL(fsi_soc_platform);

/************************************************************************


		platform function


************************************************************************/
static int fsi_probe(struct platform_device *pdev)
{
1040
	struct fsi_master *master;
1041
	const struct platform_device_id	*id_entry;
1042 1043 1044 1045
	struct resource *res;
	unsigned int irq;
	int ret;

1046 1047 1048 1049 1050 1051
	id_entry = pdev->id_entry;
	if (!id_entry) {
		dev_err(&pdev->dev, "unknown fsi device\n");
		return -ENODEV;
	}

1052 1053
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	irq = platform_get_irq(pdev, 0);
1054
	if (!res || (int)irq <= 0) {
1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076
		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;
	}

	master->irq		= irq;
	master->info		= pdev->dev.platform_data;
	master->fsia.base	= master->base;
1077
	master->fsia.master	= master;
1078
	master->fsib.base	= master->base + 0x40;
1079
	master->fsib.master	= master;
1080
	master->core		= (struct fsi_core *)id_entry->driver_data;
1081
	spin_lock_init(&master->lock);
1082

1083 1084
	pm_runtime_enable(&pdev->dev);
	pm_runtime_resume(&pdev->dev);
1085 1086

	fsi_soc_dai[0].dev		= &pdev->dev;
1087
	fsi_soc_dai[0].private_data	= &master->fsia;
1088
	fsi_soc_dai[1].dev		= &pdev->dev;
1089
	fsi_soc_dai[1].private_data	= &master->fsib;
1090

1091
	fsi_soft_all_reset(master);
1092

1093 1094
	ret = request_irq(irq, &fsi_interrupt, IRQF_DISABLED,
			  id_entry->name, master);
1095 1096
	if (ret) {
		dev_err(&pdev->dev, "irq request err\n");
1097
		goto exit_iounmap;
1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111
	}

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

	return snd_soc_register_dais(fsi_soc_dai, ARRAY_SIZE(fsi_soc_dai));

exit_free_irq:
	free_irq(irq, master);
exit_iounmap:
	iounmap(master->base);
1112
	pm_runtime_disable(&pdev->dev);
1113 1114 1115 1116 1117 1118 1119 1120 1121
exit_kfree:
	kfree(master);
	master = NULL;
exit:
	return ret;
}

static int fsi_remove(struct platform_device *pdev)
{
1122 1123 1124 1125
	struct fsi_master *master;

	master = fsi_get_master(fsi_soc_dai[0].private_data);

1126 1127 1128
	snd_soc_unregister_dais(fsi_soc_dai, ARRAY_SIZE(fsi_soc_dai));
	snd_soc_unregister_platform(&fsi_soc_platform);

1129
	pm_runtime_disable(&pdev->dev);
1130 1131 1132 1133 1134

	free_irq(master->irq, master);

	iounmap(master->base);
	kfree(master);
1135 1136 1137 1138 1139 1140

	fsi_soc_dai[0].dev		= NULL;
	fsi_soc_dai[0].private_data	= NULL;
	fsi_soc_dai[1].dev		= NULL;
	fsi_soc_dai[1].private_data	= NULL;

1141 1142 1143
	return 0;
}

1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160
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 = {
	.runtime_suspend	= fsi_runtime_nop,
	.runtime_resume		= fsi_runtime_nop,
};

1161 1162 1163 1164
static struct fsi_core fsi1_core = {
	.ver	= 1,

	/* Interrupt */
1165 1166 1167 1168 1169
	.int_st	= INT_ST,
	.iemsk	= IEMSK,
	.imsk	= IMSK,
};

1170 1171 1172 1173
static struct fsi_core fsi2_core = {
	.ver	= 2,

	/* Interrupt */
1174 1175 1176 1177 1178 1179
	.int_st	= CPU_INT_ST,
	.iemsk	= CPU_IEMSK,
	.imsk	= CPU_IMSK,
};

static struct platform_device_id fsi_id_table[] = {
1180 1181
	{ "sh_fsi",	(kernel_ulong_t)&fsi1_core },
	{ "sh_fsi2",	(kernel_ulong_t)&fsi2_core },
1182 1183
};

1184 1185 1186
static struct platform_driver fsi_driver = {
	.driver 	= {
		.name	= "sh_fsi",
1187
		.pm	= &fsi_pm_ops,
1188 1189 1190
	},
	.probe		= fsi_probe,
	.remove		= fsi_remove,
1191
	.id_table	= fsi_id_table,
1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208
};

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);
}
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>");