]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - sound/soc/sh/rcar/ssi.c
ASoC: rsnd: SND_SOC_RCAR doesn't depend on DMA_OF
[mirror_ubuntu-bionic-kernel.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 */
27
28#define DWL_8 (0 << 19) /* Data Word Length */
29#define DWL_16 (1 << 19) /* Data Word Length */
30#define DWL_18 (2 << 19) /* Data Word Length */
31#define DWL_20 (3 << 19) /* Data Word Length */
32#define DWL_22 (4 << 19) /* Data Word Length */
33#define DWL_24 (5 << 19) /* Data Word Length */
34#define DWL_32 (6 << 19) /* Data Word Length */
35
36#define SWL_32 (3 << 16) /* R/W System Word Length */
37#define SCKD (1 << 15) /* Serial Bit Clock Direction */
38#define SWSD (1 << 14) /* Serial WS Direction */
39#define SCKP (1 << 13) /* Serial Bit Clock Polarity */
40#define SWSP (1 << 12) /* Serial WS Polarity */
41#define SDTA (1 << 10) /* Serial Data Alignment */
42#define DEL (1 << 8) /* Serial Data Delay */
43#define CKDV(v) (v << 4) /* Serial Clock Division Ratio */
44#define TRMD (1 << 1) /* Transmit/Receive Mode Select */
45#define EN (1 << 0) /* SSI Module Enable */
46
47/*
48 * SSISR
49 */
50#define UIRQ (1 << 27) /* Underflow Error Interrupt Status */
51#define OIRQ (1 << 26) /* Overflow Error Interrupt Status */
52#define IIRQ (1 << 25) /* Idle Mode Interrupt Status */
53#define DIRQ (1 << 24) /* Data Interrupt Status Flag */
54
849fc82a
KM
55/*
56 * SSIWSR
57 */
58#define CONT (1 << 8) /* WS Continue Function */
59
8aefda50
KM
60#define SSI_NAME "ssi"
61
ae5c3223 62struct rsnd_ssi {
ae5c3223
KM
63 struct rsnd_ssi_platform_info *info; /* rcar_snd.h */
64 struct rsnd_ssi *parent;
65 struct rsnd_mod mod;
940e9479 66 struct rsnd_mod *dma;
ae5c3223 67
ae5c3223
KM
68 u32 cr_own;
69 u32 cr_clk;
e7d850dd 70 u32 cr_mode;
919567d9 71 int chan;
e7d850dd 72 int rate;
ae5c3223
KM
73 int err;
74 unsigned int usrcnt;
ae5c3223
KM
75};
76
ae5c3223
KM
77#define for_each_rsnd_ssi(pos, priv, i) \
78 for (i = 0; \
79 (i < rsnd_ssi_nr(priv)) && \
dd27d808 80 ((pos) = ((struct rsnd_ssi *)(priv)->ssi + i)); \
ae5c3223
KM
81 i++)
82
232c00b6 83#define rsnd_ssi_to_dma(mod) ((ssi)->dma)
dd27d808 84#define rsnd_ssi_nr(priv) ((priv)->ssi_nr)
ae5c3223 85#define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
6cfad789 86#define rsnd_ssi_pio_available(ssi) ((ssi)->info->irq > 0)
ae5c3223 87#define rsnd_ssi_mode_flags(p) ((p)->info->flags)
4b4dab82 88#define rsnd_ssi_dai_id(ssi) ((ssi)->info->dai_id)
e7d850dd 89#define rsnd_ssi_is_parent(ssi, io) ((ssi) == rsnd_io_to_mod_ssip(io))
04e627ba
KM
90#define rsnd_ssi_of_node(priv) \
91 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,ssi")
ae5c3223 92
b415b4d3 93int rsnd_ssi_use_busif(struct rsnd_dai_stream *io)
d9288d0b 94{
b415b4d3 95 struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io);
d9288d0b 96 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
d9288d0b
KM
97 int use_busif = 0;
98
7b466fc6
KM
99 if (!rsnd_ssi_is_dma_mode(mod))
100 return 0;
101
d9288d0b
KM
102 if (!(rsnd_ssi_mode_flags(ssi) & RSND_SSI_NO_BUSIF))
103 use_busif = 1;
104 if (rsnd_io_to_mod_src(io))
105 use_busif = 1;
106
107 return use_busif;
108}
109
e10369d8
KM
110static void rsnd_ssi_status_clear(struct rsnd_mod *mod)
111{
112 rsnd_mod_write(mod, SSISR, 0);
113}
114
115static u32 rsnd_ssi_status_get(struct rsnd_mod *mod)
116{
117 return rsnd_mod_read(mod, SSISR);
118}
119
ae5c3223
KM
120static void rsnd_ssi_status_check(struct rsnd_mod *mod,
121 u32 bit)
122{
123 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
124 struct device *dev = rsnd_priv_to_dev(priv);
125 u32 status;
126 int i;
127
128 for (i = 0; i < 1024; i++) {
e10369d8 129 status = rsnd_ssi_status_get(mod);
ae5c3223
KM
130 if (status & bit)
131 return;
132
133 udelay(50);
134 }
135
136 dev_warn(dev, "status check failed\n");
137}
138
37447b46
KM
139static int rsnd_ssi_irq_enable(struct rsnd_mod *ssi_mod)
140{
141 struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
142
143 if (rsnd_is_gen1(priv))
144 return 0;
145
146 /* enable SSI interrupt if Gen2 */
147 rsnd_mod_write(ssi_mod, SSI_INT_ENABLE,
148 rsnd_ssi_is_dma_mode(ssi_mod) ?
149 0x0e000000 : 0x0f000000);
150
151 return 0;
152}
153
154static int rsnd_ssi_irq_disable(struct rsnd_mod *ssi_mod)
155{
156 struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
157
158 if (rsnd_is_gen1(priv))
159 return 0;
160
161 /* disable SSI interrupt if Gen2 */
162 rsnd_mod_write(ssi_mod, SSI_INT_ENABLE, 0x00000000);
163
164 return 0;
165}
166
ae5c3223 167static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
adcf7d5e 168 struct rsnd_dai_stream *io)
ae5c3223 169{
1b13d118 170 struct rsnd_priv *priv = rsnd_io_to_priv(io);
adcf7d5e 171 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
ae5c3223 172 struct device *dev = rsnd_priv_to_dev(priv);
e7d850dd 173 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
b76e218a 174 struct rsnd_mod *mod = rsnd_mod_get(ssi);
e7d850dd 175 struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
eae6fff4 176 int j, ret;
ae5c3223
KM
177 int ssi_clk_mul_table[] = {
178 1, 2, 4, 8, 16, 6, 12,
179 };
180 unsigned int main_rate;
ba9c949f 181 unsigned int rate = rsnd_src_get_ssi_rate(priv, io, runtime);
ae5c3223 182
e7d850dd
KM
183 if (!rsnd_rdai_is_clk_master(rdai))
184 return 0;
185
186 if (ssi_parent_mod && !rsnd_ssi_is_parent(mod, io))
187 return 0;
188
189 if (ssi->usrcnt > 1) {
190 if (ssi->rate != rate) {
191 dev_err(dev, "SSI parent/child should use same rate\n");
192 return -EINVAL;
193 }
194
195 return 0;
196 }
197
ae5c3223
KM
198 /*
199 * Find best clock, and try to start ADG
200 */
eae6fff4
KM
201 for (j = 0; j < ARRAY_SIZE(ssi_clk_mul_table); j++) {
202
203 /*
204 * this driver is assuming that
205 * system word is 64fs (= 2 x 32bit)
206 * see rsnd_ssi_init()
207 */
208 main_rate = rate * 32 * 2 * ssi_clk_mul_table[j];
209
210 ret = rsnd_adg_ssi_clk_try_start(mod, main_rate);
211 if (0 == ret) {
212 ssi->cr_clk = FORCE | SWL_32 |
213 SCKD | SWSD | CKDV(j);
214
e7d850dd
KM
215 ssi->rate = rate;
216
217 rsnd_mod_write(mod, SSIWSR, CONT);
218
eae6fff4
KM
219 dev_dbg(dev, "%s[%d] outputs %u Hz\n",
220 rsnd_mod_name(mod),
221 rsnd_mod_id(mod), rate);
222
223 return 0;
ae5c3223
KM
224 }
225 }
226
227 dev_err(dev, "unsupported clock rate\n");
228 return -EIO;
229}
230
e7d850dd
KM
231static void rsnd_ssi_master_clk_stop(struct rsnd_ssi *ssi,
232 struct rsnd_dai_stream *io)
ae5c3223 233{
f708d944 234 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
b76e218a 235 struct rsnd_mod *mod = rsnd_mod_get(ssi);
e7d850dd 236 struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
3ba84f45 237
e7d850dd 238 if (!rsnd_rdai_is_clk_master(rdai))
ae5c3223 239 return;
ae5c3223 240
e7d850dd
KM
241 if (ssi_parent_mod && !rsnd_ssi_is_parent(mod, io))
242 return;
ae5c3223 243
e7d850dd
KM
244 if (ssi->usrcnt > 1)
245 return;
919567d9 246
e7d850dd
KM
247 ssi->cr_clk = 0;
248 ssi->rate = 0;
ae5c3223 249
e7d850dd 250 rsnd_adg_ssi_clk_stop(mod);
ae5c3223
KM
251}
252
253/*
254 * SSI mod common functions
255 */
256static int rsnd_ssi_init(struct rsnd_mod *mod,
2c0fac19 257 struct rsnd_dai_stream *io,
690602fc 258 struct rsnd_priv *priv)
ae5c3223
KM
259{
260 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
690602fc 261 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
ae5c3223
KM
262 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
263 u32 cr;
e7d850dd
KM
264 int ret;
265
266 ssi->usrcnt++;
267
268 rsnd_mod_power_on(mod);
269
270 ret = rsnd_ssi_master_clk_start(ssi, io);
271 if (ret < 0)
272 return ret;
273
274 if (rsnd_ssi_is_parent(mod, io))
275 return 0;
ae5c3223
KM
276
277 cr = FORCE;
278
279 /*
280 * always use 32bit system word for easy clock calculation.
281 * see also rsnd_ssi_master_clk_enable()
282 */
283 cr |= SWL_32;
284
285 /*
286 * init clock settings for SSICR
287 */
288 switch (runtime->sample_bits) {
289 case 16:
290 cr |= DWL_16;
291 break;
292 case 32:
293 cr |= DWL_24;
294 break;
295 default:
296 return -EIO;
297 }
298
299 if (rdai->bit_clk_inv)
300 cr |= SCKP;
301 if (rdai->frm_clk_inv)
302 cr |= SWSP;
303 if (rdai->data_alignment)
304 cr |= SDTA;
305 if (rdai->sys_delay)
306 cr |= DEL;
985a4f6e 307 if (rsnd_io_is_play(io))
ae5c3223
KM
308 cr |= TRMD;
309
ae5c3223 310 ssi->cr_own = cr;
e7d850dd
KM
311
312 if (rsnd_ssi_is_dma_mode(mod)) {
313 cr = UIEN | OIEN | /* over/under run */
314 DMEN; /* DMA : enable DMA */
315 } else {
316 cr = DIEN; /* PIO : enable Data interrupt */
317 }
318
319 ssi->cr_mode = cr;
320
ae5c3223
KM
321 ssi->err = -1; /* ignore 1st error */
322
e7d850dd
KM
323 /* clear error status */
324 rsnd_ssi_status_clear(mod);
325
326 rsnd_ssi_irq_enable(mod);
327
ae5c3223
KM
328 return 0;
329}
330
331static int rsnd_ssi_quit(struct rsnd_mod *mod,
2c0fac19 332 struct rsnd_dai_stream *io,
690602fc 333 struct rsnd_priv *priv)
ae5c3223
KM
334{
335 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
ae5c3223
KM
336 struct device *dev = rsnd_priv_to_dev(priv);
337
e7d850dd
KM
338 if (rsnd_ssi_is_parent(mod, io))
339 goto rsnd_ssi_quit_end;
340
ae5c3223 341 if (ssi->err > 0)
337b0b4c
KM
342 dev_warn(dev, "%s[%d] under/over flow err = %d\n",
343 rsnd_mod_name(mod), rsnd_mod_id(mod), ssi->err);
ae5c3223 344
ae5c3223
KM
345 ssi->cr_own = 0;
346 ssi->err = 0;
347
e7d850dd
KM
348 rsnd_ssi_irq_disable(mod);
349
350rsnd_ssi_quit_end:
351 rsnd_ssi_master_clk_stop(ssi, io);
352
353 rsnd_mod_power_off(mod);
354
355 ssi->usrcnt--;
356
357 if (ssi->usrcnt < 0)
358 dev_err(dev, "%s[%d] usrcnt error\n",
359 rsnd_mod_name(mod), rsnd_mod_id(mod));
360
ae5c3223
KM
361 return 0;
362}
363
919567d9 364static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
2c0fac19 365 struct rsnd_dai_stream *io,
919567d9
KM
366 struct snd_pcm_substream *substream,
367 struct snd_pcm_hw_params *params)
368{
369 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
919567d9
KM
370 int chan = params_channels(params);
371
372 /*
373 * Already working.
374 * It will happen if SSI has parent/child connection.
375 */
e7d850dd 376 if (ssi->usrcnt > 1) {
919567d9
KM
377 /*
378 * it is error if child <-> parent SSI uses
379 * different channels.
380 */
381 if (ssi->chan != chan)
382 return -EIO;
383 }
384
919567d9 385 ssi->chan = chan;
919567d9
KM
386
387 return 0;
388}
389
e10369d8 390static u32 rsnd_ssi_record_error(struct rsnd_ssi *ssi)
ae5c3223 391{
b76e218a 392 struct rsnd_mod *mod = rsnd_mod_get(ssi);
e10369d8 393 u32 status = rsnd_ssi_status_get(mod);
b76e218a 394
ae5c3223
KM
395 /* under/over flow error */
396 if (status & (UIRQ | OIRQ)) {
397 ssi->err++;
398
399 /* clear error status */
e10369d8 400 rsnd_ssi_status_clear(mod);
ae5c3223 401 }
e10369d8
KM
402
403 return status;
ae5c3223
KM
404}
405
e7d850dd
KM
406static int __rsnd_ssi_start(struct rsnd_mod *mod,
407 struct rsnd_dai_stream *io,
408 struct rsnd_priv *priv)
409{
410 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
411 u32 cr;
412
413 cr = ssi->cr_own |
414 ssi->cr_clk |
415 ssi->cr_mode |
416 EN;
417
418 rsnd_mod_write(mod, SSICR, cr);
419
420 return 0;
421}
422
4e7d606c 423static int rsnd_ssi_start(struct rsnd_mod *mod,
2c0fac19 424 struct rsnd_dai_stream *io,
690602fc 425 struct rsnd_priv *priv)
e7d850dd
KM
426{
427 /*
428 * no limit to start
429 * see also
430 * rsnd_ssi_stop
431 * rsnd_ssi_interrupt
432 */
433 return __rsnd_ssi_start(mod, io, priv);
434}
435
436static int __rsnd_ssi_stop(struct rsnd_mod *mod,
437 struct rsnd_dai_stream *io,
438 struct rsnd_priv *priv)
4e7d606c
KM
439{
440 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
e7d850dd
KM
441 u32 cr;
442
443 /*
444 * disable all IRQ,
445 * and, wait all data was sent
446 */
447 cr = ssi->cr_own |
448 ssi->cr_clk;
4e7d606c 449
e7d850dd
KM
450 rsnd_mod_write(mod, SSICR, cr | EN);
451 rsnd_ssi_status_check(mod, DIRQ);
4e7d606c 452
e7d850dd
KM
453 /*
454 * disable SSI,
455 * and, wait idle state
456 */
457 rsnd_mod_write(mod, SSICR, cr); /* disabled all */
458 rsnd_ssi_status_check(mod, IIRQ);
4e7d606c
KM
459
460 return 0;
461}
462
463static int rsnd_ssi_stop(struct rsnd_mod *mod,
2c0fac19 464 struct rsnd_dai_stream *io,
690602fc 465 struct rsnd_priv *priv)
4e7d606c
KM
466{
467 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
468
e7d850dd
KM
469 /*
470 * don't stop if not last user
471 * see also
472 * rsnd_ssi_start
473 * rsnd_ssi_interrupt
474 */
475 if (ssi->usrcnt > 1)
476 return 0;
4e7d606c 477
e7d850dd 478 return __rsnd_ssi_stop(mod, io, priv);
4e7d606c
KM
479}
480
bfc0cfe6
KM
481static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
482 struct rsnd_dai_stream *io)
ae5c3223 483{
bfc0cfe6 484 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
690602fc 485 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
69e32a58 486 struct device *dev = rsnd_priv_to_dev(priv);
765ae7c8 487 int is_dma = rsnd_ssi_is_dma_mode(mod);
02299d98 488 u32 status;
75defee0 489 bool elapsed = false;
02299d98
KM
490
491 spin_lock(&priv->lock);
ae5c3223 492
02299d98 493 /* ignore all cases if not working */
d5bbe7de 494 if (!rsnd_io_is_working(io))
02299d98
KM
495 goto rsnd_ssi_interrupt_out;
496
e10369d8 497 status = rsnd_ssi_record_error(ssi);
4e7d606c
KM
498
499 /* PIO only */
765ae7c8 500 if (!is_dma && (status & DIRQ)) {
ae5c3223
KM
501 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
502 u32 *buf = (u32 *)(runtime->dma_area +
503 rsnd_dai_pointer_offset(io, 0));
504
ae5c3223
KM
505 /*
506 * 8/16/32 data can be assesse to TDR/RDR register
507 * directly as 32bit data
508 * see rsnd_ssi_init()
509 */
985a4f6e 510 if (rsnd_io_is_play(io))
4686a0ad 511 rsnd_mod_write(mod, SSITDR, *buf);
ae5c3223 512 else
4686a0ad 513 *buf = rsnd_mod_read(mod, SSIRDR);
ae5c3223 514
75defee0 515 elapsed = rsnd_dai_pointer_update(io, sizeof(*buf));
4e7d606c 516 }
ae5c3223 517
12927a8f
KM
518 /* DMA only */
519 if (is_dma && (status & (UIRQ | OIRQ))) {
4e7d606c
KM
520 /*
521 * restart SSI
522 */
4e7d606c
KM
523 dev_dbg(dev, "%s[%d] restart\n",
524 rsnd_mod_name(mod), rsnd_mod_id(mod));
044930b4 525
e7d850dd
KM
526 __rsnd_ssi_stop(mod, io, priv);
527 __rsnd_ssi_start(mod, io, priv);
ae5c3223
KM
528 }
529
69e32a58
KM
530 if (ssi->err > 1024) {
531 rsnd_ssi_irq_disable(mod);
532
533 dev_warn(dev, "no more %s[%d] restart\n",
534 rsnd_mod_name(mod), rsnd_mod_id(mod));
535 }
536
02299d98
KM
537rsnd_ssi_interrupt_out:
538 spin_unlock(&priv->lock);
539
75defee0
KM
540 if (elapsed)
541 rsnd_dai_period_elapsed(io);
bfc0cfe6
KM
542}
543
544static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
545{
546 struct rsnd_mod *mod = data;
547
548 rsnd_mod_interrupt(mod, __rsnd_ssi_interrupt);
75defee0 549
4e7d606c 550 return IRQ_HANDLED;
ae5c3223
KM
551}
552
6cfad789
KM
553/*
554 * SSI PIO
555 */
e7d850dd
KM
556static void rsnd_ssi_parent_attach(struct rsnd_mod *mod,
557 struct rsnd_dai_stream *io,
558 struct rsnd_priv *priv)
559{
560 if (!__rsnd_ssi_is_pin_sharing(mod))
561 return;
562
563 switch (rsnd_mod_id(mod)) {
564 case 1:
565 case 2:
566 rsnd_dai_connect(rsnd_ssi_mod_get(priv, 0), io, RSND_MOD_SSIP);
567 break;
568 case 4:
569 rsnd_dai_connect(rsnd_ssi_mod_get(priv, 3), io, RSND_MOD_SSIP);
570 break;
571 case 8:
572 rsnd_dai_connect(rsnd_ssi_mod_get(priv, 7), io, RSND_MOD_SSIP);
573 break;
574 }
575}
576
c7f69ab5
KM
577static int rsnd_ssi_common_probe(struct rsnd_mod *mod,
578 struct rsnd_dai_stream *io,
579 struct rsnd_priv *priv)
ff8f30e6 580{
ff8f30e6
KM
581 struct device *dev = rsnd_priv_to_dev(priv);
582 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
ff8f30e6
KM
583 int ret;
584
e7d850dd
KM
585 rsnd_ssi_parent_attach(mod, io, priv);
586
c7f69ab5
KM
587 ret = rsnd_ssiu_attach(io, mod);
588 if (ret < 0)
589 return ret;
590
6cfad789
KM
591 ret = devm_request_irq(dev, ssi->info->irq,
592 rsnd_ssi_interrupt,
ff8f30e6 593 IRQF_SHARED,
bfc0cfe6 594 dev_name(dev), mod);
8aefda50 595
ff8f30e6
KM
596 return ret;
597}
598
ae5c3223 599static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
8aefda50 600 .name = SSI_NAME,
c7f69ab5 601 .probe = rsnd_ssi_common_probe,
ae5c3223
KM
602 .init = rsnd_ssi_init,
603 .quit = rsnd_ssi_quit,
49229850
KM
604 .start = rsnd_ssi_start,
605 .stop = rsnd_ssi_stop,
919567d9 606 .hw_params = rsnd_ssi_hw_params,
ae5c3223
KM
607};
608
ff8f30e6 609static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
2c0fac19 610 struct rsnd_dai_stream *io,
690602fc 611 struct rsnd_priv *priv)
ff8f30e6 612{
ff8f30e6 613 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
ff8f30e6 614 int dma_id = ssi->info->dma_id;
ff8f30e6
KM
615 int ret;
616
c7f69ab5 617 ret = rsnd_ssi_common_probe(mod, io, priv);
4e7d606c 618 if (ret)
b543b52a 619 return ret;
4e7d606c 620
81ecbb65 621 ssi->dma = rsnd_dma_attach(io, mod, dma_id);
232c00b6
KM
622 if (IS_ERR(ssi->dma))
623 return PTR_ERR(ssi->dma);
8aefda50 624
ff8f30e6
KM
625 return ret;
626}
627
628static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
2c0fac19 629 struct rsnd_dai_stream *io,
690602fc 630 struct rsnd_priv *priv)
97463e19 631{
4e7d606c
KM
632 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
633 struct device *dev = rsnd_priv_to_dev(priv);
6cfad789 634 int irq = ssi->info->irq;
4e7d606c 635
4e7d606c 636 /* PIO will request IRQ again */
b05ce4c0 637 devm_free_irq(dev, irq, mod);
4e7d606c 638
97463e19
KM
639 return 0;
640}
641
642static int rsnd_ssi_fallback(struct rsnd_mod *mod,
2c0fac19 643 struct rsnd_dai_stream *io,
690602fc 644 struct rsnd_priv *priv)
ff8f30e6 645{
d3a76823
KM
646 struct device *dev = rsnd_priv_to_dev(priv);
647
d3a76823
KM
648 /*
649 * fallback to PIO
650 *
651 * SSI .probe might be called again.
652 * see
653 * rsnd_rdai_continuance_probe()
654 */
655 mod->ops = &rsnd_ssi_pio_ops;
656
657 dev_info(dev, "%s[%d] fallback to PIO mode\n",
658 rsnd_mod_name(mod), rsnd_mod_id(mod));
659
ff8f30e6
KM
660 return 0;
661}
662
9b99e9a7
KM
663static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_dai_stream *io,
664 struct rsnd_mod *mod)
d9288d0b 665{
72adc61f 666 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
72adc61f
KM
667 int is_play = rsnd_io_is_play(io);
668 char *name;
669
b415b4d3 670 if (rsnd_ssi_use_busif(io))
72adc61f
KM
671 name = is_play ? "rxu" : "txu";
672 else
673 name = is_play ? "rx" : "tx";
674
675 return rsnd_dma_request_channel(rsnd_ssi_of_node(priv),
676 mod, name);
d9288d0b
KM
677}
678
849fc82a 679static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
8aefda50 680 .name = SSI_NAME,
72adc61f 681 .dma_req = rsnd_ssi_dma_req,
ff8f30e6
KM
682 .probe = rsnd_ssi_dma_probe,
683 .remove = rsnd_ssi_dma_remove,
849fc82a
KM
684 .init = rsnd_ssi_init,
685 .quit = rsnd_ssi_quit,
497debaa
KM
686 .start = rsnd_ssi_start,
687 .stop = rsnd_ssi_stop,
97463e19 688 .fallback = rsnd_ssi_fallback,
919567d9 689 .hw_params = rsnd_ssi_hw_params,
849fc82a
KM
690};
691
05795411
KM
692int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod)
693{
694 return mod->ops == &rsnd_ssi_dma_ops;
695}
696
697
ae5c3223
KM
698/*
699 * Non SSI
700 */
ae5c3223 701static struct rsnd_mod_ops rsnd_ssi_non_ops = {
8aefda50 702 .name = SSI_NAME,
ae5c3223
KM
703};
704
705/*
706 * ssi mod function
707 */
708struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id)
709{
8b14719b
TI
710 if (WARN_ON(id < 0 || id >= rsnd_ssi_nr(priv)))
711 id = 0;
ae5c3223 712
b76e218a 713 return rsnd_mod_get((struct rsnd_ssi *)(priv->ssi) + id);
ae5c3223
KM
714}
715
b415b4d3 716int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
7b5ce975
KM
717{
718 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
719
720 return !!(rsnd_ssi_mode_flags(ssi) & RSND_SSI_CLK_PIN_SHARE);
721}
722
90e8e50f
KM
723static void rsnd_of_parse_ssi(struct platform_device *pdev,
724 const struct rsnd_of_data *of_data,
725 struct rsnd_priv *priv)
726{
727 struct device_node *node;
728 struct device_node *np;
729 struct rsnd_ssi_platform_info *ssi_info;
730 struct rcar_snd_info *info = rsnd_priv_to_info(priv);
731 struct device *dev = &pdev->dev;
732 int nr, i;
733
04e627ba 734 node = rsnd_ssi_of_node(priv);
90e8e50f
KM
735 if (!node)
736 return;
737
738 nr = of_get_child_count(node);
739 if (!nr)
f451e48d 740 goto rsnd_of_parse_ssi_end;
90e8e50f
KM
741
742 ssi_info = devm_kzalloc(dev,
743 sizeof(struct rsnd_ssi_platform_info) * nr,
744 GFP_KERNEL);
745 if (!ssi_info) {
746 dev_err(dev, "ssi info allocation error\n");
f451e48d 747 goto rsnd_of_parse_ssi_end;
90e8e50f
KM
748 }
749
750 info->ssi_info = ssi_info;
751 info->ssi_info_nr = nr;
752
753 i = -1;
754 for_each_child_of_node(node, np) {
755 i++;
756
757 ssi_info = info->ssi_info + i;
758
759 /*
760 * pin settings
761 */
762 if (of_get_property(np, "shared-pin", NULL))
763 ssi_info->flags |= RSND_SSI_CLK_PIN_SHARE;
764
765 /*
766 * irq
767 */
6cfad789 768 ssi_info->irq = irq_of_parse_and_map(np, 0);
199e7688
KM
769
770 /*
771 * DMA
772 */
773 ssi_info->dma_id = of_get_property(np, "pio-transfer", NULL) ?
774 0 : 1;
d9288d0b
KM
775
776 if (of_get_property(np, "no-busif", NULL))
777 ssi_info->flags |= RSND_SSI_NO_BUSIF;
90e8e50f 778 }
f451e48d
KM
779
780rsnd_of_parse_ssi_end:
781 of_node_put(node);
90e8e50f
KM
782}
783
ae5c3223 784int rsnd_ssi_probe(struct platform_device *pdev,
90e8e50f 785 const struct rsnd_of_data *of_data,
ae5c3223
KM
786 struct rsnd_priv *priv)
787{
5da39cf3 788 struct rcar_snd_info *info = rsnd_priv_to_info(priv);
ae5c3223
KM
789 struct rsnd_ssi_platform_info *pinfo;
790 struct device *dev = rsnd_priv_to_dev(priv);
791 struct rsnd_mod_ops *ops;
792 struct clk *clk;
ae5c3223
KM
793 struct rsnd_ssi *ssi;
794 char name[RSND_SSI_NAME_SIZE];
2f78dd7f 795 int i, nr, ret;
ae5c3223 796
90e8e50f
KM
797 rsnd_of_parse_ssi(pdev, of_data, priv);
798
ae5c3223
KM
799 /*
800 * init SSI
801 */
802 nr = info->ssi_info_nr;
dd27d808 803 ssi = devm_kzalloc(dev, sizeof(*ssi) * nr, GFP_KERNEL);
afa70072 804 if (!ssi)
ae5c3223 805 return -ENOMEM;
ae5c3223 806
dd27d808
KM
807 priv->ssi = ssi;
808 priv->ssi_nr = nr;
ae5c3223
KM
809
810 for_each_rsnd_ssi(ssi, priv, i) {
811 pinfo = &info->ssi_info[i];
812
8aefda50
KM
813 snprintf(name, RSND_SSI_NAME_SIZE, "%s.%d",
814 SSI_NAME, i);
ae5c3223 815
60dbb4f1 816 clk = devm_clk_get(dev, name);
ae5c3223
KM
817 if (IS_ERR(clk))
818 return PTR_ERR(clk);
819
820 ssi->info = pinfo;
ae5c3223
KM
821
822 ops = &rsnd_ssi_non_ops;
ff8f30e6
KM
823 if (pinfo->dma_id > 0)
824 ops = &rsnd_ssi_dma_ops;
825 else if (rsnd_ssi_pio_available(ssi))
826 ops = &rsnd_ssi_pio_ops;
ae5c3223 827
b76e218a
KM
828 ret = rsnd_mod_init(priv, rsnd_mod_get(ssi), ops, clk,
829 RSND_MOD_SSI, i);
2f78dd7f
KM
830 if (ret)
831 return ret;
ae5c3223
KM
832 }
833
ae5c3223
KM
834 return 0;
835}
2f78dd7f
KM
836
837void rsnd_ssi_remove(struct platform_device *pdev,
838 struct rsnd_priv *priv)
839{
840 struct rsnd_ssi *ssi;
841 int i;
842
843 for_each_rsnd_ssi(ssi, priv, i) {
b76e218a 844 rsnd_mod_quit(rsnd_mod_get(ssi));
2f78dd7f
KM
845 }
846}