davinci-mcasp.c 31.7 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 mcasp_common_hw_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 int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream)
528 529 530
{
	int i, active_slots;
	u32 mask = 0;
531
	u32 busel = 0;
532

533 534 535 536 537 538
	if ((mcasp->tdm_slots < 2) || (mcasp->tdm_slots > 32)) {
		dev_err(mcasp->dev, "tdm slot %d not supported\n",
			mcasp->tdm_slots);
		return -EINVAL;
	}

539
	active_slots = (mcasp->tdm_slots > 31) ? 32 : mcasp->tdm_slots;
540 541 542
	for (i = 0; i < active_slots; i++)
		mask |= (1 << i);

543
	mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC);
544

545 546 547
	if (!mcasp->dat_port)
		busel = TXSEL;

548 549 550 551 552 553 554 555 556 557 558
	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,
		       FSXMOD(mcasp->tdm_slots), FSXMOD(0x1FF));

	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,
		       FSRMOD(mcasp->tdm_slots), FSRMOD(0x1FF));

	return 0;
559 560 561
}

/* S/PDIF */
562
static int mcasp_dit_hw_param(struct davinci_mcasp *mcasp)
563 564 565
{
	/* Set the TX format : 24 bit right rotation, 32 bit slot, Pad 0
	   and LSB first */
566
	mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(6) | TXSSZ(15));
567 568

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

	/* Set the TX tdm : for all the slots */
572
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXTDM_REG, 0xFFFFFFFF);
573 574

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

577
	mcasp_clr_bits(mcasp, DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
578 579

	/* Only 44100 and 48000 are valid, both have the same setting */
580
	mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXDIV(3));
581 582

	/* Enable the DIT */
583
	mcasp_set_bits(mcasp, DAVINCI_MCASP_TXDITCTL_REG, DITEN);
584 585

	return 0;
586 587 588 589 590 591
}

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

607 608
	active_serializers = (channels + slots - 1) / slots;

609
	if (mcasp_common_hw_param(mcasp, substream->stream, channels) == -EINVAL)
610
		return -EINVAL;
611
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
612
		fifo_level = mcasp->txnumevt * active_serializers;
613
	else
614
		fifo_level = mcasp->rxnumevt * active_serializers;
615

616
	if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE)
617
		ret = mcasp_dit_hw_param(mcasp);
618
	else
619 620 621 622
		ret = mcasp_i2s_hw_param(mcasp, substream->stream);

	if (ret)
		return ret;
623 624

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

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

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

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

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

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

661
	dma_params->fifo_level = fifo_level;
662 663
	dma_data->maxburst = fifo_level;

664
	davinci_config_channel_size(mcasp, word_length);
665 666 667 668 669 670 671

	return 0;
}

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

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

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

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

	default:
		ret = -EINVAL;
	}

	return ret;
}

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

709 710 711 712 713 714
	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);

715 716 717
	return 0;
}

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

727 728
#define DAVINCI_MCASP_RATES	SNDRV_PCM_RATE_8000_192000

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

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

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

};

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

775 776 777 778 779 780 781 782 783 784 785 786 787 788 789
/* 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,
};

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

797 798 799 800 801 802 803
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,
};

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

825 826 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
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;
}

865 866 867 868 869 870
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 =
871
			of_match_device(mcasp_dt_ids, &pdev->dev);
872
	struct of_phandle_args dma_spec;
873 874 875 876 877 878 879 880 881

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

902
		pdata->tdm_slots = val;
903
	}
904 905 906 907

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

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

919
		pdata->num_serializer = val;
920 921 922
		pdata->serial_dir = of_serial_dir;
	}

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

945 946 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
	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;
}

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

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

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

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

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

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

1014
	pm_runtime_enable(&pdev->dev);
1015

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

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

1029 1030 1031 1032 1033 1034 1035
	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;
1036

1037
	mcasp->dev = &pdev->dev;
1038

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

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

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

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

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

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

1075 1076 1077 1078 1079 1080 1081
	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;
	}
1082 1083

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

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

1093
	dev_set_drvdata(&pdev->dev, mcasp);
1094 1095 1096

	mcasp_reparent_fck(pdev);

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

	if (ret != 0)
1101
		goto err_release_clk;
1102

1103 1104 1105 1106 1107 1108
	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;
		}
1109 1110
	}

1111 1112
	return 0;

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

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

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

	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
1131 1132 1133 1134

	return 0;
}

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

1140 1141 1142 1143 1144 1145 1146
	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);
1147 1148 1149 1150 1151 1152

	return 0;
}

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

	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);
1162 1163 1164 1165 1166 1167 1168 1169 1170

	return 0;
}
#endif

SIMPLE_DEV_PM_OPS(davinci_mcasp_pm_ops,
		  davinci_mcasp_suspend,
		  davinci_mcasp_resume);

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

1182
module_platform_driver(davinci_mcasp_driver);
1183 1184 1185 1186

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