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
	__be32 sisr;
389
	__be32 sisr2;
390

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

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

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

400
	return IRQ_HANDLED;
401 402
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

657 658 659
	return 0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	return 0;
}

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

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

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

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

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

832
	if (!fsl_ssi_is_ac97(ssi)) {
833 834 835 836 837 838 839
		/*
		 * 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 已提交
840
		/* Normal + Network mode to send 16-bit data in 32-bit frames */
841
		if (fsl_ssi_is_i2s_cbm_cfs(ssi) && sample_size == 16)
842
			i2s_net = SSI_SCR_I2S_MODE_NORMAL | SSI_SCR_NET;
843 844 845

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

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

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

	return 0;
}

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

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

	return 0;
}

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

878
	ssi->dai_fmt = fmt;
879

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

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

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

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

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

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

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

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

978 979
	stcr = strcr;
	srcr = strcr;
980

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

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

	return 0;
998 999 1000
}

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

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

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

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

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

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

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

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

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

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

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

1055 1056 1057
	return 0;
}

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

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

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

	default:
		return -EINVAL;
	}

	return 0;
}

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

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

	return 0;
}

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

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

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

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

1166
static struct fsl_ssi *fsl_ac97_data;
1167

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

	if (reg > 0x7f)
		return;

1179 1180
	mutex_lock(&fsl_ac97_data->ac97_reg_lock);

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

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

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

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

	clk_disable_unprepare(fsl_ac97_data->clk);
1199 1200 1201

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

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

1213 1214
	mutex_lock(&fsl_ac97_data->ac97_reg_lock);

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

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

	udelay(100);

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

1231 1232
	clk_disable_unprepare(fsl_ac97_data->clk);

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

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

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

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

1269 1270 1271
	return 0;
}

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

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

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

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

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

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

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

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

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

1363
	return 0;
1364 1365

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

1369
	return ret;
1370 1371
}

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

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

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

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

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

N
Nicolin Chen 已提交
1400
	/* Check if being used in AC97 mode */
1401
	sprop = of_get_property(np, "fsl,mode", NULL);
1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421
	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;
1422 1423
	}

N
Nicolin Chen 已提交
1424
	/* Select DMA or FIQ */
1425
	ssi->use_dma = !of_property_read_bool(np, "fsl,fiq-stream-filter");
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 1482
	/* 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;

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

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

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

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

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

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

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

1556
	dev_set_drvdata(dev, ssi);
1557

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

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

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

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

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

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

1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613
	/* 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);
1614 1615 1616 1617
			goto error_sound_card;
		}
	}

1618
	return 0;
1619

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

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

1632
	return ret;
1633 1634
}

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

1639
	fsl_ssi_debugfs_remove(&ssi->dbg_stats);
1640

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

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

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

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

1655
	return 0;
1656
}
1657

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

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

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

	return 0;
}

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

	regcache_cache_only(regs, false);

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

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

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

1704
module_platform_driver(fsl_ssi_driver);
1705

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