xref: /openbmc/linux/sound/soc/sh/rcar/ssi.c (revision 206204a1)
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 */
22 #define	DMEN		(1 << 28)	/* DMA Enable */
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 
55 /*
56  * SSIWSR
57  */
58 #define CONT		(1 << 8)	/* WS Continue Function */
59 
60 #define SSI_NAME "ssi"
61 
62 struct rsnd_ssi {
63 	struct clk *clk;
64 	struct rsnd_ssi_platform_info *info; /* rcar_snd.h */
65 	struct rsnd_ssi *parent;
66 	struct rsnd_mod mod;
67 
68 	struct rsnd_dai *rdai;
69 	u32 cr_own;
70 	u32 cr_clk;
71 	u32 cr_etc;
72 	int err;
73 	unsigned int usrcnt;
74 	unsigned int rate;
75 };
76 
77 #define for_each_rsnd_ssi(pos, priv, i)					\
78 	for (i = 0;							\
79 	     (i < rsnd_ssi_nr(priv)) &&					\
80 		((pos) = ((struct rsnd_ssi *)(priv)->ssi + i));		\
81 	     i++)
82 
83 #define rsnd_ssi_nr(priv) ((priv)->ssi_nr)
84 #define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
85 #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))
89 #define rsnd_ssi_clk_from_parent(ssi) ((ssi)->parent)
90 #define rsnd_ssi_mode_flags(p) ((p)->info->flags)
91 #define rsnd_ssi_dai_id(ssi) ((ssi)->info->dai_id)
92 
93 static 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 
112 static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
113 				     struct rsnd_dai_stream *io)
114 {
115 	struct rsnd_priv *priv = rsnd_mod_to_priv(&ssi->mod);
116 	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
117 	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;
126 	unsigned int rate = rsnd_src_get_ssi_rate(priv, io, runtime);
127 
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)
137 			 * see rsnd_ssi_init()
138 			 */
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 
160 static 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 
167 static 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_prepare_enable(ssi->clk);
177 
178 		if (rsnd_dai_is_clk_master(rdai)) {
179 			if (rsnd_ssi_clk_from_parent(ssi))
180 				rsnd_ssi_hw_start(ssi->parent, rdai, io);
181 			else
182 				rsnd_ssi_master_clk_start(ssi, io);
183 		}
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 
198 static 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 
228 		if (rsnd_dai_is_clk_master(rdai)) {
229 			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_unprepare(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  */
244 static int rsnd_ssi_init(struct rsnd_mod *mod,
245 			 struct rsnd_dai *rdai)
246 {
247 	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
248 	struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
249 	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->cr_own	= cr;
290 	ssi->err	= -1; /* ignore 1st error */
291 
292 	rsnd_src_ssi_mode_init(mod, rdai);
293 
294 	return 0;
295 }
296 
297 static int rsnd_ssi_quit(struct rsnd_mod *mod,
298 			 struct rsnd_dai *rdai)
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 
304 	if (ssi->err > 0)
305 		dev_warn(dev, "ssi under/over flow err = %d\n", ssi->err);
306 
307 	ssi->rdai	= NULL;
308 	ssi->cr_own	= 0;
309 	ssi->err	= 0;
310 
311 	return 0;
312 }
313 
314 static void rsnd_ssi_record_error(struct rsnd_ssi *ssi, u32 status)
315 {
316 	/* under/over flow error */
317 	if (status & (UIRQ | OIRQ)) {
318 		ssi->err++;
319 
320 		/* clear error status */
321 		rsnd_mod_write(&ssi->mod, SSISR, 0);
322 	}
323 }
324 
325 /*
326  *		SSI PIO
327  */
328 static irqreturn_t rsnd_ssi_pio_interrupt(int irq, void *data)
329 {
330 	struct rsnd_ssi *ssi = data;
331 	struct rsnd_mod *mod = &ssi->mod;
332 	struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
333 	u32 status = rsnd_mod_read(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(mod, SSITDR, *buf);
351 		else
352 			*buf = rsnd_mod_read(mod, SSIRDR);
353 
354 		rsnd_dai_pointer_update(io, sizeof(*buf));
355 
356 		ret = IRQ_HANDLED;
357 	}
358 
359 	return ret;
360 }
361 
362 static int rsnd_ssi_pio_probe(struct rsnd_mod *mod,
363 			      struct rsnd_dai *rdai)
364 {
365 	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
366 	struct device *dev = rsnd_priv_to_dev(priv);
367 	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
368 	int irq = ssi->info->pio_irq;
369 	int ret;
370 
371 	ret = devm_request_irq(dev, irq,
372 			       rsnd_ssi_pio_interrupt,
373 			       IRQF_SHARED,
374 			       dev_name(dev), ssi);
375 	if (ret)
376 		dev_err(dev, "SSI request interrupt failed\n");
377 
378 	dev_dbg(dev, "%s (PIO) is probed\n", rsnd_mod_name(mod));
379 
380 	return ret;
381 }
382 
383 static int rsnd_ssi_pio_start(struct rsnd_mod *mod,
384 			      struct rsnd_dai *rdai)
385 {
386 	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
387 	struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
388 
389 	/* enable PIO IRQ */
390 	ssi->cr_etc = UIEN | OIEN | DIEN;
391 
392 	rsnd_src_enable_ssi_irq(mod, rdai);
393 
394 	rsnd_ssi_hw_start(ssi, rdai, io);
395 
396 	return 0;
397 }
398 
399 static int rsnd_ssi_pio_stop(struct rsnd_mod *mod,
400 			     struct rsnd_dai *rdai)
401 {
402 	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
403 
404 	ssi->cr_etc = 0;
405 
406 	rsnd_ssi_hw_stop(ssi, rdai);
407 
408 	return 0;
409 }
410 
411 static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
412 	.name	= SSI_NAME,
413 	.probe	= rsnd_ssi_pio_probe,
414 	.init	= rsnd_ssi_init,
415 	.quit	= rsnd_ssi_quit,
416 	.start	= rsnd_ssi_pio_start,
417 	.stop	= rsnd_ssi_pio_stop,
418 };
419 
420 static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
421 			  struct rsnd_dai *rdai)
422 {
423 	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
424 	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
425 	struct device *dev = rsnd_priv_to_dev(priv);
426 	int dma_id = ssi->info->dma_id;
427 	int ret;
428 
429 	ret = rsnd_dma_init(
430 		priv, rsnd_mod_to_dma(mod),
431 		rsnd_info_is_playback(priv, ssi),
432 		dma_id);
433 
434 	if (ret < 0)
435 		dev_err(dev, "SSI DMA failed\n");
436 
437 	dev_dbg(dev, "%s (DMA) is probed\n", rsnd_mod_name(mod));
438 
439 	return ret;
440 }
441 
442 static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
443 			       struct rsnd_dai *rdai)
444 {
445 	rsnd_dma_quit(rsnd_mod_to_priv(mod), rsnd_mod_to_dma(mod));
446 
447 	return 0;
448 }
449 
450 static int rsnd_ssi_dma_start(struct rsnd_mod *mod,
451 			      struct rsnd_dai *rdai)
452 {
453 	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
454 	struct rsnd_dma *dma = rsnd_mod_to_dma(&ssi->mod);
455 	struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
456 
457 	/* enable DMA transfer */
458 	ssi->cr_etc = DMEN;
459 
460 	rsnd_dma_start(dma);
461 
462 	rsnd_ssi_hw_start(ssi, ssi->rdai, io);
463 
464 	/* enable WS continue */
465 	if (rsnd_dai_is_clk_master(rdai))
466 		rsnd_mod_write(&ssi->mod, SSIWSR, CONT);
467 
468 	return 0;
469 }
470 
471 static int rsnd_ssi_dma_stop(struct rsnd_mod *mod,
472 			     struct rsnd_dai *rdai)
473 {
474 	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
475 	struct rsnd_dma *dma = rsnd_mod_to_dma(&ssi->mod);
476 
477 	ssi->cr_etc = 0;
478 
479 	rsnd_ssi_record_error(ssi, rsnd_mod_read(mod, SSISR));
480 
481 	rsnd_ssi_hw_stop(ssi, rdai);
482 
483 	rsnd_dma_stop(dma);
484 
485 	return 0;
486 }
487 
488 static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
489 	.name	= SSI_NAME,
490 	.probe	= rsnd_ssi_dma_probe,
491 	.remove	= rsnd_ssi_dma_remove,
492 	.init	= rsnd_ssi_init,
493 	.quit	= rsnd_ssi_quit,
494 	.start	= rsnd_ssi_dma_start,
495 	.stop	= rsnd_ssi_dma_stop,
496 };
497 
498 /*
499  *		Non SSI
500  */
501 static struct rsnd_mod_ops rsnd_ssi_non_ops = {
502 	.name	= SSI_NAME,
503 };
504 
505 /*
506  *		ssi mod function
507  */
508 struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id)
509 {
510 	if (WARN_ON(id < 0 || id >= rsnd_ssi_nr(priv)))
511 		id = 0;
512 
513 	return &((struct rsnd_ssi *)(priv->ssi) + id)->mod;
514 }
515 
516 int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
517 {
518 	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
519 
520 	return !!(rsnd_ssi_mode_flags(ssi) & RSND_SSI_CLK_PIN_SHARE);
521 }
522 
523 static void rsnd_ssi_parent_clk_setup(struct rsnd_priv *priv, struct rsnd_ssi *ssi)
524 {
525 	if (!rsnd_ssi_is_pin_sharing(&ssi->mod))
526 		return;
527 
528 	switch (rsnd_mod_id(&ssi->mod)) {
529 	case 1:
530 	case 2:
531 		ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 0));
532 		break;
533 	case 4:
534 		ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 3));
535 		break;
536 	case 8:
537 		ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 7));
538 		break;
539 	}
540 }
541 
542 
543 static void rsnd_of_parse_ssi(struct platform_device *pdev,
544 			      const struct rsnd_of_data *of_data,
545 			      struct rsnd_priv *priv)
546 {
547 	struct device_node *node;
548 	struct device_node *np;
549 	struct rsnd_ssi_platform_info *ssi_info;
550 	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
551 	struct device *dev = &pdev->dev;
552 	int nr, i;
553 
554 	if (!of_data)
555 		return;
556 
557 	node = of_get_child_by_name(dev->of_node, "rcar_sound,ssi");
558 	if (!node)
559 		return;
560 
561 	nr = of_get_child_count(node);
562 	if (!nr)
563 		goto rsnd_of_parse_ssi_end;
564 
565 	ssi_info = devm_kzalloc(dev,
566 				sizeof(struct rsnd_ssi_platform_info) * nr,
567 				GFP_KERNEL);
568 	if (!ssi_info) {
569 		dev_err(dev, "ssi info allocation error\n");
570 		goto rsnd_of_parse_ssi_end;
571 	}
572 
573 	info->ssi_info		= ssi_info;
574 	info->ssi_info_nr	= nr;
575 
576 	i = -1;
577 	for_each_child_of_node(node, np) {
578 		i++;
579 
580 		ssi_info = info->ssi_info + i;
581 
582 		/*
583 		 * pin settings
584 		 */
585 		if (of_get_property(np, "shared-pin", NULL))
586 			ssi_info->flags |= RSND_SSI_CLK_PIN_SHARE;
587 
588 		/*
589 		 * irq
590 		 */
591 		ssi_info->pio_irq = irq_of_parse_and_map(np, 0);
592 
593 		/*
594 		 * DMA
595 		 */
596 		ssi_info->dma_id = of_get_property(np, "pio-transfer", NULL) ?
597 			0 : 1;
598 	}
599 
600 rsnd_of_parse_ssi_end:
601 	of_node_put(node);
602 }
603 
604 int rsnd_ssi_probe(struct platform_device *pdev,
605 		   const struct rsnd_of_data *of_data,
606 		   struct rsnd_priv *priv)
607 {
608 	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
609 	struct rsnd_ssi_platform_info *pinfo;
610 	struct device *dev = rsnd_priv_to_dev(priv);
611 	struct rsnd_mod_ops *ops;
612 	struct clk *clk;
613 	struct rsnd_ssi *ssi;
614 	char name[RSND_SSI_NAME_SIZE];
615 	int i, nr;
616 
617 	rsnd_of_parse_ssi(pdev, of_data, priv);
618 
619 	/*
620 	 *	init SSI
621 	 */
622 	nr	= info->ssi_info_nr;
623 	ssi	= devm_kzalloc(dev, sizeof(*ssi) * nr, GFP_KERNEL);
624 	if (!ssi) {
625 		dev_err(dev, "SSI allocate failed\n");
626 		return -ENOMEM;
627 	}
628 
629 	priv->ssi	= ssi;
630 	priv->ssi_nr	= nr;
631 
632 	for_each_rsnd_ssi(ssi, priv, i) {
633 		pinfo = &info->ssi_info[i];
634 
635 		snprintf(name, RSND_SSI_NAME_SIZE, "%s.%d",
636 			 SSI_NAME, i);
637 
638 		clk = devm_clk_get(dev, name);
639 		if (IS_ERR(clk))
640 			return PTR_ERR(clk);
641 
642 		ssi->info	= pinfo;
643 		ssi->clk	= clk;
644 
645 		ops = &rsnd_ssi_non_ops;
646 		if (pinfo->dma_id > 0)
647 			ops = &rsnd_ssi_dma_ops;
648 		else if (rsnd_ssi_pio_available(ssi))
649 			ops = &rsnd_ssi_pio_ops;
650 
651 		rsnd_mod_init(priv, &ssi->mod, ops, RSND_MOD_SSI, i);
652 
653 		rsnd_ssi_parent_clk_setup(priv, ssi);
654 	}
655 
656 	return 0;
657 }
658