davinci-mcasp.c 32.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 31 32 33 34

#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/initval.h>
#include <sound/soc.h>
35
#include <sound/dmaengine_pcm.h>
36 37 38 39

#include "davinci-pcm.h"
#include "davinci-mcasp.h"

40
struct davinci_mcasp {
41
	struct davinci_pcm_dma_params dma_params[2];
42
	struct snd_dmaengine_dai_dma_data dma_data[2];
43
	void __iomem *base;
44
	u32 fifo_base;
45 46 47 48 49 50 51 52 53
	struct device *dev;

	/* McASP specific data */
	int	tdm_slots;
	u8	op_mode;
	u8	num_serializer;
	u8	*serial_dir;
	u8	version;
	u16	bclk_lrclk_ratio;
54
	int	streams;
55 56 57 58 59

	/* McASP FIFO related */
	u8	txnumevt;
	u8	rxnumevt;

60 61
	bool	dat_port;

62 63 64 65 66 67 68 69 70 71 72 73 74
#ifdef CONFIG_PM_SLEEP
	struct {
		u32	txfmtctl;
		u32	rxfmtctl;
		u32	txfmt;
		u32	rxfmt;
		u32	aclkxctl;
		u32	aclkrctl;
		u32	pdir;
	} context;
#endif
};

75 76
static inline void mcasp_set_bits(struct davinci_mcasp *mcasp, u32 offset,
				  u32 val)
77
{
78
	void __iomem *reg = mcasp->base + offset;
79 80 81
	__raw_writel(__raw_readl(reg) | val, reg);
}

82 83
static inline void mcasp_clr_bits(struct davinci_mcasp *mcasp, u32 offset,
				  u32 val)
84
{
85
	void __iomem *reg = mcasp->base + offset;
86 87 88
	__raw_writel((__raw_readl(reg) & ~(val)), reg);
}

89 90
static inline void mcasp_mod_bits(struct davinci_mcasp *mcasp, u32 offset,
				  u32 val, u32 mask)
91
{
92
	void __iomem *reg = mcasp->base + offset;
93 94 95
	__raw_writel((__raw_readl(reg) & ~mask) | val, reg);
}

96 97
static inline void mcasp_set_reg(struct davinci_mcasp *mcasp, u32 offset,
				 u32 val)
98
{
99
	__raw_writel(val, mcasp->base + offset);
100 101
}

102
static inline u32 mcasp_get_reg(struct davinci_mcasp *mcasp, u32 offset)
103
{
104
	return (u32)__raw_readl(mcasp->base + offset);
105 106
}

107
static void mcasp_set_ctl_reg(struct davinci_mcasp *mcasp, u32 ctl_reg, u32 val)
108 109 110
{
	int i = 0;

111
	mcasp_set_bits(mcasp, ctl_reg, val);
112 113 114 115

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

120
	if (i == 1000 && ((mcasp_get_reg(mcasp, ctl_reg) & val) != val))
121 122 123
		printk(KERN_ERR "GBLCTL write error\n");
}

124 125
static bool mcasp_is_synchronous(struct davinci_mcasp *mcasp)
{
126 127
	u32 rxfmctl = mcasp_get_reg(mcasp, DAVINCI_MCASP_RXFMCTL_REG);
	u32 aclkxctl = mcasp_get_reg(mcasp, DAVINCI_MCASP_ACLKXCTL_REG);
128 129 130 131

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

132
static void mcasp_start_rx(struct davinci_mcasp *mcasp)
133
{
134 135
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXHCLKRST);
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXCLKRST);
136 137 138 139 140 141 142

	/*
	 * 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)) {
143 144
		mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST);
		mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST);
145 146
	}

147 148
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXSERCLR);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_RXBUF_REG, 0);
149

150 151 152
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_RXBUF_REG, 0);
153

154 155
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
156 157

	if (mcasp_is_synchronous(mcasp))
158
		mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXFSRST);
159 160
}

161
static void mcasp_start_tx(struct davinci_mcasp *mcasp)
162
{
163 164 165
	u8 offset = 0, i;
	u32 cnt;

166 167 168 169
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST);
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST);
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXSERCLR);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXBUF_REG, 0);
170

171 172 173
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXSMRST);
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXFSRST);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXBUF_REG, 0);
174 175
	for (i = 0; i < mcasp->num_serializer; i++) {
		if (mcasp->serial_dir[i] == TX_MODE) {
176 177 178 179 180 181 182
			offset = i;
			break;
		}
	}

	/* wait for TX ready */
	cnt = 0;
183
	while (!(mcasp_get_reg(mcasp, DAVINCI_MCASP_XRSRCTL_REG(offset)) &
184 185 186
		 TXSTATE) && (cnt < 100000))
		cnt++;

187
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXBUF_REG, 0);
188 189
}

190
static void davinci_mcasp_start(struct davinci_mcasp *mcasp, int stream)
191
{
192 193
	u32 reg;

194 195
	mcasp->streams++;

196
	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
197
		if (mcasp->txnumevt) {	/* enable FIFO */
198
			reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
199 200
			mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
			mcasp_set_bits(mcasp, reg, FIFO_ENABLE);
201
		}
202
		mcasp_start_tx(mcasp);
203
	} else {
204
		if (mcasp->rxnumevt) {	/* enable FIFO */
205
			reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
206 207
			mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
			mcasp_set_bits(mcasp, reg, FIFO_ENABLE);
208
		}
209
		mcasp_start_rx(mcasp);
210
	}
211 212
}

213
static void mcasp_stop_rx(struct davinci_mcasp *mcasp)
214
{
215 216 217 218 219
	/*
	 * In synchronous mode stop the TX clocks if no other stream is
	 * running
	 */
	if (mcasp_is_synchronous(mcasp) && !mcasp->streams)
220
		mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, 0);
221

222 223
	mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, 0);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
224 225
}

226
static void mcasp_stop_tx(struct davinci_mcasp *mcasp)
227
{
228 229 230 231 232 233 234 235 236
	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;

237 238
	mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, val);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
239 240
}

241
static void davinci_mcasp_stop(struct davinci_mcasp *mcasp, int stream)
242
{
243 244
	u32 reg;

245 246
	mcasp->streams--;

247
	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
248
		if (mcasp->txnumevt) {	/* disable FIFO */
249
			reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
250
			mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
251
		}
252
		mcasp_stop_tx(mcasp);
253
	} else {
254
		if (mcasp->rxnumevt) {	/* disable FIFO */
255
			reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
256
			mcasp_clr_bits(mcasp, reg, FIFO_ENABLE);
257
		}
258
		mcasp_stop_rx(mcasp);
259
	}
260 261 262 263 264
}

static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
					 unsigned int fmt)
{
265
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
266

267 268 269
	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
	case SND_SOC_DAIFMT_DSP_B:
	case SND_SOC_DAIFMT_AC97:
270 271
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
272 273 274
		break;
	default:
		/* configure a full-word SYNC pulse (LRCLK) */
275 276
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
277 278

		/* make 1st data bit occur one ACLK cycle after the frame sync */
279 280
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, FSXDLY(1));
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, FSRDLY(1));
281 282 283
		break;
	}

284 285 286
	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
	case SND_SOC_DAIFMT_CBS_CFS:
		/* codec is clock and frame slave */
287 288
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
289

290 291
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
292

293 294
		mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, ACLKX | ACLKR);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AFSX | AFSR);
295
		break;
296 297
	case SND_SOC_DAIFMT_CBM_CFS:
		/* codec is clock master and frame slave */
298 299
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
300

301 302
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
303

304 305
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, ACLKX | ACLKR);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AFSX | AFSR);
306
		break;
307 308
	case SND_SOC_DAIFMT_CBM_CFM:
		/* codec is clock and frame master */
309 310
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
311

312 313
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
314

315 316
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG,
			       ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR);
317 318 319 320 321 322 323 324
		break;

	default:
		return -EINVAL;
	}

	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
	case SND_SOC_DAIFMT_IB_NF:
325 326
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
327

328 329
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
330 331 332
		break;

	case SND_SOC_DAIFMT_NB_IF:
333 334
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
335

336 337
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
338 339 340
		break;

	case SND_SOC_DAIFMT_IB_IF:
341 342
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
343

344 345
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
346 347 348
		break;

	case SND_SOC_DAIFMT_NB_NF:
349 350
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
351

352 353
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
354 355 356 357 358 359 360 361 362
		break;

	default:
		return -EINVAL;
	}

	return 0;
}

363 364
static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div)
{
365
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
366 367 368

	switch (div_id) {
	case 0:		/* MCLK divider */
369
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG,
370
			       AHCLKXDIV(div - 1), AHCLKXDIV_MASK);
371
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG,
372 373 374 375
			       AHCLKRDIV(div - 1), AHCLKRDIV_MASK);
		break;

	case 1:		/* BCLK divider */
376
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG,
377
			       ACLKXDIV(div - 1), ACLKXDIV_MASK);
378
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG,
379 380 381
			       ACLKRDIV(div - 1), ACLKRDIV_MASK);
		break;

382
	case 2:		/* BCLK/LRCLK ratio */
383
		mcasp->bclk_lrclk_ratio = div;
384 385
		break;

386 387 388 389 390 391 392
	default:
		return -EINVAL;
	}

	return 0;
}

393 394 395
static int davinci_mcasp_set_sysclk(struct snd_soc_dai *dai, int clk_id,
				    unsigned int freq, int dir)
{
396
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
397 398

	if (dir == SND_SOC_CLOCK_OUT) {
399 400 401
		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);
402
	} else {
403 404 405
		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);
406 407 408 409 410
	}

	return 0;
}

411
static int davinci_config_channel_size(struct davinci_mcasp *mcasp,
412
				       int word_length)
413
{
414
	u32 fmt;
D
Daniel Mack 已提交
415 416
	u32 tx_rotate = (word_length / 4) & 0x7;
	u32 rx_rotate = (32 - word_length) / 4;
417
	u32 mask = (1ULL << word_length) - 1;
418

419 420 421 422 423
	/*
	 * 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.
424 425 426
	 * 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).
427
	 */
428 429
	if (mcasp->bclk_lrclk_ratio)
		word_length = mcasp->bclk_lrclk_ratio / mcasp->tdm_slots;
430

431 432
	/* mapping of the XSSZ bit-field as described in the datasheet */
	fmt = (word_length >> 1) - 1;
433

434
	if (mcasp->op_mode != DAVINCI_MCASP_DIT_MODE) {
435 436 437 438 439 440 441 442 443
		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);
444 445
	}

446
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXMASK_REG, mask);
447

448 449 450
	return 0;
}

451
static int davinci_hw_common_param(struct davinci_mcasp *mcasp, int stream,
452
				    int channels)
453 454
{
	int i;
455 456
	u8 tx_ser = 0;
	u8 rx_ser = 0;
457
	u8 ser;
458
	u8 slots = mcasp->tdm_slots;
459
	u8 max_active_serializers = (channels + slots - 1) / slots;
460
	u32 reg;
461
	/* Default configuration */
462
	if (mcasp->version != MCASP_VERSION_4)
463
		mcasp_set_bits(mcasp, DAVINCI_MCASP_PWREMUMGT_REG, MCASP_SOFT);
464 465

	/* All PINS as McASP */
466
	mcasp_set_reg(mcasp, DAVINCI_MCASP_PFUNC_REG, 0x00000000);
467 468

	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
469 470
		mcasp_set_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
471
	} else {
472 473
		mcasp_set_reg(mcasp, DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_REVTCTL_REG, RXDATADMADIS);
474 475
	}

476
	for (i = 0; i < mcasp->num_serializer; i++) {
477 478
		mcasp_set_bits(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
			       mcasp->serial_dir[i]);
479
		if (mcasp->serial_dir[i] == TX_MODE &&
480
					tx_ser < max_active_serializers) {
481
			mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AXR(i));
482
			tx_ser++;
483
		} else if (mcasp->serial_dir[i] == RX_MODE &&
484
					rx_ser < max_active_serializers) {
485
			mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AXR(i));
486
			rx_ser++;
487
		} else {
488 489
			mcasp_mod_bits(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
				       SRMOD_INACTIVE, SRMOD_MASK);
490 491 492
		}
	}

493 494 495 496 497 498
	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
		ser = tx_ser;
	else
		ser = rx_ser;

	if (ser < max_active_serializers) {
499
		dev_warn(mcasp->dev, "stream has more channels (%d) than are "
500 501 502 503
			"enabled in mcasp (%d)\n", channels, ser * slots);
		return -EINVAL;
	}

504 505 506
	if (mcasp->txnumevt && stream == SNDRV_PCM_STREAM_PLAYBACK) {
		if (mcasp->txnumevt * tx_ser > 64)
			mcasp->txnumevt = 1;
507

508
		reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
509 510 511
		mcasp_mod_bits(mcasp, reg, tx_ser, NUMDMA_MASK);
		mcasp_mod_bits(mcasp, reg, ((mcasp->txnumevt * tx_ser) << 8),
			       NUMEVT_MASK);
512 513
	}

514 515 516
	if (mcasp->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) {
		if (mcasp->rxnumevt * rx_ser > 64)
			mcasp->rxnumevt = 1;
517 518

		reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
519 520 521
		mcasp_mod_bits(mcasp, reg, rx_ser, NUMDMA_MASK);
		mcasp_mod_bits(mcasp, reg, ((mcasp->rxnumevt * rx_ser) << 8),
			       NUMEVT_MASK);
522
	}
523 524

	return 0;
525 526
}

527
static void davinci_hw_param(struct davinci_mcasp *mcasp, int stream)
528 529 530
{
	int i, active_slots;
	u32 mask = 0;
531
	u32 busel = 0;
532

533
	active_slots = (mcasp->tdm_slots > 31) ? 32 : mcasp->tdm_slots;
534 535 536
	for (i = 0; i < active_slots; i++)
		mask |= (1 << i);

537
	mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC);
538

539 540 541
	if (!mcasp->dat_port)
		busel = TXSEL;

542 543 544
	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
		/* bit stream is MSB first  with no delay */
		/* DSP_B mode */
545 546
		mcasp_set_reg(mcasp, DAVINCI_MCASP_TXTDM_REG, mask);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, busel | TXORD);
547

548
		if ((mcasp->tdm_slots >= 2) && (mcasp->tdm_slots <= 32))
549 550
			mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG,
				       FSXMOD(mcasp->tdm_slots), FSXMOD(0x1FF));
551 552
		else
			printk(KERN_ERR "playback tdm slot %d not supported\n",
553
				mcasp->tdm_slots);
554 555 556
	} else {
		/* bit stream is MSB first with no delay */
		/* DSP_B mode */
557 558
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, busel | RXORD);
		mcasp_set_reg(mcasp, DAVINCI_MCASP_RXTDM_REG, mask);
559

560
		if ((mcasp->tdm_slots >= 2) && (mcasp->tdm_slots <= 32))
561 562
			mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG,
				       FSRMOD(mcasp->tdm_slots), FSRMOD(0x1FF));
563 564
		else
			printk(KERN_ERR "capture tdm slot %d not supported\n",
565
				mcasp->tdm_slots);
566 567 568 569
	}
}

/* S/PDIF */
570
static void davinci_hw_dit_param(struct davinci_mcasp *mcasp)
571 572 573
{
	/* Set the TX format : 24 bit right rotation, 32 bit slot, Pad 0
	   and LSB first */
574
	mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(6) | TXSSZ(15));
575 576

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

	/* Set the TX tdm : for all the slots */
580
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXTDM_REG, 0xFFFFFFFF);
581 582

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

585
	mcasp_clr_bits(mcasp, DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
586 587

	/* Only 44100 and 48000 are valid, both have the same setting */
588
	mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXDIV(3));
589 590

	/* Enable the DIT */
591
	mcasp_set_bits(mcasp, DAVINCI_MCASP_TXDITCTL_REG, DITEN);
592 593 594 595 596 597
}

static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
					struct snd_pcm_hw_params *params,
					struct snd_soc_dai *cpu_dai)
{
598
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
599
	struct davinci_pcm_dma_params *dma_params =
600
					&mcasp->dma_params[substream->stream];
601 602
	struct snd_dmaengine_dai_dma_data *dma_data =
					&mcasp->dma_data[substream->stream];
603
	int word_length;
604
	u8 fifo_level;
605
	u8 slots = mcasp->tdm_slots;
606
	u8 active_serializers;
607 608 609 610
	int channels;
	struct snd_interval *pcm_channels = hw_param_interval(params,
					SNDRV_PCM_HW_PARAM_CHANNELS);
	channels = pcm_channels->min;
611

612 613
	active_serializers = (channels + slots - 1) / slots;

614
	if (davinci_hw_common_param(mcasp, substream->stream, channels) == -EINVAL)
615
		return -EINVAL;
616
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
617
		fifo_level = mcasp->txnumevt * active_serializers;
618
	else
619
		fifo_level = mcasp->rxnumevt * active_serializers;
620

621 622
	if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE)
		davinci_hw_dit_param(mcasp);
623
	else
624
		davinci_hw_param(mcasp, substream->stream);
625 626

	switch (params_format(params)) {
627
	case SNDRV_PCM_FORMAT_U8:
628 629
	case SNDRV_PCM_FORMAT_S8:
		dma_params->data_type = 1;
630
		word_length = 8;
631 632
		break;

633
	case SNDRV_PCM_FORMAT_U16_LE:
634 635
	case SNDRV_PCM_FORMAT_S16_LE:
		dma_params->data_type = 2;
636
		word_length = 16;
637 638
		break;

639 640 641
	case SNDRV_PCM_FORMAT_U24_3LE:
	case SNDRV_PCM_FORMAT_S24_3LE:
		dma_params->data_type = 3;
642
		word_length = 24;
643 644
		break;

645 646
	case SNDRV_PCM_FORMAT_U24_LE:
	case SNDRV_PCM_FORMAT_S24_LE:
647
	case SNDRV_PCM_FORMAT_U32_LE:
648 649
	case SNDRV_PCM_FORMAT_S32_LE:
		dma_params->data_type = 4;
650
		word_length = 32;
651 652 653 654 655 656
		break;

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

658
	if (mcasp->version == MCASP_VERSION_2 && !fifo_level)
659 660
		dma_params->acnt = 4;
	else
661 662
		dma_params->acnt = dma_params->data_type;

663
	dma_params->fifo_level = fifo_level;
664 665
	dma_data->maxburst = fifo_level;

666
	davinci_config_channel_size(mcasp, word_length);
667 668 669 670 671 672 673

	return 0;
}

static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
				     int cmd, struct snd_soc_dai *cpu_dai)
{
674
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
675 676 677 678
	int ret = 0;

	switch (cmd) {
	case SNDRV_PCM_TRIGGER_RESUME:
679 680
	case SNDRV_PCM_TRIGGER_START:
	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
681
		ret = pm_runtime_get_sync(mcasp->dev);
682
		if (IS_ERR_VALUE(ret))
683 684
			dev_err(mcasp->dev, "pm_runtime_get_sync() failed\n");
		davinci_mcasp_start(mcasp, substream->stream);
685 686 687
		break;

	case SNDRV_PCM_TRIGGER_SUSPEND:
688 689
		davinci_mcasp_stop(mcasp, substream->stream);
		ret = pm_runtime_put_sync(mcasp->dev);
690
		if (IS_ERR_VALUE(ret))
691
			dev_err(mcasp->dev, "pm_runtime_put_sync() failed\n");
692 693 694
		break;

	case SNDRV_PCM_TRIGGER_STOP:
695
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
696
		davinci_mcasp_stop(mcasp, substream->stream);
697 698 699 700 701 702 703 704 705
		break;

	default:
		ret = -EINVAL;
	}

	return ret;
}

706 707 708
static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
				 struct snd_soc_dai *dai)
{
709
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
710

711 712 713 714 715 716
	if (mcasp->version == MCASP_VERSION_4)
		snd_soc_dai_set_dma_data(dai, substream,
					&mcasp->dma_data[substream->stream]);
	else
		snd_soc_dai_set_dma_data(dai, substream, mcasp->dma_params);

717 718 719
	return 0;
}

720
static const struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
721
	.startup	= davinci_mcasp_startup,
722 723 724
	.trigger	= davinci_mcasp_trigger,
	.hw_params	= davinci_mcasp_hw_params,
	.set_fmt	= davinci_mcasp_set_dai_fmt,
725
	.set_clkdiv	= davinci_mcasp_set_clkdiv,
726
	.set_sysclk	= davinci_mcasp_set_sysclk,
727 728
};

729 730
#define DAVINCI_MCASP_RATES	SNDRV_PCM_RATE_8000_192000

731 732 733 734
#define DAVINCI_MCASP_PCM_FMTS (SNDRV_PCM_FMTBIT_S8 | \
				SNDRV_PCM_FMTBIT_U8 | \
				SNDRV_PCM_FMTBIT_S16_LE | \
				SNDRV_PCM_FMTBIT_U16_LE | \
735 736 737 738
				SNDRV_PCM_FMTBIT_S24_LE | \
				SNDRV_PCM_FMTBIT_U24_LE | \
				SNDRV_PCM_FMTBIT_S24_3LE | \
				SNDRV_PCM_FMTBIT_U24_3LE | \
739 740 741
				SNDRV_PCM_FMTBIT_S32_LE | \
				SNDRV_PCM_FMTBIT_U32_LE)

742
static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
743
	{
744
		.name		= "davinci-mcasp.0",
745 746
		.playback	= {
			.channels_min	= 2,
747
			.channels_max	= 32 * 16,
748
			.rates 		= DAVINCI_MCASP_RATES,
749
			.formats	= DAVINCI_MCASP_PCM_FMTS,
750 751 752
		},
		.capture 	= {
			.channels_min 	= 2,
753
			.channels_max	= 32 * 16,
754
			.rates 		= DAVINCI_MCASP_RATES,
755
			.formats	= DAVINCI_MCASP_PCM_FMTS,
756 757 758 759 760
		},
		.ops 		= &davinci_mcasp_dai_ops,

	},
	{
761
		.name		= "davinci-mcasp.1",
762 763 764 765
		.playback 	= {
			.channels_min	= 1,
			.channels_max	= 384,
			.rates		= DAVINCI_MCASP_RATES,
766
			.formats	= DAVINCI_MCASP_PCM_FMTS,
767 768 769 770 771 772
		},
		.ops 		= &davinci_mcasp_dai_ops,
	},

};

773 774 775 776
static const struct snd_soc_component_driver davinci_mcasp_component = {
	.name		= "davinci-mcasp",
};

777 778 779 780 781 782 783 784 785 786 787 788 789 790 791
/* Some HW specific values and defaults. The rest is filled in from DT. */
static struct snd_platform_data dm646x_mcasp_pdata = {
	.tx_dma_offset = 0x400,
	.rx_dma_offset = 0x400,
	.asp_chan_q = EVENTQ_0,
	.version = MCASP_VERSION_1,
};

static struct snd_platform_data da830_mcasp_pdata = {
	.tx_dma_offset = 0x2000,
	.rx_dma_offset = 0x2000,
	.asp_chan_q = EVENTQ_0,
	.version = MCASP_VERSION_2,
};

792
static struct snd_platform_data am33xx_mcasp_pdata = {
793 794 795 796 797 798
	.tx_dma_offset = 0,
	.rx_dma_offset = 0,
	.asp_chan_q = EVENTQ_0,
	.version = MCASP_VERSION_3,
};

799 800 801 802 803 804 805
static struct snd_platform_data dra7_mcasp_pdata = {
	.tx_dma_offset = 0x200,
	.rx_dma_offset = 0x284,
	.asp_chan_q = EVENTQ_0,
	.version = MCASP_VERSION_4,
};

806 807 808
static const struct of_device_id mcasp_dt_ids[] = {
	{
		.compatible = "ti,dm646x-mcasp-audio",
809
		.data = &dm646x_mcasp_pdata,
810 811 812
	},
	{
		.compatible = "ti,da830-mcasp-audio",
813
		.data = &da830_mcasp_pdata,
814
	},
815
	{
816
		.compatible = "ti,am33xx-mcasp-audio",
817
		.data = &am33xx_mcasp_pdata,
818
	},
819 820 821 822
	{
		.compatible = "ti,dra7-mcasp-audio",
		.data = &dra7_mcasp_pdata,
	},
823 824 825 826
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, mcasp_dt_ids);

827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866
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;
}

867 868 869 870 871 872
static struct snd_platform_data *davinci_mcasp_set_pdata_from_of(
						struct platform_device *pdev)
{
	struct device_node *np = pdev->dev.of_node;
	struct snd_platform_data *pdata = NULL;
	const struct of_device_id *match =
873
			of_match_device(mcasp_dt_ids, &pdev->dev);
874
	struct of_phandle_args dma_spec;
875 876 877 878 879 880 881 882 883

	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) {
884
		pdata = (struct snd_platform_data *) match->data;
885 886 887 888 889 890 891 892 893 894 895
	} 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);
896 897 898 899 900 901 902 903
	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;
		}

904
		pdata->tdm_slots = val;
905
	}
906 907 908 909

	of_serial_dir32 = of_get_property(np, "serial-dir", &val);
	val /= sizeof(u32);
	if (of_serial_dir32) {
910 911 912
		u8 *of_serial_dir = devm_kzalloc(&pdev->dev,
						 (sizeof(*of_serial_dir) * val),
						 GFP_KERNEL);
913 914 915 916 917
		if (!of_serial_dir) {
			ret = -ENOMEM;
			goto nodata;
		}

918
		for (i = 0; i < val; i++)
919 920
			of_serial_dir[i] = be32_to_cpup(&of_serial_dir32[i]);

921
		pdata->num_serializer = val;
922 923 924
		pdata->serial_dir = of_serial_dir;
	}

925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946
	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];

947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973
	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;
}

974 975 976
static int davinci_mcasp_probe(struct platform_device *pdev)
{
	struct davinci_pcm_dma_params *dma_data;
977
	struct resource *mem, *ioarea, *res, *dat;
978
	struct snd_platform_data *pdata;
979
	struct davinci_mcasp *mcasp;
980
	int ret;
981

982 983 984 985 986
	if (!pdev->dev.platform_data && !pdev->dev.of_node) {
		dev_err(&pdev->dev, "No platform data supplied\n");
		return -EINVAL;
	}

987
	mcasp = devm_kzalloc(&pdev->dev, sizeof(struct davinci_mcasp),
988
			   GFP_KERNEL);
989
	if (!mcasp)
990 991
		return	-ENOMEM;

992 993 994 995 996 997
	pdata = davinci_mcasp_set_pdata_from_of(pdev);
	if (!pdata) {
		dev_err(&pdev->dev, "no platform data\n");
		return -EINVAL;
	}

998
	mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
999
	if (!mem) {
1000
		dev_warn(mcasp->dev,
1001 1002 1003 1004 1005 1006
			 "\"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;
		}
1007 1008
	}

1009
	ioarea = devm_request_mem_region(&pdev->dev, mem->start,
1010
			resource_size(mem), pdev->name);
1011 1012
	if (!ioarea) {
		dev_err(&pdev->dev, "Audio region already claimed\n");
1013
		return -EBUSY;
1014 1015
	}

1016
	pm_runtime_enable(&pdev->dev);
1017

1018 1019 1020 1021 1022
	ret = pm_runtime_get_sync(&pdev->dev);
	if (IS_ERR_VALUE(ret)) {
		dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n");
		return ret;
	}
1023

1024 1025
	mcasp->base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
	if (!mcasp->base) {
1026 1027 1028 1029 1030
		dev_err(&pdev->dev, "ioremap failed\n");
		ret = -ENOMEM;
		goto err_release_clk;
	}

1031 1032 1033 1034 1035 1036 1037
	mcasp->op_mode = pdata->op_mode;
	mcasp->tdm_slots = pdata->tdm_slots;
	mcasp->num_serializer = pdata->num_serializer;
	mcasp->serial_dir = pdata->serial_dir;
	mcasp->version = pdata->version;
	mcasp->txnumevt = pdata->txnumevt;
	mcasp->rxnumevt = pdata->rxnumevt;
1038

1039
	mcasp->dev = &pdev->dev;
1040

1041
	dat = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
1042 1043
	if (dat)
		mcasp->dat_port = true;
1044

1045
	dma_data = &mcasp->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
1046 1047
	dma_data->asp_chan_q = pdata->asp_chan_q;
	dma_data->ram_chan_q = pdata->ram_chan_q;
1048
	dma_data->sram_pool = pdata->sram_pool;
1049
	dma_data->sram_size = pdata->sram_size_playback;
1050 1051 1052 1053
	if (dat)
		dma_data->dma_addr = dat->start;
	else
		dma_data->dma_addr = mem->start + pdata->tx_dma_offset;
1054

1055 1056 1057
	/* Unconditional dmaengine stuff */
	mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK].addr = dma_data->dma_addr;

1058
	res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
1059 1060 1061 1062
	if (res)
		dma_data->channel = res->start;
	else
		dma_data->channel = pdata->tx_dma_channel;
1063

1064
	dma_data = &mcasp->dma_params[SNDRV_PCM_STREAM_CAPTURE];
1065 1066
	dma_data->asp_chan_q = pdata->asp_chan_q;
	dma_data->ram_chan_q = pdata->ram_chan_q;
1067
	dma_data->sram_pool = pdata->sram_pool;
1068
	dma_data->sram_size = pdata->sram_size_capture;
1069 1070 1071 1072 1073
	if (dat)
		dma_data->dma_addr = dat->start;
	else
		dma_data->dma_addr = mem->start + pdata->rx_dma_offset;

1074 1075 1076
	/* Unconditional dmaengine stuff */
	mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE].addr = dma_data->dma_addr;

1077 1078 1079 1080 1081 1082 1083
	if (mcasp->version < MCASP_VERSION_3) {
		mcasp->fifo_base = DAVINCI_MCASP_V2_AFIFO_BASE;
		/* dma_data->dma_addr is pointing to the data port address */
		mcasp->dat_port = true;
	} else {
		mcasp->fifo_base = DAVINCI_MCASP_V3_AFIFO_BASE;
	}
1084 1085

	res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
1086 1087 1088 1089
	if (res)
		dma_data->channel = res->start;
	else
		dma_data->channel = pdata->rx_dma_channel;
1090

1091 1092 1093 1094
	/* Unconditional dmaengine stuff */
	mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK].filter_data = "tx";
	mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE].filter_data = "rx";

1095
	dev_set_drvdata(&pdev->dev, mcasp);
1096 1097 1098

	mcasp_reparent_fck(pdev);

1099 1100
	ret = snd_soc_register_component(&pdev->dev, &davinci_mcasp_component,
					 &davinci_mcasp_dai[pdata->op_mode], 1);
1101 1102

	if (ret != 0)
1103
		goto err_release_clk;
1104

1105 1106 1107 1108 1109 1110
	if (mcasp->version != MCASP_VERSION_4) {
		ret = davinci_soc_platform_register(&pdev->dev);
		if (ret) {
			dev_err(&pdev->dev, "register PCM failed: %d\n", ret);
			goto err_unregister_component;
		}
1111 1112
	}

1113 1114
	return 0;

1115 1116
err_unregister_component:
	snd_soc_unregister_component(&pdev->dev);
1117
err_release_clk:
1118 1119
	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
1120 1121 1122 1123 1124
	return ret;
}

static int davinci_mcasp_remove(struct platform_device *pdev)
{
1125
	struct davinci_mcasp *mcasp = dev_get_drvdata(&pdev->dev);
1126

1127
	snd_soc_unregister_component(&pdev->dev);
1128 1129
	if (mcasp->version != MCASP_VERSION_4)
		davinci_soc_platform_unregister(&pdev->dev);
1130 1131 1132

	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
1133 1134 1135 1136

	return 0;
}

1137 1138 1139
#ifdef CONFIG_PM_SLEEP
static int davinci_mcasp_suspend(struct device *dev)
{
1140
	struct davinci_mcasp *mcasp = dev_get_drvdata(dev);
1141

1142 1143 1144 1145 1146 1147 1148
	mcasp->context.txfmtctl = mcasp_get_reg(mcasp, DAVINCI_MCASP_TXFMCTL_REG);
	mcasp->context.rxfmtctl = mcasp_get_reg(mcasp, DAVINCI_MCASP_RXFMCTL_REG);
	mcasp->context.txfmt = mcasp_get_reg(mcasp, DAVINCI_MCASP_TXFMT_REG);
	mcasp->context.rxfmt = mcasp_get_reg(mcasp, DAVINCI_MCASP_RXFMT_REG);
	mcasp->context.aclkxctl = mcasp_get_reg(mcasp, DAVINCI_MCASP_ACLKXCTL_REG);
	mcasp->context.aclkrctl = mcasp_get_reg(mcasp, DAVINCI_MCASP_ACLKRCTL_REG);
	mcasp->context.pdir = mcasp_get_reg(mcasp, DAVINCI_MCASP_PDIR_REG);
1149 1150 1151 1152 1153 1154

	return 0;
}

static int davinci_mcasp_resume(struct device *dev)
{
1155
	struct davinci_mcasp *mcasp = dev_get_drvdata(dev);
1156 1157 1158 1159 1160 1161 1162 1163

	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXFMCTL_REG, mcasp->context.txfmtctl);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_RXFMCTL_REG, mcasp->context.rxfmtctl);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXFMT_REG, mcasp->context.txfmt);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_RXFMT_REG, mcasp->context.rxfmt);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, mcasp->context.aclkxctl);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, mcasp->context.aclkrctl);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_PDIR_REG, mcasp->context.pdir);
1164 1165 1166 1167 1168 1169 1170 1171 1172

	return 0;
}
#endif

SIMPLE_DEV_PM_OPS(davinci_mcasp_pm_ops,
		  davinci_mcasp_suspend,
		  davinci_mcasp_resume);

1173 1174 1175 1176 1177 1178
static struct platform_driver davinci_mcasp_driver = {
	.probe		= davinci_mcasp_probe,
	.remove		= davinci_mcasp_remove,
	.driver		= {
		.name	= "davinci-mcasp",
		.owner	= THIS_MODULE,
1179
		.pm	= &davinci_mcasp_pm_ops,
1180
		.of_match_table = mcasp_dt_ids,
1181 1182 1183
	},
};

1184
module_platform_driver(davinci_mcasp_driver);
1185 1186 1187 1188

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