davinci-mcasp.c 31.5 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

#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/initval.h>
#include <sound/soc.h>
34
#include <sound/dmaengine_pcm.h>
35 36 37 38

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

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

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

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

59 60
	bool	dat_port;

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

74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
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);
}

99
static void mcasp_set_ctl_reg(void __iomem *regs, u32 val)
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
{
	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");
}

116 117 118 119 120 121 122 123
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;
}

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

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

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

144 145 146
	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);
147

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

	if (mcasp_is_synchronous(mcasp))
		mcasp_set_ctl_reg(mcasp->base + DAVINCI_MCASP_GBLCTLX_REG,
				  TXFSRST);
154 155
}

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

161 162 163 164
	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);
165

166 167 168 169 170
	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) {
171 172 173 174 175 176 177
			offset = i;
			break;
		}
	}

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

182
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXBUF_REG, 0);
183 184
}

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

189 190
	mcasp->streams++;

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

208
static void mcasp_stop_rx(struct davinci_mcasp *mcasp)
209
{
210 211 212 213 214 215 216
	/*
	 * 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);

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

221
static void mcasp_stop_tx(struct davinci_mcasp *mcasp)
222
{
223 224 225 226 227 228 229 230 231 232
	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);
233
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
234 235
}

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

240 241
	mcasp->streams--;

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

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

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

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

280 281 282 283 284 285 286 287 288
	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);

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

299
		mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
300 301
		mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE);

302 303
		mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG,
				ACLKX | ACLKR);
304
		mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG,
305
				AFSX | AFSR);
306
		break;
307 308 309 310 311 312 313 314
	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);

315 316
		mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG,
				ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR);
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 350 351
		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);

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

	default:
		return -EINVAL;
	}

	return 0;
}

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

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

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

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

386 387 388 389 390 391 392
	default:
		return -EINVAL;
	}

	return 0;
}

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

	if (dir == SND_SOC_CLOCK_OUT) {
399 400 401
		mcasp_set_bits(mcasp->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);
402
	} else {
403 404 405
		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);
406 407 408 409 410
	}

	return 0;
}

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

419 420 421 422 423
	/*
	 * if s BCLK-to-LRCLK ratio has been configured via the set_clkdiv()
	 * callback, take it into account here. That allows us to for example
	 * send 32 bits per channel to the codec, while only 16 of them carry
	 * audio payload.
424 425 426
	 * The clock ratio is given for a full period of data (for I2S format
	 * both left and right channels), so it has to be divided by number of
	 * tdm-slots (for I2S - divided by 2).
427
	 */
428 429
	if (mcasp->bclk_lrclk_ratio)
		word_length = mcasp->bclk_lrclk_ratio / mcasp->tdm_slots;
430

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

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

447
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXMASK_REG, mask);
448

449 450 451
	return 0;
}

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

	/* All PINS as McASP */
468
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_PFUNC_REG, 0x00000000);
469 470

	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
471 472
		mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXSTAT_REG, 0xFFFFFFFF);
		mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_XEVTCTL_REG,
473 474
				TXDATADMADIS);
	} else {
475 476
		mcasp_set_reg(mcasp->base + DAVINCI_MCASP_RXSTAT_REG, 0xFFFFFFFF);
		mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_REVTCTL_REG,
477 478 479
				RXDATADMADIS);
	}

480 481 482 483
	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 &&
484
					tx_ser < max_active_serializers) {
485
			mcasp_set_bits(mcasp->base + DAVINCI_MCASP_PDIR_REG,
486
					AXR(i));
487
			tx_ser++;
488
		} else if (mcasp->serial_dir[i] == RX_MODE &&
489
					rx_ser < max_active_serializers) {
490
			mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_PDIR_REG,
491
					AXR(i));
492
			rx_ser++;
493
		} else {
494
			mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_XRSRCTL_REG(i),
495
					SRMOD_INACTIVE, SRMOD_MASK);
496 497 498
		}
	}

499 500 501 502 503 504
	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
		ser = tx_ser;
	else
		ser = rx_ser;

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

510 511 512
	if (mcasp->txnumevt && stream == SNDRV_PCM_STREAM_PLAYBACK) {
		if (mcasp->txnumevt * tx_ser > 64)
			mcasp->txnumevt = 1;
513

514 515 516 517
		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);
518 519
	}

520 521 522
	if (mcasp->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) {
		if (mcasp->rxnumevt * rx_ser > 64)
			mcasp->rxnumevt = 1;
523 524 525 526 527

		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);
528
	}
529 530

	return 0;
531 532
}

533
static void davinci_hw_param(struct davinci_mcasp *mcasp, int stream)
534 535 536
{
	int i, active_slots;
	u32 mask = 0;
537
	u32 busel = 0;
538

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

543
	mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC);
544

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

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

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

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

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

	/* Set TX frame synch : DIT Mode, 1 bit width, internal, rising edge */
586
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXFMCTL_REG,
587 588 589
						AFSXE | FSXMOD(0x180));

	/* Set the TX tdm : for all the slots */
590
	mcasp_set_reg(mcasp->base + DAVINCI_MCASP_TXTDM_REG, 0xFFFFFFFF);
591 592

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

596
	mcasp_clr_bits(mcasp->base + DAVINCI_MCASP_XEVTCTL_REG, TXDATADMADIS);
597 598

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

	/* Enable the DIT */
602
	mcasp_set_bits(mcasp->base + DAVINCI_MCASP_TXDITCTL_REG, DITEN);
603 604 605 606 607 608
}

static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
					struct snd_pcm_hw_params *params,
					struct snd_soc_dai *cpu_dai)
{
609
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
610
	struct davinci_pcm_dma_params *dma_params =
611
					&mcasp->dma_params[substream->stream];
612 613
	struct snd_dmaengine_dai_dma_data *dma_data =
					&mcasp->dma_data[substream->stream];
614
	int word_length;
615
	u8 fifo_level;
616
	u8 slots = mcasp->tdm_slots;
617
	u8 active_serializers;
618 619 620 621
	int channels;
	struct snd_interval *pcm_channels = hw_param_interval(params,
					SNDRV_PCM_HW_PARAM_CHANNELS);
	channels = pcm_channels->min;
622

623 624
	active_serializers = (channels + slots - 1) / slots;

625
	if (davinci_hw_common_param(mcasp, substream->stream, channels) == -EINVAL)
626
		return -EINVAL;
627
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
628
		fifo_level = mcasp->txnumevt * active_serializers;
629
	else
630
		fifo_level = mcasp->rxnumevt * active_serializers;
631

632 633
	if (mcasp->op_mode == DAVINCI_MCASP_DIT_MODE)
		davinci_hw_dit_param(mcasp);
634
	else
635
		davinci_hw_param(mcasp, substream->stream);
636 637

	switch (params_format(params)) {
638
	case SNDRV_PCM_FORMAT_U8:
639 640
	case SNDRV_PCM_FORMAT_S8:
		dma_params->data_type = 1;
641
		word_length = 8;
642 643
		break;

644
	case SNDRV_PCM_FORMAT_U16_LE:
645 646
	case SNDRV_PCM_FORMAT_S16_LE:
		dma_params->data_type = 2;
647
		word_length = 16;
648 649
		break;

650 651 652
	case SNDRV_PCM_FORMAT_U24_3LE:
	case SNDRV_PCM_FORMAT_S24_3LE:
		dma_params->data_type = 3;
653
		word_length = 24;
654 655
		break;

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

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

669
	if (mcasp->version == MCASP_VERSION_2 && !fifo_level)
670 671
		dma_params->acnt = 4;
	else
672 673
		dma_params->acnt = dma_params->data_type;

674
	dma_params->fifo_level = fifo_level;
675 676
	dma_data->maxburst = fifo_level;

677
	davinci_config_channel_size(mcasp, word_length);
678 679 680 681 682 683 684

	return 0;
}

static int davinci_mcasp_trigger(struct snd_pcm_substream *substream,
				     int cmd, struct snd_soc_dai *cpu_dai)
{
685
	struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai);
686 687 688 689
	int ret = 0;

	switch (cmd) {
	case SNDRV_PCM_TRIGGER_RESUME:
690 691
	case SNDRV_PCM_TRIGGER_START:
	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
692
		ret = pm_runtime_get_sync(mcasp->dev);
693
		if (IS_ERR_VALUE(ret))
694 695
			dev_err(mcasp->dev, "pm_runtime_get_sync() failed\n");
		davinci_mcasp_start(mcasp, substream->stream);
696 697 698
		break;

	case SNDRV_PCM_TRIGGER_SUSPEND:
699 700
		davinci_mcasp_stop(mcasp, substream->stream);
		ret = pm_runtime_put_sync(mcasp->dev);
701
		if (IS_ERR_VALUE(ret))
702
			dev_err(mcasp->dev, "pm_runtime_put_sync() failed\n");
703 704 705
		break;

	case SNDRV_PCM_TRIGGER_STOP:
706
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
707
		davinci_mcasp_stop(mcasp, substream->stream);
708 709 710 711 712 713 714 715 716
		break;

	default:
		ret = -EINVAL;
	}

	return ret;
}

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

722 723 724 725 726 727
	if (mcasp->version == MCASP_VERSION_4)
		snd_soc_dai_set_dma_data(dai, substream,
					&mcasp->dma_data[substream->stream]);
	else
		snd_soc_dai_set_dma_data(dai, substream, mcasp->dma_params);

728 729 730
	return 0;
}

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

740 741
#define DAVINCI_MCASP_RATES	SNDRV_PCM_RATE_8000_192000

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

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

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

};

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

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

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

817 818 819
static const struct of_device_id mcasp_dt_ids[] = {
	{
		.compatible = "ti,dm646x-mcasp-audio",
820
		.data = &dm646x_mcasp_pdata,
821 822 823
	},
	{
		.compatible = "ti,da830-mcasp-audio",
824
		.data = &da830_mcasp_pdata,
825
	},
826
	{
827
		.compatible = "ti,am33xx-mcasp-audio",
828
		.data = &omap2_mcasp_pdata,
829
	},
830 831 832 833
	{
		.compatible = "ti,dra7-mcasp-audio",
		.data = &dra7_mcasp_pdata,
	},
834 835 836 837 838 839 840 841 842 843
	{ /* 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 =
844
			of_match_device(mcasp_dt_ids, &pdev->dev);
845
	struct of_phandle_args dma_spec;
846 847 848 849 850 851 852 853 854

	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) {
855
		pdata = (struct snd_platform_data *) match->data;
856 857 858 859 860 861 862 863 864 865 866
	} 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);
867 868 869 870 871 872 873 874
	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;
		}

875
		pdata->tdm_slots = val;
876
	}
877 878 879 880

	of_serial_dir32 = of_get_property(np, "serial-dir", &val);
	val /= sizeof(u32);
	if (of_serial_dir32) {
881 882 883
		u8 *of_serial_dir = devm_kzalloc(&pdev->dev,
						 (sizeof(*of_serial_dir) * val),
						 GFP_KERNEL);
884 885 886 887 888
		if (!of_serial_dir) {
			ret = -ENOMEM;
			goto nodata;
		}

889
		for (i = 0; i < val; i++)
890 891
			of_serial_dir[i] = be32_to_cpup(&of_serial_dir32[i]);

892
		pdata->num_serializer = val;
893 894 895
		pdata->serial_dir = of_serial_dir;
	}

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

918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944
	ret = of_property_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;
}

945 946 947
static int davinci_mcasp_probe(struct platform_device *pdev)
{
	struct davinci_pcm_dma_params *dma_data;
948
	struct resource *mem, *ioarea, *res, *dat;
949
	struct snd_platform_data *pdata;
950
	struct davinci_mcasp *mcasp;
951
	int ret;
952

953 954 955 956 957
	if (!pdev->dev.platform_data && !pdev->dev.of_node) {
		dev_err(&pdev->dev, "No platform data supplied\n");
		return -EINVAL;
	}

958
	mcasp = devm_kzalloc(&pdev->dev, sizeof(struct davinci_mcasp),
959
			   GFP_KERNEL);
960
	if (!mcasp)
961 962
		return	-ENOMEM;

963 964 965 966 967 968
	pdata = davinci_mcasp_set_pdata_from_of(pdev);
	if (!pdata) {
		dev_err(&pdev->dev, "no platform data\n");
		return -EINVAL;
	}

969
	mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
970
	if (!mem) {
971
		dev_warn(mcasp->dev,
972 973 974 975 976 977
			 "\"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;
		}
978 979
	}

980
	ioarea = devm_request_mem_region(&pdev->dev, mem->start,
981
			resource_size(mem), pdev->name);
982 983
	if (!ioarea) {
		dev_err(&pdev->dev, "Audio region already claimed\n");
984
		return -EBUSY;
985 986
	}

987
	pm_runtime_enable(&pdev->dev);
988

989 990 991 992 993
	ret = pm_runtime_get_sync(&pdev->dev);
	if (IS_ERR_VALUE(ret)) {
		dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n");
		return ret;
	}
994

995 996
	mcasp->base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
	if (!mcasp->base) {
997 998 999 1000 1001
		dev_err(&pdev->dev, "ioremap failed\n");
		ret = -ENOMEM;
		goto err_release_clk;
	}

1002 1003 1004 1005 1006 1007 1008
	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;
1009

1010
	mcasp->dev = &pdev->dev;
1011

1012
	dat = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
1013 1014
	if (dat)
		mcasp->dat_port = true;
1015

1016
	dma_data = &mcasp->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
1017 1018
	dma_data->asp_chan_q = pdata->asp_chan_q;
	dma_data->ram_chan_q = pdata->ram_chan_q;
1019
	dma_data->sram_pool = pdata->sram_pool;
1020
	dma_data->sram_size = pdata->sram_size_playback;
1021 1022 1023 1024
	if (dat)
		dma_data->dma_addr = dat->start;
	else
		dma_data->dma_addr = mem->start + pdata->tx_dma_offset;
1025

1026 1027 1028
	/* Unconditional dmaengine stuff */
	mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK].addr = dma_data->dma_addr;

1029
	res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
1030 1031 1032 1033
	if (res)
		dma_data->channel = res->start;
	else
		dma_data->channel = pdata->tx_dma_channel;
1034

1035
	dma_data = &mcasp->dma_params[SNDRV_PCM_STREAM_CAPTURE];
1036 1037
	dma_data->asp_chan_q = pdata->asp_chan_q;
	dma_data->ram_chan_q = pdata->ram_chan_q;
1038
	dma_data->sram_pool = pdata->sram_pool;
1039
	dma_data->sram_size = pdata->sram_size_capture;
1040 1041 1042 1043 1044
	if (dat)
		dma_data->dma_addr = dat->start;
	else
		dma_data->dma_addr = mem->start + pdata->rx_dma_offset;

1045 1046 1047
	/* Unconditional dmaengine stuff */
	mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE].addr = dma_data->dma_addr;

1048 1049 1050 1051 1052 1053 1054
	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;
	}
1055 1056

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

1062 1063 1064 1065
	/* Unconditional dmaengine stuff */
	mcasp->dma_data[SNDRV_PCM_STREAM_PLAYBACK].filter_data = "tx";
	mcasp->dma_data[SNDRV_PCM_STREAM_CAPTURE].filter_data = "rx";

1066
	dev_set_drvdata(&pdev->dev, mcasp);
1067 1068
	ret = snd_soc_register_component(&pdev->dev, &davinci_mcasp_component,
					 &davinci_mcasp_dai[pdata->op_mode], 1);
1069 1070

	if (ret != 0)
1071
		goto err_release_clk;
1072

1073 1074 1075 1076 1077 1078
	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;
		}
1079 1080
	}

1081 1082
	return 0;

1083 1084
err_unregister_component:
	snd_soc_unregister_component(&pdev->dev);
1085
err_release_clk:
1086 1087
	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
1088 1089 1090 1091 1092
	return ret;
}

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

1095
	snd_soc_unregister_component(&pdev->dev);
1096 1097
	if (mcasp->version != MCASP_VERSION_4)
		davinci_soc_platform_unregister(&pdev->dev);
1098 1099 1100

	pm_runtime_put_sync(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
1101 1102 1103 1104

	return 0;
}

1105 1106 1107
#ifdef CONFIG_PM_SLEEP
static int davinci_mcasp_suspend(struct device *dev)
{
1108 1109
	struct davinci_mcasp *mcasp = dev_get_drvdata(dev);
	void __iomem *base = mcasp->base;
1110

1111 1112 1113 1114 1115 1116 1117
	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);
1118 1119 1120 1121 1122 1123

	return 0;
}

static int davinci_mcasp_resume(struct device *dev)
{
1124 1125 1126 1127 1128 1129 1130 1131 1132 1133
	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);
1134 1135 1136 1137 1138 1139 1140 1141 1142

	return 0;
}
#endif

SIMPLE_DEV_PM_OPS(davinci_mcasp_pm_ops,
		  davinci_mcasp_suspend,
		  davinci_mcasp_resume);

1143 1144 1145 1146 1147 1148
static struct platform_driver davinci_mcasp_driver = {
	.probe		= davinci_mcasp_probe,
	.remove		= davinci_mcasp_remove,
	.driver		= {
		.name	= "davinci-mcasp",
		.owner	= THIS_MODULE,
1149
		.pm	= &davinci_mcasp_pm_ops,
1150
		.of_match_table = mcasp_dt_ids,
1151 1152 1153
	},
};

1154
module_platform_driver(davinci_mcasp_driver);
1155 1156 1157 1158

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