davinci-mcasp.c 39.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/*
 * ALSA SoC McASP Audio Layer for TI DAVINCI processor
 *
 * Multi-channel Audio Serial Port Driver
 *
 * Author: Nirmal Pandey <n-pandey@ti.com>,
 *         Suresh Rajashekara <suresh.r@ti.com>
 *         Steve Chen <schen@.mvista.com>
 *
 * Copyright:   (C) 2009 MontaVista Software, Inc., <source@mvista.com>
 * Copyright:   (C) 2009  Texas Instruments, India
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
21
#include <linux/slab.h>
22 23
#include <linux/delay.h>
#include <linux/io.h>
24
#include <linux/clk.h>
25
#include <linux/pm_runtime.h>
26 27 28
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/of_device.h>
29

30
#include <sound/asoundef.h>
31 32 33 34 35
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/initval.h>
#include <sound/soc.h>
36
#include <sound/dmaengine_pcm.h>
37
#include <sound/omap-pcm.h>
38 39

#include "davinci-pcm.h"
40
#include "edma-pcm.h"
41 42
#include "davinci-mcasp.h"

43 44
#define MCASP_MAX_AFIFO_DEPTH	64

45 46 47 48 49 50 51
static u32 context_regs[] = {
	DAVINCI_MCASP_TXFMCTL_REG,
	DAVINCI_MCASP_RXFMCTL_REG,
	DAVINCI_MCASP_TXFMT_REG,
	DAVINCI_MCASP_RXFMT_REG,
	DAVINCI_MCASP_ACLKXCTL_REG,
	DAVINCI_MCASP_ACLKRCTL_REG,
52 53
	DAVINCI_MCASP_AHCLKXCTL_REG,
	DAVINCI_MCASP_AHCLKRCTL_REG,
54
	DAVINCI_MCASP_PDIR_REG,
55 56 57 58
	DAVINCI_MCASP_RXMASK_REG,
	DAVINCI_MCASP_TXMASK_REG,
	DAVINCI_MCASP_RXTDM_REG,
	DAVINCI_MCASP_TXTDM_REG,
59 60
};

61
struct davinci_mcasp_context {
62
	u32	config_regs[ARRAY_SIZE(context_regs)];
63 64
	u32	afifo_regs[2]; /* for read/write fifo control registers */
	u32	*xrsr_regs; /* for serializer configuration */
65 66
};

67
struct davinci_mcasp {
68
	struct davinci_pcm_dma_params dma_params[2];
69
	struct snd_dmaengine_dai_dma_data dma_data[2];
70
	void __iomem *base;
71
	u32 fifo_base;
72 73 74 75 76 77 78 79
	struct device *dev;

	/* McASP specific data */
	int	tdm_slots;
	u8	op_mode;
	u8	num_serializer;
	u8	*serial_dir;
	u8	version;
80
	u8	bclk_div;
81
	u16	bclk_lrclk_ratio;
82
	int	streams;
83

84 85 86
	int	sysclk_freq;
	bool	bclk_master;

87 88 89 90
	/* McASP FIFO related */
	u8	txnumevt;
	u8	rxnumevt;

91 92
	bool	dat_port;

93 94 95
	/* Used for comstraint setting on the second stream */
	u32	channels;

96
#ifdef CONFIG_PM_SLEEP
97
	struct davinci_mcasp_context context;
98 99 100
#endif
};

101 102
static inline void mcasp_set_bits(struct davinci_mcasp *mcasp, u32 offset,
				  u32 val)
103
{
104
	void __iomem *reg = mcasp->base + offset;
105 106 107
	__raw_writel(__raw_readl(reg) | val, reg);
}

108 109
static inline void mcasp_clr_bits(struct davinci_mcasp *mcasp, u32 offset,
				  u32 val)
110
{
111
	void __iomem *reg = mcasp->base + offset;
112 113 114
	__raw_writel((__raw_readl(reg) & ~(val)), reg);
}

115 116
static inline void mcasp_mod_bits(struct davinci_mcasp *mcasp, u32 offset,
				  u32 val, u32 mask)
117
{
118
	void __iomem *reg = mcasp->base + offset;
119 120 121
	__raw_writel((__raw_readl(reg) & ~mask) | val, reg);
}

122 123
static inline void mcasp_set_reg(struct davinci_mcasp *mcasp, u32 offset,
				 u32 val)
124
{
125
	__raw_writel(val, mcasp->base + offset);
126 127
}

128
static inline u32 mcasp_get_reg(struct davinci_mcasp *mcasp, u32 offset)
129
{
130
	return (u32)__raw_readl(mcasp->base + offset);
131 132
}

133
static void mcasp_set_ctl_reg(struct davinci_mcasp *mcasp, u32 ctl_reg, u32 val)
134 135 136
{
	int i = 0;

137
	mcasp_set_bits(mcasp, ctl_reg, val);
138 139 140 141

	/* programming GBLCTL needs to read back from GBLCTL and verfiy */
	/* loop count is to avoid the lock-up */
	for (i = 0; i < 1000; i++) {
142
		if ((mcasp_get_reg(mcasp, ctl_reg) & val) == val)
143 144 145
			break;
	}

146
	if (i == 1000 && ((mcasp_get_reg(mcasp, ctl_reg) & val) != val))
147 148 149
		printk(KERN_ERR "GBLCTL write error\n");
}

150 151
static bool mcasp_is_synchronous(struct davinci_mcasp *mcasp)
{
152 153
	u32 rxfmctl = mcasp_get_reg(mcasp, DAVINCI_MCASP_RXFMCTL_REG);
	u32 aclkxctl = mcasp_get_reg(mcasp, DAVINCI_MCASP_ACLKXCTL_REG);
154 155 156 157

	return !(aclkxctl & TX_ASYNC) && rxfmctl & AFSRE;
}

158
static void mcasp_start_rx(struct davinci_mcasp *mcasp)
159
{
160 161 162 163 164 165 166
	if (mcasp->rxnumevt) {	/* enable FIFO */
		u32 reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;

		mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
		mcasp_set_bits(mcasp, reg, FIFO_ENABLE);
	}

167
	/* Start clocks */
168 169
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXHCLKRST);
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXCLKRST);
170 171 172 173 174 175
	/*
	 * When ASYNC == 0 the transmit and receive sections operate
	 * synchronously from the transmit clock and frame sync. We need to make
	 * sure that the TX signlas are enabled when starting reception.
	 */
	if (mcasp_is_synchronous(mcasp)) {
176 177
		mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST);
		mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST);
178 179
	}

180
	/* Activate serializer(s) */
181
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXSERCLR);
182
	/* Release RX state machine */
183
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
184
	/* Release Frame Sync generator */
185
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
186
	if (mcasp_is_synchronous(mcasp))
187
		mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXFSRST);
188 189
}

190
static void mcasp_start_tx(struct davinci_mcasp *mcasp)
191
{
192 193
	u32 cnt;

194 195 196 197 198 199 200
	if (mcasp->txnumevt) {	/* enable FIFO */
		u32 reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;

		mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
		mcasp_set_bits(mcasp, reg, FIFO_ENABLE);
	}

201
	/* Start clocks */
202 203
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST);
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST);
204
	/* Activate serializer(s) */
205
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXSERCLR);
206

207
	/* wait for XDATA to be cleared */
208
	cnt = 0;
209 210
	while (!(mcasp_get_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG) &
		 ~XRDATA) && (cnt < 100000))
211 212
		cnt++;

213 214 215 216
	/* Release TX state machine */
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXSMRST);
	/* Release Frame Sync generator */
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXFSRST);
217 218
}

219
static void davinci_mcasp_start(struct davinci_mcasp *mcasp, int stream)
220
{
221 222
	mcasp->streams++;

223
	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
224
		mcasp_start_tx(mcasp);
225
	else
226
		mcasp_start_rx(mcasp);
227 228
}

229
static void mcasp_stop_rx(struct davinci_mcasp *mcasp)
230
{
231 232 233 234 235
	/*
	 * In synchronous mode stop the TX clocks if no other stream is
	 * running
	 */
	if (mcasp_is_synchronous(mcasp) && !mcasp->streams)
236
		mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, 0);
237

238 239
	mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, 0);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
240 241 242 243 244 245

	if (mcasp->rxnumevt) {	/* disable FIFO */
		u32 reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;

		mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
	}
246 247
}

248
static void mcasp_stop_tx(struct davinci_mcasp *mcasp)
249
{
250 251 252 253 254 255 256 257 258
	u32 val = 0;

	/*
	 * In synchronous mode keep TX clocks running if the capture stream is
	 * still running.
	 */
	if (mcasp_is_synchronous(mcasp) && mcasp->streams)
		val =  TXHCLKRST | TXCLKRST | TXFSRST;

259 260
	mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, val);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
261 262 263 264 265 266

	if (mcasp->txnumevt) {	/* disable FIFO */
		u32 reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;

		mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
	}
267 268
}

269
static void davinci_mcasp_stop(struct davinci_mcasp *mcasp, int stream)
270
{
271 272
	mcasp->streams--;

273
	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
274
		mcasp_stop_tx(mcasp);
275
	else
276
		mcasp_stop_rx(mcasp);
277 278 279 280 281
}

static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
					 unsigned int fmt)
{
282
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
283
	int ret = 0;
284
	u32 data_delay;
285
	bool fs_pol_rising;
286
	bool inv_fs = false;
287

288
	pm_runtime_get_sync(mcasp->dev);
289
	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
290 291 292 293 294 295
	case SND_SOC_DAIFMT_DSP_A:
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
		/* 1st data bit occur one ACLK cycle after the frame sync */
		data_delay = 1;
		break;
296 297
	case SND_SOC_DAIFMT_DSP_B:
	case SND_SOC_DAIFMT_AC97:
298 299
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
300 301
		/* No delay after FS */
		data_delay = 0;
302
		break;
303
	case SND_SOC_DAIFMT_I2S:
304
		/* configure a full-word SYNC pulse (LRCLK) */
305 306
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
307 308
		/* 1st data bit occur one ACLK cycle after the frame sync */
		data_delay = 1;
309 310
		/* FS need to be inverted */
		inv_fs = true;
311
		break;
312 313 314 315 316 317 318
	case SND_SOC_DAIFMT_LEFT_J:
		/* configure a full-word SYNC pulse (LRCLK) */
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
		/* No delay after FS */
		data_delay = 0;
		break;
319 320 321
	default:
		ret = -EINVAL;
		goto out;
322 323
	}

324 325 326 327 328
	mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, FSXDLY(data_delay),
		       FSXDLY(3));
	mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, FSRDLY(data_delay),
		       FSRDLY(3));

329 330 331
	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
	case SND_SOC_DAIFMT_CBS_CFS:
		/* codec is clock and frame slave */
332 333
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
334

335 336
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
337

338 339
		mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, ACLKX | ACLKR);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AFSX | AFSR);
340
		mcasp->bclk_master = 1;
341
		break;
342 343
	case SND_SOC_DAIFMT_CBM_CFS:
		/* codec is clock master and frame slave */
344 345
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
346

347 348
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
349

350 351
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, ACLKX | ACLKR);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AFSX | AFSR);
352
		mcasp->bclk_master = 0;
353
		break;
354 355
	case SND_SOC_DAIFMT_CBM_CFM:
		/* codec is clock and frame master */
356 357
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
358

359 360
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
361

362 363
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG,
			       ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR);
364
		mcasp->bclk_master = 0;
365 366
		break;
	default:
367 368
		ret = -EINVAL;
		goto out;
369 370 371 372
	}

	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
	case SND_SOC_DAIFMT_IB_NF:
373
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
374
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
375
		fs_pol_rising = true;
376 377
		break;
	case SND_SOC_DAIFMT_NB_IF:
378
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
379
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
380
		fs_pol_rising = false;
381 382
		break;
	case SND_SOC_DAIFMT_IB_IF:
383
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
384
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
385
		fs_pol_rising = false;
386 387
		break;
	case SND_SOC_DAIFMT_NB_NF:
388 389
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
390
		fs_pol_rising = true;
391 392
		break;
	default:
393
		ret = -EINVAL;
394 395 396
		goto out;
	}

397 398 399
	if (inv_fs)
		fs_pol_rising = !fs_pol_rising;

400 401 402 403 404 405
	if (fs_pol_rising) {
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
	} else {
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
406
	}
407 408 409
out:
	pm_runtime_put_sync(mcasp->dev);
	return ret;
410 411
}

412 413
static int __davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id,
				      int div, bool explicit)
414
{
415
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
416 417 418

	switch (div_id) {
	case 0:		/* MCLK divider */
419
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG,
420
			       AHCLKXDIV(div - 1), AHCLKXDIV_MASK);
421
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG,
422 423 424 425
			       AHCLKRDIV(div - 1), AHCLKRDIV_MASK);
		break;

	case 1:		/* BCLK divider */
426
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG,
427
			       ACLKXDIV(div - 1), ACLKXDIV_MASK);
428
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG,
429
			       ACLKRDIV(div - 1), ACLKRDIV_MASK);
430 431
		if (explicit)
			mcasp->bclk_div = div;
432 433
		break;

434
	case 2:		/* BCLK/LRCLK ratio */
435
		mcasp->bclk_lrclk_ratio = div;
436 437
		break;

438 439 440 441 442 443 444
	default:
		return -EINVAL;
	}

	return 0;
}

445 446 447 448 449 450
static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id,
				    int div)
{
	return __davinci_mcasp_set_clkdiv(dai, div_id, div, 1);
}

451 452 453
static int davinci_mcasp_set_sysclk(struct snd_soc_dai *dai, int clk_id,
				    unsigned int freq, int dir)
{
454
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
455 456

	if (dir == SND_SOC_CLOCK_OUT) {
457 458 459
		mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AHCLKX);
460
	} else {
461 462 463
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AHCLKX);
464 465
	}

466 467
	mcasp->sysclk_freq = freq;

468 469 470
	return 0;
}

471
static int davinci_config_channel_size(struct davinci_mcasp *mcasp,
472
				       int word_length)
473
{
474
	u32 fmt;
D
Daniel Mack 已提交
475
	u32 tx_rotate = (word_length / 4) & 0x7;
476
	u32 mask = (1ULL << word_length) - 1;
477 478 479 480 481 482 483 484 485 486
	/*
	 * For captured data we should not rotate, inversion and masking is
	 * enoguh to get the data to the right position:
	 * Format	  data from bus		after reverse (XRBUF)
	 * S16_LE:	|LSB|MSB|xxx|xxx|	|xxx|xxx|MSB|LSB|
	 * S24_3LE:	|LSB|DAT|MSB|xxx|	|xxx|MSB|DAT|LSB|
	 * S24_LE:	|LSB|DAT|MSB|xxx|	|xxx|MSB|DAT|LSB|
	 * S32_LE:	|LSB|DAT|DAT|MSB|	|MSB|DAT|DAT|LSB|
	 */
	u32 rx_rotate = 0;
487

488 489 490 491 492
	/*
	 * if s BCLK-to-LRCLK ratio has been configured via the set_clkdiv()
	 * callback, take it into account here. That allows us to for example
	 * send 32 bits per channel to the codec, while only 16 of them carry
	 * audio payload.
493 494 495
	 * The clock ratio is given for a full period of data (for I2S format
	 * both left and right channels), so it has to be divided by number of
	 * tdm-slots (for I2S - divided by 2).
496
	 */
497 498
	if (mcasp->bclk_lrclk_ratio)
		word_length = mcasp->bclk_lrclk_ratio / mcasp->tdm_slots;
499

500 501
	/* mapping of the XSSZ bit-field as described in the datasheet */
	fmt = (word_length >> 1) - 1;
502

503
	if (mcasp->op_mode != DAVINCI_MCASP_DIT_MODE) {
504 505 506 507 508 509 510 511 512
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, RXSSZ(fmt),
			       RXSSZ(0x0F));
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXSSZ(fmt),
			       TXSSZ(0x0F));
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(tx_rotate),
			       TXROT(7));
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, RXROT(rx_rotate),
			       RXROT(7));
		mcasp_set_reg(mcasp, DAVINCI_MCASP_RXMASK_REG, mask);
513 514
	}

515
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXMASK_REG, mask);
516

517 518 519
	return 0;
}

520
static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream,
521
				 int period_words, int channels)
522
{
523 524
	struct davinci_pcm_dma_params *dma_params = &mcasp->dma_params[stream];
	struct snd_dmaengine_dai_dma_data *dma_data = &mcasp->dma_data[stream];
525
	int i;
526 527
	u8 tx_ser = 0;
	u8 rx_ser = 0;
528
	u8 slots = mcasp->tdm_slots;
529
	u8 max_active_serializers = (channels + slots - 1) / slots;
530
	int active_serializers, numevt, n;
531
	u32 reg;
532
	/* Default configuration */
533
	if (mcasp->version < MCASP_VERSION_3)
534
		mcasp_set_bits(mcasp, DAVINCI_MCASP_PWREMUMGT_REG, MCASP_SOFT);
535 536

	/* All PINS as McASP */
537
	mcasp_set_reg(mcasp, DAVINCI_MCASP_PFUNC_REG, 0x00000000);
538 539

	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
540 541
		mcasp_set_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
542
	} else {
543 544
		mcasp_set_reg(mcasp, DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_REVTCTL_REG, RXDATADMADIS);
545 546
	}

547
	for (i = 0; i < mcasp->num_serializer; i++) {
548 549
		mcasp_set_bits(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
			       mcasp->serial_dir[i]);
550
		if (mcasp->serial_dir[i] == TX_MODE &&
551
					tx_ser < max_active_serializers) {
552
			mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AXR(i));
553
			tx_ser++;
554
		} else if (mcasp->serial_dir[i] == RX_MODE &&
555
					rx_ser < max_active_serializers) {
556
			mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AXR(i));
557
			rx_ser++;
558
		} else {
559 560
			mcasp_mod_bits(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
				       SRMOD_INACTIVE, SRMOD_MASK);
561 562 563
		}
	}

564 565 566 567 568 569 570 571 572
	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
		active_serializers = tx_ser;
		numevt = mcasp->txnumevt;
		reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
	} else {
		active_serializers = rx_ser;
		numevt = mcasp->rxnumevt;
		reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
	}
573

574
	if (active_serializers < max_active_serializers) {
575
		dev_warn(mcasp->dev, "stream has more channels (%d) than are "
576 577
			 "enabled in mcasp (%d)\n", channels,
			 active_serializers * slots);
578 579 580
		return -EINVAL;
	}

581
	/* AFIFO is not in use */
582 583
	if (!numevt) {
		/* Configure the burst size for platform drivers */
584 585 586 587 588 589 590 591 592 593 594 595 596
		if (active_serializers > 1) {
			/*
			 * If more than one serializers are in use we have one
			 * DMA request to provide data for all serializers.
			 * For example if three serializers are enabled the DMA
			 * need to transfer three words per DMA request.
			 */
			dma_params->fifo_level = active_serializers;
			dma_data->maxburst = active_serializers;
		} else {
			dma_params->fifo_level = 0;
			dma_data->maxburst = 0;
		}
597
		return 0;
598
	}
599

600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617
	if (period_words % active_serializers) {
		dev_err(mcasp->dev, "Invalid combination of period words and "
			"active serializers: %d, %d\n", period_words,
			active_serializers);
		return -EINVAL;
	}

	/*
	 * Calculate the optimal AFIFO depth for platform side:
	 * The number of words for numevt need to be in steps of active
	 * serializers.
	 */
	n = numevt % active_serializers;
	if (n)
		numevt += (active_serializers - n);
	while (period_words % numevt && numevt > 0)
		numevt -= active_serializers;
	if (numevt <= 0)
618
		numevt = active_serializers;
619

620 621
	mcasp_mod_bits(mcasp, reg, active_serializers, NUMDMA_MASK);
	mcasp_mod_bits(mcasp, reg, NUMEVT(numevt), NUMEVT_MASK);
622

623
	/* Configure the burst size for platform drivers */
624 625
	if (numevt == 1)
		numevt = 0;
626 627 628
	dma_params->fifo_level = numevt;
	dma_data->maxburst = numevt;

629
	return 0;
630 631
}

632 633
static int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream,
			      int channels)
634 635
{
	int i, active_slots;
636 637
	int total_slots;
	int active_serializers;
638
	u32 mask = 0;
639
	u32 busel = 0;
640

641 642 643 644 645 646 647 648 649 650 651 652 653 654
	total_slots = mcasp->tdm_slots;

	/*
	 * If more than one serializer is needed, then use them with
	 * their specified tdm_slots count. Otherwise, one serializer
	 * can cope with the transaction using as many slots as channels
	 * in the stream, requires channels symmetry
	 */
	active_serializers = (channels + total_slots - 1) / total_slots;
	if (active_serializers == 1)
		active_slots = channels;
	else
		active_slots = total_slots;

655 656 657
	for (i = 0; i < active_slots; i++)
		mask |= (1 << i);

658
	mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC);
659

660 661 662
	if (!mcasp->dat_port)
		busel = TXSEL;

663 664 665
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXTDM_REG, mask);
	mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, busel | TXORD);
	mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG,
666
		       FSXMOD(total_slots), FSXMOD(0x1FF));
667 668 669 670

	mcasp_set_reg(mcasp, DAVINCI_MCASP_RXTDM_REG, mask);
	mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, busel | RXORD);
	mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG,
671
		       FSRMOD(total_slots), FSRMOD(0x1FF));
672 673

	return 0;
674 675 676
}

/* S/PDIF */
677 678
static int mcasp_dit_hw_param(struct davinci_mcasp *mcasp,
			      unsigned int rate)
679
{
680 681 682
	u32 cs_value = 0;
	u8 *cs_bytes = (u8*) &cs_value;

683 684
	/* Set the TX format : 24 bit right rotation, 32 bit slot, Pad 0
	   and LSB first */
685
	mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(6) | TXSSZ(15));
686 687

	/* Set TX frame synch : DIT Mode, 1 bit width, internal, rising edge */
688
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE | FSXMOD(0x180));
689 690

	/* Set the TX tdm : for all the slots */
691
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXTDM_REG, 0xFFFFFFFF);
692 693

	/* Set the TX clock controls : div = 1 and internal */
694
	mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE | TX_ASYNC);
695

696
	mcasp_clr_bits(mcasp, DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
697 698

	/* Only 44100 and 48000 are valid, both have the same setting */
699
	mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXDIV(3));
700 701

	/* Enable the DIT */
702
	mcasp_set_bits(mcasp, DAVINCI_MCASP_TXDITCTL_REG, DITEN);
703

704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743
	/* Set S/PDIF channel status bits */
	cs_bytes[0] = IEC958_AES0_CON_NOT_COPYRIGHT;
	cs_bytes[1] = IEC958_AES1_CON_PCM_CODER;

	switch (rate) {
	case 22050:
		cs_bytes[3] |= IEC958_AES3_CON_FS_22050;
		break;
	case 24000:
		cs_bytes[3] |= IEC958_AES3_CON_FS_24000;
		break;
	case 32000:
		cs_bytes[3] |= IEC958_AES3_CON_FS_32000;
		break;
	case 44100:
		cs_bytes[3] |= IEC958_AES3_CON_FS_44100;
		break;
	case 48000:
		cs_bytes[3] |= IEC958_AES3_CON_FS_48000;
		break;
	case 88200:
		cs_bytes[3] |= IEC958_AES3_CON_FS_88200;
		break;
	case 96000:
		cs_bytes[3] |= IEC958_AES3_CON_FS_96000;
		break;
	case 176400:
		cs_bytes[3] |= IEC958_AES3_CON_FS_176400;
		break;
	case 192000:
		cs_bytes[3] |= IEC958_AES3_CON_FS_192000;
		break;
	default:
		printk(KERN_WARNING "unsupported sampling rate: %d\n", rate);
		return -EINVAL;
	}

	mcasp_set_reg(mcasp, DAVINCI_MCASP_DITCSRA_REG, cs_value);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_DITCSRB_REG, cs_value);

744
	return 0;
745 746 747 748 749 750
}

static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
					struct snd_pcm_hw_params *params,
					struct snd_soc_dai *cpu_dai)
{
751
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
752
	struct davinci_pcm_dma_params *dma_params =
753
					&mcasp->dma_params[substream->stream];
754
	int word_length;
755
	int channels = params_channels(params);
756
	int period_size = params_period_size(params);
757
	int ret;
758

759 760 761 762 763
	/*
	 * If mcasp is BCLK master, and a BCLK divider was not provided by
	 * the machine driver, we need to calculate the ratio.
	 */
	if (mcasp->bclk_master && mcasp->bclk_div == 0 && mcasp->sysclk_freq) {
764
		unsigned int bclk_freq = snd_soc_params_to_bclk(params);
765
		unsigned int div = mcasp->sysclk_freq / bclk_freq;
766
		if (mcasp->sysclk_freq % bclk_freq != 0) {
767 768 769 770 771 772
			if (((mcasp->sysclk_freq / div) - bclk_freq) >
			    (bclk_freq - (mcasp->sysclk_freq / (div+1))))
				div++;
			dev_warn(mcasp->dev,
				 "Inaccurate BCLK: %u Hz / %u != %u Hz\n",
				 mcasp->sysclk_freq, div, bclk_freq);
773
		}
774
		__davinci_mcasp_set_clkdiv(cpu_dai, 1, div, 0);
775 776
	}

777 778
	ret = mcasp_common_hw_param(mcasp, substream->stream,
				    period_size * channels, channels);
779 780 781
	if (ret)
		return ret;

782
	if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE)
783
		ret = mcasp_dit_hw_param(mcasp, params_rate(params));
784
	else
785 786
		ret = mcasp_i2s_hw_param(mcasp, substream->stream,
					 channels);
787 788 789

	if (ret)
		return ret;
790 791

	switch (params_format(params)) {
792
	case SNDRV_PCM_FORMAT_U8:
793 794
	case SNDRV_PCM_FORMAT_S8:
		dma_params->data_type = 1;
795
		word_length = 8;
796 797
		break;

798
	case SNDRV_PCM_FORMAT_U16_LE:
799 800
	case SNDRV_PCM_FORMAT_S16_LE:
		dma_params->data_type = 2;
801
		word_length = 16;
802 803
		break;

804 805 806
	case SNDRV_PCM_FORMAT_U24_3LE:
	case SNDRV_PCM_FORMAT_S24_3LE:
		dma_params->data_type = 3;
807
		word_length = 24;
808 809
		break;

810 811
	case SNDRV_PCM_FORMAT_U24_LE:
	case SNDRV_PCM_FORMAT_S24_LE:
812 813 814 815
		dma_params->data_type = 4;
		word_length = 24;
		break;

816
	case SNDRV_PCM_FORMAT_U32_LE:
817 818
	case SNDRV_PCM_FORMAT_S32_LE:
		dma_params->data_type = 4;
819
		word_length = 32;
820 821 822 823 824 825
		break;

	default:
		printk(KERN_WARNING "davinci-mcasp: unsupported PCM format");
		return -EINVAL;
	}
826

827
	if (mcasp->version == MCASP_VERSION_2 && !dma_params->fifo_level)
828 829
		dma_params->acnt = 4;
	else
830 831
		dma_params->acnt = dma_params->data_type;

832
	davinci_config_channel_size(mcasp, word_length);
833

834 835 836
	if (mcasp->op_mode == DAVINCI_MCASP_IIS_MODE)
		mcasp->channels = channels;

837 838 839 840 841 842
	return 0;
}

static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
				     int cmd, struct snd_soc_dai *cpu_dai)
{
843
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
844 845 846 847
	int ret = 0;

	switch (cmd) {
	case SNDRV_PCM_TRIGGER_RESUME:
848 849
	case SNDRV_PCM_TRIGGER_START:
	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
850
		davinci_mcasp_start(mcasp, substream->stream);
851 852
		break;
	case SNDRV_PCM_TRIGGER_SUSPEND:
853
	case SNDRV_PCM_TRIGGER_STOP:
854
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
855
		davinci_mcasp_stop(mcasp, substream->stream);
856 857 858 859 860 861 862 863 864
		break;

	default:
		ret = -EINVAL;
	}

	return ret;
}

865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916
static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
				 struct snd_soc_dai *cpu_dai)
{
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
	u32 max_channels = 0;
	int i, dir;

	if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE)
		return 0;

	/*
	 * Limit the maximum allowed channels for the first stream:
	 * number of serializers for the direction * tdm slots per serializer
	 */
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
		dir = TX_MODE;
	else
		dir = RX_MODE;

	for (i = 0; i < mcasp->num_serializer; i++) {
		if (mcasp->serial_dir[i] == dir)
			max_channels++;
	}
	max_channels *= mcasp->tdm_slots;
	/*
	 * If the already active stream has less channels than the calculated
	 * limnit based on the seirializers * tdm_slots, we need to use that as
	 * a constraint for the second stream.
	 * Otherwise (first stream or less allowed channels) we use the
	 * calculated constraint.
	 */
	if (mcasp->channels && mcasp->channels < max_channels)
		max_channels = mcasp->channels;

	snd_pcm_hw_constraint_minmax(substream->runtime,
				     SNDRV_PCM_HW_PARAM_CHANNELS,
				     2, max_channels);
	return 0;
}

static void davinci_mcasp_shutdown(struct snd_pcm_substream *substream,
				   struct snd_soc_dai *cpu_dai)
{
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);

	if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE)
		return;

	if (!cpu_dai->active)
		mcasp->channels = 0;
}

917
static const struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
918 919
	.startup	= davinci_mcasp_startup,
	.shutdown	= davinci_mcasp_shutdown,
920 921 922
	.trigger	= davinci_mcasp_trigger,
	.hw_params	= davinci_mcasp_hw_params,
	.set_fmt	= davinci_mcasp_set_dai_fmt,
923
	.set_clkdiv	= davinci_mcasp_set_clkdiv,
924
	.set_sysclk	= davinci_mcasp_set_sysclk,
925 926
};

927 928 929 930
static int davinci_mcasp_dai_probe(struct snd_soc_dai *dai)
{
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);

931
	if (mcasp->version >= MCASP_VERSION_3) {
932 933 934 935 936 937 938 939 940 941 942 943 944 945
		/* Using dmaengine PCM */
		dai->playback_dma_data =
				&mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK];
		dai->capture_dma_data =
				&mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE];
	} else {
		/* Using davinci-pcm */
		dai->playback_dma_data = mcasp->dma_params;
		dai->capture_dma_data = mcasp->dma_params;
	}

	return 0;
}

946 947 948 949
#ifdef CONFIG_PM_SLEEP
static int davinci_mcasp_suspend(struct snd_soc_dai *dai)
{
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
950
	struct davinci_mcasp_context *context = &mcasp->context;
951
	u32 reg;
952
	int i;
953

954 955
	for (i = 0; i < ARRAY_SIZE(context_regs); i++)
		context->config_regs[i] = mcasp_get_reg(mcasp, context_regs[i]);
956

957 958 959 960 961 962 963 964
	if (mcasp->txnumevt) {
		reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
		context->afifo_regs[0] = mcasp_get_reg(mcasp, reg);
	}
	if (mcasp->rxnumevt) {
		reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
		context->afifo_regs[1] = mcasp_get_reg(mcasp, reg);
	}
965

966 967 968
	for (i = 0; i < mcasp->num_serializer; i++)
		context->xrsr_regs[i] = mcasp_get_reg(mcasp,
						DAVINCI_MCASP_XRSRCTL_REG(i));
969 970 971 972 973 974 975

	return 0;
}

static int davinci_mcasp_resume(struct snd_soc_dai *dai)
{
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
976
	struct davinci_mcasp_context *context = &mcasp->context;
977
	u32 reg;
978
	int i;
979

980 981
	for (i = 0; i < ARRAY_SIZE(context_regs); i++)
		mcasp_set_reg(mcasp, context_regs[i], context->config_regs[i]);
982

983 984 985 986 987 988 989 990
	if (mcasp->txnumevt) {
		reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
		mcasp_set_reg(mcasp, reg, context->afifo_regs[0]);
	}
	if (mcasp->rxnumevt) {
		reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
		mcasp_set_reg(mcasp, reg, context->afifo_regs[1]);
	}
991

992 993 994
	for (i = 0; i < mcasp->num_serializer; i++)
		mcasp_set_reg(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
			      context->xrsr_regs[i]);
995 996 997 998 999 1000 1001 1002

	return 0;
}
#else
#define davinci_mcasp_suspend NULL
#define davinci_mcasp_resume NULL
#endif

1003 1004
#define DAVINCI_MCASP_RATES	SNDRV_PCM_RATE_8000_192000

1005 1006 1007 1008
#define DAVINCI_MCASP_PCM_FMTS (SNDRV_PCM_FMTBIT_S8 | \
				SNDRV_PCM_FMTBIT_U8 | \
				SNDRV_PCM_FMTBIT_S16_LE | \
				SNDRV_PCM_FMTBIT_U16_LE | \
1009 1010 1011 1012
				SNDRV_PCM_FMTBIT_S24_LE | \
				SNDRV_PCM_FMTBIT_U24_LE | \
				SNDRV_PCM_FMTBIT_S24_3LE | \
				SNDRV_PCM_FMTBIT_U24_3LE | \
1013 1014 1015
				SNDRV_PCM_FMTBIT_S32_LE | \
				SNDRV_PCM_FMTBIT_U32_LE)

1016
static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
1017
	{
1018
		.name		= "davinci-mcasp.0",
1019
		.probe		= davinci_mcasp_dai_probe,
1020 1021
		.suspend	= davinci_mcasp_suspend,
		.resume		= davinci_mcasp_resume,
1022 1023
		.playback	= {
			.channels_min	= 2,
1024
			.channels_max	= 32 * 16,
1025
			.rates 		= DAVINCI_MCASP_RATES,
1026
			.formats	= DAVINCI_MCASP_PCM_FMTS,
1027 1028 1029
		},
		.capture 	= {
			.channels_min 	= 2,
1030
			.channels_max	= 32 * 16,
1031
			.rates 		= DAVINCI_MCASP_RATES,
1032
			.formats	= DAVINCI_MCASP_PCM_FMTS,
1033 1034 1035 1036 1037
		},
		.ops 		= &davinci_mcasp_dai_ops,

	},
	{
1038
		.name		= "davinci-mcasp.1",
1039
		.probe		= davinci_mcasp_dai_probe,
1040 1041 1042 1043
		.playback 	= {
			.channels_min	= 1,
			.channels_max	= 384,
			.rates		= DAVINCI_MCASP_RATES,
1044
			.formats	= DAVINCI_MCASP_PCM_FMTS,
1045 1046 1047 1048 1049 1050
		},
		.ops 		= &davinci_mcasp_dai_ops,
	},

};

1051 1052 1053 1054
static const struct snd_soc_component_driver davinci_mcasp_component = {
	.name		= "davinci-mcasp",
};

1055
/* Some HW specific values and defaults. The rest is filled in from DT. */
1056
static struct davinci_mcasp_pdata dm646x_mcasp_pdata = {
1057 1058 1059 1060 1061 1062
	.tx_dma_offset = 0x400,
	.rx_dma_offset = 0x400,
	.asp_chan_q = EVENTQ_0,
	.version = MCASP_VERSION_1,
};

1063
static struct davinci_mcasp_pdata da830_mcasp_pdata = {
1064 1065 1066 1067 1068 1069
	.tx_dma_offset = 0x2000,
	.rx_dma_offset = 0x2000,
	.asp_chan_q = EVENTQ_0,
	.version = MCASP_VERSION_2,
};

1070
static struct davinci_mcasp_pdata am33xx_mcasp_pdata = {
1071 1072 1073 1074 1075 1076
	.tx_dma_offset = 0,
	.rx_dma_offset = 0,
	.asp_chan_q = EVENTQ_0,
	.version = MCASP_VERSION_3,
};

1077
static struct davinci_mcasp_pdata dra7_mcasp_pdata = {
1078 1079 1080 1081 1082 1083
	.tx_dma_offset = 0x200,
	.rx_dma_offset = 0x284,
	.asp_chan_q = EVENTQ_0,
	.version = MCASP_VERSION_4,
};

1084 1085 1086
static const struct of_device_id mcasp_dt_ids[] = {
	{
		.compatible = "ti,dm646x-mcasp-audio",
1087
		.data = &dm646x_mcasp_pdata,
1088 1089 1090
	},
	{
		.compatible = "ti,da830-mcasp-audio",
1091
		.data = &da830_mcasp_pdata,
1092
	},
1093
	{
1094
		.compatible = "ti,am33xx-mcasp-audio",
1095
		.data = &am33xx_mcasp_pdata,
1096
	},
1097 1098 1099 1100
	{
		.compatible = "ti,dra7-mcasp-audio",
		.data = &dra7_mcasp_pdata,
	},
1101 1102 1103 1104
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, mcasp_dt_ids);

1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144
static int mcasp_reparent_fck(struct platform_device *pdev)
{
	struct device_node *node = pdev->dev.of_node;
	struct clk *gfclk, *parent_clk;
	const char *parent_name;
	int ret;

	if (!node)
		return 0;

	parent_name = of_get_property(node, "fck_parent", NULL);
	if (!parent_name)
		return 0;

	gfclk = clk_get(&pdev->dev, "fck");
	if (IS_ERR(gfclk)) {
		dev_err(&pdev->dev, "failed to get fck\n");
		return PTR_ERR(gfclk);
	}

	parent_clk = clk_get(NULL, parent_name);
	if (IS_ERR(parent_clk)) {
		dev_err(&pdev->dev, "failed to get parent clock\n");
		ret = PTR_ERR(parent_clk);
		goto err1;
	}

	ret = clk_set_parent(gfclk, parent_clk);
	if (ret) {
		dev_err(&pdev->dev, "failed to reparent fck\n");
		goto err2;
	}

err2:
	clk_put(parent_clk);
err1:
	clk_put(gfclk);
	return ret;
}

1145
static struct davinci_mcasp_pdata *davinci_mcasp_set_pdata_from_of(
1146 1147 1148
						struct platform_device *pdev)
{
	struct device_node *np = pdev->dev.of_node;
1149
	struct davinci_mcasp_pdata *pdata = NULL;
1150
	const struct of_device_id *match =
1151
			of_match_device(mcasp_dt_ids, &pdev->dev);
1152
	struct of_phandle_args dma_spec;
1153 1154 1155 1156 1157 1158 1159 1160 1161

	const u32 *of_serial_dir32;
	u32 val;
	int i, ret = 0;

	if (pdev->dev.platform_data) {
		pdata = pdev->dev.platform_data;
		return pdata;
	} else if (match) {
1162
		pdata = (struct davinci_mcasp_pdata*) match->data;
1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173
	} else {
		/* control shouldn't reach here. something is wrong */
		ret = -EINVAL;
		goto nodata;
	}

	ret = of_property_read_u32(np, "op-mode", &val);
	if (ret >= 0)
		pdata->op_mode = val;

	ret = of_property_read_u32(np, "tdm-slots", &val);
1174 1175 1176 1177 1178 1179 1180 1181
	if (ret >= 0) {
		if (val < 2 || val > 32) {
			dev_err(&pdev->dev,
				"tdm-slots must be in rage [2-32]\n");
			ret = -EINVAL;
			goto nodata;
		}

1182
		pdata->tdm_slots = val;
1183
	}
1184 1185 1186 1187

	of_serial_dir32 = of_get_property(np, "serial-dir", &val);
	val /= sizeof(u32);
	if (of_serial_dir32) {
1188 1189 1190
		u8 *of_serial_dir = devm_kzalloc(&pdev->dev,
						 (sizeof(*of_serial_dir) * val),
						 GFP_KERNEL);
1191 1192 1193 1194 1195
		if (!of_serial_dir) {
			ret = -ENOMEM;
			goto nodata;
		}

1196
		for (i = 0; i < val; i++)
1197 1198
			of_serial_dir[i] = be32_to_cpup(&of_serial_dir32[i]);

1199
		pdata->num_serializer = val;
1200 1201 1202
		pdata->serial_dir = of_serial_dir;
	}

1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224
	ret = of_property_match_string(np, "dma-names", "tx");
	if (ret < 0)
		goto nodata;

	ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret,
					 &dma_spec);
	if (ret < 0)
		goto nodata;

	pdata->tx_dma_channel = dma_spec.args[0];

	ret = of_property_match_string(np, "dma-names", "rx");
	if (ret < 0)
		goto nodata;

	ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells", ret,
					 &dma_spec);
	if (ret < 0)
		goto nodata;

	pdata->rx_dma_channel = dma_spec.args[0];

1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251
	ret = of_property_read_u32(np, "tx-num-evt", &val);
	if (ret >= 0)
		pdata->txnumevt = val;

	ret = of_property_read_u32(np, "rx-num-evt", &val);
	if (ret >= 0)
		pdata->rxnumevt = val;

	ret = of_property_read_u32(np, "sram-size-playback", &val);
	if (ret >= 0)
		pdata->sram_size_playback = val;

	ret = of_property_read_u32(np, "sram-size-capture", &val);
	if (ret >= 0)
		pdata->sram_size_capture = val;

	return  pdata;

nodata:
	if (ret < 0) {
		dev_err(&pdev->dev, "Error populating platform data, err %d\n",
			ret);
		pdata = NULL;
	}
	return  pdata;
}

1252 1253
static int davinci_mcasp_probe(struct platform_device *pdev)
{
1254
	struct davinci_pcm_dma_params *dma_params;
1255
	struct snd_dmaengine_dai_dma_data *dma_data;
1256
	struct resource *mem, *ioarea, *res, *dat;
1257
	struct davinci_mcasp_pdata *pdata;
1258
	struct davinci_mcasp *mcasp;
1259
	int ret;
1260

1261 1262 1263 1264 1265
	if (!pdev->dev.platform_data && !pdev->dev.of_node) {
		dev_err(&pdev->dev, "No platform data supplied\n");
		return -EINVAL;
	}

1266
	mcasp = devm_kzalloc(&pdev->dev, sizeof(struct davinci_mcasp),
1267
			   GFP_KERNEL);
1268
	if (!mcasp)
1269 1270
		return	-ENOMEM;

1271 1272 1273 1274 1275 1276
	pdata = davinci_mcasp_set_pdata_from_of(pdev);
	if (!pdata) {
		dev_err(&pdev->dev, "no platform data\n");
		return -EINVAL;
	}

1277
	mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
1278
	if (!mem) {
1279
		dev_warn(mcasp->dev,
1280 1281 1282 1283 1284 1285
			 "\"mpu\" mem resource not found, using index 0\n");
		mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
		if (!mem) {
			dev_err(&pdev->dev, "no mem resource?\n");
			return -ENODEV;
		}
1286 1287
	}

1288
	ioarea = devm_request_mem_region(&pdev->dev, mem->start,
1289
			resource_size(mem), pdev->name);
1290 1291
	if (!ioarea) {
		dev_err(&pdev->dev, "Audio region already claimed\n");
1292
		return -EBUSY;
1293 1294
	}

1295
	pm_runtime_enable(&pdev->dev);
1296

1297 1298 1299 1300 1301
	ret = pm_runtime_get_sync(&pdev->dev);
	if (IS_ERR_VALUE(ret)) {
		dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n");
		return ret;
	}
1302

1303 1304
	mcasp->base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
	if (!mcasp->base) {
1305 1306
		dev_err(&pdev->dev, "ioremap failed\n");
		ret = -ENOMEM;
1307
		goto err;
1308 1309
	}

1310
	mcasp->op_mode = pdata->op_mode;
1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325
	/* sanity check for tdm slots parameter */
	if (mcasp->op_mode == DAVINCI_MCASP_IIS_MODE) {
		if (pdata->tdm_slots < 2) {
			dev_err(&pdev->dev, "invalid tdm slots: %d\n",
				pdata->tdm_slots);
			mcasp->tdm_slots = 2;
		} else if (pdata->tdm_slots > 32) {
			dev_err(&pdev->dev, "invalid tdm slots: %d\n",
				pdata->tdm_slots);
			mcasp->tdm_slots = 32;
		} else {
			mcasp->tdm_slots = pdata->tdm_slots;
		}
	}

1326
	mcasp->num_serializer = pdata->num_serializer;
1327 1328 1329 1330 1331
#ifdef CONFIG_PM_SLEEP
	mcasp->context.xrsr_regs = devm_kzalloc(&pdev->dev,
					sizeof(u32) * mcasp->num_serializer,
					GFP_KERNEL);
#endif
1332 1333 1334 1335
	mcasp->serial_dir = pdata->serial_dir;
	mcasp->version = pdata->version;
	mcasp->txnumevt = pdata->txnumevt;
	mcasp->rxnumevt = pdata->rxnumevt;
1336

1337
	mcasp->dev = &pdev->dev;
1338

1339
	dat = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
1340 1341
	if (dat)
		mcasp->dat_port = true;
1342

1343
	dma_params = &mcasp->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
1344
	dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK];
1345 1346 1347 1348
	dma_params->asp_chan_q = pdata->asp_chan_q;
	dma_params->ram_chan_q = pdata->ram_chan_q;
	dma_params->sram_pool = pdata->sram_pool;
	dma_params->sram_size = pdata->sram_size_playback;
1349
	if (dat)
1350
		dma_params->dma_addr = dat->start;
1351
	else
1352
		dma_params->dma_addr = mem->start + pdata->tx_dma_offset;
1353

1354
	/* Unconditional dmaengine stuff */
1355
	dma_data->addr = dma_params->dma_addr;
1356

1357
	res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
1358
	if (res)
1359
		dma_params->channel = res->start;
1360
	else
1361
		dma_params->channel = pdata->tx_dma_channel;
1362

1363 1364 1365 1366 1367 1368
	/* dmaengine filter data for DT and non-DT boot */
	if (pdev->dev.of_node)
		dma_data->filter_data = "tx";
	else
		dma_data->filter_data = &dma_params->channel;

1369
	dma_params = &mcasp->dma_params[SNDRV_PCM_STREAM_CAPTURE];
1370
	dma_data = &mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE];
1371 1372 1373 1374
	dma_params->asp_chan_q = pdata->asp_chan_q;
	dma_params->ram_chan_q = pdata->ram_chan_q;
	dma_params->sram_pool = pdata->sram_pool;
	dma_params->sram_size = pdata->sram_size_capture;
1375
	if (dat)
1376
		dma_params->dma_addr = dat->start;
1377
	else
1378
		dma_params->dma_addr = mem->start + pdata->rx_dma_offset;
1379

1380
	/* Unconditional dmaengine stuff */
1381
	dma_data->addr = dma_params->dma_addr;
1382

1383 1384
	if (mcasp->version < MCASP_VERSION_3) {
		mcasp->fifo_base = DAVINCI_MCASP_V2_AFIFO_BASE;
1385
		/* dma_params->dma_addr is pointing to the data port address */
1386 1387 1388 1389
		mcasp->dat_port = true;
	} else {
		mcasp->fifo_base = DAVINCI_MCASP_V3_AFIFO_BASE;
	}
1390 1391

	res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
1392
	if (res)
1393
		dma_params->channel = res->start;
1394
	else
1395
		dma_params->channel = pdata->rx_dma_channel;
1396

1397 1398 1399 1400 1401
	/* dmaengine filter data for DT and non-DT boot */
	if (pdev->dev.of_node)
		dma_data->filter_data = "rx";
	else
		dma_data->filter_data = &dma_params->channel;
1402

1403
	dev_set_drvdata(&pdev->dev, mcasp);
1404 1405 1406

	mcasp_reparent_fck(pdev);

1407 1408 1409
	ret = devm_snd_soc_register_component(&pdev->dev,
					&davinci_mcasp_component,
					&davinci_mcasp_dai[pdata->op_mode], 1);
1410 1411

	if (ret != 0)
1412
		goto err;
1413

1414
	switch (mcasp->version) {
1415 1416 1417
#if IS_BUILTIN(CONFIG_SND_DAVINCI_SOC) || \
	(IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \
	 IS_MODULE(CONFIG_SND_DAVINCI_SOC))
1418 1419
	case MCASP_VERSION_1:
	case MCASP_VERSION_2:
1420
		ret = davinci_soc_platform_register(&pdev->dev);
1421
		break;
1422
#endif
1423 1424 1425 1426 1427 1428 1429
#if IS_BUILTIN(CONFIG_SND_EDMA_SOC) || \
	(IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \
	 IS_MODULE(CONFIG_SND_EDMA_SOC))
	case MCASP_VERSION_3:
		ret = edma_pcm_platform_register(&pdev->dev);
		break;
#endif
1430 1431 1432
#if IS_BUILTIN(CONFIG_SND_OMAP_SOC) || \
	(IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \
	 IS_MODULE(CONFIG_SND_OMAP_SOC))
1433 1434 1435
	case MCASP_VERSION_4:
		ret = omap_pcm_platform_register(&pdev->dev);
		break;
1436
#endif
1437 1438 1439 1440 1441 1442 1443 1444 1445
	default:
		dev_err(&pdev->dev, "Invalid McASP version: %d\n",
			mcasp->version);
		ret = -EINVAL;
		break;
	}

	if (ret) {
		dev_err(&pdev->dev, "register PCM failed: %d\n", ret);
1446
		goto err;
1447 1448
	}

1449 1450
	return 0;

1451
err:
1452 1453
	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
1454 1455 1456 1457 1458
	return ret;
}

static int davinci_mcasp_remove(struct platform_device *pdev)
{
1459 1460
	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
1461 1462 1463 1464 1465 1466 1467 1468 1469 1470

	return 0;
}

static struct platform_driver davinci_mcasp_driver = {
	.probe		= davinci_mcasp_probe,
	.remove		= davinci_mcasp_remove,
	.driver		= {
		.name	= "davinci-mcasp",
		.owner	= THIS_MODULE,
1471
		.of_match_table = mcasp_dt_ids,
1472 1473 1474
	},
};

1475
module_platform_driver(davinci_mcasp_driver);
1476 1477 1478 1479

MODULE_AUTHOR("Steve Chen");
MODULE_DESCRIPTION("TI DAVINCI McASP SoC Interface");
MODULE_LICENSE("GPL");