This source file includes following definitions.
- rsnd_ssi_use_busif
- rsnd_ssi_status_clear
- rsnd_ssi_status_get
- rsnd_ssi_status_check
- rsnd_ssi_multi_slaves
- rsnd_ssi_run_mods
- rsnd_ssi_multi_slaves_runtime
- rsnd_rdai_width_to_swl
- rsnd_ssi_clk_query
- rsnd_ssi_master_clk_start
- rsnd_ssi_master_clk_stop
- rsnd_ssi_config_init
- rsnd_ssi_register_setup
- rsnd_ssi_init
- rsnd_ssi_quit
- rsnd_ssi_hw_params
- rsnd_ssi_start
- rsnd_ssi_stop
- rsnd_ssi_irq
- __rsnd_ssi_interrupt
- rsnd_ssi_interrupt
- rsnd_ssi_get_status
- rsnd_ssi_parent_attach
- rsnd_ssi_pcm_new
- rsnd_ssi_common_probe
- rsnd_ssi_common_remove
- rsnd_ssi_pio_interrupt
- rsnd_ssi_pio_init
- rsnd_ssi_pio_pointer
- rsnd_ssi_prepare
- rsnd_ssi_dma_probe
- rsnd_ssi_fallback
- rsnd_ssi_dma_req
- rsnd_ssi_is_dma_mode
- rsnd_ssi_connect
- rsnd_parse_connect_ssi
- rsnd_ssi_mod_get
- __rsnd_ssi_is_pin_sharing
- rsnd_ssi_probe
- rsnd_ssi_remove
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #include <sound/simple_card_utils.h>
20 #include <linux/delay.h>
21 #include "rsnd.h"
22 #define RSND_SSI_NAME_SIZE 16
23
24
25
26
27 #define FORCE (1 << 31)
28 #define DMEN (1 << 28)
29 #define UIEN (1 << 27)
30 #define OIEN (1 << 26)
31 #define IIEN (1 << 25)
32 #define DIEN (1 << 24)
33 #define CHNL_4 (1 << 22)
34 #define CHNL_6 (2 << 22)
35 #define CHNL_8 (3 << 22)
36 #define DWL_MASK (7 << 19)
37 #define DWL_8 (0 << 19)
38 #define DWL_16 (1 << 19)
39 #define DWL_18 (2 << 19)
40 #define DWL_20 (3 << 19)
41 #define DWL_22 (4 << 19)
42 #define DWL_24 (5 << 19)
43 #define DWL_32 (6 << 19)
44
45
46
47
48 #define SWL_16 (1 << 16)
49 #define SWL_24 (2 << 16)
50 #define SWL_32 (3 << 16)
51
52 #define SCKD (1 << 15)
53 #define SWSD (1 << 14)
54 #define SCKP (1 << 13)
55 #define SWSP (1 << 12)
56 #define SDTA (1 << 10)
57 #define PDTA (1 << 9)
58 #define DEL (1 << 8)
59 #define CKDV(v) (v << 4)
60 #define TRMD (1 << 1)
61 #define EN (1 << 0)
62
63
64
65
66 #define UIRQ (1 << 27)
67 #define OIRQ (1 << 26)
68 #define IIRQ (1 << 25)
69 #define DIRQ (1 << 24)
70
71
72
73
74 #define CONT (1 << 8)
75 #define WS_MODE (1 << 0)
76
77 #define SSI_NAME "ssi"
78
79 struct rsnd_ssi {
80 struct rsnd_mod mod;
81
82 u32 flags;
83 u32 cr_own;
84 u32 cr_clk;
85 u32 cr_mode;
86 u32 cr_en;
87 u32 wsr;
88 int chan;
89 int rate;
90 int irq;
91 unsigned int usrcnt;
92
93
94 int byte_pos;
95 int byte_per_period;
96 int next_period_byte;
97 };
98
99
100 #define RSND_SSI_CLK_PIN_SHARE (1 << 0)
101 #define RSND_SSI_NO_BUSIF (1 << 1)
102 #define RSND_SSI_PROBED (1 << 2)
103
104 #define for_each_rsnd_ssi(pos, priv, i) \
105 for (i = 0; \
106 (i < rsnd_ssi_nr(priv)) && \
107 ((pos) = ((struct rsnd_ssi *)(priv)->ssi + i)); \
108 i++)
109
110 #define rsnd_ssi_get(priv, id) ((struct rsnd_ssi *)(priv->ssi) + id)
111 #define rsnd_ssi_nr(priv) ((priv)->ssi_nr)
112 #define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
113 #define rsnd_ssi_is_parent(ssi, io) ((ssi) == rsnd_io_to_mod_ssip(io))
114 #define rsnd_ssi_is_multi_slave(mod, io) \
115 (rsnd_ssi_multi_slaves(io) & (1 << rsnd_mod_id(mod)))
116 #define rsnd_ssi_is_run_mods(mod, io) \
117 (rsnd_ssi_run_mods(io) & (1 << rsnd_mod_id(mod)))
118 #define rsnd_ssi_can_output_clk(mod) (!__rsnd_ssi_is_pin_sharing(mod))
119
120 static int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod);
121
122 int rsnd_ssi_use_busif(struct rsnd_dai_stream *io)
123 {
124 struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io);
125 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
126 int use_busif = 0;
127
128 if (!rsnd_ssi_is_dma_mode(mod))
129 return 0;
130
131 if (!(rsnd_flags_has(ssi, RSND_SSI_NO_BUSIF)))
132 use_busif = 1;
133 if (rsnd_io_to_mod_src(io))
134 use_busif = 1;
135
136 return use_busif;
137 }
138
139 static void rsnd_ssi_status_clear(struct rsnd_mod *mod)
140 {
141 rsnd_mod_write(mod, SSISR, 0);
142 }
143
144 static u32 rsnd_ssi_status_get(struct rsnd_mod *mod)
145 {
146 return rsnd_mod_read(mod, SSISR);
147 }
148
149 static void rsnd_ssi_status_check(struct rsnd_mod *mod,
150 u32 bit)
151 {
152 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
153 struct device *dev = rsnd_priv_to_dev(priv);
154 u32 status;
155 int i;
156
157 for (i = 0; i < 1024; i++) {
158 status = rsnd_ssi_status_get(mod);
159 if (status & bit)
160 return;
161
162 udelay(5);
163 }
164
165 dev_warn(dev, "%s status check failed\n", rsnd_mod_name(mod));
166 }
167
168 static u32 rsnd_ssi_multi_slaves(struct rsnd_dai_stream *io)
169 {
170 struct rsnd_mod *mod;
171 enum rsnd_mod_type types[] = {
172 RSND_MOD_SSIM1,
173 RSND_MOD_SSIM2,
174 RSND_MOD_SSIM3,
175 };
176 int i, mask;
177
178 mask = 0;
179 for (i = 0; i < ARRAY_SIZE(types); i++) {
180 mod = rsnd_io_to_mod(io, types[i]);
181 if (!mod)
182 continue;
183
184 mask |= 1 << rsnd_mod_id(mod);
185 }
186
187 return mask;
188 }
189
190 static u32 rsnd_ssi_run_mods(struct rsnd_dai_stream *io)
191 {
192 struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io);
193 struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
194 u32 mods;
195
196 mods = rsnd_ssi_multi_slaves_runtime(io) |
197 1 << rsnd_mod_id(ssi_mod);
198
199 if (ssi_parent_mod)
200 mods |= 1 << rsnd_mod_id(ssi_parent_mod);
201
202 return mods;
203 }
204
205 u32 rsnd_ssi_multi_slaves_runtime(struct rsnd_dai_stream *io)
206 {
207 if (rsnd_runtime_is_multi_ssi(io))
208 return rsnd_ssi_multi_slaves(io);
209
210 return 0;
211 }
212
213 static u32 rsnd_rdai_width_to_swl(struct rsnd_dai *rdai)
214 {
215 struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
216 struct device *dev = rsnd_priv_to_dev(priv);
217 int width = rsnd_rdai_width_get(rdai);
218
219 switch (width) {
220 case 32: return SWL_32;
221 case 24: return SWL_24;
222 case 16: return SWL_16;
223 }
224
225 dev_err(dev, "unsupported slot width value: %d\n", width);
226 return 0;
227 }
228
229 unsigned int rsnd_ssi_clk_query(struct rsnd_dai *rdai,
230 int param1, int param2, int *idx)
231 {
232 struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
233 int ssi_clk_mul_table[] = {
234 1, 2, 4, 8, 16, 6, 12,
235 };
236 int j, ret;
237 unsigned int main_rate;
238 int width = rsnd_rdai_width_get(rdai);
239
240 for (j = 0; j < ARRAY_SIZE(ssi_clk_mul_table); j++) {
241
242
243
244
245
246
247
248 if (j == 0)
249 continue;
250
251 main_rate = width * param1 * param2 * ssi_clk_mul_table[j];
252
253 ret = rsnd_adg_clk_query(priv, main_rate);
254 if (ret < 0)
255 continue;
256
257 if (idx)
258 *idx = j;
259
260 return main_rate;
261 }
262
263 return 0;
264 }
265
266 static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
267 struct rsnd_dai_stream *io)
268 {
269 struct rsnd_priv *priv = rsnd_io_to_priv(io);
270 struct device *dev = rsnd_priv_to_dev(priv);
271 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
272 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
273 int chan = rsnd_runtime_channel_for_ssi(io);
274 int idx, ret;
275 unsigned int main_rate;
276 unsigned int rate = rsnd_io_is_play(io) ?
277 rsnd_src_get_out_rate(priv, io) :
278 rsnd_src_get_in_rate(priv, io);
279
280 if (!rsnd_rdai_is_clk_master(rdai))
281 return 0;
282
283 if (!rsnd_ssi_can_output_clk(mod))
284 return 0;
285
286 if (rsnd_ssi_is_multi_slave(mod, io))
287 return 0;
288
289 if (rsnd_runtime_is_tdm_split(io))
290 chan = rsnd_io_converted_chan(io);
291
292 chan = rsnd_channel_normalization(chan);
293
294 if (ssi->usrcnt > 0) {
295 if (ssi->rate != rate) {
296 dev_err(dev, "SSI parent/child should use same rate\n");
297 return -EINVAL;
298 }
299
300 if (ssi->chan != chan) {
301 dev_err(dev, "SSI parent/child should use same chan\n");
302 return -EINVAL;
303 }
304
305 return 0;
306 }
307
308 main_rate = rsnd_ssi_clk_query(rdai, rate, chan, &idx);
309 if (!main_rate) {
310 dev_err(dev, "unsupported clock rate\n");
311 return -EIO;
312 }
313
314 ret = rsnd_adg_ssi_clk_try_start(mod, main_rate);
315 if (ret < 0)
316 return ret;
317
318
319
320
321
322
323
324
325
326
327
328 ssi->cr_clk = FORCE | rsnd_rdai_width_to_swl(rdai) |
329 SCKD | SWSD | CKDV(idx);
330 ssi->wsr = CONT;
331 ssi->rate = rate;
332 ssi->chan = chan;
333
334 dev_dbg(dev, "%s outputs %d chan %u Hz\n",
335 rsnd_mod_name(mod), chan, rate);
336
337 return 0;
338 }
339
340 static void rsnd_ssi_master_clk_stop(struct rsnd_mod *mod,
341 struct rsnd_dai_stream *io)
342 {
343 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
344 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
345
346 if (!rsnd_rdai_is_clk_master(rdai))
347 return;
348
349 if (!rsnd_ssi_can_output_clk(mod))
350 return;
351
352 if (ssi->usrcnt > 1)
353 return;
354
355 ssi->cr_clk = 0;
356 ssi->rate = 0;
357 ssi->chan = 0;
358
359 rsnd_adg_ssi_clk_stop(mod);
360 }
361
362 static void rsnd_ssi_config_init(struct rsnd_mod *mod,
363 struct rsnd_dai_stream *io)
364 {
365 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
366 struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
367 struct device *dev = rsnd_priv_to_dev(priv);
368 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
369 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
370 u32 cr_own = ssi->cr_own;
371 u32 cr_mode = ssi->cr_mode;
372 u32 wsr = ssi->wsr;
373 int width;
374 int is_tdm, is_tdm_split;
375
376 is_tdm = rsnd_runtime_is_tdm(io);
377 is_tdm_split = rsnd_runtime_is_tdm_split(io);
378
379 if (is_tdm)
380 dev_dbg(dev, "TDM mode\n");
381 if (is_tdm_split)
382 dev_dbg(dev, "TDM Split mode\n");
383
384 cr_own |= FORCE | rsnd_rdai_width_to_swl(rdai);
385
386 if (rdai->bit_clk_inv)
387 cr_own |= SCKP;
388 if (rdai->frm_clk_inv && !is_tdm)
389 cr_own |= SWSP;
390 if (rdai->data_alignment)
391 cr_own |= SDTA;
392 if (rdai->sys_delay)
393 cr_own |= DEL;
394
395
396
397
398
399
400 wsr = ssi->wsr;
401 if (is_tdm || is_tdm_split) {
402 wsr |= WS_MODE;
403 cr_own |= CHNL_8;
404 }
405
406
407
408
409
410 if (rsnd_ssi_is_parent(mod, io))
411 goto init_end;
412
413 if (rsnd_io_is_play(io))
414 cr_own |= TRMD;
415
416 cr_own &= ~DWL_MASK;
417 width = snd_pcm_format_width(runtime->format);
418 if (is_tdm_split) {
419
420
421
422
423
424
425 width = 32;
426 }
427
428 switch (width) {
429 case 8:
430 cr_own |= DWL_8;
431 break;
432 case 16:
433 cr_own |= DWL_16;
434 break;
435 case 24:
436 cr_own |= DWL_24;
437 break;
438 case 32:
439 cr_own |= DWL_32;
440 break;
441 }
442
443 if (rsnd_ssi_is_dma_mode(mod)) {
444 cr_mode = UIEN | OIEN |
445 DMEN;
446 } else {
447 cr_mode = DIEN;
448 }
449
450 init_end:
451 ssi->cr_own = cr_own;
452 ssi->cr_mode = cr_mode;
453 ssi->wsr = wsr;
454 }
455
456 static void rsnd_ssi_register_setup(struct rsnd_mod *mod)
457 {
458 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
459
460 rsnd_mod_write(mod, SSIWSR, ssi->wsr);
461 rsnd_mod_write(mod, SSICR, ssi->cr_own |
462 ssi->cr_clk |
463 ssi->cr_mode |
464 ssi->cr_en);
465 }
466
467
468
469
470 static int rsnd_ssi_init(struct rsnd_mod *mod,
471 struct rsnd_dai_stream *io,
472 struct rsnd_priv *priv)
473 {
474 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
475
476 if (!rsnd_ssi_is_run_mods(mod, io))
477 return 0;
478
479 ssi->usrcnt++;
480
481 rsnd_mod_power_on(mod);
482
483 rsnd_ssi_config_init(mod, io);
484
485 rsnd_ssi_register_setup(mod);
486
487
488 rsnd_ssi_status_clear(mod);
489
490 return 0;
491 }
492
493 static int rsnd_ssi_quit(struct rsnd_mod *mod,
494 struct rsnd_dai_stream *io,
495 struct rsnd_priv *priv)
496 {
497 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
498 struct device *dev = rsnd_priv_to_dev(priv);
499
500 if (!rsnd_ssi_is_run_mods(mod, io))
501 return 0;
502
503 if (!ssi->usrcnt) {
504 dev_err(dev, "%s usrcnt error\n", rsnd_mod_name(mod));
505 return -EIO;
506 }
507
508 rsnd_ssi_master_clk_stop(mod, io);
509
510 rsnd_mod_power_off(mod);
511
512 ssi->usrcnt--;
513
514 if (!ssi->usrcnt) {
515 ssi->cr_own = 0;
516 ssi->cr_mode = 0;
517 ssi->wsr = 0;
518 }
519
520 return 0;
521 }
522
523 static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
524 struct rsnd_dai_stream *io,
525 struct snd_pcm_substream *substream,
526 struct snd_pcm_hw_params *params)
527 {
528 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
529 unsigned int fmt_width = snd_pcm_format_width(params_format(params));
530
531 if (fmt_width > rdai->chan_width) {
532 struct rsnd_priv *priv = rsnd_io_to_priv(io);
533 struct device *dev = rsnd_priv_to_dev(priv);
534
535 dev_err(dev, "invalid combination of slot-width and format-data-width\n");
536 return -EINVAL;
537 }
538
539 return 0;
540 }
541
542 static int rsnd_ssi_start(struct rsnd_mod *mod,
543 struct rsnd_dai_stream *io,
544 struct rsnd_priv *priv)
545 {
546 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
547
548 if (!rsnd_ssi_is_run_mods(mod, io))
549 return 0;
550
551
552
553
554
555 if (rsnd_ssi_multi_slaves_runtime(io))
556 return 0;
557
558
559
560
561
562 if (rsnd_ssi_is_parent(mod, io))
563 return 0;
564
565 ssi->cr_en = EN;
566
567 rsnd_mod_write(mod, SSICR, ssi->cr_own |
568 ssi->cr_clk |
569 ssi->cr_mode |
570 ssi->cr_en);
571
572 return 0;
573 }
574
575 static int rsnd_ssi_stop(struct rsnd_mod *mod,
576 struct rsnd_dai_stream *io,
577 struct rsnd_priv *priv)
578 {
579 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
580 u32 cr;
581
582 if (!rsnd_ssi_is_run_mods(mod, io))
583 return 0;
584
585 if (rsnd_ssi_is_parent(mod, io))
586 return 0;
587
588 cr = ssi->cr_own |
589 ssi->cr_clk;
590
591
592
593
594
595
596 if (rsnd_io_is_play(io)) {
597 rsnd_mod_write(mod, SSICR, cr | ssi->cr_en);
598 rsnd_ssi_status_check(mod, DIRQ);
599 }
600
601
602
603
604 if (rsnd_ssi_multi_slaves_runtime(io))
605 return 0;
606
607
608
609
610
611 rsnd_mod_write(mod, SSICR, cr);
612 rsnd_ssi_status_check(mod, IIRQ);
613
614 ssi->cr_en = 0;
615
616 return 0;
617 }
618
619 static int rsnd_ssi_irq(struct rsnd_mod *mod,
620 struct rsnd_dai_stream *io,
621 struct rsnd_priv *priv,
622 int enable)
623 {
624 u32 val = 0;
625
626 if (rsnd_is_gen1(priv))
627 return 0;
628
629 if (rsnd_ssi_is_parent(mod, io))
630 return 0;
631
632 if (!rsnd_ssi_is_run_mods(mod, io))
633 return 0;
634
635 if (enable)
636 val = rsnd_ssi_is_dma_mode(mod) ? 0x0e000000 : 0x0f000000;
637
638 rsnd_mod_write(mod, SSI_INT_ENABLE, val);
639
640 return 0;
641 }
642
643 static bool rsnd_ssi_pio_interrupt(struct rsnd_mod *mod,
644 struct rsnd_dai_stream *io);
645 static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
646 struct rsnd_dai_stream *io)
647 {
648 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
649 struct device *dev = rsnd_priv_to_dev(priv);
650 int is_dma = rsnd_ssi_is_dma_mode(mod);
651 u32 status;
652 bool elapsed = false;
653 bool stop = false;
654
655 spin_lock(&priv->lock);
656
657
658 if (!rsnd_io_is_working(io))
659 goto rsnd_ssi_interrupt_out;
660
661 status = rsnd_ssi_status_get(mod);
662
663
664 if (!is_dma && (status & DIRQ))
665 elapsed = rsnd_ssi_pio_interrupt(mod, io);
666
667
668 if (is_dma && (status & (UIRQ | OIRQ))) {
669 rsnd_dbg_irq_status(dev, "%s err status : 0x%08x\n",
670 rsnd_mod_name(mod), status);
671
672 stop = true;
673 }
674
675 rsnd_ssi_status_clear(mod);
676 rsnd_ssi_interrupt_out:
677 spin_unlock(&priv->lock);
678
679 if (elapsed)
680 rsnd_dai_period_elapsed(io);
681
682 if (stop)
683 snd_pcm_stop_xrun(io->substream);
684
685 }
686
687 static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
688 {
689 struct rsnd_mod *mod = data;
690
691 rsnd_mod_interrupt(mod, __rsnd_ssi_interrupt);
692
693 return IRQ_HANDLED;
694 }
695
696 static u32 *rsnd_ssi_get_status(struct rsnd_mod *mod,
697 struct rsnd_dai_stream *io,
698 enum rsnd_mod_type type)
699 {
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725 if (type == RSND_MOD_SSIP)
726 return &io->parent_ssi_status;
727
728 return rsnd_mod_get_status(mod, io, type);
729 }
730
731
732
733
734 static void rsnd_ssi_parent_attach(struct rsnd_mod *mod,
735 struct rsnd_dai_stream *io)
736 {
737 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
738 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
739
740 if (!__rsnd_ssi_is_pin_sharing(mod))
741 return;
742
743 if (!rsnd_rdai_is_clk_master(rdai))
744 return;
745
746 if (rsnd_ssi_is_multi_slave(mod, io))
747 return;
748
749 switch (rsnd_mod_id(mod)) {
750 case 1:
751 case 2:
752 case 9:
753 rsnd_dai_connect(rsnd_ssi_mod_get(priv, 0), io, RSND_MOD_SSIP);
754 break;
755 case 4:
756 rsnd_dai_connect(rsnd_ssi_mod_get(priv, 3), io, RSND_MOD_SSIP);
757 break;
758 case 8:
759 rsnd_dai_connect(rsnd_ssi_mod_get(priv, 7), io, RSND_MOD_SSIP);
760 break;
761 }
762 }
763
764 static int rsnd_ssi_pcm_new(struct rsnd_mod *mod,
765 struct rsnd_dai_stream *io,
766 struct snd_soc_pcm_runtime *rtd)
767 {
768
769
770
771
772
773 rsnd_ssi_parent_attach(mod, io);
774
775 return 0;
776 }
777
778 static int rsnd_ssi_common_probe(struct rsnd_mod *mod,
779 struct rsnd_dai_stream *io,
780 struct rsnd_priv *priv)
781 {
782 struct device *dev = rsnd_priv_to_dev(priv);
783 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
784 int ret = 0;
785
786
787
788
789
790 if (rsnd_ssi_is_multi_slave(mod, io))
791 return 0;
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809 if (!rsnd_flags_has(ssi, RSND_SSI_PROBED)) {
810 ret = request_irq(ssi->irq,
811 rsnd_ssi_interrupt,
812 IRQF_SHARED,
813 dev_name(dev), mod);
814
815 rsnd_flags_set(ssi, RSND_SSI_PROBED);
816 }
817
818 return ret;
819 }
820
821 static int rsnd_ssi_common_remove(struct rsnd_mod *mod,
822 struct rsnd_dai_stream *io,
823 struct rsnd_priv *priv)
824 {
825 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
826 struct rsnd_mod *pure_ssi_mod = rsnd_io_to_mod_ssi(io);
827
828
829 if (pure_ssi_mod != mod)
830 return 0;
831
832
833 if (rsnd_flags_has(ssi, RSND_SSI_PROBED)) {
834 free_irq(ssi->irq, mod);
835
836 rsnd_flags_del(ssi, RSND_SSI_PROBED);
837 }
838
839 return 0;
840 }
841
842
843
844
845 static bool rsnd_ssi_pio_interrupt(struct rsnd_mod *mod,
846 struct rsnd_dai_stream *io)
847 {
848 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
849 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
850 u32 *buf = (u32 *)(runtime->dma_area + ssi->byte_pos);
851 int shift = 0;
852 int byte_pos;
853 bool elapsed = false;
854
855 if (snd_pcm_format_width(runtime->format) == 24)
856 shift = 8;
857
858
859
860
861
862
863 if (rsnd_io_is_play(io))
864 rsnd_mod_write(mod, SSITDR, (*buf) << shift);
865 else
866 *buf = (rsnd_mod_read(mod, SSIRDR) >> shift);
867
868 byte_pos = ssi->byte_pos + sizeof(*buf);
869
870 if (byte_pos >= ssi->next_period_byte) {
871 int period_pos = byte_pos / ssi->byte_per_period;
872
873 if (period_pos >= runtime->periods) {
874 byte_pos = 0;
875 period_pos = 0;
876 }
877
878 ssi->next_period_byte = (period_pos + 1) * ssi->byte_per_period;
879
880 elapsed = true;
881 }
882
883 WRITE_ONCE(ssi->byte_pos, byte_pos);
884
885 return elapsed;
886 }
887
888 static int rsnd_ssi_pio_init(struct rsnd_mod *mod,
889 struct rsnd_dai_stream *io,
890 struct rsnd_priv *priv)
891 {
892 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
893 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
894
895 if (!rsnd_ssi_is_parent(mod, io)) {
896 ssi->byte_pos = 0;
897 ssi->byte_per_period = runtime->period_size *
898 runtime->channels *
899 samples_to_bytes(runtime, 1);
900 ssi->next_period_byte = ssi->byte_per_period;
901 }
902
903 return rsnd_ssi_init(mod, io, priv);
904 }
905
906 static int rsnd_ssi_pio_pointer(struct rsnd_mod *mod,
907 struct rsnd_dai_stream *io,
908 snd_pcm_uframes_t *pointer)
909 {
910 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
911 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
912
913 *pointer = bytes_to_frames(runtime, READ_ONCE(ssi->byte_pos));
914
915 return 0;
916 }
917
918 static int rsnd_ssi_prepare(struct rsnd_mod *mod,
919 struct rsnd_dai_stream *io,
920 struct rsnd_priv *priv)
921 {
922 return rsnd_ssi_master_clk_start(mod, io);
923 }
924
925 static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
926 .name = SSI_NAME,
927 .probe = rsnd_ssi_common_probe,
928 .remove = rsnd_ssi_common_remove,
929 .init = rsnd_ssi_pio_init,
930 .quit = rsnd_ssi_quit,
931 .start = rsnd_ssi_start,
932 .stop = rsnd_ssi_stop,
933 .irq = rsnd_ssi_irq,
934 .pointer = rsnd_ssi_pio_pointer,
935 .pcm_new = rsnd_ssi_pcm_new,
936 .hw_params = rsnd_ssi_hw_params,
937 .prepare = rsnd_ssi_prepare,
938 .get_status = rsnd_ssi_get_status,
939 };
940
941 static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
942 struct rsnd_dai_stream *io,
943 struct rsnd_priv *priv)
944 {
945 int ret;
946
947
948
949
950
951 if (rsnd_ssi_is_multi_slave(mod, io))
952 return 0;
953
954 ret = rsnd_ssi_common_probe(mod, io, priv);
955 if (ret)
956 return ret;
957
958
959 ret = rsnd_dma_attach(io, mod, &io->dma);
960
961 return ret;
962 }
963
964 static int rsnd_ssi_fallback(struct rsnd_mod *mod,
965 struct rsnd_dai_stream *io,
966 struct rsnd_priv *priv)
967 {
968 struct device *dev = rsnd_priv_to_dev(priv);
969
970
971
972
973
974
975
976
977 mod->ops = &rsnd_ssi_pio_ops;
978
979 dev_info(dev, "%s fallback to PIO mode\n", rsnd_mod_name(mod));
980
981 return 0;
982 }
983
984 static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_dai_stream *io,
985 struct rsnd_mod *mod)
986 {
987 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
988 int is_play = rsnd_io_is_play(io);
989 char *name;
990
991
992
993
994
995
996
997
998
999
1000
1001
1002 if (rsnd_ssi_use_busif(io))
1003 name = is_play ? "rxu" : "txu";
1004 else
1005 name = is_play ? "rx" : "tx";
1006
1007 return rsnd_dma_request_channel(rsnd_ssi_of_node(priv),
1008 mod, name);
1009 }
1010
1011 static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
1012 .name = SSI_NAME,
1013 .dma_req = rsnd_ssi_dma_req,
1014 .probe = rsnd_ssi_dma_probe,
1015 .remove = rsnd_ssi_common_remove,
1016 .init = rsnd_ssi_init,
1017 .quit = rsnd_ssi_quit,
1018 .start = rsnd_ssi_start,
1019 .stop = rsnd_ssi_stop,
1020 .irq = rsnd_ssi_irq,
1021 .pcm_new = rsnd_ssi_pcm_new,
1022 .fallback = rsnd_ssi_fallback,
1023 .hw_params = rsnd_ssi_hw_params,
1024 .prepare = rsnd_ssi_prepare,
1025 .get_status = rsnd_ssi_get_status,
1026 };
1027
1028 static int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod)
1029 {
1030 return mod->ops == &rsnd_ssi_dma_ops;
1031 }
1032
1033
1034
1035
1036 static void rsnd_ssi_connect(struct rsnd_mod *mod,
1037 struct rsnd_dai_stream *io)
1038 {
1039 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
1040 enum rsnd_mod_type types[] = {
1041 RSND_MOD_SSI,
1042 RSND_MOD_SSIM1,
1043 RSND_MOD_SSIM2,
1044 RSND_MOD_SSIM3,
1045 };
1046 enum rsnd_mod_type type;
1047 int i;
1048
1049
1050 for (i = 0; i < ARRAY_SIZE(types); i++) {
1051 type = types[i];
1052 if (!rsnd_io_to_mod(io, type)) {
1053 rsnd_dai_connect(mod, io, type);
1054 rsnd_rdai_channels_set(rdai, (i + 1) * 2);
1055 rsnd_rdai_ssi_lane_set(rdai, (i + 1));
1056 return;
1057 }
1058 }
1059 }
1060
1061 void rsnd_parse_connect_ssi(struct rsnd_dai *rdai,
1062 struct device_node *playback,
1063 struct device_node *capture)
1064 {
1065 struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
1066 struct device_node *node;
1067 struct device_node *np;
1068 struct rsnd_mod *mod;
1069 int i;
1070
1071 node = rsnd_ssi_of_node(priv);
1072 if (!node)
1073 return;
1074
1075 i = 0;
1076 for_each_child_of_node(node, np) {
1077 mod = rsnd_ssi_mod_get(priv, i);
1078 if (np == playback)
1079 rsnd_ssi_connect(mod, &rdai->playback);
1080 if (np == capture)
1081 rsnd_ssi_connect(mod, &rdai->capture);
1082 i++;
1083 }
1084
1085 of_node_put(node);
1086 }
1087
1088 struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id)
1089 {
1090 if (WARN_ON(id < 0 || id >= rsnd_ssi_nr(priv)))
1091 id = 0;
1092
1093 return rsnd_mod_get(rsnd_ssi_get(priv, id));
1094 }
1095
1096 int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
1097 {
1098 if (!mod)
1099 return 0;
1100
1101 return !!(rsnd_flags_has(rsnd_mod_to_ssi(mod), RSND_SSI_CLK_PIN_SHARE));
1102 }
1103
1104 int rsnd_ssi_probe(struct rsnd_priv *priv)
1105 {
1106 struct device_node *node;
1107 struct device_node *np;
1108 struct device *dev = rsnd_priv_to_dev(priv);
1109 struct rsnd_mod_ops *ops;
1110 struct clk *clk;
1111 struct rsnd_ssi *ssi;
1112 char name[RSND_SSI_NAME_SIZE];
1113 int i, nr, ret;
1114
1115 node = rsnd_ssi_of_node(priv);
1116 if (!node)
1117 return -EINVAL;
1118
1119 nr = of_get_child_count(node);
1120 if (!nr) {
1121 ret = -EINVAL;
1122 goto rsnd_ssi_probe_done;
1123 }
1124
1125 ssi = devm_kcalloc(dev, nr, sizeof(*ssi), GFP_KERNEL);
1126 if (!ssi) {
1127 ret = -ENOMEM;
1128 goto rsnd_ssi_probe_done;
1129 }
1130
1131 priv->ssi = ssi;
1132 priv->ssi_nr = nr;
1133
1134 i = 0;
1135 for_each_child_of_node(node, np) {
1136 if (!of_device_is_available(np))
1137 goto skip;
1138
1139 ssi = rsnd_ssi_get(priv, i);
1140
1141 snprintf(name, RSND_SSI_NAME_SIZE, "%s.%d",
1142 SSI_NAME, i);
1143
1144 clk = devm_clk_get(dev, name);
1145 if (IS_ERR(clk)) {
1146 ret = PTR_ERR(clk);
1147 of_node_put(np);
1148 goto rsnd_ssi_probe_done;
1149 }
1150
1151 if (of_get_property(np, "shared-pin", NULL))
1152 rsnd_flags_set(ssi, RSND_SSI_CLK_PIN_SHARE);
1153
1154 if (of_get_property(np, "no-busif", NULL))
1155 rsnd_flags_set(ssi, RSND_SSI_NO_BUSIF);
1156
1157 ssi->irq = irq_of_parse_and_map(np, 0);
1158 if (!ssi->irq) {
1159 ret = -EINVAL;
1160 of_node_put(np);
1161 goto rsnd_ssi_probe_done;
1162 }
1163
1164 if (of_property_read_bool(np, "pio-transfer"))
1165 ops = &rsnd_ssi_pio_ops;
1166 else
1167 ops = &rsnd_ssi_dma_ops;
1168
1169 ret = rsnd_mod_init(priv, rsnd_mod_get(ssi), ops, clk,
1170 RSND_MOD_SSI, i);
1171 if (ret) {
1172 of_node_put(np);
1173 goto rsnd_ssi_probe_done;
1174 }
1175 skip:
1176 i++;
1177 }
1178
1179 ret = 0;
1180
1181 rsnd_ssi_probe_done:
1182 of_node_put(node);
1183
1184 return ret;
1185 }
1186
1187 void rsnd_ssi_remove(struct rsnd_priv *priv)
1188 {
1189 struct rsnd_ssi *ssi;
1190 int i;
1191
1192 for_each_rsnd_ssi(ssi, priv, i) {
1193 rsnd_mod_quit(rsnd_mod_get(ssi));
1194 }
1195 }