xref: /linux/sound/soc/pxa/pxa-ssp.c (revision d39d0ed196aa1685bb24771e92f78633c66ac9cb)
1 /*
2  * pxa-ssp.c  --  ALSA Soc Audio Layer
3  *
4  * Copyright 2005,2008 Wolfson Microelectronics PLC.
5  * Author: Liam Girdwood
6  *         Mark Brown <broonie@opensource.wolfsonmicro.com>
7  *
8  *  This program is free software; you can redistribute  it and/or modify it
9  *  under  the terms of  the GNU General  Public License as published by the
10  *  Free Software Foundation;  either version 2 of the  License, or (at your
11  *  option) any later version.
12  *
13  * TODO:
14  *  o Test network mode for > 16bit sample size
15  */
16 
17 #include <linux/init.h>
18 #include <linux/module.h>
19 #include <linux/slab.h>
20 #include <linux/platform_device.h>
21 #include <linux/clk.h>
22 #include <linux/io.h>
23 
24 #include <asm/irq.h>
25 
26 #include <sound/core.h>
27 #include <sound/pcm.h>
28 #include <sound/initval.h>
29 #include <sound/pcm_params.h>
30 #include <sound/soc.h>
31 #include <sound/pxa2xx-lib.h>
32 
33 #include <mach/hardware.h>
34 #include <mach/dma.h>
35 #include <mach/audio.h>
36 #include <plat/ssp.h>
37 
38 #include "pxa2xx-pcm.h"
39 #include "pxa-ssp.h"
40 
41 /*
42  * SSP audio private data
43  */
44 struct ssp_priv {
45 	struct ssp_device *ssp;
46 	unsigned int sysclk;
47 	int dai_fmt;
48 #ifdef CONFIG_PM
49 	uint32_t	cr0;
50 	uint32_t	cr1;
51 	uint32_t	to;
52 	uint32_t	psp;
53 #endif
54 };
55 
56 static void dump_registers(struct ssp_device *ssp)
57 {
58 	dev_dbg(&ssp->pdev->dev, "SSCR0 0x%08x SSCR1 0x%08x SSTO 0x%08x\n",
59 		 pxa_ssp_read_reg(ssp, SSCR0), pxa_ssp_read_reg(ssp, SSCR1),
60 		 pxa_ssp_read_reg(ssp, SSTO));
61 
62 	dev_dbg(&ssp->pdev->dev, "SSPSP 0x%08x SSSR 0x%08x SSACD 0x%08x\n",
63 		 pxa_ssp_read_reg(ssp, SSPSP), pxa_ssp_read_reg(ssp, SSSR),
64 		 pxa_ssp_read_reg(ssp, SSACD));
65 }
66 
67 static void pxa_ssp_enable(struct ssp_device *ssp)
68 {
69 	uint32_t sscr0;
70 
71 	sscr0 = __raw_readl(ssp->mmio_base + SSCR0) | SSCR0_SSE;
72 	__raw_writel(sscr0, ssp->mmio_base + SSCR0);
73 }
74 
75 static void pxa_ssp_disable(struct ssp_device *ssp)
76 {
77 	uint32_t sscr0;
78 
79 	sscr0 = __raw_readl(ssp->mmio_base + SSCR0) & ~SSCR0_SSE;
80 	__raw_writel(sscr0, ssp->mmio_base + SSCR0);
81 }
82 
83 struct pxa2xx_pcm_dma_data {
84 	struct pxa2xx_pcm_dma_params params;
85 	char name[20];
86 };
87 
88 static struct pxa2xx_pcm_dma_params *
89 pxa_ssp_get_dma_params(struct ssp_device *ssp, int width4, int out)
90 {
91 	struct pxa2xx_pcm_dma_data *dma;
92 
93 	dma = kzalloc(sizeof(struct pxa2xx_pcm_dma_data), GFP_KERNEL);
94 	if (dma == NULL)
95 		return NULL;
96 
97 	snprintf(dma->name, 20, "SSP%d PCM %s %s", ssp->port_id,
98 			width4 ? "32-bit" : "16-bit", out ? "out" : "in");
99 
100 	dma->params.name = dma->name;
101 	dma->params.drcmr = &DRCMR(out ? ssp->drcmr_tx : ssp->drcmr_rx);
102 	dma->params.dcmd = (out ? (DCMD_INCSRCADDR | DCMD_FLOWTRG) :
103 				  (DCMD_INCTRGADDR | DCMD_FLOWSRC)) |
104 			(width4 ? DCMD_WIDTH4 : DCMD_WIDTH2) | DCMD_BURST16;
105 	dma->params.dev_addr = ssp->phys_base + SSDR;
106 
107 	return &dma->params;
108 }
109 
110 static int pxa_ssp_startup(struct snd_pcm_substream *substream,
111 			   struct snd_soc_dai *dai)
112 {
113 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
114 	struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
115 	struct ssp_priv *priv = cpu_dai->private_data;
116 	struct ssp_device *ssp = priv->ssp;
117 	int ret = 0;
118 
119 	if (!cpu_dai->active) {
120 		clk_enable(ssp->clk);
121 		pxa_ssp_disable(ssp);
122 	}
123 
124 	kfree(snd_soc_dai_get_dma_data(cpu_dai, substream));
125 	snd_soc_dai_set_dma_data(cpu_dai, substream, NULL);
126 
127 	return ret;
128 }
129 
130 static void pxa_ssp_shutdown(struct snd_pcm_substream *substream,
131 			     struct snd_soc_dai *dai)
132 {
133 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
134 	struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
135 	struct ssp_priv *priv = cpu_dai->private_data;
136 	struct ssp_device *ssp = priv->ssp;
137 
138 	if (!cpu_dai->active) {
139 		pxa_ssp_disable(ssp);
140 		clk_disable(ssp->clk);
141 	}
142 
143 	kfree(snd_soc_dai_get_dma_data(cpu_dai, substream));
144 	snd_soc_dai_set_dma_data(cpu_dai, substream, NULL);
145 }
146 
147 #ifdef CONFIG_PM
148 
149 static int pxa_ssp_suspend(struct snd_soc_dai *cpu_dai)
150 {
151 	struct ssp_priv *priv = cpu_dai->private_data;
152 	struct ssp_device *ssp = priv->ssp;
153 
154 	if (!cpu_dai->active)
155 		clk_enable(ssp->clk);
156 
157 	priv->cr0 = __raw_readl(ssp->mmio_base + SSCR0);
158 	priv->cr1 = __raw_readl(ssp->mmio_base + SSCR1);
159 	priv->to  = __raw_readl(ssp->mmio_base + SSTO);
160 	priv->psp = __raw_readl(ssp->mmio_base + SSPSP);
161 
162 	pxa_ssp_disable(ssp);
163 	clk_disable(ssp->clk);
164 	return 0;
165 }
166 
167 static int pxa_ssp_resume(struct snd_soc_dai *cpu_dai)
168 {
169 	struct ssp_priv *priv = cpu_dai->private_data;
170 	struct ssp_device *ssp = priv->ssp;
171 	uint32_t sssr = SSSR_ROR | SSSR_TUR | SSSR_BCE;
172 
173 	clk_enable(ssp->clk);
174 
175 	__raw_writel(sssr, ssp->mmio_base + SSSR);
176 	__raw_writel(priv->cr0 & ~SSCR0_SSE, ssp->mmio_base + SSCR0);
177 	__raw_writel(priv->cr1, ssp->mmio_base + SSCR1);
178 	__raw_writel(priv->to,  ssp->mmio_base + SSTO);
179 	__raw_writel(priv->psp, ssp->mmio_base + SSPSP);
180 
181 	if (cpu_dai->active)
182 		pxa_ssp_enable(ssp);
183 	else
184 		clk_disable(ssp->clk);
185 
186 	return 0;
187 }
188 
189 #else
190 #define pxa_ssp_suspend	NULL
191 #define pxa_ssp_resume	NULL
192 #endif
193 
194 /**
195  * ssp_set_clkdiv - set SSP clock divider
196  * @div: serial clock rate divider
197  */
198 static void pxa_ssp_set_scr(struct ssp_device *ssp, u32 div)
199 {
200 	u32 sscr0 = pxa_ssp_read_reg(ssp, SSCR0);
201 
202 	if (cpu_is_pxa25x() && ssp->type == PXA25x_SSP) {
203 		sscr0 &= ~0x0000ff00;
204 		sscr0 |= ((div - 2)/2) << 8; /* 2..512 */
205 	} else {
206 		sscr0 &= ~0x000fff00;
207 		sscr0 |= (div - 1) << 8;     /* 1..4096 */
208 	}
209 	pxa_ssp_write_reg(ssp, SSCR0, sscr0);
210 }
211 
212 /**
213  * pxa_ssp_get_clkdiv - get SSP clock divider
214  */
215 static u32 pxa_ssp_get_scr(struct ssp_device *ssp)
216 {
217 	u32 sscr0 = pxa_ssp_read_reg(ssp, SSCR0);
218 	u32 div;
219 
220 	if (cpu_is_pxa25x() && ssp->type == PXA25x_SSP)
221 		div = ((sscr0 >> 8) & 0xff) * 2 + 2;
222 	else
223 		div = ((sscr0 >> 8) & 0xfff) + 1;
224 	return div;
225 }
226 
227 /*
228  * Set the SSP ports SYSCLK.
229  */
230 static int pxa_ssp_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
231 	int clk_id, unsigned int freq, int dir)
232 {
233 	struct ssp_priv *priv = cpu_dai->private_data;
234 	struct ssp_device *ssp = priv->ssp;
235 	int val;
236 
237 	u32 sscr0 = pxa_ssp_read_reg(ssp, SSCR0) &
238 		~(SSCR0_ECS |  SSCR0_NCS | SSCR0_MOD | SSCR0_ACS);
239 
240 	dev_dbg(&ssp->pdev->dev,
241 		"pxa_ssp_set_dai_sysclk id: %d, clk_id %d, freq %u\n",
242 		cpu_dai->id, clk_id, freq);
243 
244 	switch (clk_id) {
245 	case PXA_SSP_CLK_NET_PLL:
246 		sscr0 |= SSCR0_MOD;
247 		break;
248 	case PXA_SSP_CLK_PLL:
249 		/* Internal PLL is fixed */
250 		if (cpu_is_pxa25x())
251 			priv->sysclk = 1843200;
252 		else
253 			priv->sysclk = 13000000;
254 		break;
255 	case PXA_SSP_CLK_EXT:
256 		priv->sysclk = freq;
257 		sscr0 |= SSCR0_ECS;
258 		break;
259 	case PXA_SSP_CLK_NET:
260 		priv->sysclk = freq;
261 		sscr0 |= SSCR0_NCS | SSCR0_MOD;
262 		break;
263 	case PXA_SSP_CLK_AUDIO:
264 		priv->sysclk = 0;
265 		pxa_ssp_set_scr(ssp, 1);
266 		sscr0 |= SSCR0_ACS;
267 		break;
268 	default:
269 		return -ENODEV;
270 	}
271 
272 	/* The SSP clock must be disabled when changing SSP clock mode
273 	 * on PXA2xx.  On PXA3xx it must be enabled when doing so. */
274 	if (!cpu_is_pxa3xx())
275 		clk_disable(ssp->clk);
276 	val = pxa_ssp_read_reg(ssp, SSCR0) | sscr0;
277 	pxa_ssp_write_reg(ssp, SSCR0, val);
278 	if (!cpu_is_pxa3xx())
279 		clk_enable(ssp->clk);
280 
281 	return 0;
282 }
283 
284 /*
285  * Set the SSP clock dividers.
286  */
287 static int pxa_ssp_set_dai_clkdiv(struct snd_soc_dai *cpu_dai,
288 	int div_id, int div)
289 {
290 	struct ssp_priv *priv = cpu_dai->private_data;
291 	struct ssp_device *ssp = priv->ssp;
292 	int val;
293 
294 	switch (div_id) {
295 	case PXA_SSP_AUDIO_DIV_ACDS:
296 		val = (pxa_ssp_read_reg(ssp, SSACD) & ~0x7) | SSACD_ACDS(div);
297 		pxa_ssp_write_reg(ssp, SSACD, val);
298 		break;
299 	case PXA_SSP_AUDIO_DIV_SCDB:
300 		val = pxa_ssp_read_reg(ssp, SSACD);
301 		val &= ~SSACD_SCDB;
302 #if defined(CONFIG_PXA3xx)
303 		if (cpu_is_pxa3xx())
304 			val &= ~SSACD_SCDX8;
305 #endif
306 		switch (div) {
307 		case PXA_SSP_CLK_SCDB_1:
308 			val |= SSACD_SCDB;
309 			break;
310 		case PXA_SSP_CLK_SCDB_4:
311 			break;
312 #if defined(CONFIG_PXA3xx)
313 		case PXA_SSP_CLK_SCDB_8:
314 			if (cpu_is_pxa3xx())
315 				val |= SSACD_SCDX8;
316 			else
317 				return -EINVAL;
318 			break;
319 #endif
320 		default:
321 			return -EINVAL;
322 		}
323 		pxa_ssp_write_reg(ssp, SSACD, val);
324 		break;
325 	case PXA_SSP_DIV_SCR:
326 		pxa_ssp_set_scr(ssp, div);
327 		break;
328 	default:
329 		return -ENODEV;
330 	}
331 
332 	return 0;
333 }
334 
335 /*
336  * Configure the PLL frequency pxa27x and (afaik - pxa320 only)
337  */
338 static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai, int pll_id,
339 	int source, unsigned int freq_in, unsigned int freq_out)
340 {
341 	struct ssp_priv *priv = cpu_dai->private_data;
342 	struct ssp_device *ssp = priv->ssp;
343 	u32 ssacd = pxa_ssp_read_reg(ssp, SSACD) & ~0x70;
344 
345 #if defined(CONFIG_PXA3xx)
346 	if (cpu_is_pxa3xx())
347 		pxa_ssp_write_reg(ssp, SSACDD, 0);
348 #endif
349 
350 	switch (freq_out) {
351 	case 5622000:
352 		break;
353 	case 11345000:
354 		ssacd |= (0x1 << 4);
355 		break;
356 	case 12235000:
357 		ssacd |= (0x2 << 4);
358 		break;
359 	case 14857000:
360 		ssacd |= (0x3 << 4);
361 		break;
362 	case 32842000:
363 		ssacd |= (0x4 << 4);
364 		break;
365 	case 48000000:
366 		ssacd |= (0x5 << 4);
367 		break;
368 	case 0:
369 		/* Disable */
370 		break;
371 
372 	default:
373 #ifdef CONFIG_PXA3xx
374 		/* PXA3xx has a clock ditherer which can be used to generate
375 		 * a wider range of frequencies - calculate a value for it.
376 		 */
377 		if (cpu_is_pxa3xx()) {
378 			u32 val;
379 			u64 tmp = 19968;
380 			tmp *= 1000000;
381 			do_div(tmp, freq_out);
382 			val = tmp;
383 
384 			val = (val << 16) | 64;
385 			pxa_ssp_write_reg(ssp, SSACDD, val);
386 
387 			ssacd |= (0x6 << 4);
388 
389 			dev_dbg(&ssp->pdev->dev,
390 				"Using SSACDD %x to supply %uHz\n",
391 				val, freq_out);
392 			break;
393 		}
394 #endif
395 
396 		return -EINVAL;
397 	}
398 
399 	pxa_ssp_write_reg(ssp, SSACD, ssacd);
400 
401 	return 0;
402 }
403 
404 /*
405  * Set the active slots in TDM/Network mode
406  */
407 static int pxa_ssp_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai,
408 	unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
409 {
410 	struct ssp_priv *priv = cpu_dai->private_data;
411 	struct ssp_device *ssp = priv->ssp;
412 	u32 sscr0;
413 
414 	sscr0 = pxa_ssp_read_reg(ssp, SSCR0);
415 	sscr0 &= ~(SSCR0_MOD | SSCR0_SlotsPerFrm(8) | SSCR0_EDSS | SSCR0_DSS);
416 
417 	/* set slot width */
418 	if (slot_width > 16)
419 		sscr0 |= SSCR0_EDSS | SSCR0_DataSize(slot_width - 16);
420 	else
421 		sscr0 |= SSCR0_DataSize(slot_width);
422 
423 	if (slots > 1) {
424 		/* enable network mode */
425 		sscr0 |= SSCR0_MOD;
426 
427 		/* set number of active slots */
428 		sscr0 |= SSCR0_SlotsPerFrm(slots);
429 
430 		/* set active slot mask */
431 		pxa_ssp_write_reg(ssp, SSTSA, tx_mask);
432 		pxa_ssp_write_reg(ssp, SSRSA, rx_mask);
433 	}
434 	pxa_ssp_write_reg(ssp, SSCR0, sscr0);
435 
436 	return 0;
437 }
438 
439 /*
440  * Tristate the SSP DAI lines
441  */
442 static int pxa_ssp_set_dai_tristate(struct snd_soc_dai *cpu_dai,
443 	int tristate)
444 {
445 	struct ssp_priv *priv = cpu_dai->private_data;
446 	struct ssp_device *ssp = priv->ssp;
447 	u32 sscr1;
448 
449 	sscr1 = pxa_ssp_read_reg(ssp, SSCR1);
450 	if (tristate)
451 		sscr1 &= ~SSCR1_TTE;
452 	else
453 		sscr1 |= SSCR1_TTE;
454 	pxa_ssp_write_reg(ssp, SSCR1, sscr1);
455 
456 	return 0;
457 }
458 
459 /*
460  * Set up the SSP DAI format.
461  * The SSP Port must be inactive before calling this function as the
462  * physical interface format is changed.
463  */
464 static int pxa_ssp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
465 		unsigned int fmt)
466 {
467 	struct ssp_priv *priv = cpu_dai->private_data;
468 	struct ssp_device *ssp = priv->ssp;
469 	u32 sscr0;
470 	u32 sscr1;
471 	u32 sspsp;
472 
473 	/* check if we need to change anything at all */
474 	if (priv->dai_fmt == fmt)
475 		return 0;
476 
477 	/* we can only change the settings if the port is not in use */
478 	if (pxa_ssp_read_reg(ssp, SSCR0) & SSCR0_SSE) {
479 		dev_err(&ssp->pdev->dev,
480 			"can't change hardware dai format: stream is in use");
481 		return -EINVAL;
482 	}
483 
484 	/* reset port settings */
485 	sscr0 = pxa_ssp_read_reg(ssp, SSCR0) &
486 		(SSCR0_ECS |  SSCR0_NCS | SSCR0_MOD | SSCR0_ACS);
487 	sscr1 = SSCR1_RxTresh(8) | SSCR1_TxTresh(7);
488 	sspsp = 0;
489 
490 	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
491 	case SND_SOC_DAIFMT_CBM_CFM:
492 		sscr1 |= SSCR1_SCLKDIR | SSCR1_SFRMDIR;
493 		break;
494 	case SND_SOC_DAIFMT_CBM_CFS:
495 		sscr1 |= SSCR1_SCLKDIR;
496 		break;
497 	case SND_SOC_DAIFMT_CBS_CFS:
498 		break;
499 	default:
500 		return -EINVAL;
501 	}
502 
503 	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
504 	case SND_SOC_DAIFMT_NB_NF:
505 		sspsp |= SSPSP_SFRMP;
506 		break;
507 	case SND_SOC_DAIFMT_NB_IF:
508 		break;
509 	case SND_SOC_DAIFMT_IB_IF:
510 		sspsp |= SSPSP_SCMODE(2);
511 		break;
512 	case SND_SOC_DAIFMT_IB_NF:
513 		sspsp |= SSPSP_SCMODE(2) | SSPSP_SFRMP;
514 		break;
515 	default:
516 		return -EINVAL;
517 	}
518 
519 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
520 	case SND_SOC_DAIFMT_I2S:
521 		sscr0 |= SSCR0_PSP;
522 		sscr1 |= SSCR1_RWOT | SSCR1_TRAIL;
523 		/* See hw_params() */
524 		break;
525 
526 	case SND_SOC_DAIFMT_DSP_A:
527 		sspsp |= SSPSP_FSRT;
528 	case SND_SOC_DAIFMT_DSP_B:
529 		sscr0 |= SSCR0_MOD | SSCR0_PSP;
530 		sscr1 |= SSCR1_TRAIL | SSCR1_RWOT;
531 		break;
532 
533 	default:
534 		return -EINVAL;
535 	}
536 
537 	pxa_ssp_write_reg(ssp, SSCR0, sscr0);
538 	pxa_ssp_write_reg(ssp, SSCR1, sscr1);
539 	pxa_ssp_write_reg(ssp, SSPSP, sspsp);
540 
541 	dump_registers(ssp);
542 
543 	/* Since we are configuring the timings for the format by hand
544 	 * we have to defer some things until hw_params() where we
545 	 * know parameters like the sample size.
546 	 */
547 	priv->dai_fmt = fmt;
548 
549 	return 0;
550 }
551 
552 /*
553  * Set the SSP audio DMA parameters and sample size.
554  * Can be called multiple times by oss emulation.
555  */
556 static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
557 				struct snd_pcm_hw_params *params,
558 				struct snd_soc_dai *dai)
559 {
560 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
561 	struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
562 	struct ssp_priv *priv = cpu_dai->private_data;
563 	struct ssp_device *ssp = priv->ssp;
564 	int chn = params_channels(params);
565 	u32 sscr0;
566 	u32 sspsp;
567 	int width = snd_pcm_format_physical_width(params_format(params));
568 	int ttsa = pxa_ssp_read_reg(ssp, SSTSA) & 0xf;
569 	struct pxa2xx_pcm_dma_params *dma_data;
570 
571 	dma_data = snd_soc_dai_get_dma_data(dai, substream);
572 
573 	/* generate correct DMA params */
574 	kfree(dma_data);
575 
576 	/* Network mode with one active slot (ttsa == 1) can be used
577 	 * to force 16-bit frame width on the wire (for S16_LE), even
578 	 * with two channels. Use 16-bit DMA transfers for this case.
579 	 */
580 	dma_data = pxa_ssp_get_dma_params(ssp,
581 			((chn == 2) && (ttsa != 1)) || (width == 32),
582 			substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
583 
584 	snd_soc_dai_set_dma_data(dai, substream, dma_data);
585 
586 	/* we can only change the settings if the port is not in use */
587 	if (pxa_ssp_read_reg(ssp, SSCR0) & SSCR0_SSE)
588 		return 0;
589 
590 	/* clear selected SSP bits */
591 	sscr0 = pxa_ssp_read_reg(ssp, SSCR0) & ~(SSCR0_DSS | SSCR0_EDSS);
592 	pxa_ssp_write_reg(ssp, SSCR0, sscr0);
593 
594 	/* bit size */
595 	sscr0 = pxa_ssp_read_reg(ssp, SSCR0);
596 	switch (params_format(params)) {
597 	case SNDRV_PCM_FORMAT_S16_LE:
598 #ifdef CONFIG_PXA3xx
599 		if (cpu_is_pxa3xx())
600 			sscr0 |= SSCR0_FPCKE;
601 #endif
602 		sscr0 |= SSCR0_DataSize(16);
603 		break;
604 	case SNDRV_PCM_FORMAT_S24_LE:
605 		sscr0 |= (SSCR0_EDSS | SSCR0_DataSize(8));
606 		break;
607 	case SNDRV_PCM_FORMAT_S32_LE:
608 		sscr0 |= (SSCR0_EDSS | SSCR0_DataSize(16));
609 		break;
610 	}
611 	pxa_ssp_write_reg(ssp, SSCR0, sscr0);
612 
613 	switch (priv->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
614 	case SND_SOC_DAIFMT_I2S:
615 	       sspsp = pxa_ssp_read_reg(ssp, SSPSP);
616 
617 		if ((pxa_ssp_get_scr(ssp) == 4) && (width == 16)) {
618 			/* This is a special case where the bitclk is 64fs
619 			* and we're not dealing with 2*32 bits of audio
620 			* samples.
621 			*
622 			* The SSP values used for that are all found out by
623 			* trying and failing a lot; some of the registers
624 			* needed for that mode are only available on PXA3xx.
625 			*/
626 
627 #ifdef CONFIG_PXA3xx
628 			if (!cpu_is_pxa3xx())
629 				return -EINVAL;
630 
631 			sspsp |= SSPSP_SFRMWDTH(width * 2);
632 			sspsp |= SSPSP_SFRMDLY(width * 4);
633 			sspsp |= SSPSP_EDMYSTOP(3);
634 			sspsp |= SSPSP_DMYSTOP(3);
635 			sspsp |= SSPSP_DMYSTRT(1);
636 #else
637 			return -EINVAL;
638 #endif
639 		} else {
640 			/* The frame width is the width the LRCLK is
641 			 * asserted for; the delay is expressed in
642 			 * half cycle units.  We need the extra cycle
643 			 * because the data starts clocking out one BCLK
644 			 * after LRCLK changes polarity.
645 			 */
646 			sspsp |= SSPSP_SFRMWDTH(width + 1);
647 			sspsp |= SSPSP_SFRMDLY((width + 1) * 2);
648 			sspsp |= SSPSP_DMYSTRT(1);
649 		}
650 
651 		pxa_ssp_write_reg(ssp, SSPSP, sspsp);
652 		break;
653 	default:
654 		break;
655 	}
656 
657 	/* When we use a network mode, we always require TDM slots
658 	 * - complain loudly and fail if they've not been set up yet.
659 	 */
660 	if ((sscr0 & SSCR0_MOD) && !ttsa) {
661 		dev_err(&ssp->pdev->dev, "No TDM timeslot configured\n");
662 		return -EINVAL;
663 	}
664 
665 	dump_registers(ssp);
666 
667 	return 0;
668 }
669 
670 static int pxa_ssp_trigger(struct snd_pcm_substream *substream, int cmd,
671 			   struct snd_soc_dai *dai)
672 {
673 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
674 	struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
675 	int ret = 0;
676 	struct ssp_priv *priv = cpu_dai->private_data;
677 	struct ssp_device *ssp = priv->ssp;
678 	int val;
679 
680 	switch (cmd) {
681 	case SNDRV_PCM_TRIGGER_RESUME:
682 		pxa_ssp_enable(ssp);
683 		break;
684 	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
685 		val = pxa_ssp_read_reg(ssp, SSCR1);
686 		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
687 			val |= SSCR1_TSRE;
688 		else
689 			val |= SSCR1_RSRE;
690 		pxa_ssp_write_reg(ssp, SSCR1, val);
691 		val = pxa_ssp_read_reg(ssp, SSSR);
692 		pxa_ssp_write_reg(ssp, SSSR, val);
693 		break;
694 	case SNDRV_PCM_TRIGGER_START:
695 		val = pxa_ssp_read_reg(ssp, SSCR1);
696 		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
697 			val |= SSCR1_TSRE;
698 		else
699 			val |= SSCR1_RSRE;
700 		pxa_ssp_write_reg(ssp, SSCR1, val);
701 		pxa_ssp_enable(ssp);
702 		break;
703 	case SNDRV_PCM_TRIGGER_STOP:
704 		val = pxa_ssp_read_reg(ssp, SSCR1);
705 		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
706 			val &= ~SSCR1_TSRE;
707 		else
708 			val &= ~SSCR1_RSRE;
709 		pxa_ssp_write_reg(ssp, SSCR1, val);
710 		break;
711 	case SNDRV_PCM_TRIGGER_SUSPEND:
712 		pxa_ssp_disable(ssp);
713 		break;
714 	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
715 		val = pxa_ssp_read_reg(ssp, SSCR1);
716 		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
717 			val &= ~SSCR1_TSRE;
718 		else
719 			val &= ~SSCR1_RSRE;
720 		pxa_ssp_write_reg(ssp, SSCR1, val);
721 		break;
722 
723 	default:
724 		ret = -EINVAL;
725 	}
726 
727 	dump_registers(ssp);
728 
729 	return ret;
730 }
731 
732 static int pxa_ssp_probe(struct platform_device *pdev,
733 			    struct snd_soc_dai *dai)
734 {
735 	struct ssp_priv *priv;
736 	int ret;
737 
738 	priv = kzalloc(sizeof(struct ssp_priv), GFP_KERNEL);
739 	if (!priv)
740 		return -ENOMEM;
741 
742 	priv->ssp = pxa_ssp_request(dai->id + 1, "SoC audio");
743 	if (priv->ssp == NULL) {
744 		ret = -ENODEV;
745 		goto err_priv;
746 	}
747 
748 	priv->dai_fmt = (unsigned int) -1;
749 	dai->private_data = priv;
750 
751 	return 0;
752 
753 err_priv:
754 	kfree(priv);
755 	return ret;
756 }
757 
758 static void pxa_ssp_remove(struct platform_device *pdev,
759 			      struct snd_soc_dai *dai)
760 {
761 	struct ssp_priv *priv = dai->private_data;
762 	pxa_ssp_free(priv->ssp);
763 }
764 
765 #define PXA_SSP_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\
766 			  SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |	\
767 			  SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |	\
768 			  SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
769 
770 #define PXA_SSP_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
771 			    SNDRV_PCM_FMTBIT_S24_LE |	\
772 			    SNDRV_PCM_FMTBIT_S32_LE)
773 
774 static struct snd_soc_dai_ops pxa_ssp_dai_ops = {
775 	.startup	= pxa_ssp_startup,
776 	.shutdown	= pxa_ssp_shutdown,
777 	.trigger	= pxa_ssp_trigger,
778 	.hw_params	= pxa_ssp_hw_params,
779 	.set_sysclk	= pxa_ssp_set_dai_sysclk,
780 	.set_clkdiv	= pxa_ssp_set_dai_clkdiv,
781 	.set_pll	= pxa_ssp_set_dai_pll,
782 	.set_fmt	= pxa_ssp_set_dai_fmt,
783 	.set_tdm_slot	= pxa_ssp_set_dai_tdm_slot,
784 	.set_tristate	= pxa_ssp_set_dai_tristate,
785 };
786 
787 struct snd_soc_dai pxa_ssp_dai[] = {
788 	{
789 		.name = "pxa2xx-ssp1",
790 		.id = 0,
791 		.probe = pxa_ssp_probe,
792 		.remove = pxa_ssp_remove,
793 		.suspend = pxa_ssp_suspend,
794 		.resume = pxa_ssp_resume,
795 		.playback = {
796 			.channels_min = 1,
797 			.channels_max = 8,
798 			.rates = PXA_SSP_RATES,
799 			.formats = PXA_SSP_FORMATS,
800 		},
801 		.capture = {
802 			 .channels_min = 1,
803 			 .channels_max = 8,
804 			.rates = PXA_SSP_RATES,
805 			.formats = PXA_SSP_FORMATS,
806 		 },
807 		.ops = &pxa_ssp_dai_ops,
808 	},
809 	{	.name = "pxa2xx-ssp2",
810 		.id = 1,
811 		.probe = pxa_ssp_probe,
812 		.remove = pxa_ssp_remove,
813 		.suspend = pxa_ssp_suspend,
814 		.resume = pxa_ssp_resume,
815 		.playback = {
816 			.channels_min = 1,
817 			.channels_max = 8,
818 			.rates = PXA_SSP_RATES,
819 			.formats = PXA_SSP_FORMATS,
820 		},
821 		.capture = {
822 			.channels_min = 1,
823 			.channels_max = 8,
824 			.rates = PXA_SSP_RATES,
825 			.formats = PXA_SSP_FORMATS,
826 		 },
827 		.ops = &pxa_ssp_dai_ops,
828 	},
829 	{
830 		.name = "pxa2xx-ssp3",
831 		.id = 2,
832 		.probe = pxa_ssp_probe,
833 		.remove = pxa_ssp_remove,
834 		.suspend = pxa_ssp_suspend,
835 		.resume = pxa_ssp_resume,
836 		.playback = {
837 			.channels_min = 1,
838 			.channels_max = 8,
839 			.rates = PXA_SSP_RATES,
840 			.formats = PXA_SSP_FORMATS,
841 		},
842 		.capture = {
843 			.channels_min = 1,
844 			.channels_max = 8,
845 			.rates = PXA_SSP_RATES,
846 			.formats = PXA_SSP_FORMATS,
847 		 },
848 		.ops = &pxa_ssp_dai_ops,
849 	},
850 	{
851 		.name = "pxa2xx-ssp4",
852 		.id = 3,
853 		.probe = pxa_ssp_probe,
854 		.remove = pxa_ssp_remove,
855 		.suspend = pxa_ssp_suspend,
856 		.resume = pxa_ssp_resume,
857 		.playback = {
858 			.channels_min = 1,
859 			.channels_max = 8,
860 			.rates = PXA_SSP_RATES,
861 			.formats = PXA_SSP_FORMATS,
862 		},
863 		.capture = {
864 			.channels_min = 1,
865 			.channels_max = 8,
866 			.rates = PXA_SSP_RATES,
867 			.formats = PXA_SSP_FORMATS,
868 		 },
869 		.ops = &pxa_ssp_dai_ops,
870 	},
871 };
872 EXPORT_SYMBOL_GPL(pxa_ssp_dai);
873 
874 static int __init pxa_ssp_init(void)
875 {
876 	return snd_soc_register_dais(pxa_ssp_dai, ARRAY_SIZE(pxa_ssp_dai));
877 }
878 module_init(pxa_ssp_init);
879 
880 static void __exit pxa_ssp_exit(void)
881 {
882 	snd_soc_unregister_dais(pxa_ssp_dai, ARRAY_SIZE(pxa_ssp_dai));
883 }
884 module_exit(pxa_ssp_exit);
885 
886 /* Module information */
887 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
888 MODULE_DESCRIPTION("PXA SSP/PCM SoC Interface");
889 MODULE_LICENSE("GPL");
890