]>
Commit | Line | Data |
---|---|---|
1e0edd4d KM |
1 | // SPDX-License-Identifier: GPL-2.0 |
2 | // | |
3 | // Renesas R-Car | |
4 | // | |
5 | // Copyright (C) 2013 Renesas Solutions Corp. | |
6 | // Kuninori Morimoto <[email protected]> | |
7 | ||
1536a968 KM |
8 | #ifndef RSND_H |
9 | #define RSND_H | |
10 | ||
11 | #include <linux/clk.h> | |
12 | #include <linux/device.h> | |
0a4d94c0 | 13 | #include <linux/dma-mapping.h> |
1536a968 KM |
14 | #include <linux/io.h> |
15 | #include <linux/list.h> | |
16 | #include <linux/module.h> | |
90e8e50f | 17 | #include <linux/of_device.h> |
11d0f8ed | 18 | #include <linux/of_graph.h> |
90e8e50f | 19 | #include <linux/of_irq.h> |
0a4d94c0 KM |
20 | #include <linux/sh_dma.h> |
21 | #include <linux/workqueue.h> | |
1536a968 KM |
22 | #include <sound/soc.h> |
23 | #include <sound/pcm_params.h> | |
24 | ||
2ea2cc86 KM |
25 | #define RSND_GEN1_SRU 0 |
26 | #define RSND_GEN1_ADG 1 | |
27 | #define RSND_GEN1_SSI 2 | |
28 | ||
29 | #define RSND_GEN2_SCU 0 | |
30 | #define RSND_GEN2_ADG 1 | |
31 | #define RSND_GEN2_SSIU 2 | |
32 | #define RSND_GEN2_SSI 3 | |
33 | ||
c2bc6527 KM |
34 | #define RSND_GEN4_ADG 0 |
35 | #define RSND_GEN4_SSIU 1 | |
36 | #define RSND_GEN4_SSI 2 | |
37 | #define RSND_GEN4_SDMC 3 | |
38 | ||
2ea2cc86 | 39 | #define RSND_BASE_MAX 4 |
dcc448e6 | 40 | |
1536a968 KM |
41 | /* |
42 | * pseudo register | |
43 | * | |
44 | * The register address offsets SRU/SCU/SSIU on Gen1/Gen2 are very different. | |
45 | * This driver uses pseudo register in order to hide it. | |
46 | * see gen1/gen2 for detail | |
47 | */ | |
3337744a | 48 | enum rsnd_reg { |
bb7927c7 | 49 | /* SCU (MIX/CTU/DVC) */ |
b7169dde KM |
50 | SRC_I_BUSIF_MODE, |
51 | SRC_O_BUSIF_MODE, | |
52 | SRC_ROUTE_MODE0, | |
53 | SRC_SWRSR, | |
54 | SRC_SRCIR, | |
55 | SRC_ADINR, | |
56 | SRC_IFSCR, | |
57 | SRC_IFSVR, | |
58 | SRC_SRCCR, | |
59 | SRC_CTRL, | |
60 | SRC_BSDSR, | |
61 | SRC_BSISR, | |
62 | SRC_INT_ENABLE0, | |
63 | SRC_BUSIF_DALIGN, | |
64 | SRCIN_TIMSEL0, | |
65 | SRCIN_TIMSEL1, | |
66 | SRCIN_TIMSEL2, | |
67 | SRCIN_TIMSEL3, | |
68 | SRCIN_TIMSEL4, | |
69 | SRCOUT_TIMSEL0, | |
70 | SRCOUT_TIMSEL1, | |
71 | SRCOUT_TIMSEL2, | |
72 | SRCOUT_TIMSEL3, | |
73 | SRCOUT_TIMSEL4, | |
74 | SCU_SYS_STATUS0, | |
75 | SCU_SYS_STATUS1, | |
76 | SCU_SYS_INT_EN0, | |
77 | SCU_SYS_INT_EN1, | |
78 | CMD_CTRL, | |
79 | CMD_BUSIF_MODE, | |
80 | CMD_BUSIF_DALIGN, | |
81 | CMD_ROUTE_SLCT, | |
82 | CMDOUT_TIMSEL, | |
83 | CTU_SWRSR, | |
84 | CTU_CTUIR, | |
85 | CTU_ADINR, | |
86 | CTU_CPMDR, | |
87 | CTU_SCMDR, | |
88 | CTU_SV00R, | |
89 | CTU_SV01R, | |
90 | CTU_SV02R, | |
91 | CTU_SV03R, | |
92 | CTU_SV04R, | |
93 | CTU_SV05R, | |
94 | CTU_SV06R, | |
95 | CTU_SV07R, | |
96 | CTU_SV10R, | |
97 | CTU_SV11R, | |
98 | CTU_SV12R, | |
99 | CTU_SV13R, | |
100 | CTU_SV14R, | |
101 | CTU_SV15R, | |
102 | CTU_SV16R, | |
103 | CTU_SV17R, | |
104 | CTU_SV20R, | |
105 | CTU_SV21R, | |
106 | CTU_SV22R, | |
107 | CTU_SV23R, | |
108 | CTU_SV24R, | |
109 | CTU_SV25R, | |
110 | CTU_SV26R, | |
111 | CTU_SV27R, | |
112 | CTU_SV30R, | |
113 | CTU_SV31R, | |
114 | CTU_SV32R, | |
115 | CTU_SV33R, | |
116 | CTU_SV34R, | |
117 | CTU_SV35R, | |
118 | CTU_SV36R, | |
119 | CTU_SV37R, | |
120 | MIX_SWRSR, | |
121 | MIX_MIXIR, | |
122 | MIX_ADINR, | |
123 | MIX_MIXMR, | |
124 | MIX_MVPDR, | |
125 | MIX_MDBAR, | |
126 | MIX_MDBBR, | |
127 | MIX_MDBCR, | |
128 | MIX_MDBDR, | |
129 | MIX_MDBER, | |
130 | DVC_SWRSR, | |
131 | DVC_DVUIR, | |
132 | DVC_ADINR, | |
133 | DVC_DVUCR, | |
134 | DVC_ZCMCR, | |
135 | DVC_VOL0R, | |
136 | DVC_VOL1R, | |
137 | DVC_VOL2R, | |
138 | DVC_VOL3R, | |
139 | DVC_VOL4R, | |
140 | DVC_VOL5R, | |
141 | DVC_VOL6R, | |
142 | DVC_VOL7R, | |
143 | DVC_DVUER, | |
144 | DVC_VRCTR, | |
145 | DVC_VRPDR, | |
146 | DVC_VRDBR, | |
07539c1d | 147 | |
dfc9403b | 148 | /* ADG */ |
b7169dde KM |
149 | BRRA, |
150 | BRRB, | |
151 | BRGCKR, | |
152 | DIV_EN, | |
153 | AUDIO_CLK_SEL0, | |
154 | AUDIO_CLK_SEL1, | |
155 | AUDIO_CLK_SEL2, | |
dfc9403b | 156 | |
bb7927c7 | 157 | /* SSIU */ |
b7169dde KM |
158 | SSI_MODE, |
159 | SSI_MODE0, | |
160 | SSI_MODE1, | |
161 | SSI_MODE2, | |
162 | SSI_CONTROL, | |
163 | SSI_CTRL, | |
164 | SSI_BUSIF0_MODE, | |
165 | SSI_BUSIF1_MODE, | |
166 | SSI_BUSIF2_MODE, | |
167 | SSI_BUSIF3_MODE, | |
168 | SSI_BUSIF4_MODE, | |
169 | SSI_BUSIF5_MODE, | |
170 | SSI_BUSIF6_MODE, | |
171 | SSI_BUSIF7_MODE, | |
172 | SSI_BUSIF0_ADINR, | |
173 | SSI_BUSIF1_ADINR, | |
174 | SSI_BUSIF2_ADINR, | |
175 | SSI_BUSIF3_ADINR, | |
176 | SSI_BUSIF4_ADINR, | |
177 | SSI_BUSIF5_ADINR, | |
178 | SSI_BUSIF6_ADINR, | |
179 | SSI_BUSIF7_ADINR, | |
180 | SSI_BUSIF0_DALIGN, | |
181 | SSI_BUSIF1_DALIGN, | |
182 | SSI_BUSIF2_DALIGN, | |
183 | SSI_BUSIF3_DALIGN, | |
184 | SSI_BUSIF4_DALIGN, | |
185 | SSI_BUSIF5_DALIGN, | |
186 | SSI_BUSIF6_DALIGN, | |
187 | SSI_BUSIF7_DALIGN, | |
188 | SSI_INT_ENABLE, | |
189 | SSI_SYS_STATUS0, | |
190 | SSI_SYS_STATUS1, | |
191 | SSI_SYS_STATUS2, | |
192 | SSI_SYS_STATUS3, | |
193 | SSI_SYS_STATUS4, | |
194 | SSI_SYS_STATUS5, | |
195 | SSI_SYS_STATUS6, | |
196 | SSI_SYS_STATUS7, | |
66c705d0 YZ |
197 | SSI_SYS_INT_ENABLE0, |
198 | SSI_SYS_INT_ENABLE1, | |
199 | SSI_SYS_INT_ENABLE2, | |
200 | SSI_SYS_INT_ENABLE3, | |
201 | SSI_SYS_INT_ENABLE4, | |
202 | SSI_SYS_INT_ENABLE5, | |
203 | SSI_SYS_INT_ENABLE6, | |
204 | SSI_SYS_INT_ENABLE7, | |
c2bc6527 | 205 | SSI_BUSIF, |
b7169dde KM |
206 | HDMI0_SEL, |
207 | HDMI1_SEL, | |
8af6c521 JW |
208 | SSI9_BUSIF0_MODE, |
209 | SSI9_BUSIF1_MODE, | |
210 | SSI9_BUSIF2_MODE, | |
211 | SSI9_BUSIF3_MODE, | |
212 | SSI9_BUSIF4_MODE, | |
213 | SSI9_BUSIF5_MODE, | |
214 | SSI9_BUSIF6_MODE, | |
215 | SSI9_BUSIF7_MODE, | |
216 | SSI9_BUSIF0_ADINR, | |
217 | SSI9_BUSIF1_ADINR, | |
218 | SSI9_BUSIF2_ADINR, | |
219 | SSI9_BUSIF3_ADINR, | |
220 | SSI9_BUSIF4_ADINR, | |
221 | SSI9_BUSIF5_ADINR, | |
222 | SSI9_BUSIF6_ADINR, | |
223 | SSI9_BUSIF7_ADINR, | |
224 | SSI9_BUSIF0_DALIGN, | |
225 | SSI9_BUSIF1_DALIGN, | |
226 | SSI9_BUSIF2_DALIGN, | |
227 | SSI9_BUSIF3_DALIGN, | |
228 | SSI9_BUSIF4_DALIGN, | |
229 | SSI9_BUSIF5_DALIGN, | |
230 | SSI9_BUSIF6_DALIGN, | |
231 | SSI9_BUSIF7_DALIGN, | |
bb7927c7 | 232 | |
ae5c3223 | 233 | /* SSI */ |
b7169dde KM |
234 | SSICR, |
235 | SSISR, | |
236 | SSITDR, | |
237 | SSIRDR, | |
238 | SSIWSR, | |
ae5c3223 | 239 | |
b7169dde | 240 | REG_MAX, |
3337744a | 241 | }; |
b7169dde KM |
242 | #define SRCIN_TIMSEL(i) (SRCIN_TIMSEL0 + (i)) |
243 | #define SRCOUT_TIMSEL(i) (SRCOUT_TIMSEL0 + (i)) | |
244 | #define CTU_SVxxR(i, j) (CTU_SV00R + (i * 8) + (j)) | |
245 | #define DVC_VOLxR(i) (DVC_VOL0R + (i)) | |
246 | #define AUDIO_CLK_SEL(i) (AUDIO_CLK_SEL0 + (i)) | |
247 | #define SSI_BUSIF_MODE(i) (SSI_BUSIF0_MODE + (i)) | |
248 | #define SSI_BUSIF_ADINR(i) (SSI_BUSIF0_ADINR + (i)) | |
249 | #define SSI_BUSIF_DALIGN(i) (SSI_BUSIF0_DALIGN + (i)) | |
8af6c521 JW |
250 | #define SSI9_BUSIF_MODE(i) (SSI9_BUSIF0_MODE + (i)) |
251 | #define SSI9_BUSIF_ADINR(i) (SSI9_BUSIF0_ADINR + (i)) | |
252 | #define SSI9_BUSIF_DALIGN(i) (SSI9_BUSIF0_DALIGN + (i)) | |
b7169dde | 253 | #define SSI_SYS_STATUS(i) (SSI_SYS_STATUS0 + (i)) |
66c705d0 | 254 | #define SSI_SYS_INT_ENABLE(i) (SSI_SYS_INT_ENABLE0 + (i)) |
b7169dde | 255 | |
3337744a | 256 | |
1536a968 | 257 | struct rsnd_priv; |
cdaa3cdf | 258 | struct rsnd_mod; |
1536a968 KM |
259 | struct rsnd_dai; |
260 | struct rsnd_dai_stream; | |
261 | ||
3337744a KM |
262 | /* |
263 | * R-Car basic functions | |
264 | */ | |
b7169dde KM |
265 | u32 rsnd_mod_read(struct rsnd_mod *mod, enum rsnd_reg reg); |
266 | void rsnd_mod_write(struct rsnd_mod *mod, enum rsnd_reg reg, u32 data); | |
267 | void rsnd_mod_bset(struct rsnd_mod *mod, enum rsnd_reg reg, u32 mask, u32 data); | |
3023b384 | 268 | u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io); |
4689032b | 269 | u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io); |
90431eb4 | 270 | u32 rsnd_get_busif_shift(struct rsnd_dai_stream *io, struct rsnd_mod *mod); |
3337744a | 271 | |
0a4d94c0 KM |
272 | /* |
273 | * R-Car DMA | |
274 | */ | |
355cb84f | 275 | int rsnd_dma_attach(struct rsnd_dai_stream *io, |
b99305d2 | 276 | struct rsnd_mod *mod, struct rsnd_mod **dma_mod); |
2ea6b074 | 277 | int rsnd_dma_probe(struct rsnd_priv *priv); |
039f2ccc KM |
278 | struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node, char *name, |
279 | struct rsnd_mod *mod, char *x); | |
0a4d94c0 | 280 | |
cdaa3cdf KM |
281 | /* |
282 | * R-Car sound mod | |
283 | */ | |
a126021d | 284 | enum rsnd_mod_type { |
940e9479 KM |
285 | RSND_MOD_AUDMAPP, |
286 | RSND_MOD_AUDMA, | |
287 | RSND_MOD_DVC, | |
70fb1052 | 288 | RSND_MOD_MIX, |
9269e3c3 | 289 | RSND_MOD_CTU, |
1b2ca0ad | 290 | RSND_MOD_CMD, |
8048b91f | 291 | RSND_MOD_SRC, |
b4c83b17 KM |
292 | RSND_MOD_SSIM3, /* SSI multi 3 */ |
293 | RSND_MOD_SSIM2, /* SSI multi 2 */ | |
294 | RSND_MOD_SSIM1, /* SSI multi 1 */ | |
295 | RSND_MOD_SSIP, /* SSI parent */ | |
a126021d | 296 | RSND_MOD_SSI, |
cdf310ce | 297 | RSND_MOD_SSIU, |
a126021d KM |
298 | RSND_MOD_MAX, |
299 | }; | |
cdaa3cdf KM |
300 | |
301 | struct rsnd_mod_ops { | |
302 | char *name; | |
9b99e9a7 KM |
303 | struct dma_chan* (*dma_req)(struct rsnd_dai_stream *io, |
304 | struct rsnd_mod *mod); | |
7681f6ac | 305 | int (*probe)(struct rsnd_mod *mod, |
2c0fac19 | 306 | struct rsnd_dai_stream *io, |
690602fc | 307 | struct rsnd_priv *priv); |
7681f6ac | 308 | int (*remove)(struct rsnd_mod *mod, |
2c0fac19 | 309 | struct rsnd_dai_stream *io, |
690602fc | 310 | struct rsnd_priv *priv); |
cdaa3cdf | 311 | int (*init)(struct rsnd_mod *mod, |
2c0fac19 | 312 | struct rsnd_dai_stream *io, |
690602fc | 313 | struct rsnd_priv *priv); |
cdaa3cdf | 314 | int (*quit)(struct rsnd_mod *mod, |
2c0fac19 | 315 | struct rsnd_dai_stream *io, |
690602fc | 316 | struct rsnd_priv *priv); |
cdaa3cdf | 317 | int (*start)(struct rsnd_mod *mod, |
2c0fac19 | 318 | struct rsnd_dai_stream *io, |
690602fc | 319 | struct rsnd_priv *priv); |
cdaa3cdf | 320 | int (*stop)(struct rsnd_mod *mod, |
2c0fac19 | 321 | struct rsnd_dai_stream *io, |
690602fc | 322 | struct rsnd_priv *priv); |
b5b442ab KM |
323 | int (*irq)(struct rsnd_mod *mod, |
324 | struct rsnd_dai_stream *io, | |
325 | struct rsnd_priv *priv, int enable); | |
bff58ea4 | 326 | int (*pcm_new)(struct rsnd_mod *mod, |
2c0fac19 | 327 | struct rsnd_dai_stream *io, |
bff58ea4 | 328 | struct snd_soc_pcm_runtime *rtd); |
3b7843ff | 329 | int (*hw_params)(struct rsnd_mod *mod, |
2c0fac19 | 330 | struct rsnd_dai_stream *io, |
3b7843ff KM |
331 | struct snd_pcm_substream *substream, |
332 | struct snd_pcm_hw_params *hw_params); | |
07b7acb5 KM |
333 | int (*pointer)(struct rsnd_mod *mod, |
334 | struct rsnd_dai_stream *io, | |
335 | snd_pcm_uframes_t *pointer); | |
97463e19 | 336 | int (*fallback)(struct rsnd_mod *mod, |
2c0fac19 | 337 | struct rsnd_dai_stream *io, |
690602fc | 338 | struct rsnd_priv *priv); |
4d230d12 JW |
339 | int (*prepare)(struct rsnd_mod *mod, |
340 | struct rsnd_dai_stream *io, | |
341 | struct rsnd_priv *priv); | |
6ab6a247 KM |
342 | int (*cleanup)(struct rsnd_mod *mod, |
343 | struct rsnd_dai_stream *io, | |
344 | struct rsnd_priv *priv); | |
859fd6cb TW |
345 | int (*hw_free)(struct rsnd_mod *mod, |
346 | struct rsnd_dai_stream *io, | |
347 | struct snd_pcm_substream *substream); | |
7e7fe06d KM |
348 | u32 *(*get_status)(struct rsnd_mod *mod, |
349 | struct rsnd_dai_stream *io, | |
350 | enum rsnd_mod_type type); | |
c16015f3 KM |
351 | int (*id)(struct rsnd_mod *mod); |
352 | int (*id_sub)(struct rsnd_mod *mod); | |
665c1ade | 353 | int (*id_cmd)(struct rsnd_mod *mod); |
1f9c82b5 KM |
354 | |
355 | #ifdef CONFIG_DEBUG_FS | |
356 | void (*debug_info)(struct seq_file *m, | |
357 | struct rsnd_dai_stream *io, struct rsnd_mod *mod); | |
358 | #endif | |
cdaa3cdf KM |
359 | }; |
360 | ||
4686a0ad | 361 | struct rsnd_dai_stream; |
cdaa3cdf KM |
362 | struct rsnd_mod { |
363 | int id; | |
a126021d | 364 | enum rsnd_mod_type type; |
cdaa3cdf | 365 | struct rsnd_mod_ops *ops; |
2099bc8e | 366 | struct rsnd_priv *priv; |
85642952 | 367 | struct clk *clk; |
5ba17b42 | 368 | u32 status; |
cdaa3cdf | 369 | }; |
417f9642 KM |
370 | /* |
371 | * status | |
372 | * | |
3f4593fb | 373 | * 0xH000DCB0 |
3b7843ff | 374 | * |
5451ea44 KM |
375 | * B 0: init 1: quit |
376 | * C 0: start 1: stop | |
859fd6cb | 377 | * D 0: hw_params 1: hw_free |
5451ea44 KM |
378 | * |
379 | * H is always called (see __rsnd_mod_call) | |
417f9642 | 380 | */ |
5451ea44 KM |
381 | #define __rsnd_mod_shift_init 4 |
382 | #define __rsnd_mod_shift_quit 4 | |
383 | #define __rsnd_mod_shift_start 8 | |
384 | #define __rsnd_mod_shift_stop 8 | |
859fd6cb TW |
385 | #define __rsnd_mod_shift_hw_params 12 |
386 | #define __rsnd_mod_shift_hw_free 12 | |
0af5c01a KM |
387 | #define __rsnd_mod_shift_probe 28 /* always called */ |
388 | #define __rsnd_mod_shift_remove 28 /* always called */ | |
b5b442ab | 389 | #define __rsnd_mod_shift_irq 28 /* always called */ |
5451ea44 KM |
390 | #define __rsnd_mod_shift_pcm_new 28 /* always called */ |
391 | #define __rsnd_mod_shift_fallback 28 /* always called */ | |
07b7acb5 | 392 | #define __rsnd_mod_shift_pointer 28 /* always called */ |
624d1a7c DP |
393 | #define __rsnd_mod_shift_prepare 28 /* always called */ |
394 | #define __rsnd_mod_shift_cleanup 28 /* always called */ | |
5451ea44 | 395 | |
0af5c01a KM |
396 | #define __rsnd_mod_add_probe 0 |
397 | #define __rsnd_mod_add_remove 0 | |
624d1a7c DP |
398 | #define __rsnd_mod_add_prepare 0 |
399 | #define __rsnd_mod_add_cleanup 0 | |
b43b8ae8 KM |
400 | #define __rsnd_mod_add_init 1 /* needs protect */ |
401 | #define __rsnd_mod_add_quit -1 /* needs protect */ | |
402 | #define __rsnd_mod_add_start 1 /* needs protect */ | |
403 | #define __rsnd_mod_add_stop -1 /* needs protect */ | |
404 | #define __rsnd_mod_add_hw_params 1 /* needs protect */ | |
405 | #define __rsnd_mod_add_hw_free -1 /* needs protect */ | |
b5b442ab | 406 | #define __rsnd_mod_add_irq 0 |
5451ea44 KM |
407 | #define __rsnd_mod_add_pcm_new 0 |
408 | #define __rsnd_mod_add_fallback 0 | |
07b7acb5 | 409 | #define __rsnd_mod_add_pointer 0 |
417f9642 KM |
410 | |
411 | #define __rsnd_mod_call_probe 0 | |
0af5c01a | 412 | #define __rsnd_mod_call_remove 0 |
6ab6a247 | 413 | #define __rsnd_mod_call_prepare 0 |
624d1a7c | 414 | #define __rsnd_mod_call_cleanup 0 |
3f4593fb KM |
415 | #define __rsnd_mod_call_init 0 /* needs protect */ |
416 | #define __rsnd_mod_call_quit 1 /* needs protect */ | |
417 | #define __rsnd_mod_call_start 0 /* needs protect */ | |
418 | #define __rsnd_mod_call_stop 1 /* needs protect */ | |
419 | #define __rsnd_mod_call_hw_params 0 /* needs protect */ | |
420 | #define __rsnd_mod_call_hw_free 1 /* needs protect */ | |
b5b442ab | 421 | #define __rsnd_mod_call_irq 0 |
417f9642 KM |
422 | #define __rsnd_mod_call_pcm_new 0 |
423 | #define __rsnd_mod_call_fallback 0 | |
07b7acb5 | 424 | #define __rsnd_mod_call_pointer 0 |
cdaa3cdf | 425 | |
9b6ea250 | 426 | #define rsnd_mod_to_priv(mod) ((mod)->priv) |
c9929345 KM |
427 | #define rsnd_mod_power_on(mod) clk_enable((mod)->clk) |
428 | #define rsnd_mod_power_off(mod) clk_disable((mod)->clk) | |
b76e218a | 429 | #define rsnd_mod_get(ip) (&(ip)->mod) |
cdaa3cdf | 430 | |
2099bc8e KM |
431 | int rsnd_mod_init(struct rsnd_priv *priv, |
432 | struct rsnd_mod *mod, | |
5ba17b42 KM |
433 | struct rsnd_mod_ops *ops, |
434 | struct clk *clk, | |
5ba17b42 KM |
435 | enum rsnd_mod_type type, |
436 | int id); | |
2f78dd7f | 437 | void rsnd_mod_quit(struct rsnd_mod *mod); |
9b99e9a7 KM |
438 | struct dma_chan *rsnd_mod_dma_req(struct rsnd_dai_stream *io, |
439 | struct rsnd_mod *mod); | |
f501b7a4 KM |
440 | void rsnd_mod_interrupt(struct rsnd_mod *mod, |
441 | void (*callback)(struct rsnd_mod *mod, | |
442 | struct rsnd_dai_stream *io)); | |
7e7fe06d KM |
443 | u32 *rsnd_mod_get_status(struct rsnd_mod *mod, |
444 | struct rsnd_dai_stream *io, | |
5ba17b42 | 445 | enum rsnd_mod_type type); |
c16015f3 KM |
446 | int rsnd_mod_id(struct rsnd_mod *mod); |
447 | int rsnd_mod_id_raw(struct rsnd_mod *mod); | |
448 | int rsnd_mod_id_sub(struct rsnd_mod *mod); | |
c0ea089d | 449 | char *rsnd_mod_name(struct rsnd_mod *mod); |
b3ca3fbe KM |
450 | struct rsnd_mod *rsnd_mod_next(int *iterator, |
451 | struct rsnd_dai_stream *io, | |
452 | enum rsnd_mod_type *array, | |
453 | int array_size); | |
454 | #define for_each_rsnd_mod(iterator, pos, io) \ | |
455 | for (iterator = 0; \ | |
826e83de | 456 | (pos = rsnd_mod_next(&iterator, io, NULL, 0)); iterator++) |
b3ca3fbe KM |
457 | #define for_each_rsnd_mod_arrays(iterator, pos, io, array, size) \ |
458 | for (iterator = 0; \ | |
826e83de | 459 | (pos = rsnd_mod_next(&iterator, io, array, size)); iterator++) |
b3ca3fbe KM |
460 | #define for_each_rsnd_mod_array(iterator, pos, io, array) \ |
461 | for_each_rsnd_mod_arrays(iterator, pos, io, array, ARRAY_SIZE(array)) | |
5ba17b42 | 462 | |
ec02b5a1 | 463 | void rsnd_parse_connect_common(struct rsnd_dai *rdai, char *name, |
89b66174 KM |
464 | struct rsnd_mod* (*mod_get)(struct rsnd_priv *priv, int id), |
465 | struct device_node *node, | |
466 | struct device_node *playback, | |
467 | struct device_node *capture); | |
c413983e | 468 | int rsnd_node_count(struct rsnd_priv *priv, struct device_node *node, char *name); |
d09a7db4 | 469 | int rsnd_node_fixed_index(struct device *dev, struct device_node *node, char *name, int idx); |
cdaa3cdf | 470 | |
66287def | 471 | int rsnd_channel_normalization(int chan); |
b2fb31bb KM |
472 | #define rsnd_runtime_channel_original(io) \ |
473 | rsnd_runtime_channel_original_with_params(io, NULL) | |
474 | int rsnd_runtime_channel_original_with_params(struct rsnd_dai_stream *io, | |
475 | struct snd_pcm_hw_params *params); | |
476 | #define rsnd_runtime_channel_after_ctu(io) \ | |
477 | rsnd_runtime_channel_after_ctu_with_params(io, NULL) | |
478 | int rsnd_runtime_channel_after_ctu_with_params(struct rsnd_dai_stream *io, | |
479 | struct snd_pcm_hw_params *params); | |
480 | #define rsnd_runtime_channel_for_ssi(io) \ | |
481 | rsnd_runtime_channel_for_ssi_with_params(io, NULL) | |
482 | int rsnd_runtime_channel_for_ssi_with_params(struct rsnd_dai_stream *io, | |
483 | struct snd_pcm_hw_params *params); | |
a6072802 KM |
484 | int rsnd_runtime_is_multi_ssi(struct rsnd_dai_stream *io); |
485 | int rsnd_runtime_is_tdm(struct rsnd_dai_stream *io); | |
f69f4522 | 486 | int rsnd_runtime_is_tdm_split(struct rsnd_dai_stream *io); |
eed76bb8 | 487 | |
be78cea1 KM |
488 | /* |
489 | * DT | |
490 | */ | |
491 | #define rsnd_parse_of_node(priv, node) \ | |
492 | of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, node) | |
493 | #define RSND_NODE_DAI "rcar_sound,dai" | |
494 | #define RSND_NODE_SSI "rcar_sound,ssi" | |
4e7788fb | 495 | #define RSND_NODE_SSIU "rcar_sound,ssiu" |
be78cea1 KM |
496 | #define RSND_NODE_SRC "rcar_sound,src" |
497 | #define RSND_NODE_CTU "rcar_sound,ctu" | |
498 | #define RSND_NODE_MIX "rcar_sound,mix" | |
499 | #define RSND_NODE_DVC "rcar_sound,dvc" | |
500 | ||
1536a968 KM |
501 | /* |
502 | * R-Car sound DAI | |
503 | */ | |
504 | #define RSND_DAI_NAME_SIZE 16 | |
505 | struct rsnd_dai_stream { | |
f8c3c309 | 506 | char name[RSND_DAI_NAME_SIZE]; |
1536a968 | 507 | struct snd_pcm_substream *substream; |
a126021d | 508 | struct rsnd_mod *mod[RSND_MOD_MAX]; |
0e289012 | 509 | struct rsnd_mod *dma; |
54cb5562 | 510 | struct rsnd_dai *rdai; |
5423d772 | 511 | struct device *dmac_dev; /* for IPMMU */ |
c2aaaa57 KM |
512 | u32 converted_rate; /* converted sampling rate */ |
513 | int converted_chan; /* converted channels */ | |
5ba17b42 | 514 | u32 parent_ssi_status; |
beed78ae | 515 | u32 flags; |
1536a968 | 516 | }; |
beed78ae KM |
517 | |
518 | /* flags */ | |
519 | #define RSND_STREAM_HDMI0 (1 << 0) /* for HDMI0 */ | |
520 | #define RSND_STREAM_HDMI1 (1 << 1) /* for HDMI1 */ | |
f69f4522 | 521 | #define RSND_STREAM_TDM_SPLIT (1 << 2) /* for TDM split mode */ |
6d612f67 | 522 | #define RSND_HW_RULE_ERR (1 << 3) /* hw_rule error */ |
beed78ae | 523 | |
5cbbadd3 KM |
524 | #define rsnd_io_to_mod(io, i) ((i) < RSND_MOD_MAX ? (io)->mod[(i)] : NULL) |
525 | #define rsnd_io_to_mod_ssi(io) rsnd_io_to_mod((io), RSND_MOD_SSI) | |
3ce2959d | 526 | #define rsnd_io_to_mod_ssiu(io) rsnd_io_to_mod((io), RSND_MOD_SSIU) |
e7d850dd | 527 | #define rsnd_io_to_mod_ssip(io) rsnd_io_to_mod((io), RSND_MOD_SSIP) |
5cbbadd3 | 528 | #define rsnd_io_to_mod_src(io) rsnd_io_to_mod((io), RSND_MOD_SRC) |
9269e3c3 | 529 | #define rsnd_io_to_mod_ctu(io) rsnd_io_to_mod((io), RSND_MOD_CTU) |
70fb1052 | 530 | #define rsnd_io_to_mod_mix(io) rsnd_io_to_mod((io), RSND_MOD_MIX) |
5cbbadd3 | 531 | #define rsnd_io_to_mod_dvc(io) rsnd_io_to_mod((io), RSND_MOD_DVC) |
a504b1ee | 532 | #define rsnd_io_to_mod_cmd(io) rsnd_io_to_mod((io), RSND_MOD_CMD) |
54cb5562 | 533 | #define rsnd_io_to_rdai(io) ((io)->rdai) |
1b13d118 | 534 | #define rsnd_io_to_priv(io) (rsnd_rdai_to_priv(rsnd_io_to_rdai(io))) |
985a4f6e | 535 | #define rsnd_io_is_play(io) (&rsnd_io_to_rdai(io)->playback == io) |
9d0e202f KM |
536 | #define rsnd_io_to_runtime(io) ((io)->substream ? \ |
537 | (io)->substream->runtime : NULL) | |
c2aaaa57 KM |
538 | #define rsnd_io_converted_rate(io) ((io)->converted_rate) |
539 | #define rsnd_io_converted_chan(io) ((io)->converted_chan) | |
d5bbe7de | 540 | int rsnd_io_is_working(struct rsnd_dai_stream *io); |
985a4f6e | 541 | |
1536a968 KM |
542 | struct rsnd_dai { |
543 | char name[RSND_DAI_NAME_SIZE]; | |
1536a968 KM |
544 | struct rsnd_dai_stream playback; |
545 | struct rsnd_dai_stream capture; | |
1b13d118 | 546 | struct rsnd_priv *priv; |
8cc03722 | 547 | struct snd_pcm_hw_constraint_list constraint; |
547b02f7 | 548 | struct of_phandle_args dai_args; |
1536a968 | 549 | |
1ff9593d KM |
550 | int max_channels; /* 2ch - 16ch */ |
551 | int ssi_lane; /* 1lane - 4lane */ | |
fb2815f4 | 552 | int chan_width; /* 16/24/32 bit width */ |
8ec85e7f | 553 | |
a3737731 DC |
554 | unsigned int clk_master:1; |
555 | unsigned int bit_clk_inv:1; | |
556 | unsigned int frm_clk_inv:1; | |
557 | unsigned int sys_delay:1; | |
558 | unsigned int data_alignment:1; | |
1536a968 KM |
559 | }; |
560 | ||
ecba9e72 | 561 | #define rsnd_rdai_nr(priv) ((priv)->rdai_nr) |
3ed6448c | 562 | #define rsnd_rdai_is_clk_master(rdai) ((rdai)->clk_master) |
1b13d118 | 563 | #define rsnd_rdai_to_priv(rdai) ((rdai)->priv) |
1536a968 | 564 | #define for_each_rsnd_dai(rdai, priv, i) \ |
00463c11 | 565 | for (i = 0; \ |
ecba9e72 | 566 | (i < rsnd_rdai_nr(priv)) && \ |
710d0889 | 567 | ((rdai) = rsnd_rdai_get(priv, i)); \ |
00463c11 | 568 | i++) |
1536a968 | 569 | |
710d0889 KM |
570 | struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id); |
571 | ||
1ff9593d KM |
572 | #define rsnd_rdai_channels_set(rdai, max_channels) \ |
573 | rsnd_rdai_channels_ctrl(rdai, max_channels) | |
574 | #define rsnd_rdai_channels_get(rdai) \ | |
575 | rsnd_rdai_channels_ctrl(rdai, 0) | |
576 | int rsnd_rdai_channels_ctrl(struct rsnd_dai *rdai, | |
577 | int max_channels); | |
578 | ||
579 | #define rsnd_rdai_ssi_lane_set(rdai, ssi_lane) \ | |
580 | rsnd_rdai_ssi_lane_ctrl(rdai, ssi_lane) | |
581 | #define rsnd_rdai_ssi_lane_get(rdai) \ | |
582 | rsnd_rdai_ssi_lane_ctrl(rdai, 0) | |
583 | int rsnd_rdai_ssi_lane_ctrl(struct rsnd_dai *rdai, | |
584 | int ssi_lane); | |
585 | ||
fb2815f4 DT |
586 | #define rsnd_rdai_width_set(rdai, width) \ |
587 | rsnd_rdai_width_ctrl(rdai, width) | |
588 | #define rsnd_rdai_width_get(rdai) \ | |
589 | rsnd_rdai_width_ctrl(rdai, 0) | |
590 | int rsnd_rdai_width_ctrl(struct rsnd_dai *rdai, int width); | |
75defee0 | 591 | void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io); |
27924f32 KM |
592 | int rsnd_dai_connect(struct rsnd_mod *mod, |
593 | struct rsnd_dai_stream *io, | |
594 | enum rsnd_mod_type type); | |
1536a968 | 595 | |
3337744a KM |
596 | /* |
597 | * R-Car Gen1/Gen2 | |
598 | */ | |
2ea6b074 | 599 | int rsnd_gen_probe(struct rsnd_priv *priv); |
3337744a KM |
600 | void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv, |
601 | struct rsnd_mod *mod, | |
602 | enum rsnd_reg reg); | |
c5212b45 | 603 | phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id); |
1f9c82b5 KM |
604 | #ifdef CONFIG_DEBUG_FS |
605 | void __iomem *rsnd_gen_get_base_addr(struct rsnd_priv *priv, int reg_id); | |
606 | #endif | |
ad32d0c7 | 607 | |
dfc9403b KM |
608 | /* |
609 | * R-Car ADG | |
610 | */ | |
1dfdc650 | 611 | int rsnd_adg_clk_query(struct rsnd_priv *priv, unsigned int rate); |
d29a6060 PLB |
612 | int rsnd_adg_ssi_clk_stop(struct rsnd_mod *ssi_mod); |
613 | int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *ssi_mod, unsigned int rate); | |
2ea6b074 KM |
614 | int rsnd_adg_probe(struct rsnd_priv *priv); |
615 | void rsnd_adg_remove(struct rsnd_priv *priv); | |
0102eed5 | 616 | int rsnd_adg_set_src_timesel_gen2(struct rsnd_mod *src_mod, |
629509c5 | 617 | struct rsnd_dai_stream *io, |
0102eed5 KM |
618 | unsigned int in_rate, |
619 | unsigned int out_rate); | |
d29a6060 | 620 | int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *cmd_mod, |
bff58ea4 | 621 | struct rsnd_dai_stream *io); |
c2d31718 KM |
622 | #define rsnd_adg_clk_enable(priv) rsnd_adg_clk_control(priv, 1) |
623 | #define rsnd_adg_clk_disable(priv) rsnd_adg_clk_control(priv, 0) | |
624 | void rsnd_adg_clk_control(struct rsnd_priv *priv, int enable); | |
1f9c82b5 | 625 | void rsnd_adg_clk_dbg_info(struct rsnd_priv *priv, struct seq_file *m); |
dfc9403b | 626 | |
1536a968 KM |
627 | /* |
628 | * R-Car sound priv | |
629 | */ | |
630 | struct rsnd_priv { | |
631 | ||
9f464f8e | 632 | struct platform_device *pdev; |
1536a968 | 633 | spinlock_t lock; |
c51eb1c6 | 634 | unsigned long flags; |
2ea2cc86 KM |
635 | #define RSND_GEN_MASK (0xF << 0) |
636 | #define RSND_GEN1 (1 << 0) | |
637 | #define RSND_GEN2 (2 << 0) | |
d188e140 | 638 | #define RSND_GEN3 (3 << 0) |
c2bc6527 | 639 | #define RSND_GEN4 (4 << 0) |
ba164a49 JW |
640 | #define RSND_SOC_MASK (0xFF << 4) |
641 | #define RSND_SOC_E (1 << 4) /* E1/E2/E3 */ | |
1536a968 | 642 | |
3337744a KM |
643 | /* |
644 | * below value will be filled on rsnd_gen_probe() | |
645 | */ | |
646 | void *gen; | |
647 | ||
dfc9403b KM |
648 | /* |
649 | * below value will be filled on rsnd_adg_probe() | |
650 | */ | |
651 | void *adg; | |
652 | ||
288f392e KM |
653 | /* |
654 | * below value will be filled on rsnd_dma_probe() | |
655 | */ | |
656 | void *dma; | |
657 | ||
ae5c3223 KM |
658 | /* |
659 | * below value will be filled on rsnd_ssi_probe() | |
660 | */ | |
dd27d808 KM |
661 | void *ssi; |
662 | int ssi_nr; | |
ae5c3223 | 663 | |
c7f69ab5 KM |
664 | /* |
665 | * below value will be filled on rsnd_ssiu_probe() | |
666 | */ | |
667 | void *ssiu; | |
668 | int ssiu_nr; | |
669 | ||
78edead4 KM |
670 | /* |
671 | * below value will be filled on rsnd_src_probe() | |
672 | */ | |
673 | void *src; | |
674 | int src_nr; | |
675 | ||
9269e3c3 KM |
676 | /* |
677 | * below value will be filled on rsnd_ctu_probe() | |
678 | */ | |
679 | void *ctu; | |
680 | int ctu_nr; | |
681 | ||
70fb1052 KM |
682 | /* |
683 | * below value will be filled on rsnd_mix_probe() | |
684 | */ | |
685 | void *mix; | |
686 | int mix_nr; | |
687 | ||
bff58ea4 KM |
688 | /* |
689 | * below value will be filled on rsnd_dvc_probe() | |
690 | */ | |
691 | void *dvc; | |
692 | int dvc_nr; | |
693 | ||
1b2ca0ad KM |
694 | /* |
695 | * below value will be filled on rsnd_cmd_probe() | |
696 | */ | |
697 | void *cmd; | |
698 | int cmd_nr; | |
699 | ||
1536a968 KM |
700 | /* |
701 | * below value will be filled on rsnd_dai_probe() | |
702 | */ | |
703 | struct snd_soc_dai_driver *daidrv; | |
704 | struct rsnd_dai *rdai; | |
ecba9e72 | 705 | int rdai_nr; |
547b02f7 KM |
706 | |
707 | #define RSND_MAX_COMPONENT 3 | |
708 | int component_dais[RSND_MAX_COMPONENT]; | |
1536a968 KM |
709 | }; |
710 | ||
9f464f8e KM |
711 | #define rsnd_priv_to_pdev(priv) ((priv)->pdev) |
712 | #define rsnd_priv_to_dev(priv) (&(rsnd_priv_to_pdev(priv)->dev)) | |
1536a968 | 713 | |
348d592c KM |
714 | #define rsnd_is_gen1(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN1) |
715 | #define rsnd_is_gen2(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN2) | |
d188e140 | 716 | #define rsnd_is_gen3(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN3) |
c2bc6527 | 717 | #define rsnd_is_gen4(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN4) |
ba164a49 JW |
718 | #define rsnd_is_e3(priv) (((priv)->flags & \ |
719 | (RSND_GEN_MASK | RSND_SOC_MASK)) == \ | |
720 | (RSND_GEN3 | RSND_SOC_E)) | |
348d592c | 721 | |
42991989 KM |
722 | #define rsnd_flags_has(p, f) ((p)->flags & (f)) |
723 | #define rsnd_flags_set(p, f) ((p)->flags |= (f)) | |
724 | #define rsnd_flags_del(p, f) ((p)->flags &= ~(f)) | |
725 | ||
170a2497 KM |
726 | /* |
727 | * rsnd_kctrl | |
728 | */ | |
729 | struct rsnd_kctrl_cfg { | |
730 | unsigned int max; | |
731 | unsigned int size; | |
732 | u32 *val; | |
733 | const char * const *texts; | |
f0b04d8b | 734 | int (*accept)(struct rsnd_dai_stream *io); |
b65a7ccc KM |
735 | void (*update)(struct rsnd_dai_stream *io, struct rsnd_mod *mod); |
736 | struct rsnd_dai_stream *io; | |
d1f83d6e KM |
737 | struct snd_card *card; |
738 | struct snd_kcontrol *kctrl; | |
16d44989 | 739 | struct rsnd_mod *mod; |
170a2497 KM |
740 | }; |
741 | ||
d2240f0d | 742 | #define RSND_MAX_CHANNELS 8 |
170a2497 KM |
743 | struct rsnd_kctrl_cfg_m { |
744 | struct rsnd_kctrl_cfg cfg; | |
d2240f0d | 745 | u32 val[RSND_MAX_CHANNELS]; |
170a2497 KM |
746 | }; |
747 | ||
748 | struct rsnd_kctrl_cfg_s { | |
749 | struct rsnd_kctrl_cfg cfg; | |
750 | u32 val; | |
751 | }; | |
3a9fa27b KM |
752 | #define rsnd_kctrl_size(x) ((x).cfg.size) |
753 | #define rsnd_kctrl_max(x) ((x).cfg.max) | |
754 | #define rsnd_kctrl_valm(x, i) ((x).val[i]) /* = (x).cfg.val[i] */ | |
755 | #define rsnd_kctrl_vals(x) ((x).val) /* = (x).cfg.val[0] */ | |
170a2497 | 756 | |
f0b04d8b KM |
757 | int rsnd_kctrl_accept_anytime(struct rsnd_dai_stream *io); |
758 | int rsnd_kctrl_accept_runtime(struct rsnd_dai_stream *io); | |
32973dcf KM |
759 | struct rsnd_kctrl_cfg *rsnd_kctrl_init_m(struct rsnd_kctrl_cfg_m *cfg); |
760 | struct rsnd_kctrl_cfg *rsnd_kctrl_init_s(struct rsnd_kctrl_cfg_s *cfg); | |
761 | int rsnd_kctrl_new(struct rsnd_mod *mod, | |
762 | struct rsnd_dai_stream *io, | |
763 | struct snd_soc_pcm_runtime *rtd, | |
764 | const unsigned char *name, | |
f0b04d8b | 765 | int (*accept)(struct rsnd_dai_stream *io), |
32973dcf KM |
766 | void (*update)(struct rsnd_dai_stream *io, |
767 | struct rsnd_mod *mod), | |
768 | struct rsnd_kctrl_cfg *cfg, | |
769 | const char * const *texts, | |
770 | int size, | |
771 | u32 max); | |
772 | ||
f0b04d8b KM |
773 | #define rsnd_kctrl_new_m(mod, io, rtd, name, accept, update, cfg, size, max) \ |
774 | rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_m(cfg), \ | |
32973dcf KM |
775 | NULL, size, max) |
776 | ||
f0b04d8b KM |
777 | #define rsnd_kctrl_new_s(mod, io, rtd, name, accept, update, cfg, max) \ |
778 | rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_s(cfg), \ | |
32973dcf KM |
779 | NULL, 1, max) |
780 | ||
f3c26ac6 | 781 | #define rsnd_kctrl_new_e(mod, io, rtd, name, accept, update, cfg, texts, size) \ |
f0b04d8b | 782 | rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_s(cfg), \ |
f3c26ac6 KM |
783 | texts, 1, size) |
784 | ||
785 | extern const char * const volume_ramp_rate[]; | |
786 | #define VOLUME_RAMP_MAX_DVC (0x17 + 1) | |
3e3c9ee1 | 787 | #define VOLUME_RAMP_MAX_MIX (0x0a + 1) |
170a2497 | 788 | |
78edead4 KM |
789 | /* |
790 | * R-Car SSI | |
791 | */ | |
2ea6b074 KM |
792 | int rsnd_ssi_probe(struct rsnd_priv *priv); |
793 | void rsnd_ssi_remove(struct rsnd_priv *priv); | |
78edead4 | 794 | struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id); |
b415b4d3 | 795 | int rsnd_ssi_use_busif(struct rsnd_dai_stream *io); |
25b384b8 | 796 | u32 rsnd_ssi_multi_secondaries_runtime(struct rsnd_dai_stream *io); |
ab62e8a8 | 797 | int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod); |
b415b4d3 KM |
798 | |
799 | #define rsnd_ssi_is_pin_sharing(io) \ | |
800 | __rsnd_ssi_is_pin_sharing(rsnd_io_to_mod_ssi(io)) | |
801 | int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod); | |
78edead4 | 802 | |
be78cea1 | 803 | #define rsnd_ssi_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SSI) |
b4c83b17 KM |
804 | void rsnd_parse_connect_ssi(struct rsnd_dai *rdai, |
805 | struct device_node *playback, | |
806 | struct device_node *capture); | |
fb2815f4 | 807 | unsigned int rsnd_ssi_clk_query(struct rsnd_dai *rdai, |
ef4cf5d6 | 808 | int param1, int param2, int *idx); |
94e2710c | 809 | |
c7f69ab5 KM |
810 | /* |
811 | * R-Car SSIU | |
812 | */ | |
813 | int rsnd_ssiu_attach(struct rsnd_dai_stream *io, | |
814 | struct rsnd_mod *mod); | |
2ea6b074 KM |
815 | int rsnd_ssiu_probe(struct rsnd_priv *priv); |
816 | void rsnd_ssiu_remove(struct rsnd_priv *priv); | |
4e7788fb KM |
817 | void rsnd_parse_connect_ssiu(struct rsnd_dai *rdai, |
818 | struct device_node *playback, | |
819 | struct device_node *capture); | |
820 | #define rsnd_ssiu_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SSIU) | |
83b220cf | 821 | bool rsnd_ssiu_busif_err_status_clear(struct rsnd_mod *mod); |
c7f69ab5 | 822 | |
07539c1d | 823 | /* |
ba9c949f | 824 | * R-Car SRC |
07539c1d | 825 | */ |
2ea6b074 KM |
826 | int rsnd_src_probe(struct rsnd_priv *priv); |
827 | void rsnd_src_remove(struct rsnd_priv *priv); | |
ba9c949f | 828 | struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id); |
cbf1494f KM |
829 | |
830 | #define rsnd_src_get_in_rate(priv, io) rsnd_src_get_rate(priv, io, 1) | |
831 | #define rsnd_src_get_out_rate(priv, io) rsnd_src_get_rate(priv, io, 0) | |
832 | unsigned int rsnd_src_get_rate(struct rsnd_priv *priv, | |
833 | struct rsnd_dai_stream *io, | |
834 | int is_in); | |
835 | ||
be78cea1 | 836 | #define rsnd_src_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SRC) |
89b66174 | 837 | #define rsnd_parse_connect_src(rdai, playback, capture) \ |
ec02b5a1 | 838 | rsnd_parse_connect_common(rdai, "src", rsnd_src_mod_get, \ |
89b66174 KM |
839 | rsnd_src_of_node(rsnd_rdai_to_priv(rdai)), \ |
840 | playback, capture) | |
ef749400 | 841 | |
9269e3c3 KM |
842 | /* |
843 | * R-Car CTU | |
844 | */ | |
2ea6b074 KM |
845 | int rsnd_ctu_probe(struct rsnd_priv *priv); |
846 | void rsnd_ctu_remove(struct rsnd_priv *priv); | |
9269e3c3 | 847 | struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id); |
be78cea1 | 848 | #define rsnd_ctu_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_CTU) |
89b66174 | 849 | #define rsnd_parse_connect_ctu(rdai, playback, capture) \ |
ec02b5a1 | 850 | rsnd_parse_connect_common(rdai, "ctu", rsnd_ctu_mod_get, \ |
89b66174 KM |
851 | rsnd_ctu_of_node(rsnd_rdai_to_priv(rdai)), \ |
852 | playback, capture) | |
9269e3c3 | 853 | |
70fb1052 KM |
854 | /* |
855 | * R-Car MIX | |
856 | */ | |
2ea6b074 KM |
857 | int rsnd_mix_probe(struct rsnd_priv *priv); |
858 | void rsnd_mix_remove(struct rsnd_priv *priv); | |
70fb1052 | 859 | struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id); |
be78cea1 | 860 | #define rsnd_mix_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_MIX) |
89b66174 | 861 | #define rsnd_parse_connect_mix(rdai, playback, capture) \ |
ec02b5a1 | 862 | rsnd_parse_connect_common(rdai, "mix", rsnd_mix_mod_get, \ |
89b66174 KM |
863 | rsnd_mix_of_node(rsnd_rdai_to_priv(rdai)), \ |
864 | playback, capture) | |
70fb1052 | 865 | |
bff58ea4 KM |
866 | /* |
867 | * R-Car DVC | |
868 | */ | |
2ea6b074 KM |
869 | int rsnd_dvc_probe(struct rsnd_priv *priv); |
870 | void rsnd_dvc_remove(struct rsnd_priv *priv); | |
bff58ea4 | 871 | struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id); |
be78cea1 | 872 | #define rsnd_dvc_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_DVC) |
89b66174 | 873 | #define rsnd_parse_connect_dvc(rdai, playback, capture) \ |
ec02b5a1 | 874 | rsnd_parse_connect_common(rdai, "dvc", rsnd_dvc_mod_get, \ |
89b66174 KM |
875 | rsnd_dvc_of_node(rsnd_rdai_to_priv(rdai)), \ |
876 | playback, capture) | |
bff58ea4 | 877 | |
1b2ca0ad KM |
878 | /* |
879 | * R-Car CMD | |
880 | */ | |
2ea6b074 KM |
881 | int rsnd_cmd_probe(struct rsnd_priv *priv); |
882 | void rsnd_cmd_remove(struct rsnd_priv *priv); | |
1b2ca0ad | 883 | int rsnd_cmd_attach(struct rsnd_dai_stream *io, int id); |
1b2ca0ad | 884 | |
f1df1229 | 885 | void rsnd_mod_make_sure(struct rsnd_mod *mod, enum rsnd_mod_type type); |
9ca5e57d | 886 | #ifdef DEBUG |
f1df1229 KM |
887 | #define rsnd_mod_confirm_ssi(mssi) rsnd_mod_make_sure(mssi, RSND_MOD_SSI) |
888 | #define rsnd_mod_confirm_src(msrc) rsnd_mod_make_sure(msrc, RSND_MOD_SRC) | |
889 | #define rsnd_mod_confirm_dvc(mdvc) rsnd_mod_make_sure(mdvc, RSND_MOD_DVC) | |
890 | #else | |
891 | #define rsnd_mod_confirm_ssi(mssi) | |
892 | #define rsnd_mod_confirm_src(msrc) | |
893 | #define rsnd_mod_confirm_dvc(mdvc) | |
894 | #endif | |
895 | ||
2b627869 KM |
896 | /* |
897 | * If you don't need interrupt status debug message, | |
898 | * define RSND_DEBUG_NO_IRQ_STATUS as 1 on top of src.c/ssi.c | |
899 | * | |
900 | * #define RSND_DEBUG_NO_IRQ_STATUS 1 | |
901 | */ | |
1788a152 | 902 | #define rsnd_print_irq_status(dev, param...) do { \ |
2b627869 | 903 | if (!IS_BUILTIN(RSND_DEBUG_NO_IRQ_STATUS)) \ |
1788a152 KM |
904 | dev_info(dev, param); \ |
905 | } while (0) | |
2b627869 | 906 | |
1f9c82b5 KM |
907 | #ifdef CONFIG_DEBUG_FS |
908 | int rsnd_debugfs_probe(struct snd_soc_component *component); | |
909 | void rsnd_debugfs_reg_show(struct seq_file *m, phys_addr_t _addr, | |
910 | void __iomem *base, int offset, int size); | |
911 | void rsnd_debugfs_mod_reg_show(struct seq_file *m, struct rsnd_mod *mod, | |
912 | int reg_id, int offset, int size); | |
913 | ||
914 | #else | |
915 | #define rsnd_debugfs_probe NULL | |
916 | #endif | |
49123b51 KM |
917 | |
918 | #endif /* RSND_H */ |