ASoC: fsl-ssi: Fix baudclock handling
[deliverable/linux.git] / sound / soc / fsl / fsl_ssi.c
CommitLineData
17467f23
TT
1/*
2 * Freescale SSI ALSA SoC Digital Audio Interface (DAI) driver
3 *
4 * Author: Timur Tabi <timur@freescale.com>
5 *
f0fba2ad
LG
6 * Copyright 2007-2010 Freescale Semiconductor, Inc.
7 *
8 * This file is licensed under the terms of the GNU General Public License
9 * version 2. This program is licensed "as is" without any warranty of any
10 * kind, whether express or implied.
de623ece
MP
11 *
12 *
13 * Some notes why imx-pcm-fiq is used instead of DMA on some boards:
14 *
15 * The i.MX SSI core has some nasty limitations in AC97 mode. While most
16 * sane processor vendors have a FIFO per AC97 slot, the i.MX has only
17 * one FIFO which combines all valid receive slots. We cannot even select
18 * which slots we want to receive. The WM9712 with which this driver
19 * was developed with always sends GPIO status data in slot 12 which
20 * we receive in our (PCM-) data stream. The only chance we have is to
21 * manually skip this data in the FIQ handler. With sampling rates different
22 * from 48000Hz not every frame has valid receive data, so the ratio
23 * between pcm data and GPIO status data changes. Our FIQ handler is not
24 * able to handle this, hence this driver only works with 48000Hz sampling
25 * rate.
26 * Reading and writing AC97 registers is another challenge. The core
27 * provides us status bits when the read register is updated with *another*
28 * value. When we read the same register two times (and the register still
29 * contains the same value) these status bits are not set. We work
30 * around this by not polling these bits but only wait a fixed delay.
17467f23
TT
31 */
32
33#include <linux/init.h>
dfa1a107 34#include <linux/io.h>
17467f23
TT
35#include <linux/module.h>
36#include <linux/interrupt.h>
95cd98f9 37#include <linux/clk.h>
17467f23
TT
38#include <linux/device.h>
39#include <linux/delay.h>
5a0e3ad6 40#include <linux/slab.h>
aafa85e7 41#include <linux/spinlock.h>
dfa1a107
SG
42#include <linux/of_address.h>
43#include <linux/of_irq.h>
f0fba2ad 44#include <linux/of_platform.h>
17467f23 45
17467f23
TT
46#include <sound/core.h>
47#include <sound/pcm.h>
48#include <sound/pcm_params.h>
49#include <sound/initval.h>
50#include <sound/soc.h>
a8909c9b 51#include <sound/dmaengine_pcm.h>
17467f23 52
17467f23 53#include "fsl_ssi.h"
09ce1111 54#include "imx-pcm.h"
17467f23 55
dfa1a107
SG
56#ifdef PPC
57#define read_ssi(addr) in_be32(addr)
58#define write_ssi(val, addr) out_be32(addr, val)
59#define write_ssi_mask(addr, clear, set) clrsetbits_be32(addr, clear, set)
0a9eaa39 60#else
dfa1a107
SG
61#define read_ssi(addr) readl(addr)
62#define write_ssi(val, addr) writel(val, addr)
63/*
64 * FIXME: Proper locking should be added at write_ssi_mask caller level
65 * to ensure this register read/modify/write sequence is race free.
66 */
67static inline void write_ssi_mask(u32 __iomem *addr, u32 clear, u32 set)
68{
69 u32 val = readl(addr);
70 val = (val & ~clear) | set;
71 writel(val, addr);
72}
73#endif
74
17467f23
TT
75/**
76 * FSLSSI_I2S_RATES: sample rates supported by the I2S
77 *
78 * This driver currently only supports the SSI running in I2S slave mode,
79 * which means the codec determines the sample rate. Therefore, we tell
80 * ALSA that we support all rates and let the codec driver decide what rates
81 * are really supported.
82 */
24710c97 83#define FSLSSI_I2S_RATES SNDRV_PCM_RATE_CONTINUOUS
17467f23
TT
84
85/**
86 * FSLSSI_I2S_FORMATS: audio formats supported by the SSI
87 *
88 * This driver currently only supports the SSI running in I2S slave mode.
89 *
90 * The SSI has a limitation in that the samples must be in the same byte
91 * order as the host CPU. This is because when multiple bytes are written
92 * to the STX register, the bytes and bits must be written in the same
93 * order. The STX is a shift register, so all the bits need to be aligned
94 * (bit-endianness must match byte-endianness). Processors typically write
95 * the bits within a byte in the same order that the bytes of a word are
96 * written in. So if the host CPU is big-endian, then only big-endian
97 * samples will be written to STX properly.
98 */
99#ifdef __BIG_ENDIAN
100#define FSLSSI_I2S_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_BE | \
101 SNDRV_PCM_FMTBIT_S18_3BE | SNDRV_PCM_FMTBIT_S20_3BE | \
102 SNDRV_PCM_FMTBIT_S24_3BE | SNDRV_PCM_FMTBIT_S24_BE)
103#else
104#define FSLSSI_I2S_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE | \
105 SNDRV_PCM_FMTBIT_S18_3LE | SNDRV_PCM_FMTBIT_S20_3LE | \
106 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE)
107#endif
108
9368acc4
MP
109#define FSLSSI_SIER_DBG_RX_FLAGS (CCSR_SSI_SIER_RFF0_EN | \
110 CCSR_SSI_SIER_RLS_EN | CCSR_SSI_SIER_RFS_EN | \
111 CCSR_SSI_SIER_ROE0_EN | CCSR_SSI_SIER_RFRC_EN)
112#define FSLSSI_SIER_DBG_TX_FLAGS (CCSR_SSI_SIER_TFE0_EN | \
113 CCSR_SSI_SIER_TLS_EN | CCSR_SSI_SIER_TFS_EN | \
114 CCSR_SSI_SIER_TUE0_EN | CCSR_SSI_SIER_TFRC_EN)
c1953bfe
MP
115
116enum fsl_ssi_type {
117 FSL_SSI_MCP8610,
118 FSL_SSI_MX21,
0888efd1 119 FSL_SSI_MX35,
c1953bfe
MP
120 FSL_SSI_MX51,
121};
122
4e6ec0d9
MP
123struct fsl_ssi_reg_val {
124 u32 sier;
125 u32 srcr;
126 u32 stcr;
127 u32 scr;
128};
129
130struct fsl_ssi_rxtx_reg_val {
131 struct fsl_ssi_reg_val rx;
132 struct fsl_ssi_reg_val tx;
133};
d5a908b2 134
fcdbadef
SH
135struct fsl_ssi_soc_data {
136 bool imx;
137 bool offline_config;
138 u32 sisr_write_mask;
139};
140
17467f23
TT
141/**
142 * fsl_ssi_private: per-SSI private data
143 *
17467f23
TT
144 * @ssi: pointer to the SSI's registers
145 * @ssi_phys: physical address of the SSI registers
146 * @irq: IRQ of this SSI
17467f23
TT
147 * @playback: the number of playback streams opened
148 * @capture: the number of capture streams opened
149 * @cpu_dai: the CPU DAI for this device
150 * @dev_attr: the sysfs device attribute structure
151 * @stats: SSI statistics
152 */
153struct fsl_ssi_private {
17467f23
TT
154 struct ccsr_ssi __iomem *ssi;
155 dma_addr_t ssi_phys;
156 unsigned int irq;
8e9d8690 157 unsigned int fifo_depth;
f0fba2ad 158 struct snd_soc_dai_driver cpu_dai_drv;
f0fba2ad 159 struct platform_device *pdev;
171d683d 160 unsigned int dai_fmt;
17467f23 161
de623ece 162 bool use_dma;
0da9e55e 163 bool use_dual_fifo;
2924a998 164 u8 i2s_mode;
aafa85e7 165 struct clk *baudclk;
95cd98f9 166 struct clk *clk;
d429d8e3 167 unsigned int baudclk_streams;
8dd51e23 168 unsigned int bitclk_freq;
a8909c9b
LPC
169 struct snd_dmaengine_dai_dma_data dma_params_tx;
170 struct snd_dmaengine_dai_dma_data dma_params_rx;
de623ece 171 struct imx_pcm_fiq_params fiq_params;
4e6ec0d9
MP
172 /* Register values for rx/tx configuration */
173 struct fsl_ssi_rxtx_reg_val rxtx_reg_val;
09ce1111 174
f138e621 175 struct fsl_ssi_dbg dbg_stats;
17467f23 176
fcdbadef 177 const struct fsl_ssi_soc_data *soc;
c1953bfe 178};
171d683d
MP
179
180/*
181 * imx51 and later SoCs have a slightly different IP that allows the
182 * SSI configuration while the SSI unit is running.
183 *
184 * More important, it is necessary on those SoCs to configure the
185 * sperate TX/RX DMA bits just before starting the stream
186 * (fsl_ssi_trigger). The SDMA unit has to be configured before fsl_ssi
187 * sends any DMA requests to the SDMA unit, otherwise it is not defined
188 * how the SDMA unit handles the DMA request.
189 *
190 * SDMA units are present on devices starting at imx35 but the imx35
191 * reference manual states that the DMA bits should not be changed
192 * while the SSI unit is running (SSIEN). So we support the necessary
193 * online configuration of fsl-ssi starting at imx51.
194 */
171d683d 195
fcdbadef
SH
196static struct fsl_ssi_soc_data fsl_ssi_mpc8610 = {
197 .imx = false,
198 .offline_config = true,
199 .sisr_write_mask = CCSR_SSI_SISR_RFRC | CCSR_SSI_SISR_TFRC |
200 CCSR_SSI_SISR_ROE0 | CCSR_SSI_SISR_ROE1 |
201 CCSR_SSI_SISR_TUE0 | CCSR_SSI_SISR_TUE1,
202};
203
204static struct fsl_ssi_soc_data fsl_ssi_imx21 = {
205 .imx = true,
206 .offline_config = true,
207 .sisr_write_mask = 0,
208};
209
210static struct fsl_ssi_soc_data fsl_ssi_imx35 = {
211 .imx = true,
212 .offline_config = true,
213 .sisr_write_mask = CCSR_SSI_SISR_RFRC | CCSR_SSI_SISR_TFRC |
214 CCSR_SSI_SISR_ROE0 | CCSR_SSI_SISR_ROE1 |
215 CCSR_SSI_SISR_TUE0 | CCSR_SSI_SISR_TUE1,
216};
217
218static struct fsl_ssi_soc_data fsl_ssi_imx51 = {
219 .imx = true,
220 .offline_config = false,
221 .sisr_write_mask = CCSR_SSI_SISR_ROE0 | CCSR_SSI_SISR_ROE1 |
222 CCSR_SSI_SISR_TUE0 | CCSR_SSI_SISR_TUE1,
223};
224
225static const struct of_device_id fsl_ssi_ids[] = {
226 { .compatible = "fsl,mpc8610-ssi", .data = &fsl_ssi_mpc8610 },
227 { .compatible = "fsl,imx51-ssi", .data = &fsl_ssi_imx51 },
228 { .compatible = "fsl,imx35-ssi", .data = &fsl_ssi_imx35 },
229 { .compatible = "fsl,imx21-ssi", .data = &fsl_ssi_imx21 },
230 {}
231};
232MODULE_DEVICE_TABLE(of, fsl_ssi_ids);
233
234static bool fsl_ssi_is_ac97(struct fsl_ssi_private *ssi_private)
235{
236 return !!(ssi_private->dai_fmt & SND_SOC_DAIFMT_AC97);
171d683d
MP
237}
238
8dd51e23
SH
239static bool fsl_ssi_is_i2s_master(struct fsl_ssi_private *ssi_private)
240{
241 return (ssi_private->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) ==
242 SND_SOC_DAIFMT_CBS_CFS;
243}
244
17467f23
TT
245/**
246 * fsl_ssi_isr: SSI interrupt handler
247 *
248 * Although it's possible to use the interrupt handler to send and receive
249 * data to/from the SSI, we use the DMA instead. Programming is more
250 * complicated, but the performance is much better.
251 *
252 * This interrupt handler is used only to gather statistics.
253 *
254 * @irq: IRQ of the SSI device
255 * @dev_id: pointer to the ssi_private structure for this SSI device
256 */
257static irqreturn_t fsl_ssi_isr(int irq, void *dev_id)
258{
259 struct fsl_ssi_private *ssi_private = dev_id;
260 struct ccsr_ssi __iomem *ssi = ssi_private->ssi;
17467f23 261 __be32 sisr;
0888efd1 262 __be32 sisr2;
17467f23
TT
263
264 /* We got an interrupt, so read the status register to see what we
265 were interrupted for. We mask it with the Interrupt Enable register
266 so that we only check for events that we're interested in.
267 */
f138e621 268 sisr = read_ssi(&ssi->sisr);
17467f23 269
fcdbadef 270 sisr2 = sisr & ssi_private->soc->sisr_write_mask;
17467f23
TT
271 /* Clear the bits that we set */
272 if (sisr2)
dfa1a107 273 write_ssi(sisr2, &ssi->sisr);
17467f23 274
f138e621 275 fsl_ssi_dbg_isr(&ssi_private->dbg_stats, sisr);
9368acc4 276
f138e621 277 return IRQ_HANDLED;
9368acc4
MP
278}
279
4e6ec0d9
MP
280/*
281 * Enable/Disable all rx/tx config flags at once.
282 */
283static void fsl_ssi_rxtx_config(struct fsl_ssi_private *ssi_private,
284 bool enable)
285{
286 struct ccsr_ssi __iomem *ssi = ssi_private->ssi;
287 struct fsl_ssi_rxtx_reg_val *vals = &ssi_private->rxtx_reg_val;
288
289 if (enable) {
290 write_ssi_mask(&ssi->sier, 0, vals->rx.sier | vals->tx.sier);
291 write_ssi_mask(&ssi->srcr, 0, vals->rx.srcr | vals->tx.srcr);
292 write_ssi_mask(&ssi->stcr, 0, vals->rx.stcr | vals->tx.stcr);
293 } else {
294 write_ssi_mask(&ssi->srcr, vals->rx.srcr | vals->tx.srcr, 0);
295 write_ssi_mask(&ssi->stcr, vals->rx.stcr | vals->tx.stcr, 0);
296 write_ssi_mask(&ssi->sier, vals->rx.sier | vals->tx.sier, 0);
297 }
298}
299
65c961cc
MP
300/*
301 * Calculate the bits that have to be disabled for the current stream that is
302 * getting disabled. This keeps the bits enabled that are necessary for the
303 * second stream to work if 'stream_active' is true.
304 *
305 * Detailed calculation:
306 * These are the values that need to be active after disabling. For non-active
307 * second stream, this is 0:
308 * vals_stream * !!stream_active
309 *
310 * The following computes the overall differences between the setup for the
311 * to-disable stream and the active stream, a simple XOR:
312 * vals_disable ^ (vals_stream * !!(stream_active))
313 *
314 * The full expression adds a mask on all values we care about
315 */
316#define fsl_ssi_disable_val(vals_disable, vals_stream, stream_active) \
317 ((vals_disable) & \
318 ((vals_disable) ^ ((vals_stream) * (u32)!!(stream_active))))
319
4e6ec0d9
MP
320/*
321 * Enable/Disable a ssi configuration. You have to pass either
322 * ssi_private->rxtx_reg_val.rx or tx as vals parameter.
323 */
324static void fsl_ssi_config(struct fsl_ssi_private *ssi_private, bool enable,
325 struct fsl_ssi_reg_val *vals)
326{
327 struct ccsr_ssi __iomem *ssi = ssi_private->ssi;
328 struct fsl_ssi_reg_val *avals;
329 u32 scr_val = read_ssi(&ssi->scr);
330 int nr_active_streams = !!(scr_val & CCSR_SSI_SCR_TE) +
331 !!(scr_val & CCSR_SSI_SCR_RE);
65c961cc
MP
332 int keep_active;
333
334 if (nr_active_streams - 1 > 0)
335 keep_active = 1;
336 else
337 keep_active = 0;
4e6ec0d9
MP
338
339 /* Find the other direction values rx or tx which we do not want to
340 * modify */
341 if (&ssi_private->rxtx_reg_val.rx == vals)
342 avals = &ssi_private->rxtx_reg_val.tx;
343 else
344 avals = &ssi_private->rxtx_reg_val.rx;
345
346 /* If vals should be disabled, start with disabling the unit */
347 if (!enable) {
65c961cc
MP
348 u32 scr = fsl_ssi_disable_val(vals->scr, avals->scr,
349 keep_active);
4e6ec0d9
MP
350 write_ssi_mask(&ssi->scr, scr, 0);
351 }
352
353 /*
354 * We are running on a SoC which does not support online SSI
355 * reconfiguration, so we have to enable all necessary flags at once
356 * even if we do not use them later (capture and playback configuration)
357 */
fcdbadef 358 if (ssi_private->soc->offline_config) {
4e6ec0d9 359 if ((enable && !nr_active_streams) ||
65c961cc 360 (!enable && !keep_active))
4e6ec0d9
MP
361 fsl_ssi_rxtx_config(ssi_private, enable);
362
363 goto config_done;
364 }
365
366 /*
367 * Configure single direction units while the SSI unit is running
368 * (online configuration)
369 */
370 if (enable) {
371 write_ssi_mask(&ssi->sier, 0, vals->sier);
372 write_ssi_mask(&ssi->srcr, 0, vals->srcr);
373 write_ssi_mask(&ssi->stcr, 0, vals->stcr);
374 } else {
375 u32 sier;
376 u32 srcr;
377 u32 stcr;
378
379 /*
380 * Disabling the necessary flags for one of rx/tx while the
381 * other stream is active is a little bit more difficult. We
382 * have to disable only those flags that differ between both
383 * streams (rx XOR tx) and that are set in the stream that is
384 * disabled now. Otherwise we could alter flags of the other
385 * stream
386 */
387
388 /* These assignments are simply vals without bits set in avals*/
65c961cc
MP
389 sier = fsl_ssi_disable_val(vals->sier, avals->sier,
390 keep_active);
391 srcr = fsl_ssi_disable_val(vals->srcr, avals->srcr,
392 keep_active);
393 stcr = fsl_ssi_disable_val(vals->stcr, avals->stcr,
394 keep_active);
4e6ec0d9
MP
395
396 write_ssi_mask(&ssi->srcr, srcr, 0);
397 write_ssi_mask(&ssi->stcr, stcr, 0);
398 write_ssi_mask(&ssi->sier, sier, 0);
399 }
400
401config_done:
402 /* Enabling of subunits is done after configuration */
403 if (enable)
404 write_ssi_mask(&ssi->scr, 0, vals->scr);
405}
406
407
408static void fsl_ssi_rx_config(struct fsl_ssi_private *ssi_private, bool enable)
409{
410 fsl_ssi_config(ssi_private, enable, &ssi_private->rxtx_reg_val.rx);
411}
412
413static void fsl_ssi_tx_config(struct fsl_ssi_private *ssi_private, bool enable)
414{
415 fsl_ssi_config(ssi_private, enable, &ssi_private->rxtx_reg_val.tx);
416}
417
6de83879
MP
418/*
419 * Setup rx/tx register values used to enable/disable the streams. These will
420 * be used later in fsl_ssi_config to setup the streams without the need to
421 * check for all different SSI modes.
422 */
423static void fsl_ssi_setup_reg_vals(struct fsl_ssi_private *ssi_private)
424{
425 struct fsl_ssi_rxtx_reg_val *reg = &ssi_private->rxtx_reg_val;
426
427 reg->rx.sier = CCSR_SSI_SIER_RFF0_EN;
428 reg->rx.srcr = CCSR_SSI_SRCR_RFEN0;
429 reg->rx.scr = 0;
430 reg->tx.sier = CCSR_SSI_SIER_TFE0_EN;
431 reg->tx.stcr = CCSR_SSI_STCR_TFEN0;
432 reg->tx.scr = 0;
433
171d683d 434 if (!fsl_ssi_is_ac97(ssi_private)) {
6de83879
MP
435 reg->rx.scr = CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_RE;
436 reg->rx.sier |= CCSR_SSI_SIER_RFF0_EN;
437 reg->tx.scr = CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_TE;
438 reg->tx.sier |= CCSR_SSI_SIER_TFE0_EN;
439 }
440
441 if (ssi_private->use_dma) {
442 reg->rx.sier |= CCSR_SSI_SIER_RDMAE;
443 reg->tx.sier |= CCSR_SSI_SIER_TDMAE;
444 } else {
445 reg->rx.sier |= CCSR_SSI_SIER_RIE;
446 reg->tx.sier |= CCSR_SSI_SIER_TIE;
447 }
448
449 reg->rx.sier |= FSLSSI_SIER_DBG_RX_FLAGS;
450 reg->tx.sier |= FSLSSI_SIER_DBG_TX_FLAGS;
451}
452
d8764646
MP
453static void fsl_ssi_setup_ac97(struct fsl_ssi_private *ssi_private)
454{
455 struct ccsr_ssi __iomem *ssi = ssi_private->ssi;
456
457 /*
458 * Setup the clock control register
459 */
460 write_ssi(CCSR_SSI_SxCCR_WL(17) | CCSR_SSI_SxCCR_DC(13),
461 &ssi->stccr);
462 write_ssi(CCSR_SSI_SxCCR_WL(17) | CCSR_SSI_SxCCR_DC(13),
463 &ssi->srccr);
464
465 /*
466 * Enable AC97 mode and startup the SSI
467 */
468 write_ssi(CCSR_SSI_SACNT_AC97EN | CCSR_SSI_SACNT_FV,
469 &ssi->sacnt);
470 write_ssi(0xff, &ssi->saccdis);
471 write_ssi(0x300, &ssi->saccen);
472
473 /*
474 * Enable SSI, Transmit and Receive. AC97 has to communicate with the
475 * codec before a stream is started.
476 */
477 write_ssi_mask(&ssi->scr, 0, CCSR_SSI_SCR_SSIEN |
478 CCSR_SSI_SCR_TE | CCSR_SSI_SCR_RE);
479
480 write_ssi(CCSR_SSI_SOR_WAIT(3), &ssi->sor);
481}
482
17467f23
TT
483/**
484 * fsl_ssi_startup: create a new substream
485 *
486 * This is the first function called when a stream is opened.
487 *
488 * If this is the first stream open, then grab the IRQ and program most of
489 * the SSI registers.
490 */
dee89c4d
MB
491static int fsl_ssi_startup(struct snd_pcm_substream *substream,
492 struct snd_soc_dai *dai)
17467f23
TT
493{
494 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5e538eca
TT
495 struct fsl_ssi_private *ssi_private =
496 snd_soc_dai_get_drvdata(rtd->cpu_dai);
17467f23 497
0da9e55e
NC
498 /* When using dual fifo mode, it is safer to ensure an even period
499 * size. If appearing to an odd number while DMA always starts its
500 * task from fifo0, fifo1 would be neglected at the end of each
501 * period. But SSI would still access fifo1 with an invalid data.
502 */
503 if (ssi_private->use_dual_fifo)
504 snd_pcm_hw_constraint_step(substream->runtime, 0,
505 SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 2);
506
17467f23
TT
507 return 0;
508}
509
ee9daad4 510/**
8dd51e23 511 * fsl_ssi_set_bclk - configure Digital Audio Interface bit clock
ee9daad4
SH
512 *
513 * Note: This function can be only called when using SSI as DAI master
514 *
515 * Quick instruction for parameters:
516 * freq: Output BCLK frequency = samplerate * 32 (fixed) * channels
517 * dir: SND_SOC_CLOCK_OUT -> TxBCLK, SND_SOC_CLOCK_IN -> RxBCLK.
518 */
8dd51e23
SH
519static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,
520 struct snd_soc_dai *cpu_dai,
521 struct snd_pcm_hw_params *hw_params)
ee9daad4
SH
522{
523 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai);
524 struct ccsr_ssi __iomem *ssi = ssi_private->ssi;
525 int synchronous = ssi_private->cpu_dai_drv.symmetric_rates, ret;
526 u32 pm = 999, div2, psr, stccr, mask, afreq, factor, i;
d8ced479 527 unsigned long clkrate, baudrate, tmprate;
ee9daad4 528 u64 sub, savesub = 100000;
8dd51e23 529 unsigned int freq;
d429d8e3 530 bool baudclk_is_used;
8dd51e23
SH
531
532 /* Prefer the explicitly set bitclock frequency */
533 if (ssi_private->bitclk_freq)
534 freq = ssi_private->bitclk_freq;
535 else
536 freq = params_channels(hw_params) * 32 * params_rate(hw_params);
ee9daad4
SH
537
538 /* Don't apply it to any non-baudclk circumstance */
539 if (IS_ERR(ssi_private->baudclk))
540 return -EINVAL;
541
d429d8e3
MP
542 baudclk_is_used = ssi_private->baudclk_streams & ~(BIT(substream->stream));
543
ee9daad4
SH
544 /* It should be already enough to divide clock by setting pm alone */
545 psr = 0;
546 div2 = 0;
547
548 factor = (div2 + 1) * (7 * psr + 1) * 2;
549
550 for (i = 0; i < 255; i++) {
551 /* The bclk rate must be smaller than 1/5 sysclk rate */
552 if (factor * (i + 1) < 5)
553 continue;
554
555 tmprate = freq * factor * (i + 2);
d429d8e3
MP
556
557 if (baudclk_is_used)
558 clkrate = clk_get_rate(ssi_private->baudclk);
559 else
560 clkrate = clk_round_rate(ssi_private->baudclk, tmprate);
ee9daad4
SH
561
562 do_div(clkrate, factor);
563 afreq = (u32)clkrate / (i + 1);
564
565 if (freq == afreq)
566 sub = 0;
567 else if (freq / afreq == 1)
568 sub = freq - afreq;
569 else if (afreq / freq == 1)
570 sub = afreq - freq;
571 else
572 continue;
573
574 /* Calculate the fraction */
575 sub *= 100000;
576 do_div(sub, freq);
577
578 if (sub < savesub) {
579 baudrate = tmprate;
580 savesub = sub;
581 pm = i;
582 }
583
584 /* We are lucky */
585 if (savesub == 0)
586 break;
587 }
588
589 /* No proper pm found if it is still remaining the initial value */
590 if (pm == 999) {
591 dev_err(cpu_dai->dev, "failed to handle the required sysclk\n");
592 return -EINVAL;
593 }
594
595 stccr = CCSR_SSI_SxCCR_PM(pm + 1) | (div2 ? CCSR_SSI_SxCCR_DIV2 : 0) |
596 (psr ? CCSR_SSI_SxCCR_PSR : 0);
597 mask = CCSR_SSI_SxCCR_PM_MASK | CCSR_SSI_SxCCR_DIV2 |
598 CCSR_SSI_SxCCR_PSR;
599
8dd51e23 600 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || synchronous)
ee9daad4
SH
601 write_ssi_mask(&ssi->stccr, mask, stccr);
602 else
603 write_ssi_mask(&ssi->srccr, mask, stccr);
604
d429d8e3 605 if (!baudclk_is_used) {
ee9daad4
SH
606 ret = clk_set_rate(ssi_private->baudclk, baudrate);
607 if (ret) {
ee9daad4
SH
608 dev_err(cpu_dai->dev, "failed to set baudclk rate\n");
609 return -EINVAL;
610 }
ee9daad4 611 }
ee9daad4
SH
612
613 return 0;
614}
615
8dd51e23
SH
616static int fsl_ssi_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
617 int clk_id, unsigned int freq, int dir)
618{
619 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai);
620
621 ssi_private->bitclk_freq = freq;
622
623 return 0;
624}
625
17467f23 626/**
85ef2375 627 * fsl_ssi_hw_params - program the sample size
17467f23
TT
628 *
629 * Most of the SSI registers have been programmed in the startup function,
630 * but the word length must be programmed here. Unfortunately, programming
631 * the SxCCR.WL bits requires the SSI to be temporarily disabled. This can
632 * cause a problem with supporting simultaneous playback and capture. If
633 * the SSI is already playing a stream, then that stream may be temporarily
634 * stopped when you start capture.
635 *
636 * Note: The SxCCR.DC and SxCCR.PM bits are only used if the SSI is the
637 * clock master.
638 */
85ef2375
TT
639static int fsl_ssi_hw_params(struct snd_pcm_substream *substream,
640 struct snd_pcm_hw_params *hw_params, struct snd_soc_dai *cpu_dai)
17467f23 641{
f0fba2ad 642 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai);
5e538eca 643 struct ccsr_ssi __iomem *ssi = ssi_private->ssi;
2924a998 644 unsigned int channels = params_channels(hw_params);
5e538eca
TT
645 unsigned int sample_size =
646 snd_pcm_format_width(params_format(hw_params));
647 u32 wl = CCSR_SSI_SxCCR_WL(sample_size);
dfa1a107 648 int enabled = read_ssi(&ssi->scr) & CCSR_SSI_SCR_SSIEN;
8dd51e23 649 int ret;
17467f23 650
5e538eca
TT
651 /*
652 * If we're in synchronous mode, and the SSI is already enabled,
653 * then STCCR is already set properly.
654 */
655 if (enabled && ssi_private->cpu_dai_drv.symmetric_rates)
656 return 0;
17467f23 657
8dd51e23
SH
658 if (fsl_ssi_is_i2s_master(ssi_private)) {
659 ret = fsl_ssi_set_bclk(substream, cpu_dai, hw_params);
660 if (ret)
661 return ret;
d429d8e3
MP
662
663 /* Do not enable the clock if it is already enabled */
664 if (!(ssi_private->baudclk_streams & BIT(substream->stream))) {
665 ret = clk_prepare_enable(ssi_private->baudclk);
666 if (ret)
667 return ret;
668
669 ssi_private->baudclk_streams |= BIT(substream->stream);
670 }
8dd51e23
SH
671 }
672
5e538eca
TT
673 /*
674 * FIXME: The documentation says that SxCCR[WL] should not be
675 * modified while the SSI is enabled. The only time this can
676 * happen is if we're trying to do simultaneous playback and
677 * capture in asynchronous mode. Unfortunately, I have been enable
678 * to get that to work at all on the P1022DS. Therefore, we don't
679 * bother to disable/enable the SSI when setting SxCCR[WL], because
680 * the SSI will stop anyway. Maybe one day, this will get fixed.
681 */
17467f23 682
5e538eca
TT
683 /* In synchronous mode, the SSI uses STCCR for capture */
684 if ((substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ||
685 ssi_private->cpu_dai_drv.symmetric_rates)
dfa1a107 686 write_ssi_mask(&ssi->stccr, CCSR_SSI_SxCCR_WL_MASK, wl);
5e538eca 687 else
dfa1a107 688 write_ssi_mask(&ssi->srccr, CCSR_SSI_SxCCR_WL_MASK, wl);
17467f23 689
171d683d 690 if (!fsl_ssi_is_ac97(ssi_private))
2924a998
NC
691 write_ssi_mask(&ssi->scr,
692 CCSR_SSI_SCR_NET | CCSR_SSI_SCR_I2S_MODE_MASK,
693 channels == 1 ? 0 : ssi_private->i2s_mode);
694
17467f23
TT
695 return 0;
696}
697
d429d8e3
MP
698static int fsl_ssi_hw_free(struct snd_pcm_substream *substream,
699 struct snd_soc_dai *cpu_dai)
700{
701 struct snd_soc_pcm_runtime *rtd = substream->private_data;
702 struct fsl_ssi_private *ssi_private =
703 snd_soc_dai_get_drvdata(rtd->cpu_dai);
704
705 if (fsl_ssi_is_i2s_master(ssi_private) &&
706 ssi_private->baudclk_streams & BIT(substream->stream)) {
707 clk_disable_unprepare(ssi_private->baudclk);
708 ssi_private->baudclk_streams &= ~BIT(substream->stream);
709 }
710
711 return 0;
712}
713
85e59af2
MP
714static int _fsl_ssi_set_dai_fmt(struct fsl_ssi_private *ssi_private,
715 unsigned int fmt)
aafa85e7 716{
aafa85e7
NC
717 struct ccsr_ssi __iomem *ssi = ssi_private->ssi;
718 u32 strcr = 0, stcr, srcr, scr, mask;
2b0db996
MP
719 u8 wm;
720
171d683d
MP
721 ssi_private->dai_fmt = fmt;
722
d429d8e3
MP
723 if (fsl_ssi_is_i2s_master(ssi_private) && IS_ERR(ssi_private->baudclk)) {
724 dev_err(&ssi_private->pdev->dev, "baudclk is missing which is necessary for master mode\n");
725 return -EINVAL;
726 }
727
2b0db996 728 fsl_ssi_setup_reg_vals(ssi_private);
aafa85e7
NC
729
730 scr = read_ssi(&ssi->scr) & ~(CCSR_SSI_SCR_SYN | CCSR_SSI_SCR_I2S_MODE_MASK);
50489479 731 scr |= CCSR_SSI_SCR_SYNC_TX_FS;
aafa85e7
NC
732
733 mask = CCSR_SSI_STCR_TXBIT0 | CCSR_SSI_STCR_TFDIR | CCSR_SSI_STCR_TXDIR |
734 CCSR_SSI_STCR_TSCKP | CCSR_SSI_STCR_TFSI | CCSR_SSI_STCR_TFSL |
735 CCSR_SSI_STCR_TEFS;
736 stcr = read_ssi(&ssi->stcr) & ~mask;
737 srcr = read_ssi(&ssi->srcr) & ~mask;
738
07a28dbe 739 ssi_private->i2s_mode = CCSR_SSI_SCR_NET;
aafa85e7
NC
740 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
741 case SND_SOC_DAIFMT_I2S:
742 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
743 case SND_SOC_DAIFMT_CBS_CFS:
07a28dbe 744 ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_MASTER;
b5dd91b3
SH
745 write_ssi_mask(&ssi->stccr, CCSR_SSI_SxCCR_DC_MASK,
746 CCSR_SSI_SxCCR_DC(2));
747 write_ssi_mask(&ssi->srccr, CCSR_SSI_SxCCR_DC_MASK,
748 CCSR_SSI_SxCCR_DC(2));
aafa85e7
NC
749 break;
750 case SND_SOC_DAIFMT_CBM_CFM:
07a28dbe 751 ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_SLAVE;
aafa85e7
NC
752 break;
753 default:
754 return -EINVAL;
755 }
aafa85e7
NC
756
757 /* Data on rising edge of bclk, frame low, 1clk before data */
758 strcr |= CCSR_SSI_STCR_TFSI | CCSR_SSI_STCR_TSCKP |
759 CCSR_SSI_STCR_TXBIT0 | CCSR_SSI_STCR_TEFS;
760 break;
761 case SND_SOC_DAIFMT_LEFT_J:
762 /* Data on rising edge of bclk, frame high */
763 strcr |= CCSR_SSI_STCR_TXBIT0 | CCSR_SSI_STCR_TSCKP;
764 break;
765 case SND_SOC_DAIFMT_DSP_A:
766 /* Data on rising edge of bclk, frame high, 1clk before data */
767 strcr |= CCSR_SSI_STCR_TFSL | CCSR_SSI_STCR_TSCKP |
768 CCSR_SSI_STCR_TXBIT0 | CCSR_SSI_STCR_TEFS;
769 break;
770 case SND_SOC_DAIFMT_DSP_B:
771 /* Data on rising edge of bclk, frame high */
772 strcr |= CCSR_SSI_STCR_TFSL | CCSR_SSI_STCR_TSCKP |
773 CCSR_SSI_STCR_TXBIT0;
774 break;
2b0db996 775 case SND_SOC_DAIFMT_AC97:
07a28dbe 776 ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_NORMAL;
2b0db996 777 break;
aafa85e7
NC
778 default:
779 return -EINVAL;
780 }
2b0db996 781 scr |= ssi_private->i2s_mode;
aafa85e7
NC
782
783 /* DAI clock inversion */
784 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
785 case SND_SOC_DAIFMT_NB_NF:
786 /* Nothing to do for both normal cases */
787 break;
788 case SND_SOC_DAIFMT_IB_NF:
789 /* Invert bit clock */
790 strcr ^= CCSR_SSI_STCR_TSCKP;
791 break;
792 case SND_SOC_DAIFMT_NB_IF:
793 /* Invert frame clock */
794 strcr ^= CCSR_SSI_STCR_TFSI;
795 break;
796 case SND_SOC_DAIFMT_IB_IF:
797 /* Invert both clocks */
798 strcr ^= CCSR_SSI_STCR_TSCKP;
799 strcr ^= CCSR_SSI_STCR_TFSI;
800 break;
801 default:
802 return -EINVAL;
803 }
804
805 /* DAI clock master masks */
806 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
807 case SND_SOC_DAIFMT_CBS_CFS:
808 strcr |= CCSR_SSI_STCR_TFDIR | CCSR_SSI_STCR_TXDIR;
809 scr |= CCSR_SSI_SCR_SYS_CLK_EN;
810 break;
811 case SND_SOC_DAIFMT_CBM_CFM:
812 scr &= ~CCSR_SSI_SCR_SYS_CLK_EN;
813 break;
814 default:
815 return -EINVAL;
816 }
817
818 stcr |= strcr;
819 srcr |= strcr;
820
821 if (ssi_private->cpu_dai_drv.symmetric_rates) {
822 /* Need to clear RXDIR when using SYNC mode */
823 srcr &= ~CCSR_SSI_SRCR_RXDIR;
824 scr |= CCSR_SSI_SCR_SYN;
825 }
826
827 write_ssi(stcr, &ssi->stcr);
828 write_ssi(srcr, &ssi->srcr);
829 write_ssi(scr, &ssi->scr);
830
2b0db996
MP
831 /*
832 * Set the watermark for transmit FIFI 0 and receive FIFO 0. We don't
833 * use FIFO 1. We program the transmit water to signal a DMA transfer
834 * if there are only two (or fewer) elements left in the FIFO. Two
835 * elements equals one frame (left channel, right channel). This value,
836 * however, depends on the depth of the transmit buffer.
837 *
838 * We set the watermark on the same level as the DMA burstsize. For
839 * fiq it is probably better to use the biggest possible watermark
840 * size.
841 */
842 if (ssi_private->use_dma)
843 wm = ssi_private->fifo_depth - 2;
844 else
845 wm = ssi_private->fifo_depth;
846
847 write_ssi(CCSR_SSI_SFCSR_TFWM0(wm) | CCSR_SSI_SFCSR_RFWM0(wm) |
848 CCSR_SSI_SFCSR_TFWM1(wm) | CCSR_SSI_SFCSR_RFWM1(wm),
849 &ssi->sfcsr);
850
851 if (ssi_private->use_dual_fifo) {
852 write_ssi_mask(&ssi->srcr, CCSR_SSI_SRCR_RFEN1,
853 CCSR_SSI_SRCR_RFEN1);
854 write_ssi_mask(&ssi->stcr, CCSR_SSI_STCR_TFEN1,
855 CCSR_SSI_STCR_TFEN1);
856 write_ssi_mask(&ssi->scr, CCSR_SSI_SCR_TCH_EN,
857 CCSR_SSI_SCR_TCH_EN);
858 }
859
860 if (fmt & SND_SOC_DAIFMT_AC97)
861 fsl_ssi_setup_ac97(ssi_private);
862
aafa85e7 863 return 0;
85e59af2
MP
864
865}
866
867/**
868 * fsl_ssi_set_dai_fmt - configure Digital Audio Interface Format.
869 */
870static int fsl_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
871{
872 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai);
873
874 return _fsl_ssi_set_dai_fmt(ssi_private, fmt);
aafa85e7
NC
875}
876
aafa85e7
NC
877/**
878 * fsl_ssi_set_dai_tdm_slot - set TDM slot number
879 *
880 * Note: This function can be only called when using SSI as DAI master
881 */
882static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask,
883 u32 rx_mask, int slots, int slot_width)
884{
885 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai);
886 struct ccsr_ssi __iomem *ssi = ssi_private->ssi;
887 u32 val;
888
889 /* The slot number should be >= 2 if using Network mode or I2S mode */
890 val = read_ssi(&ssi->scr) & (CCSR_SSI_SCR_I2S_MODE_MASK | CCSR_SSI_SCR_NET);
891 if (val && slots < 2) {
892 dev_err(cpu_dai->dev, "slot number should be >= 2 in I2S or NET\n");
893 return -EINVAL;
894 }
895
896 write_ssi_mask(&ssi->stccr, CCSR_SSI_SxCCR_DC_MASK,
897 CCSR_SSI_SxCCR_DC(slots));
898 write_ssi_mask(&ssi->srccr, CCSR_SSI_SxCCR_DC_MASK,
899 CCSR_SSI_SxCCR_DC(slots));
900
901 /* The register SxMSKs needs SSI to provide essential clock due to
902 * hardware design. So we here temporarily enable SSI to set them.
903 */
904 val = read_ssi(&ssi->scr) & CCSR_SSI_SCR_SSIEN;
905 write_ssi_mask(&ssi->scr, 0, CCSR_SSI_SCR_SSIEN);
906
907 write_ssi(tx_mask, &ssi->stmsk);
908 write_ssi(rx_mask, &ssi->srmsk);
909
910 write_ssi_mask(&ssi->scr, CCSR_SSI_SCR_SSIEN, val);
911
912 return 0;
913}
914
17467f23
TT
915/**
916 * fsl_ssi_trigger: start and stop the DMA transfer.
917 *
918 * This function is called by ALSA to start, stop, pause, and resume the DMA
919 * transfer of data.
920 *
921 * The DMA channel is in external master start and pause mode, which
922 * means the SSI completely controls the flow of data.
923 */
dee89c4d
MB
924static int fsl_ssi_trigger(struct snd_pcm_substream *substream, int cmd,
925 struct snd_soc_dai *dai)
17467f23
TT
926{
927 struct snd_soc_pcm_runtime *rtd = substream->private_data;
f0fba2ad 928 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(rtd->cpu_dai);
17467f23 929 struct ccsr_ssi __iomem *ssi = ssi_private->ssi;
9b443e3d 930
17467f23
TT
931 switch (cmd) {
932 case SNDRV_PCM_TRIGGER_START:
b20e53a8 933 case SNDRV_PCM_TRIGGER_RESUME:
17467f23 934 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
a4d11fe5 935 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
6de83879 936 fsl_ssi_tx_config(ssi_private, true);
a4d11fe5 937 else
6de83879 938 fsl_ssi_rx_config(ssi_private, true);
17467f23
TT
939 break;
940
941 case SNDRV_PCM_TRIGGER_STOP:
b20e53a8 942 case SNDRV_PCM_TRIGGER_SUSPEND:
17467f23
TT
943 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
944 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
6de83879 945 fsl_ssi_tx_config(ssi_private, false);
17467f23 946 else
6de83879 947 fsl_ssi_rx_config(ssi_private, false);
17467f23
TT
948 break;
949
950 default:
951 return -EINVAL;
952 }
953
171d683d 954 if (fsl_ssi_is_ac97(ssi_private)) {
a5a7ee7c
MP
955 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
956 write_ssi(CCSR_SSI_SOR_TX_CLR, &ssi->sor);
957 else
958 write_ssi(CCSR_SSI_SOR_RX_CLR, &ssi->sor);
959 }
9b443e3d 960
17467f23
TT
961 return 0;
962}
963
fc8ba7f9
LPC
964static int fsl_ssi_dai_probe(struct snd_soc_dai *dai)
965{
966 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(dai);
967
fcdbadef 968 if (ssi_private->soc->imx && ssi_private->use_dma) {
fc8ba7f9
LPC
969 dai->playback_dma_data = &ssi_private->dma_params_tx;
970 dai->capture_dma_data = &ssi_private->dma_params_rx;
971 }
972
973 return 0;
974}
975
85e7652d 976static const struct snd_soc_dai_ops fsl_ssi_dai_ops = {
6335d055
EM
977 .startup = fsl_ssi_startup,
978 .hw_params = fsl_ssi_hw_params,
d429d8e3 979 .hw_free = fsl_ssi_hw_free,
aafa85e7
NC
980 .set_fmt = fsl_ssi_set_dai_fmt,
981 .set_sysclk = fsl_ssi_set_dai_sysclk,
982 .set_tdm_slot = fsl_ssi_set_dai_tdm_slot,
6335d055 983 .trigger = fsl_ssi_trigger,
6335d055
EM
984};
985
f0fba2ad
LG
986/* Template for the CPU dai driver structure */
987static struct snd_soc_dai_driver fsl_ssi_dai_template = {
fc8ba7f9 988 .probe = fsl_ssi_dai_probe,
17467f23 989 .playback = {
2924a998 990 .channels_min = 1,
17467f23
TT
991 .channels_max = 2,
992 .rates = FSLSSI_I2S_RATES,
993 .formats = FSLSSI_I2S_FORMATS,
994 },
995 .capture = {
2924a998 996 .channels_min = 1,
17467f23
TT
997 .channels_max = 2,
998 .rates = FSLSSI_I2S_RATES,
999 .formats = FSLSSI_I2S_FORMATS,
1000 },
6335d055 1001 .ops = &fsl_ssi_dai_ops,
17467f23
TT
1002};
1003
3580aa10
KM
1004static const struct snd_soc_component_driver fsl_ssi_component = {
1005 .name = "fsl-ssi",
1006};
1007
cd7f0295
MP
1008static struct snd_soc_dai_driver fsl_ssi_ac97_dai = {
1009 .ac97_control = 1,
1010 .playback = {
1011 .stream_name = "AC97 Playback",
1012 .channels_min = 2,
1013 .channels_max = 2,
1014 .rates = SNDRV_PCM_RATE_8000_48000,
1015 .formats = SNDRV_PCM_FMTBIT_S16_LE,
1016 },
1017 .capture = {
1018 .stream_name = "AC97 Capture",
1019 .channels_min = 2,
1020 .channels_max = 2,
1021 .rates = SNDRV_PCM_RATE_48000,
1022 .formats = SNDRV_PCM_FMTBIT_S16_LE,
1023 },
a5a7ee7c 1024 .ops = &fsl_ssi_dai_ops,
cd7f0295
MP
1025};
1026
1027
1028static struct fsl_ssi_private *fsl_ac97_data;
1029
a851a2bb 1030static void fsl_ssi_ac97_write(struct snd_ac97 *ac97, unsigned short reg,
cd7f0295
MP
1031 unsigned short val)
1032{
1033 struct ccsr_ssi *ssi = fsl_ac97_data->ssi;
1034 unsigned int lreg;
1035 unsigned int lval;
1036
1037 if (reg > 0x7f)
1038 return;
1039
1040
1041 lreg = reg << 12;
1042 write_ssi(lreg, &ssi->sacadd);
1043
1044 lval = val << 4;
1045 write_ssi(lval , &ssi->sacdat);
1046
1047 write_ssi_mask(&ssi->sacnt, CCSR_SSI_SACNT_RDWR_MASK,
1048 CCSR_SSI_SACNT_WR);
1049 udelay(100);
1050}
1051
a851a2bb 1052static unsigned short fsl_ssi_ac97_read(struct snd_ac97 *ac97,
cd7f0295
MP
1053 unsigned short reg)
1054{
1055 struct ccsr_ssi *ssi = fsl_ac97_data->ssi;
1056
1057 unsigned short val = -1;
1058 unsigned int lreg;
1059
1060 lreg = (reg & 0x7f) << 12;
1061 write_ssi(lreg, &ssi->sacadd);
1062 write_ssi_mask(&ssi->sacnt, CCSR_SSI_SACNT_RDWR_MASK,
1063 CCSR_SSI_SACNT_RD);
1064
1065 udelay(100);
1066
1067 val = (read_ssi(&ssi->sacdat) >> 4) & 0xffff;
1068
1069 return val;
1070}
1071
1072static struct snd_ac97_bus_ops fsl_ssi_ac97_ops = {
1073 .read = fsl_ssi_ac97_read,
1074 .write = fsl_ssi_ac97_write,
1075};
1076
17467f23 1077/**
f0fba2ad 1078 * Make every character in a string lower-case
17467f23 1079 */
f0fba2ad
LG
1080static void make_lowercase(char *s)
1081{
1082 char *p = s;
1083 char c;
1084
1085 while ((c = *p)) {
1086 if ((c >= 'A') && (c <= 'Z'))
1087 *p = c + ('a' - 'A');
1088 p++;
1089 }
1090}
1091
49da09e2 1092static int fsl_ssi_imx_probe(struct platform_device *pdev,
4d9b7926 1093 struct fsl_ssi_private *ssi_private, void __iomem *iomem)
49da09e2
MP
1094{
1095 struct device_node *np = pdev->dev.of_node;
ed0f1604 1096 u32 dmas[4];
49da09e2
MP
1097 int ret;
1098
1099 ssi_private->clk = devm_clk_get(&pdev->dev, NULL);
1100 if (IS_ERR(ssi_private->clk)) {
1101 ret = PTR_ERR(ssi_private->clk);
1102 dev_err(&pdev->dev, "could not get clock: %d\n", ret);
1103 return ret;
1104 }
1105
1106 ret = clk_prepare_enable(ssi_private->clk);
1107 if (ret) {
1108 dev_err(&pdev->dev, "clk_prepare_enable failed: %d\n", ret);
1109 return ret;
1110 }
1111
1112 /* For those SLAVE implementations, we ingore non-baudclk cases
1113 * and, instead, abandon MASTER mode that needs baud clock.
1114 */
1115 ssi_private->baudclk = devm_clk_get(&pdev->dev, "baud");
1116 if (IS_ERR(ssi_private->baudclk))
1117 dev_dbg(&pdev->dev, "could not get baud clock: %ld\n",
1118 PTR_ERR(ssi_private->baudclk));
49da09e2
MP
1119
1120 /*
1121 * We have burstsize be "fifo_depth - 2" to match the SSI
1122 * watermark setting in fsl_ssi_startup().
1123 */
1124 ssi_private->dma_params_tx.maxburst = ssi_private->fifo_depth - 2;
1125 ssi_private->dma_params_rx.maxburst = ssi_private->fifo_depth - 2;
1126 ssi_private->dma_params_tx.addr = ssi_private->ssi_phys +
1127 offsetof(struct ccsr_ssi, stx0);
1128 ssi_private->dma_params_rx.addr = ssi_private->ssi_phys +
1129 offsetof(struct ccsr_ssi, srx0);
49da09e2 1130
ed0f1604
MP
1131 ret = !of_property_read_u32_array(np, "dmas", dmas, 4);
1132 if (ssi_private->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL) {
49da09e2
MP
1133 ssi_private->use_dual_fifo = true;
1134 /* When using dual fifo mode, we need to keep watermark
1135 * as even numbers due to dma script limitation.
1136 */
1137 ssi_private->dma_params_tx.maxburst &= ~0x1;
1138 ssi_private->dma_params_rx.maxburst &= ~0x1;
1139 }
1140
4d9b7926
MP
1141 if (!ssi_private->use_dma) {
1142
1143 /*
1144 * Some boards use an incompatible codec. To get it
1145 * working, we are using imx-fiq-pcm-audio, that
1146 * can handle those codecs. DMA is not possible in this
1147 * situation.
1148 */
1149
1150 ssi_private->fiq_params.irq = ssi_private->irq;
1151 ssi_private->fiq_params.base = iomem;
1152 ssi_private->fiq_params.dma_params_rx =
1153 &ssi_private->dma_params_rx;
1154 ssi_private->fiq_params.dma_params_tx =
1155 &ssi_private->dma_params_tx;
1156
1157 ret = imx_pcm_fiq_init(pdev, &ssi_private->fiq_params);
1158 if (ret)
1159 goto error_pcm;
1160 } else {
1161 ret = imx_pcm_dma_init(pdev);
1162 if (ret)
1163 goto error_pcm;
1164 }
1165
49da09e2 1166 return 0;
4d9b7926
MP
1167
1168error_pcm:
4d9b7926
MP
1169 clk_disable_unprepare(ssi_private->clk);
1170
1171 return ret;
49da09e2
MP
1172}
1173
1174static void fsl_ssi_imx_clean(struct platform_device *pdev,
1175 struct fsl_ssi_private *ssi_private)
1176{
4d9b7926
MP
1177 if (!ssi_private->use_dma)
1178 imx_pcm_fiq_exit(pdev);
49da09e2
MP
1179 clk_disable_unprepare(ssi_private->clk);
1180}
1181
a0a3d518 1182static int fsl_ssi_probe(struct platform_device *pdev)
17467f23 1183{
17467f23
TT
1184 struct fsl_ssi_private *ssi_private;
1185 int ret = 0;
38fec727 1186 struct device_node *np = pdev->dev.of_node;
c1953bfe 1187 const struct of_device_id *of_id;
f0fba2ad 1188 const char *p, *sprop;
8e9d8690 1189 const uint32_t *iprop;
f0fba2ad
LG
1190 struct resource res;
1191 char name[64];
17467f23 1192
ff71334a
TT
1193 /* SSIs that are not connected on the board should have a
1194 * status = "disabled"
1195 * property in their device tree nodes.
f0fba2ad 1196 */
ff71334a 1197 if (!of_device_is_available(np))
f0fba2ad
LG
1198 return -ENODEV;
1199
c1953bfe 1200 of_id = of_match_device(fsl_ssi_ids, &pdev->dev);
fcdbadef 1201 if (!of_id || !of_id->data)
c1953bfe 1202 return -EINVAL;
c1953bfe 1203
2a1d102d
MP
1204 ssi_private = devm_kzalloc(&pdev->dev, sizeof(*ssi_private),
1205 GFP_KERNEL);
17467f23 1206 if (!ssi_private) {
38fec727 1207 dev_err(&pdev->dev, "could not allocate DAI object\n");
f0fba2ad 1208 return -ENOMEM;
17467f23 1209 }
17467f23 1210
fcdbadef
SH
1211 ssi_private->soc = of_id->data;
1212
85e59af2
MP
1213 sprop = of_get_property(np, "fsl,mode", NULL);
1214 if (sprop) {
1215 if (!strcmp(sprop, "ac97-slave"))
1216 ssi_private->dai_fmt = SND_SOC_DAIFMT_AC97;
1217 else if (!strcmp(sprop, "i2s-slave"))
1218 ssi_private->dai_fmt = SND_SOC_DAIFMT_I2S |
1219 SND_SOC_DAIFMT_CBM_CFM;
1220 }
1221
de623ece
MP
1222 ssi_private->use_dma = !of_property_read_bool(np,
1223 "fsl,fiq-stream-filter");
1224
85e59af2 1225 if (fsl_ssi_is_ac97(ssi_private)) {
cd7f0295
MP
1226 memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_ac97_dai,
1227 sizeof(fsl_ssi_ac97_dai));
1228
1229 fsl_ac97_data = ssi_private;
cd7f0295
MP
1230
1231 snd_soc_set_ac97_ops_of_reset(&fsl_ssi_ac97_ops, pdev);
1232 } else {
1233 /* Initialize this copy of the CPU DAI driver structure */
1234 memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_dai_template,
1235 sizeof(fsl_ssi_dai_template));
1236 }
2a1d102d 1237 ssi_private->cpu_dai_drv.name = dev_name(&pdev->dev);
f0fba2ad
LG
1238
1239 /* Get the addresses and IRQ */
1240 ret = of_address_to_resource(np, 0, &res);
1241 if (ret) {
38fec727 1242 dev_err(&pdev->dev, "could not determine device resources\n");
b0a4747a 1243 return ret;
f0fba2ad 1244 }
147dfe90
TT
1245 ssi_private->ssi = of_iomap(np, 0);
1246 if (!ssi_private->ssi) {
1247 dev_err(&pdev->dev, "could not map device resources\n");
b0a4747a 1248 return -ENOMEM;
147dfe90 1249 }
f0fba2ad 1250 ssi_private->ssi_phys = res.start;
1fab6caf 1251
f0fba2ad 1252 ssi_private->irq = irq_of_parse_and_map(np, 0);
d60336e2 1253 if (!ssi_private->irq) {
1fab6caf 1254 dev_err(&pdev->dev, "no irq for node %s\n", np->full_name);
b0a4747a 1255 return -ENXIO;
1fab6caf
TT
1256 }
1257
f0fba2ad 1258 /* Are the RX and the TX clocks locked? */
07a9483a 1259 if (!of_find_property(np, "fsl,ssi-asynchronous", NULL)) {
f0fba2ad 1260 ssi_private->cpu_dai_drv.symmetric_rates = 1;
07a9483a
NC
1261 ssi_private->cpu_dai_drv.symmetric_channels = 1;
1262 ssi_private->cpu_dai_drv.symmetric_samplebits = 1;
1263 }
17467f23 1264
8e9d8690
TT
1265 /* Determine the FIFO depth. */
1266 iprop = of_get_property(np, "fsl,fifo-depth", NULL);
1267 if (iprop)
147dfe90 1268 ssi_private->fifo_depth = be32_to_cpup(iprop);
8e9d8690
TT
1269 else
1270 /* Older 8610 DTs didn't have the fifo-depth property */
1271 ssi_private->fifo_depth = 8;
1272
4d9b7926
MP
1273 dev_set_drvdata(&pdev->dev, ssi_private);
1274
fcdbadef 1275 if (ssi_private->soc->imx) {
4d9b7926 1276 ret = fsl_ssi_imx_probe(pdev, ssi_private, ssi_private->ssi);
49da09e2 1277 if (ret)
b0a4747a 1278 goto error_irqmap;
0888efd1
MP
1279 }
1280
4d9b7926
MP
1281 ret = snd_soc_register_component(&pdev->dev, &fsl_ssi_component,
1282 &ssi_private->cpu_dai_drv, 1);
1283 if (ret) {
1284 dev_err(&pdev->dev, "failed to register DAI: %d\n", ret);
1285 goto error_asoc_register;
1286 }
1287
0888efd1 1288 if (ssi_private->use_dma) {
f0377086 1289 ret = devm_request_irq(&pdev->dev, ssi_private->irq,
171d683d 1290 fsl_ssi_isr, 0, dev_name(&pdev->dev),
f0377086
MG
1291 ssi_private);
1292 if (ret < 0) {
1293 dev_err(&pdev->dev, "could not claim irq %u\n",
1294 ssi_private->irq);
49da09e2 1295 goto error_irq;
f0377086 1296 }
09ce1111
SG
1297 }
1298
f138e621 1299 ret = fsl_ssi_debugfs_create(&ssi_private->dbg_stats, &pdev->dev);
9368acc4 1300 if (ret)
4d9b7926 1301 goto error_asoc_register;
09ce1111
SG
1302
1303 /*
1304 * If codec-handle property is missing from SSI node, we assume
1305 * that the machine driver uses new binding which does not require
1306 * SSI driver to trigger machine driver's probe.
1307 */
171d683d 1308 if (!of_get_property(np, "codec-handle", NULL))
09ce1111 1309 goto done;
09ce1111 1310
f0fba2ad 1311 /* Trigger the machine driver's probe function. The platform driver
2b81ec69 1312 * name of the machine driver is taken from /compatible property of the
f0fba2ad
LG
1313 * device tree. We also pass the address of the CPU DAI driver
1314 * structure.
1315 */
2b81ec69
SG
1316 sprop = of_get_property(of_find_node_by_path("/"), "compatible", NULL);
1317 /* Sometimes the compatible name has a "fsl," prefix, so we strip it. */
f0fba2ad
LG
1318 p = strrchr(sprop, ',');
1319 if (p)
1320 sprop = p + 1;
1321 snprintf(name, sizeof(name), "snd-soc-%s", sprop);
1322 make_lowercase(name);
1323
1324 ssi_private->pdev =
38fec727 1325 platform_device_register_data(&pdev->dev, name, 0, NULL, 0);
f0fba2ad
LG
1326 if (IS_ERR(ssi_private->pdev)) {
1327 ret = PTR_ERR(ssi_private->pdev);
38fec727 1328 dev_err(&pdev->dev, "failed to register platform: %d\n", ret);
4d9b7926 1329 goto error_sound_card;
3f4b783c 1330 }
17467f23 1331
09ce1111 1332done:
85e59af2
MP
1333 if (ssi_private->dai_fmt)
1334 _fsl_ssi_set_dai_fmt(ssi_private, ssi_private->dai_fmt);
1335
f0fba2ad 1336 return 0;
87a0632b 1337
4d9b7926 1338error_sound_card:
f138e621 1339 fsl_ssi_debugfs_remove(&ssi_private->dbg_stats);
9368acc4 1340
4d9b7926 1341error_irq:
3580aa10 1342 snd_soc_unregister_component(&pdev->dev);
1fab6caf 1343
4d9b7926 1344error_asoc_register:
fcdbadef 1345 if (ssi_private->soc->imx)
49da09e2 1346 fsl_ssi_imx_clean(pdev, ssi_private);
1fab6caf
TT
1347
1348error_irqmap:
4d9b7926 1349 if (ssi_private->use_dma)
2841be9a 1350 irq_dispose_mapping(ssi_private->irq);
1fab6caf 1351
87a0632b 1352 return ret;
17467f23 1353}
17467f23 1354
38fec727 1355static int fsl_ssi_remove(struct platform_device *pdev)
17467f23 1356{
38fec727 1357 struct fsl_ssi_private *ssi_private = dev_get_drvdata(&pdev->dev);
17467f23 1358
f138e621 1359 fsl_ssi_debugfs_remove(&ssi_private->dbg_stats);
9368acc4 1360
171d683d 1361 if (ssi_private->pdev)
09ce1111 1362 platform_device_unregister(ssi_private->pdev);
3580aa10 1363 snd_soc_unregister_component(&pdev->dev);
49da09e2 1364
fcdbadef 1365 if (ssi_private->soc->imx)
49da09e2
MP
1366 fsl_ssi_imx_clean(pdev, ssi_private);
1367
4d9b7926 1368 if (ssi_private->use_dma)
2841be9a 1369 irq_dispose_mapping(ssi_private->irq);
f0fba2ad
LG
1370
1371 return 0;
17467f23 1372}
f0fba2ad 1373
f07eb223 1374static struct platform_driver fsl_ssi_driver = {
f0fba2ad
LG
1375 .driver = {
1376 .name = "fsl-ssi-dai",
1377 .owner = THIS_MODULE,
1378 .of_match_table = fsl_ssi_ids,
1379 },
1380 .probe = fsl_ssi_probe,
1381 .remove = fsl_ssi_remove,
1382};
17467f23 1383
ba0a7e02 1384module_platform_driver(fsl_ssi_driver);
a454dad1 1385
f3142807 1386MODULE_ALIAS("platform:fsl-ssi-dai");
17467f23
TT
1387MODULE_AUTHOR("Timur Tabi <timur@freescale.com>");
1388MODULE_DESCRIPTION("Freescale Synchronous Serial Interface (SSI) ASoC Driver");
f0fba2ad 1389MODULE_LICENSE("GPL v2");
This page took 0.473114 seconds and 5 git commands to generate.