ASoC: rsnd: move rsnd_ssi_irq() position
[deliverable/linux.git] / sound / soc / sh / rcar / ssi.c
CommitLineData
ae5c3223
KM
1/*
2 * Renesas R-Car SSIU/SSI support
3 *
4 * Copyright (C) 2013 Renesas Solutions Corp.
5 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6 *
7 * Based on fsi.c
8 * Kuninori Morimoto <morimoto.kuninori@renesas.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 */
14#include <linux/delay.h>
15#include "rsnd.h"
16#define RSND_SSI_NAME_SIZE 16
17
18/*
19 * SSICR
20 */
21#define FORCE (1 << 31) /* Fixed */
849fc82a 22#define DMEN (1 << 28) /* DMA Enable */
ae5c3223
KM
23#define UIEN (1 << 27) /* Underflow Interrupt Enable */
24#define OIEN (1 << 26) /* Overflow Interrupt Enable */
25#define IIEN (1 << 25) /* Idle Mode Interrupt Enable */
26#define DIEN (1 << 24) /* Data Interrupt Enable */
186fadc1
KM
27#define CHNL_4 (1 << 22) /* Channels */
28#define CHNL_6 (2 << 22) /* Channels */
29#define CHNL_8 (3 << 22) /* Channels */
ae5c3223
KM
30#define DWL_8 (0 << 19) /* Data Word Length */
31#define DWL_16 (1 << 19) /* Data Word Length */
32#define DWL_18 (2 << 19) /* Data Word Length */
33#define DWL_20 (3 << 19) /* Data Word Length */
34#define DWL_22 (4 << 19) /* Data Word Length */
35#define DWL_24 (5 << 19) /* Data Word Length */
36#define DWL_32 (6 << 19) /* Data Word Length */
37
38#define SWL_32 (3 << 16) /* R/W System Word Length */
39#define SCKD (1 << 15) /* Serial Bit Clock Direction */
40#define SWSD (1 << 14) /* Serial WS Direction */
41#define SCKP (1 << 13) /* Serial Bit Clock Polarity */
42#define SWSP (1 << 12) /* Serial WS Polarity */
43#define SDTA (1 << 10) /* Serial Data Alignment */
f46a93b8 44#define PDTA (1 << 9) /* Parallel Data Alignment */
ae5c3223
KM
45#define DEL (1 << 8) /* Serial Data Delay */
46#define CKDV(v) (v << 4) /* Serial Clock Division Ratio */
47#define TRMD (1 << 1) /* Transmit/Receive Mode Select */
48#define EN (1 << 0) /* SSI Module Enable */
49
50/*
51 * SSISR
52 */
53#define UIRQ (1 << 27) /* Underflow Error Interrupt Status */
54#define OIRQ (1 << 26) /* Overflow Error Interrupt Status */
55#define IIRQ (1 << 25) /* Idle Mode Interrupt Status */
56#define DIRQ (1 << 24) /* Data Interrupt Status Flag */
57
849fc82a
KM
58/*
59 * SSIWSR
60 */
61#define CONT (1 << 8) /* WS Continue Function */
186fadc1 62#define WS_MODE (1 << 0) /* WS Mode */
849fc82a 63
8aefda50
KM
64#define SSI_NAME "ssi"
65
ae5c3223 66struct rsnd_ssi {
ae5c3223 67 struct rsnd_mod mod;
940e9479 68 struct rsnd_mod *dma;
ae5c3223 69
02534f2f 70 u32 flags;
ae5c3223
KM
71 u32 cr_own;
72 u32 cr_clk;
e7d850dd 73 u32 cr_mode;
08bada26 74 u32 wsr;
919567d9 75 int chan;
e7d850dd 76 int rate;
02534f2f 77 int irq;
ae5c3223 78 unsigned int usrcnt;
ae5c3223
KM
79};
80
02534f2f
KM
81/* flags */
82#define RSND_SSI_CLK_PIN_SHARE (1 << 0)
83#define RSND_SSI_NO_BUSIF (1 << 1) /* SSI+DMA without BUSIF */
84
ae5c3223
KM
85#define for_each_rsnd_ssi(pos, priv, i) \
86 for (i = 0; \
87 (i < rsnd_ssi_nr(priv)) && \
dd27d808 88 ((pos) = ((struct rsnd_ssi *)(priv)->ssi + i)); \
ae5c3223
KM
89 i++)
90
02534f2f 91#define rsnd_ssi_get(priv, id) ((struct rsnd_ssi *)(priv->ssi) + id)
232c00b6 92#define rsnd_ssi_to_dma(mod) ((ssi)->dma)
dd27d808 93#define rsnd_ssi_nr(priv) ((priv)->ssi_nr)
ae5c3223 94#define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
02534f2f 95#define rsnd_ssi_mode_flags(p) ((p)->flags)
e7d850dd 96#define rsnd_ssi_is_parent(ssi, io) ((ssi) == rsnd_io_to_mod_ssip(io))
c308abe4
KM
97#define rsnd_ssi_is_multi_slave(mod, io) \
98 (rsnd_ssi_multi_slaves(io) & (1 << rsnd_mod_id(mod)))
ae5c3223 99
b415b4d3 100int rsnd_ssi_use_busif(struct rsnd_dai_stream *io)
d9288d0b 101{
b415b4d3 102 struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io);
d9288d0b 103 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
d9288d0b
KM
104 int use_busif = 0;
105
7b466fc6
KM
106 if (!rsnd_ssi_is_dma_mode(mod))
107 return 0;
108
d9288d0b
KM
109 if (!(rsnd_ssi_mode_flags(ssi) & RSND_SSI_NO_BUSIF))
110 use_busif = 1;
111 if (rsnd_io_to_mod_src(io))
112 use_busif = 1;
113
114 return use_busif;
115}
116
e10369d8
KM
117static void rsnd_ssi_status_clear(struct rsnd_mod *mod)
118{
119 rsnd_mod_write(mod, SSISR, 0);
120}
121
122static u32 rsnd_ssi_status_get(struct rsnd_mod *mod)
123{
124 return rsnd_mod_read(mod, SSISR);
125}
126
ae5c3223
KM
127static void rsnd_ssi_status_check(struct rsnd_mod *mod,
128 u32 bit)
129{
130 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
131 struct device *dev = rsnd_priv_to_dev(priv);
132 u32 status;
133 int i;
134
135 for (i = 0; i < 1024; i++) {
e10369d8 136 status = rsnd_ssi_status_get(mod);
ae5c3223
KM
137 if (status & bit)
138 return;
139
140 udelay(50);
141 }
142
1120dbff
KM
143 dev_warn(dev, "%s[%d] status check failed\n",
144 rsnd_mod_name(mod), rsnd_mod_id(mod));
ae5c3223
KM
145}
146
b4c83b17
KM
147u32 rsnd_ssi_multi_slaves(struct rsnd_dai_stream *io)
148{
149 struct rsnd_mod *mod;
b4c83b17
KM
150 enum rsnd_mod_type types[] = {
151 RSND_MOD_SSIM1,
152 RSND_MOD_SSIM2,
153 RSND_MOD_SSIM3,
154 };
155 int i, mask;
156
b4c83b17
KM
157 mask = 0;
158 for (i = 0; i < ARRAY_SIZE(types); i++) {
159 mod = rsnd_io_to_mod(io, types[i]);
160 if (!mod)
161 continue;
162
163 mask |= 1 << rsnd_mod_id(mod);
164 }
165
166 return mask;
167}
168
26d34b11 169static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
adcf7d5e 170 struct rsnd_dai_stream *io)
ae5c3223 171{
1b13d118 172 struct rsnd_priv *priv = rsnd_io_to_priv(io);
adcf7d5e 173 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
ae5c3223 174 struct device *dev = rsnd_priv_to_dev(priv);
e7d850dd 175 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
26d34b11 176 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
e7d850dd 177 struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
c140284b 178 int slots = rsnd_get_slot_width(io);
eae6fff4 179 int j, ret;
ae5c3223
KM
180 int ssi_clk_mul_table[] = {
181 1, 2, 4, 8, 16, 6, 12,
182 };
183 unsigned int main_rate;
ba9c949f 184 unsigned int rate = rsnd_src_get_ssi_rate(priv, io, runtime);
ae5c3223 185
e7d850dd
KM
186 if (!rsnd_rdai_is_clk_master(rdai))
187 return 0;
188
189 if (ssi_parent_mod && !rsnd_ssi_is_parent(mod, io))
190 return 0;
191
b4c83b17
KM
192 if (rsnd_ssi_is_multi_slave(mod, io))
193 return 0;
194
e7d850dd
KM
195 if (ssi->usrcnt > 1) {
196 if (ssi->rate != rate) {
197 dev_err(dev, "SSI parent/child should use same rate\n");
198 return -EINVAL;
199 }
200
201 return 0;
202 }
203
ae5c3223
KM
204 /*
205 * Find best clock, and try to start ADG
206 */
eae6fff4
KM
207 for (j = 0; j < ARRAY_SIZE(ssi_clk_mul_table); j++) {
208
209 /*
210 * this driver is assuming that
8ec85e7f 211 * system word is 32bit x slots
eae6fff4
KM
212 * see rsnd_ssi_init()
213 */
8ec85e7f 214 main_rate = rate * 32 * slots * ssi_clk_mul_table[j];
eae6fff4
KM
215
216 ret = rsnd_adg_ssi_clk_try_start(mod, main_rate);
217 if (0 == ret) {
218 ssi->cr_clk = FORCE | SWL_32 |
219 SCKD | SWSD | CKDV(j);
08bada26 220 ssi->wsr = CONT;
eae6fff4 221
e7d850dd
KM
222 ssi->rate = rate;
223
eae6fff4
KM
224 dev_dbg(dev, "%s[%d] outputs %u Hz\n",
225 rsnd_mod_name(mod),
226 rsnd_mod_id(mod), rate);
227
228 return 0;
ae5c3223
KM
229 }
230 }
231
232 dev_err(dev, "unsupported clock rate\n");
233 return -EIO;
234}
235
26d34b11 236static void rsnd_ssi_master_clk_stop(struct rsnd_mod *mod,
e7d850dd 237 struct rsnd_dai_stream *io)
ae5c3223 238{
f708d944 239 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
26d34b11 240 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
e7d850dd 241 struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
3ba84f45 242
e7d850dd 243 if (!rsnd_rdai_is_clk_master(rdai))
ae5c3223 244 return;
ae5c3223 245
e7d850dd
KM
246 if (ssi_parent_mod && !rsnd_ssi_is_parent(mod, io))
247 return;
ae5c3223 248
e7d850dd
KM
249 if (ssi->usrcnt > 1)
250 return;
919567d9 251
e7d850dd
KM
252 ssi->cr_clk = 0;
253 ssi->rate = 0;
ae5c3223 254
e7d850dd 255 rsnd_adg_ssi_clk_stop(mod);
ae5c3223
KM
256}
257
0dc6bf75 258static void rsnd_ssi_config_init(struct rsnd_mod *mod,
840ada3b
KM
259 struct rsnd_dai_stream *io)
260{
261 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
262 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
26d34b11 263 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
840ada3b
KM
264 u32 cr_own;
265 u32 cr_mode;
186fadc1 266 u32 wsr;
f98ed119
KM
267 int is_tdm;
268
c140284b 269 is_tdm = (rsnd_get_slot_width(io) >= 6) ? 1 : 0;
840ada3b
KM
270
271 /*
272 * always use 32bit system word.
273 * see also rsnd_ssi_master_clk_enable()
274 */
275 cr_own = FORCE | SWL_32 | PDTA;
276
277 if (rdai->bit_clk_inv)
278 cr_own |= SCKP;
f98ed119 279 if (rdai->frm_clk_inv ^ is_tdm)
840ada3b
KM
280 cr_own |= SWSP;
281 if (rdai->data_alignment)
282 cr_own |= SDTA;
283 if (rdai->sys_delay)
284 cr_own |= DEL;
285 if (rsnd_io_is_play(io))
286 cr_own |= TRMD;
287
288 switch (runtime->sample_bits) {
289 case 16:
290 cr_own |= DWL_16;
291 break;
292 case 32:
293 cr_own |= DWL_24;
294 break;
840ada3b
KM
295 }
296
26d34b11 297 if (rsnd_ssi_is_dma_mode(mod)) {
840ada3b
KM
298 cr_mode = UIEN | OIEN | /* over/under run */
299 DMEN; /* DMA : enable DMA */
300 } else {
301 cr_mode = DIEN; /* PIO : enable Data interrupt */
302 }
303
186fadc1
KM
304 /*
305 * TDM Extend Mode
306 * see
307 * rsnd_ssiu_init_gen2()
308 */
309 wsr = ssi->wsr;
f98ed119 310 if (is_tdm) {
186fadc1
KM
311 wsr |= WS_MODE;
312 cr_own |= CHNL_8;
313 }
314
840ada3b
KM
315 ssi->cr_own = cr_own;
316 ssi->cr_mode = cr_mode;
186fadc1 317 ssi->wsr = wsr;
0dc6bf75 318}
840ada3b 319
0dc6bf75
KM
320static void rsnd_ssi_register_setup(struct rsnd_mod *mod)
321{
322 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
323
324 rsnd_mod_write(mod, SSIWSR, ssi->wsr);
325 rsnd_mod_write(mod, SSICR, ssi->cr_own |
326 ssi->cr_clk |
327 ssi->cr_mode); /* without EN */
840ada3b
KM
328}
329
ae5c3223
KM
330/*
331 * SSI mod common functions
332 */
333static int rsnd_ssi_init(struct rsnd_mod *mod,
2c0fac19 334 struct rsnd_dai_stream *io,
690602fc 335 struct rsnd_priv *priv)
ae5c3223
KM
336{
337 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
e7d850dd
KM
338 int ret;
339
340 ssi->usrcnt++;
341
342 rsnd_mod_power_on(mod);
343
26d34b11 344 ret = rsnd_ssi_master_clk_start(mod, io);
e7d850dd
KM
345 if (ret < 0)
346 return ret;
347
0dc6bf75
KM
348 if (!rsnd_ssi_is_parent(mod, io))
349 rsnd_ssi_config_init(mod, io);
ae5c3223 350
0dc6bf75 351 rsnd_ssi_register_setup(mod);
e7d850dd 352
e7d850dd
KM
353 /* clear error status */
354 rsnd_ssi_status_clear(mod);
355
ae5c3223
KM
356 return 0;
357}
358
359static int rsnd_ssi_quit(struct rsnd_mod *mod,
2c0fac19 360 struct rsnd_dai_stream *io,
690602fc 361 struct rsnd_priv *priv)
ae5c3223
KM
362{
363 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
ae5c3223
KM
364 struct device *dev = rsnd_priv_to_dev(priv);
365
e5d9cfc6
AH
366 if (!ssi->usrcnt) {
367 dev_err(dev, "%s[%d] usrcnt error\n",
368 rsnd_mod_name(mod), rsnd_mod_id(mod));
369 return -EIO;
370 }
e7d850dd 371
b5b442ab 372 if (!rsnd_ssi_is_parent(mod, io))
e5d9cfc6 373 ssi->cr_own = 0;
ae5c3223 374
26d34b11 375 rsnd_ssi_master_clk_stop(mod, io);
e7d850dd
KM
376
377 rsnd_mod_power_off(mod);
378
379 ssi->usrcnt--;
380
ae5c3223
KM
381 return 0;
382}
383
919567d9 384static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
2c0fac19 385 struct rsnd_dai_stream *io,
919567d9
KM
386 struct snd_pcm_substream *substream,
387 struct snd_pcm_hw_params *params)
388{
389 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
919567d9
KM
390 int chan = params_channels(params);
391
392 /*
393 * Already working.
394 * It will happen if SSI has parent/child connection.
395 */
e7d850dd 396 if (ssi->usrcnt > 1) {
919567d9
KM
397 /*
398 * it is error if child <-> parent SSI uses
399 * different channels.
400 */
401 if (ssi->chan != chan)
402 return -EIO;
403 }
404
919567d9 405 ssi->chan = chan;
919567d9
KM
406
407 return 0;
408}
409
6a25c8da
KM
410static int rsnd_ssi_start(struct rsnd_mod *mod,
411 struct rsnd_dai_stream *io,
412 struct rsnd_priv *priv)
e7d850dd 413{
b4c83b17
KM
414 /*
415 * EN will be set via SSIU :: SSI_CONTROL
416 * if Multi channel mode
417 */
0dc6bf75
KM
418 if (rsnd_ssi_multi_slaves(io))
419 return 0;
e7d850dd 420
0dc6bf75 421 rsnd_mod_bset(mod, SSICR, EN, EN);
e7d850dd
KM
422
423 return 0;
424}
425
6a25c8da
KM
426static int rsnd_ssi_stop(struct rsnd_mod *mod,
427 struct rsnd_dai_stream *io,
428 struct rsnd_priv *priv)
e7d850dd 429{
6a25c8da
KM
430 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
431 u32 cr;
432
e7d850dd 433 /*
6a25c8da 434 * don't stop if not last user
e7d850dd 435 * see also
6a25c8da 436 * rsnd_ssi_start
e7d850dd
KM
437 * rsnd_ssi_interrupt
438 */
6a25c8da
KM
439 if (ssi->usrcnt > 1)
440 return 0;
e7d850dd
KM
441
442 /*
443 * disable all IRQ,
444 * and, wait all data was sent
445 */
446 cr = ssi->cr_own |
447 ssi->cr_clk;
4e7d606c 448
e7d850dd
KM
449 rsnd_mod_write(mod, SSICR, cr | EN);
450 rsnd_ssi_status_check(mod, DIRQ);
4e7d606c 451
e7d850dd
KM
452 /*
453 * disable SSI,
454 * and, wait idle state
455 */
456 rsnd_mod_write(mod, SSICR, cr); /* disabled all */
457 rsnd_ssi_status_check(mod, IIRQ);
4e7d606c
KM
458
459 return 0;
460}
461
615fb6c7
KM
462static int rsnd_ssi_irq(struct rsnd_mod *mod,
463 struct rsnd_dai_stream *io,
464 struct rsnd_priv *priv,
465 int enable)
466{
467 u32 val = 0;
468
469 if (rsnd_is_gen1(priv))
470 return 0;
471
472 if (rsnd_ssi_is_parent(mod, io))
473 return 0;
474
475 if (enable)
476 val = rsnd_ssi_is_dma_mode(mod) ? 0x0e000000 : 0x0f000000;
477
478 rsnd_mod_write(mod, SSI_INT_ENABLE, val);
479
480 return 0;
481}
482
bfc0cfe6
KM
483static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
484 struct rsnd_dai_stream *io)
ae5c3223 485{
690602fc 486 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
765ae7c8 487 int is_dma = rsnd_ssi_is_dma_mode(mod);
02299d98 488 u32 status;
75defee0 489 bool elapsed = false;
6a25c8da 490 bool stop = false;
02299d98
KM
491
492 spin_lock(&priv->lock);
ae5c3223 493
02299d98 494 /* ignore all cases if not working */
d5bbe7de 495 if (!rsnd_io_is_working(io))
02299d98
KM
496 goto rsnd_ssi_interrupt_out;
497
6a25c8da 498 status = rsnd_ssi_status_get(mod);
4e7d606c
KM
499
500 /* PIO only */
765ae7c8 501 if (!is_dma && (status & DIRQ)) {
ae5c3223
KM
502 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
503 u32 *buf = (u32 *)(runtime->dma_area +
504 rsnd_dai_pointer_offset(io, 0));
505
ae5c3223
KM
506 /*
507 * 8/16/32 data can be assesse to TDR/RDR register
508 * directly as 32bit data
509 * see rsnd_ssi_init()
510 */
985a4f6e 511 if (rsnd_io_is_play(io))
4686a0ad 512 rsnd_mod_write(mod, SSITDR, *buf);
ae5c3223 513 else
4686a0ad 514 *buf = rsnd_mod_read(mod, SSIRDR);
ae5c3223 515
75defee0 516 elapsed = rsnd_dai_pointer_update(io, sizeof(*buf));
4e7d606c 517 }
ae5c3223 518
12927a8f 519 /* DMA only */
6a25c8da
KM
520 if (is_dma && (status & (UIRQ | OIRQ)))
521 stop = true;
69e32a58 522
5342dff2 523 rsnd_ssi_status_clear(mod);
02299d98
KM
524rsnd_ssi_interrupt_out:
525 spin_unlock(&priv->lock);
526
75defee0
KM
527 if (elapsed)
528 rsnd_dai_period_elapsed(io);
6a25c8da
KM
529
530 if (stop)
531 snd_pcm_stop_xrun(io->substream);
532
bfc0cfe6
KM
533}
534
535static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
536{
537 struct rsnd_mod *mod = data;
538
539 rsnd_mod_interrupt(mod, __rsnd_ssi_interrupt);
75defee0 540
4e7d606c 541 return IRQ_HANDLED;
ae5c3223
KM
542}
543
6cfad789
KM
544/*
545 * SSI PIO
546 */
e7d850dd 547static void rsnd_ssi_parent_attach(struct rsnd_mod *mod,
098bd891 548 struct rsnd_dai_stream *io)
e7d850dd 549{
098bd891
KM
550 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
551 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
552
e7d850dd
KM
553 if (!__rsnd_ssi_is_pin_sharing(mod))
554 return;
555
098bd891
KM
556 if (!rsnd_rdai_is_clk_master(rdai))
557 return;
558
e7d850dd
KM
559 switch (rsnd_mod_id(mod)) {
560 case 1:
561 case 2:
562 rsnd_dai_connect(rsnd_ssi_mod_get(priv, 0), io, RSND_MOD_SSIP);
563 break;
564 case 4:
565 rsnd_dai_connect(rsnd_ssi_mod_get(priv, 3), io, RSND_MOD_SSIP);
566 break;
567 case 8:
568 rsnd_dai_connect(rsnd_ssi_mod_get(priv, 7), io, RSND_MOD_SSIP);
569 break;
570 }
571}
572
098bd891
KM
573static int rsnd_ssi_pcm_new(struct rsnd_mod *mod,
574 struct rsnd_dai_stream *io,
575 struct snd_soc_pcm_runtime *rtd)
576{
577 /*
578 * rsnd_rdai_is_clk_master() will be enabled after set_fmt,
579 * and, pcm_new will be called after it.
580 * This function reuse pcm_new at this point.
581 */
582 rsnd_ssi_parent_attach(mod, io);
583
584 return 0;
585}
586
c7f69ab5
KM
587static int rsnd_ssi_common_probe(struct rsnd_mod *mod,
588 struct rsnd_dai_stream *io,
589 struct rsnd_priv *priv)
ff8f30e6 590{
ff8f30e6
KM
591 struct device *dev = rsnd_priv_to_dev(priv);
592 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
ff8f30e6
KM
593 int ret;
594
b4c83b17
KM
595 /*
596 * SSIP/SSIU/IRQ are not needed on
597 * SSI Multi slaves
598 */
599 if (rsnd_ssi_is_multi_slave(mod, io))
600 return 0;
601
098bd891
KM
602 /*
603 * It can't judge ssi parent at this point
604 * see rsnd_ssi_pcm_new()
605 */
e7d850dd 606
c7f69ab5
KM
607 ret = rsnd_ssiu_attach(io, mod);
608 if (ret < 0)
609 return ret;
610
02534f2f 611 ret = devm_request_irq(dev, ssi->irq,
6cfad789 612 rsnd_ssi_interrupt,
ff8f30e6 613 IRQF_SHARED,
bfc0cfe6 614 dev_name(dev), mod);
8aefda50 615
ff8f30e6
KM
616 return ret;
617}
618
ae5c3223 619static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
8aefda50 620 .name = SSI_NAME,
c7f69ab5 621 .probe = rsnd_ssi_common_probe,
ae5c3223
KM
622 .init = rsnd_ssi_init,
623 .quit = rsnd_ssi_quit,
49229850
KM
624 .start = rsnd_ssi_start,
625 .stop = rsnd_ssi_stop,
b5b442ab 626 .irq = rsnd_ssi_irq,
098bd891 627 .pcm_new = rsnd_ssi_pcm_new,
919567d9 628 .hw_params = rsnd_ssi_hw_params,
ae5c3223
KM
629};
630
ff8f30e6 631static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
2c0fac19 632 struct rsnd_dai_stream *io,
690602fc 633 struct rsnd_priv *priv)
ff8f30e6 634{
ff8f30e6 635 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
02534f2f 636 int dma_id = 0; /* not needed */
ff8f30e6
KM
637 int ret;
638
b4c83b17
KM
639 /*
640 * SSIP/SSIU/IRQ/DMA are not needed on
641 * SSI Multi slaves
642 */
643 if (rsnd_ssi_is_multi_slave(mod, io))
644 return 0;
645
c7f69ab5 646 ret = rsnd_ssi_common_probe(mod, io, priv);
4e7d606c 647 if (ret)
b543b52a 648 return ret;
4e7d606c 649
355cb84f
KM
650 /* SSI probe might be called many times in MUX multi path */
651 ret = rsnd_dma_attach(io, mod, &ssi->dma, dma_id);
8aefda50 652
ff8f30e6
KM
653 return ret;
654}
655
656static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
2c0fac19 657 struct rsnd_dai_stream *io,
690602fc 658 struct rsnd_priv *priv)
97463e19 659{
4e7d606c
KM
660 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
661 struct device *dev = rsnd_priv_to_dev(priv);
02534f2f 662 int irq = ssi->irq;
4e7d606c 663
4e7d606c 664 /* PIO will request IRQ again */
b05ce4c0 665 devm_free_irq(dev, irq, mod);
4e7d606c 666
97463e19
KM
667 return 0;
668}
669
670static int rsnd_ssi_fallback(struct rsnd_mod *mod,
2c0fac19 671 struct rsnd_dai_stream *io,
690602fc 672 struct rsnd_priv *priv)
ff8f30e6 673{
d3a76823
KM
674 struct device *dev = rsnd_priv_to_dev(priv);
675
d3a76823
KM
676 /*
677 * fallback to PIO
678 *
679 * SSI .probe might be called again.
680 * see
681 * rsnd_rdai_continuance_probe()
682 */
683 mod->ops = &rsnd_ssi_pio_ops;
684
685 dev_info(dev, "%s[%d] fallback to PIO mode\n",
686 rsnd_mod_name(mod), rsnd_mod_id(mod));
687
ff8f30e6
KM
688 return 0;
689}
690
9b99e9a7
KM
691static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_dai_stream *io,
692 struct rsnd_mod *mod)
d9288d0b 693{
72adc61f 694 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
72adc61f
KM
695 int is_play = rsnd_io_is_play(io);
696 char *name;
697
b415b4d3 698 if (rsnd_ssi_use_busif(io))
72adc61f
KM
699 name = is_play ? "rxu" : "txu";
700 else
701 name = is_play ? "rx" : "tx";
702
703 return rsnd_dma_request_channel(rsnd_ssi_of_node(priv),
704 mod, name);
d9288d0b
KM
705}
706
849fc82a 707static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
8aefda50 708 .name = SSI_NAME,
72adc61f 709 .dma_req = rsnd_ssi_dma_req,
ff8f30e6
KM
710 .probe = rsnd_ssi_dma_probe,
711 .remove = rsnd_ssi_dma_remove,
849fc82a
KM
712 .init = rsnd_ssi_init,
713 .quit = rsnd_ssi_quit,
497debaa
KM
714 .start = rsnd_ssi_start,
715 .stop = rsnd_ssi_stop,
c8e969a8 716 .irq = rsnd_ssi_irq,
098bd891 717 .pcm_new = rsnd_ssi_pcm_new,
97463e19 718 .fallback = rsnd_ssi_fallback,
919567d9 719 .hw_params = rsnd_ssi_hw_params,
849fc82a
KM
720};
721
05795411
KM
722int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod)
723{
724 return mod->ops == &rsnd_ssi_dma_ops;
725}
726
727
ae5c3223
KM
728/*
729 * Non SSI
730 */
ae5c3223 731static struct rsnd_mod_ops rsnd_ssi_non_ops = {
8aefda50 732 .name = SSI_NAME,
ae5c3223
KM
733};
734
735/*
736 * ssi mod function
737 */
b4c83b17
KM
738static void rsnd_ssi_connect(struct rsnd_mod *mod,
739 struct rsnd_dai_stream *io)
740{
741 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
742 enum rsnd_mod_type types[] = {
743 RSND_MOD_SSI,
744 RSND_MOD_SSIM1,
745 RSND_MOD_SSIM2,
746 RSND_MOD_SSIM3,
747 };
748 enum rsnd_mod_type type;
749 int i;
750
751 /* try SSI -> SSIM1 -> SSIM2 -> SSIM3 */
752 for (i = 0; i < ARRAY_SIZE(types); i++) {
753 type = types[i];
754 if (!rsnd_io_to_mod(io, type)) {
755 rsnd_dai_connect(mod, io, type);
756 rsnd_set_slot(rdai, 2 * (i + 1), (i + 1));
757 return;
758 }
759 }
760}
761
762void rsnd_parse_connect_ssi(struct rsnd_dai *rdai,
763 struct device_node *playback,
764 struct device_node *capture)
765{
766 struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
767 struct device_node *node;
768 struct device_node *np;
769 struct rsnd_mod *mod;
770 int i;
771
772 node = rsnd_ssi_of_node(priv);
773 if (!node)
774 return;
775
776 i = 0;
777 for_each_child_of_node(node, np) {
778 mod = rsnd_ssi_mod_get(priv, i);
779 if (np == playback)
780 rsnd_ssi_connect(mod, &rdai->playback);
781 if (np == capture)
782 rsnd_ssi_connect(mod, &rdai->capture);
783 i++;
784 }
785
786 of_node_put(node);
787}
788
ae5c3223
KM
789struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id)
790{
8b14719b
TI
791 if (WARN_ON(id < 0 || id >= rsnd_ssi_nr(priv)))
792 id = 0;
ae5c3223 793
02534f2f 794 return rsnd_mod_get(rsnd_ssi_get(priv, id));
ae5c3223
KM
795}
796
b415b4d3 797int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
7b5ce975
KM
798{
799 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
800
801 return !!(rsnd_ssi_mode_flags(ssi) & RSND_SSI_CLK_PIN_SHARE);
802}
803
5ba17b42
KM
804static u32 *rsnd_ssi_get_status(struct rsnd_dai_stream *io,
805 struct rsnd_mod *mod,
806 enum rsnd_mod_type type)
807{
808 /*
809 * SSIP (= SSI parent) needs to be special, otherwise,
810 * 2nd SSI might doesn't start. see also rsnd_mod_call()
811 *
812 * We can't include parent SSI status on SSI, because we don't know
813 * how many SSI requests parent SSI. Thus, it is localed on "io" now.
814 * ex) trouble case
815 * Playback: SSI0
816 * Capture : SSI1 (needs SSI0)
817 *
818 * 1) start Capture -> SSI0/SSI1 are started.
819 * 2) start Playback -> SSI0 doesn't work, because it is already
820 * marked as "started" on 1)
821 *
822 * OTOH, using each mod's status is good for MUX case.
823 * It doesn't need to start in 2nd start
824 * ex)
825 * IO-0: SRC0 -> CTU1 -+-> MUX -> DVC -> SSIU -> SSI0
826 * |
827 * IO-1: SRC1 -> CTU2 -+
828 *
829 * 1) start IO-0 -> start SSI0
830 * 2) start IO-1 -> SSI0 doesn't need to start, because it is
831 * already started on 1)
832 */
833 if (type == RSND_MOD_SSIP)
834 return &io->parent_ssi_status;
835
836 return rsnd_mod_get_status(io, mod, type);
837}
838
2ea6b074 839int rsnd_ssi_probe(struct rsnd_priv *priv)
ae5c3223 840{
02534f2f
KM
841 struct device_node *node;
842 struct device_node *np;
ae5c3223
KM
843 struct device *dev = rsnd_priv_to_dev(priv);
844 struct rsnd_mod_ops *ops;
845 struct clk *clk;
ae5c3223
KM
846 struct rsnd_ssi *ssi;
847 char name[RSND_SSI_NAME_SIZE];
2f78dd7f 848 int i, nr, ret;
ae5c3223 849
02534f2f
KM
850 node = rsnd_ssi_of_node(priv);
851 if (!node)
852 return -EINVAL;
853
854 nr = of_get_child_count(node);
855 if (!nr) {
856 ret = -EINVAL;
857 goto rsnd_ssi_probe_done;
858 }
90e8e50f 859
dd27d808 860 ssi = devm_kzalloc(dev, sizeof(*ssi) * nr, GFP_KERNEL);
02534f2f
KM
861 if (!ssi) {
862 ret = -ENOMEM;
863 goto rsnd_ssi_probe_done;
864 }
ae5c3223 865
dd27d808
KM
866 priv->ssi = ssi;
867 priv->ssi_nr = nr;
ae5c3223 868
02534f2f
KM
869 i = 0;
870 for_each_child_of_node(node, np) {
871 ssi = rsnd_ssi_get(priv, i);
ae5c3223 872
8aefda50
KM
873 snprintf(name, RSND_SSI_NAME_SIZE, "%s.%d",
874 SSI_NAME, i);
ae5c3223 875
60dbb4f1 876 clk = devm_clk_get(dev, name);
02534f2f
KM
877 if (IS_ERR(clk)) {
878 ret = PTR_ERR(clk);
879 goto rsnd_ssi_probe_done;
880 }
ae5c3223 881
02534f2f
KM
882 if (of_get_property(np, "shared-pin", NULL))
883 ssi->flags |= RSND_SSI_CLK_PIN_SHARE;
884
885 if (of_get_property(np, "no-busif", NULL))
886 ssi->flags |= RSND_SSI_NO_BUSIF;
887
888 ssi->irq = irq_of_parse_and_map(np, 0);
889 if (!ssi->irq) {
890 ret = -EINVAL;
891 goto rsnd_ssi_probe_done;
892 }
ae5c3223
KM
893
894 ops = &rsnd_ssi_non_ops;
02534f2f 895 if (of_get_property(np, "pio-transfer", NULL))
ff8f30e6 896 ops = &rsnd_ssi_pio_ops;
02534f2f
KM
897 else
898 ops = &rsnd_ssi_dma_ops;
ae5c3223 899
b76e218a 900 ret = rsnd_mod_init(priv, rsnd_mod_get(ssi), ops, clk,
5ba17b42 901 rsnd_ssi_get_status, RSND_MOD_SSI, i);
2f78dd7f 902 if (ret)
02534f2f
KM
903 goto rsnd_ssi_probe_done;
904
905 i++;
ae5c3223
KM
906 }
907
02534f2f
KM
908 ret = 0;
909
910rsnd_ssi_probe_done:
911 of_node_put(node);
912
913 return ret;
ae5c3223 914}
2f78dd7f 915
2ea6b074 916void rsnd_ssi_remove(struct rsnd_priv *priv)
2f78dd7f
KM
917{
918 struct rsnd_ssi *ssi;
919 int i;
920
921 for_each_rsnd_ssi(ssi, priv, i) {
b76e218a 922 rsnd_mod_quit(rsnd_mod_get(ssi));
2f78dd7f
KM
923 }
924}
This page took 0.371302 seconds and 5 git commands to generate.