1
2
3
4
5
6
7
8
9#include <linux/clk.h>
10#include <linux/io.h>
11#include <linux/module.h>
12#include <linux/pm_runtime.h>
13#include <linux/regmap.h>
14#include <linux/spinlock.h>
15
16#include <sound/dmaengine_pcm.h>
17#include <sound/pcm_params.h>
18#include <sound/soc.h>
19
20
21
22
23#define SPDIFRX_CR 0x00
24#define SPDIFRX_MR 0x04
25
26#define SPDIFRX_IER 0x10
27#define SPDIFRX_IDR 0x14
28#define SPDIFRX_IMR 0x18
29#define SPDIFRX_ISR 0x1c
30#define SPDIFRX_RSR 0x20
31#define SPDIFRX_RHR 0x24
32
33#define SPDIFRX_CHSR(channel, reg) \
34 (0x30 + (channel) * 0x30 + (reg) * 4)
35
36#define SPDIFRX_CHUD(channel, reg) \
37 (0x48 + (channel) * 0x30 + (reg) * 4)
38
39#define SPDIFRX_WPMR 0xE4
40#define SPDIFRX_WPSR 0xE8
41
42#define SPDIFRX_VERSION 0xFC
43
44
45
46
47#define SPDIFRX_CR_SWRST BIT(0)
48
49
50
51
52
53#define SPDIFRX_MR_RXEN_MASK GENMASK(0, 0)
54#define SPDIFRX_MR_RXEN_DISABLE (0 << 0)
55#define SPDIFRX_MR_RXEN_ENABLE (1 << 0)
56
57
58#define SPDIFRX_MR_VBMODE_MASK GENAMSK(1, 1)
59#define SPDIFRX_MR_VBMODE_ALWAYS_LOAD \
60 (0 << 1)
61#define SPDIFRX_MR_VBMODE_DISCARD_IF_VB1 \
62 (1 << 1)
63
64
65#define SPDIFRX_MR_ENDIAN_MASK GENMASK(2, 2)
66#define SPDIFRX_MR_ENDIAN_LITTLE (0 << 2)
67#define SPDIFRX_MR_ENDIAN_BIG (1 << 2)
68
69
70#define SPDIFRX_MR_PBMODE_MASK GENMASK(3, 3)
71#define SPDIFRX_MR_PBMODE_PARCHECK (0 << 3)
72#define SPDIFRX_MR_PBMODE_NOPARCHECK (1 << 3)
73
74
75#define SPDIFRX_MR_DATAWIDTH_MASK GENMASK(5, 4)
76#define SPDIFRX_MR_DATAWIDTH(width) \
77 (((6 - (width) / 4) << 4) & SPDIFRX_MR_DATAWIDTH_MASK)
78
79
80#define SPDIFRX_MR_PACK_MASK GENMASK(7, 7)
81#define SPDIFRX_MR_PACK_DISABLED (0 << 7)
82#define SPDIFRX_MR_PACK_ENABLED (1 << 7)
83
84
85#define SPDIFRX_MR_SBMODE_MASK GENMASK(8, 8)
86#define SPDIFRX_MR_SBMODE_ALWAYS_LOAD (0 << 8)
87#define SPDIFRX_MR_SBMODE_DISCARD (1 << 8)
88
89
90#define SPDIFRX_MR_AUTORST_MASK GENMASK(24, 24)
91#define SPDIFRX_MR_AUTORST_NOACTION (0 << 24)
92#define SPDIFRX_MR_AUTORST_UNLOCK_ON_PRE_ERR (1 << 24)
93
94
95
96
97#define SPDIFRX_IR_RXRDY BIT(0)
98#define SPDIFRX_IR_LOCKED BIT(1)
99#define SPDIFRX_IR_LOSS BIT(2)
100#define SPDIFRX_IR_BLOCKEND BIT(3)
101#define SPDIFRX_IR_SFE BIT(4)
102#define SPDIFRX_IR_PAR_ERR BIT(5)
103#define SPDIFRX_IR_OVERRUN BIT(6)
104#define SPDIFRX_IR_RXFULL BIT(7)
105#define SPDIFRX_IR_CSC(ch) BIT((ch) + 8)
106#define SPDIFRX_IR_SECE BIT(10)
107#define SPDIFRX_IR_BLOCKST BIT(11)
108#define SPDIFRX_IR_NRZ_ERR BIT(12)
109#define SPDIFRX_IR_PRE_ERR BIT(13)
110#define SPDIFRX_IR_CP_ERR BIT(14)
111
112
113
114
115
116#define SPDIFRX_RSR_ULOCK BIT(0)
117#define SPDIFRX_RSR_BADF BIT(1)
118#define SPDIFRX_RSR_LOWF BIT(2)
119#define SPDIFRX_RSR_NOSIGNAL BIT(3)
120#define SPDIFRX_RSR_IFS_MASK GENMASK(27, 16)
121#define SPDIFRX_RSR_IFS(reg) \
122 (((reg) & SPDIFRX_RSR_IFS_MASK) >> 16)
123
124
125
126
127#define SPDIFRX_VERSION_MASK GENMASK(11, 0)
128#define SPDIFRX_VERSION_MFN_MASK GENMASK(18, 16)
129#define SPDIFRX_VERSION_MFN(reg) (((reg) & SPDIFRX_VERSION_MFN_MASK) >> 16)
130
131static bool mchp_spdifrx_readable_reg(struct device *dev, unsigned int reg)
132{
133 switch (reg) {
134 case SPDIFRX_MR:
135 case SPDIFRX_IMR:
136 case SPDIFRX_ISR:
137 case SPDIFRX_RSR:
138 case SPDIFRX_CHSR(0, 0):
139 case SPDIFRX_CHSR(0, 1):
140 case SPDIFRX_CHSR(0, 2):
141 case SPDIFRX_CHSR(0, 3):
142 case SPDIFRX_CHSR(0, 4):
143 case SPDIFRX_CHSR(0, 5):
144 case SPDIFRX_CHUD(0, 0):
145 case SPDIFRX_CHUD(0, 1):
146 case SPDIFRX_CHUD(0, 2):
147 case SPDIFRX_CHUD(0, 3):
148 case SPDIFRX_CHUD(0, 4):
149 case SPDIFRX_CHUD(0, 5):
150 case SPDIFRX_CHSR(1, 0):
151 case SPDIFRX_CHSR(1, 1):
152 case SPDIFRX_CHSR(1, 2):
153 case SPDIFRX_CHSR(1, 3):
154 case SPDIFRX_CHSR(1, 4):
155 case SPDIFRX_CHSR(1, 5):
156 case SPDIFRX_CHUD(1, 0):
157 case SPDIFRX_CHUD(1, 1):
158 case SPDIFRX_CHUD(1, 2):
159 case SPDIFRX_CHUD(1, 3):
160 case SPDIFRX_CHUD(1, 4):
161 case SPDIFRX_CHUD(1, 5):
162 case SPDIFRX_WPMR:
163 case SPDIFRX_WPSR:
164 case SPDIFRX_VERSION:
165 return true;
166 default:
167 return false;
168 }
169}
170
171static bool mchp_spdifrx_writeable_reg(struct device *dev, unsigned int reg)
172{
173 switch (reg) {
174 case SPDIFRX_CR:
175 case SPDIFRX_MR:
176 case SPDIFRX_IER:
177 case SPDIFRX_IDR:
178 case SPDIFRX_WPMR:
179 return true;
180 default:
181 return false;
182 }
183}
184
185static bool mchp_spdifrx_precious_reg(struct device *dev, unsigned int reg)
186{
187 switch (reg) {
188 case SPDIFRX_ISR:
189 case SPDIFRX_RHR:
190 return true;
191 default:
192 return false;
193 }
194}
195
196static bool mchp_spdifrx_volatile_reg(struct device *dev, unsigned int reg)
197{
198 switch (reg) {
199 case SPDIFRX_IMR:
200 case SPDIFRX_ISR:
201 case SPDIFRX_RSR:
202 case SPDIFRX_CHSR(0, 0):
203 case SPDIFRX_CHSR(0, 1):
204 case SPDIFRX_CHSR(0, 2):
205 case SPDIFRX_CHSR(0, 3):
206 case SPDIFRX_CHSR(0, 4):
207 case SPDIFRX_CHSR(0, 5):
208 case SPDIFRX_CHUD(0, 0):
209 case SPDIFRX_CHUD(0, 1):
210 case SPDIFRX_CHUD(0, 2):
211 case SPDIFRX_CHUD(0, 3):
212 case SPDIFRX_CHUD(0, 4):
213 case SPDIFRX_CHUD(0, 5):
214 case SPDIFRX_CHSR(1, 0):
215 case SPDIFRX_CHSR(1, 1):
216 case SPDIFRX_CHSR(1, 2):
217 case SPDIFRX_CHSR(1, 3):
218 case SPDIFRX_CHSR(1, 4):
219 case SPDIFRX_CHSR(1, 5):
220 case SPDIFRX_CHUD(1, 0):
221 case SPDIFRX_CHUD(1, 1):
222 case SPDIFRX_CHUD(1, 2):
223 case SPDIFRX_CHUD(1, 3):
224 case SPDIFRX_CHUD(1, 4):
225 case SPDIFRX_CHUD(1, 5):
226 case SPDIFRX_VERSION:
227 return true;
228 default:
229 return false;
230 }
231}
232
233static const struct regmap_config mchp_spdifrx_regmap_config = {
234 .reg_bits = 32,
235 .reg_stride = 4,
236 .val_bits = 32,
237 .max_register = SPDIFRX_VERSION,
238 .readable_reg = mchp_spdifrx_readable_reg,
239 .writeable_reg = mchp_spdifrx_writeable_reg,
240 .precious_reg = mchp_spdifrx_precious_reg,
241 .volatile_reg = mchp_spdifrx_volatile_reg,
242 .cache_type = REGCACHE_FLAT,
243};
244
245#define SPDIFRX_GCLK_RATIO_MIN (12 * 64)
246
247#define SPDIFRX_CS_BITS 192
248#define SPDIFRX_UD_BITS 192
249
250#define SPDIFRX_CHANNELS 2
251
252
253
254
255
256
257struct mchp_spdifrx_ch_stat {
258 unsigned char data[SPDIFRX_CS_BITS / 8];
259 struct completion done;
260};
261
262
263
264
265
266
267struct mchp_spdifrx_user_data {
268 unsigned char data[SPDIFRX_UD_BITS / 8];
269 struct completion done;
270};
271
272
273
274
275
276
277
278
279
280struct mchp_spdifrx_mixer_control {
281 struct mchp_spdifrx_ch_stat ch_stat[SPDIFRX_CHANNELS];
282 struct mchp_spdifrx_user_data user_data[SPDIFRX_CHANNELS];
283 bool ulock;
284 bool badf;
285 bool signal;
286};
287
288
289
290
291
292
293
294
295
296
297
298
299struct mchp_spdifrx_dev {
300 struct snd_dmaengine_dai_dma_data capture;
301 struct mchp_spdifrx_mixer_control control;
302 struct mutex mlock;
303 struct device *dev;
304 struct regmap *regmap;
305 struct clk *pclk;
306 struct clk *gclk;
307 unsigned int trigger_enabled;
308};
309
310static void mchp_spdifrx_channel_status_read(struct mchp_spdifrx_dev *dev,
311 int channel)
312{
313 struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
314 u8 *ch_stat = &ctrl->ch_stat[channel].data[0];
315 u32 val;
316 int i;
317
318 for (i = 0; i < ARRAY_SIZE(ctrl->ch_stat[channel].data) / 4; i++) {
319 regmap_read(dev->regmap, SPDIFRX_CHSR(channel, i), &val);
320 *ch_stat++ = val & 0xFF;
321 *ch_stat++ = (val >> 8) & 0xFF;
322 *ch_stat++ = (val >> 16) & 0xFF;
323 *ch_stat++ = (val >> 24) & 0xFF;
324 }
325}
326
327static void mchp_spdifrx_channel_user_data_read(struct mchp_spdifrx_dev *dev,
328 int channel)
329{
330 struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
331 u8 *user_data = &ctrl->user_data[channel].data[0];
332 u32 val;
333 int i;
334
335 for (i = 0; i < ARRAY_SIZE(ctrl->user_data[channel].data) / 4; i++) {
336 regmap_read(dev->regmap, SPDIFRX_CHUD(channel, i), &val);
337 *user_data++ = val & 0xFF;
338 *user_data++ = (val >> 8) & 0xFF;
339 *user_data++ = (val >> 16) & 0xFF;
340 *user_data++ = (val >> 24) & 0xFF;
341 }
342}
343
344static irqreturn_t mchp_spdif_interrupt(int irq, void *dev_id)
345{
346 struct mchp_spdifrx_dev *dev = dev_id;
347 struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
348 u32 sr, imr, pending;
349 irqreturn_t ret = IRQ_NONE;
350 int ch;
351
352 regmap_read(dev->regmap, SPDIFRX_ISR, &sr);
353 regmap_read(dev->regmap, SPDIFRX_IMR, &imr);
354 pending = sr & imr;
355 dev_dbg(dev->dev, "ISR: %#x, IMR: %#x, pending: %#x\n", sr, imr,
356 pending);
357
358 if (!pending)
359 return IRQ_NONE;
360
361 if (pending & SPDIFRX_IR_BLOCKEND) {
362 for (ch = 0; ch < SPDIFRX_CHANNELS; ch++) {
363 mchp_spdifrx_channel_user_data_read(dev, ch);
364 complete(&ctrl->user_data[ch].done);
365 }
366 regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_BLOCKEND);
367 ret = IRQ_HANDLED;
368 }
369
370 for (ch = 0; ch < SPDIFRX_CHANNELS; ch++) {
371 if (pending & SPDIFRX_IR_CSC(ch)) {
372 mchp_spdifrx_channel_status_read(dev, ch);
373 complete(&ctrl->ch_stat[ch].done);
374 regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_CSC(ch));
375 ret = IRQ_HANDLED;
376 }
377 }
378
379 if (pending & SPDIFRX_IR_OVERRUN) {
380 dev_warn(dev->dev, "Overrun detected\n");
381 ret = IRQ_HANDLED;
382 }
383
384 return ret;
385}
386
387static int mchp_spdifrx_trigger(struct snd_pcm_substream *substream, int cmd,
388 struct snd_soc_dai *dai)
389{
390 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
391 int ret = 0;
392
393 switch (cmd) {
394 case SNDRV_PCM_TRIGGER_START:
395 case SNDRV_PCM_TRIGGER_RESUME:
396 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
397 mutex_lock(&dev->mlock);
398
399 regmap_write(dev->regmap, SPDIFRX_IER, SPDIFRX_IR_OVERRUN);
400
401
402 regmap_update_bits(dev->regmap, SPDIFRX_MR, SPDIFRX_MR_RXEN_MASK,
403 SPDIFRX_MR_RXEN_ENABLE);
404 dev->trigger_enabled = true;
405 mutex_unlock(&dev->mlock);
406 break;
407 case SNDRV_PCM_TRIGGER_STOP:
408 case SNDRV_PCM_TRIGGER_SUSPEND:
409 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
410 mutex_lock(&dev->mlock);
411
412 regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_OVERRUN);
413
414
415 regmap_update_bits(dev->regmap, SPDIFRX_MR, SPDIFRX_MR_RXEN_MASK,
416 SPDIFRX_MR_RXEN_DISABLE);
417 dev->trigger_enabled = false;
418 mutex_unlock(&dev->mlock);
419 break;
420 default:
421 ret = -EINVAL;
422 }
423
424 return ret;
425}
426
427static int mchp_spdifrx_hw_params(struct snd_pcm_substream *substream,
428 struct snd_pcm_hw_params *params,
429 struct snd_soc_dai *dai)
430{
431 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
432 u32 mr = 0;
433 int ret;
434
435 dev_dbg(dev->dev, "%s() rate=%u format=%#x width=%u channels=%u\n",
436 __func__, params_rate(params), params_format(params),
437 params_width(params), params_channels(params));
438
439 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
440 dev_err(dev->dev, "Playback is not supported\n");
441 return -EINVAL;
442 }
443
444 if (params_channels(params) != SPDIFRX_CHANNELS) {
445 dev_err(dev->dev, "unsupported number of channels: %d\n",
446 params_channels(params));
447 return -EINVAL;
448 }
449
450 switch (params_format(params)) {
451 case SNDRV_PCM_FORMAT_S16_BE:
452 case SNDRV_PCM_FORMAT_S20_3BE:
453 case SNDRV_PCM_FORMAT_S24_3BE:
454 case SNDRV_PCM_FORMAT_S24_BE:
455 mr |= SPDIFRX_MR_ENDIAN_BIG;
456 fallthrough;
457 case SNDRV_PCM_FORMAT_S16_LE:
458 case SNDRV_PCM_FORMAT_S20_3LE:
459 case SNDRV_PCM_FORMAT_S24_3LE:
460 case SNDRV_PCM_FORMAT_S24_LE:
461 mr |= SPDIFRX_MR_DATAWIDTH(params_width(params));
462 break;
463 default:
464 dev_err(dev->dev, "unsupported PCM format: %d\n",
465 params_format(params));
466 return -EINVAL;
467 }
468
469 mutex_lock(&dev->mlock);
470 if (dev->trigger_enabled) {
471 dev_err(dev->dev, "PCM already running\n");
472 ret = -EBUSY;
473 goto unlock;
474 }
475
476
477 clk_disable_unprepare(dev->gclk);
478
479 ret = clk_set_min_rate(dev->gclk, params_rate(params) *
480 SPDIFRX_GCLK_RATIO_MIN + 1);
481 if (ret) {
482 dev_err(dev->dev,
483 "unable to set gclk min rate: rate %u * ratio %u + 1\n",
484 params_rate(params), SPDIFRX_GCLK_RATIO_MIN);
485
486 clk_prepare_enable(dev->gclk);
487 goto unlock;
488 }
489 ret = clk_prepare_enable(dev->gclk);
490 if (ret) {
491 dev_err(dev->dev, "unable to enable gclk: %d\n", ret);
492 goto unlock;
493 }
494
495 dev_dbg(dev->dev, "GCLK range min set to %d\n",
496 params_rate(params) * SPDIFRX_GCLK_RATIO_MIN + 1);
497
498 ret = regmap_write(dev->regmap, SPDIFRX_MR, mr);
499
500unlock:
501 mutex_unlock(&dev->mlock);
502
503 return ret;
504}
505
506#define MCHP_SPDIF_RATES SNDRV_PCM_RATE_8000_192000
507
508#define MCHP_SPDIF_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
509 SNDRV_PCM_FMTBIT_U16_BE | \
510 SNDRV_PCM_FMTBIT_S20_3LE | \
511 SNDRV_PCM_FMTBIT_S20_3BE | \
512 SNDRV_PCM_FMTBIT_S24_3LE | \
513 SNDRV_PCM_FMTBIT_S24_3BE | \
514 SNDRV_PCM_FMTBIT_S24_LE | \
515 SNDRV_PCM_FMTBIT_S24_BE \
516 )
517
518static int mchp_spdifrx_info(struct snd_kcontrol *kcontrol,
519 struct snd_ctl_elem_info *uinfo)
520{
521 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
522 uinfo->count = 1;
523
524 return 0;
525}
526
527static int mchp_spdifrx_cs_get(struct mchp_spdifrx_dev *dev,
528 int channel,
529 struct snd_ctl_elem_value *uvalue)
530{
531 struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
532 struct mchp_spdifrx_ch_stat *ch_stat = &ctrl->ch_stat[channel];
533 int ret = 0;
534
535 mutex_lock(&dev->mlock);
536
537 ret = pm_runtime_resume_and_get(dev->dev);
538 if (ret < 0)
539 goto unlock;
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555 if (dev->trigger_enabled) {
556 reinit_completion(&ch_stat->done);
557 regmap_write(dev->regmap, SPDIFRX_IER, SPDIFRX_IR_CSC(channel));
558
559 ret = wait_for_completion_interruptible_timeout(&ch_stat->done,
560 msecs_to_jiffies(100));
561
562 if (ret <= 0) {
563 dev_dbg(dev->dev, "channel status for channel %d timeout\n",
564 channel);
565 regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_CSC(channel));
566 ret = ret ? : -ETIMEDOUT;
567 goto pm_runtime_put;
568 } else {
569 ret = 0;
570 }
571 } else {
572
573 mchp_spdifrx_channel_status_read(dev, channel);
574 }
575
576 memcpy(uvalue->value.iec958.status, ch_stat->data,
577 sizeof(ch_stat->data));
578
579pm_runtime_put:
580 pm_runtime_put_autosuspend(dev->dev);
581unlock:
582 mutex_unlock(&dev->mlock);
583 return ret;
584}
585
586static int mchp_spdifrx_cs1_get(struct snd_kcontrol *kcontrol,
587 struct snd_ctl_elem_value *uvalue)
588{
589 struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
590 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
591
592 return mchp_spdifrx_cs_get(dev, 0, uvalue);
593}
594
595static int mchp_spdifrx_cs2_get(struct snd_kcontrol *kcontrol,
596 struct snd_ctl_elem_value *uvalue)
597{
598 struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
599 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
600
601 return mchp_spdifrx_cs_get(dev, 1, uvalue);
602}
603
604static int mchp_spdifrx_cs_mask(struct snd_kcontrol *kcontrol,
605 struct snd_ctl_elem_value *uvalue)
606{
607 memset(uvalue->value.iec958.status, 0xff,
608 sizeof(uvalue->value.iec958.status));
609
610 return 0;
611}
612
613static int mchp_spdifrx_subcode_ch_get(struct mchp_spdifrx_dev *dev,
614 int channel,
615 struct snd_ctl_elem_value *uvalue)
616{
617 struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
618 struct mchp_spdifrx_user_data *user_data = &ctrl->user_data[channel];
619 int ret = 0;
620
621 mutex_lock(&dev->mlock);
622
623 ret = pm_runtime_resume_and_get(dev->dev);
624 if (ret < 0)
625 goto unlock;
626
627
628
629
630
631
632
633
634
635
636
637
638 if (dev->trigger_enabled) {
639 reinit_completion(&user_data->done);
640 regmap_write(dev->regmap, SPDIFRX_IER, SPDIFRX_IR_BLOCKEND);
641 ret = wait_for_completion_interruptible_timeout(&user_data->done,
642 msecs_to_jiffies(100));
643
644 if (ret <= 0) {
645 dev_dbg(dev->dev, "user data for channel %d timeout\n",
646 channel);
647 regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_BLOCKEND);
648 ret = ret ? : -ETIMEDOUT;
649 goto pm_runtime_put;
650 } else {
651 ret = 0;
652 }
653 } else {
654
655 mchp_spdifrx_channel_user_data_read(dev, channel);
656 }
657
658 memcpy(uvalue->value.iec958.subcode, user_data->data,
659 sizeof(user_data->data));
660
661pm_runtime_put:
662 pm_runtime_put_autosuspend(dev->dev);
663unlock:
664 mutex_unlock(&dev->mlock);
665 return ret;
666}
667
668static int mchp_spdifrx_subcode_ch1_get(struct snd_kcontrol *kcontrol,
669 struct snd_ctl_elem_value *uvalue)
670{
671 struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
672 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
673
674 return mchp_spdifrx_subcode_ch_get(dev, 0, uvalue);
675}
676
677static int mchp_spdifrx_subcode_ch2_get(struct snd_kcontrol *kcontrol,
678 struct snd_ctl_elem_value *uvalue)
679{
680 struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
681 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
682
683 return mchp_spdifrx_subcode_ch_get(dev, 1, uvalue);
684}
685
686static int mchp_spdifrx_boolean_info(struct snd_kcontrol *kcontrol,
687 struct snd_ctl_elem_info *uinfo)
688{
689 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
690 uinfo->count = 1;
691 uinfo->value.integer.min = 0;
692 uinfo->value.integer.max = 1;
693
694 return 0;
695}
696
697static int mchp_spdifrx_ulock_get(struct snd_kcontrol *kcontrol,
698 struct snd_ctl_elem_value *uvalue)
699{
700 struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
701 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
702 struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
703 u32 val;
704 int ret;
705 bool ulock_old = ctrl->ulock;
706
707 mutex_lock(&dev->mlock);
708
709 ret = pm_runtime_resume_and_get(dev->dev);
710 if (ret < 0)
711 goto unlock;
712
713
714
715
716
717
718 if (dev->trigger_enabled) {
719 regmap_read(dev->regmap, SPDIFRX_RSR, &val);
720 ctrl->ulock = !(val & SPDIFRX_RSR_ULOCK);
721 } else {
722 ctrl->ulock = 0;
723 }
724
725 uvalue->value.integer.value[0] = ctrl->ulock;
726
727 pm_runtime_put_autosuspend(dev->dev);
728unlock:
729 mutex_unlock(&dev->mlock);
730
731 return ulock_old != ctrl->ulock;
732}
733
734static int mchp_spdifrx_badf_get(struct snd_kcontrol *kcontrol,
735 struct snd_ctl_elem_value *uvalue)
736{
737 struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
738 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
739 struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
740 u32 val;
741 int ret;
742 bool badf_old = ctrl->badf;
743
744 mutex_lock(&dev->mlock);
745
746 ret = pm_runtime_resume_and_get(dev->dev);
747 if (ret < 0)
748 goto unlock;
749
750
751
752
753
754
755 if (dev->trigger_enabled) {
756 regmap_read(dev->regmap, SPDIFRX_RSR, &val);
757 ctrl->badf = !!(val & SPDIFRX_RSR_BADF);
758 } else {
759 ctrl->badf = 0;
760 }
761
762 pm_runtime_put_autosuspend(dev->dev);
763unlock:
764 mutex_unlock(&dev->mlock);
765
766 uvalue->value.integer.value[0] = ctrl->badf;
767
768 return badf_old != ctrl->badf;
769}
770
771static int mchp_spdifrx_signal_get(struct snd_kcontrol *kcontrol,
772 struct snd_ctl_elem_value *uvalue)
773{
774 struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
775 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
776 struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
777 u32 val = ~0U, loops = 10;
778 int ret;
779 bool signal_old = ctrl->signal;
780
781 mutex_lock(&dev->mlock);
782
783 ret = pm_runtime_resume_and_get(dev->dev);
784 if (ret < 0)
785 goto unlock;
786
787
788
789
790
791
792 if (!dev->trigger_enabled) {
793 regmap_update_bits(dev->regmap, SPDIFRX_MR, SPDIFRX_MR_RXEN_MASK,
794 SPDIFRX_MR_RXEN_ENABLE);
795
796
797 while (--loops) {
798 regmap_read(dev->regmap, SPDIFRX_RSR, &val);
799 if (!(val & SPDIFRX_RSR_ULOCK))
800 break;
801 usleep_range(100, 150);
802 }
803
804 regmap_update_bits(dev->regmap, SPDIFRX_MR, SPDIFRX_MR_RXEN_MASK,
805 SPDIFRX_MR_RXEN_DISABLE);
806 } else {
807 regmap_read(dev->regmap, SPDIFRX_RSR, &val);
808 }
809
810 pm_runtime_put_autosuspend(dev->dev);
811
812unlock:
813 mutex_unlock(&dev->mlock);
814
815 if (!(val & SPDIFRX_RSR_ULOCK))
816 ctrl->signal = !(val & SPDIFRX_RSR_NOSIGNAL);
817 else
818 ctrl->signal = 0;
819 uvalue->value.integer.value[0] = ctrl->signal;
820
821 return signal_old != ctrl->signal;
822}
823
824static int mchp_spdifrx_rate_info(struct snd_kcontrol *kcontrol,
825 struct snd_ctl_elem_info *uinfo)
826{
827 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
828 uinfo->count = 1;
829 uinfo->value.integer.min = 0;
830 uinfo->value.integer.max = 192000;
831
832 return 0;
833}
834
835static int mchp_spdifrx_rate_get(struct snd_kcontrol *kcontrol,
836 struct snd_ctl_elem_value *ucontrol)
837{
838 struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
839 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
840 unsigned long rate;
841 u32 val;
842 int ret;
843
844 mutex_lock(&dev->mlock);
845
846 ret = pm_runtime_resume_and_get(dev->dev);
847 if (ret < 0)
848 goto unlock;
849
850
851
852
853
854
855 if (dev->trigger_enabled) {
856 regmap_read(dev->regmap, SPDIFRX_RSR, &val);
857
858 if (val & SPDIFRX_RSR_ULOCK || !(val & SPDIFRX_RSR_IFS_MASK)) {
859 ucontrol->value.integer.value[0] = 0;
860 goto pm_runtime_put;
861 }
862 } else {
863
864 ucontrol->value.integer.value[0] = 0;
865 goto pm_runtime_put;
866 }
867
868 rate = clk_get_rate(dev->gclk);
869
870 ucontrol->value.integer.value[0] = rate / (32 * SPDIFRX_RSR_IFS(val));
871
872pm_runtime_put:
873 pm_runtime_put_autosuspend(dev->dev);
874unlock:
875 mutex_unlock(&dev->mlock);
876 return ret;
877}
878
879static struct snd_kcontrol_new mchp_spdifrx_ctrls[] = {
880
881 {
882 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
883 .name = SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT)
884 " Channel 1",
885 .access = SNDRV_CTL_ELEM_ACCESS_READ |
886 SNDRV_CTL_ELEM_ACCESS_VOLATILE,
887 .info = mchp_spdifrx_info,
888 .get = mchp_spdifrx_cs1_get,
889 },
890 {
891 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
892 .name = SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT)
893 " Channel 2",
894 .access = SNDRV_CTL_ELEM_ACCESS_READ |
895 SNDRV_CTL_ELEM_ACCESS_VOLATILE,
896 .info = mchp_spdifrx_info,
897 .get = mchp_spdifrx_cs2_get,
898 },
899 {
900 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
901 .name = SNDRV_CTL_NAME_IEC958("", CAPTURE, MASK),
902 .access = SNDRV_CTL_ELEM_ACCESS_READ,
903 .info = mchp_spdifrx_info,
904 .get = mchp_spdifrx_cs_mask,
905 },
906
907 {
908 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
909 .name = "IEC958 Subcode Capture Default Channel 1",
910 .access = SNDRV_CTL_ELEM_ACCESS_READ |
911 SNDRV_CTL_ELEM_ACCESS_VOLATILE,
912 .info = mchp_spdifrx_info,
913 .get = mchp_spdifrx_subcode_ch1_get,
914 },
915 {
916 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
917 .name = "IEC958 Subcode Capture Default Channel 2",
918 .access = SNDRV_CTL_ELEM_ACCESS_READ |
919 SNDRV_CTL_ELEM_ACCESS_VOLATILE,
920 .info = mchp_spdifrx_info,
921 .get = mchp_spdifrx_subcode_ch2_get,
922 },
923
924 {
925 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
926 .name = SNDRV_CTL_NAME_IEC958("", CAPTURE, NONE) "Unlocked",
927 .access = SNDRV_CTL_ELEM_ACCESS_READ |
928 SNDRV_CTL_ELEM_ACCESS_VOLATILE,
929 .info = mchp_spdifrx_boolean_info,
930 .get = mchp_spdifrx_ulock_get,
931 },
932
933 {
934 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
935 .name = SNDRV_CTL_NAME_IEC958("", CAPTURE, NONE)"Bad Format",
936 .access = SNDRV_CTL_ELEM_ACCESS_READ |
937 SNDRV_CTL_ELEM_ACCESS_VOLATILE,
938 .info = mchp_spdifrx_boolean_info,
939 .get = mchp_spdifrx_badf_get,
940 },
941
942 {
943 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
944 .name = SNDRV_CTL_NAME_IEC958("", CAPTURE, NONE) "Signal",
945 .access = SNDRV_CTL_ELEM_ACCESS_READ |
946 SNDRV_CTL_ELEM_ACCESS_VOLATILE,
947 .info = mchp_spdifrx_boolean_info,
948 .get = mchp_spdifrx_signal_get,
949 },
950
951 {
952 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
953 .name = SNDRV_CTL_NAME_IEC958("", CAPTURE, NONE) "Rate",
954 .access = SNDRV_CTL_ELEM_ACCESS_READ |
955 SNDRV_CTL_ELEM_ACCESS_VOLATILE,
956 .info = mchp_spdifrx_rate_info,
957 .get = mchp_spdifrx_rate_get,
958 },
959};
960
961static int mchp_spdifrx_dai_probe(struct snd_soc_dai *dai)
962{
963 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
964 struct mchp_spdifrx_mixer_control *ctrl = &dev->control;
965 int ch;
966
967 snd_soc_dai_init_dma_data(dai, NULL, &dev->capture);
968
969
970 regmap_write(dev->regmap, SPDIFRX_CR, SPDIFRX_CR_SWRST);
971
972
973 regmap_write(dev->regmap, SPDIFRX_MR,
974 SPDIFRX_MR_VBMODE_DISCARD_IF_VB1 |
975 SPDIFRX_MR_SBMODE_DISCARD |
976 SPDIFRX_MR_AUTORST_NOACTION |
977 SPDIFRX_MR_PACK_DISABLED);
978
979 for (ch = 0; ch < SPDIFRX_CHANNELS; ch++) {
980 init_completion(&ctrl->ch_stat[ch].done);
981 init_completion(&ctrl->user_data[ch].done);
982 }
983
984
985 snd_soc_add_dai_controls(dai, mchp_spdifrx_ctrls,
986 ARRAY_SIZE(mchp_spdifrx_ctrls));
987
988 return 0;
989}
990
991static int mchp_spdifrx_dai_remove(struct snd_soc_dai *dai)
992{
993 struct mchp_spdifrx_dev *dev = snd_soc_dai_get_drvdata(dai);
994
995
996 regmap_write(dev->regmap, SPDIFRX_IDR, GENMASK(14, 0));
997
998 return 0;
999}
1000
1001static const struct snd_soc_dai_ops mchp_spdifrx_dai_ops = {
1002 .probe = mchp_spdifrx_dai_probe,
1003 .remove = mchp_spdifrx_dai_remove,
1004 .trigger = mchp_spdifrx_trigger,
1005 .hw_params = mchp_spdifrx_hw_params,
1006};
1007
1008static struct snd_soc_dai_driver mchp_spdifrx_dai = {
1009 .name = "mchp-spdifrx",
1010 .capture = {
1011 .stream_name = "Capture",
1012 .channels_min = SPDIFRX_CHANNELS,
1013 .channels_max = SPDIFRX_CHANNELS,
1014 .rates = MCHP_SPDIF_RATES,
1015 .formats = MCHP_SPDIF_FORMATS,
1016 },
1017 .ops = &mchp_spdifrx_dai_ops,
1018};
1019
1020static const struct snd_soc_component_driver mchp_spdifrx_component = {
1021 .name = "mchp-spdifrx",
1022 .legacy_dai_naming = 1,
1023};
1024
1025static const struct of_device_id mchp_spdifrx_dt_ids[] = {
1026 {
1027 .compatible = "microchip,sama7g5-spdifrx",
1028 },
1029 { }
1030};
1031MODULE_DEVICE_TABLE(of, mchp_spdifrx_dt_ids);
1032
1033static int mchp_spdifrx_runtime_suspend(struct device *dev)
1034{
1035 struct mchp_spdifrx_dev *spdifrx = dev_get_drvdata(dev);
1036
1037 regcache_cache_only(spdifrx->regmap, true);
1038 clk_disable_unprepare(spdifrx->gclk);
1039 clk_disable_unprepare(spdifrx->pclk);
1040
1041 return 0;
1042}
1043
1044static int mchp_spdifrx_runtime_resume(struct device *dev)
1045{
1046 struct mchp_spdifrx_dev *spdifrx = dev_get_drvdata(dev);
1047 int ret;
1048
1049 ret = clk_prepare_enable(spdifrx->pclk);
1050 if (ret)
1051 return ret;
1052
1053 ret = clk_prepare_enable(spdifrx->gclk);
1054 if (ret)
1055 goto disable_pclk;
1056
1057 regcache_cache_only(spdifrx->regmap, false);
1058 regcache_mark_dirty(spdifrx->regmap);
1059 ret = regcache_sync(spdifrx->regmap);
1060 if (ret) {
1061 regcache_cache_only(spdifrx->regmap, true);
1062 clk_disable_unprepare(spdifrx->gclk);
1063disable_pclk:
1064 clk_disable_unprepare(spdifrx->pclk);
1065 }
1066
1067 return ret;
1068}
1069
1070static const struct dev_pm_ops mchp_spdifrx_pm_ops = {
1071 RUNTIME_PM_OPS(mchp_spdifrx_runtime_suspend, mchp_spdifrx_runtime_resume,
1072 NULL)
1073};
1074
1075static int mchp_spdifrx_probe(struct platform_device *pdev)
1076{
1077 struct mchp_spdifrx_dev *dev;
1078 struct resource *mem;
1079 struct regmap *regmap;
1080 void __iomem *base;
1081 int irq;
1082 int err;
1083 u32 vers;
1084
1085
1086 dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
1087 if (!dev)
1088 return -ENOMEM;
1089
1090
1091 base = devm_platform_get_and_ioremap_resource(pdev, 0, &mem);
1092 if (IS_ERR(base))
1093 return PTR_ERR(base);
1094
1095 regmap = devm_regmap_init_mmio(&pdev->dev, base,
1096 &mchp_spdifrx_regmap_config);
1097 if (IS_ERR(regmap))
1098 return PTR_ERR(regmap);
1099
1100
1101 irq = platform_get_irq(pdev, 0);
1102 if (irq < 0)
1103 return irq;
1104
1105 err = devm_request_irq(&pdev->dev, irq, mchp_spdif_interrupt, 0,
1106 dev_name(&pdev->dev), dev);
1107 if (err)
1108 return err;
1109
1110
1111 dev->pclk = devm_clk_get(&pdev->dev, "pclk");
1112 if (IS_ERR(dev->pclk)) {
1113 err = PTR_ERR(dev->pclk);
1114 dev_err(&pdev->dev, "failed to get the peripheral clock: %d\n",
1115 err);
1116 return err;
1117 }
1118
1119
1120 dev->gclk = devm_clk_get(&pdev->dev, "gclk");
1121 if (IS_ERR(dev->gclk)) {
1122 err = PTR_ERR(dev->gclk);
1123 dev_err(&pdev->dev,
1124 "failed to get the PMC generated clock: %d\n", err);
1125 return err;
1126 }
1127
1128
1129
1130
1131
1132
1133
1134
1135 clk_set_min_rate(dev->gclk, 48000 * SPDIFRX_GCLK_RATIO_MIN + 1);
1136
1137 mutex_init(&dev->mlock);
1138
1139 dev->dev = &pdev->dev;
1140 dev->regmap = regmap;
1141 platform_set_drvdata(pdev, dev);
1142
1143 pm_runtime_enable(dev->dev);
1144 if (!pm_runtime_enabled(dev->dev)) {
1145 err = mchp_spdifrx_runtime_resume(dev->dev);
1146 if (err)
1147 goto pm_runtime_disable;
1148 }
1149
1150 dev->capture.addr = (dma_addr_t)mem->start + SPDIFRX_RHR;
1151 dev->capture.maxburst = 1;
1152
1153 err = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
1154 if (err) {
1155 dev_err(&pdev->dev, "failed to register PCM: %d\n", err);
1156 goto pm_runtime_suspend;
1157 }
1158
1159 err = devm_snd_soc_register_component(&pdev->dev,
1160 &mchp_spdifrx_component,
1161 &mchp_spdifrx_dai, 1);
1162 if (err) {
1163 dev_err(&pdev->dev, "fail to register dai\n");
1164 goto pm_runtime_suspend;
1165 }
1166
1167 regmap_read(regmap, SPDIFRX_VERSION, &vers);
1168 dev_info(&pdev->dev, "hw version: %#lx\n", vers & SPDIFRX_VERSION_MASK);
1169
1170 return 0;
1171
1172pm_runtime_suspend:
1173 if (!pm_runtime_status_suspended(dev->dev))
1174 mchp_spdifrx_runtime_suspend(dev->dev);
1175pm_runtime_disable:
1176 pm_runtime_disable(dev->dev);
1177 return err;
1178}
1179
1180static void mchp_spdifrx_remove(struct platform_device *pdev)
1181{
1182 struct mchp_spdifrx_dev *dev = platform_get_drvdata(pdev);
1183
1184 pm_runtime_disable(dev->dev);
1185 if (!pm_runtime_status_suspended(dev->dev))
1186 mchp_spdifrx_runtime_suspend(dev->dev);
1187}
1188
1189static struct platform_driver mchp_spdifrx_driver = {
1190 .probe = mchp_spdifrx_probe,
1191 .remove = mchp_spdifrx_remove,
1192 .driver = {
1193 .name = "mchp_spdifrx",
1194 .of_match_table = mchp_spdifrx_dt_ids,
1195 .pm = pm_ptr(&mchp_spdifrx_pm_ops),
1196 },
1197};
1198
1199module_platform_driver(mchp_spdifrx_driver);
1200
1201MODULE_AUTHOR("Codrin Ciubotariu <codrin.ciubotariu@microchip.com>");
1202MODULE_DESCRIPTION("Microchip S/PDIF RX Controller Driver");
1203MODULE_LICENSE("GPL v2");
1204