1 // SPDX-License-Identifier: GPL-2.0-only
3 * ALSA SoC I2S (McBSP) Audio Layer for TI DAVINCI processor
5 * Author: Vladimir Barinov, <vbarinov@embeddedalley.com>
6 * Copyright: (C) 2007 MontaVista Software, Inc., <source@mvista.com>
8 * DT support (c) 2016 Petr Kulhavy, Barix AG <petr@barix.com>
9 * based on davinci-mcasp.c DT support
12 * on DA850 implement HW FIFOs instead of DMA into DXR and DRR registers
15 #include <linux/init.h>
16 #include <linux/module.h>
17 #include <linux/device.h>
18 #include <linux/slab.h>
19 #include <linux/delay.h>
21 #include <linux/clk.h>
23 #include <sound/core.h>
24 #include <sound/pcm.h>
25 #include <sound/pcm_params.h>
26 #include <sound/initval.h>
27 #include <sound/soc.h>
28 #include <sound/dmaengine_pcm.h>
31 #include "davinci-i2s.h"
33 #define DRV_NAME "davinci-i2s"
36 * NOTE: terminology here is confusing.
38 * - This driver supports the "Audio Serial Port" (ASP),
39 * found on dm6446, dm355, and other DaVinci chips.
41 * - But it labels it a "Multi-channel Buffered Serial Port"
42 * (McBSP) as on older chips like the dm642 ... which was
43 * backward-compatible, possibly explaining that confusion.
45 * - OMAP chips have a controller called McBSP, which is
46 * incompatible with the DaVinci flavor of McBSP.
48 * - Newer DaVinci chips have a controller called McASP,
49 * incompatible with ASP and with either McBSP.
51 * In short: this uses ASP to implement I2S, not McBSP.
52 * And it won't be the only DaVinci implemention of I2S.
54 #define DAVINCI_MCBSP_DRR_REG 0x00
55 #define DAVINCI_MCBSP_DXR_REG 0x04
56 #define DAVINCI_MCBSP_SPCR_REG 0x08
57 #define DAVINCI_MCBSP_RCR_REG 0x0c
58 #define DAVINCI_MCBSP_XCR_REG 0x10
59 #define DAVINCI_MCBSP_SRGR_REG 0x14
60 #define DAVINCI_MCBSP_PCR_REG 0x24
62 #define DAVINCI_MCBSP_SPCR_RRST (1 << 0)
63 #define DAVINCI_MCBSP_SPCR_RINTM(v) ((v) << 4)
64 #define DAVINCI_MCBSP_SPCR_RJUST(v) ((v) << 13)
65 #define DAVINCI_MCBSP_SPCR_RJUST_Z_LE DAVINCI_MCBSP_SPCR_RJUST(0)
66 #define DAVINCI_MCBSP_SPCR_RJUST_S_LE DAVINCI_MCBSP_SPCR_RJUST(1)
67 #define DAVINCI_MCBSP_SPCR_XRST (1 << 16)
68 #define DAVINCI_MCBSP_SPCR_XINTM(v) ((v) << 20)
69 #define DAVINCI_MCBSP_SPCR_GRST (1 << 22)
70 #define DAVINCI_MCBSP_SPCR_FRST (1 << 23)
71 #define DAVINCI_MCBSP_SPCR_FREE (1 << 25)
73 #define DAVINCI_MCBSP_RCR_RWDLEN1(v) ((v) << 5)
74 #define DAVINCI_MCBSP_RCR_RFRLEN1(v) ((v) << 8)
75 #define DAVINCI_MCBSP_RCR_RDATDLY(v) ((v) << 16)
76 #define DAVINCI_MCBSP_RCR_RFIG (1 << 18)
77 #define DAVINCI_MCBSP_RCR_RWDLEN2(v) ((v) << 21)
78 #define DAVINCI_MCBSP_RCR_RFRLEN2(v) ((v) << 24)
79 #define DAVINCI_MCBSP_RCR_RPHASE BIT(31)
81 #define DAVINCI_MCBSP_XCR_XWDLEN1(v) ((v) << 5)
82 #define DAVINCI_MCBSP_XCR_XFRLEN1(v) ((v) << 8)
83 #define DAVINCI_MCBSP_XCR_XDATDLY(v) ((v) << 16)
84 #define DAVINCI_MCBSP_XCR_XFIG (1 << 18)
85 #define DAVINCI_MCBSP_XCR_XWDLEN2(v) ((v) << 21)
86 #define DAVINCI_MCBSP_XCR_XFRLEN2(v) ((v) << 24)
87 #define DAVINCI_MCBSP_XCR_XPHASE BIT(31)
89 #define DAVINCI_MCBSP_SRGR_FWID(v) ((v) << 8)
90 #define DAVINCI_MCBSP_SRGR_FPER(v) ((v) << 16)
91 #define DAVINCI_MCBSP_SRGR_FSGM (1 << 28)
92 #define DAVINCI_MCBSP_SRGR_CLKSM BIT(29)
94 #define DAVINCI_MCBSP_PCR_CLKRP (1 << 0)
95 #define DAVINCI_MCBSP_PCR_CLKXP (1 << 1)
96 #define DAVINCI_MCBSP_PCR_FSRP (1 << 2)
97 #define DAVINCI_MCBSP_PCR_FSXP (1 << 3)
98 #define DAVINCI_MCBSP_PCR_SCLKME (1 << 7)
99 #define DAVINCI_MCBSP_PCR_CLKRM (1 << 8)
100 #define DAVINCI_MCBSP_PCR_CLKXM (1 << 9)
101 #define DAVINCI_MCBSP_PCR_FSRM (1 << 10)
102 #define DAVINCI_MCBSP_PCR_FSXM (1 << 11)
105 DAVINCI_MCBSP_WORD_8
= 0,
106 DAVINCI_MCBSP_WORD_12
,
107 DAVINCI_MCBSP_WORD_16
,
108 DAVINCI_MCBSP_WORD_20
,
109 DAVINCI_MCBSP_WORD_24
,
110 DAVINCI_MCBSP_WORD_32
,
113 static const unsigned char asp_word_length
[SNDRV_PCM_FORMAT_S32_LE
+ 1] = {
114 [SNDRV_PCM_FORMAT_S8
] = DAVINCI_MCBSP_WORD_8
,
115 [SNDRV_PCM_FORMAT_S16_LE
] = DAVINCI_MCBSP_WORD_16
,
116 [SNDRV_PCM_FORMAT_S24_LE
] = DAVINCI_MCBSP_WORD_24
,
117 [SNDRV_PCM_FORMAT_S32_LE
] = DAVINCI_MCBSP_WORD_32
,
120 static const unsigned char double_fmt
[SNDRV_PCM_FORMAT_S32_LE
+ 1] = {
121 [SNDRV_PCM_FORMAT_S8
] = SNDRV_PCM_FORMAT_S16_LE
,
122 [SNDRV_PCM_FORMAT_S16_LE
] = SNDRV_PCM_FORMAT_S32_LE
,
125 struct davinci_mcbsp_dev
{
127 struct snd_dmaengine_dai_dma_data dma_data
[2];
137 * Combining both channels into 1 element will at least double the
138 * amount of time between servicing the dma channel, increase
139 * effiency, and reduce the chance of overrun/underrun. But,
140 * it will result in the left & right channels being swapped.
142 * If relabeling the left and right channels is not possible,
143 * you may want to let the codec know to swap them back.
145 * It may allow x10 the amount of time to service dma requests,
146 * if the codec is master and is using an unnecessarily fast bit clock
147 * (ie. tlvaic23b), independent of the sample rate. So, having an
148 * entire frame at once means it can be serviced at the sample rate
149 * instead of the bit clock rate.
151 * In the now unlikely case that an underrun still
152 * occurs, both the left and right samples will be repeated
153 * so that no pops are heard, and the left and right channels
154 * won't end up being swapped because of the underrun.
156 unsigned enable_channel_combine
:1;
160 bool i2s_accurate_sck
;
169 static inline void davinci_mcbsp_write_reg(struct davinci_mcbsp_dev
*dev
,
172 __raw_writel(val
, dev
->base
+ reg
);
175 static inline u32
davinci_mcbsp_read_reg(struct davinci_mcbsp_dev
*dev
, int reg
)
177 return __raw_readl(dev
->base
+ reg
);
180 static void toggle_clock(struct davinci_mcbsp_dev
*dev
, int playback
)
182 u32 m
= playback
? DAVINCI_MCBSP_PCR_CLKXP
: DAVINCI_MCBSP_PCR_CLKRP
;
183 /* The clock needs to toggle to complete reset.
184 * So, fake it by toggling the clk polarity.
186 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_PCR_REG
, dev
->pcr
^ m
);
187 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_PCR_REG
, dev
->pcr
);
190 static void davinci_mcbsp_start(struct davinci_mcbsp_dev
*dev
,
191 struct snd_pcm_substream
*substream
)
193 int playback
= (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
);
195 u32 mask
= playback
? DAVINCI_MCBSP_SPCR_XRST
: DAVINCI_MCBSP_SPCR_RRST
;
197 /* Enable transmitter or receiver */
198 spcr
= davinci_mcbsp_read_reg(dev
, DAVINCI_MCBSP_SPCR_REG
);
201 if (dev
->pcr
& (DAVINCI_MCBSP_PCR_FSXM
| DAVINCI_MCBSP_PCR_FSRM
)) {
202 /* Start frame sync */
203 spcr
|= DAVINCI_MCBSP_SPCR_FRST
;
205 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_SPCR_REG
, spcr
);
208 static void davinci_mcbsp_stop(struct davinci_mcbsp_dev
*dev
, int playback
)
212 /* Reset transmitter/receiver and sample rate/frame sync generators */
213 spcr
= davinci_mcbsp_read_reg(dev
, DAVINCI_MCBSP_SPCR_REG
);
214 spcr
&= ~(DAVINCI_MCBSP_SPCR_GRST
| DAVINCI_MCBSP_SPCR_FRST
);
215 spcr
&= playback
? ~DAVINCI_MCBSP_SPCR_XRST
: ~DAVINCI_MCBSP_SPCR_RRST
;
216 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_SPCR_REG
, spcr
);
217 toggle_clock(dev
, playback
);
220 static int davinci_i2s_tdm_word_length(int tdm_slot_width
)
222 switch (tdm_slot_width
) {
224 return DAVINCI_MCBSP_WORD_8
;
226 return DAVINCI_MCBSP_WORD_12
;
228 return DAVINCI_MCBSP_WORD_16
;
230 return DAVINCI_MCBSP_WORD_20
;
232 return DAVINCI_MCBSP_WORD_24
;
234 return DAVINCI_MCBSP_WORD_32
;
240 static int davinci_i2s_set_tdm_slot(struct snd_soc_dai
*cpu_dai
,
241 unsigned int tx_mask
,
242 unsigned int rx_mask
,
243 int slots
, int slot_width
)
245 struct davinci_mcbsp_dev
*dev
= snd_soc_dai_get_drvdata(cpu_dai
);
247 dev_dbg(dev
->dev
, "slots %d, slot_width %d\n", slots
, slot_width
);
249 if (slots
> 128 || !slots
) {
250 dev_err(dev
->dev
, "Invalid number of slots\n");
254 if (rx_mask
!= (1 << slots
) - 1) {
255 dev_err(dev
->dev
, "Invalid RX mask (0x%08x) : all slots must be used by McBSP\n",
260 if (tx_mask
!= (1 << slots
) - 1) {
261 dev_err(dev
->dev
, "Invalid TX mask (0x%08x) : all slots must be used by McBSP\n",
266 if (davinci_i2s_tdm_word_length(slot_width
) < 0) {
267 dev_err(dev
->dev
, "%s: Unsupported slot_width %d\n", __func__
, slot_width
);
271 dev
->tdm_slots
= slots
;
272 dev
->slot_width
= slot_width
;
277 #define DEFAULT_BITPERSAMPLE 16
279 static int davinci_i2s_set_dai_fmt(struct snd_soc_dai
*cpu_dai
,
282 struct davinci_mcbsp_dev
*dev
= snd_soc_dai_get_drvdata(cpu_dai
);
287 /* Attention srgr is updated by hw_params! */
288 srgr
= DAVINCI_MCBSP_SRGR_FSGM
|
289 DAVINCI_MCBSP_SRGR_FPER(DEFAULT_BITPERSAMPLE
* 2 - 1) |
290 DAVINCI_MCBSP_SRGR_FWID(DEFAULT_BITPERSAMPLE
- 1);
294 spcr
= davinci_mcbsp_read_reg(dev
, DAVINCI_MCBSP_SPCR_REG
);
295 switch (fmt
& SND_SOC_DAIFMT_CLOCK_MASK
) {
296 case SND_SOC_DAIFMT_CONT
:
297 spcr
|= DAVINCI_MCBSP_SPCR_FREE
;
298 dev_dbg(dev
->dev
, "Free-running mode ON\n");
300 case SND_SOC_DAIFMT_GATED
:
301 spcr
&= ~DAVINCI_MCBSP_SPCR_FREE
;
302 dev_dbg(dev
->dev
, "Free-running mode OFF\n");
305 dev_err(dev
->dev
, "Invalid clock gating\n");
308 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_SPCR_REG
, spcr
);
310 /* set master/slave audio interface */
311 switch (fmt
& SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK
) {
312 case SND_SOC_DAIFMT_BP_FP
:
314 pcr
= DAVINCI_MCBSP_PCR_FSXM
|
315 DAVINCI_MCBSP_PCR_FSRM
|
316 DAVINCI_MCBSP_PCR_CLKXM
|
317 DAVINCI_MCBSP_PCR_CLKRM
;
319 case SND_SOC_DAIFMT_BC_FP
:
320 if (dev
->tdm_slots
|| dev
->slot_width
) {
321 dev_err(dev
->dev
, "TDM is not supported for BC_FP format\n");
326 * McBSP CLKR pin is the input for the Sample Rate Generator.
327 * McBSP FSR and FSX are driven by the Sample Rate Generator.
329 pcr
= DAVINCI_MCBSP_PCR_FSRM
| DAVINCI_MCBSP_PCR_FSXM
;
330 pcr
|= DAVINCI_MCBSP_PCR_SCLKME
;
332 case SND_SOC_DAIFMT_BP_FC
:
333 /* cpu is bitclock provider */
334 pcr
= DAVINCI_MCBSP_PCR_CLKXM
|
335 DAVINCI_MCBSP_PCR_CLKRM
;
338 case SND_SOC_DAIFMT_BC_FC
:
339 if (dev
->tdm_slots
|| dev
->slot_width
) {
340 dev_err(dev
->dev
, "TDM is not supported for BC_FC format\n");
344 /* codec is master */
348 printk(KERN_ERR
"%s:bad master\n", __func__
);
352 /* interface format */
353 switch (fmt
& SND_SOC_DAIFMT_FORMAT_MASK
) {
354 case SND_SOC_DAIFMT_I2S
:
355 /* Davinci doesn't support TRUE I2S, but some codecs will have
356 * the left and right channels contiguous. This allows
357 * dsp_a mode to be used with an inverted normal frame clk.
358 * If your codec is master and does not have contiguous
359 * channels, then you will have sound on only one channel.
360 * Try using a different mode, or codec as slave.
362 * The TLV320AIC33 is an example of a codec where this works.
363 * It has a variable bit clock frequency allowing it to have
364 * valid data on every bit clock.
366 * The TLV320AIC23 is an example of a codec where this does not
367 * work. It has a fixed bit clock frequency with progressively
368 * more empty bit clock slots between channels as the sample
373 case SND_SOC_DAIFMT_DSP_A
:
374 dev
->mode
= MOD_DSP_A
;
376 case SND_SOC_DAIFMT_DSP_B
:
377 dev
->mode
= MOD_DSP_B
;
380 printk(KERN_ERR
"%s:bad format\n", __func__
);
384 switch (fmt
& SND_SOC_DAIFMT_INV_MASK
) {
385 case SND_SOC_DAIFMT_NB_NF
:
386 /* CLKRP Receive clock polarity,
387 * 1 - sampled on rising edge of CLKR
388 * valid on rising edge
389 * CLKXP Transmit clock polarity,
390 * 1 - clocked on falling edge of CLKX
391 * valid on rising edge
392 * FSRP Receive frame sync pol, 0 - active high
393 * FSXP Transmit frame sync pol, 0 - active high
395 pcr
|= (DAVINCI_MCBSP_PCR_CLKXP
| DAVINCI_MCBSP_PCR_CLKRP
);
397 case SND_SOC_DAIFMT_IB_IF
:
398 /* CLKRP Receive clock polarity,
399 * 0 - sampled on falling edge of CLKR
400 * valid on falling edge
401 * CLKXP Transmit clock polarity,
402 * 0 - clocked on rising edge of CLKX
403 * valid on falling edge
404 * FSRP Receive frame sync pol, 1 - active low
405 * FSXP Transmit frame sync pol, 1 - active low
407 pcr
|= (DAVINCI_MCBSP_PCR_FSXP
| DAVINCI_MCBSP_PCR_FSRP
);
409 case SND_SOC_DAIFMT_NB_IF
:
410 /* CLKRP Receive clock polarity,
411 * 1 - sampled on rising edge of CLKR
412 * valid on rising edge
413 * CLKXP Transmit clock polarity,
414 * 1 - clocked on falling edge of CLKX
415 * valid on rising edge
416 * FSRP Receive frame sync pol, 1 - active low
417 * FSXP Transmit frame sync pol, 1 - active low
419 pcr
|= (DAVINCI_MCBSP_PCR_CLKXP
| DAVINCI_MCBSP_PCR_CLKRP
|
420 DAVINCI_MCBSP_PCR_FSXP
| DAVINCI_MCBSP_PCR_FSRP
);
422 case SND_SOC_DAIFMT_IB_NF
:
423 /* CLKRP Receive clock polarity,
424 * 0 - sampled on falling edge of CLKR
425 * valid on falling edge
426 * CLKXP Transmit clock polarity,
427 * 0 - clocked on rising edge of CLKX
428 * valid on falling edge
429 * FSRP Receive frame sync pol, 0 - active high
430 * FSXP Transmit frame sync pol, 0 - active high
437 pcr
^= (DAVINCI_MCBSP_PCR_FSXP
| DAVINCI_MCBSP_PCR_FSRP
);
438 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_SRGR_REG
, srgr
);
440 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_PCR_REG
, pcr
);
444 static int davinci_i2s_dai_set_clkdiv(struct snd_soc_dai
*cpu_dai
,
447 struct davinci_mcbsp_dev
*dev
= snd_soc_dai_get_drvdata(cpu_dai
);
449 if (div_id
!= DAVINCI_MCBSP_CLKGDV
)
456 static int davinci_i2s_hw_params(struct snd_pcm_substream
*substream
,
457 struct snd_pcm_hw_params
*params
,
458 struct snd_soc_dai
*dai
)
460 struct davinci_mcbsp_dev
*dev
= snd_soc_dai_get_drvdata(dai
);
461 struct snd_interval
*i
= NULL
;
462 int mcbsp_word_length
, master
;
463 unsigned int clk_div
, freq
, framesize
;
464 unsigned int srgr
= 0;
465 unsigned int rcr
= 0;
466 unsigned int xcr
= 0;
468 snd_pcm_format_t fmt
;
469 unsigned element_cnt
= 1;
471 spcr
= davinci_mcbsp_read_reg(dev
, DAVINCI_MCBSP_SPCR_REG
);
473 /* Determine xfer data type */
474 fmt
= params_format(params
);
476 case SNDRV_PCM_FORMAT_S16_LE
:
477 case SNDRV_PCM_FORMAT_S32_LE
:
479 case SNDRV_PCM_FORMAT_S24_LE
:
480 spcr
|= DAVINCI_MCBSP_SPCR_RJUST_S_LE
;
483 dev_warn(dev
->dev
, "davinci-i2s: unsupported PCM format\n");
487 /* general line settings */
488 if (substream
->stream
== SNDRV_PCM_STREAM_CAPTURE
) {
489 spcr
|= DAVINCI_MCBSP_SPCR_RINTM(3);
490 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_SPCR_REG
, spcr
);
492 spcr
|= DAVINCI_MCBSP_SPCR_XINTM(3);
493 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_SPCR_REG
, spcr
);
496 master
= dev
->fmt
& SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK
;
497 fmt
= params_format(params
);
499 mcbsp_word_length
= davinci_i2s_tdm_word_length(dev
->slot_width
);
501 mcbsp_word_length
= asp_word_length
[fmt
];
503 if (mcbsp_word_length
< 0)
504 return mcbsp_word_length
;
507 case SND_SOC_DAIFMT_BP_FP
:
509 freq
= clk_get_rate(dev
->ext_clk
);
511 freq
= clk_get_rate(dev
->clk
);
512 srgr
= DAVINCI_MCBSP_SRGR_CLKSM
;
514 srgr
|= DAVINCI_MCBSP_SRGR_FSGM
;
515 srgr
|= DAVINCI_MCBSP_SRGR_FWID(mcbsp_word_length
*
517 if (dev
->i2s_accurate_sck
) {
520 framesize
= (freq
/ (--clk_div
)) /
523 } while (((framesize
< 33) || (framesize
> 4095)) &&
526 srgr
|= DAVINCI_MCBSP_SRGR_FPER(framesize
- 1);
528 /* symmetric waveforms */
529 clk_div
= freq
/ (mcbsp_word_length
* 16) /
530 params
->rate_num
* params
->rate_den
;
531 srgr
|= DAVINCI_MCBSP_SRGR_FPER(mcbsp_word_length
*
537 case SND_SOC_DAIFMT_BC_FP
:
538 srgr
= DAVINCI_MCBSP_SRGR_FSGM
;
539 clk_div
= dev
->clk_div
- 1;
540 srgr
|= DAVINCI_MCBSP_SRGR_FWID(mcbsp_word_length
* 8 - 1);
541 srgr
|= DAVINCI_MCBSP_SRGR_FPER(mcbsp_word_length
* 16 - 1);
545 case SND_SOC_DAIFMT_BP_FC
:
547 freq
= clk_get_rate(dev
->ext_clk
);
549 freq
= clk_get_rate(dev
->clk
);
550 srgr
= DAVINCI_MCBSP_SRGR_CLKSM
;
552 if (dev
->tdm_slots
&& dev
->slot_width
) {
553 clk_div
= freq
/ (params
->rate_num
* params
->rate_den
)
554 / (dev
->tdm_slots
* dev
->slot_width
) - 1;
556 clk_div
= freq
/ (mcbsp_word_length
* 16) /
557 params
->rate_num
* params
->rate_den
;
562 case SND_SOC_DAIFMT_BC_FC
:
563 /* Clock and frame sync given from external sources */
564 i
= hw_param_interval(params
, SNDRV_PCM_HW_PARAM_SAMPLE_BITS
);
565 srgr
= DAVINCI_MCBSP_SRGR_FSGM
;
566 srgr
|= DAVINCI_MCBSP_SRGR_FWID(snd_interval_value(i
) - 1);
567 pr_debug("%s - %d FWID set: re-read srgr = %X\n",
568 __func__
, __LINE__
, snd_interval_value(i
) - 1);
570 i
= hw_param_interval(params
, SNDRV_PCM_HW_PARAM_FRAME_BITS
);
571 srgr
|= DAVINCI_MCBSP_SRGR_FPER(snd_interval_value(i
) - 1);
576 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_SRGR_REG
, srgr
);
578 if (dev
->mode
== MOD_DSP_B
) {
579 rcr
|= DAVINCI_MCBSP_RCR_RDATDLY(0);
580 xcr
|= DAVINCI_MCBSP_XCR_XDATDLY(0);
582 rcr
|= DAVINCI_MCBSP_RCR_RDATDLY(1);
583 xcr
|= DAVINCI_MCBSP_XCR_XDATDLY(1);
586 if (dev
->tx_framing_bit
) {
587 xcr
&= ~DAVINCI_MCBSP_XCR_XDATDLY(1);
588 xcr
|= DAVINCI_MCBSP_XCR_XDATDLY(2);
590 if (dev
->rx_framing_bit
) {
591 rcr
&= ~DAVINCI_MCBSP_RCR_RDATDLY(1);
592 rcr
|= DAVINCI_MCBSP_RCR_RDATDLY(2);
595 if (params_channels(params
) == 2) {
597 if (double_fmt
[fmt
] && dev
->enable_channel_combine
) {
599 fmt
= double_fmt
[fmt
];
602 case SND_SOC_DAIFMT_BP_FP
:
603 case SND_SOC_DAIFMT_BP_FC
:
604 rcr
|= DAVINCI_MCBSP_RCR_RFRLEN2(0);
605 xcr
|= DAVINCI_MCBSP_XCR_XFRLEN2(0);
606 rcr
|= DAVINCI_MCBSP_RCR_RPHASE
;
607 xcr
|= DAVINCI_MCBSP_XCR_XPHASE
;
609 case SND_SOC_DAIFMT_BC_FC
:
610 case SND_SOC_DAIFMT_BC_FP
:
611 rcr
|= DAVINCI_MCBSP_RCR_RFRLEN2(element_cnt
- 1);
612 xcr
|= DAVINCI_MCBSP_XCR_XFRLEN2(element_cnt
- 1);
620 case SND_SOC_DAIFMT_BP_FP
:
621 case SND_SOC_DAIFMT_BP_FC
:
622 if (dev
->tdm_slots
> 0) {
623 rcr
|= DAVINCI_MCBSP_RCR_RFRLEN1(dev
->tdm_slots
- 1);
624 xcr
|= DAVINCI_MCBSP_XCR_XFRLEN1(dev
->tdm_slots
- 1);
626 rcr
|= DAVINCI_MCBSP_RCR_RFRLEN1(0);
627 xcr
|= DAVINCI_MCBSP_XCR_XFRLEN1(0);
630 case SND_SOC_DAIFMT_BC_FC
:
631 case SND_SOC_DAIFMT_BC_FP
:
632 rcr
|= DAVINCI_MCBSP_RCR_RFRLEN1(element_cnt
- 1);
633 xcr
|= DAVINCI_MCBSP_XCR_XFRLEN1(element_cnt
- 1);
639 rcr
|= DAVINCI_MCBSP_RCR_RWDLEN1(mcbsp_word_length
) |
640 DAVINCI_MCBSP_RCR_RWDLEN2(mcbsp_word_length
);
641 xcr
|= DAVINCI_MCBSP_XCR_XWDLEN1(mcbsp_word_length
) |
642 DAVINCI_MCBSP_XCR_XWDLEN2(mcbsp_word_length
);
644 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
)
645 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_XCR_REG
, xcr
);
647 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_RCR_REG
, rcr
);
649 pr_debug("%s - %d srgr=%X\n", __func__
, __LINE__
, srgr
);
650 pr_debug("%s - %d xcr=%X\n", __func__
, __LINE__
, xcr
);
651 pr_debug("%s - %d rcr=%X\n", __func__
, __LINE__
, rcr
);
655 static int davinci_i2s_prepare(struct snd_pcm_substream
*substream
,
656 struct snd_soc_dai
*dai
)
658 struct davinci_mcbsp_dev
*dev
= snd_soc_dai_get_drvdata(dai
);
659 int playback
= (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
);
661 u32 mask
= playback
? DAVINCI_MCBSP_SPCR_XRST
: DAVINCI_MCBSP_SPCR_RRST
;
663 davinci_mcbsp_stop(dev
, playback
);
665 spcr
= davinci_mcbsp_read_reg(dev
, DAVINCI_MCBSP_SPCR_REG
);
667 /* start off disabled */
668 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_SPCR_REG
,
670 toggle_clock(dev
, playback
);
672 if (dev
->pcr
& (DAVINCI_MCBSP_PCR_FSXM
| DAVINCI_MCBSP_PCR_FSRM
|
673 DAVINCI_MCBSP_PCR_CLKXM
| DAVINCI_MCBSP_PCR_CLKRM
)) {
674 /* Start the sample generator */
675 spcr
|= DAVINCI_MCBSP_SPCR_GRST
;
676 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_SPCR_REG
, spcr
);
680 /* Enable the transmitter */
681 spcr
= davinci_mcbsp_read_reg(dev
, DAVINCI_MCBSP_SPCR_REG
);
682 spcr
|= DAVINCI_MCBSP_SPCR_XRST
;
683 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_SPCR_REG
, spcr
);
685 /* wait for any unexpected frame sync error to occur */
688 /* Disable the transmitter to clear any outstanding XSYNCERR */
689 spcr
= davinci_mcbsp_read_reg(dev
, DAVINCI_MCBSP_SPCR_REG
);
690 spcr
&= ~DAVINCI_MCBSP_SPCR_XRST
;
691 davinci_mcbsp_write_reg(dev
, DAVINCI_MCBSP_SPCR_REG
, spcr
);
692 toggle_clock(dev
, playback
);
698 static int davinci_i2s_trigger(struct snd_pcm_substream
*substream
, int cmd
,
699 struct snd_soc_dai
*dai
)
701 struct davinci_mcbsp_dev
*dev
= snd_soc_dai_get_drvdata(dai
);
703 int playback
= (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
);
706 case SNDRV_PCM_TRIGGER_START
:
707 case SNDRV_PCM_TRIGGER_RESUME
:
708 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
709 davinci_mcbsp_start(dev
, substream
);
711 case SNDRV_PCM_TRIGGER_STOP
:
712 case SNDRV_PCM_TRIGGER_SUSPEND
:
713 case SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
714 davinci_mcbsp_stop(dev
, playback
);
722 static void davinci_i2s_shutdown(struct snd_pcm_substream
*substream
,
723 struct snd_soc_dai
*dai
)
725 struct davinci_mcbsp_dev
*dev
= snd_soc_dai_get_drvdata(dai
);
726 int playback
= (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
);
727 davinci_mcbsp_stop(dev
, playback
);
730 #define DAVINCI_I2S_RATES SNDRV_PCM_RATE_8000_96000
731 #define DAVINCI_I2S_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
732 SNDRV_PCM_FMTBIT_S24_LE | \
733 SNDRV_PCM_FMTBIT_S32_LE)
735 static int davinci_i2s_dai_probe(struct snd_soc_dai
*dai
)
737 struct davinci_mcbsp_dev
*dev
= snd_soc_dai_get_drvdata(dai
);
740 for_each_pcm_streams(stream
)
741 snd_soc_dai_dma_data_set(dai
, stream
, &dev
->dma_data
[stream
]);
746 static const struct snd_soc_dai_ops davinci_i2s_dai_ops
= {
747 .probe
= davinci_i2s_dai_probe
,
748 .shutdown
= davinci_i2s_shutdown
,
749 .prepare
= davinci_i2s_prepare
,
750 .trigger
= davinci_i2s_trigger
,
751 .hw_params
= davinci_i2s_hw_params
,
752 .set_fmt
= davinci_i2s_set_dai_fmt
,
753 .set_clkdiv
= davinci_i2s_dai_set_clkdiv
,
754 .set_tdm_slot
= davinci_i2s_set_tdm_slot
,
758 static struct snd_soc_dai_driver davinci_i2s_dai
= {
762 .rates
= DAVINCI_I2S_RATES
,
763 .formats
= DAVINCI_I2S_FORMATS
,
768 .rates
= DAVINCI_I2S_RATES
,
769 .formats
= DAVINCI_I2S_FORMATS
,
771 .ops
= &davinci_i2s_dai_ops
,
775 static const struct snd_soc_component_driver davinci_i2s_component
= {
777 .legacy_dai_naming
= 1,
780 static int davinci_i2s_probe(struct platform_device
*pdev
)
782 struct snd_dmaengine_dai_dma_data
*dma_data
;
783 struct davinci_mcbsp_dev
*dev
;
784 struct resource
*mem
, *res
;
785 void __iomem
*io_base
;
789 mem
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
, "mpu");
792 "\"mpu\" mem resource not found, using index 0\n");
793 mem
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
795 dev_err(&pdev
->dev
, "no mem resource?\n");
800 io_base
= devm_ioremap_resource(&pdev
->dev
, mem
);
802 return PTR_ERR(io_base
);
804 dev
= devm_kzalloc(&pdev
->dev
, sizeof(struct davinci_mcbsp_dev
),
811 dev
->tx_framing_bit
= of_property_read_bool(pdev
->dev
.of_node
, "ti,T1-framing-tx");
812 dev
->rx_framing_bit
= of_property_read_bool(pdev
->dev
.of_node
, "ti,T1-framing-rx");
814 /* setup DMA, first TX, then RX */
815 dma_data
= &dev
->dma_data
[SNDRV_PCM_STREAM_PLAYBACK
];
816 dma_data
->addr
= (dma_addr_t
)(mem
->start
+ DAVINCI_MCBSP_DXR_REG
);
818 res
= platform_get_resource(pdev
, IORESOURCE_DMA
, 0);
820 dma
= &dev
->dma_request
[SNDRV_PCM_STREAM_PLAYBACK
];
822 dma_data
->filter_data
= dma
;
823 } else if (IS_ENABLED(CONFIG_OF
) && pdev
->dev
.of_node
) {
824 dma_data
->filter_data
= "tx";
826 dev_err(&pdev
->dev
, "Missing DMA tx resource\n");
830 dma_data
= &dev
->dma_data
[SNDRV_PCM_STREAM_CAPTURE
];
831 dma_data
->addr
= (dma_addr_t
)(mem
->start
+ DAVINCI_MCBSP_DRR_REG
);
833 res
= platform_get_resource(pdev
, IORESOURCE_DMA
, 1);
835 dma
= &dev
->dma_request
[SNDRV_PCM_STREAM_CAPTURE
];
837 dma_data
->filter_data
= dma
;
838 } else if (IS_ENABLED(CONFIG_OF
) && pdev
->dev
.of_node
) {
839 dma_data
->filter_data
= "rx";
841 dev_err(&pdev
->dev
, "Missing DMA rx resource\n");
846 * The optional is there for backward compatibility.
847 * If 'fck' is not present, the clk_get(dev, NULL) that follows may find something
849 dev
->clk
= devm_clk_get_optional(&pdev
->dev
, "fck");
850 if (IS_ERR(dev
->clk
))
851 return dev_err_probe(&pdev
->dev
, PTR_ERR(dev
->clk
), "Invalid functional clock\n");
853 dev
->clk
= devm_clk_get(&pdev
->dev
, NULL
);
854 if (IS_ERR(dev
->clk
))
855 return dev_err_probe(&pdev
->dev
, PTR_ERR(dev
->clk
),
856 "Missing functional clock\n");
859 dev
->ext_clk
= devm_clk_get_optional(&pdev
->dev
, "clks");
860 if (IS_ERR(dev
->ext_clk
))
861 return dev_err_probe(&pdev
->dev
, PTR_ERR(dev
->ext_clk
), "Invalid external clock\n");
863 ret
= clk_prepare_enable(dev
->clk
);
868 dev_dbg(&pdev
->dev
, "External clock used for sample rate generator\n");
869 ret
= clk_prepare_enable(dev
->ext_clk
);
871 dev_err_probe(&pdev
->dev
, ret
, "Failed to enable external clock\n");
872 goto err_disable_clk
;
876 dev
->dev
= &pdev
->dev
;
877 dev_set_drvdata(&pdev
->dev
, dev
);
879 ret
= snd_soc_register_component(&pdev
->dev
, &davinci_i2s_component
,
880 &davinci_i2s_dai
, 1);
882 goto err_disable_ext_clk
;
884 ret
= edma_pcm_platform_register(&pdev
->dev
);
886 dev_err_probe(&pdev
->dev
, ret
, "register PCM failed\n");
887 goto err_unregister_component
;
892 err_unregister_component
:
893 snd_soc_unregister_component(&pdev
->dev
);
896 clk_disable_unprepare(dev
->ext_clk
);
898 clk_disable_unprepare(dev
->clk
);
903 static void davinci_i2s_remove(struct platform_device
*pdev
)
905 struct davinci_mcbsp_dev
*dev
= dev_get_drvdata(&pdev
->dev
);
907 snd_soc_unregister_component(&pdev
->dev
);
909 clk_disable_unprepare(dev
->clk
);
912 clk_disable_unprepare(dev
->ext_clk
);
915 static const struct of_device_id davinci_i2s_match
[] __maybe_unused
= {
916 { .compatible
= "ti,da850-mcbsp" },
919 MODULE_DEVICE_TABLE(of
, davinci_i2s_match
);
921 static struct platform_driver davinci_mcbsp_driver
= {
922 .probe
= davinci_i2s_probe
,
923 .remove
= davinci_i2s_remove
,
925 .name
= "davinci-mcbsp",
926 .of_match_table
= of_match_ptr(davinci_i2s_match
),
930 module_platform_driver(davinci_mcbsp_driver
);
932 MODULE_AUTHOR("Vladimir Barinov");
933 MODULE_DESCRIPTION("TI DAVINCI I2S (McBSP) SoC Interface");
934 MODULE_LICENSE("GPL");