1 // SPDX-License-Identifier: GPL-2.0
3 // Freescale S/PDIF ALSA SoC Digital Audio Interface (DAI) driver
5 // Copyright (C) 2013 Freescale Semiconductor, Inc.
7 // Based on stmp3xxx_spdif_dai.c
8 // Vladimir Barinov <vbarinov@embeddedalley.com>
9 // Copyright 2008 SigmaTel, Inc
10 // Copyright 2008 Embedded Alley Solutions, Inc
12 #include <linux/bitrev.h>
13 #include <linux/clk.h>
14 #include <linux/module.h>
16 #include <linux/regmap.h>
17 #include <linux/pm_runtime.h>
19 #include <sound/asoundef.h>
20 #include <sound/dmaengine_pcm.h>
21 #include <sound/soc.h>
23 #include "fsl_spdif.h"
24 #include "fsl_utils.h"
27 #define FSL_SPDIF_TXFIFO_WML 0x8
28 #define FSL_SPDIF_RXFIFO_WML 0x8
30 #define INTR_FOR_PLAYBACK (INT_TXFIFO_RESYNC)
31 #define INTR_FOR_CAPTURE (INT_SYM_ERR | INT_BIT_ERR | INT_URX_FUL |\
32 INT_URX_OV | INT_QRX_FUL | INT_QRX_OV |\
33 INT_UQ_SYNC | INT_UQ_ERR | INT_RXFIFO_RESYNC |\
34 INT_LOSS_LOCK | INT_DPLL_LOCKED)
36 #define SIE_INTR_FOR(tx) (tx ? INTR_FOR_PLAYBACK : INTR_FOR_CAPTURE)
38 /* Index list for the values that has if (DPLL Locked) condition */
39 static u8 srpc_dpll_locked
[] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0xa, 0xb };
40 #define SRPC_NODPLL_START1 0x5
41 #define SRPC_NODPLL_START2 0xc
43 #define DEFAULT_RXCLK_SRC 1
45 #define RX_SAMPLE_RATE_KCONTROL "RX Sample Rate"
48 * struct fsl_spdif_soc_data: soc specific data
50 * @imx: for imx platform
51 * @shared_root_clock: flag of sharing a clock source with others;
52 * so the driver shouldn't set root clock rate
53 * @raw_capture_mode: if raw capture mode support
54 * @cchannel_192b: if there are registers for 192bits C channel data
55 * @interrupts: interrupt number
56 * @tx_burst: tx maxburst size
57 * @rx_burst: rx maxburst size
58 * @tx_formats: tx supported data format
60 struct fsl_spdif_soc_data
{
62 bool shared_root_clock
;
63 bool raw_capture_mode
;
72 * SPDIF control structure
73 * Defines channel status, subcode and Q sub
75 struct spdif_mixer_control
{
76 /* spinlock to access control data */
79 /* IEC958 channel tx status bit */
80 unsigned char ch_status
[4];
83 unsigned char subcode
[2 * SPDIF_UBITS_SIZE
];
85 /* Q subcode part of user bits */
86 unsigned char qsub
[2 * SPDIF_QSUB_SIZE
];
88 /* Buffer offset for U/Q */
92 /* Ready buffer index of the two buffers */
97 * struct fsl_spdif_priv - Freescale SPDIF private data
98 * @soc: SPDIF soc data
99 * @fsl_spdif_control: SPDIF control data
100 * @cpu_dai_drv: cpu dai driver
101 * @snd_card: sound card pointer
102 * @rxrate_kcontrol: kcontrol for RX Sample Rate
103 * @pdev: platform device pointer
104 * @regmap: regmap handler
105 * @dpll_locked: dpll lock flag
106 * @txrate: the best rates for playback
107 * @txclk_df: STC_TXCLK_DF dividers value for playback
108 * @sysclk_df: STC_SYSCLK_DF dividers value for playback
109 * @txclk_src: STC_TXCLK_SRC values for playback
110 * @rxclk_src: SRPC_CLKSRC_SEL values for capture
111 * @txclk: tx clock sources for playback
112 * @rxclk: rx clock sources for capture
113 * @coreclk: core clock for register access via DMA
114 * @sysclk: system clock for rx clock rate measurement
115 * @spbaclk: SPBA clock (optional, depending on SoC design)
116 * @dma_params_tx: DMA parameters for transmit channel
117 * @dma_params_rx: DMA parameters for receive channel
118 * @regcache_srpc: regcache for SRPC
119 * @bypass: status of bypass input to output
120 * @pll8k_clk: PLL clock for the rate of multiply of 8kHz
121 * @pll11k_clk: PLL clock for the rate of multiply of 11kHz
123 struct fsl_spdif_priv
{
124 const struct fsl_spdif_soc_data
*soc
;
125 struct spdif_mixer_control fsl_spdif_control
;
126 struct snd_soc_dai_driver cpu_dai_drv
;
127 struct snd_card
*snd_card
;
128 struct snd_kcontrol
*rxrate_kcontrol
;
129 struct platform_device
*pdev
;
130 struct regmap
*regmap
;
132 u32 txrate
[SPDIF_TXRATE_MAX
];
133 u8 txclk_df
[SPDIF_TXRATE_MAX
];
134 u16 sysclk_df
[SPDIF_TXRATE_MAX
];
135 u8 txclk_src
[SPDIF_TXRATE_MAX
];
137 struct clk
*txclk
[STC_TXCLK_SRC_MAX
];
142 struct snd_dmaengine_dai_dma_data dma_params_tx
;
143 struct snd_dmaengine_dai_dma_data dma_params_rx
;
144 /* regcache for SRPC */
147 struct clk
*pll8k_clk
;
148 struct clk
*pll11k_clk
;
151 static struct fsl_spdif_soc_data fsl_spdif_vf610
= {
153 .shared_root_clock
= false,
154 .raw_capture_mode
= false,
156 .tx_burst
= FSL_SPDIF_TXFIFO_WML
,
157 .rx_burst
= FSL_SPDIF_RXFIFO_WML
,
158 .tx_formats
= FSL_SPDIF_FORMATS_PLAYBACK
,
161 static struct fsl_spdif_soc_data fsl_spdif_imx35
= {
163 .shared_root_clock
= false,
164 .raw_capture_mode
= false,
166 .tx_burst
= FSL_SPDIF_TXFIFO_WML
,
167 .rx_burst
= FSL_SPDIF_RXFIFO_WML
,
168 .tx_formats
= FSL_SPDIF_FORMATS_PLAYBACK
,
171 static struct fsl_spdif_soc_data fsl_spdif_imx6sx
= {
173 .shared_root_clock
= true,
174 .raw_capture_mode
= false,
176 .tx_burst
= FSL_SPDIF_TXFIFO_WML
,
177 .rx_burst
= FSL_SPDIF_RXFIFO_WML
,
178 .tx_formats
= FSL_SPDIF_FORMATS_PLAYBACK
,
182 static struct fsl_spdif_soc_data fsl_spdif_imx8qm
= {
184 .shared_root_clock
= true,
185 .raw_capture_mode
= false,
187 .tx_burst
= 2, /* Applied for EDMA */
188 .rx_burst
= 2, /* Applied for EDMA */
189 .tx_formats
= SNDRV_PCM_FMTBIT_S24_LE
, /* Applied for EDMA */
192 static struct fsl_spdif_soc_data fsl_spdif_imx8mm
= {
194 .shared_root_clock
= false,
195 .raw_capture_mode
= true,
197 .tx_burst
= FSL_SPDIF_TXFIFO_WML
,
198 .rx_burst
= FSL_SPDIF_RXFIFO_WML
,
199 .tx_formats
= FSL_SPDIF_FORMATS_PLAYBACK
,
202 static struct fsl_spdif_soc_data fsl_spdif_imx8ulp
= {
204 .shared_root_clock
= true,
205 .raw_capture_mode
= false,
207 .tx_burst
= 2, /* Applied for EDMA */
208 .rx_burst
= 2, /* Applied for EDMA */
209 .tx_formats
= SNDRV_PCM_FMTBIT_S24_LE
, /* Applied for EDMA */
210 .cchannel_192b
= true,
213 /* Check if clk is a root clock that does not share clock source with others */
214 static inline bool fsl_spdif_can_set_clk_rate(struct fsl_spdif_priv
*spdif
, int clk
)
216 return (clk
== STC_TXCLK_SPDIF_ROOT
) && !spdif
->soc
->shared_root_clock
;
219 /* DPLL locked and lock loss interrupt handler */
220 static void spdif_irq_dpll_lock(struct fsl_spdif_priv
*spdif_priv
)
222 struct regmap
*regmap
= spdif_priv
->regmap
;
223 struct platform_device
*pdev
= spdif_priv
->pdev
;
226 regmap_read(regmap
, REG_SPDIF_SRPC
, &locked
);
227 locked
&= SRPC_DPLL_LOCKED
;
229 dev_dbg(&pdev
->dev
, "isr: Rx dpll %s \n",
230 locked
? "locked" : "loss lock");
232 spdif_priv
->dpll_locked
= locked
? true : false;
234 if (spdif_priv
->snd_card
&& spdif_priv
->rxrate_kcontrol
) {
235 snd_ctl_notify(spdif_priv
->snd_card
,
236 SNDRV_CTL_EVENT_MASK_VALUE
,
237 &spdif_priv
->rxrate_kcontrol
->id
);
241 /* Receiver found illegal symbol interrupt handler */
242 static void spdif_irq_sym_error(struct fsl_spdif_priv
*spdif_priv
)
244 struct regmap
*regmap
= spdif_priv
->regmap
;
245 struct platform_device
*pdev
= spdif_priv
->pdev
;
247 dev_dbg(&pdev
->dev
, "isr: receiver found illegal symbol\n");
249 /* Clear illegal symbol if DPLL unlocked since no audio stream */
250 if (!spdif_priv
->dpll_locked
)
251 regmap_update_bits(regmap
, REG_SPDIF_SIE
, INT_SYM_ERR
, 0);
254 /* U/Q Channel receive register full */
255 static void spdif_irq_uqrx_full(struct fsl_spdif_priv
*spdif_priv
, char name
)
257 struct spdif_mixer_control
*ctrl
= &spdif_priv
->fsl_spdif_control
;
258 struct regmap
*regmap
= spdif_priv
->regmap
;
259 struct platform_device
*pdev
= spdif_priv
->pdev
;
260 u32
*pos
, size
, val
, reg
;
265 size
= SPDIF_UBITS_SIZE
;
270 size
= SPDIF_QSUB_SIZE
;
274 dev_err(&pdev
->dev
, "unsupported channel name\n");
278 dev_dbg(&pdev
->dev
, "isr: %c Channel receive register full\n", name
);
280 if (*pos
>= size
* 2) {
282 } else if (unlikely((*pos
% size
) + 3 > size
)) {
283 dev_err(&pdev
->dev
, "User bit receive buffer overflow\n");
287 regmap_read(regmap
, reg
, &val
);
288 ctrl
->subcode
[*pos
++] = val
>> 16;
289 ctrl
->subcode
[*pos
++] = val
>> 8;
290 ctrl
->subcode
[*pos
++] = val
;
293 /* U/Q Channel sync found */
294 static void spdif_irq_uq_sync(struct fsl_spdif_priv
*spdif_priv
)
296 struct spdif_mixer_control
*ctrl
= &spdif_priv
->fsl_spdif_control
;
297 struct platform_device
*pdev
= spdif_priv
->pdev
;
299 dev_dbg(&pdev
->dev
, "isr: U/Q Channel sync found\n");
301 /* U/Q buffer reset */
305 /* Set ready to this buffer */
306 ctrl
->ready_buf
= (ctrl
->qpos
- 1) / SPDIF_QSUB_SIZE
+ 1;
309 /* U/Q Channel framing error */
310 static void spdif_irq_uq_err(struct fsl_spdif_priv
*spdif_priv
)
312 struct spdif_mixer_control
*ctrl
= &spdif_priv
->fsl_spdif_control
;
313 struct regmap
*regmap
= spdif_priv
->regmap
;
314 struct platform_device
*pdev
= spdif_priv
->pdev
;
317 dev_dbg(&pdev
->dev
, "isr: U/Q Channel framing error\n");
319 /* Read U/Q data to clear the irq and do buffer reset */
320 regmap_read(regmap
, REG_SPDIF_SRU
, &val
);
321 regmap_read(regmap
, REG_SPDIF_SRQ
, &val
);
323 /* Drop this U/Q buffer */
329 /* Get spdif interrupt status and clear the interrupt */
330 static u32
spdif_intr_status_clear(struct fsl_spdif_priv
*spdif_priv
)
332 struct regmap
*regmap
= spdif_priv
->regmap
;
335 regmap_read(regmap
, REG_SPDIF_SIS
, &val
);
336 regmap_read(regmap
, REG_SPDIF_SIE
, &val2
);
338 regmap_write(regmap
, REG_SPDIF_SIC
, val
& val2
);
343 static irqreturn_t
spdif_isr(int irq
, void *devid
)
345 struct fsl_spdif_priv
*spdif_priv
= (struct fsl_spdif_priv
*)devid
;
346 struct platform_device
*pdev
= spdif_priv
->pdev
;
349 sis
= spdif_intr_status_clear(spdif_priv
);
351 if (sis
& INT_DPLL_LOCKED
)
352 spdif_irq_dpll_lock(spdif_priv
);
354 if (sis
& INT_TXFIFO_UNOV
)
355 dev_dbg(&pdev
->dev
, "isr: Tx FIFO under/overrun\n");
357 if (sis
& INT_TXFIFO_RESYNC
)
358 dev_dbg(&pdev
->dev
, "isr: Tx FIFO resync\n");
361 dev_dbg(&pdev
->dev
, "isr: cstatus new\n");
363 if (sis
& INT_VAL_NOGOOD
)
364 dev_dbg(&pdev
->dev
, "isr: validity flag no good\n");
366 if (sis
& INT_SYM_ERR
)
367 spdif_irq_sym_error(spdif_priv
);
369 if (sis
& INT_BIT_ERR
)
370 dev_dbg(&pdev
->dev
, "isr: receiver found parity bit error\n");
372 if (sis
& INT_URX_FUL
)
373 spdif_irq_uqrx_full(spdif_priv
, 'U');
375 if (sis
& INT_URX_OV
)
376 dev_dbg(&pdev
->dev
, "isr: U Channel receive register overrun\n");
378 if (sis
& INT_QRX_FUL
)
379 spdif_irq_uqrx_full(spdif_priv
, 'Q');
381 if (sis
& INT_QRX_OV
)
382 dev_dbg(&pdev
->dev
, "isr: Q Channel receive register overrun\n");
384 if (sis
& INT_UQ_SYNC
)
385 spdif_irq_uq_sync(spdif_priv
);
387 if (sis
& INT_UQ_ERR
)
388 spdif_irq_uq_err(spdif_priv
);
390 if (sis
& INT_RXFIFO_UNOV
)
391 dev_dbg(&pdev
->dev
, "isr: Rx FIFO under/overrun\n");
393 if (sis
& INT_RXFIFO_RESYNC
)
394 dev_dbg(&pdev
->dev
, "isr: Rx FIFO resync\n");
396 if (sis
& INT_LOSS_LOCK
)
397 spdif_irq_dpll_lock(spdif_priv
);
399 /* FIXME: Write Tx FIFO to clear TxEm */
401 dev_dbg(&pdev
->dev
, "isr: Tx FIFO empty\n");
403 /* FIXME: Read Rx FIFO to clear RxFIFOFul */
404 if (sis
& INT_RXFIFO_FUL
)
405 dev_dbg(&pdev
->dev
, "isr: Rx FIFO full\n");
410 static int spdif_softreset(struct fsl_spdif_priv
*spdif_priv
)
412 struct regmap
*regmap
= spdif_priv
->regmap
;
413 u32 val
, cycle
= 1000;
415 regcache_cache_bypass(regmap
, true);
417 regmap_write(regmap
, REG_SPDIF_SCR
, SCR_SOFT_RESET
);
420 * RESET bit would be cleared after finishing its reset procedure,
421 * which typically lasts 8 cycles. 1000 cycles will keep it safe.
424 regmap_read(regmap
, REG_SPDIF_SCR
, &val
);
425 } while ((val
& SCR_SOFT_RESET
) && cycle
--);
427 regcache_cache_bypass(regmap
, false);
428 regcache_mark_dirty(regmap
);
429 regcache_sync(regmap
);
437 static void spdif_set_cstatus(struct spdif_mixer_control
*ctrl
,
440 ctrl
->ch_status
[3] &= ~mask
;
441 ctrl
->ch_status
[3] |= cstatus
& mask
;
444 static void spdif_write_channel_status(struct fsl_spdif_priv
*spdif_priv
)
446 struct spdif_mixer_control
*ctrl
= &spdif_priv
->fsl_spdif_control
;
447 struct regmap
*regmap
= spdif_priv
->regmap
;
448 struct platform_device
*pdev
= spdif_priv
->pdev
;
451 ch_status
= (bitrev8(ctrl
->ch_status
[0]) << 16) |
452 (bitrev8(ctrl
->ch_status
[1]) << 8) |
453 bitrev8(ctrl
->ch_status
[2]);
454 regmap_write(regmap
, REG_SPDIF_STCSCH
, ch_status
);
456 dev_dbg(&pdev
->dev
, "STCSCH: 0x%06x\n", ch_status
);
458 ch_status
= bitrev8(ctrl
->ch_status
[3]) << 16;
459 regmap_write(regmap
, REG_SPDIF_STCSCL
, ch_status
);
461 dev_dbg(&pdev
->dev
, "STCSCL: 0x%06x\n", ch_status
);
463 if (spdif_priv
->soc
->cchannel_192b
) {
464 ch_status
= (bitrev8(ctrl
->ch_status
[0]) << 24) |
465 (bitrev8(ctrl
->ch_status
[1]) << 16) |
466 (bitrev8(ctrl
->ch_status
[2]) << 8) |
467 bitrev8(ctrl
->ch_status
[3]);
469 regmap_update_bits(regmap
, REG_SPDIF_SCR
, 0x1000000, 0x1000000);
472 * The first 32bit should be in REG_SPDIF_STCCA_31_0 register,
473 * but here we need to set REG_SPDIF_STCCA_191_160 on 8ULP
474 * then can get correct result with HDMI analyzer capture.
475 * There is a hardware bug here.
477 regmap_write(regmap
, REG_SPDIF_STCCA_191_160
, ch_status
);
481 /* Set SPDIF PhaseConfig register for rx clock */
482 static int spdif_set_rx_clksrc(struct fsl_spdif_priv
*spdif_priv
,
483 enum spdif_gainsel gainsel
, int dpll_locked
)
485 struct regmap
*regmap
= spdif_priv
->regmap
;
486 u8 clksrc
= spdif_priv
->rxclk_src
;
488 if (clksrc
>= SRPC_CLKSRC_MAX
|| gainsel
>= GAINSEL_MULTI_MAX
)
491 regmap_update_bits(regmap
, REG_SPDIF_SRPC
,
492 SRPC_CLKSRC_SEL_MASK
| SRPC_GAINSEL_MASK
,
493 SRPC_CLKSRC_SEL_SET(clksrc
) | SRPC_GAINSEL_SET(gainsel
));
498 static int fsl_spdif_probe_txclk(struct fsl_spdif_priv
*spdif_priv
, enum spdif_txrate index
);
500 static int spdif_set_sample_rate(struct snd_pcm_substream
*substream
,
503 struct snd_soc_pcm_runtime
*rtd
= snd_soc_substream_to_rtd(substream
);
504 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(snd_soc_rtd_to_cpu(rtd
, 0));
505 struct spdif_mixer_control
*ctrl
= &spdif_priv
->fsl_spdif_control
;
506 struct regmap
*regmap
= spdif_priv
->regmap
;
507 struct platform_device
*pdev
= spdif_priv
->pdev
;
508 unsigned long csfs
= 0;
514 switch (sample_rate
) {
516 rate
= SPDIF_TXRATE_22050
;
517 csfs
= IEC958_AES3_CON_FS_22050
;
520 rate
= SPDIF_TXRATE_32000
;
521 csfs
= IEC958_AES3_CON_FS_32000
;
524 rate
= SPDIF_TXRATE_44100
;
525 csfs
= IEC958_AES3_CON_FS_44100
;
528 rate
= SPDIF_TXRATE_48000
;
529 csfs
= IEC958_AES3_CON_FS_48000
;
532 rate
= SPDIF_TXRATE_88200
;
533 csfs
= IEC958_AES3_CON_FS_88200
;
536 rate
= SPDIF_TXRATE_96000
;
537 csfs
= IEC958_AES3_CON_FS_96000
;
540 rate
= SPDIF_TXRATE_176400
;
541 csfs
= IEC958_AES3_CON_FS_176400
;
544 rate
= SPDIF_TXRATE_192000
;
545 csfs
= IEC958_AES3_CON_FS_192000
;
548 dev_err(&pdev
->dev
, "unsupported sample rate %d\n", sample_rate
);
552 ret
= fsl_spdif_probe_txclk(spdif_priv
, rate
);
556 clk
= spdif_priv
->txclk_src
[rate
];
557 if (clk
>= STC_TXCLK_SRC_MAX
) {
558 dev_err(&pdev
->dev
, "tx clock source is out of range\n");
562 txclk_df
= spdif_priv
->txclk_df
[rate
];
564 dev_err(&pdev
->dev
, "the txclk_df can't be zero\n");
568 sysclk_df
= spdif_priv
->sysclk_df
[rate
];
570 if (!fsl_spdif_can_set_clk_rate(spdif_priv
, clk
))
573 /* The S/PDIF block needs a clock of 64 * fs * txclk_df */
574 ret
= clk_set_rate(spdif_priv
->txclk
[clk
],
575 64 * sample_rate
* txclk_df
);
577 dev_err(&pdev
->dev
, "failed to set tx clock rate\n");
582 dev_dbg(&pdev
->dev
, "expected clock rate = %d\n",
583 (64 * sample_rate
* txclk_df
* sysclk_df
));
584 dev_dbg(&pdev
->dev
, "actual clock rate = %ld\n",
585 clk_get_rate(spdif_priv
->txclk
[clk
]));
587 /* set fs field in consumer channel status */
588 spdif_set_cstatus(ctrl
, IEC958_AES3_CON_FS
, csfs
);
590 /* select clock source and divisor */
591 stc
= STC_TXCLK_ALL_EN
| STC_TXCLK_SRC_SET(clk
) |
592 STC_TXCLK_DF(txclk_df
) | STC_SYSCLK_DF(sysclk_df
);
593 mask
= STC_TXCLK_ALL_EN_MASK
| STC_TXCLK_SRC_MASK
|
594 STC_TXCLK_DF_MASK
| STC_SYSCLK_DF_MASK
;
595 regmap_update_bits(regmap
, REG_SPDIF_STC
, mask
, stc
);
597 dev_dbg(&pdev
->dev
, "set sample rate to %dHz for %dHz playback\n",
598 spdif_priv
->txrate
[rate
], sample_rate
);
603 static int fsl_spdif_startup(struct snd_pcm_substream
*substream
,
604 struct snd_soc_dai
*cpu_dai
)
606 struct snd_soc_pcm_runtime
*rtd
= snd_soc_substream_to_rtd(substream
);
607 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(snd_soc_rtd_to_cpu(rtd
, 0));
608 struct platform_device
*pdev
= spdif_priv
->pdev
;
609 struct regmap
*regmap
= spdif_priv
->regmap
;
613 /* Reset module and interrupts only for first initialization */
614 if (!snd_soc_dai_active(cpu_dai
)) {
615 ret
= spdif_softreset(spdif_priv
);
617 dev_err(&pdev
->dev
, "failed to soft reset\n");
621 /* Disable all the interrupts */
622 regmap_update_bits(regmap
, REG_SPDIF_SIE
, 0xffffff, 0);
625 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
) {
626 scr
= SCR_TXFIFO_AUTOSYNC
| SCR_TXFIFO_CTRL_NORMAL
|
627 SCR_TXSEL_NORMAL
| SCR_USRC_SEL_CHIP
|
629 mask
= SCR_TXFIFO_AUTOSYNC_MASK
| SCR_TXFIFO_CTRL_MASK
|
630 SCR_TXSEL_MASK
| SCR_USRC_SEL_MASK
|
631 SCR_TXFIFO_FSEL_MASK
;
633 scr
= SCR_RXFIFO_FSEL_IF8
| SCR_RXFIFO_AUTOSYNC
;
634 mask
= SCR_RXFIFO_FSEL_MASK
| SCR_RXFIFO_AUTOSYNC_MASK
|
635 SCR_RXFIFO_CTL_MASK
| SCR_RXFIFO_OFF_MASK
;
637 regmap_update_bits(regmap
, REG_SPDIF_SCR
, mask
, scr
);
639 /* Power up SPDIF module */
640 regmap_update_bits(regmap
, REG_SPDIF_SCR
, SCR_LOW_POWER
, 0);
645 static void fsl_spdif_shutdown(struct snd_pcm_substream
*substream
,
646 struct snd_soc_dai
*cpu_dai
)
648 struct snd_soc_pcm_runtime
*rtd
= snd_soc_substream_to_rtd(substream
);
649 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(snd_soc_rtd_to_cpu(rtd
, 0));
650 struct regmap
*regmap
= spdif_priv
->regmap
;
653 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
) {
655 mask
= SCR_TXFIFO_AUTOSYNC_MASK
| SCR_TXFIFO_CTRL_MASK
|
656 SCR_TXSEL_MASK
| SCR_USRC_SEL_MASK
|
657 SCR_TXFIFO_FSEL_MASK
;
658 /* Disable TX clock */
659 regmap_update_bits(regmap
, REG_SPDIF_STC
, STC_TXCLK_ALL_EN_MASK
, 0);
661 scr
= SCR_RXFIFO_OFF
| SCR_RXFIFO_CTL_ZERO
;
662 mask
= SCR_RXFIFO_FSEL_MASK
| SCR_RXFIFO_AUTOSYNC_MASK
|
663 SCR_RXFIFO_CTL_MASK
| SCR_RXFIFO_OFF_MASK
;
665 regmap_update_bits(regmap
, REG_SPDIF_SCR
, mask
, scr
);
667 /* Power down SPDIF module only if tx&rx are both inactive */
668 if (!snd_soc_dai_active(cpu_dai
)) {
669 spdif_intr_status_clear(spdif_priv
);
670 regmap_update_bits(regmap
, REG_SPDIF_SCR
,
671 SCR_LOW_POWER
, SCR_LOW_POWER
);
675 static int spdif_reparent_rootclk(struct fsl_spdif_priv
*spdif_priv
, unsigned int sample_rate
)
677 struct platform_device
*pdev
= spdif_priv
->pdev
;
681 /* Reparent clock if required condition is true */
682 if (!fsl_spdif_can_set_clk_rate(spdif_priv
, STC_TXCLK_SPDIF_ROOT
))
686 clk
= spdif_priv
->txclk
[STC_TXCLK_SPDIF_ROOT
];
688 /* Disable clock first, for it was enabled by pm_runtime */
689 clk_disable_unprepare(clk
);
690 fsl_asoc_reparent_pll_clocks(&pdev
->dev
, clk
, spdif_priv
->pll8k_clk
,
691 spdif_priv
->pll11k_clk
, sample_rate
);
692 ret
= clk_prepare_enable(clk
);
698 static int fsl_spdif_hw_params(struct snd_pcm_substream
*substream
,
699 struct snd_pcm_hw_params
*params
,
700 struct snd_soc_dai
*dai
)
702 struct snd_soc_pcm_runtime
*rtd
= snd_soc_substream_to_rtd(substream
);
703 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(snd_soc_rtd_to_cpu(rtd
, 0));
704 struct spdif_mixer_control
*ctrl
= &spdif_priv
->fsl_spdif_control
;
705 struct platform_device
*pdev
= spdif_priv
->pdev
;
706 u32 sample_rate
= params_rate(params
);
709 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
) {
710 ret
= spdif_reparent_rootclk(spdif_priv
, sample_rate
);
712 dev_err(&pdev
->dev
, "%s: reparent root clk failed: %d\n",
713 __func__
, sample_rate
);
717 ret
= spdif_set_sample_rate(substream
, sample_rate
);
719 dev_err(&pdev
->dev
, "%s: set sample rate failed: %d\n",
720 __func__
, sample_rate
);
723 spdif_set_cstatus(ctrl
, IEC958_AES3_CON_CLOCK
,
724 IEC958_AES3_CON_CLOCK_1000PPM
);
725 spdif_write_channel_status(spdif_priv
);
727 /* Setup rx clock source */
728 ret
= spdif_set_rx_clksrc(spdif_priv
, SPDIF_DEFAULT_GAINSEL
, 1);
734 static int fsl_spdif_trigger(struct snd_pcm_substream
*substream
,
735 int cmd
, struct snd_soc_dai
*dai
)
737 struct snd_soc_pcm_runtime
*rtd
= snd_soc_substream_to_rtd(substream
);
738 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(snd_soc_rtd_to_cpu(rtd
, 0));
739 struct regmap
*regmap
= spdif_priv
->regmap
;
740 bool tx
= substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
;
741 u32 intr
= SIE_INTR_FOR(tx
);
742 u32 dmaen
= SCR_DMA_xX_EN(tx
);
745 case SNDRV_PCM_TRIGGER_START
:
746 case SNDRV_PCM_TRIGGER_RESUME
:
747 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
748 regmap_update_bits(regmap
, REG_SPDIF_SIE
, intr
, intr
);
749 regmap_update_bits(regmap
, REG_SPDIF_SCR
, dmaen
, dmaen
);
751 case SNDRV_PCM_TRIGGER_STOP
:
752 case SNDRV_PCM_TRIGGER_SUSPEND
:
753 case SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
754 regmap_update_bits(regmap
, REG_SPDIF_SCR
, dmaen
, 0);
755 regmap_update_bits(regmap
, REG_SPDIF_SIE
, intr
, 0);
756 regmap_write(regmap
, REG_SPDIF_STL
, 0x0);
757 regmap_write(regmap
, REG_SPDIF_STR
, 0x0);
767 * FSL SPDIF IEC958 controller(mixer) functions
769 * Channel status get/put control
770 * User bit value get/put control
771 * Valid bit value get control
772 * DPLL lock status get control
773 * User bit sync mode selection control
776 static int fsl_spdif_info(struct snd_kcontrol
*kcontrol
,
777 struct snd_ctl_elem_info
*uinfo
)
779 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_IEC958
;
785 static int fsl_spdif_pb_get(struct snd_kcontrol
*kcontrol
,
786 struct snd_ctl_elem_value
*uvalue
)
788 struct snd_soc_dai
*cpu_dai
= snd_kcontrol_chip(kcontrol
);
789 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(cpu_dai
);
790 struct spdif_mixer_control
*ctrl
= &spdif_priv
->fsl_spdif_control
;
792 uvalue
->value
.iec958
.status
[0] = ctrl
->ch_status
[0];
793 uvalue
->value
.iec958
.status
[1] = ctrl
->ch_status
[1];
794 uvalue
->value
.iec958
.status
[2] = ctrl
->ch_status
[2];
795 uvalue
->value
.iec958
.status
[3] = ctrl
->ch_status
[3];
800 static int fsl_spdif_pb_put(struct snd_kcontrol
*kcontrol
,
801 struct snd_ctl_elem_value
*uvalue
)
803 struct snd_soc_dai
*cpu_dai
= snd_kcontrol_chip(kcontrol
);
804 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(cpu_dai
);
805 struct spdif_mixer_control
*ctrl
= &spdif_priv
->fsl_spdif_control
;
807 ctrl
->ch_status
[0] = uvalue
->value
.iec958
.status
[0];
808 ctrl
->ch_status
[1] = uvalue
->value
.iec958
.status
[1];
809 ctrl
->ch_status
[2] = uvalue
->value
.iec958
.status
[2];
810 ctrl
->ch_status
[3] = uvalue
->value
.iec958
.status
[3];
812 spdif_write_channel_status(spdif_priv
);
817 /* Get channel status from SPDIF_RX_CCHAN register */
818 static int fsl_spdif_capture_get(struct snd_kcontrol
*kcontrol
,
819 struct snd_ctl_elem_value
*ucontrol
)
821 struct snd_soc_dai
*cpu_dai
= snd_kcontrol_chip(kcontrol
);
822 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(cpu_dai
);
823 struct regmap
*regmap
= spdif_priv
->regmap
;
826 regmap_read(regmap
, REG_SPDIF_SIS
, &val
);
827 if (!(val
& INT_CNEW
))
830 regmap_read(regmap
, REG_SPDIF_SRCSH
, &cstatus
);
831 ucontrol
->value
.iec958
.status
[0] = (cstatus
>> 16) & 0xFF;
832 ucontrol
->value
.iec958
.status
[1] = (cstatus
>> 8) & 0xFF;
833 ucontrol
->value
.iec958
.status
[2] = cstatus
& 0xFF;
835 regmap_read(regmap
, REG_SPDIF_SRCSL
, &cstatus
);
836 ucontrol
->value
.iec958
.status
[3] = (cstatus
>> 16) & 0xFF;
837 ucontrol
->value
.iec958
.status
[4] = (cstatus
>> 8) & 0xFF;
838 ucontrol
->value
.iec958
.status
[5] = cstatus
& 0xFF;
841 regmap_write(regmap
, REG_SPDIF_SIC
, INT_CNEW
);
847 * Get User bits (subcode) from chip value which readed out
848 * in UChannel register.
850 static int fsl_spdif_subcode_get(struct snd_kcontrol
*kcontrol
,
851 struct snd_ctl_elem_value
*ucontrol
)
853 struct snd_soc_dai
*cpu_dai
= snd_kcontrol_chip(kcontrol
);
854 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(cpu_dai
);
855 struct spdif_mixer_control
*ctrl
= &spdif_priv
->fsl_spdif_control
;
859 spin_lock_irqsave(&ctrl
->ctl_lock
, flags
);
860 if (ctrl
->ready_buf
) {
861 int idx
= (ctrl
->ready_buf
- 1) * SPDIF_UBITS_SIZE
;
862 memcpy(&ucontrol
->value
.iec958
.subcode
[0],
863 &ctrl
->subcode
[idx
], SPDIF_UBITS_SIZE
);
866 spin_unlock_irqrestore(&ctrl
->ctl_lock
, flags
);
871 /* Q-subcode information. The byte size is SPDIF_UBITS_SIZE/8 */
872 static int fsl_spdif_qinfo(struct snd_kcontrol
*kcontrol
,
873 struct snd_ctl_elem_info
*uinfo
)
875 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_BYTES
;
876 uinfo
->count
= SPDIF_QSUB_SIZE
;
881 /* Get Q subcode from chip value which readed out in QChannel register */
882 static int fsl_spdif_qget(struct snd_kcontrol
*kcontrol
,
883 struct snd_ctl_elem_value
*ucontrol
)
885 struct snd_soc_dai
*cpu_dai
= snd_kcontrol_chip(kcontrol
);
886 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(cpu_dai
);
887 struct spdif_mixer_control
*ctrl
= &spdif_priv
->fsl_spdif_control
;
891 spin_lock_irqsave(&ctrl
->ctl_lock
, flags
);
892 if (ctrl
->ready_buf
) {
893 int idx
= (ctrl
->ready_buf
- 1) * SPDIF_QSUB_SIZE
;
894 memcpy(&ucontrol
->value
.bytes
.data
[0],
895 &ctrl
->qsub
[idx
], SPDIF_QSUB_SIZE
);
898 spin_unlock_irqrestore(&ctrl
->ctl_lock
, flags
);
903 /* Get valid good bit from interrupt status register */
904 static int fsl_spdif_rx_vbit_get(struct snd_kcontrol
*kcontrol
,
905 struct snd_ctl_elem_value
*ucontrol
)
907 struct snd_soc_dai
*cpu_dai
= snd_kcontrol_chip(kcontrol
);
908 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(cpu_dai
);
909 struct regmap
*regmap
= spdif_priv
->regmap
;
912 regmap_read(regmap
, REG_SPDIF_SIS
, &val
);
913 ucontrol
->value
.integer
.value
[0] = (val
& INT_VAL_NOGOOD
) != 0;
914 regmap_write(regmap
, REG_SPDIF_SIC
, INT_VAL_NOGOOD
);
919 static int fsl_spdif_tx_vbit_get(struct snd_kcontrol
*kcontrol
,
920 struct snd_ctl_elem_value
*ucontrol
)
922 struct snd_soc_dai
*cpu_dai
= snd_kcontrol_chip(kcontrol
);
923 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(cpu_dai
);
924 struct regmap
*regmap
= spdif_priv
->regmap
;
927 regmap_read(regmap
, REG_SPDIF_SCR
, &val
);
928 val
= (val
& SCR_VAL_MASK
) >> SCR_VAL_OFFSET
;
930 ucontrol
->value
.integer
.value
[0] = val
;
935 static int fsl_spdif_tx_vbit_put(struct snd_kcontrol
*kcontrol
,
936 struct snd_ctl_elem_value
*ucontrol
)
938 struct snd_soc_dai
*cpu_dai
= snd_kcontrol_chip(kcontrol
);
939 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(cpu_dai
);
940 struct regmap
*regmap
= spdif_priv
->regmap
;
941 u32 val
= (1 - ucontrol
->value
.integer
.value
[0]) << SCR_VAL_OFFSET
;
943 regmap_update_bits(regmap
, REG_SPDIF_SCR
, SCR_VAL_MASK
, val
);
948 static int fsl_spdif_rx_rcm_get(struct snd_kcontrol
*kcontrol
,
949 struct snd_ctl_elem_value
*ucontrol
)
951 struct snd_soc_dai
*cpu_dai
= snd_kcontrol_chip(kcontrol
);
952 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(cpu_dai
);
953 struct regmap
*regmap
= spdif_priv
->regmap
;
956 regmap_read(regmap
, REG_SPDIF_SCR
, &val
);
957 val
= (val
& SCR_RAW_CAPTURE_MODE
) ? 1 : 0;
958 ucontrol
->value
.integer
.value
[0] = val
;
963 static int fsl_spdif_rx_rcm_put(struct snd_kcontrol
*kcontrol
,
964 struct snd_ctl_elem_value
*ucontrol
)
966 struct snd_soc_dai
*cpu_dai
= snd_kcontrol_chip(kcontrol
);
967 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(cpu_dai
);
968 struct regmap
*regmap
= spdif_priv
->regmap
;
969 u32 val
= (ucontrol
->value
.integer
.value
[0] ? SCR_RAW_CAPTURE_MODE
: 0);
972 cpu_dai
->driver
->capture
.formats
|= SNDRV_PCM_FMTBIT_S32_LE
;
974 cpu_dai
->driver
->capture
.formats
&= ~SNDRV_PCM_FMTBIT_S32_LE
;
976 regmap_update_bits(regmap
, REG_SPDIF_SCR
, SCR_RAW_CAPTURE_MODE
, val
);
981 static int fsl_spdif_bypass_get(struct snd_kcontrol
*kcontrol
,
982 struct snd_ctl_elem_value
*ucontrol
)
984 struct snd_soc_dai
*dai
= snd_kcontrol_chip(kcontrol
);
985 struct fsl_spdif_priv
*priv
= snd_soc_dai_get_drvdata(dai
);
987 ucontrol
->value
.integer
.value
[0] = priv
->bypass
? 1 : 0;
992 static int fsl_spdif_bypass_put(struct snd_kcontrol
*kcontrol
,
993 struct snd_ctl_elem_value
*ucontrol
)
995 struct snd_soc_dai
*dai
= snd_kcontrol_chip(kcontrol
);
996 struct fsl_spdif_priv
*priv
= snd_soc_dai_get_drvdata(dai
);
997 struct snd_soc_card
*card
= dai
->component
->card
;
998 bool set
= (ucontrol
->value
.integer
.value
[0] != 0);
999 struct regmap
*regmap
= priv
->regmap
;
1000 struct snd_soc_pcm_runtime
*rtd
;
1004 rtd
= snd_soc_get_pcm_runtime(card
, card
->dai_link
);
1006 if (priv
->bypass
== set
)
1007 return 0; /* nothing to do */
1009 if (snd_soc_dai_active(dai
)) {
1010 dev_err(dai
->dev
, "Cannot change BYPASS mode while stream is running.\n");
1014 pm_runtime_get_sync(dai
->dev
);
1017 /* Disable interrupts */
1018 regmap_update_bits(regmap
, REG_SPDIF_SIE
, 0xffffff, 0);
1020 /* Configure BYPASS mode */
1021 scr
= SCR_TXSEL_RX
| SCR_RXFIFO_OFF
;
1022 mask
= SCR_RXFIFO_FSEL_MASK
| SCR_RXFIFO_AUTOSYNC_MASK
|
1023 SCR_RXFIFO_CTL_MASK
| SCR_RXFIFO_OFF_MASK
| SCR_TXSEL_MASK
;
1024 /* Power up SPDIF module */
1025 mask
|= SCR_LOW_POWER
;
1027 /* Power down SPDIF module, disable TX */
1028 scr
= SCR_LOW_POWER
| SCR_TXSEL_OFF
;
1029 mask
= SCR_LOW_POWER
| SCR_TXSEL_MASK
;
1032 regmap_update_bits(regmap
, REG_SPDIF_SCR
, mask
, scr
);
1034 /* Disable playback & capture if BYPASS mode is enabled, enable otherwise */
1035 for_each_pcm_streams(stream
)
1036 rtd
->pcm
->streams
[stream
].substream_count
= (set
? 0 : 1);
1039 pm_runtime_put_sync(dai
->dev
);
1044 /* DPLL lock information */
1045 static int fsl_spdif_rxrate_info(struct snd_kcontrol
*kcontrol
,
1046 struct snd_ctl_elem_info
*uinfo
)
1048 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
1050 uinfo
->value
.integer
.min
= 16000;
1051 uinfo
->value
.integer
.max
= 192000;
1056 static u32 gainsel_multi
[GAINSEL_MULTI_MAX
] = {
1057 24, 16, 12, 8, 6, 4, 3,
1060 /* Get RX data clock rate given the SPDIF bus_clk */
1061 static int spdif_get_rxclk_rate(struct fsl_spdif_priv
*spdif_priv
,
1062 enum spdif_gainsel gainsel
)
1064 struct regmap
*regmap
= spdif_priv
->regmap
;
1065 struct platform_device
*pdev
= spdif_priv
->pdev
;
1066 u64 tmpval64
, busclk_freq
= 0;
1067 u32 freqmeas
, phaseconf
;
1070 regmap_read(regmap
, REG_SPDIF_SRFM
, &freqmeas
);
1071 regmap_read(regmap
, REG_SPDIF_SRPC
, &phaseconf
);
1073 clksrc
= (phaseconf
>> SRPC_CLKSRC_SEL_OFFSET
) & 0xf;
1075 /* Get bus clock from system */
1076 if (srpc_dpll_locked
[clksrc
] && (phaseconf
& SRPC_DPLL_LOCKED
))
1077 busclk_freq
= clk_get_rate(spdif_priv
->sysclk
);
1079 /* FreqMeas_CLK = (BUS_CLK * FreqMeas) / 2 ^ 10 / GAINSEL / 128 */
1080 tmpval64
= (u64
) busclk_freq
* freqmeas
;
1081 do_div(tmpval64
, gainsel_multi
[gainsel
] * 1024);
1082 do_div(tmpval64
, 128 * 1024);
1084 dev_dbg(&pdev
->dev
, "FreqMeas: %d\n", freqmeas
);
1085 dev_dbg(&pdev
->dev
, "BusclkFreq: %lld\n", busclk_freq
);
1086 dev_dbg(&pdev
->dev
, "RxRate: %lld\n", tmpval64
);
1088 return (int)tmpval64
;
1092 * Get DPLL lock or not info from stable interrupt status register.
1093 * User application must use this control to get locked,
1094 * then can do next PCM operation
1096 static int fsl_spdif_rxrate_get(struct snd_kcontrol
*kcontrol
,
1097 struct snd_ctl_elem_value
*ucontrol
)
1099 struct snd_soc_dai
*cpu_dai
= snd_kcontrol_chip(kcontrol
);
1100 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(cpu_dai
);
1103 if (spdif_priv
->dpll_locked
)
1104 rate
= spdif_get_rxclk_rate(spdif_priv
, SPDIF_DEFAULT_GAINSEL
);
1106 ucontrol
->value
.integer
.value
[0] = rate
;
1112 * User bit sync mode:
1113 * 1 CD User channel subcode
1116 static int fsl_spdif_usync_get(struct snd_kcontrol
*kcontrol
,
1117 struct snd_ctl_elem_value
*ucontrol
)
1119 struct snd_soc_dai
*cpu_dai
= snd_kcontrol_chip(kcontrol
);
1120 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(cpu_dai
);
1121 struct regmap
*regmap
= spdif_priv
->regmap
;
1124 regmap_read(regmap
, REG_SPDIF_SRCD
, &val
);
1125 ucontrol
->value
.integer
.value
[0] = (val
& SRCD_CD_USER
) != 0;
1131 * User bit sync mode:
1132 * 1 CD User channel subcode
1135 static int fsl_spdif_usync_put(struct snd_kcontrol
*kcontrol
,
1136 struct snd_ctl_elem_value
*ucontrol
)
1138 struct snd_soc_dai
*cpu_dai
= snd_kcontrol_chip(kcontrol
);
1139 struct fsl_spdif_priv
*spdif_priv
= snd_soc_dai_get_drvdata(cpu_dai
);
1140 struct regmap
*regmap
= spdif_priv
->regmap
;
1141 u32 val
= ucontrol
->value
.integer
.value
[0] << SRCD_CD_USER_OFFSET
;
1143 regmap_update_bits(regmap
, REG_SPDIF_SRCD
, SRCD_CD_USER
, val
);
1148 /* FSL SPDIF IEC958 controller defines */
1149 static struct snd_kcontrol_new fsl_spdif_ctrls
[] = {
1150 /* Status cchanel controller */
1152 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
1153 .name
= SNDRV_CTL_NAME_IEC958("", PLAYBACK
, DEFAULT
),
1154 .access
= SNDRV_CTL_ELEM_ACCESS_READ
|
1155 SNDRV_CTL_ELEM_ACCESS_WRITE
|
1156 SNDRV_CTL_ELEM_ACCESS_VOLATILE
,
1157 .info
= fsl_spdif_info
,
1158 .get
= fsl_spdif_pb_get
,
1159 .put
= fsl_spdif_pb_put
,
1162 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1163 .name
= SNDRV_CTL_NAME_IEC958("", CAPTURE
, DEFAULT
),
1164 .access
= SNDRV_CTL_ELEM_ACCESS_READ
|
1165 SNDRV_CTL_ELEM_ACCESS_VOLATILE
,
1166 .info
= fsl_spdif_info
,
1167 .get
= fsl_spdif_capture_get
,
1169 /* User bits controller */
1171 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1172 .name
= "IEC958 Subcode Capture Default",
1173 .access
= SNDRV_CTL_ELEM_ACCESS_READ
|
1174 SNDRV_CTL_ELEM_ACCESS_VOLATILE
,
1175 .info
= fsl_spdif_info
,
1176 .get
= fsl_spdif_subcode_get
,
1179 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1180 .name
= "IEC958 Q-subcode Capture Default",
1181 .access
= SNDRV_CTL_ELEM_ACCESS_READ
|
1182 SNDRV_CTL_ELEM_ACCESS_VOLATILE
,
1183 .info
= fsl_spdif_qinfo
,
1184 .get
= fsl_spdif_qget
,
1186 /* Valid bit error controller */
1188 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1189 .name
= "IEC958 RX V-Bit Errors",
1190 .access
= SNDRV_CTL_ELEM_ACCESS_READ
|
1191 SNDRV_CTL_ELEM_ACCESS_VOLATILE
,
1192 .info
= snd_ctl_boolean_mono_info
,
1193 .get
= fsl_spdif_rx_vbit_get
,
1196 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1197 .name
= "IEC958 TX V-Bit",
1198 .access
= SNDRV_CTL_ELEM_ACCESS_READ
|
1199 SNDRV_CTL_ELEM_ACCESS_WRITE
|
1200 SNDRV_CTL_ELEM_ACCESS_VOLATILE
,
1201 .info
= snd_ctl_boolean_mono_info
,
1202 .get
= fsl_spdif_tx_vbit_get
,
1203 .put
= fsl_spdif_tx_vbit_put
,
1205 /* DPLL lock info get controller */
1207 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
1208 .name
= RX_SAMPLE_RATE_KCONTROL
,
1209 .access
= SNDRV_CTL_ELEM_ACCESS_READ
|
1210 SNDRV_CTL_ELEM_ACCESS_VOLATILE
,
1211 .info
= fsl_spdif_rxrate_info
,
1212 .get
= fsl_spdif_rxrate_get
,
1214 /* RX bypass controller */
1216 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1217 .name
= "Bypass Mode",
1218 .access
= SNDRV_CTL_ELEM_ACCESS_READWRITE
,
1219 .info
= snd_ctl_boolean_mono_info
,
1220 .get
= fsl_spdif_bypass_get
,
1221 .put
= fsl_spdif_bypass_put
,
1223 /* User bit sync mode set/get controller */
1225 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1226 .name
= "IEC958 USyncMode CDText",
1227 .access
= SNDRV_CTL_ELEM_ACCESS_READ
|
1228 SNDRV_CTL_ELEM_ACCESS_WRITE
|
1229 SNDRV_CTL_ELEM_ACCESS_VOLATILE
,
1230 .info
= snd_ctl_boolean_mono_info
,
1231 .get
= fsl_spdif_usync_get
,
1232 .put
= fsl_spdif_usync_put
,
1236 static struct snd_kcontrol_new fsl_spdif_ctrls_rcm
[] = {
1238 .iface
= SNDRV_CTL_ELEM_IFACE_PCM
,
1239 .name
= "IEC958 Raw Capture Mode",
1240 .access
= SNDRV_CTL_ELEM_ACCESS_READ
|
1241 SNDRV_CTL_ELEM_ACCESS_WRITE
|
1242 SNDRV_CTL_ELEM_ACCESS_VOLATILE
,
1243 .info
= snd_ctl_boolean_mono_info
,
1244 .get
= fsl_spdif_rx_rcm_get
,
1245 .put
= fsl_spdif_rx_rcm_put
,
1249 static int fsl_spdif_dai_probe(struct snd_soc_dai
*dai
)
1251 struct fsl_spdif_priv
*spdif_private
= snd_soc_dai_get_drvdata(dai
);
1253 snd_soc_dai_init_dma_data(dai
, &spdif_private
->dma_params_tx
,
1254 &spdif_private
->dma_params_rx
);
1256 snd_soc_add_dai_controls(dai
, fsl_spdif_ctrls
, ARRAY_SIZE(fsl_spdif_ctrls
));
1258 if (spdif_private
->soc
->raw_capture_mode
)
1259 snd_soc_add_dai_controls(dai
, fsl_spdif_ctrls_rcm
,
1260 ARRAY_SIZE(fsl_spdif_ctrls_rcm
));
1262 spdif_private
->snd_card
= dai
->component
->card
->snd_card
;
1263 spdif_private
->rxrate_kcontrol
= snd_soc_card_get_kcontrol(dai
->component
->card
,
1264 RX_SAMPLE_RATE_KCONTROL
);
1265 if (!spdif_private
->rxrate_kcontrol
)
1266 dev_err(&spdif_private
->pdev
->dev
, "failed to get %s kcontrol\n",
1267 RX_SAMPLE_RATE_KCONTROL
);
1269 /*Clear the val bit for Tx*/
1270 regmap_update_bits(spdif_private
->regmap
, REG_SPDIF_SCR
,
1271 SCR_VAL_MASK
, SCR_VAL_CLEAR
);
1276 static const struct snd_soc_dai_ops fsl_spdif_dai_ops
= {
1277 .probe
= fsl_spdif_dai_probe
,
1278 .startup
= fsl_spdif_startup
,
1279 .hw_params
= fsl_spdif_hw_params
,
1280 .trigger
= fsl_spdif_trigger
,
1281 .shutdown
= fsl_spdif_shutdown
,
1284 static struct snd_soc_dai_driver fsl_spdif_dai
= {
1286 .stream_name
= "CPU-Playback",
1289 .rates
= FSL_SPDIF_RATES_PLAYBACK
,
1290 .formats
= FSL_SPDIF_FORMATS_PLAYBACK
,
1293 .stream_name
= "CPU-Capture",
1296 .rates
= FSL_SPDIF_RATES_CAPTURE
,
1297 .formats
= FSL_SPDIF_FORMATS_CAPTURE
,
1299 .ops
= &fsl_spdif_dai_ops
,
1302 static const struct snd_soc_component_driver fsl_spdif_component
= {
1303 .name
= "fsl-spdif",
1304 .legacy_dai_naming
= 1,
1307 /* FSL SPDIF REGMAP */
1308 static const struct reg_default fsl_spdif_reg_defaults
[] = {
1309 {REG_SPDIF_SCR
, 0x00000400},
1310 {REG_SPDIF_SRCD
, 0x00000000},
1311 {REG_SPDIF_SIE
, 0x00000000},
1312 {REG_SPDIF_STL
, 0x00000000},
1313 {REG_SPDIF_STR
, 0x00000000},
1314 {REG_SPDIF_STCSCH
, 0x00000000},
1315 {REG_SPDIF_STCSCL
, 0x00000000},
1316 {REG_SPDIF_STCSPH
, 0x00000000},
1317 {REG_SPDIF_STCSPL
, 0x00000000},
1318 {REG_SPDIF_STC
, 0x00020f00},
1321 static bool fsl_spdif_readable_reg(struct device
*dev
, unsigned int reg
)
1325 case REG_SPDIF_SRCD
:
1326 case REG_SPDIF_SRPC
:
1331 case REG_SPDIF_SRCSH
:
1332 case REG_SPDIF_SRCSL
:
1335 case REG_SPDIF_STCSCH
:
1336 case REG_SPDIF_STCSCL
:
1337 case REG_SPDIF_STCSPH
:
1338 case REG_SPDIF_STCSPL
:
1339 case REG_SPDIF_SRFM
:
1341 case REG_SPDIF_SRCCA_31_0
:
1342 case REG_SPDIF_SRCCA_63_32
:
1343 case REG_SPDIF_SRCCA_95_64
:
1344 case REG_SPDIF_SRCCA_127_96
:
1345 case REG_SPDIF_SRCCA_159_128
:
1346 case REG_SPDIF_SRCCA_191_160
:
1347 case REG_SPDIF_STCCA_31_0
:
1348 case REG_SPDIF_STCCA_63_32
:
1349 case REG_SPDIF_STCCA_95_64
:
1350 case REG_SPDIF_STCCA_127_96
:
1351 case REG_SPDIF_STCCA_159_128
:
1352 case REG_SPDIF_STCCA_191_160
:
1359 static bool fsl_spdif_volatile_reg(struct device
*dev
, unsigned int reg
)
1362 case REG_SPDIF_SRPC
:
1366 case REG_SPDIF_SRCSH
:
1367 case REG_SPDIF_SRCSL
:
1370 case REG_SPDIF_SRFM
:
1371 case REG_SPDIF_SRCCA_31_0
:
1372 case REG_SPDIF_SRCCA_63_32
:
1373 case REG_SPDIF_SRCCA_95_64
:
1374 case REG_SPDIF_SRCCA_127_96
:
1375 case REG_SPDIF_SRCCA_159_128
:
1376 case REG_SPDIF_SRCCA_191_160
:
1383 static bool fsl_spdif_writeable_reg(struct device
*dev
, unsigned int reg
)
1387 case REG_SPDIF_SRCD
:
1388 case REG_SPDIF_SRPC
:
1393 case REG_SPDIF_STCSCH
:
1394 case REG_SPDIF_STCSCL
:
1395 case REG_SPDIF_STCSPH
:
1396 case REG_SPDIF_STCSPL
:
1398 case REG_SPDIF_STCCA_31_0
:
1399 case REG_SPDIF_STCCA_63_32
:
1400 case REG_SPDIF_STCCA_95_64
:
1401 case REG_SPDIF_STCCA_127_96
:
1402 case REG_SPDIF_STCCA_159_128
:
1403 case REG_SPDIF_STCCA_191_160
:
1410 static const struct regmap_config fsl_spdif_regmap_config
= {
1415 .max_register
= REG_SPDIF_STCCA_191_160
,
1416 .reg_defaults
= fsl_spdif_reg_defaults
,
1417 .num_reg_defaults
= ARRAY_SIZE(fsl_spdif_reg_defaults
),
1418 .readable_reg
= fsl_spdif_readable_reg
,
1419 .volatile_reg
= fsl_spdif_volatile_reg
,
1420 .writeable_reg
= fsl_spdif_writeable_reg
,
1421 .cache_type
= REGCACHE_FLAT
,
1424 static u32
fsl_spdif_txclk_caldiv(struct fsl_spdif_priv
*spdif_priv
,
1425 struct clk
*clk
, u64 savesub
,
1426 enum spdif_txrate index
, bool round
)
1428 static const u32 rate
[] = { 22050, 32000, 44100, 48000, 88200, 96000, 176400,
1430 bool is_sysclk
= clk_is_match(clk
, spdif_priv
->sysclk
);
1431 u64 rate_ideal
, rate_actual
, sub
;
1433 u16 sysclk_dfmin
, sysclk_dfmax
, sysclk_df
;
1436 /* The sysclk has an extra divisor [2, 512] */
1437 sysclk_dfmin
= is_sysclk
? 2 : 1;
1438 sysclk_dfmax
= is_sysclk
? 512 : 1;
1440 for (sysclk_df
= sysclk_dfmin
; sysclk_df
<= sysclk_dfmax
; sysclk_df
++) {
1441 for (txclk_df
= 1; txclk_df
<= 128; txclk_df
++) {
1442 rate_ideal
= rate
[index
] * txclk_df
* 64ULL;
1444 rate_actual
= clk_round_rate(clk
, rate_ideal
);
1446 rate_actual
= clk_get_rate(clk
);
1448 arate
= rate_actual
/ 64;
1449 arate
/= txclk_df
* sysclk_df
;
1451 if (arate
== rate
[index
]) {
1454 spdif_priv
->txclk_df
[index
] = txclk_df
;
1455 spdif_priv
->sysclk_df
[index
] = sysclk_df
;
1456 spdif_priv
->txrate
[index
] = arate
;
1458 } else if (arate
/ rate
[index
] == 1) {
1459 /* A little bigger than expect */
1460 sub
= (u64
)(arate
- rate
[index
]) * 100000;
1461 do_div(sub
, rate
[index
]);
1465 spdif_priv
->txclk_df
[index
] = txclk_df
;
1466 spdif_priv
->sysclk_df
[index
] = sysclk_df
;
1467 spdif_priv
->txrate
[index
] = arate
;
1468 } else if (rate
[index
] / arate
== 1) {
1469 /* A little smaller than expect */
1470 sub
= (u64
)(rate
[index
] - arate
) * 100000;
1471 do_div(sub
, rate
[index
]);
1475 spdif_priv
->txclk_df
[index
] = txclk_df
;
1476 spdif_priv
->sysclk_df
[index
] = sysclk_df
;
1477 spdif_priv
->txrate
[index
] = arate
;
1486 static int fsl_spdif_probe_txclk(struct fsl_spdif_priv
*spdif_priv
,
1487 enum spdif_txrate index
)
1489 static const u32 rate
[] = { 22050, 32000, 44100, 48000, 88200, 96000, 176400,
1491 struct platform_device
*pdev
= spdif_priv
->pdev
;
1492 struct device
*dev
= &pdev
->dev
;
1493 u64 savesub
= 100000, ret
;
1497 for (i
= 0; i
< STC_TXCLK_SRC_MAX
; i
++) {
1498 clk
= spdif_priv
->txclk
[i
];
1500 dev_err(dev
, "no rxtx%d clock in devicetree\n", i
);
1501 return PTR_ERR(clk
);
1503 if (!clk_get_rate(clk
))
1506 ret
= fsl_spdif_txclk_caldiv(spdif_priv
, clk
, savesub
, index
,
1507 fsl_spdif_can_set_clk_rate(spdif_priv
, i
));
1512 spdif_priv
->txclk_src
[index
] = i
;
1514 /* To quick catch a divisor, we allow a 0.1% deviation */
1519 dev_dbg(dev
, "use rxtx%d as tx clock source for %dHz sample rate\n",
1520 spdif_priv
->txclk_src
[index
], rate
[index
]);
1521 dev_dbg(dev
, "use txclk df %d for %dHz sample rate\n",
1522 spdif_priv
->txclk_df
[index
], rate
[index
]);
1523 if (clk_is_match(spdif_priv
->txclk
[spdif_priv
->txclk_src
[index
]], spdif_priv
->sysclk
))
1524 dev_dbg(dev
, "use sysclk df %d for %dHz sample rate\n",
1525 spdif_priv
->sysclk_df
[index
], rate
[index
]);
1526 dev_dbg(dev
, "the best rate for %dHz sample rate is %dHz\n",
1527 rate
[index
], spdif_priv
->txrate
[index
]);
1532 static int fsl_spdif_probe(struct platform_device
*pdev
)
1534 struct fsl_spdif_priv
*spdif_priv
;
1535 struct spdif_mixer_control
*ctrl
;
1536 struct resource
*res
;
1541 spdif_priv
= devm_kzalloc(&pdev
->dev
, sizeof(*spdif_priv
), GFP_KERNEL
);
1545 spdif_priv
->pdev
= pdev
;
1547 spdif_priv
->soc
= of_device_get_match_data(&pdev
->dev
);
1549 /* Initialize this copy of the CPU DAI driver structure */
1550 memcpy(&spdif_priv
->cpu_dai_drv
, &fsl_spdif_dai
, sizeof(fsl_spdif_dai
));
1551 spdif_priv
->cpu_dai_drv
.name
= dev_name(&pdev
->dev
);
1552 spdif_priv
->cpu_dai_drv
.playback
.formats
=
1553 spdif_priv
->soc
->tx_formats
;
1555 /* Get the addresses and IRQ */
1556 regs
= devm_platform_get_and_ioremap_resource(pdev
, 0, &res
);
1558 return PTR_ERR(regs
);
1560 spdif_priv
->regmap
= devm_regmap_init_mmio(&pdev
->dev
, regs
, &fsl_spdif_regmap_config
);
1561 if (IS_ERR(spdif_priv
->regmap
)) {
1562 dev_err(&pdev
->dev
, "regmap init failed\n");
1563 return PTR_ERR(spdif_priv
->regmap
);
1566 for (i
= 0; i
< spdif_priv
->soc
->interrupts
; i
++) {
1567 irq
= platform_get_irq(pdev
, i
);
1571 ret
= devm_request_irq(&pdev
->dev
, irq
, spdif_isr
, 0,
1572 dev_name(&pdev
->dev
), spdif_priv
);
1574 dev_err(&pdev
->dev
, "could not claim irq %u\n", irq
);
1579 for (i
= 0; i
< STC_TXCLK_SRC_MAX
; i
++) {
1580 sprintf(tmp
, "rxtx%d", i
);
1581 spdif_priv
->txclk
[i
] = devm_clk_get(&pdev
->dev
, tmp
);
1582 if (IS_ERR(spdif_priv
->txclk
[i
])) {
1583 dev_err(&pdev
->dev
, "no rxtx%d clock in devicetree\n", i
);
1584 return PTR_ERR(spdif_priv
->txclk
[i
]);
1588 /* Get system clock for rx clock rate calculation */
1589 spdif_priv
->sysclk
= spdif_priv
->txclk
[5];
1590 if (IS_ERR(spdif_priv
->sysclk
)) {
1591 dev_err(&pdev
->dev
, "no sys clock (rxtx5) in devicetree\n");
1592 return PTR_ERR(spdif_priv
->sysclk
);
1595 /* Get core clock for data register access via DMA */
1596 spdif_priv
->coreclk
= devm_clk_get(&pdev
->dev
, "core");
1597 if (IS_ERR(spdif_priv
->coreclk
)) {
1598 dev_err(&pdev
->dev
, "no core clock in devicetree\n");
1599 return PTR_ERR(spdif_priv
->coreclk
);
1602 spdif_priv
->spbaclk
= devm_clk_get(&pdev
->dev
, "spba");
1603 if (IS_ERR(spdif_priv
->spbaclk
))
1604 dev_warn(&pdev
->dev
, "no spba clock in devicetree\n");
1606 /* Select clock source for rx/tx clock */
1607 spdif_priv
->rxclk
= spdif_priv
->txclk
[1];
1608 if (IS_ERR(spdif_priv
->rxclk
)) {
1609 dev_err(&pdev
->dev
, "no rxtx1 clock in devicetree\n");
1610 return PTR_ERR(spdif_priv
->rxclk
);
1612 spdif_priv
->rxclk_src
= DEFAULT_RXCLK_SRC
;
1614 fsl_asoc_get_pll_clocks(&pdev
->dev
, &spdif_priv
->pll8k_clk
,
1615 &spdif_priv
->pll11k_clk
);
1617 /* Initial spinlock for control data */
1618 ctrl
= &spdif_priv
->fsl_spdif_control
;
1619 spin_lock_init(&ctrl
->ctl_lock
);
1621 /* Init tx channel status default value */
1622 ctrl
->ch_status
[0] = IEC958_AES0_CON_NOT_COPYRIGHT
|
1623 IEC958_AES0_CON_EMPHASIS_5015
;
1624 ctrl
->ch_status
[1] = IEC958_AES1_CON_DIGDIGCONV_ID
;
1625 ctrl
->ch_status
[2] = 0x00;
1626 ctrl
->ch_status
[3] = IEC958_AES3_CON_FS_44100
|
1627 IEC958_AES3_CON_CLOCK_1000PPM
;
1629 spdif_priv
->dpll_locked
= false;
1631 spdif_priv
->dma_params_tx
.maxburst
= spdif_priv
->soc
->tx_burst
;
1632 spdif_priv
->dma_params_rx
.maxburst
= spdif_priv
->soc
->rx_burst
;
1633 spdif_priv
->dma_params_tx
.addr
= res
->start
+ REG_SPDIF_STL
;
1634 spdif_priv
->dma_params_rx
.addr
= res
->start
+ REG_SPDIF_SRL
;
1636 /* Register with ASoC */
1637 dev_set_drvdata(&pdev
->dev
, spdif_priv
);
1638 pm_runtime_enable(&pdev
->dev
);
1639 regcache_cache_only(spdif_priv
->regmap
, true);
1642 * Register platform component before registering cpu dai for there
1643 * is not defer probe for platform component in snd_soc_add_pcm_runtime().
1645 ret
= imx_pcm_dma_init(pdev
);
1647 dev_err_probe(&pdev
->dev
, ret
, "imx_pcm_dma_init failed\n");
1648 goto err_pm_disable
;
1651 ret
= devm_snd_soc_register_component(&pdev
->dev
, &fsl_spdif_component
,
1652 &spdif_priv
->cpu_dai_drv
, 1);
1654 dev_err(&pdev
->dev
, "failed to register DAI: %d\n", ret
);
1655 goto err_pm_disable
;
1661 pm_runtime_disable(&pdev
->dev
);
1665 static void fsl_spdif_remove(struct platform_device
*pdev
)
1667 pm_runtime_disable(&pdev
->dev
);
1670 static int fsl_spdif_runtime_suspend(struct device
*dev
)
1672 struct fsl_spdif_priv
*spdif_priv
= dev_get_drvdata(dev
);
1675 /* Disable all the interrupts */
1676 regmap_update_bits(spdif_priv
->regmap
, REG_SPDIF_SIE
, 0xffffff, 0);
1678 regmap_read(spdif_priv
->regmap
, REG_SPDIF_SRPC
,
1679 &spdif_priv
->regcache_srpc
);
1680 regcache_cache_only(spdif_priv
->regmap
, true);
1682 for (i
= 0; i
< STC_TXCLK_SRC_MAX
; i
++)
1683 clk_disable_unprepare(spdif_priv
->txclk
[i
]);
1685 if (!IS_ERR(spdif_priv
->spbaclk
))
1686 clk_disable_unprepare(spdif_priv
->spbaclk
);
1687 clk_disable_unprepare(spdif_priv
->coreclk
);
1692 static int fsl_spdif_runtime_resume(struct device
*dev
)
1694 struct fsl_spdif_priv
*spdif_priv
= dev_get_drvdata(dev
);
1698 ret
= clk_prepare_enable(spdif_priv
->coreclk
);
1700 dev_err(dev
, "failed to enable core clock\n");
1704 if (!IS_ERR(spdif_priv
->spbaclk
)) {
1705 ret
= clk_prepare_enable(spdif_priv
->spbaclk
);
1707 dev_err(dev
, "failed to enable spba clock\n");
1708 goto disable_core_clk
;
1712 for (i
= 0; i
< STC_TXCLK_SRC_MAX
; i
++) {
1713 ret
= clk_prepare_enable(spdif_priv
->txclk
[i
]);
1715 goto disable_tx_clk
;
1718 regcache_cache_only(spdif_priv
->regmap
, false);
1719 regcache_mark_dirty(spdif_priv
->regmap
);
1721 regmap_update_bits(spdif_priv
->regmap
, REG_SPDIF_SRPC
,
1722 SRPC_CLKSRC_SEL_MASK
| SRPC_GAINSEL_MASK
,
1723 spdif_priv
->regcache_srpc
);
1725 ret
= regcache_sync(spdif_priv
->regmap
);
1727 goto disable_tx_clk
;
1732 for (i
--; i
>= 0; i
--)
1733 clk_disable_unprepare(spdif_priv
->txclk
[i
]);
1734 if (!IS_ERR(spdif_priv
->spbaclk
))
1735 clk_disable_unprepare(spdif_priv
->spbaclk
);
1737 clk_disable_unprepare(spdif_priv
->coreclk
);
1742 static const struct dev_pm_ops fsl_spdif_pm
= {
1743 SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend
, pm_runtime_force_resume
)
1744 RUNTIME_PM_OPS(fsl_spdif_runtime_suspend
, fsl_spdif_runtime_resume
,
1748 static const struct of_device_id fsl_spdif_dt_ids
[] = {
1749 { .compatible
= "fsl,imx35-spdif", .data
= &fsl_spdif_imx35
, },
1750 { .compatible
= "fsl,vf610-spdif", .data
= &fsl_spdif_vf610
, },
1751 { .compatible
= "fsl,imx6sx-spdif", .data
= &fsl_spdif_imx6sx
, },
1752 { .compatible
= "fsl,imx8qm-spdif", .data
= &fsl_spdif_imx8qm
, },
1753 { .compatible
= "fsl,imx8mm-spdif", .data
= &fsl_spdif_imx8mm
, },
1754 { .compatible
= "fsl,imx8ulp-spdif", .data
= &fsl_spdif_imx8ulp
, },
1757 MODULE_DEVICE_TABLE(of
, fsl_spdif_dt_ids
);
1759 static struct platform_driver fsl_spdif_driver
= {
1761 .name
= "fsl-spdif-dai",
1762 .of_match_table
= fsl_spdif_dt_ids
,
1763 .pm
= pm_ptr(&fsl_spdif_pm
),
1765 .probe
= fsl_spdif_probe
,
1766 .remove
= fsl_spdif_remove
,
1769 module_platform_driver(fsl_spdif_driver
);
1771 MODULE_AUTHOR("Freescale Semiconductor, Inc.");
1772 MODULE_DESCRIPTION("Freescale S/PDIF CPU DAI Driver");
1773 MODULE_LICENSE("GPL v2");
1774 MODULE_ALIAS("platform:fsl-spdif-dai");