fsl_ssi.c 46.2 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
 *           (this is the initial settings based on the DAI format)
221
 * @synchronous: Use synchronous mode - both of TX and RX use STCK and SFCK
222
 * @use_dma: DMA is used or FIQ with stream filter
N
Nicolin Chen 已提交
223 224 225 226 227
 * @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
228
 * @regvals: Specific RX/TX register settings
229
 *
N
Nicolin Chen 已提交
230 231
 * @clk: Clock source to access register
 * @baudclk: Clock source to generate bit and frame-sync clocks
232 233
 * @baudclk_streams: Active streams that are using baudclk
 *
N
Nicolin Chen 已提交
234 235 236
 * @regcache_sfcsr: Cache sfcsr register value during suspend and resume
 * @regcache_sacnt: Cache sacnt register value during suspend and resume
 *
237 238 239 240 241 242
 * @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
 *
243 244 245 246 247 248
 * @card_pdev: Platform_device pointer to register a sound card for PowerPC or
 *             to register a CODEC platform device for AC97
 * @card_name: Platform_device name to register a sound card for PowerPC or
 *             to register a CODEC platform device for AC97
 * @card_idx: The index of SSI to register a sound card for PowerPC or
 *            to register a CODEC platform device for AC97
249 250 251
 *
 * @dbg_stats: Debugging statistics
 *
252
 * @soc: SoC specific data
N
Nicolin Chen 已提交
253 254 255 256 257 258 259
 * @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.
260
 *
N
Nicolin Chen 已提交
261
 * @ac97_reg_lock: Mutex lock to serialize AC97 register access operations
262
 */
263
struct fsl_ssi {
M
Markus Pargmann 已提交
264
	struct regmap *regs;
265
	int irq;
266
	struct snd_soc_dai_driver cpu_dai_drv;
267

268
	unsigned int dai_fmt;
269
	u8 streams;
270
	u8 i2s_net;
271
	bool synchronous;
272
	bool use_dma;
273
	bool use_dual_fifo;
274
	bool has_ipg_clk_name;
275
	unsigned int fifo_depth;
276 277
	unsigned int slot_width;
	unsigned int slots;
278
	struct fsl_ssi_regvals regvals[2];
279

280
	struct clk *clk;
281
	struct clk *baudclk;
282
	unsigned int baudclk_streams;
283

284
	u32 regcache_sfcsr;
285
	u32 regcache_sacnt;
286

287 288
	struct snd_dmaengine_dai_dma_data dma_params_tx;
	struct snd_dmaengine_dai_dma_data dma_params_rx;
289 290
	dma_addr_t ssi_phys;

291
	struct imx_pcm_fiq_params fiq_params;
292

293 294 295
	struct platform_device *card_pdev;
	char card_name[32];
	u32 card_idx;
296

297
	struct fsl_ssi_dbg dbg_stats;
298

299
	const struct fsl_ssi_soc_data *soc;
300
	struct device *dev;
301 302 303

	u32 fifo_watermark;
	u32 dma_maxburst;
304 305

	struct mutex ac97_reg_lock;
306
};
307 308

/*
N
Nicolin Chen 已提交
309
 * SoC specific data
310
 *
N
Nicolin Chen 已提交
311 312 313 314 315 316 317 318 319 320 321
 * 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.
322 323
 */

324 325 326
static struct fsl_ssi_soc_data fsl_ssi_mpc8610 = {
	.imx = false,
	.offline_config = true,
327
	.sisr_write_mask = SSI_SISR_RFRC | SSI_SISR_TFRC |
328 329
			   SSI_SISR_ROE0 | SSI_SISR_ROE1 |
			   SSI_SISR_TUE0 | SSI_SISR_TUE1,
330 331 332 333
};

static struct fsl_ssi_soc_data fsl_ssi_imx21 = {
	.imx = true,
334
	.imx21regs = true,
335 336 337 338 339 340 341
	.offline_config = true,
	.sisr_write_mask = 0,
};

static struct fsl_ssi_soc_data fsl_ssi_imx35 = {
	.imx = true,
	.offline_config = true,
342
	.sisr_write_mask = SSI_SISR_RFRC | SSI_SISR_TFRC |
343 344
			   SSI_SISR_ROE0 | SSI_SISR_ROE1 |
			   SSI_SISR_TUE0 | SSI_SISR_TUE1,
345 346 347 348 349
};

static struct fsl_ssi_soc_data fsl_ssi_imx51 = {
	.imx = true,
	.offline_config = false,
350
	.sisr_write_mask = SSI_SISR_ROE0 | SSI_SISR_ROE1 |
351
			   SSI_SISR_TUE0 | SSI_SISR_TUE1,
352 353 354 355 356 357 358 359 360 361 362
};

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

363
static bool fsl_ssi_is_ac97(struct fsl_ssi *ssi)
364
{
365
	return (ssi->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) ==
366
		SND_SOC_DAIFMT_AC97;
367 368
}

369
static bool fsl_ssi_is_i2s_master(struct fsl_ssi *ssi)
370
{
371
	return (ssi->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) ==
372 373 374
		SND_SOC_DAIFMT_CBS_CFS;
}

375
static bool fsl_ssi_is_i2s_cbm_cfs(struct fsl_ssi *ssi)
376
{
377
	return (ssi->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) ==
378 379
		SND_SOC_DAIFMT_CBM_CFS;
}
N
Nicolin Chen 已提交
380

381
/**
N
Nicolin Chen 已提交
382
 * Interrupt handler to gather states
383 384 385
 */
static irqreturn_t fsl_ssi_isr(int irq, void *dev_id)
{
386 387
	struct fsl_ssi *ssi = dev_id;
	struct regmap *regs = ssi->regs;
388
	u32 sisr, sisr2;
389

390
	regmap_read(regs, REG_SSI_SISR, &sisr);
391

392
	sisr2 = sisr & ssi->soc->sisr_write_mask;
393 394
	/* Clear the bits that we set */
	if (sisr2)
395
		regmap_write(regs, REG_SSI_SISR, sisr2);
396

397
	fsl_ssi_dbg_isr(&ssi->dbg_stats, sisr);
398

399
	return IRQ_HANDLED;
400 401
}

N
Nicolin Chen 已提交
402
/**
403 404 405 406 407 408
 * 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
409
 */
410
static void fsl_ssi_config_enable(struct fsl_ssi *ssi, bool tx)
411
{
412
	struct fsl_ssi_regvals *vals = ssi->regvals;
413 414
	int dir = tx ? TX : RX;
	u32 sier, srcr, stcr;
415

416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435
	/* 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;
436
	} else {
437 438 439 440
		/* Otherwise, only set bits for the current stream */
		srcr = vals[dir].srcr;
		stcr = vals[dir].stcr;
		sier = vals[dir].sier;
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 472 473 474 475 476 477 478 479

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

N
Nicolin Chen 已提交
482
/**
483
 * Exclude bits that are used by the opposite stream
484
 *
485 486
 * When both streams are active, disabling some bits for the current stream
 * might break the other stream if these bits are used by it.
487
 *
488 489 490
 * @vals : regvals of the current stream
 * @avals: regvals of the opposite stream
 * @aactive: active state of the opposite stream
491
 *
492 493 494
 *  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
495
 */
496 497 498 499 500
#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))
501

N
Nicolin Chen 已提交
502
/**
503 504 505 506 507 508
 * 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
509
 */
510
static void fsl_ssi_config_disable(struct fsl_ssi *ssi, bool tx)
511
{
512 513
	struct fsl_ssi_regvals *vals, *avals;
	u32 sier, srcr, stcr, scr;
514 515
	int adir = tx ? RX : TX;
	int dir = tx ? TX : RX;
516
	bool aactive;
M
Markus Pargmann 已提交
517

518 519
	/* Check if the opposite stream is active */
	aactive = ssi->streams & BIT(adir);
520

521
	vals = &ssi->regvals[dir];
522

523 524
	/* Get regvals of the opposite stream to keep opposite stream safe */
	avals = &ssi->regvals[adir];
525 526

	/*
527 528
	 * To keep the other stream safe, exclude shared bits between
	 * both streams, and get safe bits to disable current stream
529
	 */
530
	scr = ssi_excl_shared_bits(vals->scr, avals->scr, aactive);
531

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

535 536
	/* Log the disabled stream to the mask */
	ssi->streams &= ~BIT(dir);
537

538 539 540 541 542 543
	/*
	 * 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;
544

545 546 547 548 549 550
	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 {
551
		/*
N
Nicolin Chen 已提交
552 553
		 * To keep the other stream safe, exclude shared bits between
		 * both streams, and get safe bits to disable current stream
554
		 */
555 556 557
		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);
558 559
	}

560 561 562 563
	/* 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);
564

565 566 567 568
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));
569 570
}

571
static void fsl_ssi_tx_ac97_saccst_setup(struct fsl_ssi *ssi)
572
{
573
	struct regmap *regs = ssi->regs;
574 575

	/* no SACC{ST,EN,DIS} regs on imx21-class SSI */
576
	if (!ssi->soc->imx21regs) {
N
Nicolin Chen 已提交
577
		/* Disable all channel slots */
578
		regmap_write(regs, REG_SSI_SACCDIS, 0xff);
N
Nicolin Chen 已提交
579
		/* Enable slots 3 & 4 -- PCM Playback Left & Right channels */
580
		regmap_write(regs, REG_SSI_SACCEN, 0x300);
581 582 583
	}
}

N
Nicolin Chen 已提交
584 585
/**
 * Cache critical bits of SIER, SRCR, STCR and SCR to later set them safely
586
 */
587
static void fsl_ssi_setup_regvals(struct fsl_ssi *ssi)
588
{
589
	struct fsl_ssi_regvals *vals = ssi->regvals;
590

591
	vals[RX].sier = SSI_SIER_RFF0_EN | FSLSSI_SIER_DBG_RX_FLAGS;
592
	vals[RX].srcr = SSI_SRCR_RFEN0;
593 594
	vals[RX].scr = SSI_SCR_SSIEN | SSI_SCR_RE;
	vals[TX].sier = SSI_SIER_TFE0_EN | FSLSSI_SIER_DBG_TX_FLAGS;
595
	vals[TX].stcr = SSI_STCR_TFEN0;
596
	vals[TX].scr = SSI_SCR_SSIEN | SSI_SCR_TE;
597

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

602 603 604 605 606
	if (ssi->use_dual_fifo) {
		vals[RX].srcr |= SSI_SRCR_RFEN1;
		vals[TX].stcr |= SSI_STCR_TFEN1;
	}

607
	if (ssi->use_dma) {
608 609
		vals[RX].sier |= SSI_SIER_RDMAE;
		vals[TX].sier |= SSI_SIER_TDMAE;
610
	} else {
611 612
		vals[RX].sier |= SSI_SIER_RIE;
		vals[TX].sier |= SSI_SIER_TIE;
613 614 615
	}
}

616
static void fsl_ssi_setup_ac97(struct fsl_ssi *ssi)
617
{
618
	struct regmap *regs = ssi->regs;
619

N
Nicolin Chen 已提交
620
	/* Setup the clock control register */
621 622
	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));
623

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

N
Nicolin Chen 已提交
627
	/* AC97 has to communicate with codec before starting a stream */
628
	regmap_update_bits(regs, REG_SSI_SCR,
629 630
			   SSI_SCR_SSIEN | SSI_SCR_TE | SSI_SCR_RE,
			   SSI_SCR_SSIEN | SSI_SCR_TE | SSI_SCR_RE);
631

632
	regmap_write(regs, REG_SSI_SOR, SSI_SOR_WAIT(3));
633 634
}

635 636
static int fsl_ssi_startup(struct snd_pcm_substream *substream,
			   struct snd_soc_dai *dai)
637 638
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
639
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
640 641
	int ret;

642
	ret = clk_prepare_enable(ssi->clk);
643 644
	if (ret)
		return ret;
645

N
Nicolin Chen 已提交
646 647
	/*
	 * When using dual fifo mode, it is safer to ensure an even period
648 649 650 651
	 * 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.
	 */
652
	if (ssi->use_dual_fifo)
653
		snd_pcm_hw_constraint_step(substream->runtime, 0,
654
					   SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 2);
655

656 657 658
	return 0;
}

659
static void fsl_ssi_shutdown(struct snd_pcm_substream *substream,
660
			     struct snd_soc_dai *dai)
661 662
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
663
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
664

665
	clk_disable_unprepare(ssi->clk);
666 667
}

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

693
	/* Override slots and slot_width if being specifically set... */
694 695
	if (ssi->slots)
		slots = ssi->slots;
696
	/* ...but keep 32 bits if slots is 2 -- I2S Master mode */
697 698
	if (ssi->slot_width && slots != 2)
		slot_width = ssi->slot_width;
699 700 701

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

	/* Don't apply it to any non-baudclk circumstance */
704
	if (IS_ERR(ssi->baudclk))
705 706
		return -EINVAL;

707 708 709 710
	/*
	 * Hardware limitation: The bclk rate must be
	 * never greater than 1/5 IPG clock rate
	 */
711
	if (freq * 5 > clk_get_rate(ssi->clk)) {
712
		dev_err(dai->dev, "bitclk > ipgclk / 5\n");
713 714 715
		return -EINVAL;
	}

716
	baudclk_is_used = ssi->baudclk_streams & ~(BIT(substream->stream));
717

718 719 720 721 722 723 724
	/* 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++) {
725
		tmprate = freq * factor * (i + 1);
726 727

		if (baudclk_is_used)
728
			clkrate = clk_get_rate(ssi->baudclk);
729
		else
730
			clkrate = clk_round_rate(ssi->baudclk, tmprate);
731

732 733
		clkrate /= factor;
		afreq = clkrate / (i + 1);
734 735 736 737 738 739 740 741 742 743 744 745 746 747

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

748
		if (sub < savesub && !(i == 0 && psr == 0 && div2 == 0)) {
749 750 751 752 753 754 755 756 757 758 759 760
			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) {
761
		dev_err(dai->dev, "failed to handle the required sysclk\n");
762 763 764
		return -EINVAL;
	}

765 766
	stccr = SSI_SxCCR_PM(pm + 1) | (div2 ? SSI_SxCCR_DIV2 : 0) |
		(psr ? SSI_SxCCR_PSR : 0);
767
	mask = SSI_SxCCR_PM_MASK | SSI_SxCCR_DIV2 | SSI_SxCCR_PSR;
768

769
	/* STCCR is used for RX in synchronous mode */
770
	tx2 = tx || ssi->synchronous;
771
	regmap_update_bits(regs, REG_SSI_SxCCR(tx2), mask, stccr);
772

773
	if (!baudclk_is_used) {
774
		ret = clk_set_rate(ssi->baudclk, baudrate);
775
		if (ret) {
776
			dev_err(dai->dev, "failed to set baudclk rate\n");
777 778 779 780 781 782 783
			return -EINVAL;
		}
	}

	return 0;
}

784
/**
N
Nicolin Chen 已提交
785
 * Configure SSI based on PCM hardware parameters
786
 *
N
Nicolin Chen 已提交
787 788 789 790 791 792 793
 * 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.
794
 */
795
static int fsl_ssi_hw_params(struct snd_pcm_substream *substream,
796
			     struct snd_pcm_hw_params *hw_params,
797
			     struct snd_soc_dai *dai)
798
{
799
	bool tx2, tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
800
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
801
	struct regmap *regs = ssi->regs;
802
	unsigned int channels = params_channels(hw_params);
803
	unsigned int sample_size = params_width(hw_params);
804
	u32 wl = SSI_SxCCR_WL(sample_size);
805
	int ret;
806

807
	/*
N
Nicolin Chen 已提交
808 809 810 811
	 * 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.
812
	 */
813
	if (ssi->streams && ssi->synchronous)
814
		return 0;
815

816
	if (fsl_ssi_is_i2s_master(ssi)) {
817
		ret = fsl_ssi_set_bclk(substream, dai, hw_params);
818 819
		if (ret)
			return ret;
820 821

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

827
			ssi->baudclk_streams |= BIT(substream->stream);
828
		}
829 830
	}

831
	if (!fsl_ssi_is_ac97(ssi)) {
832 833 834 835 836 837 838
		/*
		 * Keep the ssi->i2s_net intact while having a local variable
		 * to override settings for special use cases. Otherwise, the
		 * ssi->i2s_net will lose the settings for regular use cases.
		 */
		u8 i2s_net = ssi->i2s_net;

N
Nicolin Chen 已提交
839
		/* Normal + Network mode to send 16-bit data in 32-bit frames */
840
		if (fsl_ssi_is_i2s_cbm_cfs(ssi) && sample_size == 16)
841
			i2s_net = SSI_SCR_I2S_MODE_NORMAL | SSI_SCR_NET;
842 843 844

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

847
		regmap_update_bits(regs, REG_SSI_SCR,
848
				   SSI_SCR_I2S_NET_MASK, i2s_net);
849 850
	}

851
	/* In synchronous mode, the SSI uses STCCR for capture */
852
	tx2 = tx || ssi->synchronous;
853
	regmap_update_bits(regs, REG_SSI_SxCCR(tx2), SSI_SxCCR_WL_MASK, wl);
854 855 856 857

	return 0;
}

858
static int fsl_ssi_hw_free(struct snd_pcm_substream *substream,
859
			   struct snd_soc_dai *dai)
860 861
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
862
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
863

864
	if (fsl_ssi_is_i2s_master(ssi) &&
865
	    ssi->baudclk_streams & BIT(substream->stream)) {
866 867
		clk_disable_unprepare(ssi->baudclk);
		ssi->baudclk_streams &= ~BIT(substream->stream);
868 869 870 871 872
	}

	return 0;
}

873
static int _fsl_ssi_set_dai_fmt(struct fsl_ssi *ssi, unsigned int fmt)
874
{
875
	u32 strcr = 0, scr = 0, stcr, srcr, mask;
876

877
	ssi->dai_fmt = fmt;
878

N
Nicolin Chen 已提交
879
	/* Synchronize frame sync clock for TE to avoid data slipping */
880
	scr |= SSI_SCR_SYNC_TX_FS;
881

882 883
	/* Set to default shifting settings: LSB_ALIGNED */
	strcr |= SSI_STCR_TXBIT0;
884

N
Nicolin Chen 已提交
885
	/* Use Network mode as default */
886
	ssi->i2s_net = SSI_SCR_NET;
887 888 889 890
	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:
891 892 893 894 895 896 897
			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:
898
			ssi->i2s_net |= SSI_SCR_I2S_MODE_MASTER;
899 900
			break;
		case SND_SOC_DAIFMT_CBM_CFM:
901
			ssi->i2s_net |= SSI_SCR_I2S_MODE_SLAVE;
902 903 904 905 906
			break;
		default:
			return -EINVAL;
		}

907 908 909 910 911
		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));

912
		/* Data on rising edge of bclk, frame low, 1clk before data */
913
		strcr |= SSI_STCR_TFSI | SSI_STCR_TSCKP | SSI_STCR_TEFS;
914 915 916
		break;
	case SND_SOC_DAIFMT_LEFT_J:
		/* Data on rising edge of bclk, frame high */
917
		strcr |= SSI_STCR_TSCKP;
918 919 920
		break;
	case SND_SOC_DAIFMT_DSP_A:
		/* Data on rising edge of bclk, frame high, 1clk before data */
921
		strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP | SSI_STCR_TEFS;
922 923 924
		break;
	case SND_SOC_DAIFMT_DSP_B:
		/* Data on rising edge of bclk, frame high */
925
		strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP;
926
		break;
927
	case SND_SOC_DAIFMT_AC97:
N
Nicolin Chen 已提交
928
		/* Data on falling edge of bclk, frame high, 1clk before data */
929
		strcr |= SSI_STCR_TEFS;
930
		break;
931 932 933
	default:
		return -EINVAL;
	}
934

935
	scr |= ssi->i2s_net;
936 937 938 939 940 941 942 943

	/* 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 */
944
		strcr ^= SSI_STCR_TSCKP;
945 946 947
		break;
	case SND_SOC_DAIFMT_NB_IF:
		/* Invert frame clock */
948
		strcr ^= SSI_STCR_TFSI;
949 950 951
		break;
	case SND_SOC_DAIFMT_IB_IF:
		/* Invert both clocks */
952 953
		strcr ^= SSI_STCR_TSCKP;
		strcr ^= SSI_STCR_TFSI;
954 955 956 957 958 959 960 961
		break;
	default:
		return -EINVAL;
	}

	/* DAI clock master masks */
	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
	case SND_SOC_DAIFMT_CBS_CFS:
N
Nicolin Chen 已提交
962
		/* Output bit and frame sync clocks */
963 964
		strcr |= SSI_STCR_TFDIR | SSI_STCR_TXDIR;
		scr |= SSI_SCR_SYS_CLK_EN;
965 966
		break;
	case SND_SOC_DAIFMT_CBM_CFM:
N
Nicolin Chen 已提交
967
		/* Input bit or frame sync clocks */
968
		break;
969
	case SND_SOC_DAIFMT_CBM_CFS:
N
Nicolin Chen 已提交
970
		/* Input bit clock but output frame sync clock */
971
		strcr |= SSI_STCR_TFDIR;
972
		break;
973
	default:
974
		return -EINVAL;
975 976
	}

977 978
	stcr = strcr;
	srcr = strcr;
979

N
Nicolin Chen 已提交
980
	/* Set SYN mode and clear RXDIR bit when using SYN or AC97 mode */
981
	if (ssi->synchronous || fsl_ssi_is_ac97(ssi)) {
982 983
		srcr &= ~SSI_SRCR_RXDIR;
		scr |= SSI_SCR_SYN;
984 985
	}

986 987 988 989 990 991 992 993 994
	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);
995 996

	return 0;
997 998 999
}

/**
N
Nicolin Chen 已提交
1000
 * Configure Digital Audio Interface (DAI) Format
1001
 */
1002
static int fsl_ssi_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
1003
{
1004
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1005

N
Nicolin Chen 已提交
1006
	/* AC97 configured DAIFMT earlier in the probe() */
1007
	if (fsl_ssi_is_ac97(ssi))
1008 1009
		return 0;

1010
	return _fsl_ssi_set_dai_fmt(ssi, fmt);
1011 1012 1013
}

/**
N
Nicolin Chen 已提交
1014
 * Set TDM slot number and slot width
1015
 */
1016
static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask,
1017
				    u32 rx_mask, int slots, int slot_width)
1018
{
1019
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1020
	struct regmap *regs = ssi->regs;
1021 1022
	u32 val;

1023 1024
	/* The word length should be 8, 10, 12, 16, 18, 20, 22 or 24 */
	if (slot_width & 1 || slot_width < 8 || slot_width > 24) {
1025
		dev_err(dai->dev, "invalid slot width: %d\n", slot_width);
1026 1027 1028
		return -EINVAL;
	}

1029
	/* The slot number should be >= 2 if using Network mode or I2S mode */
1030
	if (ssi->i2s_net && slots < 2) {
1031
		dev_err(dai->dev, "slot number should be >= 2 in I2S or NET\n");
1032 1033 1034
		return -EINVAL;
	}

1035 1036 1037 1038
	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));
1039

1040
	/* Save the SCR register value */
1041
	regmap_read(regs, REG_SSI_SCR, &val);
N
Nicolin Chen 已提交
1042
	/* Temporarily enable SSI to allow SxMSKs to be configurable */
1043
	regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, SSI_SCR_SSIEN);
1044

1045 1046
	regmap_write(regs, REG_SSI_STMSK, ~tx_mask);
	regmap_write(regs, REG_SSI_SRMSK, ~rx_mask);
1047

N
Nicolin Chen 已提交
1048
	/* Restore the value of SSIEN bit */
1049
	regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, val);
1050

1051 1052
	ssi->slot_width = slot_width;
	ssi->slots = slots;
1053

1054 1055 1056
	return 0;
}

1057
/**
N
Nicolin Chen 已提交
1058
 * Start or stop SSI and corresponding DMA transaction.
1059 1060 1061 1062
 *
 * The DMA channel is in external master start and pause mode, which
 * means the SSI completely controls the flow of data.
 */
1063 1064
static int fsl_ssi_trigger(struct snd_pcm_substream *substream, int cmd,
			   struct snd_soc_dai *dai)
1065 1066
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
1067
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
1068
	bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
1069

1070 1071
	switch (cmd) {
	case SNDRV_PCM_TRIGGER_START:
1072
	case SNDRV_PCM_TRIGGER_RESUME:
1073
	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1074 1075 1076 1077 1078 1079 1080 1081 1082 1083
		/*
		 * 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);
1084 1085 1086
		break;

	case SNDRV_PCM_TRIGGER_STOP:
1087
	case SNDRV_PCM_TRIGGER_SUSPEND:
1088
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1089
		fsl_ssi_config_disable(ssi, tx);
1090 1091 1092 1093 1094 1095 1096 1097 1098
		break;

	default:
		return -EINVAL;
	}

	return 0;
}

1099 1100
static int fsl_ssi_dai_probe(struct snd_soc_dai *dai)
{
1101
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1102

1103 1104 1105
	if (ssi->soc->imx && ssi->use_dma)
		snd_soc_dai_init_dma_data(dai, &ssi->dma_params_tx,
					  &ssi->dma_params_rx);
1106 1107 1108 1109

	return 0;
}

1110
static const struct snd_soc_dai_ops fsl_ssi_dai_ops = {
1111 1112 1113 1114 1115 1116 1117
	.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,
1118 1119
};

1120
static struct snd_soc_dai_driver fsl_ssi_dai_template = {
1121
	.probe = fsl_ssi_dai_probe,
1122
	.playback = {
1123
		.stream_name = "CPU-Playback",
1124
		.channels_min = 1,
1125
		.channels_max = 32,
1126
		.rates = SNDRV_PCM_RATE_CONTINUOUS,
1127 1128 1129
		.formats = FSLSSI_I2S_FORMATS,
	},
	.capture = {
1130
		.stream_name = "CPU-Capture",
1131
		.channels_min = 1,
1132
		.channels_max = 32,
1133
		.rates = SNDRV_PCM_RATE_CONTINUOUS,
1134 1135
		.formats = FSLSSI_I2S_FORMATS,
	},
1136
	.ops = &fsl_ssi_dai_ops,
1137 1138
};

1139
static const struct snd_soc_component_driver fsl_ssi_component = {
1140
	.name = "fsl-ssi",
1141 1142
};

1143
static struct snd_soc_dai_driver fsl_ssi_ac97_dai = {
1144
	.bus_control = true,
1145
	.symmetric_channels = 1,
1146
	.probe = fsl_ssi_dai_probe,
1147 1148 1149 1150 1151
	.playback = {
		.stream_name = "AC97 Playback",
		.channels_min = 2,
		.channels_max = 2,
		.rates = SNDRV_PCM_RATE_8000_48000,
1152
		.formats = SNDRV_PCM_FMTBIT_S16 | SNDRV_PCM_FMTBIT_S20,
1153 1154 1155 1156 1157 1158
	},
	.capture = {
		.stream_name = "AC97 Capture",
		.channels_min = 2,
		.channels_max = 2,
		.rates = SNDRV_PCM_RATE_48000,
1159 1160
		/* 16-bit capture is broken (errata ERR003778) */
		.formats = SNDRV_PCM_FMTBIT_S20,
1161
	},
1162
	.ops = &fsl_ssi_dai_ops,
1163 1164
};

1165
static struct fsl_ssi *fsl_ac97_data;
1166

1167
static void fsl_ssi_ac97_write(struct snd_ac97 *ac97, unsigned short reg,
1168
			       unsigned short val)
1169
{
M
Markus Pargmann 已提交
1170
	struct regmap *regs = fsl_ac97_data->regs;
1171 1172
	unsigned int lreg;
	unsigned int lval;
1173
	int ret;
1174 1175 1176 1177

	if (reg > 0x7f)
		return;

1178 1179
	mutex_lock(&fsl_ac97_data->ac97_reg_lock);

1180 1181 1182 1183
	ret = clk_prepare_enable(fsl_ac97_data->clk);
	if (ret) {
		pr_err("ac97 write clk_prepare_enable failed: %d\n",
			ret);
1184
		goto ret_unlock;
1185
	}
1186 1187

	lreg = reg <<  12;
1188
	regmap_write(regs, REG_SSI_SACADD, lreg);
1189 1190

	lval = val << 4;
1191
	regmap_write(regs, REG_SSI_SACDAT, lval);
1192

1193 1194
	regmap_update_bits(regs, REG_SSI_SACNT,
			   SSI_SACNT_RDWR_MASK, SSI_SACNT_WR);
1195
	udelay(100);
1196 1197

	clk_disable_unprepare(fsl_ac97_data->clk);
1198 1199 1200

ret_unlock:
	mutex_unlock(&fsl_ac97_data->ac97_reg_lock);
1201 1202
}

1203
static unsigned short fsl_ssi_ac97_read(struct snd_ac97 *ac97,
1204
					unsigned short reg)
1205
{
M
Markus Pargmann 已提交
1206
	struct regmap *regs = fsl_ac97_data->regs;
1207
	unsigned short val = 0;
M
Markus Pargmann 已提交
1208
	u32 reg_val;
1209
	unsigned int lreg;
1210 1211
	int ret;

1212 1213
	mutex_lock(&fsl_ac97_data->ac97_reg_lock);

1214 1215
	ret = clk_prepare_enable(fsl_ac97_data->clk);
	if (ret) {
1216
		pr_err("ac97 read clk_prepare_enable failed: %d\n", ret);
1217
		goto ret_unlock;
1218
	}
1219 1220

	lreg = (reg & 0x7f) <<  12;
1221
	regmap_write(regs, REG_SSI_SACADD, lreg);
1222 1223
	regmap_update_bits(regs, REG_SSI_SACNT,
			   SSI_SACNT_RDWR_MASK, SSI_SACNT_RD);
1224 1225 1226

	udelay(100);

1227
	regmap_read(regs, REG_SSI_SACDAT, &reg_val);
M
Markus Pargmann 已提交
1228
	val = (reg_val >> 4) & 0xffff;
1229

1230 1231
	clk_disable_unprepare(fsl_ac97_data->clk);

1232 1233
ret_unlock:
	mutex_unlock(&fsl_ac97_data->ac97_reg_lock);
1234 1235 1236 1237
	return val;
}

static struct snd_ac97_bus_ops fsl_ssi_ac97_ops = {
1238 1239
	.read = fsl_ssi_ac97_read,
	.write = fsl_ssi_ac97_write,
1240 1241
};

1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261
/**
 * 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);

1262 1263
	/* AC97 should start earlier to communicate with CODECs */
	if (fsl_ssi_is_ac97(ssi)) {
1264
		_fsl_ssi_set_dai_fmt(ssi, ssi->dai_fmt);
1265 1266 1267
		fsl_ssi_setup_ac97(ssi);
	}

1268 1269 1270
	return 0;
}

1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288
/**
 * 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);
	}
}
1289
/**
1290
 * Make every character in a string lower-case
1291
 */
1292 1293
static void make_lowercase(char *s)
{
1294 1295 1296 1297
	if (!s)
		return;
	for (; *s; s++)
		*s = tolower(*s);
1298 1299
}

1300
static int fsl_ssi_imx_probe(struct platform_device *pdev,
1301
			     struct fsl_ssi *ssi, void __iomem *iomem)
1302
{
1303
	struct device *dev = &pdev->dev;
1304 1305
	int ret;

N
Nicolin Chen 已提交
1306
	/* Backward compatible for a DT without ipg clock name assigned */
1307
	if (ssi->has_ipg_clk_name)
1308
		ssi->clk = devm_clk_get(dev, "ipg");
1309
	else
1310
		ssi->clk = devm_clk_get(dev, NULL);
1311 1312
	if (IS_ERR(ssi->clk)) {
		ret = PTR_ERR(ssi->clk);
1313
		dev_err(dev, "failed to get clock: %d\n", ret);
1314 1315 1316
		return ret;
	}

N
Nicolin Chen 已提交
1317
	/* Enable the clock since regmap will not handle it in this case */
1318 1319
	if (!ssi->has_ipg_clk_name) {
		ret = clk_prepare_enable(ssi->clk);
1320
		if (ret) {
1321
			dev_err(dev, "clk_prepare_enable failed: %d\n", ret);
1322 1323
			return ret;
		}
1324 1325
	}

N
Nicolin Chen 已提交
1326
	/* Do not error out for slave cases that live without a baud clock */
1327
	ssi->baudclk = devm_clk_get(dev, "baud");
1328
	if (IS_ERR(ssi->baudclk))
1329
		dev_dbg(dev, "failed to get baud clock: %ld\n",
1330
			 PTR_ERR(ssi->baudclk));
1331

1332 1333
	ssi->dma_params_tx.maxburst = ssi->dma_maxburst;
	ssi->dma_params_rx.maxburst = ssi->dma_maxburst;
1334 1335
	ssi->dma_params_tx.addr = ssi->ssi_phys + REG_SSI_STX0;
	ssi->dma_params_rx.addr = ssi->ssi_phys + REG_SSI_SRX0;
1336

1337 1338
	/* Use even numbers to avoid channel swap due to SDMA script design */
	if (ssi->use_dual_fifo) {
1339 1340
		ssi->dma_params_tx.maxburst &= ~0x1;
		ssi->dma_params_rx.maxburst &= ~0x1;
1341 1342
	}

1343
	if (!ssi->use_dma) {
1344
		/*
N
Nicolin Chen 已提交
1345 1346
		 * Some boards use an incompatible codec. Use imx-fiq-pcm-audio
		 * to get it working, as DMA is not possible in this situation.
1347
		 */
1348 1349 1350 1351
		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;
1352

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

1362
	return 0;
1363 1364

error_pcm:
1365 1366
	if (!ssi->has_ipg_clk_name)
		clk_disable_unprepare(ssi->clk);
1367

1368
	return ret;
1369 1370
}

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

1379
static int fsl_ssi_probe_from_dt(struct fsl_ssi *ssi)
1380
{
1381 1382
	struct device *dev = ssi->dev;
	struct device_node *np = dev->of_node;
1383
	const struct of_device_id *of_id;
1384
	const char *p, *sprop;
1385
	const __be32 *iprop;
1386 1387
	u32 dmas[4];
	int ret;
1388

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

1393
	ssi->soc = of_id->data;
1394 1395 1396 1397

	ret = of_property_match_string(np, "clock-names", "ipg");
	/* Get error code if not found */
	ssi->has_ipg_clk_name = ret >= 0;
1398

N
Nicolin Chen 已提交
1399
	/* Check if being used in AC97 mode */
1400
	sprop = of_get_property(np, "fsl,mode", NULL);
1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420
	if (sprop && !strcmp(sprop, "ac97-slave")) {
		ssi->dai_fmt = FSLSSI_AC97_DAIFMT;

		ret = of_property_read_u32(np, "cell-index", &ssi->card_idx);
		if (ret) {
			dev_err(dev, "failed to get SSI index property\n");
			return -EINVAL;
		}
		strcpy(ssi->card_name, "ac97-codec");
	} else if (!of_find_property(np, "fsl,ssi-asynchronous", NULL)) {
		/*
		 * In synchronous mode, STCK and STFS ports are used by RX
		 * as well. So the software should limit the sample rates,
		 * sample bits and channels to be symmetric.
		 *
		 * This is exclusive with FSLSSI_AC97_FORMATS as AC97 runs
		 * in the SSI synchronous mode however it does not have to
		 * limit symmetric sample rates and sample bits.
		 */
		ssi->synchronous = true;
1421 1422
	}

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

1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481
	/* Fetch FIFO depth; Set to 8 for older DT without this property */
	iprop = of_get_property(np, "fsl,fifo-depth", NULL);
	if (iprop)
		ssi->fifo_depth = be32_to_cpup(iprop);
	else
		ssi->fifo_depth = 8;

	/* Use dual FIFO mode depending on the support from SDMA script */
	ret = of_property_read_u32_array(np, "dmas", dmas, 4);
	if (ssi->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL)
		ssi->use_dual_fifo = true;

	/*
	 * 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
	 *
	 * If card_name is set by AC97 earlier, bypass here since it uses a
	 * different name to register the device.
	 */
	if (!ssi->card_name[0] && of_get_property(np, "codec-handle", NULL)) {
		sprop = of_get_property(of_find_node_by_path("/"),
					"compatible", NULL);
		/* Strip "fsl," in the compatible name if applicable */
		p = strrchr(sprop, ',');
		if (p)
			sprop = p + 1;
		snprintf(ssi->card_name, sizeof(ssi->card_name),
			 "snd-soc-%s", sprop);
		make_lowercase(ssi->card_name);
		ssi->card_idx = 0;
	}

	return 0;
}

static int fsl_ssi_probe(struct platform_device *pdev)
{
	struct regmap_config regconfig = fsl_ssi_regconfig;
	struct device *dev = &pdev->dev;
	struct fsl_ssi *ssi;
	struct resource *res;
	void __iomem *iomem;
	int ret = 0;

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

	ssi->dev = dev;

	/* Probe from DT */
	ret = fsl_ssi_probe_from_dt(ssi);
	if (ret)
		return ret;

1482 1483
	if (fsl_ssi_is_ac97(ssi)) {
		memcpy(&ssi->cpu_dai_drv, &fsl_ssi_ac97_dai,
1484
		       sizeof(fsl_ssi_ac97_dai));
1485
		fsl_ac97_data = ssi;
1486
	} else {
1487
		memcpy(&ssi->cpu_dai_drv, &fsl_ssi_dai_template,
1488 1489
		       sizeof(fsl_ssi_dai_template));
	}
1490
	ssi->cpu_dai_drv.name = dev_name(dev);
1491

1492
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1493
	iomem = devm_ioremap_resource(dev, res);
1494 1495
	if (IS_ERR(iomem))
		return PTR_ERR(iomem);
1496
	ssi->ssi_phys = res->start;
M
Markus Pargmann 已提交
1497

1498
	if (ssi->soc->imx21regs) {
N
Nicolin Chen 已提交
1499
		/* No SACC{ST,EN,DIS} regs in imx21-class SSI */
1500
		regconfig.max_register = REG_SSI_SRMSK;
1501
		regconfig.num_reg_defaults_raw =
1502
			REG_SSI_SRMSK / sizeof(uint32_t) + 1;
1503 1504
	}

1505
	if (ssi->has_ipg_clk_name)
1506 1507
		ssi->regs = devm_regmap_init_mmio_clk(dev, "ipg", iomem,
						      &regconfig);
1508 1509
	else
		ssi->regs = devm_regmap_init_mmio(dev, iomem, &regconfig);
1510
	if (IS_ERR(ssi->regs)) {
1511
		dev_err(dev, "failed to init register map\n");
1512
		return PTR_ERR(ssi->regs);
M
Markus Pargmann 已提交
1513
	}
1514

1515 1516
	ssi->irq = platform_get_irq(pdev, 0);
	if (ssi->irq < 0) {
1517
		dev_err(dev, "no irq for node %s\n", pdev->name);
1518
		return ssi->irq;
1519 1520
	}

1521 1522 1523
	/* Set software limitations for synchronous mode except AC97 */
	if (ssi->synchronous && !fsl_ssi_is_ac97(ssi)) {
		ssi->cpu_dai_drv.symmetric_rates = 1;
1524
		ssi->cpu_dai_drv.symmetric_channels = 1;
1525
		ssi->cpu_dai_drv.symmetric_samplebits = 1;
1526
	}
1527

1528
	/*
N
Nicolin Chen 已提交
1529
	 * Configure TX and RX DMA watermarks -- when to send a DMA request
1530
	 *
N
Nicolin Chen 已提交
1531 1532
	 * Values should be tested to avoid FIFO under/over run. Set maxburst
	 * to fifo_watermark to maxiumize DMA transaction to reduce overhead.
1533
	 */
1534
	switch (ssi->fifo_depth) {
1535 1536
	case 15:
		/*
N
Nicolin Chen 已提交
1537 1538 1539 1540 1541 1542
		 * 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
1543
		 */
1544 1545
		ssi->fifo_watermark = 8;
		ssi->dma_maxburst = 8;
1546 1547 1548
		break;
	case 8:
	default:
N
Nicolin Chen 已提交
1549
		/* Safely use old watermark configurations for older chips */
1550 1551
		ssi->fifo_watermark = ssi->fifo_depth - 2;
		ssi->dma_maxburst = ssi->fifo_depth - 2;
1552 1553 1554
		break;
	}

1555
	dev_set_drvdata(dev, ssi);
1556

1557 1558
	if (ssi->soc->imx) {
		ret = fsl_ssi_imx_probe(pdev, ssi, iomem);
1559
		if (ret)
F
Fabio Estevam 已提交
1560
			return ret;
1561 1562
	}

1563 1564
	if (fsl_ssi_is_ac97(ssi)) {
		mutex_init(&ssi->ac97_reg_lock);
1565 1566
		ret = snd_soc_set_ac97_ops_of_reset(&fsl_ssi_ac97_ops, pdev);
		if (ret) {
1567
			dev_err(dev, "failed to set AC'97 ops\n");
1568 1569 1570 1571
			goto error_ac97_ops;
		}
	}

1572
	ret = devm_snd_soc_register_component(dev, &fsl_ssi_component,
1573
					      &ssi->cpu_dai_drv, 1);
1574
	if (ret) {
1575
		dev_err(dev, "failed to register DAI: %d\n", ret);
1576 1577 1578
		goto error_asoc_register;
	}

1579
	if (ssi->use_dma) {
1580 1581
		ret = devm_request_irq(dev, ssi->irq, fsl_ssi_isr, 0,
				       dev_name(dev), ssi);
1582
		if (ret < 0) {
1583
			dev_err(dev, "failed to claim irq %u\n", ssi->irq);
1584
			goto error_asoc_register;
1585
		}
1586 1587
	}

1588
	ret = fsl_ssi_debugfs_create(&ssi->dbg_stats, dev);
1589
	if (ret)
1590
		goto error_asoc_register;
1591

1592 1593 1594
	/* Initially configures SSI registers */
	fsl_ssi_hw_init(ssi);

1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612
	/* Register a platform device for older bindings or AC97 */
	if (ssi->card_name[0]) {
		struct device *parent = dev;
		/*
		 * Do not set SSI dev as the parent of AC97 CODEC device since
		 * it does not have a DT node. Otherwise ASoC core will assume
		 * CODEC has the same DT node as the SSI, so it may bypass the
		 * dai_probe() of SSI and then cause NULL DMA data pointers.
		 */
		if (fsl_ssi_is_ac97(ssi))
			parent = NULL;

		ssi->card_pdev = platform_device_register_data(parent,
				ssi->card_name, ssi->card_idx, NULL, 0);
		if (IS_ERR(ssi->card_pdev)) {
			ret = PTR_ERR(ssi->card_pdev);
			dev_err(dev, "failed to register %s: %d\n",
				ssi->card_name, ret);
1613 1614 1615 1616
			goto error_sound_card;
		}
	}

1617
	return 0;
1618

1619
error_sound_card:
1620
	fsl_ssi_debugfs_remove(&ssi->dbg_stats);
1621
error_asoc_register:
1622
	if (fsl_ssi_is_ac97(ssi))
1623 1624
		snd_soc_set_ac97_ops(NULL);
error_ac97_ops:
1625 1626
	if (fsl_ssi_is_ac97(ssi))
		mutex_destroy(&ssi->ac97_reg_lock);
1627

1628 1629
	if (ssi->soc->imx)
		fsl_ssi_imx_clean(pdev, ssi);
1630

1631
	return ret;
1632 1633
}

1634
static int fsl_ssi_remove(struct platform_device *pdev)
1635
{
1636
	struct fsl_ssi *ssi = dev_get_drvdata(&pdev->dev);
1637

1638
	fsl_ssi_debugfs_remove(&ssi->dbg_stats);
1639

1640 1641
	if (ssi->card_pdev)
		platform_device_unregister(ssi->card_pdev);
1642

1643 1644 1645
	/* Clean up SSI registers */
	fsl_ssi_hw_clean(ssi);

1646 1647
	if (ssi->soc->imx)
		fsl_ssi_imx_clean(pdev, ssi);
1648

1649
	if (fsl_ssi_is_ac97(ssi)) {
1650
		snd_soc_set_ac97_ops(NULL);
1651
		mutex_destroy(&ssi->ac97_reg_lock);
1652
	}
1653

1654
	return 0;
1655
}
1656

1657 1658 1659
#ifdef CONFIG_PM_SLEEP
static int fsl_ssi_suspend(struct device *dev)
{
1660 1661
	struct fsl_ssi *ssi = dev_get_drvdata(dev);
	struct regmap *regs = ssi->regs;
1662

1663 1664
	regmap_read(regs, REG_SSI_SFCSR, &ssi->regcache_sfcsr);
	regmap_read(regs, REG_SSI_SACNT, &ssi->regcache_sacnt);
1665 1666 1667 1668 1669 1670 1671 1672 1673

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

	return 0;
}

static int fsl_ssi_resume(struct device *dev)
{
1674 1675
	struct fsl_ssi *ssi = dev_get_drvdata(dev);
	struct regmap *regs = ssi->regs;
1676 1677 1678

	regcache_cache_only(regs, false);

1679
	regmap_update_bits(regs, REG_SSI_SFCSR,
1680 1681 1682
			   SSI_SFCSR_RFWM1_MASK | SSI_SFCSR_TFWM1_MASK |
			   SSI_SFCSR_RFWM0_MASK | SSI_SFCSR_TFWM0_MASK,
			   ssi->regcache_sfcsr);
1683
	regmap_write(regs, REG_SSI_SACNT, ssi->regcache_sacnt);
1684 1685 1686 1687 1688 1689 1690 1691 1692

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

1693
static struct platform_driver fsl_ssi_driver = {
1694 1695 1696
	.driver = {
		.name = "fsl-ssi-dai",
		.of_match_table = fsl_ssi_ids,
1697
		.pm = &fsl_ssi_pm,
1698 1699 1700 1701
	},
	.probe = fsl_ssi_probe,
	.remove = fsl_ssi_remove,
};
1702

1703
module_platform_driver(fsl_ssi_driver);
1704

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