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