blob: bae309c9f0fbd068cf1bfee66a5bff77ddd4274e [file] [log] [blame]
Kuninori Morimotoae5c3222013-07-21 21:36:57 -07001/*
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 */
Kuninori Morimoto849fc822013-07-28 18:59:02 -070022#define DMEN (1 << 28) /* DMA Enable */
Kuninori Morimotoae5c3222013-07-21 21:36:57 -070023#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
Kuninori Morimoto849fc822013-07-28 18:59:02 -070055/*
56 * SSIWSR
57 */
58#define CONT (1 << 8) /* WS Continue Function */
59
Kuninori Morimotoae5c3222013-07-21 21:36:57 -070060struct rsnd_ssi {
61 struct clk *clk;
62 struct rsnd_ssi_platform_info *info; /* rcar_snd.h */
63 struct rsnd_ssi *parent;
64 struct rsnd_mod mod;
65
66 struct rsnd_dai *rdai;
67 struct rsnd_dai_stream *io;
68 u32 cr_own;
69 u32 cr_clk;
70 u32 cr_etc;
71 int err;
Kuninori Morimoto849fc822013-07-28 18:59:02 -070072 int dma_offset;
Kuninori Morimotoae5c3222013-07-21 21:36:57 -070073 unsigned int usrcnt;
74 unsigned int rate;
75};
76
Kuninori Morimotoae5c3222013-07-21 21:36:57 -070077#define for_each_rsnd_ssi(pos, priv, i) \
78 for (i = 0; \
79 (i < rsnd_ssi_nr(priv)) && \
Kuninori Morimotodd27d802014-01-23 18:39:40 -080080 ((pos) = ((struct rsnd_ssi *)(priv)->ssi + i)); \
Kuninori Morimotoae5c3222013-07-21 21:36:57 -070081 i++)
82
Kuninori Morimotodd27d802014-01-23 18:39:40 -080083#define rsnd_ssi_nr(priv) ((priv)->ssi_nr)
Kuninori Morimotoae5c3222013-07-21 21:36:57 -070084#define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
Kuninori Morimoto849fc822013-07-28 18:59:02 -070085#define rsnd_dma_to_ssi(dma) rsnd_mod_to_ssi(rsnd_dma_to_mod(dma))
86#define rsnd_ssi_pio_available(ssi) ((ssi)->info->pio_irq > 0)
87#define rsnd_ssi_dma_available(ssi) \
88 rsnd_dma_available(rsnd_mod_to_dma(&(ssi)->mod))
Kuninori Morimotoae5c3222013-07-21 21:36:57 -070089#define rsnd_ssi_clk_from_parent(ssi) ((ssi)->parent)
Kuninori Morimotoae5c3222013-07-21 21:36:57 -070090#define rsnd_ssi_mode_flags(p) ((p)->info->flags)
Kuninori Morimoto4b4dab82013-07-28 18:58:29 -070091#define rsnd_ssi_dai_id(ssi) ((ssi)->info->dai_id)
Kuninori Morimotoae5c3222013-07-21 21:36:57 -070092
Kuninori Morimotoae5c3222013-07-21 21:36:57 -070093static void rsnd_ssi_status_check(struct rsnd_mod *mod,
94 u32 bit)
95{
96 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
97 struct device *dev = rsnd_priv_to_dev(priv);
98 u32 status;
99 int i;
100
101 for (i = 0; i < 1024; i++) {
102 status = rsnd_mod_read(mod, SSISR);
103 if (status & bit)
104 return;
105
106 udelay(50);
107 }
108
109 dev_warn(dev, "status check failed\n");
110}
111
112static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
Kuninori Morimotoadcf7d52013-12-19 19:28:39 -0800113 struct rsnd_dai_stream *io)
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700114{
115 struct rsnd_priv *priv = rsnd_mod_to_priv(&ssi->mod);
Kuninori Morimotoadcf7d52013-12-19 19:28:39 -0800116 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700117 struct device *dev = rsnd_priv_to_dev(priv);
118 int i, j, ret;
119 int adg_clk_div_table[] = {
120 1, 6, /* see adg.c */
121 };
122 int ssi_clk_mul_table[] = {
123 1, 2, 4, 8, 16, 6, 12,
124 };
125 unsigned int main_rate;
Kuninori Morimotoef749402013-12-19 19:28:51 -0800126 unsigned int rate = rsnd_scu_get_ssi_rate(priv, &ssi->mod, runtime);
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700127
128 /*
129 * Find best clock, and try to start ADG
130 */
131 for (i = 0; i < ARRAY_SIZE(adg_clk_div_table); i++) {
132 for (j = 0; j < ARRAY_SIZE(ssi_clk_mul_table); j++) {
133
134 /*
135 * this driver is assuming that
136 * system word is 64fs (= 2 x 32bit)
Kuninori Morimoto729aca52013-12-19 19:26:44 -0800137 * see rsnd_ssi_init()
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700138 */
139 main_rate = rate / adg_clk_div_table[i]
140 * 32 * 2 * ssi_clk_mul_table[j];
141
142 ret = rsnd_adg_ssi_clk_try_start(&ssi->mod, main_rate);
143 if (0 == ret) {
144 ssi->rate = rate;
145 ssi->cr_clk = FORCE | SWL_32 |
146 SCKD | SWSD | CKDV(j);
147
148 dev_dbg(dev, "ssi%d outputs %u Hz\n",
149 rsnd_mod_id(&ssi->mod), rate);
150
151 return 0;
152 }
153 }
154 }
155
156 dev_err(dev, "unsupported clock rate\n");
157 return -EIO;
158}
159
160static void rsnd_ssi_master_clk_stop(struct rsnd_ssi *ssi)
161{
162 ssi->rate = 0;
163 ssi->cr_clk = 0;
164 rsnd_adg_ssi_clk_stop(&ssi->mod);
165}
166
167static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
168 struct rsnd_dai *rdai,
169 struct rsnd_dai_stream *io)
170{
171 struct rsnd_priv *priv = rsnd_mod_to_priv(&ssi->mod);
172 struct device *dev = rsnd_priv_to_dev(priv);
173 u32 cr;
174
175 if (0 == ssi->usrcnt) {
176 clk_enable(ssi->clk);
177
Kuninori Morimotoe779a202014-01-23 18:39:12 -0800178 if (rsnd_dai_is_clk_master(rdai)) {
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700179 if (rsnd_ssi_clk_from_parent(ssi))
180 rsnd_ssi_hw_start(ssi->parent, rdai, io);
181 else
Kuninori Morimotoadcf7d52013-12-19 19:28:39 -0800182 rsnd_ssi_master_clk_start(ssi, io);
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700183 }
184 }
185
186 cr = ssi->cr_own |
187 ssi->cr_clk |
188 ssi->cr_etc |
189 EN;
190
191 rsnd_mod_write(&ssi->mod, SSICR, cr);
192
193 ssi->usrcnt++;
194
195 dev_dbg(dev, "ssi%d hw started\n", rsnd_mod_id(&ssi->mod));
196}
197
198static void rsnd_ssi_hw_stop(struct rsnd_ssi *ssi,
199 struct rsnd_dai *rdai)
200{
201 struct rsnd_priv *priv = rsnd_mod_to_priv(&ssi->mod);
202 struct device *dev = rsnd_priv_to_dev(priv);
203 u32 cr;
204
205 if (0 == ssi->usrcnt) /* stop might be called without start */
206 return;
207
208 ssi->usrcnt--;
209
210 if (0 == ssi->usrcnt) {
211 /*
212 * disable all IRQ,
213 * and, wait all data was sent
214 */
215 cr = ssi->cr_own |
216 ssi->cr_clk;
217
218 rsnd_mod_write(&ssi->mod, SSICR, cr | EN);
219 rsnd_ssi_status_check(&ssi->mod, DIRQ);
220
221 /*
222 * disable SSI,
223 * and, wait idle state
224 */
225 rsnd_mod_write(&ssi->mod, SSICR, cr); /* disabled all */
226 rsnd_ssi_status_check(&ssi->mod, IIRQ);
227
Kuninori Morimotoe779a202014-01-23 18:39:12 -0800228 if (rsnd_dai_is_clk_master(rdai)) {
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700229 if (rsnd_ssi_clk_from_parent(ssi))
230 rsnd_ssi_hw_stop(ssi->parent, rdai);
231 else
232 rsnd_ssi_master_clk_stop(ssi);
233 }
234
235 clk_disable(ssi->clk);
236 }
237
238 dev_dbg(dev, "ssi%d hw stopped\n", rsnd_mod_id(&ssi->mod));
239}
240
241/*
242 * SSI mod common functions
243 */
244static int rsnd_ssi_init(struct rsnd_mod *mod,
245 struct rsnd_dai *rdai,
246 struct rsnd_dai_stream *io)
247{
248 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700249 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
250 u32 cr;
251
252 cr = FORCE;
253
254 /*
255 * always use 32bit system word for easy clock calculation.
256 * see also rsnd_ssi_master_clk_enable()
257 */
258 cr |= SWL_32;
259
260 /*
261 * init clock settings for SSICR
262 */
263 switch (runtime->sample_bits) {
264 case 16:
265 cr |= DWL_16;
266 break;
267 case 32:
268 cr |= DWL_24;
269 break;
270 default:
271 return -EIO;
272 }
273
274 if (rdai->bit_clk_inv)
275 cr |= SCKP;
276 if (rdai->frm_clk_inv)
277 cr |= SWSP;
278 if (rdai->data_alignment)
279 cr |= SDTA;
280 if (rdai->sys_delay)
281 cr |= DEL;
282 if (rsnd_dai_is_play(rdai, io))
283 cr |= TRMD;
284
285 /*
286 * set ssi parameter
287 */
288 ssi->rdai = rdai;
289 ssi->io = io;
290 ssi->cr_own = cr;
291 ssi->err = -1; /* ignore 1st error */
292
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700293 return 0;
294}
295
296static int rsnd_ssi_quit(struct rsnd_mod *mod,
297 struct rsnd_dai *rdai,
298 struct rsnd_dai_stream *io)
299{
300 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
301 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
302 struct device *dev = rsnd_priv_to_dev(priv);
303
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700304 if (ssi->err > 0)
305 dev_warn(dev, "ssi under/over flow err = %d\n", ssi->err);
306
307 ssi->rdai = NULL;
308 ssi->io = NULL;
309 ssi->cr_own = 0;
310 ssi->err = 0;
311
312 return 0;
313}
314
315static void rsnd_ssi_record_error(struct rsnd_ssi *ssi, u32 status)
316{
317 /* under/over flow error */
318 if (status & (UIRQ | OIRQ)) {
319 ssi->err++;
320
321 /* clear error status */
322 rsnd_mod_write(&ssi->mod, SSISR, 0);
323 }
324}
325
326/*
327 * SSI PIO
328 */
329static irqreturn_t rsnd_ssi_pio_interrupt(int irq, void *data)
330{
331 struct rsnd_ssi *ssi = data;
332 struct rsnd_dai_stream *io = ssi->io;
333 u32 status = rsnd_mod_read(&ssi->mod, SSISR);
334 irqreturn_t ret = IRQ_NONE;
335
336 if (io && (status & DIRQ)) {
337 struct rsnd_dai *rdai = ssi->rdai;
338 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
339 u32 *buf = (u32 *)(runtime->dma_area +
340 rsnd_dai_pointer_offset(io, 0));
341
342 rsnd_ssi_record_error(ssi, status);
343
344 /*
345 * 8/16/32 data can be assesse to TDR/RDR register
346 * directly as 32bit data
347 * see rsnd_ssi_init()
348 */
349 if (rsnd_dai_is_play(rdai, io))
350 rsnd_mod_write(&ssi->mod, SSITDR, *buf);
351 else
352 *buf = rsnd_mod_read(&ssi->mod, SSIRDR);
353
354 rsnd_dai_pointer_update(io, sizeof(*buf));
355
356 ret = IRQ_HANDLED;
357 }
358
359 return ret;
360}
361
362static int rsnd_ssi_pio_start(struct rsnd_mod *mod,
363 struct rsnd_dai *rdai,
364 struct rsnd_dai_stream *io)
365{
366 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
367 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700368
369 /* enable PIO IRQ */
370 ssi->cr_etc = UIEN | OIEN | DIEN;
371
Kuninori Morimoto52ea2a72013-12-19 19:28:19 -0800372 /* enable PIO interrupt if gen2 */
373 if (rsnd_is_gen2(priv))
374 rsnd_mod_write(&ssi->mod, INT_ENABLE, 0x0f000000);
Kuninori Morimoto507d4662013-11-28 18:43:45 -0800375
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700376 rsnd_ssi_hw_start(ssi, rdai, io);
377
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700378 return 0;
379}
380
381static int rsnd_ssi_pio_stop(struct rsnd_mod *mod,
382 struct rsnd_dai *rdai,
383 struct rsnd_dai_stream *io)
384{
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700385 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
386
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700387 ssi->cr_etc = 0;
388
389 rsnd_ssi_hw_stop(ssi, rdai);
390
391 return 0;
392}
393
394static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
395 .name = "ssi (pio)",
396 .init = rsnd_ssi_init,
397 .quit = rsnd_ssi_quit,
398 .start = rsnd_ssi_pio_start,
399 .stop = rsnd_ssi_pio_stop,
400};
401
Kuninori Morimoto849fc822013-07-28 18:59:02 -0700402static int rsnd_ssi_dma_inquiry(struct rsnd_dma *dma, dma_addr_t *buf, int *len)
403{
404 struct rsnd_ssi *ssi = rsnd_dma_to_ssi(dma);
405 struct rsnd_dai_stream *io = ssi->io;
406 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
407
408 *len = io->byte_per_period;
409 *buf = runtime->dma_addr +
410 rsnd_dai_pointer_offset(io, ssi->dma_offset + *len);
411 ssi->dma_offset = *len; /* it cares A/B plane */
412
413 return 0;
414}
415
416static int rsnd_ssi_dma_complete(struct rsnd_dma *dma)
417{
418 struct rsnd_ssi *ssi = rsnd_dma_to_ssi(dma);
419 struct rsnd_dai_stream *io = ssi->io;
420 u32 status = rsnd_mod_read(&ssi->mod, SSISR);
421
422 rsnd_ssi_record_error(ssi, status);
423
424 rsnd_dai_pointer_update(ssi->io, io->byte_per_period);
425
426 return 0;
427}
428
429static int rsnd_ssi_dma_start(struct rsnd_mod *mod,
430 struct rsnd_dai *rdai,
431 struct rsnd_dai_stream *io)
432{
433 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
434 struct rsnd_dma *dma = rsnd_mod_to_dma(&ssi->mod);
435
436 /* enable DMA transfer */
437 ssi->cr_etc = DMEN;
438 ssi->dma_offset = 0;
439
440 rsnd_dma_start(dma);
441
442 rsnd_ssi_hw_start(ssi, ssi->rdai, io);
443
444 /* enable WS continue */
Kuninori Morimotoe779a202014-01-23 18:39:12 -0800445 if (rsnd_dai_is_clk_master(rdai))
Kuninori Morimoto849fc822013-07-28 18:59:02 -0700446 rsnd_mod_write(&ssi->mod, SSIWSR, CONT);
447
448 return 0;
449}
450
451static int rsnd_ssi_dma_stop(struct rsnd_mod *mod,
452 struct rsnd_dai *rdai,
453 struct rsnd_dai_stream *io)
454{
455 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
456 struct rsnd_dma *dma = rsnd_mod_to_dma(&ssi->mod);
457
458 ssi->cr_etc = 0;
459
460 rsnd_ssi_hw_stop(ssi, rdai);
461
462 rsnd_dma_stop(dma);
463
464 return 0;
465}
466
467static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
468 .name = "ssi (dma)",
469 .init = rsnd_ssi_init,
470 .quit = rsnd_ssi_quit,
471 .start = rsnd_ssi_dma_start,
472 .stop = rsnd_ssi_dma_stop,
473};
474
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700475/*
476 * Non SSI
477 */
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700478static struct rsnd_mod_ops rsnd_ssi_non_ops = {
479 .name = "ssi (non)",
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700480};
481
482/*
483 * ssi mod function
484 */
Kuninori Morimoto4b4dab82013-07-28 18:58:29 -0700485struct rsnd_mod *rsnd_ssi_mod_get_frm_dai(struct rsnd_priv *priv,
486 int dai_id, int is_play)
487{
488 struct rsnd_ssi *ssi;
489 int i, has_play;
490
491 is_play = !!is_play;
492
493 for_each_rsnd_ssi(ssi, priv, i) {
494 if (rsnd_ssi_dai_id(ssi) != dai_id)
495 continue;
496
Kuninori Morimoto32f27eb2014-01-23 18:41:17 -0800497 has_play = rsnd_ssi_is_play(&ssi->mod);
Kuninori Morimoto4b4dab82013-07-28 18:58:29 -0700498
499 if (is_play == has_play)
500 return &ssi->mod;
501 }
502
503 return NULL;
504}
505
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700506struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id)
507{
Takashi Iwai8b147192013-11-05 18:40:05 +0100508 if (WARN_ON(id < 0 || id >= rsnd_ssi_nr(priv)))
509 id = 0;
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700510
Kuninori Morimotodd27d802014-01-23 18:39:40 -0800511 return &((struct rsnd_ssi *)(priv->ssi) + id)->mod;
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700512}
513
Kuninori Morimoto7b5ce972014-01-23 18:39:32 -0800514int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
515{
516 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
517
518 return !!(rsnd_ssi_mode_flags(ssi) & RSND_SSI_CLK_PIN_SHARE);
519}
520
Kuninori Morimoto32f27eb2014-01-23 18:41:17 -0800521int rsnd_ssi_is_play(struct rsnd_mod *mod)
522{
523 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
524
525 return !!(rsnd_ssi_mode_flags(ssi) & RSND_SSI_PLAY);
526}
527
Kuninori Morimoto7b5ce972014-01-23 18:39:32 -0800528static void rsnd_ssi_parent_clk_setup(struct rsnd_priv *priv, struct rsnd_ssi *ssi)
529{
530 if (!rsnd_ssi_is_pin_sharing(&ssi->mod))
531 return;
532
533 switch (rsnd_mod_id(&ssi->mod)) {
534 case 1:
535 case 2:
536 ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 0));
537 break;
538 case 4:
539 ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 3));
540 break;
541 case 8:
542 ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 7));
543 break;
544 }
545}
546
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700547int rsnd_ssi_probe(struct platform_device *pdev,
548 struct rcar_snd_info *info,
549 struct rsnd_priv *priv)
550{
551 struct rsnd_ssi_platform_info *pinfo;
552 struct device *dev = rsnd_priv_to_dev(priv);
553 struct rsnd_mod_ops *ops;
554 struct clk *clk;
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700555 struct rsnd_ssi *ssi;
556 char name[RSND_SSI_NAME_SIZE];
557 int i, nr, ret;
558
559 /*
560 * init SSI
561 */
562 nr = info->ssi_info_nr;
Kuninori Morimotodd27d802014-01-23 18:39:40 -0800563 ssi = devm_kzalloc(dev, sizeof(*ssi) * nr, GFP_KERNEL);
564 if (!ssi) {
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700565 dev_err(dev, "SSI allocate failed\n");
566 return -ENOMEM;
567 }
568
Kuninori Morimotodd27d802014-01-23 18:39:40 -0800569 priv->ssi = ssi;
570 priv->ssi_nr = nr;
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700571
572 for_each_rsnd_ssi(ssi, priv, i) {
573 pinfo = &info->ssi_info[i];
574
575 snprintf(name, RSND_SSI_NAME_SIZE, "ssi.%d", i);
576
Kuninori Morimoto60dbb4f2013-12-03 22:09:33 -0800577 clk = devm_clk_get(dev, name);
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700578 if (IS_ERR(clk))
579 return PTR_ERR(clk);
580
581 ssi->info = pinfo;
582 ssi->clk = clk;
583
584 ops = &rsnd_ssi_non_ops;
585
586 /*
Kuninori Morimoto849fc822013-07-28 18:59:02 -0700587 * SSI DMA case
588 */
589 if (pinfo->dma_id > 0) {
590 ret = rsnd_dma_init(
591 priv, rsnd_mod_to_dma(&ssi->mod),
Kuninori Morimoto32f27eb2014-01-23 18:41:17 -0800592 rsnd_ssi_is_play(&ssi->mod),
Kuninori Morimoto849fc822013-07-28 18:59:02 -0700593 pinfo->dma_id,
594 rsnd_ssi_dma_inquiry,
595 rsnd_ssi_dma_complete);
596 if (ret < 0)
597 dev_info(dev, "SSI DMA failed. try PIO transter\n");
598 else
599 ops = &rsnd_ssi_dma_ops;
Kuninori Morimoto374a52812013-07-28 18:59:12 -0700600
601 dev_dbg(dev, "SSI%d use DMA transfer\n", i);
Kuninori Morimoto849fc822013-07-28 18:59:02 -0700602 }
603
604 /*
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700605 * SSI PIO case
606 */
Kuninori Morimoto849fc822013-07-28 18:59:02 -0700607 if (!rsnd_ssi_dma_available(ssi) &&
608 rsnd_ssi_pio_available(ssi)) {
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700609 ret = devm_request_irq(dev, pinfo->pio_irq,
610 &rsnd_ssi_pio_interrupt,
611 IRQF_SHARED,
612 dev_name(dev), ssi);
613 if (ret) {
614 dev_err(dev, "SSI request interrupt failed\n");
615 return ret;
616 }
617
618 ops = &rsnd_ssi_pio_ops;
Kuninori Morimoto374a52812013-07-28 18:59:12 -0700619
620 dev_dbg(dev, "SSI%d use PIO transfer\n", i);
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700621 }
622
623 rsnd_mod_init(priv, &ssi->mod, ops, i);
Kuninori Morimoto7b5ce972014-01-23 18:39:32 -0800624
625 rsnd_ssi_parent_clk_setup(priv, ssi);
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700626 }
627
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700628 dev_dbg(dev, "ssi probed\n");
629
630 return 0;
631}
632
633void rsnd_ssi_remove(struct platform_device *pdev,
634 struct rsnd_priv *priv)
635{
636 struct rsnd_ssi *ssi;
637 int i;
638
Kuninori Morimoto849fc822013-07-28 18:59:02 -0700639 for_each_rsnd_ssi(ssi, priv, i) {
Kuninori Morimoto849fc822013-07-28 18:59:02 -0700640 if (rsnd_ssi_dma_available(ssi))
641 rsnd_dma_quit(priv, rsnd_mod_to_dma(&ssi->mod));
642 }
643
Kuninori Morimotoae5c3222013-07-21 21:36:57 -0700644}