fsl_ssi.c 46.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
// SPDX-License-Identifier: GPL-2.0
//
// Freescale SSI ALSA SoC Digital Audio Interface (DAI) driver
//
// Author: Timur Tabi <timur@freescale.com>
//
// Copyright 2007-2010 Freescale Semiconductor, Inc.
//
// 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.
27 28

#include <linux/init.h>
29
#include <linux/io.h>
30 31
#include <linux/module.h>
#include <linux/interrupt.h>
32
#include <linux/clk.h>
33
#include <linux/ctype.h>
34 35
#include <linux/device.h>
#include <linux/delay.h>
36
#include <linux/mutex.h>
37
#include <linux/slab.h>
38
#include <linux/spinlock.h>
39
#include <linux/of.h>
40 41
#include <linux/of_address.h>
#include <linux/of_irq.h>
42
#include <linux/of_platform.h>
43 44 45 46 47 48

#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/initval.h>
#include <sound/soc.h>
49
#include <sound/dmaengine_pcm.h>
50 51

#include "fsl_ssi.h"
52
#include "imx-pcm.h"
53

54 55 56 57
/* Define RX and TX to index ssi->regvals array; Can be 0 or 1 only */
#define RX 0
#define TX 1

58 59 60 61 62 63 64 65 66 67 68 69 70
/**
 * 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
71 72 73 74 75 76 77
#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)
78
#else
79 80 81 82 83 84 85
#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)
86 87
#endif

88 89 90 91 92 93 94 95 96 97
/*
 * 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)

98 99 100 101 102 103 104 105 106 107 108 109
#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)
110 111 112 113

enum fsl_ssi_type {
	FSL_SSI_MCP8610,
	FSL_SSI_MX21,
114
	FSL_SSI_MX35,
115 116 117
	FSL_SSI_MX51,
};

118
struct fsl_ssi_regvals {
119 120 121 122 123 124
	u32 sier;
	u32 srcr;
	u32 stcr;
	u32 scr;
};

125 126 127
static bool fsl_ssi_readable_reg(struct device *dev, unsigned int reg)
{
	switch (reg) {
128 129
	case REG_SSI_SACCEN:
	case REG_SSI_SACCDIS:
130 131 132 133 134 135 136 137 138
		return false;
	default:
		return true;
	}
}

static bool fsl_ssi_volatile_reg(struct device *dev, unsigned int reg)
{
	switch (reg) {
139 140 141 142 143 144 145 146 147 148 149 150
	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:
151 152 153 154 155 156
		return true;
	default:
		return false;
	}
}

157 158 159
static bool fsl_ssi_precious_reg(struct device *dev, unsigned int reg)
{
	switch (reg) {
160 161 162 163 164 165
	case REG_SSI_SRX0:
	case REG_SSI_SRX1:
	case REG_SSI_SISR:
	case REG_SSI_SACADD:
	case REG_SSI_SACDAT:
	case REG_SSI_SATAG:
166 167 168 169 170 171
		return true;
	default:
		return false;
	}
}

172 173 174
static bool fsl_ssi_writeable_reg(struct device *dev, unsigned int reg)
{
	switch (reg) {
175 176 177
	case REG_SSI_SRX0:
	case REG_SSI_SRX1:
	case REG_SSI_SACCST:
178 179 180 181 182 183
		return false;
	default:
		return true;
	}
}

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

198 199
struct fsl_ssi_soc_data {
	bool imx;
200
	bool imx21regs; /* imx21-class SSI - no SACC{ST,EN,DIS} regs */
201 202 203 204
	bool offline_config;
	u32 sisr_write_mask;
};

205
/**
206
 * fsl_ssi: per-SSI private data
207
 *
N
Nicolin Chen 已提交
208
 * @regs: Pointer to the regmap registers
209
 * @irq: IRQ of this SSI
210 211 212
 * @cpu_dai_drv: CPU DAI driver for this device
 *
 * @dai_fmt: DAI configuration this device is currently used with
213
 * @streams: Mask of current active streams: BIT(TX) and BIT(RX)
214
 * @i2s_net: I2S and Network mode configurations of SCR register
215
 *           (this is the initial settings based on the DAI format)
216
 * @synchronous: Use synchronous mode - both of TX and RX use STCK and SFCK
217
 * @use_dma: DMA is used or FIQ with stream filter
N
Nicolin Chen 已提交
218 219 220 221 222
 * @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
223
 * @regvals: Specific RX/TX register settings
224
 *
N
Nicolin Chen 已提交
225 226
 * @clk: Clock source to access register
 * @baudclk: Clock source to generate bit and frame-sync clocks
227 228
 * @baudclk_streams: Active streams that are using baudclk
 *
N
Nicolin Chen 已提交
229 230 231
 * @regcache_sfcsr: Cache sfcsr register value during suspend and resume
 * @regcache_sacnt: Cache sacnt register value during suspend and resume
 *
232 233 234 235 236 237
 * @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
 *
238 239 240 241 242 243
 * @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
244 245 246
 *
 * @dbg_stats: Debugging statistics
 *
247
 * @soc: SoC specific data
N
Nicolin Chen 已提交
248 249 250 251 252 253 254
 * @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.
255
 *
N
Nicolin Chen 已提交
256
 * @ac97_reg_lock: Mutex lock to serialize AC97 register access operations
257
 */
258
struct fsl_ssi {
M
Markus Pargmann 已提交
259
	struct regmap *regs;
260
	int irq;
261
	struct snd_soc_dai_driver cpu_dai_drv;
262

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

275
	struct clk *clk;
276
	struct clk *baudclk;
277
	unsigned int baudclk_streams;
278

279
	u32 regcache_sfcsr;
280
	u32 regcache_sacnt;
281

282 283
	struct snd_dmaengine_dai_dma_data dma_params_tx;
	struct snd_dmaengine_dai_dma_data dma_params_rx;
284 285
	dma_addr_t ssi_phys;

286
	struct imx_pcm_fiq_params fiq_params;
287

288 289 290
	struct platform_device *card_pdev;
	char card_name[32];
	u32 card_idx;
291

292
	struct fsl_ssi_dbg dbg_stats;
293

294
	const struct fsl_ssi_soc_data *soc;
295
	struct device *dev;
296 297 298

	u32 fifo_watermark;
	u32 dma_maxburst;
299 300

	struct mutex ac97_reg_lock;
301
};
302 303

/*
N
Nicolin Chen 已提交
304
 * SoC specific data
305
 *
N
Nicolin Chen 已提交
306 307 308 309 310 311 312 313 314 315 316
 * 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.
317 318
 */

319 320 321
static struct fsl_ssi_soc_data fsl_ssi_mpc8610 = {
	.imx = false,
	.offline_config = true,
322
	.sisr_write_mask = SSI_SISR_RFRC | SSI_SISR_TFRC |
323 324
			   SSI_SISR_ROE0 | SSI_SISR_ROE1 |
			   SSI_SISR_TUE0 | SSI_SISR_TUE1,
325 326 327 328
};

static struct fsl_ssi_soc_data fsl_ssi_imx21 = {
	.imx = true,
329
	.imx21regs = true,
330 331 332 333 334 335 336
	.offline_config = true,
	.sisr_write_mask = 0,
};

static struct fsl_ssi_soc_data fsl_ssi_imx35 = {
	.imx = true,
	.offline_config = true,
337
	.sisr_write_mask = SSI_SISR_RFRC | SSI_SISR_TFRC |
338 339
			   SSI_SISR_ROE0 | SSI_SISR_ROE1 |
			   SSI_SISR_TUE0 | SSI_SISR_TUE1,
340 341 342 343 344
};

static struct fsl_ssi_soc_data fsl_ssi_imx51 = {
	.imx = true,
	.offline_config = false,
345
	.sisr_write_mask = SSI_SISR_ROE0 | SSI_SISR_ROE1 |
346
			   SSI_SISR_TUE0 | SSI_SISR_TUE1,
347 348 349 350 351 352 353 354 355 356 357
};

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

358
static bool fsl_ssi_is_ac97(struct fsl_ssi *ssi)
359
{
360
	return (ssi->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) ==
361
		SND_SOC_DAIFMT_AC97;
362 363
}

364
static bool fsl_ssi_is_i2s_master(struct fsl_ssi *ssi)
365
{
366
	return (ssi->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) ==
367 368 369
		SND_SOC_DAIFMT_CBS_CFS;
}

370
static bool fsl_ssi_is_i2s_cbm_cfs(struct fsl_ssi *ssi)
371
{
372
	return (ssi->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) ==
373 374
		SND_SOC_DAIFMT_CBM_CFS;
}
N
Nicolin Chen 已提交
375

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

385
	regmap_read(regs, REG_SSI_SISR, &sisr);
386

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

392
	fsl_ssi_dbg_isr(&ssi->dbg_stats, sisr);
393

394
	return IRQ_HANDLED;
395 396
}

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

411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430
	/* 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;
431
	} else {
432 433 434 435
		/* Otherwise, only set bits for the current stream */
		srcr = vals[dir].srcr;
		stcr = vals[dir].stcr;
		sier = vals[dir].sier;
436
	}
437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474

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

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

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

513 514
	/* Check if the opposite stream is active */
	aactive = ssi->streams & BIT(adir);
515

516
	vals = &ssi->regvals[dir];
517

518 519
	/* Get regvals of the opposite stream to keep opposite stream safe */
	avals = &ssi->regvals[adir];
520 521

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

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

530 531
	/* Log the disabled stream to the mask */
	ssi->streams &= ~BIT(dir);
532

533 534 535 536 537 538
	/*
	 * 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;
539

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

555 556 557 558
	/* 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);
559

560 561 562 563
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));
564 565
}

566
static void fsl_ssi_tx_ac97_saccst_setup(struct fsl_ssi *ssi)
567
{
568
	struct regmap *regs = ssi->regs;
569 570

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

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

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

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

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

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

611
static void fsl_ssi_setup_ac97(struct fsl_ssi *ssi)
612
{
613
	struct regmap *regs = ssi->regs;
614

N
Nicolin Chen 已提交
615
	/* Setup the clock control register */
616 617
	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));
618

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

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

627
	regmap_write(regs, REG_SSI_SOR, SSI_SOR_WAIT(3));
628 629
}

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

637
	ret = clk_prepare_enable(ssi->clk);
638 639
	if (ret)
		return ret;
640

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

651 652 653
	return 0;
}

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

660
	clk_disable_unprepare(ssi->clk);
661 662
}

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

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

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

	/* Don't apply it to any non-baudclk circumstance */
699
	if (IS_ERR(ssi->baudclk))
700 701
		return -EINVAL;

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

711
	baudclk_is_used = ssi->baudclk_streams & ~(BIT(substream->stream));
712

713 714 715 716 717 718 719
	/* 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++) {
720
		tmprate = freq * factor * (i + 1);
721 722

		if (baudclk_is_used)
723
			clkrate = clk_get_rate(ssi->baudclk);
724
		else
725
			clkrate = clk_round_rate(ssi->baudclk, tmprate);
726

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

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

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

760 761
	stccr = SSI_SxCCR_PM(pm + 1) | (div2 ? SSI_SxCCR_DIV2 : 0) |
		(psr ? SSI_SxCCR_PSR : 0);
762
	mask = SSI_SxCCR_PM_MASK | SSI_SxCCR_DIV2 | SSI_SxCCR_PSR;
763

764
	/* STCCR is used for RX in synchronous mode */
765
	tx2 = tx || ssi->synchronous;
766
	regmap_update_bits(regs, REG_SSI_SxCCR(tx2), mask, stccr);
767

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

	return 0;
}

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

802
	/*
N
Nicolin Chen 已提交
803 804 805 806
	 * 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.
807
	 */
808
	if (ssi->streams && ssi->synchronous)
809
		return 0;
810

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

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

822
			ssi->baudclk_streams |= BIT(substream->stream);
823
		}
824 825
	}

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

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

842
		regmap_update_bits(regs, REG_SSI_SCR,
843
				   SSI_SCR_I2S_NET_MASK, i2s_net);
844 845
	}

846
	/* In synchronous mode, the SSI uses STCCR for capture */
847
	tx2 = tx || ssi->synchronous;
848
	regmap_update_bits(regs, REG_SSI_SxCCR(tx2), SSI_SxCCR_WL_MASK, wl);
849 850 851 852

	return 0;
}

853
static int fsl_ssi_hw_free(struct snd_pcm_substream *substream,
854
			   struct snd_soc_dai *dai)
855 856
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
857
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
858

859
	if (fsl_ssi_is_i2s_master(ssi) &&
860
	    ssi->baudclk_streams & BIT(substream->stream)) {
861 862
		clk_disable_unprepare(ssi->baudclk);
		ssi->baudclk_streams &= ~BIT(substream->stream);
863 864 865 866 867
	}

	return 0;
}

868
static int _fsl_ssi_set_dai_fmt(struct fsl_ssi *ssi, unsigned int fmt)
869
{
870
	u32 strcr = 0, scr = 0, stcr, srcr, mask;
871

872
	ssi->dai_fmt = fmt;
873

N
Nicolin Chen 已提交
874
	/* Synchronize frame sync clock for TE to avoid data slipping */
875
	scr |= SSI_SCR_SYNC_TX_FS;
876

877 878
	/* Set to default shifting settings: LSB_ALIGNED */
	strcr |= SSI_STCR_TXBIT0;
879

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

902 903 904 905 906
		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));

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

930
	scr |= ssi->i2s_net;
931 932 933 934 935 936 937 938

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

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

972 973
	stcr = strcr;
	srcr = strcr;
974

N
Nicolin Chen 已提交
975
	/* Set SYN mode and clear RXDIR bit when using SYN or AC97 mode */
976
	if (ssi->synchronous || fsl_ssi_is_ac97(ssi)) {
977 978
		srcr &= ~SSI_SRCR_RXDIR;
		scr |= SSI_SCR_SYN;
979 980
	}

981 982 983 984 985 986 987 988 989
	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);
990 991

	return 0;
992 993 994
}

/**
N
Nicolin Chen 已提交
995
 * Configure Digital Audio Interface (DAI) Format
996
 */
997
static int fsl_ssi_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
998
{
999
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1000

N
Nicolin Chen 已提交
1001
	/* AC97 configured DAIFMT earlier in the probe() */
1002
	if (fsl_ssi_is_ac97(ssi))
1003 1004
		return 0;

1005
	return _fsl_ssi_set_dai_fmt(ssi, fmt);
1006 1007 1008
}

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

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

1024
	/* The slot number should be >= 2 if using Network mode or I2S mode */
1025
	if (ssi->i2s_net && slots < 2) {
1026
		dev_err(dai->dev, "slot number should be >= 2 in I2S or NET\n");
1027 1028 1029
		return -EINVAL;
	}

1030 1031 1032 1033
	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));
1034

1035
	/* Save the SCR register value */
1036
	regmap_read(regs, REG_SSI_SCR, &val);
N
Nicolin Chen 已提交
1037
	/* Temporarily enable SSI to allow SxMSKs to be configurable */
1038
	regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, SSI_SCR_SSIEN);
1039

1040 1041
	regmap_write(regs, REG_SSI_STMSK, ~tx_mask);
	regmap_write(regs, REG_SSI_SRMSK, ~rx_mask);
1042

N
Nicolin Chen 已提交
1043
	/* Restore the value of SSIEN bit */
1044
	regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, val);
1045

1046 1047
	ssi->slot_width = slot_width;
	ssi->slots = slots;
1048

1049 1050 1051
	return 0;
}

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

1065 1066
	switch (cmd) {
	case SNDRV_PCM_TRIGGER_START:
1067
	case SNDRV_PCM_TRIGGER_RESUME:
1068
	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
		/*
		 * 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);
1079 1080 1081
		break;

	case SNDRV_PCM_TRIGGER_STOP:
1082
	case SNDRV_PCM_TRIGGER_SUSPEND:
1083
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1084
		fsl_ssi_config_disable(ssi, tx);
1085 1086 1087 1088 1089 1090 1091 1092 1093
		break;

	default:
		return -EINVAL;
	}

	return 0;
}

1094 1095
static int fsl_ssi_dai_probe(struct snd_soc_dai *dai)
{
1096
	struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1097

1098 1099 1100
	if (ssi->soc->imx && ssi->use_dma)
		snd_soc_dai_init_dma_data(dai, &ssi->dma_params_tx,
					  &ssi->dma_params_rx);
1101 1102 1103 1104

	return 0;
}

1105
static const struct snd_soc_dai_ops fsl_ssi_dai_ops = {
1106 1107 1108 1109 1110 1111 1112
	.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,
1113 1114
};

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

1134
static const struct snd_soc_component_driver fsl_ssi_component = {
1135
	.name = "fsl-ssi",
1136 1137
};

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

1160
static struct fsl_ssi *fsl_ac97_data;
1161

1162
static void fsl_ssi_ac97_write(struct snd_ac97 *ac97, unsigned short reg,
1163
			       unsigned short val)
1164
{
M
Markus Pargmann 已提交
1165
	struct regmap *regs = fsl_ac97_data->regs;
1166 1167
	unsigned int lreg;
	unsigned int lval;
1168
	int ret;
1169 1170 1171 1172

	if (reg > 0x7f)
		return;

1173 1174
	mutex_lock(&fsl_ac97_data->ac97_reg_lock);

1175 1176 1177 1178
	ret = clk_prepare_enable(fsl_ac97_data->clk);
	if (ret) {
		pr_err("ac97 write clk_prepare_enable failed: %d\n",
			ret);
1179
		goto ret_unlock;
1180
	}
1181 1182

	lreg = reg <<  12;
1183
	regmap_write(regs, REG_SSI_SACADD, lreg);
1184 1185

	lval = val << 4;
1186
	regmap_write(regs, REG_SSI_SACDAT, lval);
1187

1188 1189
	regmap_update_bits(regs, REG_SSI_SACNT,
			   SSI_SACNT_RDWR_MASK, SSI_SACNT_WR);
1190
	udelay(100);
1191 1192

	clk_disable_unprepare(fsl_ac97_data->clk);
1193 1194 1195

ret_unlock:
	mutex_unlock(&fsl_ac97_data->ac97_reg_lock);
1196 1197
}

1198
static unsigned short fsl_ssi_ac97_read(struct snd_ac97 *ac97,
1199
					unsigned short reg)
1200
{
M
Markus Pargmann 已提交
1201
	struct regmap *regs = fsl_ac97_data->regs;
1202
	unsigned short val = 0;
M
Markus Pargmann 已提交
1203
	u32 reg_val;
1204
	unsigned int lreg;
1205 1206
	int ret;

1207 1208
	mutex_lock(&fsl_ac97_data->ac97_reg_lock);

1209 1210
	ret = clk_prepare_enable(fsl_ac97_data->clk);
	if (ret) {
1211
		pr_err("ac97 read clk_prepare_enable failed: %d\n", ret);
1212
		goto ret_unlock;
1213
	}
1214 1215

	lreg = (reg & 0x7f) <<  12;
1216
	regmap_write(regs, REG_SSI_SACADD, lreg);
1217 1218
	regmap_update_bits(regs, REG_SSI_SACNT,
			   SSI_SACNT_RDWR_MASK, SSI_SACNT_RD);
1219 1220 1221

	udelay(100);

1222
	regmap_read(regs, REG_SSI_SACDAT, &reg_val);
M
Markus Pargmann 已提交
1223
	val = (reg_val >> 4) & 0xffff;
1224

1225 1226
	clk_disable_unprepare(fsl_ac97_data->clk);

1227 1228
ret_unlock:
	mutex_unlock(&fsl_ac97_data->ac97_reg_lock);
1229 1230 1231 1232
	return val;
}

static struct snd_ac97_bus_ops fsl_ssi_ac97_ops = {
1233 1234
	.read = fsl_ssi_ac97_read,
	.write = fsl_ssi_ac97_write,
1235 1236
};

1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256
/**
 * 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);

1257 1258
	/* AC97 should start earlier to communicate with CODECs */
	if (fsl_ssi_is_ac97(ssi)) {
1259
		_fsl_ssi_set_dai_fmt(ssi, ssi->dai_fmt);
1260 1261 1262
		fsl_ssi_setup_ac97(ssi);
	}

1263 1264 1265
	return 0;
}

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

1295
static int fsl_ssi_imx_probe(struct platform_device *pdev,
1296
			     struct fsl_ssi *ssi, void __iomem *iomem)
1297
{
1298
	struct device *dev = &pdev->dev;
1299 1300
	int ret;

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

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

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

1327 1328
	ssi->dma_params_tx.maxburst = ssi->dma_maxburst;
	ssi->dma_params_rx.maxburst = ssi->dma_maxburst;
1329 1330
	ssi->dma_params_tx.addr = ssi->ssi_phys + REG_SSI_STX0;
	ssi->dma_params_rx.addr = ssi->ssi_phys + REG_SSI_SRX0;
1331

1332 1333
	/* Use even numbers to avoid channel swap due to SDMA script design */
	if (ssi->use_dual_fifo) {
1334 1335
		ssi->dma_params_tx.maxburst &= ~0x1;
		ssi->dma_params_rx.maxburst &= ~0x1;
1336 1337
	}

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

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

1357
	return 0;
1358 1359

error_pcm:
1360 1361
	if (!ssi->has_ipg_clk_name)
		clk_disable_unprepare(ssi->clk);
1362

1363
	return ret;
1364 1365
}

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

1374
static int fsl_ssi_probe_from_dt(struct fsl_ssi *ssi)
1375
{
1376 1377
	struct device *dev = ssi->dev;
	struct device_node *np = dev->of_node;
1378
	const struct of_device_id *of_id;
1379
	const char *p, *sprop;
1380
	const __be32 *iprop;
1381 1382
	u32 dmas[4];
	int ret;
1383

1384
	of_id = of_match_device(fsl_ssi_ids, dev);
1385
	if (!of_id || !of_id->data)
1386 1387
		return -EINVAL;

1388
	ssi->soc = of_id->data;
1389 1390 1391 1392

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

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

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

1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441
	/* 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)) {
1442 1443 1444 1445
		struct device_node *root = of_find_node_by_path("/");

		sprop = of_get_property(root, "compatible", NULL);
		of_node_put(root);
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
		/* 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;

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

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

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

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

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

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

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

1552
	dev_set_drvdata(dev, ssi);
1553

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

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

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

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

1585
	ret = fsl_ssi_debugfs_create(&ssi->dbg_stats, dev);
1586
	if (ret)
1587
		goto error_asoc_register;
1588

1589 1590 1591
	/* Initially configures SSI registers */
	fsl_ssi_hw_init(ssi);

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

1614
	return 0;
1615

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

1625 1626
	if (ssi->soc->imx)
		fsl_ssi_imx_clean(pdev, ssi);
1627

1628
	return ret;
1629 1630
}

1631
static int fsl_ssi_remove(struct platform_device *pdev)
1632
{
1633
	struct fsl_ssi *ssi = dev_get_drvdata(&pdev->dev);
1634

1635
	fsl_ssi_debugfs_remove(&ssi->dbg_stats);
1636

1637 1638
	if (ssi->card_pdev)
		platform_device_unregister(ssi->card_pdev);
1639

1640 1641 1642
	/* Clean up SSI registers */
	fsl_ssi_hw_clean(ssi);

1643 1644
	if (ssi->soc->imx)
		fsl_ssi_imx_clean(pdev, ssi);
1645

1646
	if (fsl_ssi_is_ac97(ssi)) {
1647
		snd_soc_set_ac97_ops(NULL);
1648
		mutex_destroy(&ssi->ac97_reg_lock);
1649
	}
1650

1651
	return 0;
1652
}
1653

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

1660 1661
	regmap_read(regs, REG_SSI_SFCSR, &ssi->regcache_sfcsr);
	regmap_read(regs, REG_SSI_SACNT, &ssi->regcache_sacnt);
1662 1663 1664 1665 1666 1667 1668 1669 1670

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

	return 0;
}

static int fsl_ssi_resume(struct device *dev)
{
1671 1672
	struct fsl_ssi *ssi = dev_get_drvdata(dev);
	struct regmap *regs = ssi->regs;
1673 1674 1675

	regcache_cache_only(regs, false);

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

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

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

1700
module_platform_driver(fsl_ssi_driver);
1701

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