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