davinci-mcasp.c 30.4 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/pm_runtime.h>
25 26 27
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/of_device.h>
28 29 30 31 32 33 34 35 36 37

#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/initval.h>
#include <sound/soc.h>

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

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

	/* McASP specific data */
	int	tdm_slots;
	u8	op_mode;
	u8	num_serializer;
	u8	*serial_dir;
	u8	version;
	u16	bclk_lrclk_ratio;
51
	int	streams;
52 53 54 55 56

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

57 58
	bool	dat_port;

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

72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
static inline void mcasp_set_bits(void __iomem *reg, u32 val)
{
	__raw_writel(__raw_readl(reg) | val, reg);
}

static inline void mcasp_clr_bits(void __iomem *reg, u32 val)
{
	__raw_writel((__raw_readl(reg) & ~(val)), reg);
}

static inline void mcasp_mod_bits(void __iomem *reg, u32 val, u32 mask)
{
	__raw_writel((__raw_readl(reg) & ~mask) | val, reg);
}

static inline void mcasp_set_reg(void __iomem *reg, u32 val)
{
	__raw_writel(val, reg);
}

static inline u32 mcasp_get_reg(void __iomem *reg)
{
	return (unsigned int)__raw_readl(reg);
}

97
static void mcasp_set_ctl_reg(void __iomem *regs, u32 val)
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
{
	int i = 0;

	mcasp_set_bits(regs, val);

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

	if (i == 1000 && ((mcasp_get_reg(regs) & val) != val))
		printk(KERN_ERR "GBLCTL write error\n");
}

114 115 116 117 118 119 120 121
static bool mcasp_is_synchronous(struct davinci_mcasp *mcasp)
{
	u32 rxfmctl = mcasp_get_reg(mcasp->base + DAVINCI_MCASP_RXFMCTL_REG);
	u32 aclkxctl = mcasp_get_reg(mcasp->base + DAVINCI_MCASP_ACLKXCTL_REG);

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

122
static void mcasp_start_rx(struct davinci_mcasp *mcasp)
123
{
124 125
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXHCLKRST);
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXCLKRST);
126 127 128 129 130 131 132 133 134 135 136 137 138

	/*
	 * 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)) {
		mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG,
				  TXHCLKRST);
		mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG,
				  TXCLKRST);
	}

139 140
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXSERCLR);
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_RXBUF_REG, 0);
141

142 143 144
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_RXBUF_REG, 0);
145

146 147
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
148 149 150 151

	if (mcasp_is_synchronous(mcasp))
		mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG,
				  TXFSRST);
152 153
}

154
static void mcasp_start_tx(struct davinci_mcasp *mcasp)
155
{
156 157 158
	u8 offset = 0, i;
	u32 cnt;

159 160 161 162
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG, TXHCLKRST);
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG, TXCLKRST);
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG, TXSERCLR);
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXBUF_REG, 0);
163

164 165 166 167 168
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG, TXSMRST);
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG, TXFSRST);
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXBUF_REG, 0);
	for (i = 0; i < mcasp->num_serializer; i++) {
		if (mcasp->serial_dir[i] == TX_MODE) {
169 170 171 172 173 174 175
			offset = i;
			break;
		}
	}

	/* wait for TX ready */
	cnt = 0;
176
	while (!(mcasp_get_reg(mcasp->base + DAVINCI_MCASP_XRSRCTL_REG(offset)) &
177 178 179
		 TXSTATE) && (cnt < 100000))
		cnt++;

180
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXBUF_REG, 0);
181 182
}

183
static void davinci_mcasp_start(struct davinci_mcasp *mcasp, int stream)
184
{
185 186
	u32 reg;

187 188
	mcasp->streams++;

189
	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
190
		if (mcasp->txnumevt) {	/* enable FIFO */
191 192 193
			reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
			mcasp_clr_bits(mcasp->base + reg, FIFO_ENABLE);
			mcasp_set_bits(mcasp->base + reg, FIFO_ENABLE);
194
		}
195
		mcasp_start_tx(mcasp);
196
	} else {
197
		if (mcasp->rxnumevt) {	/* enable FIFO */
198 199 200
			reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
			mcasp_clr_bits(mcasp->base + reg, FIFO_ENABLE);
			mcasp_set_bits(mcasp->base + reg, FIFO_ENABLE);
201
		}
202
		mcasp_start_rx(mcasp);
203
	}
204 205
}

206
static void mcasp_stop_rx(struct davinci_mcasp *mcasp)
207
{
208 209 210 211 212 213 214
	/*
	 * In synchronous mode stop the TX clocks if no other stream is
	 * running
	 */
	if (mcasp_is_synchronous(mcasp) && !mcasp->streams)
		mcasp_set_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG, 0);

215 216
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, 0);
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
217 218
}

219
static void mcasp_stop_tx(struct davinci_mcasp *mcasp)
220
{
221 222 223 224 225 226 227 228 229 230
	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;

	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG, val);
231
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
232 233
}

234
static void davinci_mcasp_stop(struct davinci_mcasp *mcasp, int stream)
235
{
236 237
	u32 reg;

238 239
	mcasp->streams--;

240
	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
241
		if (mcasp->txnumevt) {	/* disable FIFO */
242 243
			reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
			mcasp_clr_bits(mcasp->base + reg, FIFO_ENABLE);
244
		}
245
		mcasp_stop_tx(mcasp);
246
	} else {
247
		if (mcasp->rxnumevt) {	/* disable FIFO */
248 249
			reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
			mcasp_clr_bits(mcasp->base + reg, FIFO_ENABLE);
250
		}
251
		mcasp_stop_rx(mcasp);
252
	}
253 254 255 256 257
}

static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
					 unsigned int fmt)
{
258 259
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
	void __iomem *base = mcasp->base;
260

261 262 263
	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
	case SND_SOC_DAIFMT_DSP_B:
	case SND_SOC_DAIFMT_AC97:
264 265
		mcasp_clr_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
		mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
266 267 268
		break;
	default:
		/* configure a full-word SYNC pulse (LRCLK) */
269 270
		mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
		mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
271 272

		/* make 1st data bit occur one ACLK cycle after the frame sync */
273 274
		mcasp_set_bits(base + DAVINCI_MCASP_TXFMT_REG, FSXDLY(1));
		mcasp_set_bits(base + DAVINCI_MCASP_RXFMT_REG, FSRDLY(1));
275 276 277
		break;
	}

278 279 280 281 282 283 284 285 286
	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
	case SND_SOC_DAIFMT_CBS_CFS:
		/* codec is clock and frame slave */
		mcasp_set_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
		mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, AFSXE);

		mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
		mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE);

287 288 289 290
		mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG,
				ACLKX | ACLKR);
		mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG,
				AFSX | AFSR);
291
		break;
292 293
	case SND_SOC_DAIFMT_CBM_CFS:
		/* codec is clock master and frame slave */
294
		mcasp_clr_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
295 296
		mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, AFSXE);

297
		mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
298 299
		mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE);

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

		mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
		mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE);

313 314
		mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG,
				ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR);
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
		break;

	default:
		return -EINVAL;
	}

	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
	case SND_SOC_DAIFMT_IB_NF:
		mcasp_clr_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
		mcasp_clr_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);

		mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
		mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
		break;

	case SND_SOC_DAIFMT_NB_IF:
		mcasp_set_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
		mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);

		mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
		mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
		break;

	case SND_SOC_DAIFMT_IB_IF:
		mcasp_clr_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
		mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);

		mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
		mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
		break;

	case SND_SOC_DAIFMT_NB_NF:
		mcasp_set_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
		mcasp_clr_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);

350
		mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
351 352 353 354 355 356 357 358 359 360
		mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
		break;

	default:
		return -EINVAL;
	}

	return 0;
}

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

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

	case 1:		/* BCLK divider */
374
		mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_ACLKXCTL_REG,
375
			       ACLKXDIV(div - 1), ACLKXDIV_MASK);
376
		mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_ACLKRCTL_REG,
377 378 379
			       ACLKRDIV(div - 1), ACLKRDIV_MASK);
		break;

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

384 385 386 387 388 389 390
	default:
		return -EINVAL;
	}

	return 0;
}

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

	if (dir == SND_SOC_CLOCK_OUT) {
397 398 399
		mcasp_set_bits(mcasp->base + DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE);
		mcasp_set_bits(mcasp->base + DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE);
		mcasp_set_bits(mcasp->base + DAVINCI_MCASP_PDIR_REG, AHCLKX);
400
	} else {
401 402 403
		mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE);
		mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE);
		mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_PDIR_REG, AHCLKX);
404 405 406 407 408
	}

	return 0;
}

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

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

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

432 433
	if (mcasp->op_mode != DAVINCI_MCASP_DIT_MODE) {
		mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_RXFMT_REG,
434
				RXSSZ(fmt), RXSSZ(0x0F));
435
		mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_TXFMT_REG,
436
				TXSSZ(fmt), TXSSZ(0x0F));
437
		mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_TXFMT_REG,
D
Daniel Mack 已提交
438
				TXROT(tx_rotate), TXROT(7));
439
		mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_RXFMT_REG,
D
Daniel Mack 已提交
440
				RXROT(rx_rotate), RXROT(7));
441
		mcasp_set_reg(mcasp->base + DAVINCI_MCASP_RXMASK_REG,
442 443 444
				mask);
	}

445
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXMASK_REG, mask);
446

447 448 449
	return 0;
}

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

	/* All PINS as McASP */
464
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_PFUNC_REG, 0x00000000);
465 466

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

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

495 496 497 498 499 500
	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
		ser = tx_ser;
	else
		ser = rx_ser;

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

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

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

516 517 518
	if (mcasp->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) {
		if (mcasp->rxnumevt * rx_ser > 64)
			mcasp->rxnumevt = 1;
519 520 521 522 523

		reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
		mcasp_mod_bits(mcasp->base + reg, rx_ser, NUMDMA_MASK);
		mcasp_mod_bits(mcasp->base + reg,
			       ((mcasp->rxnumevt * rx_ser) << 8), NUMEVT_MASK);
524
	}
525 526

	return 0;
527 528
}

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

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

539
	mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC);
540

541 542 543
	if (!mcasp->dat_port)
		busel = TXSEL;

544 545 546
	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
		/* bit stream is MSB first  with no delay */
		/* DSP_B mode */
547
		mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXTDM_REG, mask);
548 549
		mcasp_set_bits(mcasp->base + DAVINCI_MCASP_TXFMT_REG,
			       busel | TXORD);
550

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

564 565 566
		if ((mcasp->tdm_slots >= 2) && (mcasp->tdm_slots <= 32))
			mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_RXFMCTL_REG,
					FSRMOD(mcasp->tdm_slots), FSRMOD(0x1FF));
567 568
		else
			printk(KERN_ERR "capture tdm slot %d not supported\n",
569
				mcasp->tdm_slots);
570 571 572 573
	}
}

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

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

	/* Set the TX tdm : for all the slots */
586
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXTDM_REG, 0xFFFFFFFF);
587 588

	/* Set the TX clock controls : div = 1 and internal */
589
	mcasp_set_bits(mcasp->base + DAVINCI_MCASP_ACLKXCTL_REG,
590 591
						ACLKXE | TX_ASYNC);

592
	mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
593 594

	/* Only 44100 and 48000 are valid, both have the same setting */
595
	mcasp_set_bits(mcasp->base + DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXDIV(3));
596 597

	/* Enable the DIT */
598
	mcasp_set_bits(mcasp->base + DAVINCI_MCASP_TXDITCTL_REG, DITEN);
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
	int word_length;
609
	u8 fifo_level;
610
	u8 slots = mcasp->tdm_slots;
611
	u8 active_serializers;
612 613 614 615
	int channels;
	struct snd_interval *pcm_channels = hw_param_interval(params,
					SNDRV_PCM_HW_PARAM_CHANNELS);
	channels = pcm_channels->min;
616

617 618
	active_serializers = (channels + slots - 1) / slots;

619
	if (davinci_hw_common_param(mcasp, substream->stream, channels) == -EINVAL)
620
		return -EINVAL;
621
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
622
		fifo_level = mcasp->txnumevt * active_serializers;
623
	else
624
		fifo_level = mcasp->rxnumevt * active_serializers;
625

626 627
	if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE)
		davinci_hw_dit_param(mcasp);
628
	else
629
		davinci_hw_param(mcasp, substream->stream);
630 631

	switch (params_format(params)) {
632
	case SNDRV_PCM_FORMAT_U8:
633 634
	case SNDRV_PCM_FORMAT_S8:
		dma_params->data_type = 1;
635
		word_length = 8;
636 637
		break;

638
	case SNDRV_PCM_FORMAT_U16_LE:
639 640
	case SNDRV_PCM_FORMAT_S16_LE:
		dma_params->data_type = 2;
641
		word_length = 16;
642 643
		break;

644 645 646
	case SNDRV_PCM_FORMAT_U24_3LE:
	case SNDRV_PCM_FORMAT_S24_3LE:
		dma_params->data_type = 3;
647
		word_length = 24;
648 649
		break;

650 651
	case SNDRV_PCM_FORMAT_U24_LE:
	case SNDRV_PCM_FORMAT_S24_LE:
652
	case SNDRV_PCM_FORMAT_U32_LE:
653 654
	case SNDRV_PCM_FORMAT_S32_LE:
		dma_params->data_type = 4;
655
		word_length = 32;
656 657 658 659 660 661
		break;

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

663
	if (mcasp->version == MCASP_VERSION_2 && !fifo_level)
664 665
		dma_params->acnt = 4;
	else
666 667
		dma_params->acnt = dma_params->data_type;

668
	dma_params->fifo_level = fifo_level;
669
	davinci_config_channel_size(mcasp, word_length);
670 671 672 673 674 675 676

	return 0;
}

static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
				     int cmd, struct snd_soc_dai *cpu_dai)
{
677
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
678 679 680 681
	int ret = 0;

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

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

	case SNDRV_PCM_TRIGGER_STOP:
698
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
699
		davinci_mcasp_stop(mcasp, substream->stream);
700 701 702 703 704 705 706 707 708
		break;

	default:
		ret = -EINVAL;
	}

	return ret;
}

709 710 711
static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
				 struct snd_soc_dai *dai)
{
712
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
713

714
	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 790 791 792 793 794 795 796
/* 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,
};

static struct snd_platform_data omap2_mcasp_pdata = {
	.tx_dma_offset = 0,
	.rx_dma_offset = 0,
	.asp_chan_q = EVENTQ_0,
	.version = MCASP_VERSION_3,
};

797 798 799
static const struct of_device_id mcasp_dt_ids[] = {
	{
		.compatible = "ti,dm646x-mcasp-audio",
800
		.data = &dm646x_mcasp_pdata,
801 802 803
	},
	{
		.compatible = "ti,da830-mcasp-audio",
804
		.data = &da830_mcasp_pdata,
805
	},
806
	{
807
		.compatible = "ti,am33xx-mcasp-audio",
808
		.data = &omap2_mcasp_pdata,
809
	},
810 811 812 813 814 815 816 817 818 819
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, mcasp_dt_ids);

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 =
820
			of_match_device(mcasp_dt_ids, &pdev->dev);
821
	struct of_phandle_args dma_spec;
822 823 824 825 826 827 828 829 830

	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) {
831
		pdata = (struct snd_platform_data *) match->data;
832 833 834 835 836 837 838 839 840 841 842
	} 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);
843 844 845 846 847 848 849 850
	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;
		}

851
		pdata->tdm_slots = val;
852
	}
853 854 855 856

	of_serial_dir32 = of_get_property(np, "serial-dir", &val);
	val /= sizeof(u32);
	if (of_serial_dir32) {
857 858 859
		u8 *of_serial_dir = devm_kzalloc(&pdev->dev,
						 (sizeof(*of_serial_dir) * val),
						 GFP_KERNEL);
860 861 862 863 864
		if (!of_serial_dir) {
			ret = -ENOMEM;
			goto nodata;
		}

865
		for (i = 0; i < val; i++)
866 867
			of_serial_dir[i] = be32_to_cpup(&of_serial_dir32[i]);

868
		pdata->num_serializer = val;
869 870 871
		pdata->serial_dir = of_serial_dir;
	}

872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893
	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];

894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920
	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;
}

921 922 923
static int davinci_mcasp_probe(struct platform_device *pdev)
{
	struct davinci_pcm_dma_params *dma_data;
924
	struct resource *mem, *ioarea, *res, *dat;
925
	struct snd_platform_data *pdata;
926
	struct davinci_mcasp *mcasp;
927
	int ret;
928

929 930 931 932 933
	if (!pdev->dev.platform_data && !pdev->dev.of_node) {
		dev_err(&pdev->dev, "No platform data supplied\n");
		return -EINVAL;
	}

934
	mcasp = devm_kzalloc(&pdev->dev, sizeof(struct davinci_mcasp),
935
			   GFP_KERNEL);
936
	if (!mcasp)
937 938
		return	-ENOMEM;

939 940 941 942 943 944
	pdata = davinci_mcasp_set_pdata_from_of(pdev);
	if (!pdata) {
		dev_err(&pdev->dev, "no platform data\n");
		return -EINVAL;
	}

945
	mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
946
	if (!mem) {
947
		dev_warn(mcasp->dev,
948 949 950 951 952 953
			 "\"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;
		}
954 955
	}

956
	ioarea = devm_request_mem_region(&pdev->dev, mem->start,
957
			resource_size(mem), pdev->name);
958 959
	if (!ioarea) {
		dev_err(&pdev->dev, "Audio region already claimed\n");
960
		return -EBUSY;
961 962
	}

963
	pm_runtime_enable(&pdev->dev);
964

965 966 967 968 969
	ret = pm_runtime_get_sync(&pdev->dev);
	if (IS_ERR_VALUE(ret)) {
		dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n");
		return ret;
	}
970

971 972
	mcasp->base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
	if (!mcasp->base) {
973 974 975 976 977
		dev_err(&pdev->dev, "ioremap failed\n");
		ret = -ENOMEM;
		goto err_release_clk;
	}

978 979 980 981 982 983 984
	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;
985

986
	mcasp->dev = &pdev->dev;
987

988
	dat = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
989 990
	if (dat)
		mcasp->dat_port = true;
991

992
	dma_data = &mcasp->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
993 994
	dma_data->asp_chan_q = pdata->asp_chan_q;
	dma_data->ram_chan_q = pdata->ram_chan_q;
995
	dma_data->sram_pool = pdata->sram_pool;
996
	dma_data->sram_size = pdata->sram_size_playback;
997 998 999 1000
	if (dat)
		dma_data->dma_addr = dat->start;
	else
		dma_data->dma_addr = mem->start + pdata->tx_dma_offset;
1001 1002

	res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
1003 1004 1005 1006
	if (res)
		dma_data->channel = res->start;
	else
		dma_data->channel = pdata->tx_dma_channel;
1007

1008
	dma_data = &mcasp->dma_params[SNDRV_PCM_STREAM_CAPTURE];
1009 1010
	dma_data->asp_chan_q = pdata->asp_chan_q;
	dma_data->ram_chan_q = pdata->ram_chan_q;
1011
	dma_data->sram_pool = pdata->sram_pool;
1012
	dma_data->sram_size = pdata->sram_size_capture;
1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024
	if (dat)
		dma_data->dma_addr = dat->start;
	else
		dma_data->dma_addr = mem->start + pdata->rx_dma_offset;

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

	res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
1027 1028 1029 1030
	if (res)
		dma_data->channel = res->start;
	else
		dma_data->channel = pdata->rx_dma_channel;
1031

1032
	dev_set_drvdata(&pdev->dev, mcasp);
1033 1034
	ret = snd_soc_register_component(&pdev->dev, &davinci_mcasp_component,
					 &davinci_mcasp_dai[pdata->op_mode], 1);
1035 1036

	if (ret != 0)
1037
		goto err_release_clk;
1038 1039 1040 1041

	ret = davinci_soc_platform_register(&pdev->dev);
	if (ret) {
		dev_err(&pdev->dev, "register PCM failed: %d\n", ret);
1042
		goto err_unregister_component;
1043 1044
	}

1045 1046
	return 0;

1047 1048
err_unregister_component:
	snd_soc_unregister_component(&pdev->dev);
1049
err_release_clk:
1050 1051
	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
1052 1053 1054 1055 1056 1057
	return ret;
}

static int davinci_mcasp_remove(struct platform_device *pdev)
{

1058
	snd_soc_unregister_component(&pdev->dev);
1059
	davinci_soc_platform_unregister(&pdev->dev);
1060 1061 1062

	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
1063 1064 1065 1066

	return 0;
}

1067 1068 1069
#ifdef CONFIG_PM_SLEEP
static int davinci_mcasp_suspend(struct device *dev)
{
1070 1071
	struct davinci_mcasp *mcasp = dev_get_drvdata(dev);
	void __iomem *base = mcasp->base;
1072

1073 1074 1075 1076 1077 1078 1079
	mcasp->context.txfmtctl = mcasp_get_reg(base + DAVINCI_MCASP_TXFMCTL_REG);
	mcasp->context.rxfmtctl = mcasp_get_reg(base + DAVINCI_MCASP_RXFMCTL_REG);
	mcasp->context.txfmt = mcasp_get_reg(base + DAVINCI_MCASP_TXFMT_REG);
	mcasp->context.rxfmt = mcasp_get_reg(base + DAVINCI_MCASP_RXFMT_REG);
	mcasp->context.aclkxctl = mcasp_get_reg(base + DAVINCI_MCASP_ACLKXCTL_REG);
	mcasp->context.aclkrctl = mcasp_get_reg(base + DAVINCI_MCASP_ACLKRCTL_REG);
	mcasp->context.pdir = mcasp_get_reg(base + DAVINCI_MCASP_PDIR_REG);
1080 1081 1082 1083 1084 1085

	return 0;
}

static int davinci_mcasp_resume(struct device *dev)
{
1086 1087 1088 1089 1090 1091 1092 1093 1094 1095
	struct davinci_mcasp *mcasp = dev_get_drvdata(dev);
	void __iomem *base = mcasp->base;

	mcasp_set_reg(base + DAVINCI_MCASP_TXFMCTL_REG, mcasp->context.txfmtctl);
	mcasp_set_reg(base + DAVINCI_MCASP_RXFMCTL_REG, mcasp->context.rxfmtctl);
	mcasp_set_reg(base + DAVINCI_MCASP_TXFMT_REG, mcasp->context.txfmt);
	mcasp_set_reg(base + DAVINCI_MCASP_RXFMT_REG, mcasp->context.rxfmt);
	mcasp_set_reg(base + DAVINCI_MCASP_ACLKXCTL_REG, mcasp->context.aclkxctl);
	mcasp_set_reg(base + DAVINCI_MCASP_ACLKRCTL_REG, mcasp->context.aclkrctl);
	mcasp_set_reg(base + DAVINCI_MCASP_PDIR_REG, mcasp->context.pdir);
1096 1097 1098 1099 1100 1101 1102 1103 1104

	return 0;
}
#endif

SIMPLE_DEV_PM_OPS(davinci_mcasp_pm_ops,
		  davinci_mcasp_suspend,
		  davinci_mcasp_resume);

1105 1106 1107 1108 1109 1110
static struct platform_driver davinci_mcasp_driver = {
	.probe		= davinci_mcasp_probe,
	.remove		= davinci_mcasp_remove,
	.driver		= {
		.name	= "davinci-mcasp",
		.owner	= THIS_MODULE,
1111
		.pm	= &davinci_mcasp_pm_ops,
1112
		.of_match_table = mcasp_dt_ids,
1113 1114 1115
	},
};

1116
module_platform_driver(davinci_mcasp_driver);
1117 1118 1119 1120

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