fsl_ssi.c 44.8 KB
Newer Older
1 2 3 4 5
/*
 * Freescale SSI ALSA SoC Digital Audio Interface (DAI) driver
 *
 * Author: Timur Tabi <timur@freescale.com>
 *
6 7 8 9 10
 * Copyright 2007-2010 Freescale Semiconductor, Inc.
 *
 * This file is licensed under the terms of the GNU General Public License
 * version 2.  This program is licensed "as is" without any warranty of any
 * kind, whether express or implied.
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 *
 *
 * Some notes why imx-pcm-fiq is used instead of DMA on some boards:
 *
 * The i.MX SSI core has some nasty limitations in AC97 mode. While most
 * sane processor vendors have a FIFO per AC97 slot, the i.MX has only
 * one FIFO which combines all valid receive slots. We cannot even select
 * which slots we want to receive. The WM9712 with which this driver
 * was developed with always sends GPIO status data in slot 12 which
 * we receive in our (PCM-) data stream. The only chance we have is to
 * manually skip this data in the FIQ handler. With sampling rates different
 * from 48000Hz not every frame has valid receive data, so the ratio
 * between pcm data and GPIO status data changes. Our FIQ handler is not
 * able to handle this, hence this driver only works with 48000Hz sampling
 * rate.
 * Reading and writing AC97 registers is another challenge. The core
 * provides us status bits when the read register is updated with *another*
 * value. When we read the same register two times (and the register still
 * contains the same value) these status bits are not set. We work
 * around this by not polling these bits but only wait a fixed delay.
31 32 33
 */

#include <linux/init.h>
34
#include <linux/io.h>
35 36
#include <linux/module.h>
#include <linux/interrupt.h>
37
#include <linux/clk.h>
38
#include <linux/ctype.h>
39 40
#include <linux/device.h>
#include <linux/delay.h>
41
#include <linux/mutex.h>
42
#include <linux/slab.h>
43
#include <linux/spinlock.h>
44
#include <linux/of.h>
45 46
#include <linux/of_address.h>
#include <linux/of_irq.h>
47
#include <linux/of_platform.h>
48 49 50 51 52 53

#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/initval.h>
#include <sound/soc.h>
54
#include <sound/dmaengine_pcm.h>
55 56

#include "fsl_ssi.h"
57
#include "imx-pcm.h"
58

59 60 61 62
/* Define RX and TX to index ssi->regvals array; Can be 0 or 1 only */
#define RX 0
#define TX 1

63 64 65 66 67 68 69 70 71 72 73 74 75
/**
 * FSLSSI_I2S_FORMATS: audio formats supported by the SSI
 *
 * The SSI has a limitation in that the samples must be in the same byte
 * order as the host CPU.  This is because when multiple bytes are written
 * to the STX register, the bytes and bits must be written in the same
 * order.  The STX is a shift register, so all the bits need to be aligned
 * (bit-endianness must match byte-endianness).  Processors typically write
 * the bits within a byte in the same order that the bytes of a word are
 * written in.  So if the host CPU is big-endian, then only big-endian
 * samples will be written to STX properly.
 */
#ifdef __BIG_ENDIAN
76 77 78 79 80 81 82
#define FSLSSI_I2S_FORMATS \
	(SNDRV_PCM_FMTBIT_S8 | \
	 SNDRV_PCM_FMTBIT_S16_BE | \
	 SNDRV_PCM_FMTBIT_S18_3BE | \
	 SNDRV_PCM_FMTBIT_S20_3BE | \
	 SNDRV_PCM_FMTBIT_S24_3BE | \
	 SNDRV_PCM_FMTBIT_S24_BE)
83
#else
84 85 86 87 88 89 90
#define FSLSSI_I2S_FORMATS \
	(SNDRV_PCM_FMTBIT_S8 | \
	 SNDRV_PCM_FMTBIT_S16_LE | \
	 SNDRV_PCM_FMTBIT_S18_3LE | \
	 SNDRV_PCM_FMTBIT_S20_3LE | \
	 SNDRV_PCM_FMTBIT_S24_3LE | \
	 SNDRV_PCM_FMTBIT_S24_LE)
91 92
#endif

93 94 95 96 97 98 99 100 101 102
/*
 * In AC97 mode, TXDIR bit is forced to 0 and TFDIR bit is forced to 1:
 *  - SSI inputs external bit clock and outputs frame sync clock -- CBM_CFS
 *  - Also have NB_NF to mark these two clocks will not be inverted
 */
#define FSLSSI_AC97_DAIFMT \
	(SND_SOC_DAIFMT_AC97 | \
	 SND_SOC_DAIFMT_CBM_CFS | \
	 SND_SOC_DAIFMT_NB_NF)

103 104 105 106 107 108 109 110 111 112 113 114
#define FSLSSI_SIER_DBG_RX_FLAGS \
	(SSI_SIER_RFF0_EN | \
	 SSI_SIER_RLS_EN | \
	 SSI_SIER_RFS_EN | \
	 SSI_SIER_ROE0_EN | \
	 SSI_SIER_RFRC_EN)
#define FSLSSI_SIER_DBG_TX_FLAGS \
	(SSI_SIER_TFE0_EN | \
	 SSI_SIER_TLS_EN | \
	 SSI_SIER_TFS_EN | \
	 SSI_SIER_TUE0_EN | \
	 SSI_SIER_TFRC_EN)
115 116 117 118

enum fsl_ssi_type {
	FSL_SSI_MCP8610,
	FSL_SSI_MX21,
119
	FSL_SSI_MX35,
120 121 122
	FSL_SSI_MX51,
};

123
struct fsl_ssi_regvals {
124 125 126 127 128 129
	u32 sier;
	u32 srcr;
	u32 stcr;
	u32 scr;
};

130 131 132
static bool fsl_ssi_readable_reg(struct device *dev, unsigned int reg)
{
	switch (reg) {
133 134
	case REG_SSI_SACCEN:
	case REG_SSI_SACCDIS:
135 136 137 138 139 140 141 142 143
		return false;
	default:
		return true;
	}
}

static bool fsl_ssi_volatile_reg(struct device *dev, unsigned int reg)
{
	switch (reg) {
144 145 146 147 148 149 150 151 152 153 154 155
	case REG_SSI_STX0:
	case REG_SSI_STX1:
	case REG_SSI_SRX0:
	case REG_SSI_SRX1:
	case REG_SSI_SISR:
	case REG_SSI_SFCSR:
	case REG_SSI_SACNT:
	case REG_SSI_SACADD:
	case REG_SSI_SACDAT:
	case REG_SSI_SATAG:
	case REG_SSI_SACCST:
	case REG_SSI_SOR:
156 157 158 159 160 161
		return true;
	default:
		return false;
	}
}

162 163 164
static bool fsl_ssi_precious_reg(struct device *dev, unsigned int reg)
{
	switch (reg) {
165 166 167 168 169 170
	case REG_SSI_SRX0:
	case REG_SSI_SRX1:
	case REG_SSI_SISR:
	case REG_SSI_SACADD:
	case REG_SSI_SACDAT:
	case REG_SSI_SATAG:
171 172 173 174 175 176
		return true;
	default:
		return false;
	}
}

177 178 179
static bool fsl_ssi_writeable_reg(struct device *dev, unsigned int reg)
{
	switch (reg) {
180 181 182
	case REG_SSI_SRX0:
	case REG_SSI_SRX1:
	case REG_SSI_SACCST:
183 184 185 186 187 188
		return false;
	default:
		return true;
	}
}

M
Markus Pargmann 已提交
189
static const struct regmap_config fsl_ssi_regconfig = {
190
	.max_register = REG_SSI_SACCDIS,
M
Markus Pargmann 已提交
191 192 193 194
	.reg_bits = 32,
	.val_bits = 32,
	.reg_stride = 4,
	.val_format_endian = REGMAP_ENDIAN_NATIVE,
195
	.num_reg_defaults_raw = REG_SSI_SACCDIS / sizeof(uint32_t) + 1,
196 197
	.readable_reg = fsl_ssi_readable_reg,
	.volatile_reg = fsl_ssi_volatile_reg,
198
	.precious_reg = fsl_ssi_precious_reg,
199
	.writeable_reg = fsl_ssi_writeable_reg,
200
	.cache_type = REGCACHE_FLAT,
M
Markus Pargmann 已提交
201
};
202

203 204
struct fsl_ssi_soc_data {
	bool imx;
205
	bool imx21regs; /* imx21-class SSI - no SACC{ST,EN,DIS} regs */
206 207 208 209
	bool offline_config;
	u32 sisr_write_mask;
};

210
/**
211
 * fsl_ssi: per-SSI private data
212
 *
N
Nicolin Chen 已提交
213
 * @regs: Pointer to the regmap registers
214
 * @irq: IRQ of this SSI
215 216 217
 * @cpu_dai_drv: CPU DAI driver for this device
 *
 * @dai_fmt: DAI configuration this device is currently used with
218
 * @streams: Mask of current active streams: BIT(TX) and BIT(RX)
219
 * @i2s_net: I2S and Network mode configurations of SCR register
220
 * @use_dma: DMA is used or FIQ with stream filter
N
Nicolin Chen 已提交
221 222 223 224 225
 * @use_dual_fifo: DMA with support for dual FIFO mode
 * @has_ipg_clk_name: If "ipg" is in the clock name list of device tree
 * @fifo_depth: Depth of the SSI FIFOs
 * @slot_width: Width of each DAI slot
 * @slots: Number of slots
226
 * @regvals: Specific RX/TX register settings
227
 *
N
Nicolin Chen 已提交
228 229
 * @clk: Clock source to access register
 * @baudclk: Clock source to generate bit and frame-sync clocks
230 231
 * @baudclk_streams: Active streams that are using baudclk
 *
N
Nicolin Chen 已提交
232 233 234
 * @regcache_sfcsr: Cache sfcsr register value during suspend and resume
 * @regcache_sacnt: Cache sacnt register value during suspend and resume
 *
235 236 237 238 239 240
 * @dma_params_tx: DMA transmit parameters
 * @dma_params_rx: DMA receive parameters
 * @ssi_phys: physical address of the SSI registers
 *
 * @fiq_params: FIQ stream filtering parameters
 *
N
Nicolin Chen 已提交
241 242
 * @pdev: Pointer to pdev when using fsl-ssi as sound card (ppc only)
 *        TODO: Should be replaced with simple-sound-card
243 244 245
 *
 * @dbg_stats: Debugging statistics
 *
246
 * @soc: SoC specific data
N
Nicolin Chen 已提交
247 248 249 250 251 252 253
 * @dev: Pointer to &pdev->dev
 *
 * @fifo_watermark: The FIFO watermark setting. Notifies DMA when there are
 *                  @fifo_watermark or fewer words in TX fifo or
 *                  @fifo_watermark or more empty words in RX fifo.
 * @dma_maxburst: Max number of words to transfer in one go. So far,
 *                this is always the same as fifo_watermark.
254
 *
N
Nicolin Chen 已提交
255
 * @ac97_reg_lock: Mutex lock to serialize AC97 register access operations
256
 */
257
struct fsl_ssi {
M
Markus Pargmann 已提交
258
	struct regmap *regs;
259
	int irq;
260
	struct snd_soc_dai_driver cpu_dai_drv;
261

262
	unsigned int dai_fmt;
263
	u8 streams;
264
	u8 i2s_net;
265
	bool use_dma;
266
	bool use_dual_fifo;
267
	bool has_ipg_clk_name;
268
	unsigned int fifo_depth;
269 270
	unsigned int slot_width;
	unsigned int slots;
271
	struct fsl_ssi_regvals regvals[2];
272

273
	struct clk *clk;
274
	struct clk *baudclk;
275
	unsigned int baudclk_streams;
276

277
	u32 regcache_sfcsr;
278
	u32 regcache_sacnt;
279

280 281
	struct snd_dmaengine_dai_dma_data dma_params_tx;
	struct snd_dmaengine_dai_dma_data dma_params_rx;
282 283
	dma_addr_t ssi_phys;

284
	struct imx_pcm_fiq_params fiq_params;
285 286

	struct platform_device *pdev;
287

288
	struct fsl_ssi_dbg dbg_stats;
289

290
	const struct fsl_ssi_soc_data *soc;
291
	struct device *dev;
292 293 294

	u32 fifo_watermark;
	u32 dma_maxburst;
295 296

	struct mutex ac97_reg_lock;
297
};
298 299

/*
N
Nicolin Chen 已提交
300
 * SoC specific data
301
 *
N
Nicolin Chen 已提交
302 303 304 305 306 307 308 309 310 311 312
 * Notes:
 * 1) SSI in earlier SoCS has critical bits in control registers that
 *    cannot be changed after SSI starts running -- a software reset
 *    (set SSIEN to 0) is required to change their values. So adding
 *    an offline_config flag for these SoCs.
 * 2) SDMA is available since imx35. However, imx35 does not support
 *    DMA bits changing when SSI is running, so set offline_config.
 * 3) imx51 and later versions support register configurations when
 *    SSI is running (SSIEN); For these versions, DMA needs to be
 *    configured before SSI sends DMA request to avoid an undefined
 *    DMA request on the SDMA side.
313 314
 */

315 316 317
static struct fsl_ssi_soc_data fsl_ssi_mpc8610 = {
	.imx = false,
	.offline_config = true,
318
	.sisr_write_mask = SSI_SISR_RFRC | SSI_SISR_TFRC |
319 320
			   SSI_SISR_ROE0 | SSI_SISR_ROE1 |
			   SSI_SISR_TUE0 | SSI_SISR_TUE1,
321 322 323 324
};

static struct fsl_ssi_soc_data fsl_ssi_imx21 = {
	.imx = true,
325
	.imx21regs = true,
326 327 328 329 330 331 332
	.offline_config = true,
	.sisr_write_mask = 0,
};

static struct fsl_ssi_soc_data fsl_ssi_imx35 = {
	.imx = true,
	.offline_config = true,
333
	.sisr_write_mask = SSI_SISR_RFRC | SSI_SISR_TFRC |
334 335
			   SSI_SISR_ROE0 | SSI_SISR_ROE1 |
			   SSI_SISR_TUE0 | SSI_SISR_TUE1,
336 337 338 339 340
};

static struct fsl_ssi_soc_data fsl_ssi_imx51 = {
	.imx = true,
	.offline_config = false,
341
	.sisr_write_mask = SSI_SISR_ROE0 | SSI_SISR_ROE1 |
342
			   SSI_SISR_TUE0 | SSI_SISR_TUE1,
343 344 345 346 347 348 349 350 351 352 353
};

static const struct of_device_id fsl_ssi_ids[] = {
	{ .compatible = "fsl,mpc8610-ssi", .data = &fsl_ssi_mpc8610 },
	{ .compatible = "fsl,imx51-ssi", .data = &fsl_ssi_imx51 },
	{ .compatible = "fsl,imx35-ssi", .data = &fsl_ssi_imx35 },
	{ .compatible = "fsl,imx21-ssi", .data = &fsl_ssi_imx21 },
	{}
};
MODULE_DEVICE_TABLE(of, fsl_ssi_ids);

354
static bool fsl_ssi_is_ac97(struct fsl_ssi *ssi)
355
{
356
	return (ssi->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) ==
357
		SND_SOC_DAIFMT_AC97;
358 359
}

360
static bool fsl_ssi_is_i2s_master(struct fsl_ssi *ssi)
361
{
362
	return (ssi->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) ==
363 364 365
		SND_SOC_DAIFMT_CBS_CFS;
}

366
static bool fsl_ssi_is_i2s_cbm_cfs(struct fsl_ssi *ssi)
367
{
368
	return (ssi->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) ==
369 370
		SND_SOC_DAIFMT_CBM_CFS;
}
N
Nicolin Chen 已提交
371

372
/**
N
Nicolin Chen 已提交
373
 * Interrupt handler to gather states
374 375 376
 */
static irqreturn_t fsl_ssi_isr(int irq, void *dev_id)
{
377 378
	struct fsl_ssi *ssi = dev_id;
	struct regmap *regs = ssi->regs;
379
	__be32 sisr;
380
	__be32 sisr2;
381

382
	regmap_read(regs, REG_SSI_SISR, &sisr);
383

384
	sisr2 = sisr & ssi->soc->sisr_write_mask;
385 386
	/* Clear the bits that we set */
	if (sisr2)
387
		regmap_write(regs, REG_SSI_SISR, sisr2);
388

389
	fsl_ssi_dbg_isr(&ssi->dbg_stats, sisr);
390

391
	return IRQ_HANDLED;
392 393
}

N
Nicolin Chen 已提交
394
/**
395 396 397 398 399 400
 * Set SCR, SIER, STCR and SRCR registers with cached values in regvals
 *
 * Notes:
 * 1) For offline_config SoCs, enable all necessary bits of both streams
 *    when 1st stream starts, even if the opposite stream will not start
 * 2) It also clears FIFO before setting regvals; SOR is safe to set online
401
 */
402
static void fsl_ssi_config_enable(struct fsl_ssi *ssi, bool tx)
403
{
404
	struct fsl_ssi_regvals *vals = ssi->regvals;
405 406
	int dir = tx ? TX : RX;
	u32 sier, srcr, stcr;
407

408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427
	/* Clear dirty data in the FIFO; It also prevents channel slipping */
	regmap_update_bits(ssi->regs, REG_SSI_SOR,
			   SSI_SOR_xX_CLR(tx), SSI_SOR_xX_CLR(tx));

	/*
	 * On offline_config SoCs, SxCR and SIER are already configured when
	 * the previous stream started. So skip all SxCR and SIER settings
	 * to prevent online reconfigurations, then jump to set SCR directly
	 */
	if (ssi->soc->offline_config && ssi->streams)
		goto enable_scr;

	if (ssi->soc->offline_config) {
		/*
		 * Online reconfiguration not supported, so enable all bits for
		 * both streams at once to avoid necessity of reconfigurations
		 */
		srcr = vals[RX].srcr | vals[TX].srcr;
		stcr = vals[RX].stcr | vals[TX].stcr;
		sier = vals[RX].sier | vals[TX].sier;
428
	} else {
429 430 431 432
		/* Otherwise, only set bits for the current stream */
		srcr = vals[dir].srcr;
		stcr = vals[dir].stcr;
		sier = vals[dir].sier;
433
	}
434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471

	/* Configure SRCR, STCR and SIER at once */
	regmap_update_bits(ssi->regs, REG_SSI_SRCR, srcr, srcr);
	regmap_update_bits(ssi->regs, REG_SSI_STCR, stcr, stcr);
	regmap_update_bits(ssi->regs, REG_SSI_SIER, sier, sier);

enable_scr:
	/*
	 * Start DMA before setting TE to avoid FIFO underrun
	 * which may cause a channel slip or a channel swap
	 *
	 * TODO: FIQ cases might also need this upon testing
	 */
	if (ssi->use_dma && tx) {
		int try = 100;
		u32 sfcsr;

		/* Enable SSI first to send TX DMA request */
		regmap_update_bits(ssi->regs, REG_SSI_SCR,
				   SSI_SCR_SSIEN, SSI_SCR_SSIEN);

		/* Busy wait until TX FIFO not empty -- DMA working */
		do {
			regmap_read(ssi->regs, REG_SSI_SFCSR, &sfcsr);
			if (SSI_SFCSR_TFCNT0(sfcsr))
				break;
		} while (--try);

		/* FIFO still empty -- something might be wrong */
		if (!SSI_SFCSR_TFCNT0(sfcsr))
			dev_warn(ssi->dev, "Timeout waiting TX FIFO filling\n");
	}
	/* Enable all remaining bits in SCR */
	regmap_update_bits(ssi->regs, REG_SSI_SCR,
			   vals[dir].scr, vals[dir].scr);

	/* Log the enabled stream to the mask */
	ssi->streams |= BIT(dir);
472 473
}

N
Nicolin Chen 已提交
474
/**
475
 * Exclude bits that are used by the opposite stream
476
 *
477 478
 * When both streams are active, disabling some bits for the current stream
 * might break the other stream if these bits are used by it.
479
 *
480 481 482
 * @vals : regvals of the current stream
 * @avals: regvals of the opposite stream
 * @aactive: active state of the opposite stream
483
 *
484 485 486
 *  1) XOR vals and avals to get the differences if the other stream is active;
 *     Otherwise, return current vals if the other stream is not active
 *  2) AND the result of 1) with the current vals
487
 */
488 489 490 491 492
#define _ssi_xor_shared_bits(vals, avals, aactive) \
	((vals) ^ ((avals) * (aactive)))

#define ssi_excl_shared_bits(vals, avals, aactive) \
	((vals) & _ssi_xor_shared_bits(vals, avals, aactive))
493

N
Nicolin Chen 已提交
494
/**
495 496 497 498 499 500
 * Unset SCR, SIER, STCR and SRCR registers with cached values in regvals
 *
 * Notes:
 * 1) For offline_config SoCs, to avoid online reconfigurations, disable all
 *    bits of both streams at once when the last stream is abort to end
 * 2) It also clears FIFO after unsetting regvals; SOR is safe to set online
501
 */
502
static void fsl_ssi_config_disable(struct fsl_ssi *ssi, bool tx)
503
{
504 505
	struct fsl_ssi_regvals *vals, *avals;
	u32 sier, srcr, stcr, scr;
506 507
	int adir = tx ? RX : TX;
	int dir = tx ? TX : RX;
508
	bool aactive;
M
Markus Pargmann 已提交
509

510 511
	/* Check if the opposite stream is active */
	aactive = ssi->streams & BIT(adir);
512

513
	vals = &ssi->regvals[dir];
514

515 516
	/* Get regvals of the opposite stream to keep opposite stream safe */
	avals = &ssi->regvals[adir];
517 518

	/*
519 520
	 * To keep the other stream safe, exclude shared bits between
	 * both streams, and get safe bits to disable current stream
521
	 */
522
	scr = ssi_excl_shared_bits(vals->scr, avals->scr, aactive);
523

524 525
	/* Disable safe bits of SCR register for the current stream */
	regmap_update_bits(ssi->regs, REG_SSI_SCR, scr, 0);
526

527 528
	/* Log the disabled stream to the mask */
	ssi->streams &= ~BIT(dir);
529

530 531 532 533 534 535
	/*
	 * On offline_config SoCs, if the other stream is active, skip
	 * SxCR and SIER settings to prevent online reconfigurations
	 */
	if (ssi->soc->offline_config && aactive)
		goto fifo_clear;
536

537 538 539 540 541 542
	if (ssi->soc->offline_config) {
		/* Now there is only current stream active, disable all bits */
		srcr = vals->srcr | avals->srcr;
		stcr = vals->stcr | avals->stcr;
		sier = vals->sier | avals->sier;
	} else {
543
		/*
N
Nicolin Chen 已提交
544 545
		 * To keep the other stream safe, exclude shared bits between
		 * both streams, and get safe bits to disable current stream
546
		 */
547 548 549
		sier = ssi_excl_shared_bits(vals->sier, avals->sier, aactive);
		srcr = ssi_excl_shared_bits(vals->srcr, avals->srcr, aactive);
		stcr = ssi_excl_shared_bits(vals->stcr, avals->stcr, aactive);
550 551
	}

552 553 554 555
	/* Clear configurations of SRCR, STCR and SIER at once */
	regmap_update_bits(ssi->regs, REG_SSI_SRCR, srcr, 0);
	regmap_update_bits(ssi->regs, REG_SSI_STCR, stcr, 0);
	regmap_update_bits(ssi->regs, REG_SSI_SIER, sier, 0);
556

557 558 559 560
fifo_clear:
	/* Clear remaining data in the FIFO */
	regmap_update_bits(ssi->regs, REG_SSI_SOR,
			   SSI_SOR_xX_CLR(tx), SSI_SOR_xX_CLR(tx));
561 562
}

563
static void fsl_ssi_tx_ac97_saccst_setup(struct fsl_ssi *ssi)
564
{
565
	struct regmap *regs = ssi->regs;
566 567

	/* no SACC{ST,EN,DIS} regs on imx21-class SSI */
568
	if (!ssi->soc->imx21regs) {
N
Nicolin Chen 已提交
569
		/* Disable all channel slots */
570
		regmap_write(regs, REG_SSI_SACCDIS, 0xff);
N
Nicolin Chen 已提交
571
		/* Enable slots 3 & 4 -- PCM Playback Left & Right channels */
572
		regmap_write(regs, REG_SSI_SACCEN, 0x300);
573 574 575
	}
}

N
Nicolin Chen 已提交
576 577
/**
 * Cache critical bits of SIER, SRCR, STCR and SCR to later set them safely
578
 */
579
static void fsl_ssi_setup_regvals(struct fsl_ssi *ssi)
580
{
581
	struct fsl_ssi_regvals *vals = ssi->regvals;
582

583
	vals[RX].sier = SSI_SIER_RFF0_EN | FSLSSI_SIER_DBG_RX_FLAGS;
584
	vals[RX].srcr = SSI_SRCR_RFEN0;
585 586
	vals[RX].scr = SSI_SCR_SSIEN | SSI_SCR_RE;
	vals[TX].sier = SSI_SIER_TFE0_EN | FSLSSI_SIER_DBG_TX_FLAGS;
587
	vals[TX].stcr = SSI_STCR_TFEN0;
588
	vals[TX].scr = SSI_SCR_SSIEN | SSI_SCR_TE;
589

N
Nicolin Chen 已提交
590
	/* AC97 has already enabled SSIEN, RE and TE, so ignore them */
591 592
	if (fsl_ssi_is_ac97(ssi))
		vals[RX].scr = vals[TX].scr = 0;
593

594 595 596 597 598
	if (ssi->use_dual_fifo) {
		vals[RX].srcr |= SSI_SRCR_RFEN1;
		vals[TX].stcr |= SSI_STCR_TFEN1;
	}

599
	if (ssi->use_dma) {
600 601
		vals[RX].sier |= SSI_SIER_RDMAE;
		vals[TX].sier |= SSI_SIER_TDMAE;
602
	} else {
603 604
		vals[RX].sier |= SSI_SIER_RIE;
		vals[TX].sier |= SSI_SIER_TIE;
605 606 607
	}
}

608
static void fsl_ssi_setup_ac97(struct fsl_ssi *ssi)
609
{
610
	struct regmap *regs = ssi->regs;
611

N
Nicolin Chen 已提交
612
	/* Setup the clock control register */
613 614
	regmap_write(regs, REG_SSI_STCCR, SSI_SxCCR_WL(17) | SSI_SxCCR_DC(13));
	regmap_write(regs, REG_SSI_SRCCR, SSI_SxCCR_WL(17) | SSI_SxCCR_DC(13));
615

N
Nicolin Chen 已提交
616
	/* Enable AC97 mode and startup the SSI */
617
	regmap_write(regs, REG_SSI_SACNT, SSI_SACNT_AC97EN | SSI_SACNT_FV);
618

N
Nicolin Chen 已提交
619
	/* AC97 has to communicate with codec before starting a stream */
620
	regmap_update_bits(regs, REG_SSI_SCR,
621 622
			   SSI_SCR_SSIEN | SSI_SCR_TE | SSI_SCR_RE,
			   SSI_SCR_SSIEN | SSI_SCR_TE | SSI_SCR_RE);
623

624
	regmap_write(regs, REG_SSI_SOR, SSI_SOR_WAIT(3));
625 626
}

627 628
static int fsl_ssi_startup(struct snd_pcm_substream *substream,
			   struct snd_soc_dai *dai)
629 630
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
631
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
632 633
	int ret;

634
	ret = clk_prepare_enable(ssi->clk);
635 636
	if (ret)
		return ret;
637

N
Nicolin Chen 已提交
638 639
	/*
	 * When using dual fifo mode, it is safer to ensure an even period
640 641 642 643
	 * size. If appearing to an odd number while DMA always starts its
	 * task from fifo0, fifo1 would be neglected at the end of each
	 * period. But SSI would still access fifo1 with an invalid data.
	 */
644
	if (ssi->use_dual_fifo)
645
		snd_pcm_hw_constraint_step(substream->runtime, 0,
646
					   SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 2);
647

648 649 650
	return 0;
}

651
static void fsl_ssi_shutdown(struct snd_pcm_substream *substream,
652
			     struct snd_soc_dai *dai)
653 654
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
655
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
656

657
	clk_disable_unprepare(ssi->clk);
658 659
}

660
/**
N
Nicolin Chen 已提交
661
 * Configure Digital Audio Interface bit clock
662 663 664 665
 *
 * Note: This function can be only called when using SSI as DAI master
 *
 * Quick instruction for parameters:
666 667
 * freq: Output BCLK frequency = samplerate * slots * slot_width
 *       (In 2-channel I2S Master mode, slot_width is fixed 32)
668
 */
669
static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,
670
			    struct snd_soc_dai *dai,
671
			    struct snd_pcm_hw_params *hw_params)
672
{
673
	bool tx2, tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
674
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
675 676
	struct regmap *regs = ssi->regs;
	int synchronous = ssi->cpu_dai_drv.symmetric_rates, ret;
677
	u32 pm = 999, div2, psr, stccr, mask, afreq, factor, i;
678
	unsigned long clkrate, baudrate, tmprate;
679 680
	unsigned int slots = params_channels(hw_params);
	unsigned int slot_width = 32;
681
	u64 sub, savesub = 100000;
682
	unsigned int freq;
683
	bool baudclk_is_used;
684

685
	/* Override slots and slot_width if being specifically set... */
686 687
	if (ssi->slots)
		slots = ssi->slots;
688
	/* ...but keep 32 bits if slots is 2 -- I2S Master mode */
689 690
	if (ssi->slot_width && slots != 2)
		slot_width = ssi->slot_width;
691 692 693

	/* Generate bit clock based on the slot number and slot width */
	freq = slots * slot_width * params_rate(hw_params);
694 695

	/* Don't apply it to any non-baudclk circumstance */
696
	if (IS_ERR(ssi->baudclk))
697 698
		return -EINVAL;

699 700 701 702
	/*
	 * Hardware limitation: The bclk rate must be
	 * never greater than 1/5 IPG clock rate
	 */
703
	if (freq * 5 > clk_get_rate(ssi->clk)) {
704
		dev_err(dai->dev, "bitclk > ipgclk / 5\n");
705 706 707
		return -EINVAL;
	}

708
	baudclk_is_used = ssi->baudclk_streams & ~(BIT(substream->stream));
709

710 711 712 713 714 715 716
	/* It should be already enough to divide clock by setting pm alone */
	psr = 0;
	div2 = 0;

	factor = (div2 + 1) * (7 * psr + 1) * 2;

	for (i = 0; i < 255; i++) {
717
		tmprate = freq * factor * (i + 1);
718 719

		if (baudclk_is_used)
720
			clkrate = clk_get_rate(ssi->baudclk);
721
		else
722
			clkrate = clk_round_rate(ssi->baudclk, tmprate);
723

724 725
		clkrate /= factor;
		afreq = clkrate / (i + 1);
726 727 728 729 730 731 732 733 734 735 736 737 738 739

		if (freq == afreq)
			sub = 0;
		else if (freq / afreq == 1)
			sub = freq - afreq;
		else if (afreq / freq == 1)
			sub = afreq - freq;
		else
			continue;

		/* Calculate the fraction */
		sub *= 100000;
		do_div(sub, freq);

740
		if (sub < savesub && !(i == 0 && psr == 0 && div2 == 0)) {
741 742 743 744 745 746 747 748 749 750 751 752
			baudrate = tmprate;
			savesub = sub;
			pm = i;
		}

		/* We are lucky */
		if (savesub == 0)
			break;
	}

	/* No proper pm found if it is still remaining the initial value */
	if (pm == 999) {
753
		dev_err(dai->dev, "failed to handle the required sysclk\n");
754 755 756
		return -EINVAL;
	}

757 758
	stccr = SSI_SxCCR_PM(pm + 1) | (div2 ? SSI_SxCCR_DIV2 : 0) |
		(psr ? SSI_SxCCR_PSR : 0);
759
	mask = SSI_SxCCR_PM_MASK | SSI_SxCCR_DIV2 | SSI_SxCCR_PSR;
760

761 762 763
	/* STCCR is used for RX in synchronous mode */
	tx2 = tx || synchronous;
	regmap_update_bits(regs, REG_SSI_SxCCR(tx2), mask, stccr);
764

765
	if (!baudclk_is_used) {
766
		ret = clk_set_rate(ssi->baudclk, baudrate);
767
		if (ret) {
768
			dev_err(dai->dev, "failed to set baudclk rate\n");
769 770 771 772 773 774 775
			return -EINVAL;
		}
	}

	return 0;
}

776
/**
N
Nicolin Chen 已提交
777
 * Configure SSI based on PCM hardware parameters
778
 *
N
Nicolin Chen 已提交
779 780 781 782 783 784 785
 * Notes:
 * 1) SxCCR.WL bits are critical bits that require SSI to be temporarily
 *    disabled on offline_config SoCs. Even for online configurable SoCs
 *    running in synchronous mode (both TX and RX use STCCR), it is not
 *    safe to re-configure them when both two streams start running.
 * 2) SxCCR.PM, SxCCR.DIV2 and SxCCR.PSR bits will be configured in the
 *    fsl_ssi_set_bclk() if SSI is the DAI clock master.
786
 */
787
static int fsl_ssi_hw_params(struct snd_pcm_substream *substream,
788
			     struct snd_pcm_hw_params *hw_params,
789
			     struct snd_soc_dai *dai)
790
{
791
	bool tx2, tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
792
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
793
	struct regmap *regs = ssi->regs;
794
	unsigned int channels = params_channels(hw_params);
795
	unsigned int sample_size = params_width(hw_params);
796
	u32 wl = SSI_SxCCR_WL(sample_size);
797
	int ret;
798
	u32 scr;
M
Markus Pargmann 已提交
799 800
	int enabled;

801 802
	regmap_read(regs, REG_SSI_SCR, &scr);
	enabled = scr & SSI_SCR_SSIEN;
803

804
	/*
N
Nicolin Chen 已提交
805 806 807 808
	 * SSI is properly configured if it is enabled and running in
	 * the synchronous mode; Note that AC97 mode is an exception
	 * that should set separate configurations for STCCR and SRCCR
	 * despite running in the synchronous mode.
809
	 */
810
	if (enabled && ssi->cpu_dai_drv.symmetric_rates)
811
		return 0;
812

813
	if (fsl_ssi_is_i2s_master(ssi)) {
814
		ret = fsl_ssi_set_bclk(substream, dai, hw_params);
815 816
		if (ret)
			return ret;
817 818

		/* Do not enable the clock if it is already enabled */
819 820
		if (!(ssi->baudclk_streams & BIT(substream->stream))) {
			ret = clk_prepare_enable(ssi->baudclk);
821 822 823
			if (ret)
				return ret;

824
			ssi->baudclk_streams |= BIT(substream->stream);
825
		}
826 827
	}

828
	if (!fsl_ssi_is_ac97(ssi)) {
N
Nicolin Chen 已提交
829
		/* Normal + Network mode to send 16-bit data in 32-bit frames */
830
		if (fsl_ssi_is_i2s_cbm_cfs(ssi) && sample_size == 16)
831 832 833 834 835
			ssi->i2s_net = SSI_SCR_I2S_MODE_NORMAL | SSI_SCR_NET;

		/* Use Normal mode to send mono data at 1st slot of 2 slots */
		if (channels == 1)
			ssi->i2s_net = SSI_SCR_I2S_MODE_NORMAL;
836

837
		regmap_update_bits(regs, REG_SSI_SCR,
838
				   SSI_SCR_I2S_NET_MASK, ssi->i2s_net);
839 840
	}

841
	/* In synchronous mode, the SSI uses STCCR for capture */
842 843
	tx2 = tx || ssi->cpu_dai_drv.symmetric_rates;
	regmap_update_bits(regs, REG_SSI_SxCCR(tx2), SSI_SxCCR_WL_MASK, wl);
844 845 846 847

	return 0;
}

848
static int fsl_ssi_hw_free(struct snd_pcm_substream *substream,
849
			   struct snd_soc_dai *dai)
850 851
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
852
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
853

854
	if (fsl_ssi_is_i2s_master(ssi) &&
855
	    ssi->baudclk_streams & BIT(substream->stream)) {
856 857
		clk_disable_unprepare(ssi->baudclk);
		ssi->baudclk_streams &= ~BIT(substream->stream);
858 859 860 861 862
	}

	return 0;
}

863
static int _fsl_ssi_set_dai_fmt(struct fsl_ssi *ssi, unsigned int fmt)
864
{
865
	u32 strcr = 0, scr = 0, stcr, srcr, mask;
866

867
	ssi->dai_fmt = fmt;
868

N
Nicolin Chen 已提交
869
	/* Synchronize frame sync clock for TE to avoid data slipping */
870
	scr |= SSI_SCR_SYNC_TX_FS;
871

872 873
	/* Set to default shifting settings: LSB_ALIGNED */
	strcr |= SSI_STCR_TXBIT0;
874

N
Nicolin Chen 已提交
875
	/* Use Network mode as default */
876
	ssi->i2s_net = SSI_SCR_NET;
877 878 879 880
	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
	case SND_SOC_DAIFMT_I2S:
		switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
		case SND_SOC_DAIFMT_CBS_CFS:
881 882 883 884 885 886 887
			if (IS_ERR(ssi->baudclk)) {
				dev_err(ssi->dev,
					"missing baudclk for master mode\n");
				return -EINVAL;
			}
			/* fall through */
		case SND_SOC_DAIFMT_CBM_CFS:
888
			ssi->i2s_net |= SSI_SCR_I2S_MODE_MASTER;
889 890
			break;
		case SND_SOC_DAIFMT_CBM_CFM:
891
			ssi->i2s_net |= SSI_SCR_I2S_MODE_SLAVE;
892 893 894 895 896
			break;
		default:
			return -EINVAL;
		}

897 898 899 900 901
		regmap_update_bits(ssi->regs, REG_SSI_STCCR,
				   SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(2));
		regmap_update_bits(ssi->regs, REG_SSI_SRCCR,
				   SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(2));

902
		/* Data on rising edge of bclk, frame low, 1clk before data */
903
		strcr |= SSI_STCR_TFSI | SSI_STCR_TSCKP | SSI_STCR_TEFS;
904 905 906
		break;
	case SND_SOC_DAIFMT_LEFT_J:
		/* Data on rising edge of bclk, frame high */
907
		strcr |= SSI_STCR_TSCKP;
908 909 910
		break;
	case SND_SOC_DAIFMT_DSP_A:
		/* Data on rising edge of bclk, frame high, 1clk before data */
911
		strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP | SSI_STCR_TEFS;
912 913 914
		break;
	case SND_SOC_DAIFMT_DSP_B:
		/* Data on rising edge of bclk, frame high */
915
		strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP;
916
		break;
917
	case SND_SOC_DAIFMT_AC97:
N
Nicolin Chen 已提交
918
		/* Data on falling edge of bclk, frame high, 1clk before data */
919
		strcr |= SSI_STCR_TEFS;
920
		break;
921 922 923
	default:
		return -EINVAL;
	}
924

925
	scr |= ssi->i2s_net;
926 927 928 929 930 931 932 933

	/* DAI clock inversion */
	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
	case SND_SOC_DAIFMT_NB_NF:
		/* Nothing to do for both normal cases */
		break;
	case SND_SOC_DAIFMT_IB_NF:
		/* Invert bit clock */
934
		strcr ^= SSI_STCR_TSCKP;
935 936 937
		break;
	case SND_SOC_DAIFMT_NB_IF:
		/* Invert frame clock */
938
		strcr ^= SSI_STCR_TFSI;
939 940 941
		break;
	case SND_SOC_DAIFMT_IB_IF:
		/* Invert both clocks */
942 943
		strcr ^= SSI_STCR_TSCKP;
		strcr ^= SSI_STCR_TFSI;
944 945 946 947 948 949 950 951
		break;
	default:
		return -EINVAL;
	}

	/* DAI clock master masks */
	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
	case SND_SOC_DAIFMT_CBS_CFS:
N
Nicolin Chen 已提交
952
		/* Output bit and frame sync clocks */
953 954
		strcr |= SSI_STCR_TFDIR | SSI_STCR_TXDIR;
		scr |= SSI_SCR_SYS_CLK_EN;
955 956
		break;
	case SND_SOC_DAIFMT_CBM_CFM:
N
Nicolin Chen 已提交
957
		/* Input bit or frame sync clocks */
958
		break;
959
	case SND_SOC_DAIFMT_CBM_CFS:
N
Nicolin Chen 已提交
960
		/* Input bit clock but output frame sync clock */
961
		strcr |= SSI_STCR_TFDIR;
962
		break;
963
	default:
964
		return -EINVAL;
965 966
	}

967 968
	stcr = strcr;
	srcr = strcr;
969

N
Nicolin Chen 已提交
970
	/* Set SYN mode and clear RXDIR bit when using SYN or AC97 mode */
971
	if (ssi->cpu_dai_drv.symmetric_rates || fsl_ssi_is_ac97(ssi)) {
972 973
		srcr &= ~SSI_SRCR_RXDIR;
		scr |= SSI_SCR_SYN;
974 975
	}

976 977 978 979 980 981 982 983 984
	mask = SSI_STCR_TFDIR | SSI_STCR_TXDIR | SSI_STCR_TSCKP |
	       SSI_STCR_TFSL | SSI_STCR_TFSI | SSI_STCR_TEFS | SSI_STCR_TXBIT0;

	regmap_update_bits(ssi->regs, REG_SSI_STCR, mask, stcr);
	regmap_update_bits(ssi->regs, REG_SSI_SRCR, mask, srcr);

	mask = SSI_SCR_SYNC_TX_FS | SSI_SCR_I2S_MODE_MASK |
	       SSI_SCR_SYS_CLK_EN | SSI_SCR_SYN;
	regmap_update_bits(ssi->regs, REG_SSI_SCR, mask, scr);
985 986

	return 0;
987 988 989
}

/**
N
Nicolin Chen 已提交
990
 * Configure Digital Audio Interface (DAI) Format
991
 */
992
static int fsl_ssi_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
993
{
994
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
995

N
Nicolin Chen 已提交
996
	/* AC97 configured DAIFMT earlier in the probe() */
997
	if (fsl_ssi_is_ac97(ssi))
998 999
		return 0;

1000
	return _fsl_ssi_set_dai_fmt(ssi, fmt);
1001 1002 1003
}

/**
N
Nicolin Chen 已提交
1004
 * Set TDM slot number and slot width
1005
 */
1006
static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask,
1007
				    u32 rx_mask, int slots, int slot_width)
1008
{
1009
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1010
	struct regmap *regs = ssi->regs;
1011 1012
	u32 val;

1013 1014
	/* The word length should be 8, 10, 12, 16, 18, 20, 22 or 24 */
	if (slot_width & 1 || slot_width < 8 || slot_width > 24) {
1015
		dev_err(dai->dev, "invalid slot width: %d\n", slot_width);
1016 1017 1018
		return -EINVAL;
	}

1019
	/* The slot number should be >= 2 if using Network mode or I2S mode */
1020
	if (ssi->i2s_net && slots < 2) {
1021
		dev_err(dai->dev, "slot number should be >= 2 in I2S or NET\n");
1022 1023 1024
		return -EINVAL;
	}

1025 1026 1027 1028
	regmap_update_bits(regs, REG_SSI_STCCR,
			   SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(slots));
	regmap_update_bits(regs, REG_SSI_SRCCR,
			   SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(slots));
1029

1030
	/* Save the SCR register value */
1031
	regmap_read(regs, REG_SSI_SCR, &val);
N
Nicolin Chen 已提交
1032
	/* Temporarily enable SSI to allow SxMSKs to be configurable */
1033
	regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, SSI_SCR_SSIEN);
1034

1035 1036
	regmap_write(regs, REG_SSI_STMSK, ~tx_mask);
	regmap_write(regs, REG_SSI_SRMSK, ~rx_mask);
1037

N
Nicolin Chen 已提交
1038
	/* Restore the value of SSIEN bit */
1039
	regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, val);
1040

1041 1042
	ssi->slot_width = slot_width;
	ssi->slots = slots;
1043

1044 1045 1046
	return 0;
}

1047
/**
N
Nicolin Chen 已提交
1048
 * Start or stop SSI and corresponding DMA transaction.
1049 1050 1051 1052
 *
 * The DMA channel is in external master start and pause mode, which
 * means the SSI completely controls the flow of data.
 */
1053 1054
static int fsl_ssi_trigger(struct snd_pcm_substream *substream, int cmd,
			   struct snd_soc_dai *dai)
1055 1056
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
1057
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
1058
	bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
1059

1060 1061
	switch (cmd) {
	case SNDRV_PCM_TRIGGER_START:
1062
	case SNDRV_PCM_TRIGGER_RESUME:
1063
	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1064 1065 1066 1067 1068 1069 1070 1071 1072 1073
		/*
		 * SACCST might be modified via AC Link by a CODEC if it sends
		 * extra bits in their SLOTREQ requests, which'll accidentally
		 * send valid data to slots other than normal playback slots.
		 *
		 * To be safe, configure SACCST right before TX starts.
		 */
		if (tx && fsl_ssi_is_ac97(ssi))
			fsl_ssi_tx_ac97_saccst_setup(ssi);
		fsl_ssi_config_enable(ssi, tx);
1074 1075 1076
		break;

	case SNDRV_PCM_TRIGGER_STOP:
1077
	case SNDRV_PCM_TRIGGER_SUSPEND:
1078
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1079
		fsl_ssi_config_disable(ssi, tx);
1080 1081 1082 1083 1084 1085 1086 1087 1088
		break;

	default:
		return -EINVAL;
	}

	return 0;
}

1089 1090
static int fsl_ssi_dai_probe(struct snd_soc_dai *dai)
{
1091
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1092

1093 1094 1095
	if (ssi->soc->imx && ssi->use_dma)
		snd_soc_dai_init_dma_data(dai, &ssi->dma_params_tx,
					  &ssi->dma_params_rx);
1096 1097 1098 1099

	return 0;
}

1100
static const struct snd_soc_dai_ops fsl_ssi_dai_ops = {
1101 1102 1103 1104 1105 1106 1107
	.startup = fsl_ssi_startup,
	.shutdown = fsl_ssi_shutdown,
	.hw_params = fsl_ssi_hw_params,
	.hw_free = fsl_ssi_hw_free,
	.set_fmt = fsl_ssi_set_dai_fmt,
	.set_tdm_slot = fsl_ssi_set_dai_tdm_slot,
	.trigger = fsl_ssi_trigger,
1108 1109
};

1110
static struct snd_soc_dai_driver fsl_ssi_dai_template = {
1111
	.probe = fsl_ssi_dai_probe,
1112
	.playback = {
1113
		.stream_name = "CPU-Playback",
1114
		.channels_min = 1,
1115
		.channels_max = 32,
1116
		.rates = SNDRV_PCM_RATE_CONTINUOUS,
1117 1118 1119
		.formats = FSLSSI_I2S_FORMATS,
	},
	.capture = {
1120
		.stream_name = "CPU-Capture",
1121
		.channels_min = 1,
1122
		.channels_max = 32,
1123
		.rates = SNDRV_PCM_RATE_CONTINUOUS,
1124 1125
		.formats = FSLSSI_I2S_FORMATS,
	},
1126
	.ops = &fsl_ssi_dai_ops,
1127 1128
};

1129
static const struct snd_soc_component_driver fsl_ssi_component = {
1130
	.name = "fsl-ssi",
1131 1132
};

1133
static struct snd_soc_dai_driver fsl_ssi_ac97_dai = {
1134
	.bus_control = true,
1135
	.probe = fsl_ssi_dai_probe,
1136 1137 1138 1139 1140
	.playback = {
		.stream_name = "AC97 Playback",
		.channels_min = 2,
		.channels_max = 2,
		.rates = SNDRV_PCM_RATE_8000_48000,
1141
		.formats = SNDRV_PCM_FMTBIT_S16 | SNDRV_PCM_FMTBIT_S20,
1142 1143 1144 1145 1146 1147
	},
	.capture = {
		.stream_name = "AC97 Capture",
		.channels_min = 2,
		.channels_max = 2,
		.rates = SNDRV_PCM_RATE_48000,
1148 1149
		/* 16-bit capture is broken (errata ERR003778) */
		.formats = SNDRV_PCM_FMTBIT_S20,
1150
	},
1151
	.ops = &fsl_ssi_dai_ops,
1152 1153
};

1154
static struct fsl_ssi *fsl_ac97_data;
1155

1156
static void fsl_ssi_ac97_write(struct snd_ac97 *ac97, unsigned short reg,
1157
			       unsigned short val)
1158
{
M
Markus Pargmann 已提交
1159
	struct regmap *regs = fsl_ac97_data->regs;
1160 1161
	unsigned int lreg;
	unsigned int lval;
1162
	int ret;
1163 1164 1165 1166

	if (reg > 0x7f)
		return;

1167 1168
	mutex_lock(&fsl_ac97_data->ac97_reg_lock);

1169 1170 1171 1172
	ret = clk_prepare_enable(fsl_ac97_data->clk);
	if (ret) {
		pr_err("ac97 write clk_prepare_enable failed: %d\n",
			ret);
1173
		goto ret_unlock;
1174
	}
1175 1176

	lreg = reg <<  12;
1177
	regmap_write(regs, REG_SSI_SACADD, lreg);
1178 1179

	lval = val << 4;
1180
	regmap_write(regs, REG_SSI_SACDAT, lval);
1181

1182 1183
	regmap_update_bits(regs, REG_SSI_SACNT,
			   SSI_SACNT_RDWR_MASK, SSI_SACNT_WR);
1184
	udelay(100);
1185 1186

	clk_disable_unprepare(fsl_ac97_data->clk);
1187 1188 1189

ret_unlock:
	mutex_unlock(&fsl_ac97_data->ac97_reg_lock);
1190 1191
}

1192
static unsigned short fsl_ssi_ac97_read(struct snd_ac97 *ac97,
1193
					unsigned short reg)
1194
{
M
Markus Pargmann 已提交
1195
	struct regmap *regs = fsl_ac97_data->regs;
1196
	unsigned short val = 0;
M
Markus Pargmann 已提交
1197
	u32 reg_val;
1198
	unsigned int lreg;
1199 1200
	int ret;

1201 1202
	mutex_lock(&fsl_ac97_data->ac97_reg_lock);

1203 1204
	ret = clk_prepare_enable(fsl_ac97_data->clk);
	if (ret) {
1205
		pr_err("ac97 read clk_prepare_enable failed: %d\n", ret);
1206
		goto ret_unlock;
1207
	}
1208 1209

	lreg = (reg & 0x7f) <<  12;
1210
	regmap_write(regs, REG_SSI_SACADD, lreg);
1211 1212
	regmap_update_bits(regs, REG_SSI_SACNT,
			   SSI_SACNT_RDWR_MASK, SSI_SACNT_RD);
1213 1214 1215

	udelay(100);

1216
	regmap_read(regs, REG_SSI_SACDAT, &reg_val);
M
Markus Pargmann 已提交
1217
	val = (reg_val >> 4) & 0xffff;
1218

1219 1220
	clk_disable_unprepare(fsl_ac97_data->clk);

1221 1222
ret_unlock:
	mutex_unlock(&fsl_ac97_data->ac97_reg_lock);
1223 1224 1225 1226
	return val;
}

static struct snd_ac97_bus_ops fsl_ssi_ac97_ops = {
1227 1228
	.read = fsl_ssi_ac97_read,
	.write = fsl_ssi_ac97_write,
1229 1230
};

1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250
/**
 * Initialize SSI registers
 */
static int fsl_ssi_hw_init(struct fsl_ssi *ssi)
{
	u32 wm = ssi->fifo_watermark;

	/* Initialize regvals */
	fsl_ssi_setup_regvals(ssi);

	/* Set watermarks */
	regmap_write(ssi->regs, REG_SSI_SFCSR,
		     SSI_SFCSR_TFWM0(wm) | SSI_SFCSR_RFWM0(wm) |
		     SSI_SFCSR_TFWM1(wm) | SSI_SFCSR_RFWM1(wm));

	/* Enable Dual FIFO mode */
	if (ssi->use_dual_fifo)
		regmap_update_bits(ssi->regs, REG_SSI_SCR,
				   SSI_SCR_TCH_EN, SSI_SCR_TCH_EN);

1251 1252
	/* AC97 should start earlier to communicate with CODECs */
	if (fsl_ssi_is_ac97(ssi)) {
1253
		_fsl_ssi_set_dai_fmt(ssi, ssi->dai_fmt);
1254 1255 1256
		fsl_ssi_setup_ac97(ssi);
	}

1257 1258 1259
	return 0;
}

1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277
/**
 * Clear SSI registers
 */
static void fsl_ssi_hw_clean(struct fsl_ssi *ssi)
{
	/* Disable registers for AC97 */
	if (fsl_ssi_is_ac97(ssi)) {
		/* Disable TE and RE bits first */
		regmap_update_bits(ssi->regs, REG_SSI_SCR,
				   SSI_SCR_TE | SSI_SCR_RE, 0);
		/* Disable AC97 mode */
		regmap_write(ssi->regs, REG_SSI_SACNT, 0);
		/* Unset WAIT bits */
		regmap_write(ssi->regs, REG_SSI_SOR, 0);
		/* Disable SSI -- software reset */
		regmap_update_bits(ssi->regs, REG_SSI_SCR, SSI_SCR_SSIEN, 0);
	}
}
1278
/**
1279
 * Make every character in a string lower-case
1280
 */
1281 1282
static void make_lowercase(char *s)
{
1283 1284 1285 1286
	if (!s)
		return;
	for (; *s; s++)
		*s = tolower(*s);
1287 1288
}

1289
static int fsl_ssi_imx_probe(struct platform_device *pdev,
1290
			     struct fsl_ssi *ssi, void __iomem *iomem)
1291 1292
{
	struct device_node *np = pdev->dev.of_node;
1293
	struct device *dev = &pdev->dev;
1294
	u32 dmas[4];
1295 1296
	int ret;

N
Nicolin Chen 已提交
1297
	/* Backward compatible for a DT without ipg clock name assigned */
1298
	if (ssi->has_ipg_clk_name)
1299
		ssi->clk = devm_clk_get(dev, "ipg");
1300
	else
1301
		ssi->clk = devm_clk_get(dev, NULL);
1302 1303
	if (IS_ERR(ssi->clk)) {
		ret = PTR_ERR(ssi->clk);
1304
		dev_err(dev, "failed to get clock: %d\n", ret);
1305 1306 1307
		return ret;
	}

N
Nicolin Chen 已提交
1308
	/* Enable the clock since regmap will not handle it in this case */
1309 1310
	if (!ssi->has_ipg_clk_name) {
		ret = clk_prepare_enable(ssi->clk);
1311
		if (ret) {
1312
			dev_err(dev, "clk_prepare_enable failed: %d\n", ret);
1313 1314
			return ret;
		}
1315 1316
	}

N
Nicolin Chen 已提交
1317
	/* Do not error out for slave cases that live without a baud clock */
1318
	ssi->baudclk = devm_clk_get(dev, "baud");
1319
	if (IS_ERR(ssi->baudclk))
1320
		dev_dbg(dev, "failed to get baud clock: %ld\n",
1321
			 PTR_ERR(ssi->baudclk));
1322

1323 1324
	ssi->dma_params_tx.maxburst = ssi->dma_maxburst;
	ssi->dma_params_rx.maxburst = ssi->dma_maxburst;
1325 1326
	ssi->dma_params_tx.addr = ssi->ssi_phys + REG_SSI_STX0;
	ssi->dma_params_rx.addr = ssi->ssi_phys + REG_SSI_SRX0;
1327

N
Nicolin Chen 已提交
1328
	/* Set to dual FIFO mode according to the SDMA sciprt */
1329
	ret = of_property_read_u32_array(np, "dmas", dmas, 4);
1330 1331
	if (ssi->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL) {
		ssi->use_dual_fifo = true;
N
Nicolin Chen 已提交
1332 1333 1334
		/*
		 * Use even numbers to avoid channel swap due to SDMA
		 * script design
1335
		 */
1336 1337
		ssi->dma_params_tx.maxburst &= ~0x1;
		ssi->dma_params_rx.maxburst &= ~0x1;
1338 1339
	}

1340
	if (!ssi->use_dma) {
1341
		/*
N
Nicolin Chen 已提交
1342 1343
		 * Some boards use an incompatible codec. Use imx-fiq-pcm-audio
		 * to get it working, as DMA is not possible in this situation.
1344
		 */
1345 1346 1347 1348
		ssi->fiq_params.irq = ssi->irq;
		ssi->fiq_params.base = iomem;
		ssi->fiq_params.dma_params_rx = &ssi->dma_params_rx;
		ssi->fiq_params.dma_params_tx = &ssi->dma_params_tx;
1349

1350
		ret = imx_pcm_fiq_init(pdev, &ssi->fiq_params);
1351 1352 1353
		if (ret)
			goto error_pcm;
	} else {
1354
		ret = imx_pcm_dma_init(pdev, IMX_SSI_DMABUF_SIZE);
1355 1356 1357 1358
		if (ret)
			goto error_pcm;
	}

1359
	return 0;
1360 1361

error_pcm:
1362 1363
	if (!ssi->has_ipg_clk_name)
		clk_disable_unprepare(ssi->clk);
1364

1365
	return ret;
1366 1367
}

1368
static void fsl_ssi_imx_clean(struct platform_device *pdev, struct fsl_ssi *ssi)
1369
{
1370
	if (!ssi->use_dma)
1371
		imx_pcm_fiq_exit(pdev);
1372 1373
	if (!ssi->has_ipg_clk_name)
		clk_disable_unprepare(ssi->clk);
1374 1375
}

1376
static int fsl_ssi_probe(struct platform_device *pdev)
1377
{
1378
	struct fsl_ssi *ssi;
1379
	int ret = 0;
1380
	struct device_node *np = pdev->dev.of_node;
1381
	struct device *dev = &pdev->dev;
1382
	const struct of_device_id *of_id;
1383
	const char *p, *sprop;
1384
	const __be32 *iprop;
1385
	struct resource *res;
M
Markus Pargmann 已提交
1386
	void __iomem *iomem;
1387
	char name[64];
1388
	struct regmap_config regconfig = fsl_ssi_regconfig;
1389

1390
	of_id = of_match_device(fsl_ssi_ids, dev);
1391
	if (!of_id || !of_id->data)
1392 1393
		return -EINVAL;

1394
	ssi = devm_kzalloc(dev, sizeof(*ssi), GFP_KERNEL);
1395
	if (!ssi)
1396
		return -ENOMEM;
1397

1398
	ssi->soc = of_id->data;
1399
	ssi->dev = dev;
1400

N
Nicolin Chen 已提交
1401
	/* Check if being used in AC97 mode */
1402 1403 1404
	sprop = of_get_property(np, "fsl,mode", NULL);
	if (sprop) {
		if (!strcmp(sprop, "ac97-slave"))
1405
			ssi->dai_fmt = FSLSSI_AC97_DAIFMT;
1406 1407
	}

N
Nicolin Chen 已提交
1408
	/* Select DMA or FIQ */
1409
	ssi->use_dma = !of_property_read_bool(np, "fsl,fiq-stream-filter");
1410

1411 1412
	if (fsl_ssi_is_ac97(ssi)) {
		memcpy(&ssi->cpu_dai_drv, &fsl_ssi_ac97_dai,
1413
		       sizeof(fsl_ssi_ac97_dai));
1414
		fsl_ac97_data = ssi;
1415
	} else {
1416
		memcpy(&ssi->cpu_dai_drv, &fsl_ssi_dai_template,
1417 1418
		       sizeof(fsl_ssi_dai_template));
	}
1419
	ssi->cpu_dai_drv.name = dev_name(dev);
1420

1421
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1422
	iomem = devm_ioremap_resource(dev, res);
1423 1424
	if (IS_ERR(iomem))
		return PTR_ERR(iomem);
1425
	ssi->ssi_phys = res->start;
M
Markus Pargmann 已提交
1426

1427
	if (ssi->soc->imx21regs) {
N
Nicolin Chen 已提交
1428
		/* No SACC{ST,EN,DIS} regs in imx21-class SSI */
1429
		regconfig.max_register = REG_SSI_SRMSK;
1430
		regconfig.num_reg_defaults_raw =
1431
			REG_SSI_SRMSK / sizeof(uint32_t) + 1;
1432 1433
	}

1434 1435
	ret = of_property_match_string(np, "clock-names", "ipg");
	if (ret < 0) {
1436
		ssi->has_ipg_clk_name = false;
1437
		ssi->regs = devm_regmap_init_mmio(dev, iomem, &regconfig);
1438
	} else {
1439
		ssi->has_ipg_clk_name = true;
1440 1441
		ssi->regs = devm_regmap_init_mmio_clk(dev, "ipg", iomem,
						      &regconfig);
1442
	}
1443
	if (IS_ERR(ssi->regs)) {
1444
		dev_err(dev, "failed to init register map\n");
1445
		return PTR_ERR(ssi->regs);
M
Markus Pargmann 已提交
1446
	}
1447

1448 1449
	ssi->irq = platform_get_irq(pdev, 0);
	if (ssi->irq < 0) {
1450
		dev_err(dev, "no irq for node %s\n", pdev->name);
1451
		return ssi->irq;
1452 1453
	}

N
Nicolin Chen 已提交
1454
	/* Set software limitations for synchronous mode */
1455
	if (!of_find_property(np, "fsl,ssi-asynchronous", NULL)) {
1456 1457 1458
		if (!fsl_ssi_is_ac97(ssi)) {
			ssi->cpu_dai_drv.symmetric_rates = 1;
			ssi->cpu_dai_drv.symmetric_samplebits = 1;
1459
		}
1460

1461
		ssi->cpu_dai_drv.symmetric_channels = 1;
1462
	}
1463

N
Nicolin Chen 已提交
1464
	/* Fetch FIFO depth; Set to 8 for older DT without this property */
1465 1466
	iprop = of_get_property(np, "fsl,fifo-depth", NULL);
	if (iprop)
1467
		ssi->fifo_depth = be32_to_cpup(iprop);
1468
	else
1469
		ssi->fifo_depth = 8;
1470

1471
	/*
N
Nicolin Chen 已提交
1472
	 * Configure TX and RX DMA watermarks -- when to send a DMA request
1473
	 *
N
Nicolin Chen 已提交
1474 1475
	 * Values should be tested to avoid FIFO under/over run. Set maxburst
	 * to fifo_watermark to maxiumize DMA transaction to reduce overhead.
1476
	 */
1477
	switch (ssi->fifo_depth) {
1478 1479
	case 15:
		/*
N
Nicolin Chen 已提交
1480 1481 1482 1483 1484 1485
		 * Set to 8 as a balanced configuration -- When TX FIFO has 8
		 * empty slots, send a DMA request to fill these 8 slots. The
		 * remaining 7 slots should be able to allow DMA to finish the
		 * transaction before TX FIFO underruns; Same applies to RX.
		 *
		 * Tested with cases running at 48kHz @ 16 bits x 16 channels
1486
		 */
1487 1488
		ssi->fifo_watermark = 8;
		ssi->dma_maxburst = 8;
1489 1490 1491
		break;
	case 8:
	default:
N
Nicolin Chen 已提交
1492
		/* Safely use old watermark configurations for older chips */
1493 1494
		ssi->fifo_watermark = ssi->fifo_depth - 2;
		ssi->dma_maxburst = ssi->fifo_depth - 2;
1495 1496 1497
		break;
	}

1498
	dev_set_drvdata(dev, ssi);
1499

1500 1501
	if (ssi->soc->imx) {
		ret = fsl_ssi_imx_probe(pdev, ssi, iomem);
1502
		if (ret)
F
Fabio Estevam 已提交
1503
			return ret;
1504 1505
	}

1506 1507
	if (fsl_ssi_is_ac97(ssi)) {
		mutex_init(&ssi->ac97_reg_lock);
1508 1509
		ret = snd_soc_set_ac97_ops_of_reset(&fsl_ssi_ac97_ops, pdev);
		if (ret) {
1510
			dev_err(dev, "failed to set AC'97 ops\n");
1511 1512 1513 1514
			goto error_ac97_ops;
		}
	}

1515
	ret = devm_snd_soc_register_component(dev, &fsl_ssi_component,
1516
					      &ssi->cpu_dai_drv, 1);
1517
	if (ret) {
1518
		dev_err(dev, "failed to register DAI: %d\n", ret);
1519 1520 1521
		goto error_asoc_register;
	}

1522
	if (ssi->use_dma) {
1523 1524
		ret = devm_request_irq(dev, ssi->irq, fsl_ssi_isr, 0,
				       dev_name(dev), ssi);
1525
		if (ret < 0) {
1526
			dev_err(dev, "failed to claim irq %u\n", ssi->irq);
1527
			goto error_asoc_register;
1528
		}
1529 1530
	}

1531
	ret = fsl_ssi_debugfs_create(&ssi->dbg_stats, dev);
1532
	if (ret)
1533
		goto error_asoc_register;
1534

N
Nicolin Chen 已提交
1535
	/* Bypass it if using newer DT bindings of ASoC machine drivers */
1536
	if (!of_get_property(np, "codec-handle", NULL))
1537 1538
		goto done;

N
Nicolin Chen 已提交
1539 1540 1541 1542
	/*
	 * Backward compatible for older bindings by manually triggering the
	 * machine driver's probe(). Use /compatible property, including the
	 * address of CPU DAI driver structure, as the name of machine driver.
1543
	 */
1544 1545
	sprop = of_get_property(of_find_node_by_path("/"), "compatible", NULL);
	/* Sometimes the compatible name has a "fsl," prefix, so we strip it. */
1546 1547 1548 1549 1550 1551
	p = strrchr(sprop, ',');
	if (p)
		sprop = p + 1;
	snprintf(name, sizeof(name), "snd-soc-%s", sprop);
	make_lowercase(name);

1552
	ssi->pdev = platform_device_register_data(dev, name, 0, NULL, 0);
1553 1554
	if (IS_ERR(ssi->pdev)) {
		ret = PTR_ERR(ssi->pdev);
1555
		dev_err(dev, "failed to register platform: %d\n", ret);
1556
		goto error_sound_card;
M
Mark Brown 已提交
1557
	}
1558

1559
done:
1560 1561 1562
	/* Initially configures SSI registers */
	fsl_ssi_hw_init(ssi);

1563
	if (fsl_ssi_is_ac97(ssi)) {
1564 1565 1566 1567
		u32 ssi_idx;

		ret = of_property_read_u32(np, "cell-index", &ssi_idx);
		if (ret) {
1568
			dev_err(dev, "failed to get SSI index property\n");
1569 1570 1571
			goto error_sound_card;
		}

1572 1573
		ssi->pdev = platform_device_register_data(NULL, "ac97-codec",
							  ssi_idx, NULL, 0);
1574 1575
		if (IS_ERR(ssi->pdev)) {
			ret = PTR_ERR(ssi->pdev);
1576
			dev_err(dev,
1577 1578 1579 1580 1581 1582
				"failed to register AC97 codec platform: %d\n",
				ret);
			goto error_sound_card;
		}
	}

1583
	return 0;
1584

1585
error_sound_card:
1586
	fsl_ssi_debugfs_remove(&ssi->dbg_stats);
1587
error_asoc_register:
1588
	if (fsl_ssi_is_ac97(ssi))
1589 1590
		snd_soc_set_ac97_ops(NULL);
error_ac97_ops:
1591 1592
	if (fsl_ssi_is_ac97(ssi))
		mutex_destroy(&ssi->ac97_reg_lock);
1593

1594 1595
	if (ssi->soc->imx)
		fsl_ssi_imx_clean(pdev, ssi);
1596

1597
	return ret;
1598 1599
}

1600
static int fsl_ssi_remove(struct platform_device *pdev)
1601
{
1602
	struct fsl_ssi *ssi = dev_get_drvdata(&pdev->dev);
1603

1604
	fsl_ssi_debugfs_remove(&ssi->dbg_stats);
1605

1606 1607
	if (ssi->pdev)
		platform_device_unregister(ssi->pdev);
1608

1609 1610 1611
	/* Clean up SSI registers */
	fsl_ssi_hw_clean(ssi);

1612 1613
	if (ssi->soc->imx)
		fsl_ssi_imx_clean(pdev, ssi);
1614

1615
	if (fsl_ssi_is_ac97(ssi)) {
1616
		snd_soc_set_ac97_ops(NULL);
1617
		mutex_destroy(&ssi->ac97_reg_lock);
1618
	}
1619

1620
	return 0;
1621
}
1622

1623 1624 1625
#ifdef CONFIG_PM_SLEEP
static int fsl_ssi_suspend(struct device *dev)
{
1626 1627
	struct fsl_ssi *ssi = dev_get_drvdata(dev);
	struct regmap *regs = ssi->regs;
1628

1629 1630
	regmap_read(regs, REG_SSI_SFCSR, &ssi->regcache_sfcsr);
	regmap_read(regs, REG_SSI_SACNT, &ssi->regcache_sacnt);
1631 1632 1633 1634 1635 1636 1637 1638 1639

	regcache_cache_only(regs, true);
	regcache_mark_dirty(regs);

	return 0;
}

static int fsl_ssi_resume(struct device *dev)
{
1640 1641
	struct fsl_ssi *ssi = dev_get_drvdata(dev);
	struct regmap *regs = ssi->regs;
1642 1643 1644

	regcache_cache_only(regs, false);

1645
	regmap_update_bits(regs, REG_SSI_SFCSR,
1646 1647 1648
			   SSI_SFCSR_RFWM1_MASK | SSI_SFCSR_TFWM1_MASK |
			   SSI_SFCSR_RFWM0_MASK | SSI_SFCSR_TFWM0_MASK,
			   ssi->regcache_sfcsr);
1649
	regmap_write(regs, REG_SSI_SACNT, ssi->regcache_sacnt);
1650 1651 1652 1653 1654 1655 1656 1657 1658

	return regcache_sync(regs);
}
#endif /* CONFIG_PM_SLEEP */

static const struct dev_pm_ops fsl_ssi_pm = {
	SET_SYSTEM_SLEEP_PM_OPS(fsl_ssi_suspend, fsl_ssi_resume)
};

1659
static struct platform_driver fsl_ssi_driver = {
1660 1661 1662
	.driver = {
		.name = "fsl-ssi-dai",
		.of_match_table = fsl_ssi_ids,
1663
		.pm = &fsl_ssi_pm,
1664 1665 1666 1667
	},
	.probe = fsl_ssi_probe,
	.remove = fsl_ssi_remove,
};
1668

1669
module_platform_driver(fsl_ssi_driver);
1670

1671
MODULE_ALIAS("platform:fsl-ssi-dai");
1672 1673
MODULE_AUTHOR("Timur Tabi <timur@freescale.com>");
MODULE_DESCRIPTION("Freescale Synchronous Serial Interface (SSI) ASoC Driver");
1674
MODULE_LICENSE("GPL v2");