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;
615
	int ret;
616 617
	struct snd_interval *pcm_channels = hw_param_interval(params,
					SNDRV_PCM_HW_PARAM_CHANNELS);
618 619 620 621 622 623 624 625 626 627 628 629

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

630
	channels = pcm_channels->min;
631

632 633
	active_serializers = (channels + slots - 1) / slots;

634
	if (mcasp_common_hw_param(mcasp, substream->stream, channels) == -EINVAL)
635
		return -EINVAL;
636
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
637
		fifo_level = mcasp->txnumevt * active_serializers;
638
	else
639
		fifo_level = mcasp->rxnumevt * active_serializers;
640

641
	if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE)
642
		ret = mcasp_dit_hw_param(mcasp);
643
	else
644 645 646 647
		ret = mcasp_i2s_hw_param(mcasp, substream->stream);

	if (ret)
		return ret;
648 649

	switch (params_format(params)) {
650
	case SNDRV_PCM_FORMAT_U8:
651 652
	case SNDRV_PCM_FORMAT_S8:
		dma_params->data_type = 1;
653
		word_length = 8;
654 655
		break;

656
	case SNDRV_PCM_FORMAT_U16_LE:
657 658
	case SNDRV_PCM_FORMAT_S16_LE:
		dma_params->data_type = 2;
659
		word_length = 16;
660 661
		break;

662 663 664
	case SNDRV_PCM_FORMAT_U24_3LE:
	case SNDRV_PCM_FORMAT_S24_3LE:
		dma_params->data_type = 3;
665
		word_length = 24;
666 667
		break;

668 669
	case SNDRV_PCM_FORMAT_U24_LE:
	case SNDRV_PCM_FORMAT_S24_LE:
670
	case SNDRV_PCM_FORMAT_U32_LE:
671 672
	case SNDRV_PCM_FORMAT_S32_LE:
		dma_params->data_type = 4;
673
		word_length = 32;
674 675 676 677 678 679
		break;

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

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

686
	dma_params->fifo_level = fifo_level;
687 688
	dma_data->maxburst = fifo_level;

689
	davinci_config_channel_size(mcasp, word_length);
690 691 692 693 694 695 696

	return 0;
}

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

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

	default:
		ret = -EINVAL;
	}

	return ret;
}

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

724 725 726 727 728 729
	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);

730 731 732
	return 0;
}

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

742 743
#define DAVINCI_MCASP_RATES	SNDRV_PCM_RATE_8000_192000

744 745 746 747
#define DAVINCI_MCASP_PCM_FMTS (SNDRV_PCM_FMTBIT_S8 | \
				SNDRV_PCM_FMTBIT_U8 | \
				SNDRV_PCM_FMTBIT_S16_LE | \
				SNDRV_PCM_FMTBIT_U16_LE | \
748 749 750 751
				SNDRV_PCM_FMTBIT_S24_LE | \
				SNDRV_PCM_FMTBIT_U24_LE | \
				SNDRV_PCM_FMTBIT_S24_3LE | \
				SNDRV_PCM_FMTBIT_U24_3LE | \
752 753 754
				SNDRV_PCM_FMTBIT_S32_LE | \
				SNDRV_PCM_FMTBIT_U32_LE)

755
static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
756
	{
757
		.name		= "davinci-mcasp.0",
758 759
		.playback	= {
			.channels_min	= 2,
760
			.channels_max	= 32 * 16,
761
			.rates 		= DAVINCI_MCASP_RATES,
762
			.formats	= DAVINCI_MCASP_PCM_FMTS,
763 764 765
		},
		.capture 	= {
			.channels_min 	= 2,
766
			.channels_max	= 32 * 16,
767
			.rates 		= DAVINCI_MCASP_RATES,
768
			.formats	= DAVINCI_MCASP_PCM_FMTS,
769 770 771 772 773
		},
		.ops 		= &davinci_mcasp_dai_ops,

	},
	{
774
		.name		= "davinci-mcasp.1",
775 776 777 778
		.playback 	= {
			.channels_min	= 1,
			.channels_max	= 384,
			.rates		= DAVINCI_MCASP_RATES,
779
			.formats	= DAVINCI_MCASP_PCM_FMTS,
780 781 782 783 784 785
		},
		.ops 		= &davinci_mcasp_dai_ops,
	},

};

786 787 788 789
static const struct snd_soc_component_driver davinci_mcasp_component = {
	.name		= "davinci-mcasp",
};

790 791 792 793 794 795 796 797 798 799 800 801 802 803 804
/* 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,
};

805
static struct snd_platform_data am33xx_mcasp_pdata = {
806 807 808 809 810 811
	.tx_dma_offset = 0,
	.rx_dma_offset = 0,
	.asp_chan_q = EVENTQ_0,
	.version = MCASP_VERSION_3,
};

812 813 814 815 816 817 818
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,
};

819 820 821
static const struct of_device_id mcasp_dt_ids[] = {
	{
		.compatible = "ti,dm646x-mcasp-audio",
822
		.data = &dm646x_mcasp_pdata,
823 824 825
	},
	{
		.compatible = "ti,da830-mcasp-audio",
826
		.data = &da830_mcasp_pdata,
827
	},
828
	{
829
		.compatible = "ti,am33xx-mcasp-audio",
830
		.data = &am33xx_mcasp_pdata,
831
	},
832 833 834 835
	{
		.compatible = "ti,dra7-mcasp-audio",
		.data = &dra7_mcasp_pdata,
	},
836 837 838 839
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, mcasp_dt_ids);

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 867 868 869 870 871 872 873 874 875 876 877 878 879
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;
}

880 881 882 883 884 885
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 =
886
			of_match_device(mcasp_dt_ids, &pdev->dev);
887
	struct of_phandle_args dma_spec;
888 889 890 891 892 893 894 895 896

	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) {
897
		pdata = (struct snd_platform_data *) match->data;
898 899 900 901 902 903 904 905 906 907 908
	} 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);
909 910 911 912 913 914 915 916
	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;
		}

917
		pdata->tdm_slots = val;
918
	}
919 920 921 922

	of_serial_dir32 = of_get_property(np, "serial-dir", &val);
	val /= sizeof(u32);
	if (of_serial_dir32) {
923 924 925
		u8 *of_serial_dir = devm_kzalloc(&pdev->dev,
						 (sizeof(*of_serial_dir) * val),
						 GFP_KERNEL);
926 927 928 929 930
		if (!of_serial_dir) {
			ret = -ENOMEM;
			goto nodata;
		}

931
		for (i = 0; i < val; i++)
932 933
			of_serial_dir[i] = be32_to_cpup(&of_serial_dir32[i]);

934
		pdata->num_serializer = val;
935 936 937
		pdata->serial_dir = of_serial_dir;
	}

938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959
	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];

960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986
	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;
}

987 988 989
static int davinci_mcasp_probe(struct platform_device *pdev)
{
	struct davinci_pcm_dma_params *dma_data;
990
	struct resource *mem, *ioarea, *res, *dat;
991
	struct snd_platform_data *pdata;
992
	struct davinci_mcasp *mcasp;
993
	int ret;
994

995 996 997 998 999
	if (!pdev->dev.platform_data && !pdev->dev.of_node) {
		dev_err(&pdev->dev, "No platform data supplied\n");
		return -EINVAL;
	}

1000
	mcasp = devm_kzalloc(&pdev->dev, sizeof(struct davinci_mcasp),
1001
			   GFP_KERNEL);
1002
	if (!mcasp)
1003 1004
		return	-ENOMEM;

1005 1006 1007 1008 1009 1010
	pdata = davinci_mcasp_set_pdata_from_of(pdev);
	if (!pdata) {
		dev_err(&pdev->dev, "no platform data\n");
		return -EINVAL;
	}

1011
	mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
1012
	if (!mem) {
1013
		dev_warn(mcasp->dev,
1014 1015 1016 1017 1018 1019
			 "\"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;
		}
1020 1021
	}

1022
	ioarea = devm_request_mem_region(&pdev->dev, mem->start,
1023
			resource_size(mem), pdev->name);
1024 1025
	if (!ioarea) {
		dev_err(&pdev->dev, "Audio region already claimed\n");
1026
		return -EBUSY;
1027 1028
	}

1029
	pm_runtime_enable(&pdev->dev);
1030

1031 1032 1033 1034 1035
	ret = pm_runtime_get_sync(&pdev->dev);
	if (IS_ERR_VALUE(ret)) {
		dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n");
		return ret;
	}
1036

1037 1038
	mcasp->base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
	if (!mcasp->base) {
1039 1040 1041 1042 1043
		dev_err(&pdev->dev, "ioremap failed\n");
		ret = -ENOMEM;
		goto err_release_clk;
	}

1044 1045 1046 1047 1048 1049 1050
	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;
1051

1052
	mcasp->dev = &pdev->dev;
1053

1054
	dat = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
1055 1056
	if (dat)
		mcasp->dat_port = true;
1057

1058
	dma_data = &mcasp->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
1059 1060
	dma_data->asp_chan_q = pdata->asp_chan_q;
	dma_data->ram_chan_q = pdata->ram_chan_q;
1061
	dma_data->sram_pool = pdata->sram_pool;
1062
	dma_data->sram_size = pdata->sram_size_playback;
1063 1064 1065 1066
	if (dat)
		dma_data->dma_addr = dat->start;
	else
		dma_data->dma_addr = mem->start + pdata->tx_dma_offset;
1067

1068 1069 1070
	/* Unconditional dmaengine stuff */
	mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK].addr = dma_data->dma_addr;

1071
	res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
1072 1073 1074 1075
	if (res)
		dma_data->channel = res->start;
	else
		dma_data->channel = pdata->tx_dma_channel;
1076

1077
	dma_data = &mcasp->dma_params[SNDRV_PCM_STREAM_CAPTURE];
1078 1079
	dma_data->asp_chan_q = pdata->asp_chan_q;
	dma_data->ram_chan_q = pdata->ram_chan_q;
1080
	dma_data->sram_pool = pdata->sram_pool;
1081
	dma_data->sram_size = pdata->sram_size_capture;
1082 1083 1084 1085 1086
	if (dat)
		dma_data->dma_addr = dat->start;
	else
		dma_data->dma_addr = mem->start + pdata->rx_dma_offset;

1087 1088 1089
	/* Unconditional dmaengine stuff */
	mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE].addr = dma_data->dma_addr;

1090 1091 1092 1093 1094 1095 1096
	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;
	}
1097 1098

	res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
1099 1100 1101 1102
	if (res)
		dma_data->channel = res->start;
	else
		dma_data->channel = pdata->rx_dma_channel;
1103

1104 1105 1106 1107
	/* Unconditional dmaengine stuff */
	mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK].filter_data = "tx";
	mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE].filter_data = "rx";

1108
	dev_set_drvdata(&pdev->dev, mcasp);
1109 1110 1111

	mcasp_reparent_fck(pdev);

1112 1113
	ret = snd_soc_register_component(&pdev->dev, &davinci_mcasp_component,
					 &davinci_mcasp_dai[pdata->op_mode], 1);
1114 1115

	if (ret != 0)
1116
		goto err_release_clk;
1117

1118 1119 1120 1121 1122 1123
	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;
		}
1124 1125
	}

1126 1127
	return 0;

1128 1129
err_unregister_component:
	snd_soc_unregister_component(&pdev->dev);
1130
err_release_clk:
1131 1132
	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
1133 1134 1135 1136 1137
	return ret;
}

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

1140
	snd_soc_unregister_component(&pdev->dev);
1141 1142
	if (mcasp->version != MCASP_VERSION_4)
		davinci_soc_platform_unregister(&pdev->dev);
1143 1144 1145

	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
1146 1147 1148 1149

	return 0;
}

1150 1151 1152
#ifdef CONFIG_PM_SLEEP
static int davinci_mcasp_suspend(struct device *dev)
{
1153
	struct davinci_mcasp *mcasp = dev_get_drvdata(dev);
1154

1155 1156 1157 1158 1159 1160 1161
	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);
1162 1163 1164 1165 1166 1167

	return 0;
}

static int davinci_mcasp_resume(struct device *dev)
{
1168
	struct davinci_mcasp *mcasp = dev_get_drvdata(dev);
1169 1170 1171 1172 1173 1174 1175 1176

	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);
1177 1178 1179 1180 1181 1182 1183 1184 1185

	return 0;
}
#endif

SIMPLE_DEV_PM_OPS(davinci_mcasp_pm_ops,
		  davinci_mcasp_suspend,
		  davinci_mcasp_resume);

1186 1187 1188 1189 1190 1191
static struct platform_driver davinci_mcasp_driver = {
	.probe		= davinci_mcasp_probe,
	.remove		= davinci_mcasp_remove,
	.driver		= {
		.name	= "davinci-mcasp",
		.owner	= THIS_MODULE,
1192
		.pm	= &davinci_mcasp_pm_ops,
1193
		.of_match_table = mcasp_dt_ids,
1194 1195 1196
	},
};

1197
module_platform_driver(davinci_mcasp_driver);
1198 1199 1200 1201

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