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
	int	sysclk_freq;
	bool	bclk_master;

59 60 61 62
	/* McASP FIFO related */
	u8	txnumevt;
	u8	rxnumevt;

63 64
	bool	dat_port;

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

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

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

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

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

105
static inline u32 mcasp_get_reg(struct davinci_mcasp *mcasp, u32 offset)
106
{
107
	return (u32)__raw_readl(mcasp->base + offset);
108 109
}

110
static void mcasp_set_ctl_reg(struct davinci_mcasp *mcasp, u32 ctl_reg, u32 val)
111 112 113
{
	int i = 0;

114
	mcasp_set_bits(mcasp, ctl_reg, val);
115 116 117 118

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

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

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

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

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

	/*
	 * 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)) {
146 147
		mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST);
		mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST);
148 149
	}

150 151
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXSERCLR);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_RXBUF_REG, 0);
152

153 154 155
	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);
156

157 158
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
	mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
159 160

	if (mcasp_is_synchronous(mcasp))
161
		mcasp_set_ctl_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, TXFSRST);
162 163
}

164
static void mcasp_start_tx(struct davinci_mcasp *mcasp)
165
{
166 167 168
	u8 offset = 0, i;
	u32 cnt;

169 170 171 172
	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);
173

174 175 176
	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);
177 178
	for (i = 0; i < mcasp->num_serializer; i++) {
		if (mcasp->serial_dir[i] == TX_MODE) {
179 180 181 182 183 184 185
			offset = i;
			break;
		}
	}

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

190
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXBUF_REG, 0);
191 192
}

193
static void davinci_mcasp_start(struct davinci_mcasp *mcasp, int stream)
194
{
195 196
	u32 reg;

197 198
	mcasp->streams++;

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

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

225 226
	mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLR_REG, 0);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
227 228
}

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

240 241
	mcasp_set_reg(mcasp, DAVINCI_MCASP_GBLCTLX_REG, val);
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
242 243
}

244
static void davinci_mcasp_stop(struct davinci_mcasp *mcasp, int stream)
245
{
246 247
	u32 reg;

248 249
	mcasp->streams--;

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

static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
					 unsigned int fmt)
{
268
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
269
	int ret = 0;
270

271
	pm_runtime_get_sync(mcasp->dev);
272 273 274
	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
	case SND_SOC_DAIFMT_DSP_B:
	case SND_SOC_DAIFMT_AC97:
275 276
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
277 278 279
		break;
	default:
		/* configure a full-word SYNC pulse (LRCLK) */
280 281
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
282 283

		/* make 1st data bit occur one ACLK cycle after the frame sync */
284 285
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, FSXDLY(1));
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, FSRDLY(1));
286 287 288
		break;
	}

289 290 291
	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
	case SND_SOC_DAIFMT_CBS_CFS:
		/* codec is clock and frame slave */
292 293
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
294

295 296
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
297

298 299
		mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, ACLKX | ACLKR);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AFSX | AFSR);
300
		mcasp->bclk_master = 1;
301
		break;
302 303
	case SND_SOC_DAIFMT_CBM_CFS:
		/* codec is clock master and frame slave */
304 305
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
306

307 308
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
309

310 311
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, ACLKX | ACLKR);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AFSX | AFSR);
312
		mcasp->bclk_master = 0;
313
		break;
314 315
	case SND_SOC_DAIFMT_CBM_CFM:
		/* codec is clock and frame master */
316 317
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
318

319 320
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
321

322 323
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG,
			       ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR);
324
		mcasp->bclk_master = 0;
325 326 327
		break;

	default:
328 329
		ret = -EINVAL;
		goto out;
330 331 332 333
	}

	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
	case SND_SOC_DAIFMT_IB_NF:
334 335
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
336

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

	case SND_SOC_DAIFMT_NB_IF:
342 343
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
344

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

	case SND_SOC_DAIFMT_IB_IF:
350 351
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
352

353 354
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
355 356 357
		break;

	case SND_SOC_DAIFMT_NB_NF:
358 359
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
360

361 362
		mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
363 364 365
		break;

	default:
366 367
		ret = -EINVAL;
		break;
368
	}
369 370 371
out:
	pm_runtime_put_sync(mcasp->dev);
	return ret;
372 373
}

374 375
static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div)
{
376
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
377 378 379

	switch (div_id) {
	case 0:		/* MCLK divider */
380
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG,
381
			       AHCLKXDIV(div - 1), AHCLKXDIV_MASK);
382
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG,
383 384 385 386
			       AHCLKRDIV(div - 1), AHCLKRDIV_MASK);
		break;

	case 1:		/* BCLK divider */
387
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG,
388
			       ACLKXDIV(div - 1), ACLKXDIV_MASK);
389
		mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG,
390 391 392
			       ACLKRDIV(div - 1), ACLKRDIV_MASK);
		break;

393
	case 2:		/* BCLK/LRCLK ratio */
394
		mcasp->bclk_lrclk_ratio = div;
395 396
		break;

397 398 399 400 401 402 403
	default:
		return -EINVAL;
	}

	return 0;
}

404 405 406
static int davinci_mcasp_set_sysclk(struct snd_soc_dai *dai, int clk_id,
				    unsigned int freq, int dir)
{
407
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
408 409

	if (dir == SND_SOC_CLOCK_OUT) {
410 411 412
		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);
413
	} else {
414 415 416
		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);
417 418
	}

419 420
	mcasp->sysclk_freq = freq;

421 422 423
	return 0;
}

424
static int davinci_config_channel_size(struct davinci_mcasp *mcasp,
425
				       int word_length)
426
{
427
	u32 fmt;
D
Daniel Mack 已提交
428 429
	u32 tx_rotate = (word_length / 4) & 0x7;
	u32 rx_rotate = (32 - word_length) / 4;
430
	u32 mask = (1ULL << word_length) - 1;
431

432 433 434 435 436
	/*
	 * 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.
437 438 439
	 * 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).
440
	 */
441 442
	if (mcasp->bclk_lrclk_ratio)
		word_length = mcasp->bclk_lrclk_ratio / mcasp->tdm_slots;
443

444 445
	/* mapping of the XSSZ bit-field as described in the datasheet */
	fmt = (word_length >> 1) - 1;
446

447
	if (mcasp->op_mode != DAVINCI_MCASP_DIT_MODE) {
448 449 450 451 452 453 454 455 456
		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);
457 458
	}

459
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXMASK_REG, mask);
460

461 462 463
	return 0;
}

464
static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream,
465
				    int channels)
466 467
{
	int i;
468 469
	u8 tx_ser = 0;
	u8 rx_ser = 0;
470
	u8 ser;
471
	u8 slots = mcasp->tdm_slots;
472
	u8 max_active_serializers = (channels + slots - 1) / slots;
473
	u32 reg;
474
	/* Default configuration */
475
	if (mcasp->version != MCASP_VERSION_4)
476
		mcasp_set_bits(mcasp, DAVINCI_MCASP_PWREMUMGT_REG, MCASP_SOFT);
477 478

	/* All PINS as McASP */
479
	mcasp_set_reg(mcasp, DAVINCI_MCASP_PFUNC_REG, 0x00000000);
480 481

	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
482 483
		mcasp_set_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
484
	} else {
485 486
		mcasp_set_reg(mcasp, DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
		mcasp_clr_bits(mcasp, DAVINCI_MCASP_REVTCTL_REG, RXDATADMADIS);
487 488
	}

489
	for (i = 0; i < mcasp->num_serializer; i++) {
490 491
		mcasp_set_bits(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
			       mcasp->serial_dir[i]);
492
		if (mcasp->serial_dir[i] == TX_MODE &&
493
					tx_ser < max_active_serializers) {
494
			mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AXR(i));
495
			tx_ser++;
496
		} else if (mcasp->serial_dir[i] == RX_MODE &&
497
					rx_ser < max_active_serializers) {
498
			mcasp_clr_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AXR(i));
499
			rx_ser++;
500
		} else {
501 502
			mcasp_mod_bits(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
				       SRMOD_INACTIVE, SRMOD_MASK);
503 504 505
		}
	}

506 507 508 509 510 511
	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
		ser = tx_ser;
	else
		ser = rx_ser;

	if (ser < max_active_serializers) {
512
		dev_warn(mcasp->dev, "stream has more channels (%d) than are "
513 514 515 516
			"enabled in mcasp (%d)\n", channels, ser * slots);
		return -EINVAL;
	}

517 518 519
	if (mcasp->txnumevt && stream == SNDRV_PCM_STREAM_PLAYBACK) {
		if (mcasp->txnumevt * tx_ser > 64)
			mcasp->txnumevt = 1;
520

521
		reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
522 523 524
		mcasp_mod_bits(mcasp, reg, tx_ser, NUMDMA_MASK);
		mcasp_mod_bits(mcasp, reg, ((mcasp->txnumevt * tx_ser) << 8),
			       NUMEVT_MASK);
525 526
	}

527 528 529
	if (mcasp->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) {
		if (mcasp->rxnumevt * rx_ser > 64)
			mcasp->rxnumevt = 1;
530 531

		reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
532 533 534
		mcasp_mod_bits(mcasp, reg, rx_ser, NUMDMA_MASK);
		mcasp_mod_bits(mcasp, reg, ((mcasp->rxnumevt * rx_ser) << 8),
			       NUMEVT_MASK);
535
	}
536 537

	return 0;
538 539
}

540
static int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream)
541 542 543
{
	int i, active_slots;
	u32 mask = 0;
544
	u32 busel = 0;
545

546 547 548 549 550 551
	if ((mcasp->tdm_slots < 2) || (mcasp->tdm_slots > 32)) {
		dev_err(mcasp->dev, "tdm slot %d not supported\n",
			mcasp->tdm_slots);
		return -EINVAL;
	}

552
	active_slots = (mcasp->tdm_slots > 31) ? 32 : mcasp->tdm_slots;
553 554 555
	for (i = 0; i < active_slots; i++)
		mask |= (1 << i);

556
	mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC);
557

558 559 560
	if (!mcasp->dat_port)
		busel = TXSEL;

561 562 563 564 565 566 567 568 569 570 571
	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;
572 573 574
}

/* S/PDIF */
575
static int mcasp_dit_hw_param(struct davinci_mcasp *mcasp)
576 577 578
{
	/* Set the TX format : 24 bit right rotation, 32 bit slot, Pad 0
	   and LSB first */
579
	mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, TXROT(6) | TXSSZ(15));
580 581

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

	/* Set the TX tdm : for all the slots */
585
	mcasp_set_reg(mcasp, DAVINCI_MCASP_TXTDM_REG, 0xFFFFFFFF);
586 587

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

590
	mcasp_clr_bits(mcasp, DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
591 592

	/* Only 44100 and 48000 are valid, both have the same setting */
593
	mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXDIV(3));
594 595

	/* Enable the DIT */
596
	mcasp_set_bits(mcasp, DAVINCI_MCASP_TXDITCTL_REG, DITEN);
597 598

	return 0;
599 600 601 602 603 604
}

static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
					struct snd_pcm_hw_params *params,
					struct snd_soc_dai *cpu_dai)
{
605
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
606
	struct davinci_pcm_dma_params *dma_params =
607
					&mcasp->dma_params[substream->stream];
608 609
	struct snd_dmaengine_dai_dma_data *dma_data =
					&mcasp->dma_data[substream->stream];
610
	int word_length;
611
	u8 fifo_level;
612
	u8 slots = mcasp->tdm_slots;
613
	u8 active_serializers;
614
	int channels = params_channels(params);
615
	int ret;
616 617 618 619 620 621 622 623 624 625 626 627

	/* If mcasp is BCLK master we need to set BCLK divider */
	if (mcasp->bclk_master) {
		unsigned int bclk_freq = snd_soc_params_to_bclk(params);
		if (mcasp->sysclk_freq % bclk_freq != 0) {
			dev_err(mcasp->dev, "Can't produce requred BCLK\n");
			return -EINVAL;
		}
		davinci_mcasp_set_clkdiv(
			cpu_dai, 1, mcasp->sysclk_freq / bclk_freq);
	}

628 629 630 631
	ret = mcasp_common_hw_param(mcasp, substream->stream, channels);
	if (ret)
		return ret;

632
	if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE)
633
		ret = mcasp_dit_hw_param(mcasp);
634
	else
635 636 637 638
		ret = mcasp_i2s_hw_param(mcasp, substream->stream);

	if (ret)
		return ret;
639 640

	switch (params_format(params)) {
641
	case SNDRV_PCM_FORMAT_U8:
642 643
	case SNDRV_PCM_FORMAT_S8:
		dma_params->data_type = 1;
644
		word_length = 8;
645 646
		break;

647
	case SNDRV_PCM_FORMAT_U16_LE:
648 649
	case SNDRV_PCM_FORMAT_S16_LE:
		dma_params->data_type = 2;
650
		word_length = 16;
651 652
		break;

653 654 655
	case SNDRV_PCM_FORMAT_U24_3LE:
	case SNDRV_PCM_FORMAT_S24_3LE:
		dma_params->data_type = 3;
656
		word_length = 24;
657 658
		break;

659 660
	case SNDRV_PCM_FORMAT_U24_LE:
	case SNDRV_PCM_FORMAT_S24_LE:
661
	case SNDRV_PCM_FORMAT_U32_LE:
662 663
	case SNDRV_PCM_FORMAT_S32_LE:
		dma_params->data_type = 4;
664
		word_length = 32;
665 666 667 668 669 670
		break;

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

672 673 674 675 676 677 678
	/* Calculate FIFO level */
	active_serializers = (channels + slots - 1) / slots;
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
		fifo_level = mcasp->txnumevt * active_serializers;
	else
		fifo_level = mcasp->rxnumevt * active_serializers;

679
	if (mcasp->version == MCASP_VERSION_2 && !fifo_level)
680 681
		dma_params->acnt = 4;
	else
682 683
		dma_params->acnt = dma_params->data_type;

684
	dma_params->fifo_level = fifo_level;
685 686
	dma_data->maxburst = fifo_level;

687
	davinci_config_channel_size(mcasp, word_length);
688 689 690 691 692 693 694

	return 0;
}

static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
				     int cmd, struct snd_soc_dai *cpu_dai)
{
695
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
696 697 698 699
	int ret = 0;

	switch (cmd) {
	case SNDRV_PCM_TRIGGER_RESUME:
700 701
	case SNDRV_PCM_TRIGGER_START:
	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
702
		davinci_mcasp_start(mcasp, substream->stream);
703 704
		break;
	case SNDRV_PCM_TRIGGER_SUSPEND:
705
	case SNDRV_PCM_TRIGGER_STOP:
706
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
707
		davinci_mcasp_stop(mcasp, substream->stream);
708 709 710 711 712 713 714 715 716
		break;

	default:
		ret = -EINVAL;
	}

	return ret;
}

717 718 719
static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
				 struct snd_soc_dai *dai)
{
720
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
721

722 723 724 725 726 727
	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);

728 729 730
	return 0;
}

731
static const struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
732
	.startup	= davinci_mcasp_startup,
733 734 735
	.trigger	= davinci_mcasp_trigger,
	.hw_params	= davinci_mcasp_hw_params,
	.set_fmt	= davinci_mcasp_set_dai_fmt,
736
	.set_clkdiv	= davinci_mcasp_set_clkdiv,
737
	.set_sysclk	= davinci_mcasp_set_sysclk,
738 739
};

740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774
#ifdef CONFIG_PM_SLEEP
static int davinci_mcasp_suspend(struct snd_soc_dai *dai)
{
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);

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

	return 0;
}

static int davinci_mcasp_resume(struct snd_soc_dai *dai)
{
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);

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

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

775 776
#define DAVINCI_MCASP_RATES	SNDRV_PCM_RATE_8000_192000

777 778 779 780
#define DAVINCI_MCASP_PCM_FMTS (SNDRV_PCM_FMTBIT_S8 | \
				SNDRV_PCM_FMTBIT_U8 | \
				SNDRV_PCM_FMTBIT_S16_LE | \
				SNDRV_PCM_FMTBIT_U16_LE | \
781 782 783 784
				SNDRV_PCM_FMTBIT_S24_LE | \
				SNDRV_PCM_FMTBIT_U24_LE | \
				SNDRV_PCM_FMTBIT_S24_3LE | \
				SNDRV_PCM_FMTBIT_U24_3LE | \
785 786 787
				SNDRV_PCM_FMTBIT_S32_LE | \
				SNDRV_PCM_FMTBIT_U32_LE)

788
static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
789
	{
790
		.name		= "davinci-mcasp.0",
791 792
		.suspend	= davinci_mcasp_suspend,
		.resume		= davinci_mcasp_resume,
793 794
		.playback	= {
			.channels_min	= 2,
795
			.channels_max	= 32 * 16,
796
			.rates 		= DAVINCI_MCASP_RATES,
797
			.formats	= DAVINCI_MCASP_PCM_FMTS,
798 799 800
		},
		.capture 	= {
			.channels_min 	= 2,
801
			.channels_max	= 32 * 16,
802
			.rates 		= DAVINCI_MCASP_RATES,
803
			.formats	= DAVINCI_MCASP_PCM_FMTS,
804 805 806 807 808
		},
		.ops 		= &davinci_mcasp_dai_ops,

	},
	{
809
		.name		= "davinci-mcasp.1",
810 811 812 813
		.playback 	= {
			.channels_min	= 1,
			.channels_max	= 384,
			.rates		= DAVINCI_MCASP_RATES,
814
			.formats	= DAVINCI_MCASP_PCM_FMTS,
815 816 817 818 819 820
		},
		.ops 		= &davinci_mcasp_dai_ops,
	},

};

821 822 823 824
static const struct snd_soc_component_driver davinci_mcasp_component = {
	.name		= "davinci-mcasp",
};

825
/* Some HW specific values and defaults. The rest is filled in from DT. */
826
static struct davinci_mcasp_pdata dm646x_mcasp_pdata = {
827 828 829 830 831 832
	.tx_dma_offset = 0x400,
	.rx_dma_offset = 0x400,
	.asp_chan_q = EVENTQ_0,
	.version = MCASP_VERSION_1,
};

833
static struct davinci_mcasp_pdata da830_mcasp_pdata = {
834 835 836 837 838 839
	.tx_dma_offset = 0x2000,
	.rx_dma_offset = 0x2000,
	.asp_chan_q = EVENTQ_0,
	.version = MCASP_VERSION_2,
};

840
static struct davinci_mcasp_pdata am33xx_mcasp_pdata = {
841 842 843 844 845 846
	.tx_dma_offset = 0,
	.rx_dma_offset = 0,
	.asp_chan_q = EVENTQ_0,
	.version = MCASP_VERSION_3,
};

847
static struct davinci_mcasp_pdata dra7_mcasp_pdata = {
848 849 850 851 852 853
	.tx_dma_offset = 0x200,
	.rx_dma_offset = 0x284,
	.asp_chan_q = EVENTQ_0,
	.version = MCASP_VERSION_4,
};

854 855 856
static const struct of_device_id mcasp_dt_ids[] = {
	{
		.compatible = "ti,dm646x-mcasp-audio",
857
		.data = &dm646x_mcasp_pdata,
858 859 860
	},
	{
		.compatible = "ti,da830-mcasp-audio",
861
		.data = &da830_mcasp_pdata,
862
	},
863
	{
864
		.compatible = "ti,am33xx-mcasp-audio",
865
		.data = &am33xx_mcasp_pdata,
866
	},
867 868 869 870
	{
		.compatible = "ti,dra7-mcasp-audio",
		.data = &dra7_mcasp_pdata,
	},
871 872 873 874
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, mcasp_dt_ids);

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

915
static struct davinci_mcasp_pdata *davinci_mcasp_set_pdata_from_of(
916 917 918
						struct platform_device *pdev)
{
	struct device_node *np = pdev->dev.of_node;
919
	struct davinci_mcasp_pdata *pdata = NULL;
920
	const struct of_device_id *match =
921
			of_match_device(mcasp_dt_ids, &pdev->dev);
922
	struct of_phandle_args dma_spec;
923 924 925 926 927 928 929 930 931

	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) {
932
		pdata = (struct davinci_mcasp_pdata*) match->data;
933 934 935 936 937 938 939 940 941 942 943
	} 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);
944 945 946 947 948 949 950 951
	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;
		}

952
		pdata->tdm_slots = val;
953
	}
954 955 956 957

	of_serial_dir32 = of_get_property(np, "serial-dir", &val);
	val /= sizeof(u32);
	if (of_serial_dir32) {
958 959 960
		u8 *of_serial_dir = devm_kzalloc(&pdev->dev,
						 (sizeof(*of_serial_dir) * val),
						 GFP_KERNEL);
961 962 963 964 965
		if (!of_serial_dir) {
			ret = -ENOMEM;
			goto nodata;
		}

966
		for (i = 0; i < val; i++)
967 968
			of_serial_dir[i] = be32_to_cpup(&of_serial_dir32[i]);

969
		pdata->num_serializer = val;
970 971 972
		pdata->serial_dir = of_serial_dir;
	}

973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994
	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];

995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
	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;
}

1022 1023 1024
static int davinci_mcasp_probe(struct platform_device *pdev)
{
	struct davinci_pcm_dma_params *dma_data;
1025
	struct resource *mem, *ioarea, *res, *dat;
1026
	struct davinci_mcasp_pdata *pdata;
1027
	struct davinci_mcasp *mcasp;
1028
	int ret;
1029

1030 1031 1032 1033 1034
	if (!pdev->dev.platform_data && !pdev->dev.of_node) {
		dev_err(&pdev->dev, "No platform data supplied\n");
		return -EINVAL;
	}

1035
	mcasp = devm_kzalloc(&pdev->dev, sizeof(struct davinci_mcasp),
1036
			   GFP_KERNEL);
1037
	if (!mcasp)
1038 1039
		return	-ENOMEM;

1040 1041 1042 1043 1044 1045
	pdata = davinci_mcasp_set_pdata_from_of(pdev);
	if (!pdata) {
		dev_err(&pdev->dev, "no platform data\n");
		return -EINVAL;
	}

1046
	mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
1047
	if (!mem) {
1048
		dev_warn(mcasp->dev,
1049 1050 1051 1052 1053 1054
			 "\"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;
		}
1055 1056
	}

1057
	ioarea = devm_request_mem_region(&pdev->dev, mem->start,
1058
			resource_size(mem), pdev->name);
1059 1060
	if (!ioarea) {
		dev_err(&pdev->dev, "Audio region already claimed\n");
1061
		return -EBUSY;
1062 1063
	}

1064
	pm_runtime_enable(&pdev->dev);
1065

1066 1067 1068 1069 1070
	ret = pm_runtime_get_sync(&pdev->dev);
	if (IS_ERR_VALUE(ret)) {
		dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n");
		return ret;
	}
1071

1072 1073
	mcasp->base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
	if (!mcasp->base) {
1074 1075 1076 1077 1078
		dev_err(&pdev->dev, "ioremap failed\n");
		ret = -ENOMEM;
		goto err_release_clk;
	}

1079 1080 1081 1082 1083 1084 1085
	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;
1086

1087
	mcasp->dev = &pdev->dev;
1088

1089
	dat = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
1090 1091
	if (dat)
		mcasp->dat_port = true;
1092

1093
	dma_data = &mcasp->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
1094 1095
	dma_data->asp_chan_q = pdata->asp_chan_q;
	dma_data->ram_chan_q = pdata->ram_chan_q;
1096
	dma_data->sram_pool = pdata->sram_pool;
1097
	dma_data->sram_size = pdata->sram_size_playback;
1098 1099 1100 1101
	if (dat)
		dma_data->dma_addr = dat->start;
	else
		dma_data->dma_addr = mem->start + pdata->tx_dma_offset;
1102

1103 1104 1105
	/* Unconditional dmaengine stuff */
	mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK].addr = dma_data->dma_addr;

1106
	res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
1107 1108 1109 1110
	if (res)
		dma_data->channel = res->start;
	else
		dma_data->channel = pdata->tx_dma_channel;
1111

1112
	dma_data = &mcasp->dma_params[SNDRV_PCM_STREAM_CAPTURE];
1113 1114
	dma_data->asp_chan_q = pdata->asp_chan_q;
	dma_data->ram_chan_q = pdata->ram_chan_q;
1115
	dma_data->sram_pool = pdata->sram_pool;
1116
	dma_data->sram_size = pdata->sram_size_capture;
1117 1118 1119 1120 1121
	if (dat)
		dma_data->dma_addr = dat->start;
	else
		dma_data->dma_addr = mem->start + pdata->rx_dma_offset;

1122 1123 1124
	/* Unconditional dmaengine stuff */
	mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE].addr = dma_data->dma_addr;

1125 1126 1127 1128 1129 1130 1131
	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;
	}
1132 1133

	res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
1134 1135 1136 1137
	if (res)
		dma_data->channel = res->start;
	else
		dma_data->channel = pdata->rx_dma_channel;
1138

1139 1140 1141 1142
	/* Unconditional dmaengine stuff */
	mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK].filter_data = "tx";
	mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE].filter_data = "rx";

1143
	dev_set_drvdata(&pdev->dev, mcasp);
1144 1145 1146

	mcasp_reparent_fck(pdev);

1147 1148
	ret = snd_soc_register_component(&pdev->dev, &davinci_mcasp_component,
					 &davinci_mcasp_dai[pdata->op_mode], 1);
1149 1150

	if (ret != 0)
1151
		goto err_release_clk;
1152

1153 1154 1155 1156 1157 1158
	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;
		}
1159 1160
	}

1161 1162
	return 0;

1163 1164
err_unregister_component:
	snd_soc_unregister_component(&pdev->dev);
1165
err_release_clk:
1166 1167
	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
1168 1169 1170 1171 1172
	return ret;
}

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

1175
	snd_soc_unregister_component(&pdev->dev);
1176 1177
	if (mcasp->version != MCASP_VERSION_4)
		davinci_soc_platform_unregister(&pdev->dev);
1178 1179 1180

	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
1181 1182 1183 1184 1185 1186 1187 1188 1189 1190

	return 0;
}

static struct platform_driver davinci_mcasp_driver = {
	.probe		= davinci_mcasp_probe,
	.remove		= davinci_mcasp_remove,
	.driver		= {
		.name	= "davinci-mcasp",
		.owner	= THIS_MODULE,
1191
		.of_match_table = mcasp_dt_ids,
1192 1193 1194
	},
};

1195
module_platform_driver(davinci_mcasp_driver);
1196 1197 1198 1199

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