davinci-mcasp.c 29.9 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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
	struct davinci_pcm_dma_params dma_params[2];
	void __iomem *base;
	struct device *dev;

	/* McASP specific data */
	int	tdm_slots;
	u8	op_mode;
	u8	num_serializer;
	u8	*serial_dir;
	u8	version;
	u16	bclk_lrclk_ratio;

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

#ifdef CONFIG_PM_SLEEP
	struct {
		u32	txfmtctl;
		u32	rxfmtctl;
		u32	txfmt;
		u32	rxfmt;
		u32	aclkxctl;
		u32	aclkrctl;
		u32	pdir;
	} context;
#endif
};

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
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);
}

93
static void mcasp_set_ctl_reg(void __iomem *regs, u32 val)
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
{
	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");
}

110
static void mcasp_start_rx(struct davinci_mcasp *mcasp)
111
{
112 113 114 115
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXHCLKRST);
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXCLKRST);
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXSERCLR);
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_RXBUF_REG, 0);
116

117 118 119
	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);
120

121 122
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXSMRST);
	mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, RXFSRST);
123 124
}

125
static void mcasp_start_tx(struct davinci_mcasp *mcasp)
126
{
127 128 129
	u8 offset = 0, i;
	u32 cnt;

130 131 132 133
	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);
134

135 136 137 138 139
	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) {
140 141 142 143 144 145 146
			offset = i;
			break;
		}
	}

	/* wait for TX ready */
	cnt = 0;
147
	while (!(mcasp_get_reg(mcasp->base + DAVINCI_MCASP_XRSRCTL_REG(offset)) &
148 149 150
		 TXSTATE) && (cnt < 100000))
		cnt++;

151
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXBUF_REG, 0);
152 153
}

154
static void davinci_mcasp_start(struct davinci_mcasp *mcasp, int stream)
155
{
156
	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
157 158
		if (mcasp->txnumevt) {	/* enable FIFO */
			switch (mcasp->version) {
159
			case MCASP_VERSION_3:
160 161 162 163
				mcasp_clr_bits(mcasp->base + MCASP_VER3_WFIFOCTL,
					       FIFO_ENABLE);
				mcasp_set_bits(mcasp->base + MCASP_VER3_WFIFOCTL,
					       FIFO_ENABLE);
164 165
				break;
			default:
166
				mcasp_clr_bits(mcasp->base +
167
					DAVINCI_MCASP_WFIFOCTL,	FIFO_ENABLE);
168
				mcasp_set_bits(mcasp->base +
169 170
					DAVINCI_MCASP_WFIFOCTL,	FIFO_ENABLE);
			}
171
		}
172
		mcasp_start_tx(mcasp);
173
	} else {
174 175
		if (mcasp->rxnumevt) {	/* enable FIFO */
			switch (mcasp->version) {
176
			case MCASP_VERSION_3:
177 178 179 180
				mcasp_clr_bits(mcasp->base + MCASP_VER3_RFIFOCTL,
					       FIFO_ENABLE);
				mcasp_set_bits(mcasp->base + MCASP_VER3_RFIFOCTL,
					       FIFO_ENABLE);
181 182
				break;
			default:
183
				mcasp_clr_bits(mcasp->base +
184
					DAVINCI_MCASP_RFIFOCTL,	FIFO_ENABLE);
185
				mcasp_set_bits(mcasp->base +
186 187
					DAVINCI_MCASP_RFIFOCTL,	FIFO_ENABLE);
			}
188
		}
189
		mcasp_start_rx(mcasp);
190
	}
191 192
}

193
static void mcasp_stop_rx(struct davinci_mcasp *mcasp)
194
{
195 196
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_GBLCTLR_REG, 0);
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
197 198
}

199
static void mcasp_stop_tx(struct davinci_mcasp *mcasp)
200
{
201 202
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG, 0);
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
203 204
}

205
static void davinci_mcasp_stop(struct davinci_mcasp *mcasp, int stream)
206
{
207
	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
208 209
		if (mcasp->txnumevt) {	/* disable FIFO */
			switch (mcasp->version) {
210
			case MCASP_VERSION_3:
211 212
				mcasp_clr_bits(mcasp->base + MCASP_VER3_WFIFOCTL,
					       FIFO_ENABLE);
213 214
				break;
			default:
215
				mcasp_clr_bits(mcasp->base +
216 217 218
					DAVINCI_MCASP_WFIFOCTL,	FIFO_ENABLE);
			}
		}
219
		mcasp_stop_tx(mcasp);
220
	} else {
221 222
		if (mcasp->rxnumevt) {	/* disable FIFO */
			switch (mcasp->version) {
223
			case MCASP_VERSION_3:
224 225
				mcasp_clr_bits(mcasp->base + MCASP_VER3_RFIFOCTL,
					       FIFO_ENABLE);
226 227 228
			break;

			default:
229
				mcasp_clr_bits(mcasp->base +
230 231 232
					DAVINCI_MCASP_RFIFOCTL,	FIFO_ENABLE);
			}
		}
233
		mcasp_stop_rx(mcasp);
234
	}
235 236 237 238 239
}

static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
					 unsigned int fmt)
{
240 241
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
	void __iomem *base = mcasp->base;
242

243 244 245
	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
	case SND_SOC_DAIFMT_DSP_B:
	case SND_SOC_DAIFMT_AC97:
246 247
		mcasp_clr_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
		mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
248 249 250
		break;
	default:
		/* configure a full-word SYNC pulse (LRCLK) */
251 252
		mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
		mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
253 254

		/* make 1st data bit occur one ACLK cycle after the frame sync */
255 256
		mcasp_set_bits(base + DAVINCI_MCASP_TXFMT_REG, FSXDLY(1));
		mcasp_set_bits(base + DAVINCI_MCASP_RXFMT_REG, FSRDLY(1));
257 258 259
		break;
	}

260 261 262 263 264 265 266 267 268
	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);

269 270 271 272
		mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG,
				ACLKX | ACLKR);
		mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG,
				AFSX | AFSR);
273
		break;
274 275
	case SND_SOC_DAIFMT_CBM_CFS:
		/* codec is clock master and frame slave */
276
		mcasp_clr_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
277 278
		mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, AFSXE);

279
		mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
280 281
		mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE);

282 283
		mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG,
				ACLKX | ACLKR);
284
		mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG,
285
				AFSX | AFSR);
286
		break;
287 288 289 290 291 292 293 294
	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);

295 296
		mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG,
				ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR);
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331
		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);

332
		mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
333 334 335 336 337 338 339 340 341 342
		mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
		break;

	default:
		return -EINVAL;
	}

	return 0;
}

343 344
static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div)
{
345
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
346 347 348

	switch (div_id) {
	case 0:		/* MCLK divider */
349
		mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_AHCLKXCTL_REG,
350
			       AHCLKXDIV(div - 1), AHCLKXDIV_MASK);
351
		mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_AHCLKRCTL_REG,
352 353 354 355
			       AHCLKRDIV(div - 1), AHCLKRDIV_MASK);
		break;

	case 1:		/* BCLK divider */
356
		mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_ACLKXCTL_REG,
357
			       ACLKXDIV(div - 1), ACLKXDIV_MASK);
358
		mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_ACLKRCTL_REG,
359 360 361
			       ACLKRDIV(div - 1), ACLKRDIV_MASK);
		break;

362
	case 2:		/* BCLK/LRCLK ratio */
363
		mcasp->bclk_lrclk_ratio = div;
364 365
		break;

366 367 368 369 370 371 372
	default:
		return -EINVAL;
	}

	return 0;
}

373 374 375
static int davinci_mcasp_set_sysclk(struct snd_soc_dai *dai, int clk_id,
				    unsigned int freq, int dir)
{
376
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
377 378

	if (dir == SND_SOC_CLOCK_OUT) {
379 380 381
		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);
382
	} else {
383 384 385
		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);
386 387 388 389 390
	}

	return 0;
}

391
static int davinci_config_channel_size(struct davinci_mcasp *mcasp,
392
				       int word_length)
393
{
394
	u32 fmt;
D
Daniel Mack 已提交
395 396
	u32 tx_rotate = (word_length / 4) & 0x7;
	u32 rx_rotate = (32 - word_length) / 4;
397
	u32 mask = (1ULL << word_length) - 1;
398

399 400 401 402 403
	/*
	 * 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.
404 405 406
	 * 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).
407
	 */
408 409
	if (mcasp->bclk_lrclk_ratio)
		word_length = mcasp->bclk_lrclk_ratio / mcasp->tdm_slots;
410

411 412
	/* mapping of the XSSZ bit-field as described in the datasheet */
	fmt = (word_length >> 1) - 1;
413

414 415
	if (mcasp->op_mode != DAVINCI_MCASP_DIT_MODE) {
		mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_RXFMT_REG,
416
				RXSSZ(fmt), RXSSZ(0x0F));
417
		mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_TXFMT_REG,
418
				TXSSZ(fmt), TXSSZ(0x0F));
419
		mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_TXFMT_REG,
D
Daniel Mack 已提交
420
				TXROT(tx_rotate), TXROT(7));
421
		mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_RXFMT_REG,
D
Daniel Mack 已提交
422
				RXROT(rx_rotate), RXROT(7));
423
		mcasp_set_reg(mcasp->base + DAVINCI_MCASP_RXMASK_REG,
424 425 426
				mask);
	}

427
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXMASK_REG, mask);
428

429 430 431
	return 0;
}

432
static int davinci_hw_common_param(struct davinci_mcasp *mcasp, int stream,
433
				    int channels)
434 435
{
	int i;
436 437
	u8 tx_ser = 0;
	u8 rx_ser = 0;
438
	u8 ser;
439
	u8 slots = mcasp->tdm_slots;
440
	u8 max_active_serializers = (channels + slots - 1) / slots;
441
	/* Default configuration */
442
	mcasp_set_bits(mcasp->base + DAVINCI_MCASP_PWREMUMGT_REG, MCASP_SOFT);
443 444

	/* All PINS as McASP */
445
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_PFUNC_REG, 0x00000000);
446 447

	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
448 449
		mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
		mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_XEVTCTL_REG,
450 451
				TXDATADMADIS);
	} else {
452 453
		mcasp_set_reg(mcasp->base + DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
		mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_REVTCTL_REG,
454 455 456
				RXDATADMADIS);
	}

457 458 459 460
	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 &&
461
					tx_ser < max_active_serializers) {
462
			mcasp_set_bits(mcasp->base + DAVINCI_MCASP_PDIR_REG,
463
					AXR(i));
464
			tx_ser++;
465
		} else if (mcasp->serial_dir[i] == RX_MODE &&
466
					rx_ser < max_active_serializers) {
467
			mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_PDIR_REG,
468
					AXR(i));
469
			rx_ser++;
470
		} else {
471
			mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_XRSRCTL_REG(i),
472
					SRMOD_INACTIVE, SRMOD_MASK);
473 474 475
		}
	}

476 477 478 479 480 481
	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
		ser = tx_ser;
	else
		ser = rx_ser;

	if (ser < max_active_serializers) {
482
		dev_warn(mcasp->dev, "stream has more channels (%d) than are "
483 484 485 486
			"enabled in mcasp (%d)\n", channels, ser * slots);
		return -EINVAL;
	}

487 488 489
	if (mcasp->txnumevt && stream == SNDRV_PCM_STREAM_PLAYBACK) {
		if (mcasp->txnumevt * tx_ser > 64)
			mcasp->txnumevt = 1;
490

491
		switch (mcasp->version) {
492
		case MCASP_VERSION_3:
493
			mcasp_mod_bits(mcasp->base + MCASP_VER3_WFIFOCTL, tx_ser,
494
								NUMDMA_MASK);
495 496
			mcasp_mod_bits(mcasp->base + MCASP_VER3_WFIFOCTL,
				((mcasp->txnumevt * tx_ser) << 8), NUMEVT_MASK);
497 498
			break;
		default:
499
			mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_WFIFOCTL,
500
							tx_ser,	NUMDMA_MASK);
501 502
			mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_WFIFOCTL,
				((mcasp->txnumevt * tx_ser) << 8), NUMEVT_MASK);
503
		}
504 505
	}

506 507 508 509
	if (mcasp->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) {
		if (mcasp->rxnumevt * rx_ser > 64)
			mcasp->rxnumevt = 1;
		switch (mcasp->version) {
510
		case MCASP_VERSION_3:
511
			mcasp_mod_bits(mcasp->base + MCASP_VER3_RFIFOCTL, rx_ser,
512
								NUMDMA_MASK);
513 514
			mcasp_mod_bits(mcasp->base + MCASP_VER3_RFIFOCTL,
				((mcasp->rxnumevt * rx_ser) << 8), NUMEVT_MASK);
515 516
			break;
		default:
517
			mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_RFIFOCTL,
518
							rx_ser,	NUMDMA_MASK);
519 520
			mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_RFIFOCTL,
				((mcasp->rxnumevt * rx_ser) << 8), NUMEVT_MASK);
521
		}
522
	}
523 524

	return 0;
525 526
}

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

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

536
	mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC);
537

538 539 540
	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
		/* bit stream is MSB first  with no delay */
		/* DSP_B mode */
541 542
		mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXTDM_REG, mask);
		mcasp_set_bits(mcasp->base + DAVINCI_MCASP_TXFMT_REG, TXORD);
543

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

556 557 558
		if ((mcasp->tdm_slots >= 2) && (mcasp->tdm_slots <= 32))
			mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_RXFMCTL_REG,
					FSRMOD(mcasp->tdm_slots), FSRMOD(0x1FF));
559 560
		else
			printk(KERN_ERR "capture tdm slot %d not supported\n",
561
				mcasp->tdm_slots);
562 563 564 565
	}
}

/* S/PDIF */
566
static void davinci_hw_dit_param(struct davinci_mcasp *mcasp)
567 568 569
{
	/* Set the TX format : 24 bit right rotation, 32 bit slot, Pad 0
	   and LSB first */
570
	mcasp_set_bits(mcasp->base + DAVINCI_MCASP_TXFMT_REG,
571 572 573
						TXROT(6) | TXSSZ(15));

	/* Set TX frame synch : DIT Mode, 1 bit width, internal, rising edge */
574
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXFMCTL_REG,
575 576 577
						AFSXE | FSXMOD(0x180));

	/* Set the TX tdm : for all the slots */
578
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXTDM_REG, 0xFFFFFFFF);
579 580

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

584
	mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
585 586

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

	/* Enable the DIT */
590
	mcasp_set_bits(mcasp->base + DAVINCI_MCASP_TXDITCTL_REG, DITEN);
591 592 593 594 595 596
}

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

609 610
	active_serializers = (channels + slots - 1) / slots;

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

618 619
	if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE)
		davinci_hw_dit_param(mcasp);
620
	else
621
		davinci_hw_param(mcasp, substream->stream);
622 623

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

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

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

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

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

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

660
	dma_params->fifo_level = fifo_level;
661
	davinci_config_channel_size(mcasp, word_length);
662 663 664 665 666 667 668

	return 0;
}

static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
				     int cmd, struct snd_soc_dai *cpu_dai)
{
669
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
670 671 672 673
	int ret = 0;

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

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

	case SNDRV_PCM_TRIGGER_STOP:
690
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
691
		davinci_mcasp_stop(mcasp, substream->stream);
692 693 694 695 696 697 698 699 700
		break;

	default:
		ret = -EINVAL;
	}

	return ret;
}

701 702 703
static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
				 struct snd_soc_dai *dai)
{
704
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
705

706
	snd_soc_dai_set_dma_data(dai, substream, mcasp->dma_params);
707 708 709
	return 0;
}

710
static const struct snd_soc_dai_ops davinci_mcasp_dai_ops = {
711
	.startup	= davinci_mcasp_startup,
712 713 714
	.trigger	= davinci_mcasp_trigger,
	.hw_params	= davinci_mcasp_hw_params,
	.set_fmt	= davinci_mcasp_set_dai_fmt,
715
	.set_clkdiv	= davinci_mcasp_set_clkdiv,
716
	.set_sysclk	= davinci_mcasp_set_sysclk,
717 718
};

719 720
#define DAVINCI_MCASP_RATES	SNDRV_PCM_RATE_8000_192000

721 722 723 724
#define DAVINCI_MCASP_PCM_FMTS (SNDRV_PCM_FMTBIT_S8 | \
				SNDRV_PCM_FMTBIT_U8 | \
				SNDRV_PCM_FMTBIT_S16_LE | \
				SNDRV_PCM_FMTBIT_U16_LE | \
725 726 727 728
				SNDRV_PCM_FMTBIT_S24_LE | \
				SNDRV_PCM_FMTBIT_U24_LE | \
				SNDRV_PCM_FMTBIT_S24_3LE | \
				SNDRV_PCM_FMTBIT_U24_3LE | \
729 730 731
				SNDRV_PCM_FMTBIT_S32_LE | \
				SNDRV_PCM_FMTBIT_U32_LE)

732
static struct snd_soc_dai_driver davinci_mcasp_dai[] = {
733
	{
734
		.name		= "davinci-mcasp.0",
735 736
		.playback	= {
			.channels_min	= 2,
737
			.channels_max	= 32 * 16,
738
			.rates 		= DAVINCI_MCASP_RATES,
739
			.formats	= DAVINCI_MCASP_PCM_FMTS,
740 741 742
		},
		.capture 	= {
			.channels_min 	= 2,
743
			.channels_max	= 32 * 16,
744
			.rates 		= DAVINCI_MCASP_RATES,
745
			.formats	= DAVINCI_MCASP_PCM_FMTS,
746 747 748 749 750
		},
		.ops 		= &davinci_mcasp_dai_ops,

	},
	{
751
		.name		= "davinci-mcasp.1",
752 753 754 755
		.playback 	= {
			.channels_min	= 1,
			.channels_max	= 384,
			.rates		= DAVINCI_MCASP_RATES,
756
			.formats	= DAVINCI_MCASP_PCM_FMTS,
757 758 759 760 761 762
		},
		.ops 		= &davinci_mcasp_dai_ops,
	},

};

763 764 765 766
static const struct snd_soc_component_driver davinci_mcasp_component = {
	.name		= "davinci-mcasp",
};

767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788
/* 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,
};

789 790 791
static const struct of_device_id mcasp_dt_ids[] = {
	{
		.compatible = "ti,dm646x-mcasp-audio",
792
		.data = &dm646x_mcasp_pdata,
793 794 795
	},
	{
		.compatible = "ti,da830-mcasp-audio",
796
		.data = &da830_mcasp_pdata,
797
	},
798
	{
799
		.compatible = "ti,am33xx-mcasp-audio",
800
		.data = &omap2_mcasp_pdata,
801
	},
802 803 804 805 806 807 808 809 810 811
	{ /* 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 =
812
			of_match_device(mcasp_dt_ids, &pdev->dev);
813
	struct of_phandle_args dma_spec;
814 815 816 817 818 819 820 821 822

	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) {
823
		pdata = (struct snd_platform_data *) match->data;
824 825 826 827 828 829 830 831 832 833 834
	} 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);
835 836 837 838 839 840 841 842
	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;
		}

843
		pdata->tdm_slots = val;
844
	}
845 846 847 848

	of_serial_dir32 = of_get_property(np, "serial-dir", &val);
	val /= sizeof(u32);
	if (of_serial_dir32) {
849 850 851
		u8 *of_serial_dir = devm_kzalloc(&pdev->dev,
						 (sizeof(*of_serial_dir) * val),
						 GFP_KERNEL);
852 853 854 855 856
		if (!of_serial_dir) {
			ret = -ENOMEM;
			goto nodata;
		}

857
		for (i = 0; i < val; i++)
858 859
			of_serial_dir[i] = be32_to_cpup(&of_serial_dir32[i]);

860
		pdata->num_serializer = val;
861 862 863
		pdata->serial_dir = of_serial_dir;
	}

864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885
	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];

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

913 914 915
static int davinci_mcasp_probe(struct platform_device *pdev)
{
	struct davinci_pcm_dma_params *dma_data;
916
	struct resource *mem, *ioarea, *res, *dat;
917
	struct snd_platform_data *pdata;
918
	struct davinci_mcasp *mcasp;
919
	int ret;
920

921 922 923 924 925
	if (!pdev->dev.platform_data && !pdev->dev.of_node) {
		dev_err(&pdev->dev, "No platform data supplied\n");
		return -EINVAL;
	}

926
	mcasp = devm_kzalloc(&pdev->dev, sizeof(struct davinci_mcasp),
927
			   GFP_KERNEL);
928
	if (!mcasp)
929 930
		return	-ENOMEM;

931 932 933 934 935 936
	pdata = davinci_mcasp_set_pdata_from_of(pdev);
	if (!pdata) {
		dev_err(&pdev->dev, "no platform data\n");
		return -EINVAL;
	}

937
	mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
938
	if (!mem) {
939
		dev_warn(mcasp->dev,
940 941 942 943 944 945
			 "\"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;
		}
946 947
	}

948
	ioarea = devm_request_mem_region(&pdev->dev, mem->start,
949
			resource_size(mem), pdev->name);
950 951
	if (!ioarea) {
		dev_err(&pdev->dev, "Audio region already claimed\n");
952
		return -EBUSY;
953 954
	}

955
	pm_runtime_enable(&pdev->dev);
956

957 958 959 960 961
	ret = pm_runtime_get_sync(&pdev->dev);
	if (IS_ERR_VALUE(ret)) {
		dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n");
		return ret;
	}
962

963 964
	mcasp->base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
	if (!mcasp->base) {
965 966 967 968 969
		dev_err(&pdev->dev, "ioremap failed\n");
		ret = -ENOMEM;
		goto err_release_clk;
	}

970 971 972 973 974 975 976 977
	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;
	mcasp->dev = &pdev->dev;
978

979 980 981 982
	dat = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
	if (!dat)
		dat = mem;

983
	dma_data = &mcasp->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
984 985
	dma_data->asp_chan_q = pdata->asp_chan_q;
	dma_data->ram_chan_q = pdata->ram_chan_q;
986
	dma_data->sram_pool = pdata->sram_pool;
987
	dma_data->sram_size = pdata->sram_size_playback;
988
	dma_data->dma_addr = dat->start + pdata->tx_dma_offset;
989 990

	res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
991 992 993 994
	if (res)
		dma_data->channel = res->start;
	else
		dma_data->channel = pdata->tx_dma_channel;
995

996
	dma_data = &mcasp->dma_params[SNDRV_PCM_STREAM_CAPTURE];
997 998
	dma_data->asp_chan_q = pdata->asp_chan_q;
	dma_data->ram_chan_q = pdata->ram_chan_q;
999
	dma_data->sram_pool = pdata->sram_pool;
1000
	dma_data->sram_size = pdata->sram_size_capture;
1001
	dma_data->dma_addr = dat->start + pdata->rx_dma_offset;
1002 1003

	res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
1004 1005 1006 1007
	if (res)
		dma_data->channel = res->start;
	else
		dma_data->channel = pdata->rx_dma_channel;
1008

1009
	dev_set_drvdata(&pdev->dev, mcasp);
1010 1011
	ret = snd_soc_register_component(&pdev->dev, &davinci_mcasp_component,
					 &davinci_mcasp_dai[pdata->op_mode], 1);
1012 1013

	if (ret != 0)
1014
		goto err_release_clk;
1015 1016 1017 1018

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

1022 1023
	return 0;

1024 1025
err_unregister_component:
	snd_soc_unregister_component(&pdev->dev);
1026
err_release_clk:
1027 1028
	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
1029 1030 1031 1032 1033 1034
	return ret;
}

static int davinci_mcasp_remove(struct platform_device *pdev)
{

1035
	snd_soc_unregister_component(&pdev->dev);
1036
	davinci_soc_platform_unregister(&pdev->dev);
1037 1038 1039

	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
1040 1041 1042 1043

	return 0;
}

1044 1045 1046
#ifdef CONFIG_PM_SLEEP
static int davinci_mcasp_suspend(struct device *dev)
{
1047 1048
	struct davinci_mcasp *mcasp = dev_get_drvdata(dev);
	void __iomem *base = mcasp->base;
1049

1050 1051 1052 1053 1054 1055 1056
	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);
1057 1058 1059 1060 1061 1062

	return 0;
}

static int davinci_mcasp_resume(struct device *dev)
{
1063 1064 1065 1066 1067 1068 1069 1070 1071 1072
	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);
1073 1074 1075 1076 1077 1078 1079 1080 1081

	return 0;
}
#endif

SIMPLE_DEV_PM_OPS(davinci_mcasp_pm_ops,
		  davinci_mcasp_suspend,
		  davinci_mcasp_resume);

1082 1083 1084 1085 1086 1087
static struct platform_driver davinci_mcasp_driver = {
	.probe		= davinci_mcasp_probe,
	.remove		= davinci_mcasp_remove,
	.driver		= {
		.name	= "davinci-mcasp",
		.owner	= THIS_MODULE,
1088
		.pm	= &davinci_mcasp_pm_ops,
1089
		.of_match_table = mcasp_dt_ids,
1090 1091 1092
	},
};

1093
module_platform_driver(davinci_mcasp_driver);
1094 1095 1096 1097

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